{ "version": 3, "sources": ["../src/ClipboardAddon.ts"], "sourcesContent": ["/**\n * Copyright (c) 2023 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { IDisposable, ITerminalAddon, Terminal } from '@xterm/xterm';\nimport { type IClipboardProvider, type IBase64 } from '@xterm/addon-clipboard';\n\nexport class ClipboardAddon implements ITerminalAddon {\n private _terminal?: Terminal;\n private _disposable?: IDisposable;\n\n constructor(\n private _base64: IBase64 = new Base64(),\n private _provider: IClipboardProvider = new BrowserClipboardProvider()\n ) {}\n\n public activate(terminal: Terminal): void {\n this._terminal = terminal;\n this._disposable = terminal.parser.registerOscHandler(52, data => this._setOrReportClipboard(data));\n }\n\n public dispose(): void {\n return this._disposable?.dispose();\n }\n\n private _readText(sel: string, data: string): void {\n const b64 = this._base64.encodeText(data);\n this._terminal?.input(`\\x1b]52;${sel};${b64}\\x07`, false);\n }\n\n private _setOrReportClipboard(data: string): boolean | Promise {\n const args = data.split(';');\n if (args.length < 2) {\n return true;\n }\n\n const pc = args[0];\n const pd = args[1];\n if (pd === '?') {\n const text = this._provider.readText(pc);\n\n // Report clipboard\n if (text instanceof Promise) {\n return text.then((data) => {\n this._readText(pc, data);\n return true;\n });\n }\n\n this._readText(pc, text);\n return true;\n }\n\n // Clear clipboard if text is not a base64 encoded string.\n let text = '';\n try {\n text = this._base64.decodeText(pd);\n } catch {}\n\n\n const result = this._provider.writeText(pc, text);\n if (result instanceof Promise) {\n return result.then(() => true);\n }\n\n return true;\n }\n}\n\nexport class BrowserClipboardProvider implements IClipboardProvider {\n public readText(selection: string): Promise {\n return navigator.clipboard.readText();\n }\n\n public writeText(selection: string, text: string): Promise {\n return navigator.clipboard.writeText(text);\n }\n}\n\n/**\n * TODO: Once the base64 handling on Uint8Arrays is more common,\n * remove the btoa/atob fallbacks below.\n */\ninterface IUint8ArrayB64 extends Uint8Array {\n toBase64(): string;\n}\ninterface IUint8ArrayB64Ctor extends Uint8ArrayConstructor {\n fromBase64(s: string): IUint8ArrayB64;\n}\n\nexport class Base64 implements IBase64 {\n public encodeText(data: string): string {\n const bytes = new TextEncoder().encode(data) as IUint8ArrayB64;\n if (bytes.toBase64 !== undefined) {\n return bytes.toBase64();\n }\n let bin = '';\n for (let i = 0; i < bytes.length; i++) {\n bin += String.fromCharCode(bytes[i]);\n }\n return btoa(bin);\n }\n public decodeText(data: string): string {\n if ((Uint8Array as IUint8ArrayB64Ctor).fromBase64 !== undefined) {\n try {\n return new TextDecoder().decode((Uint8Array as IUint8ArrayB64Ctor).fromBase64(data));\n } catch {}\n return '';\n }\n try {\n const bin = atob(data);\n const bytes = new Uint8Array(bin.length);\n for (let i = 0; i < bin.length; ++i) {\n bytes[i] = bin.charCodeAt(i);\n }\n return new TextDecoder().decode(bytes);\n } catch {}\n return '';\n }\n}\n"], "mappings": ";;;;;;;;;;;;;;;;AAQO,IAAMA,EAAN,KAA+C,CAIpD,YACUC,EAAmB,IAAIC,EACvBC,EAAgC,IAAIC,EAC5C,CAFQ,aAAAH,EACA,eAAAE,CACP,CAEI,SAASE,EAA0B,CACxC,KAAK,UAAYA,EACjB,KAAK,YAAcA,EAAS,OAAO,mBAAmB,GAAIC,GAAQ,KAAK,sBAAsBA,CAAI,CAAC,CACpG,CAEO,SAAgB,CACrB,OAAO,KAAK,aAAa,QAAQ,CACnC,CAEQ,UAAUC,EAAaD,EAAoB,CACjD,IAAME,EAAM,KAAK,QAAQ,WAAWF,CAAI,EACxC,KAAK,WAAW,MAAM,WAAWC,CAAG,IAAIC,CAAG,OAAQ,EAAK,CAC1D,CAEQ,sBAAsBF,EAA0C,CACtE,IAAMG,EAAOH,EAAK,MAAM,GAAG,EAC3B,GAAIG,EAAK,OAAS,EAChB,MAAO,GAGT,IAAMC,EAAKD,EAAK,CAAC,EACXE,EAAKF,EAAK,CAAC,EACjB,GAAIE,IAAO,IAAK,CACd,IAAMC,EAAO,KAAK,UAAU,SAASF,CAAE,EAGvC,OAAIE,aAAgB,QACXA,EAAK,KAAMN,IAChB,KAAK,UAAUI,EAAIJ,CAAI,EAChB,GACR,GAGH,KAAK,UAAUI,EAAIE,CAAI,EAChB,GACT,CAGA,IAAIA,EAAO,GACX,GAAI,CACFA,EAAO,KAAK,QAAQ,WAAWD,CAAE,CACnC,MAAQ,CAAC,CAGT,IAAME,EAAS,KAAK,UAAU,UAAUH,EAAIE,CAAI,EAChD,OAAIC,aAAkB,QACbA,EAAO,KAAK,IAAM,EAAI,EAGxB,EACT,CACF,EAEaT,EAAN,KAA6D,CAC3D,SAASU,EAAoC,CAClD,OAAO,UAAU,UAAU,SAAS,CACtC,CAEO,UAAUA,EAAmBF,EAA6B,CAC/D,OAAO,UAAU,UAAU,UAAUA,CAAI,CAC3C,CACF,EAaaV,EAAN,KAAgC,CAC9B,WAAWI,EAAsB,CACtC,IAAMS,EAAQ,IAAI,YAAY,EAAE,OAAOT,CAAI,EAC3C,GAAIS,EAAM,WAAa,OACrB,OAAOA,EAAM,SAAS,EAExB,IAAIC,EAAM,GACV,QAAS,EAAI,EAAG,EAAID,EAAM,OAAQ,IAChCC,GAAO,OAAO,aAAaD,EAAM,CAAC,CAAC,EAErC,OAAO,KAAKC,CAAG,CACjB,CACO,WAAWV,EAAsB,CACtC,GAAK,WAAkC,aAAe,OAAW,CAC/D,GAAI,CACF,OAAO,IAAI,YAAY,EAAE,OAAQ,WAAkC,WAAWA,CAAI,CAAC,CACrF,MAAQ,CAAC,CACT,MAAO,EACT,CACA,GAAI,CACF,IAAMU,EAAM,KAAKV,CAAI,EACfS,EAAQ,IAAI,WAAWC,EAAI,MAAM,EACvC,QAAS,EAAI,EAAG,EAAIA,EAAI,OAAQ,EAAE,EAChCD,EAAM,CAAC,EAAIC,EAAI,WAAW,CAAC,EAE7B,OAAO,IAAI,YAAY,EAAE,OAAOD,CAAK,CACvC,MAAQ,CAAC,CACT,MAAO,EACT,CACF", "names": ["ClipboardAddon", "_base64", "Base64", "_provider", "BrowserClipboardProvider", "terminal", "data", "sel", "b64", "args", "pc", "pd", "text", "result", "selection", "bytes", "bin"] }