@hazae41/kcp
Version:
Zero-copy KCP protocol for the web
1 lines • 6.07 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","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":["Opaque"],"mappings":";;;;MAca,UAAU,CAAA;AAaV,IAAA,YAAA;AAIA,IAAA,OAAA;AAIA,IAAA,KAAA;AAIA,IAAA,MAAA;AAIA,IAAA,SAAA;AAIA,IAAA,MAAA;AAIA,IAAA,WAAA;AAIA,IAAA,QAAA;AAIA,IAAA,YAAA;IA3CX,OAAgB,QAAQ,GAAG;AACzB,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,GAAG,EAAE,EAAE;AACP,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,IAAI,EAAE;KACE;AAEV,IAAA,WAAA;AACE;;AAEG;IACM,YAAoB;AAC7B;;AAEG;IACM,OAAe;AACxB;;AAEG;AACM,IAAA,KAAA,GAAQ,CAAC;AAClB;;AAEG;AACM,IAAA,MAAA,GAAS,KAAK;AACvB;;AAEG;IACM,SAAA,GAAY,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC;AACjD;;AAEG;IACM,MAAc;AACvB;;AAEG;IACM,WAAmB;AAC5B;;AAEG;IACM,QAAkB;AAC3B;;AAEG;IACM,YAAoB,EAAA;QAhCpB,IAAA,CAAA,YAAY,GAAZ,YAAY;QAIZ,IAAA,CAAA,OAAO,GAAP,OAAO;QAIP,IAAA,CAAA,KAAK,GAAL,KAAK;QAIL,IAAA,CAAA,MAAM,GAAN,MAAM;QAIN,IAAA,CAAA,SAAS,GAAT,SAAS;QAIT,IAAA,CAAA,MAAM,GAAN,MAAM;QAIN,IAAA,CAAA,WAAW,GAAX,WAAW;QAIX,IAAA,CAAA,QAAQ,GAAR,QAAQ;QAIR,IAAA,CAAA,YAAY,GAAZ,YAAY;IACnB;IAEJ,OAAO,KAAK,CAAC,MAA+B,EAAA;AAC1C,QAAA,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM;QACjG,OAAO,IAAI,UAAU,CAAQ,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjH;IAEA,OAAO,UAAU,CAA4B,MAAkC,EAAA;AAC7E,QAAA,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,MAAM;QACjG,OAAO,IAAI,UAAU,CAAW,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC;IACzI;IAEA,WAAW,GAAA;AACT,QAAA,OAAO;cACH;cACA;cACA;cACA;cACA;cACA;cACA;cACA;cACA,IAAI,CAAC,YAAY;IACvB;AAEA,IAAA,YAAY,CAAC,MAA2B,EAAA;QACtC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC;AAClD,QAAA,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;AACtC,QAAA,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;QACpC,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;QAC5C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC;QAC/C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;QAC5C,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC;QACjD,MAAM,CAAC,kBAAkB,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC;AAElD,QAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC;IACpC;IAEA,OAAO,WAAW,CAAC,MAA2B,EAAA;QAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;AACnD,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,EAAE;AACzC,QAAA,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,EAAE;QACvC,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAC7C,MAAM,SAAS,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAC7C,MAAM,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC;AAC7C,QAAA,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;AACxD,QAAA,MAAM,QAAQ,GAAG,IAAIA,aAAM,CAAC,KAAK,CAAC;QAElC,OAAO,UAAU,CAAC,UAAU,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IAClH;;;;;"}