{"version":3,"sources":["../src/eventEmitter.ts","../src/utils.ts","../src/termios.ts","../src/lineDiscipline.ts","../src/pty.ts"],"sourcesContent":["type Listener<T> = (arg: T) => void;\nexport type Event<T> = (listener: Listener<T>) => { dispose: () => void };\n\nexport class EventEmitter<T> {\n  private listeners = new Set<Listener<T>>();\n\n  private _register(listener: Listener<T>) {\n    this.listeners.add(listener);\n    return {\n      dispose: () => {\n        this.listeners.delete(listener);\n      },\n    };\n  }\n\n  register = this._register.bind(this);\n\n  public fire(arg: T): void {\n    for (const listener of this.listeners) {\n      try {\n        listener(arg);\n      } catch (e) {\n        console.error(e);\n      }\n    }\n  }\n}\n","export const BS = 8;\nexport const TAB = 9;\nexport const NL = 10;\nexport const CR = 13;\nexport const SP = 32;\n\nexport const isWordChar = (c: number) =>\n  (0x30 <= c && c <= 0x39) ||\n  (0x41 <= c && c <= 0x5a) ||\n  c == 0x5f ||\n  (0x61 <= c && c <= 0x7a);\nexport const iscntrl = (c: number) =>\n  (0x00 <= c && c <= 0x1f && c != 0x09) || c == 0x7f;\nexport const isUtf8ContinuationByte = (c: number) => (c & 0xc0) == 0x80;\nexport const tolower = (c: number) => (0x41 <= c && c <= 0x5a ? c + 0x20 : c);\nexport const toupper = (c: number) => (0x61 <= c && c <= 0x7a ? c - 0x20 : c);\n\nconst utf8Encoder = new TextEncoder();\n\nexport const stringToUtf8Bytes = (str: string) =>\n  Array.from(utf8Encoder.encode(str));\n","// This module provides a Termios class for termios struct data.\n//\n// https://man7.org/linux/man-pages/man3/termios.3.html\n\n/* eslint-disable @typescript-eslint/no-duplicate-enum-values */\nexport const enum Flags {\n  // c_iflag\n  ISTRIP = 0x0020,\n  INLCR = 0x0040,\n  IGNCR = 0x0080,\n  ICRNL = 0x0100,\n  IUCLC = 0x0200,\n  IXON = 0x0400,\n  IXANY = 0x0800,\n  IMAXBEL = 0x2000,\n  IUTF8 = 0x4000,\n\n  // c_oflag\n  OPOST = 0x0001,\n  OLCUC = 0x0002,\n  ONLCR = 0x0004,\n  OCRNL = 0x0008,\n  ONOCR = 0x0010,\n  ONLRET = 0x0020,\n  TABDLY = 0x1800,\n  XTABS = 0x1800,\n\n  // c_lflag\n  ISIG = 0x0001,\n  ICANON = 0x0002,\n  ECHO = 0x0008,\n  ECHOE = 0x0010,\n  ECHOK = 0x0020,\n  ECHONL = 0x0040,\n  NOFLSH = 0x0080,\n  ECHOCTL = 0x0200,\n  ECHOPRT = 0x0400,\n  ECHOKE = 0x0800,\n  IEXTEN = 0x8000,\n\n  // c_cc\n  VINTR = 0,\n  VQUIT = 1,\n  VERASE = 2,\n  VKILL = 3,\n  VEOF = 4,\n  VTIME = 5,\n  VMIN = 6,\n  VSWTCH = 7,\n  VSTART = 8,\n  VSTOP = 9,\n  VSUSP = 10,\n  VEOL = 11,\n  VREPRINT = 12,\n  VDISCARD = 13,\n  VWERASE = 14,\n  VLNEXT = 15,\n  VEOL2 = 16,\n}\n/* eslint-enable @typescript-eslint/no-duplicate-enum-values */\n\nexport interface TermiosConfig {\n  readonly iflag: number;\n  readonly oflag: number;\n  readonly cflag: number;\n  readonly lflag: number;\n  readonly cc: ReadonlyArray<number>;\n}\n\nexport class Termios implements TermiosConfig {\n  constructor(\n    readonly iflag: number,\n    readonly oflag: number,\n    readonly cflag: number,\n    readonly lflag: number,\n    readonly cc: ReadonlyArray<number>,\n  ) {}\n\n  readonly ISTRIP_P = (this.iflag & Flags.ISTRIP) != 0;\n  readonly INLCR_P = (this.iflag & Flags.INLCR) != 0;\n  readonly IGNCR_P = (this.iflag & Flags.IGNCR) != 0;\n  readonly ICRNL_P = (this.iflag & Flags.ICRNL) != 0;\n  readonly IUCLC_P = (this.iflag & Flags.IUCLC) != 0;\n  readonly IXON_P = (this.iflag & Flags.IXON) != 0;\n  readonly IXANY_P = (this.iflag & Flags.IXANY) != 0;\n  readonly IUTF8_P = (this.iflag & Flags.IUTF8) != 0;\n  readonly OPOST_P = (this.oflag & Flags.OPOST) != 0;\n  readonly OLCUC_P = (this.oflag & Flags.OLCUC) != 0;\n  readonly ONLCR_P = (this.oflag & Flags.ONLCR) != 0;\n  readonly OCRNL_P = (this.oflag & Flags.OCRNL) != 0;\n  readonly ONOCR_P = (this.oflag & Flags.ONOCR) != 0;\n  readonly ONLRET_P = (this.oflag & Flags.ONLRET) != 0;\n  readonly TABDLY_XTABS_P = (this.oflag & Flags.TABDLY) == Flags.XTABS;\n  readonly ISIG_P = (this.lflag & Flags.ISIG) != 0;\n  readonly ICANON_P = (this.lflag & Flags.ICANON) != 0;\n  readonly ECHO_P = (this.lflag & Flags.ECHO) != 0;\n  readonly ECHOE_P = (this.lflag & Flags.ECHOE) != 0;\n  readonly ECHOK_P = (this.lflag & Flags.ECHOK) != 0;\n  readonly ECHONL_P = (this.lflag & Flags.ECHONL) != 0;\n  readonly NOFLSH_P = (this.lflag & Flags.NOFLSH) != 0;\n  readonly ECHOCTL_P = (this.lflag & Flags.ECHOCTL) != 0;\n  readonly ECHOPRT_P = (this.lflag & Flags.ECHOPRT) != 0;\n  readonly ECHOKE_P = (this.lflag & Flags.ECHOKE) != 0;\n  readonly IEXTEN_P = (this.lflag & Flags.IEXTEN) != 0;\n\n  readonly INTR_V = this.cc[Flags.VINTR];\n  readonly QUIT_V = this.cc[Flags.VQUIT];\n  readonly ERASE_V = this.cc[Flags.VERASE];\n  readonly KILL_V = this.cc[Flags.VKILL];\n  readonly EOF_V = this.cc[Flags.VEOF];\n  readonly TIME_V = this.cc[Flags.VTIME]; // not supported\n  readonly MIN_V = this.cc[Flags.VMIN]; // not supported\n  readonly SWTCH_V = this.cc[Flags.VSWTCH]; // not supported\n  readonly START_V = this.cc[Flags.VSTART];\n  readonly STOP_V = this.cc[Flags.VSTOP];\n  readonly SUSP_V = this.cc[Flags.VSUSP];\n  readonly EOL_V = this.cc[Flags.VEOL];\n  readonly REPRINT_V = this.cc[Flags.VREPRINT];\n  readonly DISCARD_V = this.cc[Flags.VDISCARD]; // not supported\n  readonly WERASE_V = this.cc[Flags.VWERASE];\n  readonly LNEXT_V = this.cc[Flags.VLNEXT];\n  readonly EOL2_V = this.cc[Flags.VEOL2];\n\n  static fromConfig(config: TermiosConfig) {\n    return new Termios(\n      config.iflag,\n      config.oflag,\n      config.cflag,\n      config.lflag,\n      config.cc,\n    );\n  }\n\n  clone() {\n    return Termios.fromConfig(this);\n  }\n}\n\nexport const defaultTermios = new Termios(\n  Flags.ICRNL | Flags.IXON | Flags.IMAXBEL | Flags.IUTF8,\n  Flags.OPOST | Flags.ONLCR,\n  0x00bf, // c_cflag is not supported\n  Flags.ISIG |\n    Flags.ICANON |\n    Flags.ECHO |\n    Flags.ECHOE |\n    Flags.ECHOK |\n    Flags.ECHOCTL |\n    Flags.ECHOKE |\n    Flags.IEXTEN,\n  [\n    0x03, 0x1c, 0x7f, 0x15, 0x04, 0x00, 0x01, 0x00, 0x11, 0x13, 0x1a, 0x00,\n    0x12, 0x0f, 0x17, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n  ],\n);\n","// This module provides LineDiscipline class.\n//\n// It glues the low-level device (e.g., xterm.js) with the high-level process\n// (e.g., JavaScript code and an Emscripten'ed process).\n//\n// It receives an input event from the lower layer (writeFromLower()).\n// Depending on the \"termios\" configuration, it handles some special characters\n// such as Ctrl+C, applies some translations to the input, echos it back to the\n// lower layers, etc. Finally it conveys the input to the upper layer\n// (onWriteToUpper() or onSignalToUpper()).\n//\n// It also receives an output event form the upper layer (writeFromUpper()).\n// Again, it applies some translation (such as replacing NL with CR+NL)\n// depending on termios. And finally it conveys the output to the lower layer\n// (onWriteToLower()).\n//\n//                +-------+\n//                | Upper | (e.g., an Emscripten'ed process)\n//                +-------+\n//                  |   ^\n// writeFromUpper() |   | onWriteToUpper() (and onSignalToUpper())\n//                  V   |\n//           +-----------------+\n//           | Line discipline |\n//           +-----------------+\n//                  |   ^\n// onWriteToLower() |   | writeFromLower()\n//                  V   |\n//                +-------+\n//                | Lower | (e.g., xterm.js)\n//                +-------+\n//\n// References:\n//\n// https://en.wikipedia.org/wiki/Line_discipline\n// https://man7.org/linux/man-pages/man3/termios.3.html\n// https://pubs.opengroup.org/onlinepubs/009695299/basedefs/xbd_chap11.html\n// https://pubs.opengroup.org/onlinepubs/009695299/utilities/stty.html\n// https://github.com/torvalds/linux/blob/master/drivers/tty/n_tty.c\n\nimport {\n  BS,\n  TAB,\n  NL,\n  CR,\n  SP,\n  isWordChar,\n  iscntrl,\n  isUtf8ContinuationByte,\n  tolower,\n  toupper,\n  stringToUtf8Bytes,\n} from \"./utils\";\nimport { Signal } from \"./pty\";\nimport { Termios, defaultTermios } from \"./termios\";\nimport { EventEmitter } from \"./eventEmitter\";\n\ntype KeyAction =\n  | \"normal\"\n  | \"VEOF\"\n  | \"VEOL\"\n  | \"VERASE\"\n  | \"VKILL\"\n  | \"VREPRINT\"\n  | \"VWERASE\"\n  | \"VLNEXT\"\n  | \"VSTART\"\n  | \"VSTOP\"\n  | \"VINTR\"\n  | \"VQUIT\"\n  | \"VSUSP\";\n\nexport class LineDiscipline {\n  // callbacks\n  private _onWriteToLower = new EventEmitter<number[]>();\n  readonly onWriteToLower = this._onWriteToLower.register;\n\n  private _onWriteToUpper = new EventEmitter<number[]>();\n  readonly onWriteToUpper = this._onWriteToUpper.register;\n\n  private _onSignalToUpper = new EventEmitter<Signal>();\n  readonly onSignalToUpper = this._onSignalToUpper.register;\n\n  private _onFlowActivated = new EventEmitter<void>();\n  readonly onFlowActivated = this._onFlowActivated.register;\n\n  private _onFlowDeactivated = new EventEmitter<void>();\n  readonly onFlowDeactivated = this._onFlowDeactivated.register;\n\n  // states\n  private T = defaultTermios;\n  private keyActions: KeyAction[] = new Array(256).fill(\"normal\");\n\n  private flowActivated = true; // false after VSTOP (C-s), true after VSTART (C-q)\n  private column = 0; // the column that the cursor is in\n  private baseColumn = 0; // the column that starts the to-upper buffer\n  private vlnext = false; // waiting for the next character after VLNEXT (C-v)\n  private echoprt = false; // erasing with ECHOPRT\n\n  private toLowerBuf: number[] = []; // flushed immediately every call\n  private toUpperBuf: number[] = []; // flushed after NL is input (in ICANON mode)\n\n  constructor() {\n    this.termios = defaultTermios;\n  }\n\n  private activateFlow() {\n    this.flowActivated = true;\n    this._onFlowActivated.fire();\n  }\n\n  private deactivateFlow() {\n    this.flowActivated = false;\n    this._onFlowDeactivated.fire();\n  }\n\n  get flow() {\n    return this.flowActivated;\n  }\n\n  get termios() {\n    return this.T;\n  }\n\n  set termios(T: Termios) {\n    this.T = T;\n\n    const keyActions: KeyAction[] = new Array(256).fill(\"normal\");\n\n    if (T.ICANON_P) {\n      keyActions[T.EOF_V] = \"VEOF\";\n      keyActions[T.EOL_V] = \"VEOL\";\n      keyActions[T.EOL2_V] = \"VEOL\";\n      keyActions[T.ERASE_V] = \"VERASE\";\n      keyActions[T.KILL_V] = \"VKILL\";\n      if (T.IEXTEN_P) {\n        keyActions[T.REPRINT_V] = \"VREPRINT\";\n        keyActions[T.WERASE_V] = \"VWERASE\";\n      }\n    }\n    if (T.IEXTEN_P) {\n      keyActions[T.LNEXT_V] = \"VLNEXT\";\n    }\n    if (T.IXON_P) {\n      keyActions[T.START_V] = \"VSTART\";\n      keyActions[T.STOP_V] = \"VSTOP\";\n    }\n    if (T.ISIG_P) {\n      keyActions[T.INTR_V] = \"VINTR\";\n      keyActions[T.QUIT_V] = \"VQUIT\";\n      keyActions[T.SUSP_V] = \"VSUSP\";\n    }\n    keyActions[0] = \"normal\"; // Ignore any action for NUL character\n\n    this.keyActions = keyActions;\n\n    if (!this.T.IXON_P) {\n      this.activateFlow();\n      this.flushToLower();\n    }\n  }\n\n  private clearToLower() {\n    this.toLowerBuf.length = 0;\n  }\n\n  private flushToLower() {\n    if (this.flowActivated == false) return;\n    this._onWriteToLower.fire(this.toLowerBuf);\n    this.clearToLower();\n  }\n\n  private outputToLower(buf: number[]) {\n    this.toLowerBuf.push(...buf);\n  }\n\n  private updateBaseColumn() {\n    if (this.toUpperBuf.length == 0) {\n      this.baseColumn = this.column;\n    }\n  }\n\n  private clearToUpper() {\n    this.toUpperBuf.length = 0;\n    this.updateBaseColumn();\n  }\n\n  private flushToUpper() {\n    this._onWriteToUpper.fire(this.toUpperBuf);\n    this.clearToUpper();\n  }\n\n  private outputToUpper(c: number) {\n    this.toUpperBuf.push(c);\n  }\n\n  private outputToLowerWithPostprocess(c: number) {\n    if (this.T.OPOST_P) {\n      switch (c) {\n        case BS:\n          if (this.column > 0) this.column--;\n          this.outputToLower([BS]);\n          break;\n        case TAB: {\n          const spaces = 8 - (this.column % 8);\n          this.column += spaces;\n          this.outputToLower(\n            this.T.TABDLY_XTABS_P ? new Array(spaces).fill(SP) : [TAB],\n          );\n          break;\n        }\n        case NL:\n          if (this.T.ONLCR_P) {\n            this.baseColumn = this.column = 0;\n            this.outputToLower([CR, NL]);\n          } else if (this.T.ONLRET_P) {\n            this.column = 0;\n            this.outputToLower([NL]);\n          } else {\n            this.baseColumn = this.column;\n            this.outputToLower([NL]);\n          }\n          break;\n        case CR:\n          if (this.T.ONOCR_P && this.column == 0) {\n            // nothing printed\n          } else if (this.T.OCRNL_P) {\n            if (this.T.ONLRET_P) this.baseColumn = this.column = 0;\n            this.outputToLower([NL]);\n          } else {\n            this.baseColumn = this.column = 0;\n            this.outputToLower([CR]);\n          }\n          break;\n        default:\n          if (!(this.T.IUTF8_P && isUtf8ContinuationByte(c))) this.column++;\n          this.outputToLower(this.T.OLCUC_P ? [toupper(c)] : [c]);\n          break;\n      }\n    } else {\n      this.outputToLower([c]);\n    }\n  }\n\n  private echoToLower(chars: number | number[], raw?: boolean) {\n    if (typeof chars == \"number\") chars = [chars];\n\n    for (const c of chars) {\n      if (this.T.ECHOCTL_P && iscntrl(c) && c != TAB && !raw) {\n        this.outputToLower([94 /* '^' */, c ^ 0x40]);\n        this.column += 2;\n      } else {\n        this.outputToLowerWithPostprocess(c);\n      }\n    }\n  }\n\n  private inputFromLowerWithPreprocess(c: number) {\n    if (c == CR) {\n      if (this.T.IGNCR_P) return;\n      if (this.T.ICRNL_P) c = NL;\n    } else if (c == NL && this.T.INLCR_P) {\n      c = CR;\n    }\n\n    if (this.T.ICANON_P && c == NL) {\n      // flush the to-upper buffer\n      if (this.T.ECHO_P || this.T.ECHONL_P) {\n        this.echoToLower(NL, true);\n        this.flushToLower();\n      }\n      this.outputToUpper(NL);\n      this.flushToUpper();\n    } else if (this.T.ECHO_P) {\n      this.finishECHOPRT();\n      this.updateBaseColumn();\n      if (c == NL) {\n        this.echoToLower(NL, true);\n      } else {\n        this.echoToLower(c);\n      }\n      this.flushToLower();\n      this.outputToUpper(c);\n    } else {\n      this.outputToUpper(c);\n    }\n    // writeFromLower will flush the to-upper buffer later\n  }\n\n  private erase(type: \"VERASE\" | \"VWERASE\" | \"VKILL\") {\n    if (this.toUpperBuf.length == 0) return;\n\n    if (type == \"VKILL\") {\n      if (!this.T.ECHO_P) {\n        this.clearToUpper();\n        return;\n      }\n      if (!this.T.ECHOK_P || !this.T.ECHOKE_P || !this.T.ECHOE_P) {\n        this.clearToUpper();\n        this.finishECHOPRT();\n        this.echoToLower(this.T.KILL_V);\n        if (this.T.ECHOK_P) this.echoToLower(NL, true);\n        return;\n      }\n    }\n\n    let alnumsFound = false;\n    for (let idx = this.toUpperBuf.length - 1; idx >= 0; idx--) {\n      const c = this.toUpperBuf[idx];\n      if (this.T.IUTF8_P && isUtf8ContinuationByte(c)) continue;\n\n      if (type == \"VWERASE\") {\n        if (isWordChar(c)) {\n          alnumsFound = true;\n        } else if (alnumsFound) break;\n      }\n\n      const removedChar = this.toUpperBuf.splice(idx);\n      if (this.T.ECHO_P) {\n        if (this.T.ECHOPRT_P) {\n          this.startECHOPRT();\n          this.echoToLower(removedChar);\n        } else if (type == \"VERASE\" && !this.T.ECHOE_P) {\n          this.echoToLower(this.T.ERASE_V);\n        } else if (c == TAB) {\n          let count = 0;\n          let tabFound = false;\n\n          for (let idx = this.toUpperBuf.length - 1; idx >= 0; idx--) {\n            const c = this.toUpperBuf[idx];\n            if (c == TAB) {\n              tabFound = true;\n              break;\n            } else if (iscntrl(c)) {\n              if (this.T.ECHOCTL_P) count += 2;\n            } else if (this.T.IUTF8_P && isUtf8ContinuationByte(c)) {\n              // ignore\n            } else {\n              count++;\n            }\n          }\n          if (!tabFound) count += this.baseColumn;\n\n          count = 8 - (count % 8);\n          this.outputToLower(new Array(count).fill(BS));\n          this.column = Math.max(0, this.column - count);\n        } else {\n          if (iscntrl(c) && this.T.ECHOCTL_P) {\n            this.echoToLower([BS, SP, BS], true);\n          }\n          if (!iscntrl(c) || this.T.ECHOCTL_P) {\n            // delete '^' of ECHOCTL\n            this.echoToLower([BS, SP, BS], true);\n          }\n        }\n      }\n      if (type == \"VERASE\") break;\n    }\n    if (this.toUpperBuf.length == 0) {\n      this.clearToUpper();\n      if (this.T.ECHO_P) this.finishECHOPRT();\n    }\n  }\n\n  private startECHOPRT() {\n    if (!this.echoprt) {\n      this.echoToLower(92 /* '\\' */, true);\n      this.echoprt = true;\n    }\n  }\n\n  private finishECHOPRT() {\n    if (this.echoprt) {\n      this.echoToLower(47 /* '/' */, true);\n      this.echoprt = false;\n    }\n  }\n\n  private signal(sig: Signal, c: number) {\n    this._onSignalToUpper.fire(sig);\n    if (!this.T.NOFLSH_P) {\n      this.clearToLower();\n      this.clearToUpper();\n    }\n    if (this.T.IXON_P) this.activateFlow();\n    if (this.T.ECHO_P) this.echoToLower(c);\n    this.flushToLower();\n  }\n\n  private checkStartFlow() {\n    if (this.flowActivated == false && this.T.IXON_P && this.T.IXANY_P) {\n      this.activateFlow();\n      this.flushToLower();\n    }\n  }\n\n  private nextLiteral() {\n    this.vlnext = true;\n    if (this.T.ECHO_P) {\n      this.finishECHOPRT();\n      if (this.T.ECHOCTL_P) {\n        this.echoToLower([94 /* '^' */, BS], true);\n        this.flushToLower();\n      }\n    }\n  }\n\n  private reprint() {\n    this.finishECHOPRT();\n    this.echoToLower(this.T.REPRINT_V);\n    this.echoToLower(NL, true);\n    this.echoToLower(this.toUpperBuf);\n  }\n\n  writeFromLower(arg: number[] | string) {\n    const buf = typeof arg == \"string\" ? stringToUtf8Bytes(arg) : arg;\n\n    for (let c of buf) {\n      if (this.T.ISTRIP_P) c &= 0x7f;\n      if (this.T.IUCLC_P && this.T.IEXTEN_P) c = tolower(c);\n\n      const keyAction = this.vlnext ? \"normal\" : this.keyActions[c];\n      this.vlnext = false;\n\n      switch (keyAction) {\n        case \"normal\":\n          this.checkStartFlow();\n          this.inputFromLowerWithPreprocess(c);\n          break;\n        case \"VERASE\":\n        case \"VWERASE\":\n        case \"VKILL\":\n          this.checkStartFlow();\n          this.erase(keyAction);\n          this.flushToLower();\n          break;\n        case \"VEOF\":\n          this.checkStartFlow();\n          this.flushToUpper();\n          break;\n        case \"VEOL\":\n          this.checkStartFlow();\n          if (this.T.ECHO_P) {\n            this.echoToLower(c);\n            this.flushToLower();\n          }\n          this.outputToUpper(c);\n          this.flushToUpper();\n          break;\n        case \"VLNEXT\":\n          this.checkStartFlow();\n          this.nextLiteral();\n          break;\n        case \"VREPRINT\":\n          this.checkStartFlow();\n          this.reprint();\n          this.flushToLower();\n          break;\n        case \"VSTART\":\n          this.activateFlow();\n          this.flushToLower();\n          break;\n        case \"VSTOP\":\n          this.deactivateFlow();\n          break;\n        case \"VINTR\":\n          this.signal(\"SIGINT\", c);\n          break;\n        case \"VQUIT\":\n          this.signal(\"SIGQUIT\", c);\n          break;\n        case \"VSUSP\":\n          this.signal(\"SIGTSTP\", c);\n          break;\n      }\n    }\n\n    if (!this.T.ICANON_P) {\n      this.flushToUpper();\n    }\n  }\n\n  writeFromUpper(arg: number[] | string) {\n    if (this.flowActivated == false) {\n      throw new Error(\"Do not write anything during flowStatus is stopped\");\n    }\n\n    const buf = typeof arg == \"string\" ? stringToUtf8Bytes(arg) : arg;\n\n    for (const c of buf) this.outputToLowerWithPostprocess(c);\n    this.flushToLower();\n  }\n}\n","// This module provides the \"openpty\" function.\n// It returns a master object, which is an addon for xterm.js, and a slave\n// object, which serves as stdin/stdout for a process.\n//\n// Typical usage:\n//\n//   // Start an xterm.js instance\n//   const xterm = new Terminal();\n//\n//   // Create master/slave objects\n//   const { master, slave } = openpty();\n//\n//   // Connect the master object to xterm.js\n//   xterm.loadAddon(master);\n//\n//   // Use slave.write instead of xterm.write\n//   slave.write(\"Hello, world!\\nInput your name:\");\n//\n//   // Use slave.onReadable and slave.read instead of xterm.onData\n//   slave.onReadable(() => {\n//     xterm.write(`Hi, ${ slave.read().trim() }!\\n`);\n//   });\n\nimport { Terminal, ITerminalAddon, IDisposable } from \"@xterm/xterm\";\nimport { EventEmitter } from \"./eventEmitter\";\nimport { LineDiscipline } from \"./lineDiscipline\";\nimport { Termios, TermiosConfig } from \"./termios\";\nimport { stringToUtf8Bytes } from \"./utils\";\n\nexport type Signal = \"SIGINT\" | \"SIGQUIT\" | \"SIGTSTP\" | \"SIGWINCH\";\n\nconst bufferLimit = 4096;\n\nclass Master implements ITerminalAddon {\n  private disposables: IDisposable[] = [];\n\n  private _onWrite = new EventEmitter<[Uint8Array, () => void]>();\n  readonly onWrite = this._onWrite.register;\n\n  private fromLdiscToLowerBuffer: number[] = [];\n  private waitingForLower = false; // xterm.js implements buffering\n\n  private notifyWritable;\n  private notifyResize;\n\n  constructor(\n    private ldisc: LineDiscipline,\n    private slave: Slave,\n  ) {\n    const flushToLower = () => {\n      if (this.fromLdiscToLowerBuffer.length >= 1) {\n        this.waitingForLower = true;\n\n        const buf = new Uint8Array(this.fromLdiscToLowerBuffer.splice(0, 4096));\n\n        if (this.fromLdiscToLowerBuffer.length <= bufferLimit)\n          this.notifyWritable();\n\n        this._onWrite.fire([buf, flushToLower]);\n      } else {\n        this.waitingForLower = false;\n      }\n    };\n\n    this.ldisc.onWriteToLower((buf) => {\n      this.fromLdiscToLowerBuffer.push(...buf);\n      if (!this.waitingForLower) flushToLower();\n    });\n\n    const { notifyWritable, notifyResize } = slave.initFromMaster();\n    this.notifyWritable = notifyWritable;\n    this.notifyResize = notifyResize;\n  }\n\n  activate(xterm: Terminal) {\n    this.disposables.push(\n      this.onWrite(([buf, callback]) => xterm.write(buf, callback)),\n    );\n\n    const onData = (str: string) => this.ldisc.writeFromLower(str);\n\n    this.disposables.push(\n      xterm.onData(onData),\n      xterm.onBinary(onData),\n      xterm.onResize(({ cols, rows }) => this.notifyResize(rows, cols)),\n    );\n  }\n\n  dispose(): void {\n    this.disposables.forEach((d) => d.dispose());\n    this.disposables.length = 0;\n  }\n}\n\nexport class Slave {\n  private _onReadable = new EventEmitter<void>();\n  readonly onReadable = this._onReadable.register;\n\n  private _onWritable = new EventEmitter<void>();\n  readonly onWritable = this._onWritable.register;\n\n  private _onSignal = new EventEmitter<Signal>();\n  readonly onSignal = this._onSignal.register;\n\n  private fromLdiscToUpperBuffer: number[] = [];\n  private fromUpperToLdiscBuffer: number[] = [];\n\n  private winsize: [number, number] = [80, 24];\n\n  constructor(private ldisc: LineDiscipline) {\n    this.ldisc.onWriteToUpper((buf) => {\n      this.fromLdiscToUpperBuffer.push(...buf);\n      this._onReadable.fire();\n    });\n\n    this.ldisc.onFlowActivated(() => {\n      if (this.fromUpperToLdiscBuffer.length >= 1) {\n        this.ldisc.writeFromUpper(this.fromUpperToLdiscBuffer);\n        this.fromUpperToLdiscBuffer.length = 0;\n      }\n    });\n\n    this.ldisc.onSignalToUpper((sig) => {\n      this._onSignal.fire(sig);\n    });\n  }\n\n  initFromMaster() {\n    return {\n      notifyWritable: () => this._onWritable.fire(),\n      notifyResize: (rows: number, cols: number) => {\n        this.winsize = [cols, rows];\n        this._onSignal.fire(\"SIGWINCH\");\n      },\n    };\n  }\n\n  get readable() {\n    return this.fromLdiscToUpperBuffer.length >= 1;\n  }\n\n  read(length?: number) {\n    const len =\n      typeof length !== \"undefined\"\n        ? Math.min(this.fromLdiscToUpperBuffer.length, length)\n        : this.fromLdiscToUpperBuffer.length;\n    return this.fromLdiscToUpperBuffer.splice(0, len);\n  }\n\n  get writable() {\n    return this.fromUpperToLdiscBuffer.length <= bufferLimit;\n  }\n\n  write(arg: string | number[]) {\n    const buf = typeof arg == \"string\" ? stringToUtf8Bytes(arg) : arg;\n    this.fromUpperToLdiscBuffer = this.fromUpperToLdiscBuffer.concat(buf);\n\n    if (this.ldisc.flow) {\n      this.ldisc.writeFromUpper(this.fromUpperToLdiscBuffer);\n      this.fromUpperToLdiscBuffer.length = 0;\n    }\n  }\n\n  ioctl(req: \"TCGETS\"): Termios;\n  ioctl(req: \"TCSETS\", arg: TermiosConfig): void;\n  ioctl(req: \"TIOCGWINSZ\"): [number, number];\n  ioctl(req: \"TCGETS\" | \"TCSETS\" | \"TIOCGWINSZ\", arg?: TermiosConfig) {\n    switch (req) {\n      case \"TCGETS\":\n        return this.ldisc.termios.clone();\n      case \"TCSETS\":\n        if (!arg) throw new Error(\"ioctl: TCSETS requires a TermiosConfig\");\n        this.ldisc.termios = Termios.fromConfig(arg);\n        return;\n      case \"TIOCGWINSZ\":\n        return this.winsize.slice();\n    }\n  }\n}\n\nexport const openpty = () => {\n  const ldisc = new LineDiscipline();\n  const slave = new Slave(ldisc);\n  const master = new Master(ldisc, slave);\n  return { master, slave };\n};\n"],"mappings":"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","names":["EventEmitter","listener","arg","e","isWordChar","c","iscntrl","isUtf8ContinuationByte","tolower","toupper","utf8Encoder","stringToUtf8Bytes","str","Flags","Termios","_Termios","iflag","oflag","cflag","lflag","cc","config","defaultTermios","LineDiscipline","EventEmitter","defaultTermios","T","keyActions","buf","c","spaces","isUtf8ContinuationByte","toupper","chars","raw","iscntrl","type","alnumsFound","idx","isWordChar","removedChar","count","tabFound","sig","arg","stringToUtf8Bytes","tolower","keyAction","bufferLimit","Master","ldisc","slave","EventEmitter","flushToLower","buf","notifyWritable","notifyResize","xterm","callback","onData","str","cols","rows","d","Slave","sig","length","len","arg","stringToUtf8Bytes","req","Termios","openpty","LineDiscipline"]}