{"version":3,"file":"stream.cjs","sources":["../../../../../src/mods/tor/stream.ts"],"sourcesContent":["import { Opaque, Writable } from \"@hazae41/binary\";\nimport { FullDuplex } from \"@hazae41/cascade\";\nimport { Cursor } from \"@hazae41/cursor\";\nimport { CloseEvents, ErrorEvents, SuperEventTarget } from \"@hazae41/plume\";\nimport { Console } from \"mods/console/index.js\";\nimport { RelayCell } from \"mods/tor/binary/cells/direct/relay/cell.js\";\nimport { RelayDataCell } from \"mods/tor/binary/cells/relayed/relay_data/cell.js\";\nimport { RelayEndCell } from \"mods/tor/binary/cells/relayed/relay_end/cell.js\";\nimport { SecretCircuit } from \"mods/tor/circuit.js\";\nimport { RelayConnectedCell } from \"./binary/cells/relayed/relay_connected/cell.js\";\nimport { RelayEndReason, RelayEndReasonOther } from \"./binary/cells/relayed/relay_end/reason.js\";\nimport { RelaySendmeStreamCell } from \"./binary/cells/relayed/relay_sendme/cell.js\";\n\nexport class TorStreamDuplex {\n\n  readonly #secret: SecretTorStreamDuplex\n\n  constructor(secret: SecretTorStreamDuplex) {\n    this.#secret = secret\n  }\n\n  [Symbol.dispose]() {\n    this.close()\n  }\n\n  get id() {\n    return this.#secret.id\n  }\n\n  get type() {\n    return this.#secret.type\n  }\n\n  get inner() {\n    return this.#secret.inner\n  }\n\n  get outer() {\n    return this.#secret.outer\n  }\n\n  error(reason?: unknown) {\n    this.#secret.error(reason)\n  }\n\n  close() {\n    this.#secret.close()\n  }\n\n}\n\nexport class RelayEndedError extends Error {\n  readonly #class = RelayEndedError\n  readonly name = this.#class.name\n\n  constructor(\n    readonly reason: RelayEndReason\n  ) {\n    super(`Relay ended`, { cause: reason })\n  }\n\n}\n\nexport type TorStreamEvents =\n  & CloseEvents\n  & ErrorEvents\n  & { connected: () => void }\n\nexport type SecretTorStreamDuplexType =\n  | \"external\"\n  | \"directory\"\n\nexport class SecretTorStreamDuplex {\n  readonly #class = SecretTorStreamDuplex\n\n  readonly duplex: FullDuplex<Opaque, Writable>\n\n  readonly events = new SuperEventTarget<TorStreamEvents>()\n\n  delivery = 500\n  package = 500\n\n  #onClean: () => void\n\n  constructor(\n    readonly type: SecretTorStreamDuplexType,\n    readonly id: number,\n    readonly circuit: SecretCircuit\n  ) {\n    this.duplex = new FullDuplex<Opaque, Writable>({\n      output: {\n        write: c => this.#onOutputWrite(c),\n      },\n      error: e => this.#onDuplexError(e),\n      close: () => this.#onDuplexClose()\n    })\n\n    const onCircuitClose = this.#onCircuitClose.bind(this)\n    const onCircuitError = this.#onCircuitError.bind(this)\n\n    const onRelayConnectedCell = this.#onRelayConnectedCell.bind(this)\n    const onRelayDataCell = this.#onRelayDataCell.bind(this)\n    const onRelayEndCell = this.#onRelayEndCell.bind(this)\n\n    this.circuit.events.on(\"close\", onCircuitClose, { passive: true })\n    this.circuit.events.on(\"error\", onCircuitError, { passive: true })\n\n    this.circuit.events.on(\"RELAY_CONNECTED\", onRelayConnectedCell, { passive: true })\n    this.circuit.events.on(\"RELAY_DATA\", onRelayDataCell, { passive: true })\n    this.circuit.events.on(\"RELAY_END\", onRelayEndCell, { passive: true })\n\n    this.#onClean = () => {\n      this.circuit.events.off(\"close\", onCircuitClose)\n      this.circuit.events.off(\"error\", onCircuitError)\n\n      this.circuit.events.off(\"RELAY_CONNECTED\", onRelayConnectedCell)\n      this.circuit.events.off(\"RELAY_DATA\", onRelayDataCell)\n      this.circuit.events.off(\"RELAY_END\", onRelayEndCell)\n\n      this.circuit.streams.delete(this.id)\n\n      this.#onClean = () => { }\n    }\n  }\n\n  [Symbol.dispose]() {\n    this.close()\n  }\n\n  get inner() {\n    return this.duplex.inner\n  }\n\n  get outer() {\n    return this.duplex.outer\n  }\n\n  get input() {\n    return this.duplex.input\n  }\n\n  get output() {\n    return this.duplex.output\n  }\n\n  get closed() {\n    return this.duplex.closed\n  }\n\n  close() {\n    this.duplex.close()\n  }\n\n  error(reason?: unknown) {\n    this.duplex.error(reason)\n  }\n\n  async #onDuplexClose() {\n    if (!this.circuit.closed) {\n      const relay_end_cell = new RelayEndCell(new RelayEndReasonOther(RelayEndCell.reasons.REASON_DONE))\n      const relay_cell = RelayCell.Streamful.from(this.circuit, this, relay_end_cell)\n      this.circuit.tor.output.enqueue(relay_cell.cellOrThrow())\n\n      this.package--\n    }\n\n    await this.events.emit(\"close\")\n\n    this.#onClean()\n  }\n\n  async #onDuplexError(reason?: unknown) {\n    if (!this.circuit.closed) {\n      const relay_end_cell = new RelayEndCell(new RelayEndReasonOther(RelayEndCell.reasons.REASON_MISC))\n      const relay_cell = RelayCell.Streamful.from(this.circuit, this, relay_end_cell)\n      this.circuit.tor.output.enqueue(relay_cell.cellOrThrow())\n\n      this.package--\n    }\n\n    await this.events.emit(\"error\", reason)\n\n    this.#onClean()\n  }\n\n  async #onCircuitClose() {\n    Console.debug(`${this.#class.name}.onCircuitClose`)\n\n    if (this.duplex.closing)\n      return\n\n    this.duplex.close()\n  }\n\n  async #onCircuitError(reason?: unknown) {\n    Console.debug(`${this.#class.name}.onCircuitError`, { reason })\n\n    if (this.duplex.closing)\n      return\n\n    this.duplex.error(reason)\n  }\n\n  async #onRelayConnectedCell(cell: RelayCell.Streamful<Opaque>) {\n    if (cell.stream !== this)\n      return\n\n    if (this.type === \"directory\") {\n      await this.events.emit(\"connected\")\n      return\n    }\n\n    if (this.type === \"external\") {\n      const cell2 = RelayCell.Streamful.intoOrThrow(cell, RelayConnectedCell)\n\n      Console.debug(`${this.#class.name}.onRelayConnectedCell`, cell2)\n\n      await this.events.emit(\"connected\")\n      return\n    }\n  }\n\n  async #onRelayDataCell(cell: RelayCell.Streamful<RelayDataCell<Opaque>>) {\n    if (cell.stream !== this)\n      return\n\n    Console.debug(`${this.#class.name}.onRelayDataCell`, cell)\n\n    this.delivery--\n\n    if (this.delivery === 450) {\n      this.delivery = 500\n\n      const sendme = new RelaySendmeStreamCell()\n      const sendme_cell = RelayCell.Streamful.from(this.circuit, this, sendme)\n      this.circuit.tor.output.enqueue(sendme_cell.cellOrThrow())\n    }\n\n    this.input.enqueue(cell.fragment.fragment)\n  }\n\n  async #onRelayEndCell(cell: RelayCell.Streamful<RelayEndCell>) {\n    if (cell.stream !== this)\n      return\n\n    Console.debug(`${this.#class.name}.onRelayEndCell`, cell)\n\n    if (this.duplex.closing)\n      return\n\n    if (cell.fragment.reason.id === RelayEndCell.reasons.REASON_DONE)\n      this.duplex.close()\n    else\n      this.duplex.error(new RelayEndedError(cell.fragment.reason))\n  }\n\n  async #onOutputWrite(writable: Writable) {\n    if (writable.sizeOrThrow() > RelayCell.DATA_LEN)\n      return await this.#onWriteChunked(writable)\n\n    return await this.#onWriteDirect(writable)\n  }\n\n  async #onWriteDirect(writable: Writable) {\n    const relay_data_cell = new RelayDataCell(writable)\n    const relay_cell = RelayCell.Streamful.from(this.circuit, this, relay_data_cell)\n\n    this.circuit.tor.output.enqueue(relay_cell.cellOrThrow())\n\n    this.package--\n  }\n\n  async #onWriteChunked(writable: Writable) {\n    const bytes = Writable.writeToBytesOrThrow(writable)\n    const cursor = new Cursor(bytes)\n\n    for (const chunk of cursor.splitOrThrow(RelayCell.DATA_LEN))\n      await this.#onWriteDirect(new Opaque(chunk))\n\n    return\n  }\n\n}"],"names":["SuperEventTarget","FullDuplex","RelayEndCell","RelayEndReasonOther","RelayCell","reason","Console","RelayConnectedCell","RelaySendmeStreamCell","cell","RelayDataCell","Writable","cursor","Cursor","Opaque"],"mappings":"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"}