{"version":3,"file":"cell.cjs","sources":["../../../../../../../src/mods/tor/binary/cells/cell.ts"],"sourcesContent":["import { Opaque, Readable, Writable } from \"@hazae41/binary\";\nimport { Cursor } from \"@hazae41/cursor\";\nimport { SecretCircuit } from \"mods/tor/circuit.js\";\nimport { SecretTorClientDuplex } from \"mods/tor/client.js\";\nimport { ExpectedCircuitError, InvalidCommandError, UnexpectedCircuitError } from \"./errors.js\";\n\nexport interface Cellable {\n  readonly old: false\n  readonly circuit: boolean,\n  readonly command: number\n}\n\nexport namespace Cellable {\n\n  export interface Circuitful {\n    readonly old: false\n    readonly circuit: true,\n    readonly command: number\n  }\n\n  export interface Circuitless {\n    readonly old: false\n    readonly circuit: false,\n    readonly command: number\n  }\n\n}\n\nexport type Cell<T extends Writable> =\n  | Cell.Circuitful<T>\n  | Cell.Circuitless<T>\n\nexport namespace Cell {\n\n  export type PAYLOAD_LEN = 509\n  export const PAYLOAD_LEN = 509\n\n  export class Raw<T extends Writable> {\n\n    constructor(\n      readonly circuit: number,\n      readonly command: number,\n      readonly fragment: T\n    ) { }\n\n    unpackOrNull(tor: SecretTorClientDuplex) {\n      if (this.circuit === 0)\n        return new Circuitless(undefined, this.command, this.fragment)\n\n      const circuit = tor.circuits.inner.get(this.circuit)\n\n      if (circuit == null)\n        return undefined\n\n      return new Circuitful(circuit, this.command, this.fragment)\n    }\n\n    sizeOrThrow() {\n      return this.command >= 128\n        ? 4 + 1 + 2 + this.fragment.sizeOrThrow()\n        : 4 + 1 + PAYLOAD_LEN\n    }\n\n    writeOrThrow(cursor: Cursor) {\n      if (this.command >= 128) {\n        cursor.writeUint32OrThrow(this.circuit)\n        cursor.writeUint8OrThrow(this.command)\n\n        const size = this.fragment.sizeOrThrow()\n        cursor.writeUint16OrThrow(size)\n\n        this.fragment.writeOrThrow(cursor)\n\n        return\n      }\n\n      cursor.writeUint32OrThrow(this.circuit)\n      cursor.writeUint8OrThrow(this.command)\n\n      const payload = cursor.readOrThrow(PAYLOAD_LEN)\n      const subcursor = new Cursor(payload)\n\n      this.fragment.writeOrThrow(subcursor)\n\n      subcursor.fillOrThrow(0, subcursor.remaining)\n    }\n\n    static readOrThrow(cursor: Cursor) {\n      const circuit = cursor.readUint32OrThrow()\n      const command = cursor.readUint8OrThrow()\n\n      if (command >= 128) {\n        const length = cursor.readUint16OrThrow()\n        const bytes = cursor.readAndCopyOrThrow(length)\n        const payload = new Opaque(bytes)\n\n        return new Raw<Opaque>(circuit, command, payload)\n      }\n\n      const bytes = cursor.readAndCopyOrThrow(PAYLOAD_LEN)\n      const payload = new Opaque(bytes)\n\n      return new Raw<Opaque>(circuit, command, payload)\n    }\n\n  }\n\n  export class Circuitful<T extends Writable> {\n    readonly #raw: Raw<T>\n\n    constructor(\n      readonly circuit: SecretCircuit,\n      readonly command: number,\n      readonly fragment: T\n    ) {\n      this.#raw = new Raw<T>(circuit.id, command, fragment)\n    }\n\n    static from<T extends Cellable.Circuitful & Writable>(circuit: SecretCircuit, cellable: T) {\n      return new Circuitful(circuit, cellable.command, cellable)\n    }\n\n    sizeOrThrow() {\n      return this.#raw.sizeOrThrow()\n    }\n\n    writeOrThrow(cursor: Cursor) {\n      this.#raw.writeOrThrow(cursor)\n    }\n\n    static intoOrThrow<T extends Writable>(cell: Cell<Opaque>, readable: Cellable.Circuitful & Readable<T>) {\n      if (cell.command !== readable.command)\n        throw new InvalidCommandError()\n      if (cell.circuit == null)\n        throw new ExpectedCircuitError()\n\n      const fragment = cell.fragment.readIntoOrThrow(readable)\n\n      return new Circuitful(cell.circuit, readable.command, fragment)\n    }\n\n  }\n\n  export class Circuitless<T extends Writable> {\n    readonly #raw: Raw<T>\n\n    constructor(\n      readonly circuit: undefined,\n      readonly command: number,\n      readonly fragment: T\n    ) {\n      this.#raw = new Raw<T>(0, command, fragment)\n    }\n\n    static from<T extends Cellable.Circuitless & Writable>(circuit: undefined, cellable: T) {\n      return new Circuitless(circuit, cellable.command, cellable)\n    }\n\n    sizeOrThrow() {\n      return this.#raw.sizeOrThrow()\n    }\n\n    writeOrThrow(cursor: Cursor) {\n      this.#raw.writeOrThrow(cursor)\n    }\n\n    static intoOrThrow<T extends Writable>(cell: Cell<Opaque>, readable: Cellable.Circuitless & Readable<T>) {\n      if (cell.command !== readable.command)\n        throw new InvalidCommandError()\n      if (cell.circuit != null)\n        throw new UnexpectedCircuitError()\n\n      const fragment = cell.fragment.readIntoOrThrow(readable)\n\n      return new Circuitless(cell.circuit, readable.command, fragment)\n    }\n\n  }\n\n}"],"names":["Cell","cursor","Cursor","Opaque","InvalidCommandError","ExpectedCircuitError","UnexpectedCircuitError"],"mappings":";;;;;;AAgCiBA,sBAmJhB;AAnJD,CAAA,UAAiB,IAAI,EAAA;IAGN,IAAW,CAAA,WAAA,GAAG,GAAG,CAAA;AAE9B,IAAA,MAAa,GAAG,CAAA;AAGH,QAAA,OAAA,CAAA;AACA,QAAA,OAAA,CAAA;AACA,QAAA,QAAA,CAAA;AAHX,QAAA,WAAA,CACW,OAAe,EACf,OAAe,EACf,QAAW,EAAA;YAFX,IAAO,CAAA,OAAA,GAAP,OAAO,CAAQ;YACf,IAAO,CAAA,OAAA,GAAP,OAAO,CAAQ;YACf,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAG;SACjB;AAEL,QAAA,YAAY,CAAC,GAA0B,EAAA;AACrC,YAAA,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC;AACpB,gBAAA,OAAO,IAAI,WAAW,CAAC,SAAS,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;AAEhE,YAAA,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAEpD,IAAI,OAAO,IAAI,IAAI;AACjB,gBAAA,OAAO,SAAS,CAAA;AAElB,YAAA,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;SAC5D;QAED,WAAW,GAAA;AACT,YAAA,OAAO,IAAI,CAAC,OAAO,IAAI,GAAG;AACxB,kBAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;AACzC,kBAAE,CAAC,GAAG,CAAC,GAAG,IAAA,CAAA,WAAW,CAAA;SACxB;AAED,QAAA,YAAY,CAACC,QAAc,EAAA;AACzB,YAAA,IAAI,IAAI,CAAC,OAAO,IAAI,GAAG,EAAE;AACvB,gBAAAA,QAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACvC,gBAAAA,QAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAEtC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAA;AACxC,gBAAAA,QAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;AAE/B,gBAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAACA,QAAM,CAAC,CAAA;gBAElC,OAAM;aACP;AAED,YAAAA,QAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACvC,YAAAA,QAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YAEtC,MAAM,OAAO,GAAGA,QAAM,CAAC,WAAW,CAAC,IAAA,CAAA,WAAW,CAAC,CAAA;AAC/C,YAAA,MAAM,SAAS,GAAG,IAAIC,aAAM,CAAC,OAAO,CAAC,CAAA;AAErC,YAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAA;YAErC,SAAS,CAAC,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAA;SAC9C;QAED,OAAO,WAAW,CAAC,MAAc,EAAA;AAC/B,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAA;AAC1C,YAAA,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,EAAE,CAAA;AAEzC,YAAA,IAAI,OAAO,IAAI,GAAG,EAAE;AAClB,gBAAA,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAA;gBACzC,MAAM,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAA;AAC/C,gBAAA,MAAM,OAAO,GAAG,IAAIC,aAAM,CAAC,KAAK,CAAC,CAAA;gBAEjC,OAAO,IAAI,GAAG,CAAS,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;aAClD;YAED,MAAM,KAAK,GAAG,MAAM,CAAC,kBAAkB,CAAC,IAAA,CAAA,WAAW,CAAC,CAAA;AACpD,YAAA,MAAM,OAAO,GAAG,IAAIA,aAAM,CAAC,KAAK,CAAC,CAAA;YAEjC,OAAO,IAAI,GAAG,CAAS,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAA;SAClD;AAEF,KAAA;AApEY,IAAA,IAAA,CAAA,GAAG,MAoEf,CAAA;AAED,IAAA,MAAa,UAAU,CAAA;AAIV,QAAA,OAAA,CAAA;AACA,QAAA,OAAA,CAAA;AACA,QAAA,QAAA,CAAA;AALF,QAAA,IAAI,CAAQ;AAErB,QAAA,WAAA,CACW,OAAsB,EACtB,OAAe,EACf,QAAW,EAAA;YAFX,IAAO,CAAA,OAAA,GAAP,OAAO,CAAe;YACtB,IAAO,CAAA,OAAA,GAAP,OAAO,CAAQ;YACf,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAG;AAEpB,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAI,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;SACtD;AAED,QAAA,OAAO,IAAI,CAA2C,OAAsB,EAAE,QAAW,EAAA;YACvF,OAAO,IAAI,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;SAC3D;QAED,WAAW,GAAA;AACT,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;SAC/B;AAED,QAAA,YAAY,CAAC,MAAc,EAAA;AACzB,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;SAC/B;AAED,QAAA,OAAO,WAAW,CAAqB,IAAkB,EAAE,QAA2C,EAAA;AACpG,YAAA,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;gBACnC,MAAM,IAAIC,0BAAmB,EAAE,CAAA;AACjC,YAAA,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI;gBACtB,MAAM,IAAIC,2BAAoB,EAAE,CAAA;YAElC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;AAExD,YAAA,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;SAChE;AAEF,KAAA;AAlCY,IAAA,IAAA,CAAA,UAAU,aAkCtB,CAAA;AAED,IAAA,MAAa,WAAW,CAAA;AAIX,QAAA,OAAA,CAAA;AACA,QAAA,OAAA,CAAA;AACA,QAAA,QAAA,CAAA;AALF,QAAA,IAAI,CAAQ;AAErB,QAAA,WAAA,CACW,OAAkB,EAClB,OAAe,EACf,QAAW,EAAA;YAFX,IAAO,CAAA,OAAA,GAAP,OAAO,CAAW;YAClB,IAAO,CAAA,OAAA,GAAP,OAAO,CAAQ;YACf,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAG;AAEpB,YAAA,IAAI,CAAC,IAAI,GAAG,IAAI,GAAG,CAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAA;SAC7C;AAED,QAAA,OAAO,IAAI,CAA4C,OAAkB,EAAE,QAAW,EAAA;YACpF,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;SAC5D;QAED,WAAW,GAAA;AACT,YAAA,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;SAC/B;AAED,QAAA,YAAY,CAAC,MAAc,EAAA;AACzB,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;SAC/B;AAED,QAAA,OAAO,WAAW,CAAqB,IAAkB,EAAE,QAA4C,EAAA;AACrG,YAAA,IAAI,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO;gBACnC,MAAM,IAAID,0BAAmB,EAAE,CAAA;AACjC,YAAA,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI;gBACtB,MAAM,IAAIE,6BAAsB,EAAE,CAAA;YAEpC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAA;AAExD,YAAA,OAAO,IAAI,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;SACjE;AAEF,KAAA;AAlCY,IAAA,IAAA,CAAA,WAAW,cAkCvB,CAAA;AAEH,CAAC,EAnJgBN,YAAI,KAAJA,YAAI,GAmJpB,EAAA,CAAA,CAAA;;"}