@nmtjs/protocol 0.12.1 → 0.12.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.
@@ -104,7 +104,15 @@ export class ProtocolServerStreams {
104
104
  this.#collection.clear();
105
105
  }
106
106
  }
107
- export class ProtocolTransport extends EventEmitter {}
107
+ export let ProtocolTransportStatus = /* @__PURE__ */ function(ProtocolTransportStatus) {
108
+ ProtocolTransportStatus["CONNECTED"] = "CONNECTED";
109
+ ProtocolTransportStatus["DISCONNECTED"] = "DISCONNECTED";
110
+ ProtocolTransportStatus["CONNECTING"] = "CONNECTING";
111
+ return ProtocolTransportStatus;
112
+ }({});
113
+ export class ProtocolTransport extends EventEmitter {
114
+ status = ProtocolTransportStatus.DISCONNECTED;
115
+ }
108
116
  export class ProtocolBaseTransformer {
109
117
  encodeRPC(namespace, procedure, payload) {
110
118
  return payload;
@@ -1 +1 @@
1
- {"mappings":"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","names":["code: string","message?: string","data?: any","#collection","streamId: number","source: ReadableStream","metadata: ProtocolBlobMetadata","error?: Error","size: number","stream: T","chunk: ArrayBuffer","namespace: string","procedure: string","payload: any","event: string","format: BaseClientFormat","callId: number","call: ProtocolClientCall","response: OneOf<\n [{ error: BaseProtocolError }, { result: any; stream?: any }]\n >","transformer: ProtocolBaseTransformer","stream?: ProtocolServerStream","response: ProtocolRPCResponse","stream: ProtocolServerStream","options: ProtocolBaseClientCallOptions","chunk: any","stream: ProtocolServerBlobStream","payload: string","buffer: ArrayBuffer","transport: ProtocolTransport"],"sources":["../../src/client/protocol.ts"],"sourcesContent":["import {\n createPromise,\n type InteractivePromise,\n type OneOf,\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 {\n BaseProtocolError,\n ProtocolRPC,\n ProtocolRPCResponse,\n} 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 implements BaseProtocolError {\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, error?: Error) {\n const stream = this.get(streamId)\n stream.abort(error)\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 T extends ProtocolServerStream = ProtocolServerStream,\n> {\n readonly #collection = new Map<number, T>()\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: T) {\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 connected: []\n disconnected: []\n}\n\nexport interface ProtocolSendMetadata {\n callId?: number\n streamId?: number\n}\n\nexport abstract class ProtocolTransport extends EventEmitter<ProtocolTransportEventMap> {\n abstract connect(\n auth: any,\n transformer: ProtocolBaseTransformer,\n ): Promise<void>\n abstract disconnect(): Promise<void>\n abstract call(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions,\n transformer: ProtocolBaseTransformer,\n ): Promise<ProtocolClientCall>\n abstract send(\n messageType: ClientMessageType,\n buffer: ArrayBuffer,\n metadata: ProtocolSendMetadata,\n ): 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'> & { signal: AbortSignal }\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 class BaseProtocol<\n T extends Record<string, Record<string, any>> = Record<\n string,\n Record<string, any>\n >,\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 protected readonly clientStreams: ProtocolClientStreams =\n new ProtocolClientStreams()\n protected readonly serverStreams: ProtocolServerStreams<ProtocolServerBlobStream> =\n new ProtocolServerStreams()\n protected readonly rpcStreams: ProtocolServerStreams =\n new ProtocolServerStreams()\n protected readonly calls = new Map<number, ProtocolClientCall>()\n protected callId = 0\n protected streamId = 0\n\n constructor(public readonly format: BaseClientFormat) {\n super()\n }\n\n get contentType() {\n return this.format.contentType\n }\n\n handleCallResponse(\n callId: number,\n call: ProtocolClientCall,\n response: OneOf<\n [{ error: BaseProtocolError }, { result: any; stream?: any }]\n >,\n transformer: ProtocolBaseTransformer,\n ) {\n if (response.error) {\n call.reject(\n new ProtocolError(\n response.error.code,\n response.error.message,\n response.error.data,\n ),\n )\n } else {\n try {\n const transformed = transformer.decodeRPC(\n call.namespace,\n call.procedure,\n response.result,\n )\n if (response.stream)\n call.resolve({ result: transformed, stream: response.stream })\n else call.resolve(transformed)\n } catch (error) {\n call.reject(\n new ProtocolError(\n ErrorCode.ClientRequestError,\n 'Unable to decode response',\n error,\n ),\n )\n }\n }\n this.calls.delete(callId)\n }\n\n handleRpcResponse(\n { callId, error, result, streams }: ProtocolRPCResponse,\n transformer: ProtocolBaseTransformer,\n stream?: ProtocolServerStream,\n ) {\n const call = this.calls.get(callId)\n if (!call) throw new Error('Call not found')\n for (const key in streams) {\n const stream = streams[key]\n this.serverStreams.add(stream.id, stream)\n }\n this.handleCallResponse(\n callId,\n call,\n error ? { error } : { result, stream },\n transformer,\n )\n return call\n }\n\n handleRpcStreamResponse(\n response: ProtocolRPCResponse,\n stream: ProtocolServerStream,\n transformer: ProtocolBaseTransformer,\n ) {\n const call = this.handleRpcResponse(response, transformer, stream)\n this.rpcStreams.add(response.callId, stream)\n return call\n }\n\n createCall(\n namespace: string,\n procedure: string,\n options: ProtocolBaseClientCallOptions,\n ) {\n const timeoutSignal = AbortSignal.timeout(options.timeout)\n const signal = options.signal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : timeoutSignal\n\n const call = Object.assign(createPromise(), {\n namespace,\n procedure,\n signal,\n })\n\n timeoutSignal.addEventListener(\n 'abort',\n () => {\n const error = new ProtocolError(\n ErrorCode.RequestTimeout,\n 'Request timeout',\n )\n call.reject(error)\n },\n { once: true },\n )\n\n return call\n }\n\n createRpc(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions,\n transformer: ProtocolBaseTransformer,\n ) {\n const callId = ++this.callId\n const call = this.createCall(namespace, procedure, options)\n const { buffer, streams } = this.format.encodeRPC(\n {\n callId,\n namespace,\n procedure,\n payload: transformer.encodeRPC(namespace, procedure, payload),\n },\n {\n addStream: (blob) => {\n const streamId = ++this.streamId\n return this.clientStreams.add(blob.source, streamId, blob.metadata)\n },\n getStream: (id) => {\n const stream = this.clientStreams.get(id)\n return stream\n },\n },\n )\n\n this.calls.set(callId, call)\n\n return { callId, call, streams, buffer }\n }\n\n pushRpcStream(callId: number, chunk: any) {\n this.rpcStreams.push(callId, chunk)\n }\n\n endRpcStream(callId: number) {\n this.rpcStreams.end(callId)\n }\n\n abortRpcStream(callId: number) {\n this.rpcStreams.abort(callId)\n }\n\n removeClientStream(streamId: number) {\n this.clientStreams.remove(streamId)\n }\n\n pullClientStream(streamId: number, size: number) {\n return this.clientStreams.pull(streamId, size)\n }\n\n endClientStream(streamId: number) {\n this.clientStreams.end(streamId)\n }\n\n abortClientStream(streamId: number, error?: Error) {\n this.clientStreams.abort(streamId, error)\n }\n\n addServerStream(stream: ProtocolServerBlobStream) {\n this.serverStreams.add(stream.id, stream)\n }\n\n removeServerStream(streamId: number) {\n this.serverStreams.remove(streamId)\n }\n\n pushServerStream(streamId: number, chunk: ArrayBuffer) {\n return this.serverStreams.push(streamId, chunk)\n }\n\n endServerStream(streamId: number) {\n this.serverStreams.end(streamId)\n }\n\n abortServerStream(streamId: number, error?: Error) {\n this.serverStreams.abort(streamId)\n }\n\n emitEvent(\n namespace: string,\n event: string,\n payload: string,\n transformer: ProtocolBaseTransformer,\n ) {\n const transformed = transformer.decodeEvent(namespace, event, payload)\n this.emit(`${namespace}/${event}`, transformed)\n }\n}\n\nexport class Protocol<\n T extends Record<string, Record<string, any>> = Record<\n string,\n Record<string, any>\n >,\n> extends BaseProtocol<T> {\n handleServerMessage(\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const type = decodeNumber(buffer, 'Uint8')\n const messageBuffer = buffer.slice(Uint8Array.BYTES_PER_ELEMENT)\n if (type in ServerMessageType) {\n const messageType = type as ServerMessageType\n if (typeof ServerMessageType[messageType] !== 'undefined') {\n this[messageType](messageBuffer, transport, transformer)\n } else {\n throw new Error(`Unknown message type: ${messageType}`)\n }\n }\n }\n\n protected [ServerMessageType.Event](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const [namespace, event, payload] = this.format.decode(buffer)\n this.emitEvent(namespace, event, payload, transformer)\n }\n\n protected [ServerMessageType.RpcResponse](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const response = this.format.decodeRPC(buffer, {\n addStream: (id, callId, metadata) => {\n return new ProtocolServerBlobStream(id, metadata, {\n start: () => {\n transport.send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(id, 'Uint32'),\n { callId, streamId: id },\n )\n },\n })\n },\n getStream: (id) => {\n return this.serverStreams.get(id)\n },\n })\n this.handleRpcResponse(response, transformer)\n }\n\n protected [ServerMessageType.RpcStreamResponse](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const response = this.format.decodeRPC(buffer, {\n addStream: (id, callId, metadata) => {\n return new ProtocolServerBlobStream(id, metadata, {\n start: () => {\n transport.send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(id, 'Uint32'),\n { callId, streamId: id },\n )\n },\n })\n },\n getStream: (id) => {\n return this.serverStreams.get(id)\n },\n })\n\n const stream = new ProtocolServerStream({\n transform: (chunk, controller) => {\n const transformed = transformer.decodeRPCChunk(\n call.namespace,\n call.procedure,\n chunk,\n )\n controller.enqueue(transformed)\n },\n })\n\n const call = this.handleRpcStreamResponse(response, stream, transformer)\n }\n\n protected [ServerMessageType.RpcStreamChunk](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const callId = decodeNumber(buffer, 'Uint32')\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n const payload = this.format.decode(chunk)\n this.pushRpcStream(callId, payload)\n }\n\n protected [ServerMessageType.RpcStreamEnd](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const callId = decodeNumber(buffer, 'Uint32')\n this.endRpcStream(callId)\n }\n\n protected [ServerMessageType.RpcStreamAbort](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const callId = decodeNumber(buffer, 'Uint32')\n this.abortRpcStream(callId)\n }\n\n protected [ServerMessageType.ServerStreamPush](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n this.pushServerStream(streamId, chunk)\n transport.send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(streamId, 'Uint32'),\n { streamId },\n )\n }\n\n protected [ServerMessageType.ServerStreamEnd](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n this.endServerStream(streamId)\n }\n\n protected [ServerMessageType.ServerStreamAbort](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n this.abortServerStream(streamId)\n }\n\n protected [ServerMessageType.ClientStreamPull](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n const size = decodeNumber(buffer, 'Uint32', Uint32Array.BYTES_PER_ELEMENT)\n this.pullClientStream(streamId, size).then((chunk) => {\n if (chunk) {\n transport.send(\n ClientMessageType.ClientStreamPush,\n concat(encodeNumber(streamId, 'Uint32'), chunk),\n { streamId },\n )\n } else {\n transport.send(\n ClientMessageType.ClientStreamEnd,\n encodeNumber(streamId, 'Uint32'),\n { streamId },\n )\n this.endClientStream(streamId)\n }\n })\n }\n\n protected [ServerMessageType.ClientStreamAbort](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n this.abortClientStream(streamId)\n }\n}\n"],"version":3,"file":"protocol.js"}
1
+ {"mappings":"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","names":["code: string","message?: string","data?: any","#collection","streamId: number","source: ReadableStream","metadata: ProtocolBlobMetadata","error?: Error","size: number","stream: T","chunk: ArrayBuffer","namespace: string","procedure: string","payload: any","event: string","format: BaseClientFormat","callId: number","call: ProtocolClientCall","response: OneOf<\n [{ error: BaseProtocolError }, { result: any; stream?: any }]\n >","transformer: ProtocolBaseTransformer","stream?: ProtocolServerStream","response: ProtocolRPCResponse","stream: ProtocolServerStream","options: ProtocolBaseClientCallOptions","chunk: any","stream: ProtocolServerBlobStream","payload: string","buffer: ArrayBuffer","transport: ProtocolTransport"],"sources":["../../src/client/protocol.ts"],"sourcesContent":["import {\n createPromise,\n type InteractivePromise,\n type OneOf,\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 {\n BaseProtocolError,\n ProtocolRPC,\n ProtocolRPCResponse,\n} 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 implements BaseProtocolError {\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, error?: Error) {\n const stream = this.get(streamId)\n stream.abort(error)\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 T extends ProtocolServerStream = ProtocolServerStream,\n> {\n readonly #collection = new Map<number, T>()\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: T) {\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 connected: []\n disconnected: []\n}\n\nexport interface ProtocolSendMetadata {\n callId?: number\n streamId?: number\n}\n\nexport enum ProtocolTransportStatus {\n CONNECTED = 'CONNECTED',\n DISCONNECTED = 'DISCONNECTED',\n CONNECTING = 'CONNECTING',\n}\n\nexport abstract class ProtocolTransport extends EventEmitter<ProtocolTransportEventMap> {\n status: ProtocolTransportStatus = ProtocolTransportStatus.DISCONNECTED\n\n abstract connect(\n auth: any,\n transformer: ProtocolBaseTransformer,\n ): Promise<void>\n abstract disconnect(): Promise<void>\n abstract call(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions,\n transformer: ProtocolBaseTransformer,\n ): Promise<ProtocolClientCall>\n abstract send(\n messageType: ClientMessageType,\n buffer: ArrayBuffer,\n metadata: ProtocolSendMetadata,\n ): 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'> & { signal: AbortSignal }\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 class BaseProtocol<\n T extends Record<string, Record<string, any>> = Record<\n string,\n Record<string, any>\n >,\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 protected readonly clientStreams: ProtocolClientStreams =\n new ProtocolClientStreams()\n protected readonly serverStreams: ProtocolServerStreams<ProtocolServerBlobStream> =\n new ProtocolServerStreams()\n protected readonly rpcStreams: ProtocolServerStreams =\n new ProtocolServerStreams()\n protected readonly calls = new Map<number, ProtocolClientCall>()\n protected callId = 0\n protected streamId = 0\n\n constructor(public readonly format: BaseClientFormat) {\n super()\n }\n\n get contentType() {\n return this.format.contentType\n }\n\n handleCallResponse(\n callId: number,\n call: ProtocolClientCall,\n response: OneOf<\n [{ error: BaseProtocolError }, { result: any; stream?: any }]\n >,\n transformer: ProtocolBaseTransformer,\n ) {\n if (response.error) {\n call.reject(\n new ProtocolError(\n response.error.code,\n response.error.message,\n response.error.data,\n ),\n )\n } else {\n try {\n const transformed = transformer.decodeRPC(\n call.namespace,\n call.procedure,\n response.result,\n )\n if (response.stream)\n call.resolve({ result: transformed, stream: response.stream })\n else call.resolve(transformed)\n } catch (error) {\n call.reject(\n new ProtocolError(\n ErrorCode.ClientRequestError,\n 'Unable to decode response',\n error,\n ),\n )\n }\n }\n this.calls.delete(callId)\n }\n\n handleRpcResponse(\n { callId, error, result, streams }: ProtocolRPCResponse,\n transformer: ProtocolBaseTransformer,\n stream?: ProtocolServerStream,\n ) {\n const call = this.calls.get(callId)\n if (!call) throw new Error('Call not found')\n for (const key in streams) {\n const stream = streams[key]\n this.serverStreams.add(stream.id, stream)\n }\n this.handleCallResponse(\n callId,\n call,\n error ? { error } : { result, stream },\n transformer,\n )\n return call\n }\n\n handleRpcStreamResponse(\n response: ProtocolRPCResponse,\n stream: ProtocolServerStream,\n transformer: ProtocolBaseTransformer,\n ) {\n const call = this.handleRpcResponse(response, transformer, stream)\n this.rpcStreams.add(response.callId, stream)\n return call\n }\n\n createCall(\n namespace: string,\n procedure: string,\n options: ProtocolBaseClientCallOptions,\n ) {\n const timeoutSignal = AbortSignal.timeout(options.timeout)\n const signal = options.signal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : timeoutSignal\n\n const call = Object.assign(createPromise(), {\n namespace,\n procedure,\n signal,\n })\n\n timeoutSignal.addEventListener(\n 'abort',\n () => {\n const error = new ProtocolError(\n ErrorCode.RequestTimeout,\n 'Request timeout',\n )\n call.reject(error)\n },\n { once: true },\n )\n\n return call\n }\n\n createRpc(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions,\n transformer: ProtocolBaseTransformer,\n ) {\n const callId = ++this.callId\n const call = this.createCall(namespace, procedure, options)\n const { buffer, streams } = this.format.encodeRPC(\n {\n callId,\n namespace,\n procedure,\n payload: transformer.encodeRPC(namespace, procedure, payload),\n },\n {\n addStream: (blob) => {\n const streamId = ++this.streamId\n return this.clientStreams.add(blob.source, streamId, blob.metadata)\n },\n getStream: (id) => {\n const stream = this.clientStreams.get(id)\n return stream\n },\n },\n )\n\n this.calls.set(callId, call)\n\n return { callId, call, streams, buffer }\n }\n\n pushRpcStream(callId: number, chunk: any) {\n this.rpcStreams.push(callId, chunk)\n }\n\n endRpcStream(callId: number) {\n this.rpcStreams.end(callId)\n }\n\n abortRpcStream(callId: number) {\n this.rpcStreams.abort(callId)\n }\n\n removeClientStream(streamId: number) {\n this.clientStreams.remove(streamId)\n }\n\n pullClientStream(streamId: number, size: number) {\n return this.clientStreams.pull(streamId, size)\n }\n\n endClientStream(streamId: number) {\n this.clientStreams.end(streamId)\n }\n\n abortClientStream(streamId: number, error?: Error) {\n this.clientStreams.abort(streamId, error)\n }\n\n addServerStream(stream: ProtocolServerBlobStream) {\n this.serverStreams.add(stream.id, stream)\n }\n\n removeServerStream(streamId: number) {\n this.serverStreams.remove(streamId)\n }\n\n pushServerStream(streamId: number, chunk: ArrayBuffer) {\n return this.serverStreams.push(streamId, chunk)\n }\n\n endServerStream(streamId: number) {\n this.serverStreams.end(streamId)\n }\n\n abortServerStream(streamId: number, error?: Error) {\n this.serverStreams.abort(streamId)\n }\n\n emitEvent(\n namespace: string,\n event: string,\n payload: string,\n transformer: ProtocolBaseTransformer,\n ) {\n const transformed = transformer.decodeEvent(namespace, event, payload)\n this.emit(`${namespace}/${event}`, transformed)\n }\n}\n\nexport class Protocol<\n T extends Record<string, Record<string, any>> = Record<\n string,\n Record<string, any>\n >,\n> extends BaseProtocol<T> {\n handleServerMessage(\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const type = decodeNumber(buffer, 'Uint8')\n const messageBuffer = buffer.slice(Uint8Array.BYTES_PER_ELEMENT)\n if (type in ServerMessageType) {\n const messageType = type as ServerMessageType\n if (typeof ServerMessageType[messageType] !== 'undefined') {\n this[messageType](messageBuffer, transport, transformer)\n } else {\n throw new Error(`Unknown message type: ${messageType}`)\n }\n }\n }\n\n protected [ServerMessageType.Event](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const [namespace, event, payload] = this.format.decode(buffer)\n this.emitEvent(namespace, event, payload, transformer)\n }\n\n protected [ServerMessageType.RpcResponse](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const response = this.format.decodeRPC(buffer, {\n addStream: (id, callId, metadata) => {\n return new ProtocolServerBlobStream(id, metadata, {\n start: () => {\n transport.send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(id, 'Uint32'),\n { callId, streamId: id },\n )\n },\n })\n },\n getStream: (id) => {\n return this.serverStreams.get(id)\n },\n })\n this.handleRpcResponse(response, transformer)\n }\n\n protected [ServerMessageType.RpcStreamResponse](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const response = this.format.decodeRPC(buffer, {\n addStream: (id, callId, metadata) => {\n return new ProtocolServerBlobStream(id, metadata, {\n start: () => {\n transport.send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(id, 'Uint32'),\n { callId, streamId: id },\n )\n },\n })\n },\n getStream: (id) => {\n return this.serverStreams.get(id)\n },\n })\n\n const stream = new ProtocolServerStream({\n transform: (chunk, controller) => {\n const transformed = transformer.decodeRPCChunk(\n call.namespace,\n call.procedure,\n chunk,\n )\n controller.enqueue(transformed)\n },\n })\n\n const call = this.handleRpcStreamResponse(response, stream, transformer)\n }\n\n protected [ServerMessageType.RpcStreamChunk](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const callId = decodeNumber(buffer, 'Uint32')\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n const payload = this.format.decode(chunk)\n this.pushRpcStream(callId, payload)\n }\n\n protected [ServerMessageType.RpcStreamEnd](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const callId = decodeNumber(buffer, 'Uint32')\n this.endRpcStream(callId)\n }\n\n protected [ServerMessageType.RpcStreamAbort](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const callId = decodeNumber(buffer, 'Uint32')\n this.abortRpcStream(callId)\n }\n\n protected [ServerMessageType.ServerStreamPush](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n this.pushServerStream(streamId, chunk)\n transport.send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(streamId, 'Uint32'),\n { streamId },\n )\n }\n\n protected [ServerMessageType.ServerStreamEnd](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n this.endServerStream(streamId)\n }\n\n protected [ServerMessageType.ServerStreamAbort](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n this.abortServerStream(streamId)\n }\n\n protected [ServerMessageType.ClientStreamPull](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n const size = decodeNumber(buffer, 'Uint32', Uint32Array.BYTES_PER_ELEMENT)\n this.pullClientStream(streamId, size).then((chunk) => {\n if (chunk) {\n transport.send(\n ClientMessageType.ClientStreamPush,\n concat(encodeNumber(streamId, 'Uint32'), chunk),\n { streamId },\n )\n } else {\n transport.send(\n ClientMessageType.ClientStreamEnd,\n encodeNumber(streamId, 'Uint32'),\n { streamId },\n )\n this.endClientStream(streamId)\n }\n })\n }\n\n protected [ServerMessageType.ClientStreamAbort](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n this.abortClientStream(streamId)\n }\n}\n"],"version":3,"file":"protocol.js"}
@@ -1 +1 @@
1
- {"mappings":"AAEA,SAAS,yBAAyB,gBAAgB;AAmClD,OAAO,SAAS,iBACdA,OACwC;AACxC,QAAO,SAAS,MAAM,uBAAuB;AAC9C;AAED,OAAO,SAAS,qBACdC,UACA,SAAS,WACTC,UACqC;AACrC,QAAO;GACJ,oBAAoB;EACrB;EACA;EACA;CACD;AACF","names":["value: any","iterable: ProtocolAnyIterable<Y>","onFinish?: () => void"],"sources":["../../src/server/api.ts"],"sourcesContent":["import type { Container, Hook, MetadataStore } from '@nmtjs/core'\nimport type { Connection } from './connection.ts'\nimport { kIterableResponse } from './constants.ts'\n\nexport type ProtocolApiCallOptions = {\n connection: Connection\n namespace: string\n procedure: string\n container: Container\n payload: any\n signal: AbortSignal\n metadata?: (metadata: MetadataStore) => void\n}\n\nexport type ProtocolAnyIterable<T> =\n | ((signal: AbortSignal) => AsyncIterable<T>)\n | AsyncIterable<T>\n\nexport interface ProtocolApiCallBaseResult<T = unknown> {\n output: T\n}\n\nexport interface ProtocolApiCallIterableResult<Y = unknown, O = unknown>\n extends ProtocolApiCallBaseResult<O> {\n [kIterableResponse]: true\n iterable: ProtocolAnyIterable<Y>\n onFinish?: () => void\n}\n\nexport type ProtocolApiCallResult =\n | ProtocolApiCallBaseResult\n | ProtocolApiCallIterableResult\n\nexport interface ProtocolApi {\n call(options: ProtocolApiCallOptions): Promise<ProtocolApiCallResult>\n}\n\nexport function isIterableResult(\n value: any,\n): value is ProtocolApiCallIterableResult {\n return value && value[kIterableResponse] === true\n}\n\nexport function createStreamResponse<Y, O>(\n iterable: ProtocolAnyIterable<Y>,\n output = undefined as O,\n onFinish?: () => void,\n): ProtocolApiCallIterableResult<Y, O> {\n return {\n [kIterableResponse]: true as const,\n iterable,\n output,\n onFinish,\n }\n}\n\ndeclare module '@nmtjs/core' {\n export interface HookType {\n [Hook.OnConnect]: (connection: Connection) => any\n [Hook.OnDisconnect]: (connection: Connection) => any\n }\n}\n"],"version":3,"file":"api.js"}
1
+ {"mappings":"AAEA,SAAS,yBAAyB,gBAAgB;AAmClD,OAAO,SAAS,iBACdA,OACwC;AACxC,QAAO,SAAS,MAAM,uBAAuB;AAC9C;AAED,OAAO,SAAS,qBACdC,UACA,SAAS,WACTC,UACqC;AACrC,QAAO;GACJ,oBAAoB;EACrB;EACA;EACA;CACD;AACF","names":["value: ProtocolApiCallResult","iterable: ProtocolAnyIterable<Y>","onFinish?: () => void"],"sources":["../../src/server/api.ts"],"sourcesContent":["import type { Container, Hook, MetadataStore } from '@nmtjs/core'\nimport type { Connection } from './connection.ts'\nimport { kIterableResponse } from './constants.ts'\n\nexport type ProtocolApiCallOptions = {\n connection: Connection\n namespace: string\n procedure: string\n container: Container\n payload: any\n signal: AbortSignal\n metadata?: (metadata: MetadataStore) => void\n}\n\nexport type ProtocolAnyIterable<T> =\n | ((signal: AbortSignal) => AsyncIterable<T>)\n | AsyncIterable<T>\n\nexport interface ProtocolApiCallBaseResult<T = unknown> {\n output: T\n}\n\nexport interface ProtocolApiCallIterableResult<Y = unknown, O = unknown>\n extends ProtocolApiCallBaseResult<O> {\n [kIterableResponse]: true\n iterable: ProtocolAnyIterable<Y>\n onFinish?: () => void\n}\n\nexport type ProtocolApiCallResult =\n | ProtocolApiCallBaseResult\n | ProtocolApiCallIterableResult\n\nexport interface ProtocolApi {\n call(options: ProtocolApiCallOptions): Promise<ProtocolApiCallResult>\n}\n\nexport function isIterableResult(\n value: ProtocolApiCallResult,\n): value is ProtocolApiCallIterableResult {\n return value && value[kIterableResponse] === true\n}\n\nexport function createStreamResponse<Y, O>(\n iterable: ProtocolAnyIterable<Y>,\n output = undefined as O,\n onFinish?: () => void,\n): ProtocolApiCallIterableResult<Y, O> {\n return {\n [kIterableResponse]: true as const,\n iterable,\n output,\n onFinish,\n }\n}\n\ndeclare module '@nmtjs/core' {\n export interface HookType {\n [Hook.OnConnect]: (connection: Connection) => any\n [Hook.OnDisconnect]: (connection: Connection) => any\n }\n}\n"],"version":3,"file":"api.js"}
@@ -9,7 +9,7 @@ export class Connection {
9
9
  }
10
10
  export class ConnectionContext {
11
11
  streamId = 1;
12
- calls = new Map();
12
+ rpcs = new Map();
13
13
  clientStreams = new Map();
14
14
  serverStreams = new Map();
15
15
  rpcStreams = new Map();
@@ -1 +1 @@
1
- {"mappings":"AAAA,SAAS,kBAAkB,aAAa;AAUxC,OAAO,MAAM,WAA2B;CACtC,AAAS;CACT,AAAS;CAET,YAAYA,SAAkC;AAC5C,OAAK,KAAK,QAAQ,MAAM,YAAY;AACpC,OAAK,OAAO,QAAQ;CACrB;AACF;AAED,OAAO,MAAM,kBAAkB;CAC7B,WAAW;CACX,QAAQ,IAAI;CACZ,gBAAgB,IAAI;CACpB,gBAAgB,IAAI;CACpB,aAAa,IAAI;CACjB;CACA;CAKA,YACEC,WACAC,QACA;AACA,OAAK,YAAY;AACjB,OAAK,SAAS;CACf;AACF","names":["options: ConnectionOptions<Data>","container: ConnectionContext['container']","format: ConnectionContext['format']"],"sources":["../../src/server/connection.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\nimport type { Container } from '@nmtjs/core'\nimport type { BaseServerDecoder, BaseServerEncoder } from './format.ts'\nimport type { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\n\nexport type ConnectionOptions<Data = unknown> = {\n id?: string\n data: Data\n}\n\nexport class Connection<Data = unknown> {\n readonly id: string\n readonly data: Data\n\n constructor(options: ConnectionOptions<Data>) {\n this.id = options.id ?? randomUUID()\n this.data = options.data\n }\n}\n\nexport class ConnectionContext {\n streamId = 1\n calls = new Map<number, AbortController>()\n clientStreams = new Map<number, ProtocolClientStream>()\n serverStreams = new Map<number, ProtocolServerStream>()\n rpcStreams = new Map<number, AbortController>()\n container: Container\n format: {\n encoder: BaseServerEncoder\n decoder: BaseServerDecoder\n }\n\n constructor(\n container: ConnectionContext['container'],\n format: ConnectionContext['format'],\n ) {\n this.container = container\n this.format = format\n }\n}\n"],"version":3,"file":"connection.js"}
1
+ {"mappings":"AAAA,SAAS,kBAAkB,aAAa;AAUxC,OAAO,MAAM,WAA2B;CACtC,AAAS;CACT,AAAS;CAET,YAAYA,SAAkC;AAC5C,OAAK,KAAK,QAAQ,MAAM,YAAY;AACpC,OAAK,OAAO,QAAQ;CACrB;AACF;AAED,OAAO,MAAM,kBAAkB;CAC7B,WAAW;CACX,OAAO,IAAI;CACX,gBAAgB,IAAI;CACpB,gBAAgB,IAAI;CACpB,aAAa,IAAI;CACjB;CACA;CAKA,YACEC,WACAC,QACA;AACA,OAAK,YAAY;AACjB,OAAK,SAAS;CACf;AACF","names":["options: ConnectionOptions<Data>","container: ConnectionContext['container']","format: ConnectionContext['format']"],"sources":["../../src/server/connection.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\nimport type { Container } from '@nmtjs/core'\nimport type { BaseServerDecoder, BaseServerEncoder } from './format.ts'\nimport type { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\n\nexport type ConnectionOptions<Data = unknown> = {\n id?: string\n data: Data\n}\n\nexport class Connection<Data = unknown> {\n readonly id: string\n readonly data: Data\n\n constructor(options: ConnectionOptions<Data>) {\n this.id = options.id ?? randomUUID()\n this.data = options.data\n }\n}\n\nexport class ConnectionContext {\n streamId = 1\n rpcs = new Map<number, AbortController>()\n clientStreams = new Map<number, ProtocolClientStream>()\n serverStreams = new Map<number, ProtocolServerStream>()\n rpcStreams = new Map<number, AbortController>()\n container: Container\n format: {\n encoder: BaseServerEncoder\n decoder: BaseServerDecoder\n }\n\n constructor(\n container: ConnectionContext['container'],\n format: ConnectionContext['format'],\n ) {\n this.container = container\n this.format = format\n }\n}\n"],"version":3,"file":"connection.js"}
@@ -70,8 +70,8 @@ export class ProtocolConnections {
70
70
  const { connection, context } = this.get(connectionId);
71
71
  this.application.registry.hooks.call(Hook.OnDisconnect, { concurrent: true }, connection);
72
72
  this.#collection.delete(connectionId);
73
- const { calls, serverStreams, clientStreams, rpcStreams, container } = context;
74
- for (const call of calls.values()) {
73
+ const { rpcs, serverStreams, clientStreams, rpcStreams, container } = context;
74
+ for (const call of rpcs.values()) {
75
75
  call.abort(new Error("Connection closed"));
76
76
  }
77
77
  for (const stream of clientStreams.values()) {
@@ -201,11 +201,11 @@ export class Protocol {
201
201
  }
202
202
  async rpc(connectionId, rpc, params = {}) {
203
203
  const { connection, context, transport } = this.#connections.get(connectionId);
204
- const { calls, format } = context;
204
+ const { rpcs, format } = context;
205
205
  const { callId, namespace, procedure, payload } = rpc;
206
206
  const abortController = new AbortController();
207
207
  const signal = params.signal ? AbortSignal.any([params.signal, abortController.signal]) : abortController.signal;
208
- calls.set(callId, abortController);
208
+ rpcs.set(callId, abortController);
209
209
  const callIdEncoded = encodeNumber(callId, "Uint32");
210
210
  const container = context.container.fork(Scope.Call);
211
211
  if (params.provides) {
@@ -301,7 +301,7 @@ export class Protocol {
301
301
  callId
302
302
  });
303
303
  } finally {
304
- calls.delete(callId);
304
+ rpcs.delete(callId);
305
305
  container.dispose().catch((error) => {
306
306
  this.application.logger.error({
307
307
  error,
@@ -330,7 +330,7 @@ export class Protocol {
330
330
  }
331
331
  rpcAbort(connectionId, callId) {
332
332
  const { context } = this.#connections.get(connectionId);
333
- const call = context.calls.get(callId) ?? throwError("Call not found");
333
+ const call = context.rpcs.get(callId) ?? throwError("Call not found");
334
334
  call.abort();
335
335
  }
336
336
  rpcAbortRaw(connectionId, buffer) {
@@ -1 +1 @@
1
- {"mappings":"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","names":["code: string","message?: string","data?: any","#collection","application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n }","connectionId: string","transport: ProtocolConnectionTransport","options: ConnectionOptions<T>","params: ResolveFormatParams","connection: Connection","connections: ProtocolConnections","streamId: number","metadata: ProtocolBlobMetadata","read: Callback","chunk: ArrayBuffer","blob: ProtocolBlob","application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n }","#connections","#clientStreams","#serverStreams","options: ProtocolApiCallOptions","rpc: ProtocolRPC","params: ProtocolRPCOptions","buffer: ArrayBuffer","callId: number","options: ConnectionOptions","error?: Error"],"sources":["../../src/server/protocol.ts"],"sourcesContent":["import { type Callback, defer, isAbortError, throwError } from '@nmtjs/common'\nimport {\n type AnyInjectable,\n type Container,\n Hook,\n type Logger,\n Scope,\n} from '@nmtjs/core'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlob, ProtocolBlobMetadata } from '../common/blob.ts'\nimport { ErrorCode, ServerMessageType } from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport {\n isIterableResult,\n type ProtocolApi,\n type ProtocolApiCallOptions,\n} from './api.ts'\nimport {\n Connection,\n ConnectionContext,\n type ConnectionOptions,\n} from './connection.ts'\nimport type { Format } from './format.ts'\nimport { ProtocolInjectables } from './injectables.ts'\nimport type { ProtocolRegistry } from './registry.ts'\nimport { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\nimport type { Transport } from './transport.ts'\nimport { getFormat, type ResolveFormatParams } from './utils.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 type ProtocolConnectionTransport = {\n send: Transport<any>['send']\n}\n\nexport class ProtocolConnections {\n readonly #collection = new Map<\n string,\n {\n connection: Connection\n context: ConnectionContext\n transport: ProtocolConnectionTransport\n }\n >()\n\n constructor(\n private readonly application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n },\n ) {}\n\n get(connectionId: string) {\n const connection = this.#collection.get(connectionId)\n if (!connection) throwError('Connection not found')\n return connection\n }\n\n async add<T>(\n transport: ProtocolConnectionTransport,\n options: ConnectionOptions<T>,\n params: ResolveFormatParams,\n ) {\n const connection = new Connection(options)\n const format = getFormat(this.application.format, params)\n const container = this.application.container.fork(Scope.Connection)\n const context = new ConnectionContext(container, format)\n container.provide(ProtocolInjectables.connection, connection)\n try {\n await this.initialize(connection)\n this.#collection.set(connection.id, { connection, context, transport })\n return { connection, context }\n } catch (error) {\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n 'Error during disposing connection',\n )\n })\n throw error\n }\n }\n\n async remove(connectionId: string) {\n const { connection, context } = this.get(connectionId)\n\n this.application.registry.hooks.call(\n Hook.OnDisconnect,\n { concurrent: true },\n connection,\n )\n\n this.#collection.delete(connectionId)\n\n const { calls, serverStreams, clientStreams, rpcStreams, container } =\n context\n\n for (const call of calls.values()) {\n call.abort(new Error('Connection closed'))\n }\n\n for (const stream of clientStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of serverStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of rpcStreams.values()) {\n stream.abort(new Error('Connection closed'))\n }\n\n try {\n await container.dispose()\n } catch (error) {\n this.application.logger.error(\n { error, connection },\n 'Error during closing connection',\n )\n }\n }\n\n async initialize(connection: Connection) {\n await this.application.registry.hooks.call(\n Hook.OnConnect,\n { concurrent: false },\n connection,\n )\n }\n}\n\nexport class ProtocolClientStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = clientStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n clientStreams.get(streamId) || throwError('Stream not found')\n clientStreams.delete(streamId)\n }\n\n add(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = new ProtocolClientStream(streamId, metadata, { read })\n clientStreams.set(streamId, stream)\n return stream\n }\n\n push(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(connectionId, streamId)\n stream.write(Buffer.from(chunk))\n }\n\n end(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.end(null)\n this.remove(connectionId, streamId)\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport class ProtocolServerStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = serverStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n add(connectionId: string, streamId: number, blob: ProtocolBlob) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = new ProtocolServerStream(streamId, blob)\n serverStreams.set(streamId, stream)\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n serverStreams.has(streamId) || throwError('Stream not found')\n serverStreams.delete(streamId)\n }\n\n pull(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.resume()\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport type ProtocolRPCOptions = {\n signal?: AbortSignal\n provides?: [AnyInjectable, any][]\n metadata?: ProtocolApiCallOptions['metadata']\n}\n\nexport class Protocol {\n #connections: ProtocolConnections\n #clientStreams: ProtocolClientStreams\n #serverStreams: ProtocolServerStreams\n\n constructor(\n protected readonly application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n },\n ) {\n this.#connections = new ProtocolConnections(this.application)\n this.#clientStreams = new ProtocolClientStreams(this.#connections)\n this.#serverStreams = new ProtocolServerStreams(this.#connections)\n }\n\n async call(options: ProtocolApiCallOptions) {\n const { container, connection } = options\n try {\n return await this.application.api.call(options)\n } catch (error) {\n if (error instanceof ProtocolError === false) {\n this.application.logger.error(\n { error, connection },\n 'Error during RPC call',\n )\n throw new ProtocolError(\n ErrorCode.InternalServerError,\n 'Internal server error',\n )\n }\n throw error\n } finally {\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n \"Error during disposing connection's container\",\n )\n })\n }\n }\n\n async rpc(\n connectionId: string,\n rpc: ProtocolRPC,\n params: ProtocolRPCOptions = {},\n ) {\n const { connection, context, transport } =\n this.#connections.get(connectionId)\n const { calls, format } = context\n const { callId, namespace, procedure, payload } = rpc\n const abortController = new AbortController()\n const signal = params.signal\n ? AbortSignal.any([params.signal, abortController.signal])\n : abortController.signal\n\n calls.set(callId, abortController)\n\n const callIdEncoded = encodeNumber(callId, 'Uint32')\n const container = context.container.fork(Scope.Call)\n\n if (params.provides) {\n for (const [key, value] of params.provides) {\n container.provide(key, value)\n }\n }\n\n try {\n const response = await this.call({\n connection,\n container,\n namespace,\n payload,\n procedure,\n signal,\n metadata: params.metadata,\n })\n\n const responseEncoded = format.encoder.encodeRPC(\n {\n callId,\n result: response.output,\n },\n {\n addStream: (blob) => {\n const streamId = context.streamId++\n const stream = this.#serverStreams.add(connectionId, streamId, blob)\n stream.on('data', (chunk) => {\n stream.pause()\n const buf = Buffer.from(chunk)\n transport.send(\n connection,\n ServerMessageType.ServerStreamPush,\n concat(\n encodeNumber(streamId, 'Uint32'),\n (buf.buffer as ArrayBuffer).slice(\n buf.byteOffset,\n buf.byteOffset + buf.byteLength,\n ),\n ),\n { callId, streamId },\n )\n })\n stream.on('error', (err) => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamAbort,\n encodeNumber(streamId, 'Uint32'),\n { callId, streamId },\n )\n })\n stream.on('end', () => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamEnd,\n encodeNumber(streamId, 'Uint32'),\n { callId, streamId },\n )\n })\n return stream\n },\n getStream: (id) => {\n return this.#serverStreams.get(connectionId, id)\n },\n },\n )\n\n if (isIterableResult(response)) {\n transport.send(\n connection,\n ServerMessageType.RpcStreamResponse,\n responseEncoded,\n { callId },\n )\n try {\n const controller = new AbortController()\n context.rpcStreams.set(callId, controller)\n const iterable =\n typeof response.iterable === 'function'\n ? response.iterable(controller.signal)\n : response.iterable\n try {\n for await (const chunk of iterable) {\n controller.signal.throwIfAborted()\n const chunkEncoded = format.encoder.encode(chunk)\n transport.send(\n connection,\n ServerMessageType.RpcStreamChunk,\n concat(callIdEncoded, chunkEncoded),\n { callId },\n )\n }\n transport.send(\n connection,\n ServerMessageType.RpcStreamEnd,\n callIdEncoded,\n { callId },\n )\n } catch (error) {\n // do not re-throw AbortError errors, they are expected\n if (!isAbortError(error)) {\n throw error\n }\n }\n } catch (error) {\n this.application.logger.error(error)\n transport.send(\n connection,\n ServerMessageType.RpcStreamAbort,\n callIdEncoded,\n { callId },\n )\n } finally {\n context.rpcStreams.delete(callId)\n response.onFinish && defer(response.onFinish)\n }\n } else {\n transport.send(\n connection,\n ServerMessageType.RpcResponse,\n responseEncoded,\n { callId },\n )\n }\n } catch (error) {\n const payload = format.encoder.encodeRPC(\n { callId, error },\n {\n addStream(blob) {\n throwError('Cannot handle stream for error response')\n },\n getStream(id) {\n throwError('Cannot handle stream for error response')\n },\n },\n )\n\n transport.send(connection, ServerMessageType.RpcResponse, payload, {\n error,\n callId,\n })\n } finally {\n calls.delete(callId)\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n 'Error during disposing connection',\n )\n })\n }\n }\n\n async rpcRaw(\n connectionId: string,\n buffer: ArrayBuffer,\n params: ProtocolRPCOptions = {},\n ) {\n const { connection, context, transport } =\n this.#connections.get(connectionId)\n\n const { format } = context\n\n const rpc = format.decoder.decodeRPC(buffer, {\n addStream: (streamId, callId, metadata) => {\n return this.#clientStreams.add(\n connectionId,\n streamId,\n metadata,\n (size) => {\n transport.send(\n connection,\n ServerMessageType.ClientStreamPull,\n concat(\n encodeNumber(streamId, 'Uint32'),\n encodeNumber(size, 'Uint32'),\n ),\n { callId, streamId },\n )\n },\n )\n },\n getStream: (id) => {\n return this.#clientStreams.get(connectionId, id)\n },\n })\n\n return await this.rpc(connectionId, rpc, params)\n }\n\n rpcAbort(connectionId: string, callId: number) {\n const { context } = this.#connections.get(connectionId)\n const call = context.calls.get(callId) ?? throwError('Call not found')\n call.abort()\n }\n\n rpcAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcAbort(connectionId, callId)\n }\n\n rpcStreamAbort(connectionId: string, callId: number) {\n const { context } = this.#connections.get(connectionId)\n const ab =\n context.rpcStreams.get(callId) ?? throwError('Call stream not found')\n ab.abort()\n }\n\n rpcStreamAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcStreamAbort(connectionId, callId)\n }\n\n notify(connectionId: string, event, payload) {\n throw Error('Unimplemented')\n }\n\n addConnection(\n transport: ProtocolConnectionTransport,\n options: ConnectionOptions,\n params: ResolveFormatParams,\n ) {\n return this.#connections.add(transport, options, params)\n }\n\n removeConnection(connectionId: string) {\n return this.#connections.remove(connectionId)\n }\n\n getConnection(connectionId: string) {\n return this.#connections.get(connectionId)\n }\n\n initializeConnection(connection: Connection) {\n return this.#connections.initialize(connection)\n }\n\n getClientStream(\n connectionId: string,\n streamId: number,\n ): ProtocolClientStream {\n return this.#clientStreams.get(connectionId, streamId)\n }\n\n addClientStream(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n return this.#clientStreams.add(connectionId, streamId, metadata, read)\n }\n\n removeClientStream(connectionId: string, streamId: number) {\n return this.#clientStreams.remove(connectionId, streamId)\n }\n\n pushClientStream(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n return this.#clientStreams.push(connectionId, streamId, chunk)\n }\n\n endClientStream(connectionId: string, streamId: number) {\n return this.#clientStreams.end(connectionId, streamId)\n }\n\n abortClientStream(connectionId: string, streamId: number, error?: Error) {\n return this.#clientStreams.abort(connectionId, streamId, error)\n }\n\n getServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.get(connectionId, streamId)\n }\n\n addServerStream(connectionId: string, streamId: number, blob: ProtocolBlob) {\n return this.#serverStreams.add(connectionId, streamId, blob)\n }\n\n removeServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.remove(connectionId, streamId)\n }\n\n pullServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.pull(connectionId, streamId)\n }\n\n abortServerStream(connectionId: string, streamId: number, error?: Error) {\n return this.#serverStreams.abort(connectionId, streamId, error)\n }\n}\n"],"version":3,"file":"protocol.js"}
1
+ {"mappings":"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","names":["code: string","message?: string","data?: any","#collection","application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n }","connectionId: string","transport: ProtocolConnectionTransport","options: ConnectionOptions<T>","params: ResolveFormatParams","connection: Connection","connections: ProtocolConnections","streamId: number","metadata: ProtocolBlobMetadata","read: Callback","chunk: ArrayBuffer","blob: ProtocolBlob","application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n }","#connections","#clientStreams","#serverStreams","options: ProtocolApiCallOptions","rpc: ProtocolRPC","params: ProtocolRPCOptions","buffer: ArrayBuffer","callId: number","options: ConnectionOptions","error?: Error"],"sources":["../../src/server/protocol.ts"],"sourcesContent":["import { type Callback, defer, isAbortError, throwError } from '@nmtjs/common'\nimport {\n type AnyInjectable,\n type Container,\n Hook,\n type Logger,\n Scope,\n} from '@nmtjs/core'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlob, ProtocolBlobMetadata } from '../common/blob.ts'\nimport { ErrorCode, ServerMessageType } from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport {\n isIterableResult,\n type ProtocolApi,\n type ProtocolApiCallOptions,\n} from './api.ts'\nimport {\n Connection,\n ConnectionContext,\n type ConnectionOptions,\n} from './connection.ts'\nimport type { Format } from './format.ts'\nimport { ProtocolInjectables } from './injectables.ts'\nimport type { ProtocolRegistry } from './registry.ts'\nimport { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\nimport type { Transport } from './transport.ts'\nimport { getFormat, type ResolveFormatParams } from './utils.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 type ProtocolConnectionTransport = {\n send: Transport<any>['send']\n}\n\nexport class ProtocolConnections {\n readonly #collection = new Map<\n string,\n {\n connection: Connection\n context: ConnectionContext\n transport: ProtocolConnectionTransport\n }\n >()\n\n constructor(\n private readonly application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n },\n ) {}\n\n get(connectionId: string) {\n const connection = this.#collection.get(connectionId)\n if (!connection) throwError('Connection not found')\n return connection\n }\n\n async add<T>(\n transport: ProtocolConnectionTransport,\n options: ConnectionOptions<T>,\n params: ResolveFormatParams,\n ) {\n const connection = new Connection(options)\n const format = getFormat(this.application.format, params)\n const container = this.application.container.fork(Scope.Connection)\n const context = new ConnectionContext(container, format)\n container.provide(ProtocolInjectables.connection, connection)\n try {\n await this.initialize(connection)\n this.#collection.set(connection.id, { connection, context, transport })\n return { connection, context }\n } catch (error) {\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n 'Error during disposing connection',\n )\n })\n throw error\n }\n }\n\n async remove(connectionId: string) {\n const { connection, context } = this.get(connectionId)\n\n this.application.registry.hooks.call(\n Hook.OnDisconnect,\n { concurrent: true },\n connection,\n )\n\n this.#collection.delete(connectionId)\n\n const { rpcs, serverStreams, clientStreams, rpcStreams, container } =\n context\n\n for (const call of rpcs.values()) {\n call.abort(new Error('Connection closed'))\n }\n\n for (const stream of clientStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of serverStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of rpcStreams.values()) {\n stream.abort(new Error('Connection closed'))\n }\n\n try {\n await container.dispose()\n } catch (error) {\n this.application.logger.error(\n { error, connection },\n 'Error during closing connection',\n )\n }\n }\n\n async initialize(connection: Connection) {\n await this.application.registry.hooks.call(\n Hook.OnConnect,\n { concurrent: false },\n connection,\n )\n }\n}\n\nexport class ProtocolClientStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = clientStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n clientStreams.get(streamId) || throwError('Stream not found')\n clientStreams.delete(streamId)\n }\n\n add(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = new ProtocolClientStream(streamId, metadata, { read })\n clientStreams.set(streamId, stream)\n return stream\n }\n\n push(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(connectionId, streamId)\n stream.write(Buffer.from(chunk))\n }\n\n end(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.end(null)\n this.remove(connectionId, streamId)\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport class ProtocolServerStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = serverStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n add(connectionId: string, streamId: number, blob: ProtocolBlob) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = new ProtocolServerStream(streamId, blob)\n serverStreams.set(streamId, stream)\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n serverStreams.has(streamId) || throwError('Stream not found')\n serverStreams.delete(streamId)\n }\n\n pull(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.resume()\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport type ProtocolRPCOptions = {\n signal?: AbortSignal\n provides?: [AnyInjectable, any][]\n metadata?: ProtocolApiCallOptions['metadata']\n}\n\nexport class Protocol {\n #connections: ProtocolConnections\n #clientStreams: ProtocolClientStreams\n #serverStreams: ProtocolServerStreams\n\n constructor(\n protected readonly application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n },\n ) {\n this.#connections = new ProtocolConnections(this.application)\n this.#clientStreams = new ProtocolClientStreams(this.#connections)\n this.#serverStreams = new ProtocolServerStreams(this.#connections)\n }\n\n async call(options: ProtocolApiCallOptions) {\n const { container, connection } = options\n try {\n return await this.application.api.call(options)\n } catch (error) {\n if (error instanceof ProtocolError === false) {\n this.application.logger.error(\n { error, connection },\n 'Error during RPC call',\n )\n throw new ProtocolError(\n ErrorCode.InternalServerError,\n 'Internal server error',\n )\n }\n throw error\n } finally {\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n \"Error during disposing connection's container\",\n )\n })\n }\n }\n\n async rpc(\n connectionId: string,\n rpc: ProtocolRPC,\n params: ProtocolRPCOptions = {},\n ) {\n const { connection, context, transport } =\n this.#connections.get(connectionId)\n const { rpcs, format } = context\n const { callId, namespace, procedure, payload } = rpc\n const abortController = new AbortController()\n const signal = params.signal\n ? AbortSignal.any([params.signal, abortController.signal])\n : abortController.signal\n\n rpcs.set(callId, abortController)\n\n const callIdEncoded = encodeNumber(callId, 'Uint32')\n const container = context.container.fork(Scope.Call)\n\n if (params.provides) {\n for (const [key, value] of params.provides) {\n container.provide(key, value)\n }\n }\n\n try {\n const response = await this.call({\n connection,\n container,\n namespace,\n payload,\n procedure,\n signal,\n metadata: params.metadata,\n })\n\n const responseEncoded = format.encoder.encodeRPC(\n {\n callId,\n result: response.output,\n },\n {\n addStream: (blob) => {\n const streamId = context.streamId++\n const stream = this.#serverStreams.add(connectionId, streamId, blob)\n stream.on('data', (chunk) => {\n stream.pause()\n const buf = Buffer.from(chunk)\n transport.send(\n connection,\n ServerMessageType.ServerStreamPush,\n concat(\n encodeNumber(streamId, 'Uint32'),\n (buf.buffer as ArrayBuffer).slice(\n buf.byteOffset,\n buf.byteOffset + buf.byteLength,\n ),\n ),\n { callId, streamId },\n )\n })\n stream.on('error', (err) => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamAbort,\n encodeNumber(streamId, 'Uint32'),\n { callId, streamId },\n )\n })\n stream.on('end', () => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamEnd,\n encodeNumber(streamId, 'Uint32'),\n { callId, streamId },\n )\n })\n return stream\n },\n getStream: (id) => {\n return this.#serverStreams.get(connectionId, id)\n },\n },\n )\n\n if (isIterableResult(response)) {\n transport.send(\n connection,\n ServerMessageType.RpcStreamResponse,\n responseEncoded,\n { callId },\n )\n try {\n const controller = new AbortController()\n context.rpcStreams.set(callId, controller)\n const iterable =\n typeof response.iterable === 'function'\n ? response.iterable(controller.signal)\n : response.iterable\n try {\n for await (const chunk of iterable) {\n controller.signal.throwIfAborted()\n const chunkEncoded = format.encoder.encode(chunk)\n transport.send(\n connection,\n ServerMessageType.RpcStreamChunk,\n concat(callIdEncoded, chunkEncoded),\n { callId },\n )\n }\n transport.send(\n connection,\n ServerMessageType.RpcStreamEnd,\n callIdEncoded,\n { callId },\n )\n } catch (error) {\n // do not re-throw AbortError errors, they are expected\n if (!isAbortError(error)) {\n throw error\n }\n }\n } catch (error) {\n this.application.logger.error(error)\n transport.send(\n connection,\n ServerMessageType.RpcStreamAbort,\n callIdEncoded,\n { callId },\n )\n } finally {\n context.rpcStreams.delete(callId)\n response.onFinish && defer(response.onFinish)\n }\n } else {\n transport.send(\n connection,\n ServerMessageType.RpcResponse,\n responseEncoded,\n { callId },\n )\n }\n } catch (error) {\n const payload = format.encoder.encodeRPC(\n { callId, error },\n {\n addStream(blob) {\n throwError('Cannot handle stream for error response')\n },\n getStream(id) {\n throwError('Cannot handle stream for error response')\n },\n },\n )\n\n transport.send(connection, ServerMessageType.RpcResponse, payload, {\n error,\n callId,\n })\n } finally {\n rpcs.delete(callId)\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n 'Error during disposing connection',\n )\n })\n }\n }\n\n async rpcRaw(\n connectionId: string,\n buffer: ArrayBuffer,\n params: ProtocolRPCOptions = {},\n ) {\n const { connection, context, transport } =\n this.#connections.get(connectionId)\n\n const { format } = context\n\n const rpc = format.decoder.decodeRPC(buffer, {\n addStream: (streamId, callId, metadata) => {\n return this.#clientStreams.add(\n connectionId,\n streamId,\n metadata,\n (size) => {\n transport.send(\n connection,\n ServerMessageType.ClientStreamPull,\n concat(\n encodeNumber(streamId, 'Uint32'),\n encodeNumber(size, 'Uint32'),\n ),\n { callId, streamId },\n )\n },\n )\n },\n getStream: (id) => {\n return this.#clientStreams.get(connectionId, id)\n },\n })\n\n return await this.rpc(connectionId, rpc, params)\n }\n\n rpcAbort(connectionId: string, callId: number) {\n const { context } = this.#connections.get(connectionId)\n const call = context.rpcs.get(callId) ?? throwError('Call not found')\n call.abort()\n }\n\n rpcAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcAbort(connectionId, callId)\n }\n\n rpcStreamAbort(connectionId: string, callId: number) {\n const { context } = this.#connections.get(connectionId)\n const ab =\n context.rpcStreams.get(callId) ?? throwError('Call stream not found')\n ab.abort()\n }\n\n rpcStreamAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcStreamAbort(connectionId, callId)\n }\n\n notify(connectionId: string, event, payload) {\n throw Error('Unimplemented')\n }\n\n addConnection(\n transport: ProtocolConnectionTransport,\n options: ConnectionOptions,\n params: ResolveFormatParams,\n ) {\n return this.#connections.add(transport, options, params)\n }\n\n removeConnection(connectionId: string) {\n return this.#connections.remove(connectionId)\n }\n\n getConnection(connectionId: string) {\n return this.#connections.get(connectionId)\n }\n\n initializeConnection(connection: Connection) {\n return this.#connections.initialize(connection)\n }\n\n getClientStream(\n connectionId: string,\n streamId: number,\n ): ProtocolClientStream {\n return this.#clientStreams.get(connectionId, streamId)\n }\n\n addClientStream(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n return this.#clientStreams.add(connectionId, streamId, metadata, read)\n }\n\n removeClientStream(connectionId: string, streamId: number) {\n return this.#clientStreams.remove(connectionId, streamId)\n }\n\n pushClientStream(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n return this.#clientStreams.push(connectionId, streamId, chunk)\n }\n\n endClientStream(connectionId: string, streamId: number) {\n return this.#clientStreams.end(connectionId, streamId)\n }\n\n abortClientStream(connectionId: string, streamId: number, error?: Error) {\n return this.#clientStreams.abort(connectionId, streamId, error)\n }\n\n getServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.get(connectionId, streamId)\n }\n\n addServerStream(connectionId: string, streamId: number, blob: ProtocolBlob) {\n return this.#serverStreams.add(connectionId, streamId, blob)\n }\n\n removeServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.remove(connectionId, streamId)\n }\n\n pullServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.pull(connectionId, streamId)\n }\n\n abortServerStream(connectionId: string, streamId: number, error?: Error) {\n return this.#serverStreams.abort(connectionId, streamId, error)\n }\n}\n"],"version":3,"file":"protocol.js"}
package/package.json CHANGED
@@ -16,14 +16,14 @@
16
16
  }
17
17
  },
18
18
  "dependencies": {
19
- "@nmtjs/type": "0.12.1",
20
- "@nmtjs/common": "0.12.1",
21
- "@nmtjs/core": "0.12.1"
19
+ "@nmtjs/core": "0.12.4",
20
+ "@nmtjs/common": "0.12.4",
21
+ "@nmtjs/type": "0.12.4"
22
22
  },
23
23
  "peerDependencies": {
24
- "@nmtjs/common": "0.12.1",
25
- "@nmtjs/type": "0.12.1",
26
- "@nmtjs/core": "0.12.1"
24
+ "@nmtjs/common": "0.12.4",
25
+ "@nmtjs/type": "0.12.4",
26
+ "@nmtjs/core": "0.12.4"
27
27
  },
28
28
  "files": [
29
29
  "src",
@@ -31,7 +31,7 @@
31
31
  "LICENSE.md",
32
32
  "README.md"
33
33
  ],
34
- "version": "0.12.1",
34
+ "version": "0.12.4",
35
35
  "scripts": {
36
36
  "build": "neemata-build --root=./src './**/*.ts'",
37
37
  "type-check": "tsc --noEmit"
@@ -162,7 +162,15 @@ export interface ProtocolSendMetadata {
162
162
  streamId?: number
163
163
  }
164
164
 
165
+ export enum ProtocolTransportStatus {
166
+ CONNECTED = 'CONNECTED',
167
+ DISCONNECTED = 'DISCONNECTED',
168
+ CONNECTING = 'CONNECTING',
169
+ }
170
+
165
171
  export abstract class ProtocolTransport extends EventEmitter<ProtocolTransportEventMap> {
172
+ status: ProtocolTransportStatus = ProtocolTransportStatus.DISCONNECTED
173
+
166
174
  abstract connect(
167
175
  auth: any,
168
176
  transformer: ProtocolBaseTransformer,
package/src/server/api.ts CHANGED
@@ -36,7 +36,7 @@ export interface ProtocolApi {
36
36
  }
37
37
 
38
38
  export function isIterableResult(
39
- value: any,
39
+ value: ProtocolApiCallResult,
40
40
  ): value is ProtocolApiCallIterableResult {
41
41
  return value && value[kIterableResponse] === true
42
42
  }
@@ -20,7 +20,7 @@ export class Connection<Data = unknown> {
20
20
 
21
21
  export class ConnectionContext {
22
22
  streamId = 1
23
- calls = new Map<number, AbortController>()
23
+ rpcs = new Map<number, AbortController>()
24
24
  clientStreams = new Map<number, ProtocolClientStream>()
25
25
  serverStreams = new Map<number, ProtocolServerStream>()
26
26
  rpcStreams = new Map<number, AbortController>()
@@ -119,10 +119,10 @@ export class ProtocolConnections {
119
119
 
120
120
  this.#collection.delete(connectionId)
121
121
 
122
- const { calls, serverStreams, clientStreams, rpcStreams, container } =
122
+ const { rpcs, serverStreams, clientStreams, rpcStreams, container } =
123
123
  context
124
124
 
125
- for (const call of calls.values()) {
125
+ for (const call of rpcs.values()) {
126
126
  call.abort(new Error('Connection closed'))
127
127
  }
128
128
 
@@ -300,14 +300,14 @@ export class Protocol {
300
300
  ) {
301
301
  const { connection, context, transport } =
302
302
  this.#connections.get(connectionId)
303
- const { calls, format } = context
303
+ const { rpcs, format } = context
304
304
  const { callId, namespace, procedure, payload } = rpc
305
305
  const abortController = new AbortController()
306
306
  const signal = params.signal
307
307
  ? AbortSignal.any([params.signal, abortController.signal])
308
308
  : abortController.signal
309
309
 
310
- calls.set(callId, abortController)
310
+ rpcs.set(callId, abortController)
311
311
 
312
312
  const callIdEncoded = encodeNumber(callId, 'Uint32')
313
313
  const container = context.container.fork(Scope.Call)
@@ -453,7 +453,7 @@ export class Protocol {
453
453
  callId,
454
454
  })
455
455
  } finally {
456
- calls.delete(callId)
456
+ rpcs.delete(callId)
457
457
  container.dispose().catch((error) => {
458
458
  this.application.logger.error(
459
459
  { error, connection },
@@ -502,7 +502,7 @@ export class Protocol {
502
502
 
503
503
  rpcAbort(connectionId: string, callId: number) {
504
504
  const { context } = this.#connections.get(connectionId)
505
- const call = context.calls.get(callId) ?? throwError('Call not found')
505
+ const call = context.rpcs.get(callId) ?? throwError('Call not found')
506
506
  call.abort()
507
507
  }
508
508