UNPKG

@hazae41/kcp

Version:

Zero-copy KCP protocol for the web

1 lines 6.2 kB
{"version":3,"file":"stream.cjs","sources":["../../../../src/mods/kcp/stream.ts"],"sourcesContent":["import { Opaque, Writable } from \"@hazae41/binary\";\nimport { Bytes } from \"@hazae41/bytes\";\nimport { FullDuplex } from \"@hazae41/cascade\";\nimport { Cursor } from \"@hazae41/cursor\";\nimport { Future } from \"@hazae41/future\";\nimport { Awaitable } from \"libs/promises/index.js\";\nimport { SecretKcpReader } from \"./reader.js\";\nimport { SecretKcpWriter } from \"./writer.js\";\n\nexport interface KcpDuplexParams {\n /**\n * Conversation ID (Uint32) (random if undefined)\n */\n readonly conversation?: number\n\n readonly lowDelay?: number\n readonly highDelay?: number\n\n close?(this: undefined): Awaitable<void>\n error?(this: undefined, reason?: unknown): Awaitable<void>\n}\n\nexport class KcpDuplex {\n\n readonly #secret: SecretKcpDuplex\n\n constructor(\n readonly params: KcpDuplexParams = {}\n ) {\n this.#secret = new SecretKcpDuplex(params)\n }\n\n [Symbol.dispose]() {\n this.close()\n }\n\n get conversation() {\n return this.#secret.conversation\n }\n\n get inner() {\n return this.#secret.inner\n }\n\n get outer() {\n return this.#secret.outer\n }\n\n get closing() {\n return this.#secret.closing\n }\n\n get closed() {\n return this.#secret.closed\n }\n\n error(reason?: unknown) {\n this.#secret.error(reason)\n }\n\n close() {\n this.#secret.close()\n }\n\n}\n\nexport class SecretKcpDuplex {\n\n readonly duplex: FullDuplex<Opaque, Writable>\n\n readonly reader: SecretKcpReader\n readonly writer: SecretKcpWriter\n\n readonly conversation: number\n\n readonly resolveOnClose = new Future<void>()\n readonly resolveOnError = new Future<unknown>()\n\n readonly resolveOnAckBySerial = new Map<number, Future<void>>()\n\n sendCounter = 0\n recvCounter = 0\n\n constructor(\n readonly params: KcpDuplexParams = {}\n ) {\n const {\n conversation = new Cursor(Bytes.random(4)).readUint32OrThrow(true)\n } = this.params\n\n this.conversation = conversation\n\n this.reader = new SecretKcpReader(this)\n this.writer = new SecretKcpWriter(this)\n\n this.duplex = new FullDuplex<Opaque, Writable>({\n input: {\n write: m => this.reader.onWrite(m)\n },\n output: {\n write: m => this.writer.onWrite(m)\n },\n close: () => this.#onDuplexClose(),\n error: e => this.#onDuplexError(e)\n })\n }\n\n [Symbol.dispose]() {\n this.close()\n }\n\n get inner() {\n return this.duplex.inner\n }\n\n get outer() {\n return this.duplex.outer\n }\n\n get input() {\n return this.duplex.input\n }\n\n get output() {\n return this.duplex.output\n }\n\n get closing() {\n return this.duplex.closing\n }\n\n get closed() {\n return this.duplex.closed\n }\n\n async #onDuplexClose() {\n this.resolveOnClose.resolve()\n await this.params.close?.call(undefined)\n }\n\n async #onDuplexError(cause?: unknown) {\n this.resolveOnError.resolve(cause)\n await this.params.error?.call(undefined, cause)\n }\n\n error(reason?: unknown) {\n this.duplex.error(reason)\n }\n\n close() {\n this.duplex.close()\n }\n\n}"],"names":["Future","Cursor","Bytes","SecretKcpReader","SecretKcpWriter","FullDuplex"],"mappings":"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"}