{"version":3,"file":"frame.cjs","sources":["../../../../../../src/mods/snowflake/turbo/frame.ts"],"sourcesContent":["import { Opaque, Writable } from \"@hazae41/binary\";\nimport { Bitset } from \"@hazae41/bitset\";\nimport { Cursor } from \"@hazae41/cursor\";\n\nexport type TurboFrameError =\n  | UnexpectedContinuationError\n  | FragmentOverflowError\n\nexport class FragmentOverflowError extends Error {\n  readonly #class = FragmentOverflowError\n  readonly name = this.#class.name\n\n  constructor() {\n    super(`Fragment size is greater than or equals to 2**20`)\n  }\n\n}\n\nexport class UnexpectedContinuationError extends Error {\n  readonly #class = UnexpectedContinuationError\n  readonly name = this.#class.name\n\n  constructor() {\n    super(`Unexpected continuation bit on third byte`)\n  }\n\n}\n\nexport interface TurboFrameParams<T extends Writable> {\n  readonly padding: boolean,\n  readonly fragment: T\n}\n\nexport class TurboFrame<T extends Writable> {\n\n  private constructor(\n    readonly padding: boolean,\n    readonly fragment: T,\n    readonly fragmentSize: number\n  ) { }\n\n  static createOrThrow<T extends Writable>(params: TurboFrameParams<T>): TurboFrame<T> {\n    const { padding, fragment } = params\n\n    const fragmentSize = fragment.sizeOrThrow()\n\n    if (fragmentSize >= (2 ** 20))\n      throw new FragmentOverflowError()\n\n    return new TurboFrame(padding, fragment, fragmentSize)\n  }\n\n  sizeOrThrow() {\n    if (this.fragmentSize < (2 ** 6))\n      return 1 + this.fragmentSize\n    if (this.fragmentSize < (2 ** 13))\n      return 2 + this.fragmentSize\n    if (this.fragmentSize < (2 ** 20))\n      return 3 + this.fragmentSize\n\n    throw new FragmentOverflowError()\n  }\n\n  writeOrThrow(cursor: Cursor) {\n    if (this.fragmentSize < (2 ** 6))\n      return this.writeOrThrow6(cursor, this.fragmentSize)\n    if (this.fragmentSize < (2 ** 13))\n      return this.writeOrThrow13(cursor, this.fragmentSize)\n    if (this.fragmentSize < (2 ** 20))\n      return this.writeOrThrow20(cursor, this.fragmentSize)\n\n    throw new FragmentOverflowError()\n  }\n\n  writeOrThrow6(cursor: Cursor, size: number) {\n    const first = new Bitset(size, 8)\n    first.setBE(0, !this.padding)\n    first.setBE(1, false)\n    first.unsign()\n\n    cursor.writeUint8OrThrow(first.value)\n    this.fragment.writeOrThrow(cursor)\n  }\n\n  writeOrThrow13(cursor: Cursor, size: number) {\n    let bits = \"\"\n    bits += this.padding ? \"0\" : \"1\"\n    bits += \"1\"\n\n    const length = size.toString(2).padStart(13, \"0\")\n\n    bits += length.slice(0, 6)\n    bits += \"0\"\n    bits += length.slice(6, 13)\n\n    cursor.writeUint16OrThrow(parseInt(bits, 2))\n    this.fragment.writeOrThrow(cursor)\n  }\n\n  writeOrThrow20(cursor: Cursor, size: number) {\n    let bits = \"\"\n    bits += this.padding ? \"0\" : \"1\"\n    bits += \"1\"\n\n    const length = size.toString(2).padStart(20, \"0\")\n\n    bits += length.slice(0, 6)\n    bits += \"1\"\n    bits += length.slice(6, 13)\n    bits += \"0\"\n    bits += length.slice(13, 20)\n\n    cursor.writeUint24OrThrow(parseInt(bits, 2))\n    this.fragment.writeOrThrow(cursor)\n  }\n\n  /**\n   * Read from bytes\n   * @param binary bytes\n   */\n  static readOrThrow(cursor: Cursor) {\n    let lengthBits = \"\"\n\n    const first = cursor.readUint8OrThrow()\n    const bits = new Bitset(first, 8)\n\n    const padding = !bits.getBE(0)\n    const continuation = bits.getBE(1)\n\n    lengthBits += bits.last(6).toString()\n\n    if (continuation) {\n      const second = cursor.readUint8OrThrow()\n      const bits2 = new Bitset(second, 8)\n      const continuation2 = bits2.getBE(0)\n\n      lengthBits += bits2.last(7).toString()\n\n      if (continuation2) {\n        const third = cursor.readUint8OrThrow()\n        const bits3 = new Bitset(third, 8)\n        const continuation3 = bits3.getBE(0)\n\n        lengthBits += bits3.last(7).toString()\n\n        if (continuation3)\n          throw new UnexpectedContinuationError()\n      }\n    }\n\n    const length = parseInt(lengthBits, 2)\n    const bytes = cursor.readAndCopyOrThrow(length)\n    const fragment = new Opaque(bytes)\n\n    return TurboFrame.createOrThrow({ padding, fragment })\n  }\n\n}"],"names":["Bitset","Opaque"],"mappings":"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"}