Каналы в JS - это когда "тебе" не только кнопочки "рисовать"
Timofey Aksenov
Front End DeveloperРаботал я как-то свою работу на работе: "рисовал кнопочки на реакте" и вдруг бах! Тимлид мне говорит:
Тимофейчик, нам нужно срочно в проект закатить поддержку web sockets с возможностью одновременного подключения нескольких разных web socket серверов и с возможностью подключаться к множеству различных каналов внутри web socket сервера, а так же нужно как-то активными каналами управлять, gracefull stopping им, независимо друг от друга, делать и следить за их количеством и т.д. и т.п. И да, вот мы тут развернули сервак на технологии centrifuge. Сделай красиво, в общем.
Делать нечего, нужно сделать.
Когда я учился на курсах по Golang
, а да если вы не в курсе, то я прошел курсы на степике и успешно их сдал на максимальный балл.
Разработка веб-сервисов на Go - основы языка / Результат 100%
Разработка веб-сервисов на Golang, часть 2 / Результат 100%
В общем на этих курсах изучая, как работают горутины и пишутся микросервисы, я узнал про каналы, успешно реализовал их в ДЗ и запомнил, что каналы вещь нужная и полезная.
И вот в процессе первоначального мозгового штурма, я вспомнил, что в документации к redux-saga
читал про eventChannels
и там был пример создания канала для web sockets на основе socket.io client
. О да, если бы не курсы по гошечке, то я бы эту часть документации пропустил и пошел дальше экшенами в стор пуляться... ой "рисовать кнопочки на реакте" конечно же.
Изучив пример из документации redux-saga
, я понял, что eventChannels
это то что мне нужно. Но нужно доработать свой код, чтобы учесть технологические требования:
- Подключение к различным физическим серверам web sockets (оборачивание каждого в отдельный канал)
- Подключение к различным каналам внутри одного физического сервера web sockets (оборачивание каждого в отдельный канал)
- Независимый запуск каналов
- Независимая остановка каналов
- Возможность провести инвентаризацию активных каналов
Реализация задуманного:
В файле chanSaga.ts
я создал 5 функций, которые обладают следущей функциональностью:
Практическая реализация задуманного:
После того, как я реализовал всю необходимую инфраструктуру в файле chanSaga.ts
, теперь я могу в любом месте системы делать вот так:
Код выше, может быть многократно продублирован, что позволит реализовать все поставленные нам функциональные требования.
Бонус про зубодробительный пример с замыканием:
Котики любят каналы, все любят каналы 🐱