From e15c6b9f3ea69f7df1a4fdc818fd33b9260e97b4 Mon Sep 17 00:00:00 2001 From: Daniel Imms <2193314+Tyriar@users.noreply.github.com> Date: Sun, 16 Oct 2022 06:49:27 -0700 Subject: [PATCH] Warn/throw on unexpected attach addon socket state --- addons/xterm-addon-attach/src/AttachAddon.ts | 22 ++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/addons/xterm-addon-attach/src/AttachAddon.ts b/addons/xterm-addon-attach/src/AttachAddon.ts index 9fbd796b86..7fd8df29ab 100644 --- a/addons/xterm-addon-attach/src/AttachAddon.ts +++ b/addons/xterm-addon-attach/src/AttachAddon.ts @@ -47,16 +47,14 @@ export class AttachAddon implements ITerminalAddon { } private _sendData(data: string): void { - // TODO: do something better than just swallowing - // the data if the socket is not in a working condition - if (this._socket.readyState !== 1) { + if (!this._checkOpenSocket()) { return; } this._socket.send(data); } private _sendBinary(data: string): void { - if (this._socket.readyState !== 1) { + if (!this._checkOpenSocket()) { return; } const buffer = new Uint8Array(data.length); @@ -65,6 +63,22 @@ export class AttachAddon implements ITerminalAddon { } this._socket.send(buffer); } + + private _checkOpenSocket(): boolean { + switch (this._socket.readyState) { + case WebSocket.OPEN: + return true; + case WebSocket.CONNECTING: + throw new Error('Attach addon was loaded before socket was open'); + case WebSocket.CLOSING: + console.warn('Attach addon socket is closing'); + return false; + case WebSocket.CLOSED: + throw new Error('Attach addon socket is closed'); + default: + throw new Error('Unexpected socket state'); + } + } } function addSocketListener(socket: WebSocket, type: K, handler: (this: WebSocket, ev: WebSocketEventMap[K]) => any): IDisposable {