Webatrice websocket refactor (#4435)

* add unit tests for websocket events

* add unit tests for KeepAliveService, clean up keepAlive termination flow

* put keepAlive command in protobuf service and expose thru webClient

* secure wss

* rename files tsx to ts

* add localhost support for ws/wss connection

Co-authored-by: Jeremy Letto <jeremy.letto@datasite.com>
This commit is contained in:
Jeremy Letto 2021-10-17 19:52:59 -05:00 committed by GitHub
parent f75ff2a7c8
commit 586f23cfa9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 568 additions and 77 deletions

View file

@ -0,0 +1,71 @@
import { KeepAliveService } from './KeepAliveService';
import { WebSocketService } from "./WebSocketService";
import webClient from '../WebClient';
describe('KeepAliveService', () => {
let service: KeepAliveService;
let socket: WebSocketService;
beforeEach(() => {
jest.useFakeTimers();
socket = new WebSocketService(webClient);
service = new KeepAliveService(socket);
});
it('should create', () => {
expect(service).toBeDefined();
});
describe('startPingLoop', () => {
let resolvePing;
let interval;
let promise;
let ping;
let checkReadyStateSpy;
beforeEach(() => {
interval = 100;
promise = new Promise(resolve => resolvePing = resolve);
ping = (done) => promise.then(done);
checkReadyStateSpy = spyOn(socket, 'checkReadyState');
checkReadyStateSpy.and.returnValue(true);
service.startPingLoop(interval, ping);
jest.advanceTimersByTime(interval);
});
it('should start ping loop', () => {
expect((service as any).keepalivecb).toBeDefined();
expect((service as any).lastPingPending).toBeTruthy();
});
it('should call ping callback when done', (done: jest.DoneCallback) => {
resolvePing();
promise.then(() => {
expect((service as any).lastPingPending).toBeFalsy();
done();
});
});
it('should fire disconnected$ if lastPingPending is still true', () => {
spyOn(service.disconnected$, 'next');
jest.advanceTimersByTime(interval);
expect(service.disconnected$.next).toHaveBeenCalled();
});
it('should endPingLoop if socket is not open', () => {
spyOn(service, 'endPingLoop');
checkReadyStateSpy.and.returnValue(false);
resolvePing();
jest.advanceTimersByTime(interval);
expect(service.endPingLoop).toHaveBeenCalled();
});
});
});