Usando MessageBus com um aplicativo frontend Discourse personalizado em uma origem diferente

Quero apenas documentar isso aqui, caso alguém mais esteja tentando fazer o mesmo e precise de um pouco de orientação.

Atualmente, estou trabalhando em um frontend React acoplado a um backend Discourse e a um plugin que personaliza algumas funcionalidades do Discourse. Eu queria fazer o MessageBus funcionar com o aplicativo frontend personalizado, mas encontrei um problema de CORS, já que o frontend está sendo servido de uma origem diferente do Discourse.

Percebi que o Discourse estava definindo o cabeçalho Access-Control-Allow-Origin para Discourse.base_url_no_prefix no ambiente do MessageBus, pois naturalmente se assume que o MessageBus funcionará com o frontend Ember padrão do Discourse.

Conforme documentado no README do MessageBus no GitHub, é possível adicionar cabeçalhos extras ao ambiente do MessageBus, que é exatamente o que o inicializador do MessageBus do Discourse está fazendo, e onde Access-Control-Allow-Origin está sendo definido como Discourse.base_url_no_prefix.

Para personalizar isso, adicionei o seguinte código ao meu plugin:

  MessageBus.extra_response_headers_lookup do |env|
    env["__mb"][:extra_headers].merge({
      "Access-Control-Allow-Origin" => "http://your-custom-domain.com"
    })
  end

Isso tem a vantagem de não sobrescrever a lógica importante do Discourse ao determinar o ambiente do MessageBus, que é estabelecido ao chamar setup_message_bus_env no inicializador do Discourse, ao mesmo tempo que permite valores personalizados.

Percebo que essa configuração pode ser bastante óbvia para muitos dos desenvolvedores aqui, mas achei que valia a pena documentar, pois nem sempre é fácil unir as peças. E se isso economizar uma hora de alguém tentando resolver isso, então ótimo!

Obviamente, se algo acima estiver incorreto ou impreciso, por favor, me avise e eu farei a edição!

10 curtidas