@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.
- package/dist/client/protocol.js +9 -1
- package/dist/client/protocol.js.map +1 -1
- package/dist/server/api.js.map +1 -1
- package/dist/server/connection.js +1 -1
- package/dist/server/connection.js.map +1 -1
- package/dist/server/protocol.js +6 -6
- package/dist/server/protocol.js.map +1 -1
- package/package.json +7 -7
- package/src/client/protocol.ts +8 -0
- package/src/server/api.ts +1 -1
- package/src/server/connection.ts +1 -1
- package/src/server/protocol.ts +6 -6
package/dist/client/protocol.js
CHANGED
|
@@ -104,7 +104,15 @@ export class ProtocolServerStreams {
|
|
|
104
104
|
this.#collection.clear();
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
|
-
export
|
|
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"}
|
package/dist/server/api.js.map
CHANGED
|
@@ -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:
|
|
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"}
|
|
@@ -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,
|
|
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"}
|
package/dist/server/protocol.js
CHANGED
|
@@ -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 {
|
|
74
|
-
for (const call of
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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/
|
|
20
|
-
"@nmtjs/common": "0.12.
|
|
21
|
-
"@nmtjs/
|
|
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.
|
|
25
|
-
"@nmtjs/type": "0.12.
|
|
26
|
-
"@nmtjs/core": "0.12.
|
|
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.
|
|
34
|
+
"version": "0.12.4",
|
|
35
35
|
"scripts": {
|
|
36
36
|
"build": "neemata-build --root=./src './**/*.ts'",
|
|
37
37
|
"type-check": "tsc --noEmit"
|
package/src/client/protocol.ts
CHANGED
|
@@ -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
package/src/server/connection.ts
CHANGED
|
@@ -20,7 +20,7 @@ export class Connection<Data = unknown> {
|
|
|
20
20
|
|
|
21
21
|
export class ConnectionContext {
|
|
22
22
|
streamId = 1
|
|
23
|
-
|
|
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>()
|
package/src/server/protocol.ts
CHANGED
|
@@ -119,10 +119,10 @@ export class ProtocolConnections {
|
|
|
119
119
|
|
|
120
120
|
this.#collection.delete(connectionId)
|
|
121
121
|
|
|
122
|
-
const {
|
|
122
|
+
const { rpcs, serverStreams, clientStreams, rpcStreams, container } =
|
|
123
123
|
context
|
|
124
124
|
|
|
125
|
-
for (const call of
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
505
|
+
const call = context.rpcs.get(callId) ?? throwError('Call not found')
|
|
506
506
|
call.abort()
|
|
507
507
|
}
|
|
508
508
|
|