{"version":3,"file":"BunPTY-GnYDD1y-.mjs","names":[],"sources":["../src/terminal/Layers/BunPTY.ts"],"sourcesContent":["import * as Effect from \"effect/Effect\";\nimport * as Layer from \"effect/Layer\";\nimport { PtyAdapter } from \"../Services/PTY.ts\";\nimport type { PtyAdapterShape, PtyExitEvent, PtyProcess } from \"../Services/PTY.ts\";\n\nclass BunPtyProcess implements PtyProcess {\n  private readonly dataListeners = new Set<(data: string) => void>();\n  private readonly exitListeners = new Set<(event: PtyExitEvent) => void>();\n  private readonly decoder = new TextDecoder();\n  private readonly process: Bun.Subprocess;\n  private didExit = false;\n\n  constructor(process: Bun.Subprocess) {\n    this.process = process;\n    void this.process.exited\n      .then((exitCode) => {\n        this.emitExit({\n          exitCode: Number.isInteger(exitCode) ? exitCode : 0,\n          signal: typeof this.process.signalCode === \"number\" ? this.process.signalCode : null,\n        });\n      })\n      .catch(() => {\n        this.emitExit({ exitCode: 1, signal: null });\n      });\n  }\n\n  get pid(): number {\n    return this.process.pid;\n  }\n\n  write(data: string): void {\n    if (!this.process.terminal) {\n      throw new Error(\"Bun PTY terminal handle is unavailable\");\n    }\n    this.process.terminal.write(data);\n  }\n\n  resize(cols: number, rows: number): void {\n    if (!this.process.terminal?.resize) {\n      throw new Error(\"Bun PTY resize is unavailable\");\n    }\n    this.process.terminal.resize(cols, rows);\n  }\n\n  kill(signal?: string): void {\n    if (!signal) {\n      this.process.kill();\n      return;\n    }\n    this.process.kill(signal as NodeJS.Signals);\n  }\n\n  onData(callback: (data: string) => void): () => void {\n    this.dataListeners.add(callback);\n    return () => {\n      this.dataListeners.delete(callback);\n    };\n  }\n\n  onExit(callback: (event: PtyExitEvent) => void): () => void {\n    this.exitListeners.add(callback);\n    return () => {\n      this.exitListeners.delete(callback);\n    };\n  }\n\n  emitData(data: Uint8Array): void {\n    if (this.didExit) return;\n    const text = this.decoder.decode(data, { stream: true });\n    if (text.length === 0) return;\n    for (const listener of this.dataListeners) {\n      listener(text);\n    }\n  }\n\n  private emitExit(event: PtyExitEvent): void {\n    if (this.didExit) return;\n    this.didExit = true;\n\n    const remainder = this.decoder.decode();\n    if (remainder.length > 0) {\n      for (const listener of this.dataListeners) {\n        listener(remainder);\n      }\n    }\n\n    for (const listener of this.exitListeners) {\n      listener(event);\n    }\n  }\n}\n\nexport const layer = Layer.effect(\n  PtyAdapter,\n  Effect.gen(function* () {\n    if (process.platform === \"win32\") {\n      return yield* Effect.die(\n        \"Bun PTY terminal support is unavailable on Windows. Please use Node.js (e.g. by running `npx salchi`) instead.\",\n      );\n    }\n    return {\n      spawn: (input) =>\n        Effect.sync(() => {\n          let processHandle: BunPtyProcess | null = null;\n          const command = [input.shell, ...(input.args ?? [])];\n          const subprocess = Bun.spawn(command, {\n            cwd: input.cwd,\n            env: input.env,\n            terminal: {\n              cols: input.cols,\n              rows: input.rows,\n              data: (_terminal, data) => {\n                processHandle?.emitData(data);\n              },\n            },\n          });\n          processHandle = new BunPtyProcess(subprocess);\n          return processHandle;\n        }),\n    } satisfies PtyAdapterShape;\n  }),\n);\n"],"mappings":";;;;;;AAKA,IAAM,gBAAN,MAA0C;CACxC,gCAAiC,IAAI,IAA4B;CACjE,gCAAiC,IAAI,IAAmC;CACxE,UAA2B,IAAI,YAAY;CAC3C;CACA,UAAkB;CAElB,YAAY,SAAyB;EACnC,KAAK,UAAU;EACf,KAAU,QAAQ,OACf,MAAM,aAAa;GAClB,KAAK,SAAS;IACZ,UAAU,OAAO,UAAU,QAAQ,IAAI,WAAW;IAClD,QAAQ,OAAO,KAAK,QAAQ,eAAe,WAAW,KAAK,QAAQ,aAAa;GAClF,CAAC;EACH,CAAC,CAAC,CACD,YAAY;GACX,KAAK,SAAS;IAAE,UAAU;IAAG,QAAQ;GAAK,CAAC;EAC7C,CAAC;CACL;CAEA,IAAI,MAAc;EAChB,OAAO,KAAK,QAAQ;CACtB;CAEA,MAAM,MAAoB;EACxB,IAAI,CAAC,KAAK,QAAQ,UAChB,MAAM,IAAI,MAAM,wCAAwC;EAE1D,KAAK,QAAQ,SAAS,MAAM,IAAI;CAClC;CAEA,OAAO,MAAc,MAAoB;EACvC,IAAI,CAAC,KAAK,QAAQ,UAAU,QAC1B,MAAM,IAAI,MAAM,+BAA+B;EAEjD,KAAK,QAAQ,SAAS,OAAO,MAAM,IAAI;CACzC;CAEA,KAAK,QAAuB;EAC1B,IAAI,CAAC,QAAQ;GACX,KAAK,QAAQ,KAAK;GAClB;EACF;EACA,KAAK,QAAQ,KAAK,MAAwB;CAC5C;CAEA,OAAO,UAA8C;EACnD,KAAK,cAAc,IAAI,QAAQ;EAC/B,aAAa;GACX,KAAK,cAAc,OAAO,QAAQ;EACpC;CACF;CAEA,OAAO,UAAqD;EAC1D,KAAK,cAAc,IAAI,QAAQ;EAC/B,aAAa;GACX,KAAK,cAAc,OAAO,QAAQ;EACpC;CACF;CAEA,SAAS,MAAwB;EAC/B,IAAI,KAAK,SAAS;EAClB,MAAM,OAAO,KAAK,QAAQ,OAAO,MAAM,EAAE,QAAQ,KAAK,CAAC;EACvD,IAAI,KAAK,WAAW,GAAG;EACvB,KAAK,MAAM,YAAY,KAAK,eAC1B,SAAS,IAAI;CAEjB;CAEA,SAAiB,OAA2B;EAC1C,IAAI,KAAK,SAAS;EAClB,KAAK,UAAU;EAEf,MAAM,YAAY,KAAK,QAAQ,OAAO;EACtC,IAAI,UAAU,SAAS,GACrB,KAAK,MAAM,YAAY,KAAK,eAC1B,SAAS,SAAS;EAItB,KAAK,MAAM,YAAY,KAAK,eAC1B,SAAS,KAAK;CAElB;AACF;AAEA,MAAa,QAAQ,MAAM,OACzB,YACA,OAAO,IAAI,aAAa;CACtB,IAAI,QAAQ,aAAa,SACvB,OAAO,OAAO,OAAO,IACnB,gHACF;CAEF,OAAO,EACL,QAAQ,UACN,OAAO,WAAW;EAChB,IAAI,gBAAsC;EAC1C,MAAM,UAAU,CAAC,MAAM,OAAO,GAAI,MAAM,QAAQ,CAAC,CAAE;EAYnD,gBAAgB,IAAI,cAXD,IAAI,MAAM,SAAS;GACpC,KAAK,MAAM;GACX,KAAK,MAAM;GACX,UAAU;IACR,MAAM,MAAM;IACZ,MAAM,MAAM;IACZ,OAAO,WAAW,SAAS;KACzB,eAAe,SAAS,IAAI;IAC9B;GACF;EACF,CACkC,CAAU;EAC5C,OAAO;CACT,CAAC,EACL;AACF,CAAC,CACH"}