@hazae41/kcp
Version:
Zero-copy KCP protocol for the web
1 lines • 6.28 kB
Source Map (JSON)
{"version":3,"file":"segment.cjs","sources":["../../../../src/mods/kcp/segment.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) {\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) {\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 = cursor.readAndCopyOrThrow(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":"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"}