Использование MessageBus с пользовательским приложением фронтенда Discourse на другом домене

Я хотел просто задокументировать это здесь, на случай, если кто-то другой попытается сделать то же самое и нуждается в небольшой помощи.

В настоящее время я работаю над фронтендом на React, связанным с бэкендом Discourse и плагином, кастомизирующим некоторые функции Discourse. Я хотел настроить MessageBus для работы с моим пользовательским фронтенд-приложением, но столкнулся с проблемой CORS, так как фронтенд обслуживается с другого источника, чем Discourse.

Я заметил, что Discourse устанавливает заголовок Access-Control-Allow-Origin в значение Discourse.base_url_no_prefix для среды MessageBus, так как по умолчанию предполагается, что MessageBus будет работать с фронтендом Ember по умолчанию в Discourse.

Как описано в README репозитория MessageBus на GitHub, в среду MessageBus можно добавлять дополнительные заголовки. Именно это и делает инициализатор MessageBus в Discourse, где Access-Control-Allow-Origin устанавливается в значение Discourse.base_url_no_prefix.

Чтобы кастомизировать это, я добавил следующий код в свой плагин:

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

Это имеет преимущество в том, что не переопределяет важную логику Discourse при определении среды MessageBus, которая устанавливается вызовом setup_message_bus_env в инициализаторе Discourse, но при этом позволяет использовать пользовательские значения.

Я понимаю, что для многих разработчиков здесь такая настройка может показаться очевидной, но я решил, что стоит это задокументировать, так как не всегда легко собрать все части воедино. И если это сэкономит кому-то час времени на попытки разобраться в этом — отлично!

Очевидно, что если что-то выше указано неверно или неточно, пожалуйста, дайте мне знать, и я внесу правки!

10 лайков