{
  "version": 3,
  "sources": ["../src/AttachAddon.ts"],
  "sourcesContent": ["/**\n * Copyright (c) 2014, 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * Implements the attach method, that attaches the terminal to a WebSocket stream.\n */\n\nimport type { Terminal, IDisposable, ITerminalAddon } from '@xterm/xterm';\nimport type { AttachAddon as IAttachApi } from '@xterm/addon-attach';\n\ninterface IAttachOptions {\n  bidirectional?: boolean;\n}\n\nexport class AttachAddon implements ITerminalAddon , IAttachApi {\n  private _socket: WebSocket;\n  private _bidirectional: boolean;\n  private _disposables: IDisposable[] = [];\n\n  constructor(socket: WebSocket, options?: IAttachOptions) {\n    this._socket = socket;\n    // always set binary type to arraybuffer, we do not handle blobs\n    this._socket.binaryType = 'arraybuffer';\n    this._bidirectional = !(options && options.bidirectional === false);\n  }\n\n  public activate(terminal: Terminal): void {\n    this._disposables.push(\n      addSocketListener(this._socket, 'message', ev => {\n        const data: ArrayBuffer | string = ev.data;\n        terminal.write(typeof data === 'string' ? data : new Uint8Array(data));\n      })\n    );\n\n    if (this._bidirectional) {\n      this._disposables.push(terminal.onData(data => this._sendData(data)));\n      this._disposables.push(terminal.onBinary(data => this._sendBinary(data)));\n    }\n\n    this._disposables.push(addSocketListener(this._socket, 'close', () => this.dispose()));\n    this._disposables.push(addSocketListener(this._socket, 'error', () => this.dispose()));\n  }\n\n  public dispose(): void {\n    for (const d of this._disposables) {\n      d.dispose();\n    }\n  }\n\n  private _sendData(data: string): void {\n    if (!this._checkOpenSocket()) {\n      return;\n    }\n    this._socket.send(data);\n  }\n\n  private _sendBinary(data: string): void {\n    if (!this._checkOpenSocket()) {\n      return;\n    }\n    const buffer = new Uint8Array(data.length);\n    for (let i = 0; i < data.length; ++i) {\n      buffer[i] = data.charCodeAt(i) & 255;\n    }\n    this._socket.send(buffer);\n  }\n\n  private _checkOpenSocket(): boolean {\n    switch (this._socket.readyState) {\n      case WebSocket.OPEN:\n        return true;\n      case WebSocket.CONNECTING:\n        throw new Error('Attach addon was loaded before socket was open');\n      case WebSocket.CLOSING:\n        console.warn('Attach addon socket is closing');\n        return false;\n      case WebSocket.CLOSED:\n        throw new Error('Attach addon socket is closed');\n      default:\n        throw new Error('Unexpected socket state');\n    }\n  }\n}\n\nfunction addSocketListener<K extends keyof WebSocketEventMap>(socket: WebSocket, type: K, handler: (this: WebSocket, ev: WebSocketEventMap[K]) => any): IDisposable {\n  socket.addEventListener(type, handler);\n  return {\n    dispose: () => {\n      if (!handler) {\n        // Already disposed\n        return;\n      }\n      socket.removeEventListener(type, handler);\n    }\n  };\n}\n"],
  "mappings": ";;;;;;;;;;;;;;;;AAcO,IAAMA,EAAN,KAAyD,CAK9D,YAAYC,EAAmBC,EAA0B,CAFzD,KAAQ,aAA8B,CAAC,EAGrC,KAAK,QAAUD,EAEf,KAAK,QAAQ,WAAa,cAC1B,KAAK,eAAiB,EAAEC,GAAWA,EAAQ,gBAAkB,GAC/D,CAEO,SAASC,EAA0B,CACxC,KAAK,aAAa,KAChBC,EAAkB,KAAK,QAAS,UAAWC,GAAM,CAC/C,IAAMC,EAA6BD,EAAG,KACtCF,EAAS,MAAM,OAAOG,GAAS,SAAWA,EAAO,IAAI,WAAWA,CAAI,CAAC,CACvE,CAAC,CACH,EAEI,KAAK,iBACP,KAAK,aAAa,KAAKH,EAAS,OAAOG,GAAQ,KAAK,UAAUA,CAAI,CAAC,CAAC,EACpE,KAAK,aAAa,KAAKH,EAAS,SAASG,GAAQ,KAAK,YAAYA,CAAI,CAAC,CAAC,GAG1E,KAAK,aAAa,KAAKF,EAAkB,KAAK,QAAS,QAAS,IAAM,KAAK,QAAQ,CAAC,CAAC,EACrF,KAAK,aAAa,KAAKA,EAAkB,KAAK,QAAS,QAAS,IAAM,KAAK,QAAQ,CAAC,CAAC,CACvF,CAEO,SAAgB,CACrB,QAAWG,KAAK,KAAK,aACnBA,EAAE,QAAQ,CAEd,CAEQ,UAAUD,EAAoB,CAC/B,KAAK,iBAAiB,GAG3B,KAAK,QAAQ,KAAKA,CAAI,CACxB,CAEQ,YAAYA,EAAoB,CACtC,GAAI,CAAC,KAAK,iBAAiB,EACzB,OAEF,IAAME,EAAS,IAAI,WAAWF,EAAK,MAAM,EACzC,QAASG,EAAI,EAAGA,EAAIH,EAAK,OAAQ,EAAEG,EACjCD,EAAOC,CAAC,EAAIH,EAAK,WAAWG,CAAC,EAAI,IAEnC,KAAK,QAAQ,KAAKD,CAAM,CAC1B,CAEQ,kBAA4B,CAClC,OAAQ,KAAK,QAAQ,WAAY,CAC/B,KAAK,UAAU,KACb,MAAO,GACT,KAAK,UAAU,WACb,MAAM,IAAI,MAAM,gDAAgD,EAClE,KAAK,UAAU,QACb,eAAQ,KAAK,gCAAgC,EACtC,GACT,KAAK,UAAU,OACb,MAAM,IAAI,MAAM,+BAA+B,EACjD,QACE,MAAM,IAAI,MAAM,yBAAyB,CAC7C,CACF,CACF,EAEA,SAASJ,EAAqDH,EAAmBS,EAASC,EAA0E,CAClK,OAAAV,EAAO,iBAAiBS,EAAMC,CAAO,EAC9B,CACL,QAAS,IAAM,CACRA,GAILV,EAAO,oBAAoBS,EAAMC,CAAO,CAC1C,CACF,CACF",
  "names": ["AttachAddon", "socket", "options", "terminal", "addSocketListener", "ev", "data", "d", "buffer", "i", "type", "handler"]
}
