подключаю розетки через Redax-сагу. Когда я открываю сокет, я могу подписаться на нужные мне каналы, но когда мне нужно подписаться на что-то еще, я закрываю и снова открываю сокет. Можно ли как-то отправить данные для подписки на этот сокет?
const ws = () => `ws://localhost:8980/?_admin1`;
export const openTradeSocket = createRoutine('TRADE_SOCKET_OPEN');
export const closeTradeSocket = createRoutine('TRADE_SOCKET_CLOSE');
function tradeSocket(payload) {
return eventChannel(emit => {
const socket = new WebSocket(ws(payload.userId || ''), ['wamp']);
socket.onopen = () => {
if (payload.chat) {socket.send(JSON.stringify([5, `chat:en`]));}
else {socket.send(JSON.stringify([5, `trades:${payload.contract}`]));}
};
socket.onerror = error => socket.close();
socket.onclose = () => {};
socket.onmessage = ({ data }) => {
try {
emit(JSON.parse(data));
} catch (e) {
}
};
return () => {
socket.close();
};
});
}
function* tradeWatcher(channel) {
while (true) {
const data = yield take(channel);
if (data[2].data) {
switch (data[1].split(':')[0]) {
case 'contracts':
yield put(updatePricelist(data[2].data));
break;
}
}
}
}
export function* handleTradeChannel() {
while (true) {
const { payload } = yield take(openTradeSocket.TRIGGER);
const socketChannel = yield call(tradeSocket, payload);
const { cancel } = yield race({
task: call(tradeWatcher, socketChannel),
cancel: take(closeTradeSocket.TRIGGER),
});
if (cancel) {
socketChannel.close();
}
}
}