diff --git a/src/platform.ts b/src/platform.ts index b4c0fea7ba..e2fb5b8150 100644 --- a/src/platform.ts +++ b/src/platform.ts @@ -316,7 +316,7 @@ export class WebSocketTransport implements ConnectionTransport { onmessage?: (message: string) => void; onclose?: () => void; - private _connect: Promise; + 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); }