Как определить, не прошел ли запрос на подписку ActionCable

Недавно я развернул приложение Rails и получил от нескольких пользователей ответ, что оно не работает в их рабочих средах. Понятно, что вебсокеты для них заблокированы.

Я просмотрел документацию Rails по этому вопросу, но не могу найти никакой информации о том, как определить, произошло ли это. Моим лучшим предположением было бы отправить запрос AJAX для трансляции ActionCable, а когда эта трансляция не получена после определенного тайм-аута, сделать вывод, что веб-сокеты должны быть заблокированы.

Есть ли здесь какие-либо простые ответы, возможно, уже являющиеся частью API Rails, для определения подключения к Websocket?


person El Tea    schedule 27.01.2018    source источник
comment
вам нужно прочитать журнал вашего сервера .. он будет включать эту информацию   -  person Fabrizio Bertoglio    schedule 28.01.2018
comment
Я не думаю, что это поможет. Я смотрю на это со стороны клиента — какая информация будет доступна клиенту, чтобы определить, что его запрос, сделанный из App.cable.subscriptions.create, будет указывать на сбой? Все, что я видел для возврата, это:connected:-› ,disconnected:-› ,и Received:(data)-›Но я не знаю, как определить, что запрос не удался.   -  person El Tea    schedule 28.01.2018


Ответы (2)


Существует обработчик rejected, который вы можете использовать. Это должно срабатывать, когда сервер отклоняет подписку.

Приведенный ниже пример coffeescript взят из официальной документации по rails.

App.cable.subscriptions.create "AppearanceChannel",
  # Called when the subscription is ready for use on the server.
  connected: ->
    // Do something

  # Called when the subscription is rejected by the server.
  rejected: ->
    // Do something
person grizzthedj    schedule 28.01.2018
comment
Я это видел, но не имел возможности проверить - мне это звучало как конкретный отказ, где меня интересует ситуация с брандмауэрами. Это также вызовет проблему с брандмауэром? Я не смог найти информацию в официальных документах о том, что вызывает этот вызов. - person El Tea; 29.01.2018

Всякий раз, когда соединение с активным кабелем терпит неудачу, он записывает в консоль браузера failed: WebSocket is closed before the connection is established

Вы можете использовать это, чтобы узнать, была ли ошибка подключения:

def action_cable_connection_errored?
  page.driver.browser.manage.logs.get(:browser)
        .map(&:message)
        .join
        .match('failed: WebSocket is closed before the connection is established')
end
person golfadas    schedule 04.09.2018