{"version":3,"file":"index.mjs","sources":["../../../../../src/mods/kcp/segment/index.ts"],"sourcesContent":["import { Empty, Opaque, Writable } from \"@hazae41/binary\";\nimport { Cursor } from \"@hazae41/cursor\";\n\nexport interface KcpSegmentParams<Fragment extends Writable> {\n  readonly conversation: number,\n  readonly command: number,\n  readonly count?: number,\n  readonly window?: number,\n  readonly timestamp?: number,\n  readonly serial: number,\n  readonly unackSerial: number,\n  readonly fragment: Fragment\n}\n\nexport class KcpSegment<Fragment extends Writable> {\n\n  static readonly commands = {\n    push: 81,\n    ack: 82,\n    wask: 83,\n    wins: 84\n  } as const\n\n  private constructor(\n    /**\n     * conv\n     */\n    readonly conversation: number,\n    /**\n     * cmd\n     */\n    readonly command: number,\n    /**\n     * frg\n     */\n    readonly count = 0,\n    /**\n     * wnd\n     */\n    readonly window = 65535,\n    /**\n     * ts\n     */\n    readonly timestamp = Math.ceil(Date.now() / 1000),\n    /**\n     * sn\n     */\n    readonly serial: number,\n    /**\n     * una\n     */\n    readonly unackSerial: number,\n    /**\n     * data\n     */\n    readonly fragment: Fragment,\n    /**\n     * data size\n     */\n    readonly fragmentSize: number\n  ) { }\n\n  static empty(params: KcpSegmentParams<Empty>) {\n    const { conversation, command, count, window, timestamp, serial, unackSerial, fragment } = params\n    return new KcpSegment<Empty>(conversation, command, count, window, timestamp, serial, unackSerial, fragment, 0)\n  }\n\n  static newOrThrow<Fragment extends Writable>(params: KcpSegmentParams<Fragment>) {\n    const { conversation, command, count, window, timestamp, serial, unackSerial, fragment } = params\n    return new KcpSegment<Fragment>(conversation, command, count, window, timestamp, serial, unackSerial, fragment, fragment.sizeOrThrow())\n  }\n\n  sizeOrThrow() {\n    return 0\n      + 4\n      + 1\n      + 1\n      + 2\n      + 4\n      + 4\n      + 4\n      + 4\n      + this.fragmentSize\n  }\n\n  writeOrThrow(cursor: Cursor<ArrayBuffer>) {\n    cursor.writeUint32OrThrow(this.conversation, true)\n    cursor.writeUint8OrThrow(this.command)\n    cursor.writeUint8OrThrow(this.count)\n    cursor.writeUint16OrThrow(this.window, true)\n    cursor.writeUint32OrThrow(this.timestamp, true)\n    cursor.writeUint32OrThrow(this.serial, true)\n    cursor.writeUint32OrThrow(this.unackSerial, true)\n    cursor.writeUint32OrThrow(this.fragmentSize, true)\n\n    this.fragment.writeOrThrow(cursor)\n  }\n\n  static readOrThrow(cursor: Cursor<ArrayBuffer>) {\n    const conversation = cursor.readUint32OrThrow(true)\n    const command = cursor.readUint8OrThrow()\n    const count = cursor.readUint8OrThrow()\n    const window = cursor.readUint16OrThrow(true)\n    const timestamp = cursor.readUint32OrThrow(true)\n    const serial = cursor.readUint32OrThrow(true)\n    const unackSerial = cursor.readUint32OrThrow(true)\n    const length = cursor.readUint32OrThrow(true)\n    const bytes = new Uint8Array(cursor.readOrThrow(length))\n    const fragment = new Opaque(bytes)\n\n    return KcpSegment.newOrThrow({ conversation, command, count, window, timestamp, serial, unackSerial, fragment })\n  }\n\n}"],"names":[],"mappings":"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"}