fix(websocket): don't throw unhandled promise rejections

This commit is contained in:
Joel Einbinder 2020-02-13 12:38:45 -08:00
parent 991b89fb11
commit f352ebd928

View file

@ -316,7 +316,7 @@ export class WebSocketTransport implements ConnectionTransport {
onmessage?: (message: string) => void;
onclose?: () => void;
private _connect: Promise<void>;
private _connect: Promise<{success: boolean, message?: string}>;
constructor(url: string) {
this._ws = (isNode ? new NodeWebSocket(url, [], {
@ -324,8 +324,8 @@ export class WebSocketTransport implements ConnectionTransport {
maxPayload: 256 * 1024 * 1024, // 256Mb
}) : new WebSocket(url)) as WebSocket;
this._connect = new Promise((fulfill, reject) => {
this._ws.addEventListener('open', () => fulfill());
this._ws.addEventListener('error', event => reject(new Error('WebSocket error: ' + (event as ErrorEvent).message)));
this._ws.addEventListener('open', () => fulfill({success: true}));
this._ws.addEventListener('error', event => fulfill({success: false, message: (event as ErrorEvent).message}));
});
// The 'ws' module in node sometimes sends us multiple messages in a single task.
// In Web, all IO callbacks (e.g. WebSocket callbacks)
@ -348,8 +348,15 @@ export class WebSocketTransport implements ConnectionTransport {
this._ws.addEventListener('error', () => {});
}
async _ensureConnected() {
const {success, message} = await this._connect;
if (success)
return;
throw new Error('WebSocket error: ' + message);
}
async send(message: string) {
await this._connect;
await this._ensureConnected();
this._ws.send(message);
}