Redux-Saga Socket - PullRequest
       10

Redux-Saga Socket

1 голос
/ 04 февраля 2020

подключаю розетки через 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();
        }
    }
}

...