Как обеспечить подключение к веб-сокету в Aleph?
Я пытаюсь взаимодействовать с Slack RTM API с Алефом.
В настоящее время у меня есть этот код:
(defn connect-socket []
(let [conn @(http/websocket-client (get-websocket-url))]
(s/consume #(prn %) conn)
(send-message conn {:type "ping"}) ;; just to check if send-message works
(s/on-closed conn (prn "closed"))))
Это хорошо работает в первые несколько раз, а затем conn
перестает получать сообщения от Slack после некоторого бездействия. Он также не печатает "закрыто", что, по-видимому, означает, что поток не закрыт. Я не совсем уверен, что здесь происходит.
Как я могу поддерживать соединение через веб-сокет или автоматически переподключаться, если отключено? Я видел какой-то код в дикой природе, выполняющий пинги, но я не думаю, что понимаю код достаточно хорошо, чтобы его адаптировать.
1 ответ
Я думаю, что вы должны отправлять сообщения ping, потому что:
- Отключение websocket сигнализируется специальным пакетом
- нет способа отправить этот пакет в случае ex. ошибка сети
- нет функции "автоматического переподключения", если только вы не используете библиотеку, которая делает это за вас (я бы лично хотел
sente
поддержать Алефа).
Поэтому вы должны регулярно выполнять "пинг". Что касается кода, on-closed
хочет функцию в качестве второго аргумента, поэтому: (s/on-closed! conn #(prn "closed"))