rxjs websocket: пинг не возвращается - PullRequest
0 голосов
/ 28 августа 2018

Использование rxjs и angular 6. 95% ответов, которые я видел, используют только более старые версии rxjs.

Серверу, к которому я подключаюсь, требуется действительный токен jwt в качестве файла cookie во время установления соединения. Как только сервер отвечает 101 протоколом коммутации, он немедленно отправляет { "status": "OK" }.

Следующая часть рукопожатия для клиента (то, что я пишу), чтобы отправить { "sessionId": "xxyyzz" }. Сервер отвечает другим { "status": "OK" } и затем начинает отправлять события.

Или, по крайней мере, так должно быть?

Я получаю первое { "status": "OK" } сообщение, отправляю sessionId и userId, и второе { "status": "OK" } приходит.

Я новичок в rxjs и наблюдаемых, поэтому мне интересно, если мои настройки неверны. Если я отправляю ping, браузер показывает отправляемую рамку ping, но он не отвечает (Реализация на стороне сервера работает - коллеги подключаются через Android и т. Д., Просто отлично).

Является ли subject.next("ping") даже правильным методом? Я просто хожу по кругу и буду признателен за любую проницательность.

subject: WebSocketSubject<any>;
connectAttempted: boolean;
connected: boolean;

connect(sessionId, userId) {    
        this.subject = webSocket({
            url: `wss://remote.api.server/stream`
        });

        this.subject.subscribe(
            (msg) => {
                if(msg.status && msg.status == "OK" && !this.connectAttempted) {
                    this.subject.next(
                        {
                            sessionId: sessionId,
                            userId: userId,
                            eventClasses: []
                        }
                    );
                    this.connectAttempted = true;
                } else if(msg.status && msg.status == "OK" && !this.connected) {
                    console.log("Handshake completed");
                    this.connected = true;
                    this.subject.next("ping");
                } else if(msg.status && msg.status == "FAIL") {
                    this.connected = false;
                    console.log("FAIL! No longer connected");
                } else {
                    console.log("Something other than status", JSON.stringify(msg))    
                }
            },
            (err) => {
                console.log('error', err)
            },
            () => {
                console.log('complete?')
                this.connected = false;
                this.connectAttempted = false;
            }
        );
    }

1 Ответ

0 голосов
/ 09 ноября 2018

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

this.subject.next(JSON.stringinfy(...));

См. Эту страницу («Отправка сообщений на сервер»): https://rxjs -dev.firebaseapp.com / api / webSocket / webSocket

...