UNPKG

@hazae41/kcp

Version:

Zero-copy KCP protocol for the web

1 lines 6.72 kB
{"version":3,"file":"index.mjs","sources":["../../../../../src/mods/kcp/reader/index.ts"],"sourcesContent":["import { Empty, Opaque, Readable } from \"@hazae41/binary\";\nimport { Cursor } from \"@hazae41/cursor\";\nimport { Console } from \"mods/console/index.js\";\nimport { KcpSegment } from \"../segment/index.js\";\nimport { SecretKcpDuplex } from \"../stream/index.js\";\n\nexport type KcpReadError =\n | ExpectedKcpSegmentError\n | UnknownKcpCommandError\n\nexport class ExpectedKcpSegmentError extends Error {\n readonly #class = ExpectedKcpSegmentError\n readonly name = this.#class.name\n\n constructor() {\n super(`Expected a KCP segment`)\n }\n\n}\n\nexport class UnknownKcpCommandError extends Error {\n readonly #class = UnknownKcpCommandError\n readonly name = this.#class.name\n\n constructor() {\n super(`Unknown KCP command`)\n }\n\n}\n\nexport type SecretKcpReaderEvents = {\n ack: (segment: KcpSegment<Opaque>) => void\n}\n\nexport class SecretKcpReader {\n\n readonly #buffer = new Map<number, KcpSegment<Opaque>>()\n\n constructor(\n readonly parent: SecretKcpDuplex\n ) { }\n\n async onWrite(chunk: Opaque) {\n const cursor = new Cursor(chunk.bytes)\n\n while (cursor.remaining)\n await this.#onSegment(Readable.readOrRollbackAndThrow(KcpSegment, cursor))\n\n return\n }\n\n async #onSegment(segment: KcpSegment<Opaque>) {\n if (segment.conversation !== this.parent.conversation)\n return\n\n if (segment.command === KcpSegment.commands.push)\n return await this.#onPushSegment(segment)\n if (segment.command === KcpSegment.commands.ack)\n return await this.#onAckSegment(segment)\n if (segment.command === KcpSegment.commands.wask)\n return await this.#onWaskSegment(segment)\n\n throw new UnknownKcpCommandError()\n }\n\n async #onPushSegment(segment: KcpSegment<Opaque>) {\n const conversation = this.parent.conversation\n const command = KcpSegment.commands.ack\n const timestamp = segment.timestamp\n const serial = segment.serial\n const unackSerial = this.parent.recvCounter\n const fragment = new Empty()\n\n const ack = KcpSegment.empty({ conversation, command, timestamp, serial, unackSerial, fragment })\n\n this.parent.output.enqueue(ack)\n\n if (segment.serial < this.parent.recvCounter) {\n Console.debug(`Received previous KCP segment`)\n return\n }\n\n if (segment.serial > this.parent.recvCounter) {\n Console.debug(`Received next KCP segment`)\n this.#buffer.set(segment.serial, segment)\n return\n }\n\n this.parent.input.enqueue(segment.fragment)\n\n this.parent.recvCounter++\n\n let next: KcpSegment<Opaque> | undefined\n\n while (next = this.#buffer.get(this.parent.recvCounter)) {\n Console.debug(`Unblocked next KCP segment`)\n\n this.parent.input.enqueue(next.fragment)\n this.#buffer.delete(this.parent.recvCounter)\n\n this.parent.recvCounter++\n }\n }\n\n async #onAckSegment(segment: KcpSegment<Opaque>) {\n const future = this.parent.resolveOnAckBySerial.get(segment.serial)\n\n if (future == null)\n return\n this.parent.resolveOnAckBySerial.delete(segment.serial)\n\n future.resolve()\n }\n\n async #onWaskSegment(segment: KcpSegment<Opaque>) {\n const conversation = this.parent.conversation\n const command = KcpSegment.commands.wins\n const serial = 0\n const unackSerial = this.parent.recvCounter\n const fragment = new Empty()\n\n const wins = KcpSegment.empty({ conversation, command, serial, unackSerial, fragment })\n\n this.parent.output.enqueue(wins)\n }\n\n}"],"names":[],"mappings":";;;;;AAUM,MAAO,uBAAwB,SAAQ,KAAK,CAAA;IACvC,MAAM,GAAG,uBAAuB;AAChC,IAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI;AAEhC,IAAA,WAAA,GAAA;QACE,KAAK,CAAC,CAAA,sBAAA,CAAwB,CAAC;IACjC;AAED;AAEK,MAAO,sBAAuB,SAAQ,KAAK,CAAA;IACtC,MAAM,GAAG,sBAAsB;AAC/B,IAAA,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI;AAEhC,IAAA,WAAA,GAAA;QACE,KAAK,CAAC,CAAA,mBAAA,CAAqB,CAAC;IAC9B;AAED;MAMY,eAAe,CAAA;AAKf,IAAA,MAAA;AAHF,IAAA,OAAO,GAAG,IAAI,GAAG,EAA8B;AAExD,IAAA,WAAA,CACW,MAAuB,EAAA;QAAvB,IAAA,CAAA,MAAM,GAAN,MAAM;IACb;IAEJ,MAAM,OAAO,CAAC,KAAa,EAAA;QACzB,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;QAEtC,OAAO,MAAM,CAAC,SAAS;AACrB,YAAA,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QAE5E;IACF;IAEA,MAAM,UAAU,CAAC,OAA2B,EAAA;QAC1C,IAAI,OAAO,CAAC,YAAY,KAAK,IAAI,CAAC,MAAM,CAAC,YAAY;YACnD;QAEF,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,CAAC,QAAQ,CAAC,IAAI;AAC9C,YAAA,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;QAC3C,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,CAAC,QAAQ,CAAC,GAAG;AAC7C,YAAA,OAAO,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC;QAC1C,IAAI,OAAO,CAAC,OAAO,KAAK,UAAU,CAAC,QAAQ,CAAC,IAAI;AAC9C,YAAA,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;QAE3C,MAAM,IAAI,sBAAsB,EAAE;IACpC;IAEA,MAAM,cAAc,CAAC,OAA2B,EAAA;AAC9C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY;AAC7C,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG;AACvC,QAAA,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS;AACnC,QAAA,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM;AAC7B,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW;AAC3C,QAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAE;QAE5B,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;QAEjG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;QAE/B,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AAC5C,YAAA,OAAO,CAAC,KAAK,CAAC,CAAA,6BAAA,CAA+B,CAAC;YAC9C;QACF;QAEA,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AAC5C,YAAA,OAAO,CAAC,KAAK,CAAC,CAAA,yBAAA,CAA2B,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC;YACzC;QACF;QAEA,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;AAE3C,QAAA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;AAEzB,QAAA,IAAI,IAAoC;AAExC,QAAA,OAAO,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE;AACvD,YAAA,OAAO,CAAC,KAAK,CAAC,CAAA,0BAAA,CAA4B,CAAC;YAE3C,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;YACxC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;AAE5C,YAAA,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE;QAC3B;IACF;IAEA,MAAM,aAAa,CAAC,OAA2B,EAAA;AAC7C,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC;QAEnE,IAAI,MAAM,IAAI,IAAI;YAChB;QACF,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QAEvD,MAAM,CAAC,OAAO,EAAE;IAClB;IAEA,MAAM,cAAc,CAAC,OAA2B,EAAA;AAC9C,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY;AAC7C,QAAA,MAAM,OAAO,GAAG,UAAU,CAAC,QAAQ,CAAC,IAAI;QACxC,MAAM,MAAM,GAAG,CAAC;AAChB,QAAA,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW;AAC3C,QAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,EAAE;AAE5B,QAAA,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;QAEvF,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;IAClC;AAED;;;;"}