@nmtjs/protocol 0.7.2 → 0.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"mappings":";;;;;AASA,OAAO,MAAM,aAMX;CACA,OAAO,KAAKA,IAAkBC,OAAe;AAC3C,SAAO,IAAI,QAAQ,CAAC,YAAY,GAAG,KAAK,OAAO,QAAQ;CACxD;CAED,UAAU,IAAI;CACd,aAAa,IAAI;CAEjB,GACEC,OACAC,UACAC,SACA;EACA,MAAM,UAAU,CAAC,UAAU,SAAS,GAAG,MAAM,OAAO;AACpD,OAAKC,WAAW,IAAI,UAAU,QAAQ;AACtC,OAAKC,QAAQ,iBAAiB,OAAO,SAAS,QAAQ;AACtD,SAAO,MAAM,KAAKA,QAAQ,oBAAoB,OAAO,QAAQ;CAC9D;CAED,KACEJ,OACAC,UACAC,SACA;AACA,SAAO,KAAK,GAAG,OAAO,UAAU;GAAE,GAAG;GAAS,MAAM;EAAM,EAAC;CAC5D;CAED,IAAIG,OAAuCC,UAAoB;EAC7D,MAAM,UAAU,KAAKH,WAAW,IAAI,SAAS;AAC7C,MAAI,QAAS,MAAKC,QAAQ,oBAAoB,OAAO,QAAQ;CAC9D;CAED,KACEG,OACA,GAAG,MACH;AACA,SAAO,KAAKH,QAAQ,cAAc,IAAI,YAAY,OAAO,EAAE,QAAQ,KAAM,GAAE;CAC5E;AACF","names":["ee: EventEmitter","event: string","event: E | (Object & string)","listener: (...args: Events[E]) => void","options?: AddEventListenerOptions","#listeners","#target","event: EventNames | (Object & string)","listener: Callback","event: E"],"sources":["src/client/events.ts"],"sourcesContent":["import type { Callback } from '@nmtjs/common'\n\nexport type EventMap = { [K: string]: any[] }\n\n/**\n * Very simple node-like event emitter wrapper around EventTarget\n *\n * @todo add errors and promise rejections handling\n */\nexport class EventEmitter<\n Events extends EventMap = EventMap,\n EventNames extends Extract<keyof Events, string> = Extract<\n keyof Events,\n string\n >,\n> {\n static once(ee: EventEmitter, event: string) {\n return new Promise((resolve) => ee.once(event, resolve))\n }\n\n #target = new EventTarget()\n #listeners = new Map<Callback, Callback>()\n\n on<E extends EventNames>(\n event: E | (Object & string),\n listener: (...args: Events[E]) => void,\n options?: AddEventListenerOptions,\n ) {\n const wrapper = (event) => listener(...event.detail)\n this.#listeners.set(listener, wrapper)\n this.#target.addEventListener(event, wrapper, options)\n return () => this.#target.removeEventListener(event, wrapper)\n }\n\n once<E extends EventNames>(\n event: E | (Object & string),\n listener: (...args: Events[E]) => void,\n options?: AddEventListenerOptions,\n ) {\n return this.on(event, listener, { ...options, once: true })\n }\n\n off(event: EventNames | (Object & string), listener: Callback) {\n const wrapper = this.#listeners.get(listener)\n if (wrapper) this.#target.removeEventListener(event, wrapper)\n }\n\n emit<E extends EventNames | (Object & string)>(\n event: E,\n ...args: E extends EventEmitter ? Events[E] : any[]\n ) {\n return this.#target.dispatchEvent(new CustomEvent(event, { detail: args }))\n }\n}\n"],"version":3}
1
+ {"mappings":";;;;;AASA,OAAO,MAAM,aAMX;CACA,OAAO,KAGLA,IAAOC,OAAU;AACjB,SAAO,IAAI,QAAQ,CAAC,YAAY,GAAG,KAAK,OAAO,QAAQ;CACxD;CAED,UAAU,IAAI;CACd,aAAa,IAAI;CAEjB,GACEC,OACAC,UACAC,SACA;EACA,MAAM,UAAU,CAAC,UAAU,SAAS,GAAG,MAAM,OAAO;AACpD,OAAKC,WAAW,IAAI,UAAU,QAAQ;AACtC,OAAKC,QAAQ,iBAAiB,OAAO,SAAS,QAAQ;AACtD,SAAO,MAAM,KAAKA,QAAQ,oBAAoB,OAAO,QAAQ;CAC9D;CAED,KACEJ,OACAC,UACAC,SACA;AACA,SAAO,KAAK,GAAG,OAAO,UAAU;GAAE,GAAG;GAAS,MAAM;EAAM,EAAC;CAC5D;CAED,IAAIG,OAAuCC,UAAoB;EAC7D,MAAM,UAAU,KAAKH,WAAW,IAAI,SAAS;AAC7C,MAAI,QAAS,MAAKC,QAAQ,oBAAoB,OAAO,QAAQ;CAC9D;CAED,KACEL,OACA,GAAG,MACH;AACA,SAAO,KAAKK,QAAQ,cAAc,IAAI,YAAY,OAAO,EAAE,QAAQ,KAAM,GAAE;CAC5E;AACF","names":["ee: T","event: E","event: E | (Object & string)","listener: (...args: Events[E]) => void","options?: AddEventListenerOptions","#listeners","#target","event: EventNames | (Object & string)","listener: Callback"],"sources":["src/client/events.ts"],"sourcesContent":["import type { Callback } from '@nmtjs/common'\n\nexport type EventMap = { [K: string]: any[] }\n\n/**\n * Very simple node-like event emitter wrapper around EventTarget\n *\n * @todo add errors and promise rejections handling\n */\nexport class EventEmitter<\n Events extends EventMap = EventMap,\n EventNames extends Extract<keyof Events, string> = Extract<\n keyof Events,\n string\n >,\n> {\n static once<\n T extends EventEmitter,\n E extends T extends EventEmitter<any, infer Event> ? Event : never,\n >(ee: T, event: E) {\n return new Promise((resolve) => ee.once(event, resolve))\n }\n\n #target = new EventTarget()\n #listeners = new Map<Callback, Callback>()\n\n on<E extends EventNames>(\n event: E | (Object & string),\n listener: (...args: Events[E]) => void,\n options?: AddEventListenerOptions,\n ) {\n const wrapper = (event) => listener(...event.detail)\n this.#listeners.set(listener, wrapper)\n this.#target.addEventListener(event, wrapper, options)\n return () => this.#target.removeEventListener(event, wrapper)\n }\n\n once<E extends EventNames>(\n event: E | (Object & string),\n listener: (...args: Events[E]) => void,\n options?: AddEventListenerOptions,\n ) {\n return this.on(event, listener, { ...options, once: true })\n }\n\n off(event: EventNames | (Object & string), listener: Callback) {\n const wrapper = this.#listeners.get(listener)\n if (wrapper) this.#target.removeEventListener(event, wrapper)\n }\n\n emit<E extends EventNames | (Object & string)>(\n event: E,\n ...args: E extends EventEmitter ? Events[E] : any[]\n ) {\n return this.#target.dispatchEvent(new CustomEvent(event, { detail: args }))\n }\n}\n"],"version":3}
@@ -1 +1 @@
1
- {"mappings":"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","names":["code: string","message?: string","data?: any","#collection","streamId: number","source: ReadableStream","metadata: ProtocolBlobMetadata","size: number","error?: Error","stream: ProtocolServerStream","chunk: ArrayBuffer","namespace: string","procedure: string","payload: any","event: string","#clientStreams","#serverStreams","#rpcStreams","#rpcStreamData","#calls","#transport","#format","#timeout","options: ProtocolBaseClientOptions","#handleResponse","#send","#clear","auth: any","messageType: ClientMessageType","buffer: ArrayBuffer","#callId","#streamId","options: ProtocolBaseClientCallOptions","callStreams: ProtocolServerBlobStream[]"],"sources":["src/client/protocol.ts"],"sourcesContent":["import {\n createPromise,\n type InteractivePromise,\n onceAborted,\n} from '@nmtjs/common'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlobMetadata } from '../common/blob.ts'\nimport {\n ClientMessageType,\n ErrorCode,\n ServerMessageType,\n} from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport { EventEmitter } from './events.ts'\nimport type { BaseClientFormat } from './format.ts'\nimport {\n ProtocolClientBlobStream,\n ProtocolServerBlobStream,\n ProtocolServerStream,\n} from './stream.ts'\n\nexport class ProtocolError extends Error {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport class ProtocolClientStreams {\n readonly #collection = new Map<number, ProtocolClientBlobStream>()\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(\n source: ReadableStream,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n ) {\n const stream = new ProtocolClientBlobStream(source, streamId, metadata)\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number) {\n const stream = this.get(streamId)\n stream.abort()\n this.remove(streamId)\n }\n\n pull(streamId: number, size: number) {\n const stream = this.get(streamId)\n return stream.read(size)\n }\n\n end(streamId: number) {\n this.get(streamId).end()\n this.remove(streamId)\n }\n\n clear(error?: Error) {\n if (error) {\n for (const stream of this.#collection.values()) {\n stream.abort(error)\n }\n }\n this.#collection.clear()\n }\n}\n\nexport class ProtocolServerStreams {\n readonly #collection = new Map<number, ProtocolServerStream>()\n\n has(streamId: number) {\n return this.#collection.has(streamId)\n }\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(streamId: number, stream: ProtocolServerStream) {\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number) {\n if (this.has(streamId)) {\n const stream = this.get(streamId)\n stream.abort()\n this.remove(streamId)\n }\n }\n\n async push(streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(streamId)\n return await stream.push(chunk)\n }\n\n end(streamId: number) {\n const stream = this.get(streamId)\n stream.end()\n this.remove(streamId)\n }\n\n clear(error?: Error) {\n if (error) {\n for (const stream of this.#collection.values()) {\n stream.abort(error)\n }\n }\n this.#collection.clear()\n }\n}\n\nexport interface ProtocolTransport\n extends EventEmitter<\n {\n [K in `${ServerMessageType}`]: [ArrayBuffer]\n } & {\n connected: []\n disconnected: []\n }\n > {\n connect(\n auth: any,\n contentType: BaseClientFormat['contentType'],\n ): Promise<void>\n disconnect(): Promise<void>\n send(messageType: ClientMessageType, buffer: ArrayBuffer): Promise<void>\n}\n\nexport class ProtocolBaseTransformer {\n encodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPCChunk(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeEvent(namespace: string, event: string, payload: any) {\n return payload\n }\n}\n\nexport type ProtocolClientCall = InteractivePromise<any> &\n Pick<ProtocolRPC, 'namespace' | 'procedure'>\n\nexport type ProtocolBaseClientOptions = {\n transport: ProtocolTransport\n format: BaseClientFormat\n transformer?: ProtocolBaseTransformer\n timeout?: number\n}\n\nexport type ProtocolBaseClientCallOptions = {\n signal?: AbortSignal\n timeout?: number\n}\n\nexport abstract class ProtocolBaseClient<\n T extends Record<string, Record<string, any>>,\n> extends EventEmitter<\n {\n [N in keyof T]: {\n [E in keyof T[N] as `${Extract<N, string>}/${Extract<E, string>}`]: [\n payload: T[N][E],\n ]\n }\n }[keyof T]\n> {\n readonly #clientStreams: ProtocolClientStreams\n readonly #serverStreams: ProtocolServerStreams\n readonly #rpcStreams: ProtocolServerStreams\n readonly #rpcStreamData = new Map<\n number,\n Pick<ProtocolRPC, 'namespace' | 'procedure'>\n >()\n readonly #calls = new Map<number, ProtocolClientCall>()\n\n readonly #transport: ProtocolTransport\n readonly #format: BaseClientFormat\n readonly transformer: ProtocolBaseTransformer = new ProtocolBaseTransformer()\n readonly #timeout: number\n\n #callId = 0\n #streamId = 0\n\n constructor(options: ProtocolBaseClientOptions) {\n super()\n\n this.#transport = options.transport\n this.#format = options.format\n this.#timeout = options.timeout ?? 60000\n\n this.#clientStreams = new ProtocolClientStreams()\n this.#serverStreams = new ProtocolServerStreams()\n this.#rpcStreams = new ProtocolServerStreams()\n\n this.#transport.on(`${ServerMessageType.Event}`, (buffer) => {\n const [namespace, event, payload] = this.#format.decode(buffer)\n const name = `${namespace}/${event}`\n const transformed = this.transformer.decodeEvent(\n namespace,\n event,\n payload,\n )\n this.emit(name, transformed)\n })\n\n this.#transport.on(`${ServerMessageType.RpcResponse}`, (buffer) => {\n const { call, error, payload } = this.#handleResponse(buffer)\n if (error) call.reject(error)\n else call.resolve(payload)\n })\n\n this.#transport.on(`${ServerMessageType.RpcStreamResponse}`, (buffer) => {\n const { call, response, payload, error } = this.#handleResponse(buffer)\n if (error) return call.reject(error)\n console.log('Creating RPC stream', response)\n const stream = new ProtocolServerStream()\n this.#rpcStreams.add(response.callId, stream)\n this.#rpcStreamData.set(response.callId, {\n namespace: call.namespace,\n procedure: call.procedure,\n })\n call.resolve({ payload, stream })\n })\n\n this.#transport.on(\n `${ServerMessageType.RpcStreamChunk}`,\n async (buffer) => {\n const callId = decodeNumber(buffer, 'Uint32')\n console.log('RPC stream chunk', callId)\n\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n if (chunk.byteLength === 0) {\n this.#rpcStreams.end(callId)\n this.#rpcStreamData.delete(callId)\n } else {\n const call = this.#rpcStreamData.get(callId)\n console.log('RPC stream call', call)\n if (call) {\n const payload = this.#format.decode(chunk)\n console.log('RPC stream payload', payload)\n try {\n const transformed = this.transformer.decodeRPCChunk(\n call.namespace,\n call.procedure,\n payload,\n )\n await this.#rpcStreams.push(callId, transformed)\n } catch (error) {\n this.#send(\n ClientMessageType.RpcStreamAbort,\n encodeNumber(callId, 'Uint32'),\n )\n this.#rpcStreams.remove(callId)\n this.#rpcStreamData.delete(callId)\n }\n }\n }\n },\n )\n\n this.#transport.on(`${ServerMessageType.RpcStreamAbort}`, (buffer) => {\n const callId = decodeNumber(buffer, 'Uint32')\n console.log('RPC stream abort', callId)\n const call = this.#calls.get(callId)\n if (call) {\n this.#serverStreams.end(callId)\n this.#rpcStreams.abort(callId)\n }\n })\n\n this.#transport.on(\n `${ServerMessageType.ServerStreamPush}`,\n async (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n console.log('Server stream push', streamId, chunk.byteLength)\n try {\n await this.#serverStreams.push(streamId, chunk)\n this.#send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(streamId, 'Uint32'),\n )\n } catch (error) {\n this.#send(\n ClientMessageType.ServerStreamAbort,\n encodeNumber(streamId, 'Uint32'),\n )\n this.#serverStreams.remove(streamId)\n }\n },\n )\n\n this.#transport.on(`${ServerMessageType.ServerStreamEnd}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Server stream end', streamId)\n this.#serverStreams.end(streamId)\n })\n\n this.#transport.on(`${ServerMessageType.ServerStreamAbort}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Server stream abort', streamId)\n this.#serverStreams.abort(streamId)\n })\n\n this.#transport.on(`${ServerMessageType.ClientStreamAbort}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Client stream abort', streamId)\n this.#clientStreams.abort(streamId)\n })\n\n this.#transport.on(\n `${ServerMessageType.ClientStreamPull}`,\n async (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Client stream pull', streamId)\n const size = decodeNumber(\n buffer,\n 'Uint32',\n Uint32Array.BYTES_PER_ELEMENT,\n )\n const streamIdEncoded = encodeNumber(streamId, 'Uint32')\n try {\n const chunk = await this.#clientStreams.pull(streamId, size)\n if (chunk) {\n this.#send(\n ClientMessageType.ClientStreamPush,\n concat(streamIdEncoded, chunk),\n )\n } else {\n this.#send(ClientMessageType.ClientStreamEnd, streamIdEncoded)\n this.#clientStreams.end(streamId)\n }\n } catch (error) {\n console.error(error)\n this.#send(ClientMessageType.ClientStreamAbort, streamIdEncoded)\n }\n },\n )\n\n this.#transport.on('disconnected', () => {\n this.#clear()\n })\n }\n\n async connect(auth: any) {\n return await this.#transport.connect(auth, this.#format.contentType)\n }\n\n async disconnect() {\n this.#clear()\n return await this.#transport.disconnect()\n }\n\n async #send(messageType: ClientMessageType, buffer: ArrayBuffer) {\n console.log(\n 'Client transport send',\n ClientMessageType[messageType],\n buffer.byteLength,\n )\n return await this.#transport.send(messageType, buffer)\n }\n\n async #clear() {\n const error = new ProtocolError(\n ErrorCode.ConnectionError,\n 'Connection closed',\n )\n for (const call of this.#calls.values()) call.reject(error)\n this.#calls.clear()\n this.#serverStreams.clear(error)\n this.#clientStreams.clear(error)\n this.#rpcStreams.clear(error)\n this.#callId = 0\n this.#streamId = 0\n }\n\n protected async _call(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions = {},\n ) {\n const timeoutSignal = AbortSignal.timeout(options.timeout || this.#timeout)\n const signal = options.signal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : timeoutSignal\n\n const callId = ++this.#callId\n const call = Object.assign(createPromise(), {\n namespace,\n procedure,\n })\n const buffer = this.#format.encodeRPC(\n {\n callId,\n namespace,\n procedure,\n payload: this.transformer.encodeRPC(namespace, procedure, payload),\n },\n {\n addStream: (blob) => {\n const streamId = ++this.#streamId\n const stream = this.#clientStreams.add(\n blob.source,\n streamId,\n blob.metadata,\n )\n return stream\n },\n getStream: (id) => {\n const stream = this.#clientStreams.get(id)\n return stream\n },\n },\n )\n\n this.#transport.send(ClientMessageType.Rpc, buffer).catch(console.error)\n\n this.#calls.set(callId, call)\n\n const onAborted = onceAborted(signal).then(() => {\n if (this.#calls.has(callId)) {\n this.#send(ClientMessageType.RpcAbort, encodeNumber(callId, 'Uint32'))\n }\n throw new ProtocolError(ErrorCode.RequestTimeout, 'Request timeout')\n })\n\n return Promise.race([call.promise, onAborted])\n }\n\n #handleResponse(buffer: ArrayBuffer) {\n const callStreams: ProtocolServerBlobStream[] = []\n const response = this.#format.decodeRPC(buffer, {\n addStream: (id, metadata) => {\n console.log('Client transport blob stream', id, metadata)\n const stream = new ProtocolServerBlobStream(id, metadata, () => {\n this.#send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(id, 'Uint32'),\n )\n })\n callStreams.push(stream)\n this.#serverStreams.add(id, stream)\n return stream\n },\n getStream: (id) => {\n return this.#serverStreams.get(id)\n },\n })\n\n console.log('Client transport response', response)\n\n const call = this.#calls.get(response.callId)\n\n if (call) {\n this.#calls.delete(response.callId)\n\n if (response.error) {\n const error = new ProtocolError(\n response.error.code,\n response.error.message,\n response.error.data,\n )\n return { call, response, error }\n } else {\n const payload = this.transformer.decodeRPC(\n call.namespace,\n call.procedure,\n response.payload,\n )\n return { call, response, payload }\n }\n }\n\n for (const stream of callStreams) {\n this.#serverStreams.abort(stream.id)\n }\n\n throw new Error('Call not found')\n }\n}\n"],"version":3}
1
+ {"mappings":"AAAA,SACE,eAEA,mBACK,eAAe;AACtB,SAAS,QAAQ,cAAc,oBAAoB,qBAAqB;AAExE,SACE,mBACA,WACA,yBACK,oBAAoB;AAE3B,SAAS,oBAAoB,aAAa;AAE1C,SACE,0BACA,0BACA,4BACK,aAAa;AAEpB,OAAO,MAAM,sBAAsB,MAAM;CACvC;CACA;CAEA,YAAYA,MAAcC,SAAkBC,MAAY;AACtD,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;CACb;CAED,IAAI,UAAU;AACZ,UAAQ,EAAE,KAAK,KAAK,GAAG,MAAM,QAAQ;CACtC;CAED,WAAW;AACT,UAAQ,EAAE,KAAK,KAAK,GAAG,KAAK,QAAQ;CACrC;CAED,SAAS;AACP,SAAO;GACL,MAAM,KAAK;GACX,SAAS,KAAK;GACd,MAAM,KAAK;EACZ;CACF;AACF;AAED,OAAO,MAAM,sBAAsB;CACjC,AAASC,cAAc,IAAI;CAE3B,IAAIC,UAAkB;EACpB,MAAM,SAAS,KAAKD,YAAY,IAAI,SAAS;AAC7C,OAAK,OAAQ,OAAM,IAAI,MAAM;AAC7B,SAAO;CACR;CAED,IACEE,QACAD,UACAE,UACA;EACA,MAAM,SAAS,IAAI,yBAAyB,QAAQ,UAAU;AAC9D,OAAKH,YAAY,IAAI,UAAU,OAAO;AACtC,SAAO;CACR;CAED,OAAOC,UAAkB;AACvB,OAAKD,YAAY,OAAO,SAAS;CAClC;CAED,MAAMC,UAAkB;EACtB,MAAM,SAAS,KAAK,IAAI,SAAS;AACjC,SAAO,OAAO;AACd,OAAK,OAAO,SAAS;CACtB;CAED,KAAKA,UAAkBG,MAAc;EACnC,MAAM,SAAS,KAAK,IAAI,SAAS;AACjC,SAAO,OAAO,KAAK,KAAK;CACzB;CAED,IAAIH,UAAkB;AACpB,OAAK,IAAI,SAAS,CAAC,KAAK;AACxB,OAAK,OAAO,SAAS;CACtB;CAED,MAAMI,OAAe;AACnB,MAAI,OAAO;AACT,QAAK,MAAM,UAAU,KAAKL,YAAY,QAAQ,EAAE;AAC9C,WAAO,MAAM,MAAM;GACpB;EACF;AACD,OAAKA,YAAY,OAAO;CACzB;AACF;AAED,OAAO,MAAM,sBAAsB;CACjC,AAASA,cAAc,IAAI;CAE3B,IAAIC,UAAkB;AACpB,SAAO,KAAKD,YAAY,IAAI,SAAS;CACtC;CAED,IAAIC,UAAkB;EACpB,MAAM,SAAS,KAAKD,YAAY,IAAI,SAAS;AAC7C,OAAK,OAAQ,OAAM,IAAI,MAAM;AAC7B,SAAO;CACR;CAED,IAAIC,UAAkBK,QAA8B;AAClD,OAAKN,YAAY,IAAI,UAAU,OAAO;AACtC,SAAO;CACR;CAED,OAAOC,UAAkB;AACvB,OAAKD,YAAY,OAAO,SAAS;CAClC;CAED,MAAMC,UAAkB;AACtB,MAAI,KAAK,IAAI,SAAS,EAAE;GACtB,MAAM,SAAS,KAAK,IAAI,SAAS;AACjC,UAAO,OAAO;AACd,QAAK,OAAO,SAAS;EACtB;CACF;CAED,MAAM,KAAKA,UAAkBM,OAAoB;EAC/C,MAAM,SAAS,KAAK,IAAI,SAAS;AACjC,SAAO,MAAM,OAAO,KAAK,MAAM;CAChC;CAED,IAAIN,UAAkB;EACpB,MAAM,SAAS,KAAK,IAAI,SAAS;AACjC,SAAO,KAAK;AACZ,OAAK,OAAO,SAAS;CACtB;CAED,MAAMI,OAAe;AACnB,MAAI,OAAO;AACT,QAAK,MAAM,UAAU,KAAKL,YAAY,QAAQ,EAAE;AAC9C,WAAO,MAAM,MAAM;GACpB;EACF;AACD,OAAKA,YAAY,OAAO;CACzB;AACF;AAmBD,OAAO,MAAM,wBAAwB;CACnC,UAAUQ,WAAmBC,WAAmBC,SAAc;AAC5D,SAAO;CACR;CACD,UAAUF,WAAmBC,WAAmBC,SAAc;AAC5D,SAAO;CACR;CACD,eAAeF,WAAmBC,WAAmBC,SAAc;AACjE,SAAO;CACR;CACD,YAAYF,WAAmBG,OAAeD,SAAc;AAC1D,SAAO;CACR;AACF;AAiBD,OAAO,MAAe,2BAEZ,aAQR;CACA,AAASE;CACT,AAASC;CACT,AAASC;CACT,AAASC,iBAAiB,IAAI;CAI9B,AAASC,SAAS,IAAI;CAEtB,AAASC;CACT,AAASC;CACT,AAAS,cAAuC,IAAI;CACpD,AAASC;CAET,UAAU;CACV,YAAY;CAEZ,YAAYC,SAAoC;AAC9C,SAAO;AAEP,OAAKH,aAAa,QAAQ;AAC1B,OAAKC,UAAU,QAAQ;AACvB,OAAKC,WAAW,QAAQ,WAAW;AAEnC,OAAKP,iBAAiB,IAAI;AAC1B,OAAKC,iBAAiB,IAAI;AAC1B,OAAKC,cAAc,IAAI;AAEvB,OAAKG,WAAW,IAAI,EAAE,kBAAkB,MAAM,GAAG,CAAC,WAAW;GAC3D,MAAM,CAAC,WAAW,OAAO,QAAQ,GAAG,KAAKC,QAAQ,OAAO,OAAO;GAC/D,MAAM,QAAQ,EAAE,UAAU,GAAG,MAAM;GACnC,MAAM,cAAc,KAAK,YAAY,YACnC,WACA,OACA,QACD;AACD,QAAK,KAAK,MAAM,YAAY;EAC7B,EAAC;AAEF,OAAKD,WAAW,IAAI,EAAE,kBAAkB,YAAY,GAAG,CAAC,WAAW;GACjE,MAAM,EAAE,MAAM,OAAO,SAAS,GAAG,KAAKI,gBAAgB,OAAO;AAC7D,OAAI,MAAO,MAAK,OAAO,MAAM;OACxB,MAAK,QAAQ,QAAQ;EAC3B,EAAC;AAEF,OAAKJ,WAAW,IAAI,EAAE,kBAAkB,kBAAkB,GAAG,CAAC,WAAW;GACvE,MAAM,EAAE,MAAM,UAAU,SAAS,OAAO,GAAG,KAAKI,gBAAgB,OAAO;AACvE,OAAI,MAAO,QAAO,KAAK,OAAO,MAAM;AACpC,WAAQ,IAAI,uBAAuB,SAAS;GAC5C,MAAM,SAAS,IAAI;AACnB,QAAKP,YAAY,IAAI,SAAS,QAAQ,OAAO;AAC7C,QAAKC,eAAe,IAAI,SAAS,QAAQ;IACvC,WAAW,KAAK;IAChB,WAAW,KAAK;GACjB,EAAC;AACF,QAAK,QAAQ;IAAE;IAAS;GAAQ,EAAC;EAClC,EAAC;AAEF,OAAKE,WAAW,IACb,EAAE,kBAAkB,eAAe,GACpC,OAAO,WAAW;GAChB,MAAM,SAAS,aAAa,QAAQ,SAAS;AAC7C,WAAQ,IAAI,oBAAoB,OAAO;GAEvC,MAAM,QAAQ,OAAO,MAAM,YAAY,kBAAkB;AACzD,OAAI,MAAM,eAAe,GAAG;AAC1B,SAAKH,YAAY,IAAI,OAAO;AAC5B,SAAKC,eAAe,OAAO,OAAO;GACnC,OAAM;IACL,MAAM,OAAO,KAAKA,eAAe,IAAI,OAAO;AAC5C,YAAQ,IAAI,mBAAmB,KAAK;AACpC,QAAI,MAAM;KACR,MAAM,UAAU,KAAKG,QAAQ,OAAO,MAAM;AAC1C,aAAQ,IAAI,sBAAsB,QAAQ;AAC1C,SAAI;MACF,MAAM,cAAc,KAAK,YAAY,eACnC,KAAK,WACL,KAAK,WACL,QACD;AACD,YAAM,KAAKJ,YAAY,KAAK,QAAQ,YAAY;KACjD,SAAQ,OAAO;AACd,WAAKQ,MACH,kBAAkB,gBAClB,aAAa,QAAQ,SAAS,CAC/B;AACD,WAAKR,YAAY,OAAO,OAAO;AAC/B,WAAKC,eAAe,OAAO,OAAO;KACnC;IACF;GACF;EACF,EACF;AAED,OAAKE,WAAW,IAAI,EAAE,kBAAkB,eAAe,GAAG,CAAC,WAAW;GACpE,MAAM,SAAS,aAAa,QAAQ,SAAS;AAC7C,WAAQ,IAAI,oBAAoB,OAAO;GACvC,MAAM,OAAO,KAAKD,OAAO,IAAI,OAAO;AACpC,OAAI,MAAM;AACR,SAAKH,eAAe,IAAI,OAAO;AAC/B,SAAKC,YAAY,MAAM,OAAO;GAC/B;EACF,EAAC;AAEF,OAAKG,WAAW,IACb,EAAE,kBAAkB,iBAAiB,GACtC,OAAO,WAAW;GAChB,MAAM,WAAW,aAAa,QAAQ,SAAS;GAC/C,MAAM,QAAQ,OAAO,MAAM,YAAY,kBAAkB;AACzD,WAAQ,IAAI,sBAAsB,UAAU,MAAM,WAAW;AAC7D,OAAI;AACF,UAAM,KAAKJ,eAAe,KAAK,UAAU,MAAM;AAC/C,SAAKS,MACH,kBAAkB,kBAClB,aAAa,UAAU,SAAS,CACjC;GACF,SAAQ,OAAO;AACd,SAAKA,MACH,kBAAkB,mBAClB,aAAa,UAAU,SAAS,CACjC;AACD,SAAKT,eAAe,OAAO,SAAS;GACrC;EACF,EACF;AAED,OAAKI,WAAW,IAAI,EAAE,kBAAkB,gBAAgB,GAAG,CAAC,WAAW;GACrE,MAAM,WAAW,aAAa,QAAQ,SAAS;AAC/C,WAAQ,IAAI,qBAAqB,SAAS;AAC1C,QAAKJ,eAAe,IAAI,SAAS;EAClC,EAAC;AAEF,OAAKI,WAAW,IAAI,EAAE,kBAAkB,kBAAkB,GAAG,CAAC,WAAW;GACvE,MAAM,WAAW,aAAa,QAAQ,SAAS;AAC/C,WAAQ,IAAI,uBAAuB,SAAS;AAC5C,QAAKJ,eAAe,MAAM,SAAS;EACpC,EAAC;AAEF,OAAKI,WAAW,IAAI,EAAE,kBAAkB,kBAAkB,GAAG,CAAC,WAAW;GACvE,MAAM,WAAW,aAAa,QAAQ,SAAS;AAC/C,WAAQ,IAAI,uBAAuB,SAAS;AAC5C,QAAKL,eAAe,MAAM,SAAS;EACpC,EAAC;AAEF,OAAKK,WAAW,IACb,EAAE,kBAAkB,iBAAiB,GACtC,OAAO,WAAW;GAChB,MAAM,WAAW,aAAa,QAAQ,SAAS;AAC/C,WAAQ,IAAI,sBAAsB,SAAS;GAC3C,MAAM,OAAO,aACX,QACA,UACA,YAAY,kBACb;GACD,MAAM,kBAAkB,aAAa,UAAU,SAAS;AACxD,OAAI;IACF,MAAM,QAAQ,MAAM,KAAKL,eAAe,KAAK,UAAU,KAAK;AAC5D,QAAI,OAAO;AACT,UAAKU,MACH,kBAAkB,kBAClB,OAAO,iBAAiB,MAAM,CAC/B;IACF,OAAM;AACL,UAAKA,MAAM,kBAAkB,iBAAiB,gBAAgB;AAC9D,UAAKV,eAAe,IAAI,SAAS;IAClC;GACF,SAAQ,OAAO;AACd,YAAQ,MAAM,MAAM;AACpB,SAAKU,MAAM,kBAAkB,mBAAmB,gBAAgB;GACjE;EACF,EACF;AAED,OAAKL,WAAW,GAAG,gBAAgB,MAAM;AACvC,QAAKM,QAAQ;EACd,EAAC;CACH;CAED,MAAM,QAAQC,MAAW;AACvB,SAAO,MAAM,KAAKP,WAAW,QAAQ,MAAM,KAAKC,QAAQ,YAAY;CACrE;CAED,MAAM,aAAa;AACjB,OAAKK,QAAQ;AACb,SAAO,MAAM,KAAKN,WAAW,YAAY;CAC1C;CAED,MAAMK,MAAMG,aAAgCC,QAAqB;AAC/D,UAAQ,IACN,yBACA,kBAAkB,cAClB,OAAO,WACR;AACD,SAAO,MAAM,KAAKT,WAAW,KAAK,aAAa,OAAO;CACvD;CAED,MAAMM,SAAS;EACb,MAAM,QAAQ,IAAI,cAChB,UAAU,iBACV;AAEF,OAAK,MAAM,QAAQ,KAAKP,OAAO,QAAQ,CAAE,MAAK,OAAO,MAAM;AAC3D,OAAKA,OAAO,OAAO;AACnB,OAAKH,eAAe,MAAM,MAAM;AAChC,OAAKD,eAAe,MAAM,MAAM;AAChC,OAAKE,YAAY,MAAM,MAAM;AAC7B,OAAKa,UAAU;AACf,OAAKC,YAAY;CAClB;CAED,MAAgB,MACdpB,WACAC,WACAC,SACAmB,UAAyC,CAAE,GAC3C;EACA,MAAM,gBAAgB,YAAY,QAAQ,QAAQ,WAAW,KAAKV,SAAS;EAC3E,MAAM,SAAS,QAAQ,SACnB,YAAY,IAAI,CAAC,QAAQ,QAAQ,aAAc,EAAC,GAChD;EAEJ,MAAM,SAAS,EAAE,KAAKQ;EACtB,MAAM,OAAO,OAAO,OAAO,eAAe,EAAE;GAC1C;GACA;EACD,EAAC;EACF,MAAM,SAAS,KAAKT,QAAQ,UAC1B;GACE;GACA;GACA;GACA,SAAS,KAAK,YAAY,UAAU,WAAW,WAAW,QAAQ;EACnE,GACD;GACE,WAAW,CAAC,SAAS;IACnB,MAAM,WAAW,EAAE,KAAKU;IACxB,MAAM,SAAS,KAAKhB,eAAe,IACjC,KAAK,QACL,UACA,KAAK,SACN;AACD,WAAO;GACR;GACD,WAAW,CAAC,OAAO;IACjB,MAAM,SAAS,KAAKA,eAAe,IAAI,GAAG;AAC1C,WAAO;GACR;EACF,EACF;AAED,OAAKK,WAAW,KAAK,kBAAkB,KAAK,OAAO,CAAC,MAAM,QAAQ,MAAM;AAExE,OAAKD,OAAO,IAAI,QAAQ,KAAK;EAE7B,MAAM,YAAY,YAAY,OAAO,CAAC,KAAK,MAAM;AAC/C,OAAI,KAAKA,OAAO,IAAI,OAAO,EAAE;AAC3B,SAAKM,MAAM,kBAAkB,UAAU,aAAa,QAAQ,SAAS,CAAC;GACvE;AACD,SAAM,IAAI,cAAc,UAAU,gBAAgB;EACnD,EAAC;AAEF,SAAO,QAAQ,KAAK,CAAC,KAAK,SAAS,SAAU,EAAC;CAC/C;CAED,gBAAgBI,QAAqB;EACnC,MAAMI,cAA0C,CAAE;EAClD,MAAM,WAAW,KAAKZ,QAAQ,UAAU,QAAQ;GAC9C,WAAW,CAAC,IAAI,aAAa;AAC3B,YAAQ,IAAI,gCAAgC,IAAI,SAAS;IACzD,MAAM,SAAS,IAAI,yBAAyB,IAAI,UAAU,MAAM;AAC9D,UAAKI,MACH,kBAAkB,kBAClB,aAAa,IAAI,SAAS,CAC3B;IACF;AACD,gBAAY,KAAK,OAAO;AACxB,SAAKT,eAAe,IAAI,IAAI,OAAO;AACnC,WAAO;GACR;GACD,WAAW,CAAC,OAAO;AACjB,WAAO,KAAKA,eAAe,IAAI,GAAG;GACnC;EACF,EAAC;AAEF,UAAQ,IAAI,6BAA6B,SAAS;EAElD,MAAM,OAAO,KAAKG,OAAO,IAAI,SAAS,OAAO;AAE7C,MAAI,MAAM;AACR,QAAKA,OAAO,OAAO,SAAS,OAAO;AAEnC,OAAI,SAAS,OAAO;IAClB,MAAM,QAAQ,IAAI,cAChB,SAAS,MAAM,MACf,SAAS,MAAM,SACf,SAAS,MAAM;AAEjB,WAAO;KAAE;KAAM;KAAU;IAAO;GACjC,OAAM;IACL,MAAM,UAAU,KAAK,YAAY,UAC/B,KAAK,WACL,KAAK,WACL,SAAS,QACV;AACD,WAAO;KAAE;KAAM;KAAU;IAAS;GACnC;EACF;AAED,OAAK,MAAM,UAAU,aAAa;AAChC,QAAKH,eAAe,MAAM,OAAO,GAAG;EACrC;AAED,QAAM,IAAI,MAAM;CACjB;AACF","names":["code: string","message?: string","data?: any","#collection","streamId: number","source: ReadableStream","metadata: ProtocolBlobMetadata","size: number","error?: Error","stream: ProtocolServerStream","chunk: ArrayBuffer","namespace: string","procedure: string","payload: any","event: string","#clientStreams","#serverStreams","#rpcStreams","#rpcStreamData","#calls","#transport","#format","#timeout","options: ProtocolBaseClientOptions","#handleResponse","#send","#clear","auth: any","messageType: ClientMessageType","buffer: ArrayBuffer","#callId","#streamId","options: ProtocolBaseClientCallOptions","callStreams: ProtocolServerBlobStream[]"],"sources":["src/client/protocol.ts"],"sourcesContent":["import {\n createPromise,\n type InteractivePromise,\n onceAborted,\n} from '@nmtjs/common'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlobMetadata } from '../common/blob.ts'\nimport {\n ClientMessageType,\n ErrorCode,\n ServerMessageType,\n} from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport { EventEmitter } from './events.ts'\nimport type { BaseClientFormat } from './format.ts'\nimport {\n ProtocolClientBlobStream,\n ProtocolServerBlobStream,\n ProtocolServerStream,\n} from './stream.ts'\n\nexport class ProtocolError extends Error {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport class ProtocolClientStreams {\n readonly #collection = new Map<number, ProtocolClientBlobStream>()\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(\n source: ReadableStream,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n ) {\n const stream = new ProtocolClientBlobStream(source, streamId, metadata)\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number) {\n const stream = this.get(streamId)\n stream.abort()\n this.remove(streamId)\n }\n\n pull(streamId: number, size: number) {\n const stream = this.get(streamId)\n return stream.read(size)\n }\n\n end(streamId: number) {\n this.get(streamId).end()\n this.remove(streamId)\n }\n\n clear(error?: Error) {\n if (error) {\n for (const stream of this.#collection.values()) {\n stream.abort(error)\n }\n }\n this.#collection.clear()\n }\n}\n\nexport class ProtocolServerStreams {\n readonly #collection = new Map<number, ProtocolServerStream>()\n\n has(streamId: number) {\n return this.#collection.has(streamId)\n }\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(streamId: number, stream: ProtocolServerStream) {\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number) {\n if (this.has(streamId)) {\n const stream = this.get(streamId)\n stream.abort()\n this.remove(streamId)\n }\n }\n\n async push(streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(streamId)\n return await stream.push(chunk)\n }\n\n end(streamId: number) {\n const stream = this.get(streamId)\n stream.end()\n this.remove(streamId)\n }\n\n clear(error?: Error) {\n if (error) {\n for (const stream of this.#collection.values()) {\n stream.abort(error)\n }\n }\n this.#collection.clear()\n }\n}\n\nexport type ProtocolTransportEventMap = {\n [K in `${ServerMessageType}`]: [ArrayBuffer]\n} & {\n connected: []\n disconnected: []\n}\n\nexport interface ProtocolTransport\n extends EventEmitter<ProtocolTransportEventMap> {\n connect(\n auth: any,\n contentType: BaseClientFormat['contentType'],\n ): Promise<void>\n disconnect(): Promise<void>\n send(messageType: ClientMessageType, buffer: ArrayBuffer): Promise<void>\n}\n\nexport class ProtocolBaseTransformer {\n encodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPCChunk(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeEvent(namespace: string, event: string, payload: any) {\n return payload\n }\n}\n\nexport type ProtocolClientCall = InteractivePromise<any> &\n Pick<ProtocolRPC, 'namespace' | 'procedure'>\n\nexport type ProtocolBaseClientOptions = {\n transport: ProtocolTransport\n format: BaseClientFormat\n transformer?: ProtocolBaseTransformer\n timeout?: number\n}\n\nexport type ProtocolBaseClientCallOptions = {\n signal?: AbortSignal\n timeout?: number\n}\n\nexport abstract class ProtocolBaseClient<\n T extends Record<string, Record<string, any>>,\n> extends EventEmitter<\n {\n [N in keyof T]: {\n [E in keyof T[N] as `${Extract<N, string>}/${Extract<E, string>}`]: [\n payload: T[N][E],\n ]\n }\n }[keyof T]\n> {\n readonly #clientStreams: ProtocolClientStreams\n readonly #serverStreams: ProtocolServerStreams\n readonly #rpcStreams: ProtocolServerStreams\n readonly #rpcStreamData = new Map<\n number,\n Pick<ProtocolRPC, 'namespace' | 'procedure'>\n >()\n readonly #calls = new Map<number, ProtocolClientCall>()\n\n readonly #transport: ProtocolTransport\n readonly #format: BaseClientFormat\n readonly transformer: ProtocolBaseTransformer = new ProtocolBaseTransformer()\n readonly #timeout: number\n\n #callId = 0\n #streamId = 0\n\n constructor(options: ProtocolBaseClientOptions) {\n super()\n\n this.#transport = options.transport\n this.#format = options.format\n this.#timeout = options.timeout ?? 60000\n\n this.#clientStreams = new ProtocolClientStreams()\n this.#serverStreams = new ProtocolServerStreams()\n this.#rpcStreams = new ProtocolServerStreams()\n\n this.#transport.on(`${ServerMessageType.Event}`, (buffer) => {\n const [namespace, event, payload] = this.#format.decode(buffer)\n const name = `${namespace}/${event}`\n const transformed = this.transformer.decodeEvent(\n namespace,\n event,\n payload,\n )\n this.emit(name, transformed)\n })\n\n this.#transport.on(`${ServerMessageType.RpcResponse}`, (buffer) => {\n const { call, error, payload } = this.#handleResponse(buffer)\n if (error) call.reject(error)\n else call.resolve(payload)\n })\n\n this.#transport.on(`${ServerMessageType.RpcStreamResponse}`, (buffer) => {\n const { call, response, payload, error } = this.#handleResponse(buffer)\n if (error) return call.reject(error)\n console.log('Creating RPC stream', response)\n const stream = new ProtocolServerStream()\n this.#rpcStreams.add(response.callId, stream)\n this.#rpcStreamData.set(response.callId, {\n namespace: call.namespace,\n procedure: call.procedure,\n })\n call.resolve({ payload, stream })\n })\n\n this.#transport.on(\n `${ServerMessageType.RpcStreamChunk}`,\n async (buffer) => {\n const callId = decodeNumber(buffer, 'Uint32')\n console.log('RPC stream chunk', callId)\n\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n if (chunk.byteLength === 0) {\n this.#rpcStreams.end(callId)\n this.#rpcStreamData.delete(callId)\n } else {\n const call = this.#rpcStreamData.get(callId)\n console.log('RPC stream call', call)\n if (call) {\n const payload = this.#format.decode(chunk)\n console.log('RPC stream payload', payload)\n try {\n const transformed = this.transformer.decodeRPCChunk(\n call.namespace,\n call.procedure,\n payload,\n )\n await this.#rpcStreams.push(callId, transformed)\n } catch (error) {\n this.#send(\n ClientMessageType.RpcStreamAbort,\n encodeNumber(callId, 'Uint32'),\n )\n this.#rpcStreams.remove(callId)\n this.#rpcStreamData.delete(callId)\n }\n }\n }\n },\n )\n\n this.#transport.on(`${ServerMessageType.RpcStreamAbort}`, (buffer) => {\n const callId = decodeNumber(buffer, 'Uint32')\n console.log('RPC stream abort', callId)\n const call = this.#calls.get(callId)\n if (call) {\n this.#serverStreams.end(callId)\n this.#rpcStreams.abort(callId)\n }\n })\n\n this.#transport.on(\n `${ServerMessageType.ServerStreamPush}`,\n async (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n console.log('Server stream push', streamId, chunk.byteLength)\n try {\n await this.#serverStreams.push(streamId, chunk)\n this.#send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(streamId, 'Uint32'),\n )\n } catch (error) {\n this.#send(\n ClientMessageType.ServerStreamAbort,\n encodeNumber(streamId, 'Uint32'),\n )\n this.#serverStreams.remove(streamId)\n }\n },\n )\n\n this.#transport.on(`${ServerMessageType.ServerStreamEnd}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Server stream end', streamId)\n this.#serverStreams.end(streamId)\n })\n\n this.#transport.on(`${ServerMessageType.ServerStreamAbort}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Server stream abort', streamId)\n this.#serverStreams.abort(streamId)\n })\n\n this.#transport.on(`${ServerMessageType.ClientStreamAbort}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Client stream abort', streamId)\n this.#clientStreams.abort(streamId)\n })\n\n this.#transport.on(\n `${ServerMessageType.ClientStreamPull}`,\n async (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Client stream pull', streamId)\n const size = decodeNumber(\n buffer,\n 'Uint32',\n Uint32Array.BYTES_PER_ELEMENT,\n )\n const streamIdEncoded = encodeNumber(streamId, 'Uint32')\n try {\n const chunk = await this.#clientStreams.pull(streamId, size)\n if (chunk) {\n this.#send(\n ClientMessageType.ClientStreamPush,\n concat(streamIdEncoded, chunk),\n )\n } else {\n this.#send(ClientMessageType.ClientStreamEnd, streamIdEncoded)\n this.#clientStreams.end(streamId)\n }\n } catch (error) {\n console.error(error)\n this.#send(ClientMessageType.ClientStreamAbort, streamIdEncoded)\n }\n },\n )\n\n this.#transport.on('disconnected', () => {\n this.#clear()\n })\n }\n\n async connect(auth: any) {\n return await this.#transport.connect(auth, this.#format.contentType)\n }\n\n async disconnect() {\n this.#clear()\n return await this.#transport.disconnect()\n }\n\n async #send(messageType: ClientMessageType, buffer: ArrayBuffer) {\n console.log(\n 'Client transport send',\n ClientMessageType[messageType],\n buffer.byteLength,\n )\n return await this.#transport.send(messageType, buffer)\n }\n\n async #clear() {\n const error = new ProtocolError(\n ErrorCode.ConnectionError,\n 'Connection closed',\n )\n for (const call of this.#calls.values()) call.reject(error)\n this.#calls.clear()\n this.#serverStreams.clear(error)\n this.#clientStreams.clear(error)\n this.#rpcStreams.clear(error)\n this.#callId = 0\n this.#streamId = 0\n }\n\n protected async _call(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions = {},\n ) {\n const timeoutSignal = AbortSignal.timeout(options.timeout || this.#timeout)\n const signal = options.signal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : timeoutSignal\n\n const callId = ++this.#callId\n const call = Object.assign(createPromise(), {\n namespace,\n procedure,\n })\n const buffer = this.#format.encodeRPC(\n {\n callId,\n namespace,\n procedure,\n payload: this.transformer.encodeRPC(namespace, procedure, payload),\n },\n {\n addStream: (blob) => {\n const streamId = ++this.#streamId\n const stream = this.#clientStreams.add(\n blob.source,\n streamId,\n blob.metadata,\n )\n return stream\n },\n getStream: (id) => {\n const stream = this.#clientStreams.get(id)\n return stream\n },\n },\n )\n\n this.#transport.send(ClientMessageType.Rpc, buffer).catch(console.error)\n\n this.#calls.set(callId, call)\n\n const onAborted = onceAborted(signal).then(() => {\n if (this.#calls.has(callId)) {\n this.#send(ClientMessageType.RpcAbort, encodeNumber(callId, 'Uint32'))\n }\n throw new ProtocolError(ErrorCode.RequestTimeout, 'Request timeout')\n })\n\n return Promise.race([call.promise, onAborted])\n }\n\n #handleResponse(buffer: ArrayBuffer) {\n const callStreams: ProtocolServerBlobStream[] = []\n const response = this.#format.decodeRPC(buffer, {\n addStream: (id, metadata) => {\n console.log('Client transport blob stream', id, metadata)\n const stream = new ProtocolServerBlobStream(id, metadata, () => {\n this.#send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(id, 'Uint32'),\n )\n })\n callStreams.push(stream)\n this.#serverStreams.add(id, stream)\n return stream\n },\n getStream: (id) => {\n return this.#serverStreams.get(id)\n },\n })\n\n console.log('Client transport response', response)\n\n const call = this.#calls.get(response.callId)\n\n if (call) {\n this.#calls.delete(response.callId)\n\n if (response.error) {\n const error = new ProtocolError(\n response.error.code,\n response.error.message,\n response.error.data,\n )\n return { call, response, error }\n } else {\n const payload = this.transformer.decodeRPC(\n call.namespace,\n call.procedure,\n response.payload,\n )\n return { call, response, payload }\n }\n }\n\n for (const stream of callStreams) {\n this.#serverStreams.abort(stream.id)\n }\n\n throw new Error('Call not found')\n }\n}\n"],"version":3}
package/package.json CHANGED
@@ -16,9 +16,9 @@
16
16
  }
17
17
  },
18
18
  "dependencies": {
19
- "@nmtjs/common": "0.7.2",
20
- "@nmtjs/type": "0.7.2",
21
- "@nmtjs/core": "0.7.2"
19
+ "@nmtjs/type": "0.7.4",
20
+ "@nmtjs/core": "0.7.4",
21
+ "@nmtjs/common": "0.7.4"
22
22
  },
23
23
  "files": [
24
24
  "src",
@@ -26,7 +26,7 @@
26
26
  "LICENSE.md",
27
27
  "README.md"
28
28
  ],
29
- "version": "0.7.2",
29
+ "version": "0.7.4",
30
30
  "scripts": {
31
31
  "build": "neemata-build --root=./src './**/*.ts'",
32
32
  "type-check": "tsc --noEmit"
@@ -14,7 +14,10 @@ export class EventEmitter<
14
14
  string
15
15
  >,
16
16
  > {
17
- static once(ee: EventEmitter, event: string) {
17
+ static once<
18
+ T extends EventEmitter,
19
+ E extends T extends EventEmitter<any, infer Event> ? Event : never,
20
+ >(ee: T, event: E) {
18
21
  return new Promise((resolve) => ee.once(event, resolve))
19
22
  }
20
23
 
@@ -146,15 +146,15 @@ export class ProtocolServerStreams {
146
146
  }
147
147
  }
148
148
 
149
+ export type ProtocolTransportEventMap = {
150
+ [K in `${ServerMessageType}`]: [ArrayBuffer]
151
+ } & {
152
+ connected: []
153
+ disconnected: []
154
+ }
155
+
149
156
  export interface ProtocolTransport
150
- extends EventEmitter<
151
- {
152
- [K in `${ServerMessageType}`]: [ArrayBuffer]
153
- } & {
154
- connected: []
155
- disconnected: []
156
- }
157
- > {
157
+ extends EventEmitter<ProtocolTransportEventMap> {
158
158
  connect(
159
159
  auth: any,
160
160
  contentType: BaseClientFormat['contentType'],