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