@nmtjs/protocol 0.6.4 → 0.6.5
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
CHANGED
|
@@ -54,6 +54,14 @@ export class ProtocolClientStreams {
|
|
|
54
54
|
stream.end();
|
|
55
55
|
this.remove(streamId);
|
|
56
56
|
}
|
|
57
|
+
clear(error) {
|
|
58
|
+
if (error) {
|
|
59
|
+
for (const stream of this.#collection.values()){
|
|
60
|
+
stream.abort(error);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
this.#collection.clear();
|
|
64
|
+
}
|
|
57
65
|
}
|
|
58
66
|
export class ProtocolServerStreams {
|
|
59
67
|
#collection = new Map();
|
|
@@ -88,6 +96,14 @@ export class ProtocolServerStreams {
|
|
|
88
96
|
stream.end();
|
|
89
97
|
this.remove(streamId);
|
|
90
98
|
}
|
|
99
|
+
clear(error) {
|
|
100
|
+
if (error) {
|
|
101
|
+
for (const stream of this.#collection.values()){
|
|
102
|
+
stream.abort(error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
this.#collection.clear();
|
|
106
|
+
}
|
|
91
107
|
}
|
|
92
108
|
export class ProtocolBaseTransformer {
|
|
93
109
|
encodeRPC(namespace, procedure, payload) {
|
|
@@ -227,17 +243,29 @@ export class ProtocolBaseClient extends EventEmitter {
|
|
|
227
243
|
this.#send(ClientMessageType.ClientStreamAbort, streamIdEncoded);
|
|
228
244
|
}
|
|
229
245
|
});
|
|
246
|
+
this.#transport.on('disconnected', ()=>{});
|
|
230
247
|
}
|
|
231
248
|
async connect(auth) {
|
|
232
249
|
return await this.#transport.connect(auth, this.#format.contentType);
|
|
233
250
|
}
|
|
234
251
|
async disconnect() {
|
|
252
|
+
this.#clear();
|
|
235
253
|
return await this.#transport.disconnect();
|
|
236
254
|
}
|
|
237
255
|
async #send(messageType, buffer) {
|
|
238
256
|
console.log('Client transport send', ClientMessageType[messageType], buffer.byteLength);
|
|
239
257
|
return await this.#transport.send(messageType, buffer);
|
|
240
258
|
}
|
|
259
|
+
async #clear() {
|
|
260
|
+
const error = new ProtocolError(ErrorCode.ConnectionError, 'Connection closed');
|
|
261
|
+
for (const call of this.#calls.values())call.reject(error);
|
|
262
|
+
this.#calls.clear();
|
|
263
|
+
this.#serverStreams.clear(error);
|
|
264
|
+
this.#clientStreams.clear(error);
|
|
265
|
+
this.#rpcStreams.clear(error);
|
|
266
|
+
this.#callId = 0;
|
|
267
|
+
this.#streamId = 0;
|
|
268
|
+
}
|
|
241
269
|
async _call(namespace, procedure, payload, options = {}) {
|
|
242
270
|
const timeoutSignal = AbortSignal.timeout(options.timeout || this.#timeout);
|
|
243
271
|
const signal = options.signal ? AbortSignal.any([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../lib/client/protocol.ts"],"sourcesContent":["import {\n createPromise,\n type InteractivePromise,\n onceAborted,\n} from '@nmtjs/common'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlobMetadata } from '../common/blob.ts'\nimport {\n ClientMessageType,\n ErrorCode,\n ServerMessageType,\n} from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport { EventEmitter } from './events.ts'\nimport type { BaseClientFormat } from './format.ts'\nimport {\n ProtocolClientBlobStream,\n ProtocolServerBlobStream,\n ProtocolServerStream,\n} from './stream.ts'\n\nexport class ProtocolError extends Error {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport class ProtocolClientStreams {\n readonly #collection = new Map<number, ProtocolClientBlobStream>()\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(\n source: ReadableStream,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n ) {\n const stream = new ProtocolClientBlobStream(source, streamId, metadata)\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number) {\n const stream = this.get(streamId)\n stream.abort()\n this.remove(streamId)\n }\n\n pull(streamId: number, size: number) {\n const stream = this.get(streamId)\n return stream.read(size)\n }\n\n end(streamId: number) {\n const stream = this.get(streamId)\n stream.end()\n this.remove(streamId)\n }\n}\n\nexport class ProtocolServerStreams {\n readonly #collection = new Map<number, ProtocolServerStream>()\n\n has(streamId: number) {\n return this.#collection.has(streamId)\n }\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(streamId: number, stream: ProtocolServerStream) {\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number) {\n if (this.has(streamId)) {\n const stream = this.get(streamId)\n stream.abort()\n this.remove(streamId)\n }\n }\n\n async push(streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(streamId)\n return await stream.push(chunk)\n }\n\n end(streamId: number) {\n const stream = this.get(streamId)\n stream.end()\n this.remove(streamId)\n }\n}\n\nexport interface ProtocolTransport\n extends EventEmitter<{\n [K in `${ServerMessageType}`]: [ArrayBuffer]\n }> {\n connect(\n auth: any,\n contentType: BaseClientFormat['contentType'],\n ): Promise<void>\n disconnect(): Promise<void>\n send(messageType: ClientMessageType, buffer: ArrayBuffer): Promise<void>\n}\n\nexport class ProtocolBaseTransformer {\n encodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPCChunk(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeEvent(namespace: string, event: string, payload: any) {\n return payload\n }\n}\n\nexport type ProtocolClientCall = InteractivePromise<any> &\n Pick<ProtocolRPC, 'namespace' | 'procedure'>\n\nexport type ProtocolBaseClientOptions = {\n transport: ProtocolTransport\n format: BaseClientFormat\n transformer?: ProtocolBaseTransformer\n timeout?: number\n}\n\nexport type ProtocolBaseClientCallOptions = {\n signal?: AbortSignal\n timeout?: number\n}\n\nexport abstract class ProtocolBaseClient<\n T extends Record<string, Record<string, any>>,\n> extends EventEmitter<\n {\n [N in keyof T]: {\n [E in keyof T[N] as `${Extract<N, string>}/${Extract<E, string>}`]: [\n payload: T[N][E],\n ]\n }\n }[keyof T]\n> {\n readonly #clientStreams: ProtocolClientStreams\n readonly #serverStreams: ProtocolServerStreams\n readonly #rpcStreams: ProtocolServerStreams\n readonly #rpcStreamData = new Map<\n number,\n Pick<ProtocolRPC, 'namespace' | 'procedure'>\n >()\n readonly #calls = new Map<number, ProtocolClientCall>()\n\n readonly #transport: ProtocolTransport\n readonly #format: BaseClientFormat\n readonly transformer: ProtocolBaseTransformer = new ProtocolBaseTransformer()\n readonly #timeout: number\n\n #callId = 0\n #streamId = 0\n\n constructor(options: ProtocolBaseClientOptions) {\n super()\n\n this.#transport = options.transport\n this.#format = options.format\n this.#timeout = options.timeout ?? 60000\n\n this.#clientStreams = new ProtocolClientStreams()\n this.#serverStreams = new ProtocolServerStreams()\n this.#rpcStreams = new ProtocolServerStreams()\n\n this.#transport.on(`${ServerMessageType.Event}`, (buffer) => {\n const [namespace, event, payload] = this.#format.decode(buffer)\n const name = `${namespace}/${event}`\n const transformed = this.transformer.decodeEvent(\n namespace,\n event,\n payload,\n )\n this.emit(name, transformed)\n })\n\n this.#transport.on(`${ServerMessageType.RpcResponse}`, (buffer) => {\n const { call, error, payload } = this.#handleResponse(buffer)\n if (error) call.reject(error)\n else call.resolve(payload)\n })\n\n this.#transport.on(`${ServerMessageType.RpcStreamResponse}`, (buffer) => {\n const { call, response, payload, error } = this.#handleResponse(buffer)\n if (error) return call.reject(error)\n console.log('Creating RPC stream', response)\n const stream = new ProtocolServerStream()\n this.#rpcStreams.add(response.callId, stream)\n this.#rpcStreamData.set(response.callId, {\n namespace: call.namespace,\n procedure: call.procedure,\n })\n call.resolve({ payload, stream })\n })\n\n this.#transport.on(\n `${ServerMessageType.RpcStreamChunk}`,\n async (buffer) => {\n const callId = decodeNumber(buffer, 'Uint32')\n console.log('RPC stream chunk', callId)\n\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n if (chunk.byteLength === 0) {\n this.#rpcStreams.end(callId)\n this.#rpcStreamData.delete(callId)\n } else {\n const call = this.#rpcStreamData.get(callId)\n console.log('RPC stream call', call)\n if (call) {\n const payload = this.#format.decode(chunk)\n console.log('RPC stream payload', payload)\n try {\n const transformed = this.transformer.decodeRPCChunk(\n call.namespace,\n call.procedure,\n payload,\n )\n await this.#rpcStreams.push(callId, transformed)\n } catch (error) {\n this.#send(\n ClientMessageType.RpcStreamAbort,\n encodeNumber(callId, 'Uint32'),\n )\n this.#rpcStreams.remove(callId)\n this.#rpcStreamData.delete(callId)\n }\n }\n }\n },\n )\n\n this.#transport.on(`${ServerMessageType.RpcStreamAbort}`, (buffer) => {\n const callId = decodeNumber(buffer, 'Uint32')\n console.log('RPC stream abort', callId)\n const call = this.#calls.get(callId)\n if (call) {\n this.#serverStreams.end(callId)\n this.#rpcStreams.abort(callId)\n }\n })\n\n this.#transport.on(\n `${ServerMessageType.ServerStreamPush}`,\n async (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n console.log('Server stream push', streamId, chunk.byteLength)\n try {\n await this.#serverStreams.push(streamId, chunk)\n this.#send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(streamId, 'Uint32'),\n )\n } catch (error) {\n this.#send(\n ClientMessageType.ServerStreamAbort,\n encodeNumber(streamId, 'Uint32'),\n )\n this.#serverStreams.remove(streamId)\n }\n },\n )\n\n this.#transport.on(`${ServerMessageType.ServerStreamEnd}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Server stream end', streamId)\n this.#serverStreams.end(streamId)\n })\n\n this.#transport.on(`${ServerMessageType.ServerStreamAbort}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Server stream abort', streamId)\n this.#serverStreams.abort(streamId)\n })\n\n this.#transport.on(`${ServerMessageType.ClientStreamAbort}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Client stream abort', streamId)\n this.#clientStreams.abort(streamId)\n })\n\n this.#transport.on(\n `${ServerMessageType.ClientStreamPull}`,\n async (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Client stream pull', streamId)\n const size = decodeNumber(\n buffer,\n 'Uint32',\n Uint32Array.BYTES_PER_ELEMENT,\n )\n const streamIdEncoded = encodeNumber(streamId, 'Uint32')\n try {\n const chunk = await this.#clientStreams.pull(streamId, size)\n if (chunk) {\n this.#send(\n ClientMessageType.ClientStreamPush,\n concat(streamIdEncoded, chunk),\n )\n } else {\n this.#send(ClientMessageType.ClientStreamEnd, streamIdEncoded)\n this.#clientStreams.end(streamId)\n }\n } catch (error) {\n console.error(error)\n this.#send(ClientMessageType.ClientStreamAbort, streamIdEncoded)\n }\n },\n )\n }\n\n async connect(auth: any) {\n return await this.#transport.connect(auth, this.#format.contentType)\n }\n\n async disconnect() {\n return await this.#transport.disconnect()\n }\n\n async #send(messageType: ClientMessageType, buffer: ArrayBuffer) {\n console.log(\n 'Client transport send',\n ClientMessageType[messageType],\n buffer.byteLength,\n )\n return await this.#transport.send(messageType, buffer)\n }\n\n protected async _call(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions = {},\n ) {\n const timeoutSignal = AbortSignal.timeout(options.timeout || this.#timeout)\n const signal = options.signal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : timeoutSignal\n\n const callId = ++this.#callId\n const call = Object.assign(createPromise(), {\n namespace,\n procedure,\n })\n const buffer = this.#format.encodeRPC(\n {\n callId,\n namespace,\n procedure,\n payload: this.transformer.encodeRPC(namespace, procedure, payload),\n },\n {\n addStream: (blob) => {\n const streamId = ++this.#streamId\n const stream = this.#clientStreams.add(\n blob.source,\n streamId,\n blob.metadata,\n )\n return stream\n },\n getStream: (id) => {\n const stream = this.#clientStreams.get(id)\n return stream\n },\n },\n )\n\n this.#transport.send(ClientMessageType.Rpc, buffer).catch(console.error)\n\n this.#calls.set(callId, call)\n\n const onAborted = onceAborted(signal).then(() => {\n if (this.#calls.has(callId)) {\n this.#send(ClientMessageType.RpcAbort, encodeNumber(callId, 'Uint32'))\n }\n throw new ProtocolError(ErrorCode.RequestTimeout, 'Request timeout')\n })\n\n return Promise.race([call.promise, onAborted])\n }\n\n #handleResponse(buffer: ArrayBuffer) {\n const callStreams: ProtocolServerBlobStream[] = []\n const response = this.#format.decodeRPC(buffer, {\n addStream: (id, metadata) => {\n console.log('Client transport blob stream', id, metadata)\n const stream = new ProtocolServerBlobStream(id, metadata, () => {\n this.#send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(id, 'Uint32'),\n )\n })\n callStreams.push(stream)\n this.#serverStreams.add(id, stream)\n return stream\n },\n getStream: (id) => {\n return this.#serverStreams.get(id)\n },\n })\n\n console.log('Client transport response', response)\n\n const call = this.#calls.get(response.callId)\n\n if (call) {\n this.#calls.delete(response.callId)\n\n if (response.error) {\n const error = new ProtocolError(\n response.error.code,\n response.error.message,\n response.error.data,\n )\n return { call, response, error }\n } else {\n const payload = this.transformer.decodeRPC(\n call.namespace,\n call.procedure,\n response.payload,\n )\n return { call, response, payload }\n }\n }\n\n for (const stream of callStreams) {\n this.#serverStreams.abort(stream.id)\n }\n\n throw new Error('Call not found')\n }\n}\n"],"names":["createPromise","onceAborted","concat","decodeNumber","encodeNumber","ClientMessageType","ErrorCode","ServerMessageType","EventEmitter","ProtocolClientBlobStream","ProtocolServerBlobStream","ProtocolServerStream","ProtocolError","Error","code","data","constructor","message","toString","toJSON","ProtocolClientStreams","Map","get","streamId","stream","add","source","metadata","set","remove","delete","abort","pull","size","read","end","ProtocolServerStreams","has","push","chunk","ProtocolBaseTransformer","encodeRPC","namespace","procedure","payload","decodeRPC","decodeRPCChunk","decodeEvent","event","ProtocolBaseClient","transformer","options","transport","format","timeout","on","Event","buffer","decode","name","transformed","emit","RpcResponse","call","error","reject","resolve","RpcStreamResponse","response","console","log","callId","RpcStreamChunk","slice","Uint32Array","BYTES_PER_ELEMENT","byteLength","RpcStreamAbort","ServerStreamPush","ServerStreamPull","ServerStreamAbort","ServerStreamEnd","ClientStreamAbort","ClientStreamPull","streamIdEncoded","ClientStreamPush","ClientStreamEnd","connect","auth","contentType","disconnect","messageType","send","_call","timeoutSignal","AbortSignal","signal","any","Object","assign","addStream","blob","getStream","id","Rpc","catch","onAborted","then","RpcAbort","RequestTimeout","Promise","race","promise","callStreams"],"mappings":"AAAA,SACEA,aAAa,EAEbC,WAAW,QACN,gBAAe;AACtB,SAASC,MAAM,EAAEC,YAAY,EAAEC,YAAY,QAAQ,sBAAqB;AAExE,SACEC,iBAAiB,EACjBC,SAAS,EACTC,iBAAiB,QACZ,qBAAoB;AAE3B,SAASC,YAAY,QAAQ,cAAa;AAE1C,SACEC,wBAAwB,EACxBC,wBAAwB,EACxBC,oBAAoB,QACf,cAAa;AAEpB,OAAO,MAAMC,sBAAsBC;IACjCC,KAAY;IACZC,KAAU;IAEVC,YAAYF,IAAY,EAAEG,OAAgB,EAAEF,IAAU,CAAE;QACtD,KAAK,CAACE;QACN,IAAI,CAACH,IAAI,GAAGA;QACZ,IAAI,CAACC,IAAI,GAAGA;IACd;IAEA,IAAIE,UAAU;QACZ,OAAO,CAAC,EAAE,IAAI,CAACH,IAAI,CAAC,CAAC,EAAE,KAAK,CAACG,QAAQ,CAAC;IACxC;IAEAC,WAAW;QACT,OAAO,CAAC,EAAE,IAAI,CAACJ,IAAI,CAAC,CAAC,EAAE,IAAI,CAACG,OAAO,CAAC,CAAC;IACvC;IAEAE,SAAS;QACP,OAAO;YACLL,MAAM,IAAI,CAACA,IAAI;YACfG,SAAS,IAAI,CAACA,OAAO;YACrBF,MAAM,IAAI,CAACA,IAAI;QACjB;IACF;AACF;AAEA,OAAO,MAAMK;IACF,CAAA,UAAW,GAAG,IAAIC,MAAuC;IAElEC,IAAIC,QAAgB,EAAE;QACpB,MAAMC,SAAS,IAAI,CAAC,CAAA,UAAW,CAACF,GAAG,CAACC;QACpC,IAAI,CAACC,QAAQ,MAAM,IAAIX,MAAM;QAC7B,OAAOW;IACT;IAEAC,IACEC,MAAsB,EACtBH,QAAgB,EAChBI,QAA8B,EAC9B;QACA,MAAMH,SAAS,IAAIf,yBAAyBiB,QAAQH,UAAUI;QAC9D,IAAI,CAAC,CAAA,UAAW,CAACC,GAAG,CAACL,UAAUC;QAC/B,OAAOA;IACT;IAEAK,OAAON,QAAgB,EAAE;QACvB,IAAI,CAAC,CAAA,UAAW,CAACO,MAAM,CAACP;IAC1B;IAEAQ,MAAMR,QAAgB,EAAE;QACtB,MAAMC,SAAS,IAAI,CAACF,GAAG,CAACC;QACxBC,OAAOO,KAAK;QACZ,IAAI,CAACF,MAAM,CAACN;IACd;IAEAS,KAAKT,QAAgB,EAAEU,IAAY,EAAE;QACnC,MAAMT,SAAS,IAAI,CAACF,GAAG,CAACC;QACxB,OAAOC,OAAOU,IAAI,CAACD;IACrB;IAEAE,IAAIZ,QAAgB,EAAE;QACpB,MAAMC,SAAS,IAAI,CAACF,GAAG,CAACC;QACxBC,OAAOW,GAAG;QACV,IAAI,CAACN,MAAM,CAACN;IACd;AACF;AAEA,OAAO,MAAMa;IACF,CAAA,UAAW,GAAG,IAAIf,MAAmC;IAE9DgB,IAAId,QAAgB,EAAE;QACpB,OAAO,IAAI,CAAC,CAAA,UAAW,CAACc,GAAG,CAACd;IAC9B;IAEAD,IAAIC,QAAgB,EAAE;QACpB,MAAMC,SAAS,IAAI,CAAC,CAAA,UAAW,CAACF,GAAG,CAACC;QACpC,IAAI,CAACC,QAAQ,MAAM,IAAIX,MAAM;QAC7B,OAAOW;IACT;IAEAC,IAAIF,QAAgB,EAAEC,MAA4B,EAAE;QAClD,IAAI,CAAC,CAAA,UAAW,CAACI,GAAG,CAACL,UAAUC;QAC/B,OAAOA;IACT;IAEAK,OAAON,QAAgB,EAAE;QACvB,IAAI,CAAC,CAAA,UAAW,CAACO,MAAM,CAACP;IAC1B;IAEAQ,MAAMR,QAAgB,EAAE;QACtB,IAAI,IAAI,CAACc,GAAG,CAACd,WAAW;YACtB,MAAMC,SAAS,IAAI,CAACF,GAAG,CAACC;YACxBC,OAAOO,KAAK;YACZ,IAAI,CAACF,MAAM,CAACN;QACd;IACF;IAEA,MAAMe,KAAKf,QAAgB,EAAEgB,KAAkB,EAAE;QAC/C,MAAMf,SAAS,IAAI,CAACF,GAAG,CAACC;QACxB,OAAO,MAAMC,OAAOc,IAAI,CAACC;IAC3B;IAEAJ,IAAIZ,QAAgB,EAAE;QACpB,MAAMC,SAAS,IAAI,CAACF,GAAG,CAACC;QACxBC,OAAOW,GAAG;QACV,IAAI,CAACN,MAAM,CAACN;IACd;AACF;AAcA,OAAO,MAAMiB;IACXC,UAAUC,SAAiB,EAAEC,SAAiB,EAAEC,OAAY,EAAE;QAC5D,OAAOA;IACT;IACAC,UAAUH,SAAiB,EAAEC,SAAiB,EAAEC,OAAY,EAAE;QAC5D,OAAOA;IACT;IACAE,eAAeJ,SAAiB,EAAEC,SAAiB,EAAEC,OAAY,EAAE;QACjE,OAAOA;IACT;IACAG,YAAYL,SAAiB,EAAEM,KAAa,EAAEJ,OAAY,EAAE;QAC1D,OAAOA;IACT;AACF;AAiBA,OAAO,MAAeK,2BAEZzC;IASC,CAAA,aAAc,CAAuB;IACrC,CAAA,aAAc,CAAuB;IACrC,CAAA,UAAW,CAAuB;IAClC,CAAA,aAAc,GAAG,IAAIa,MAG3B;IACM,CAAA,KAAM,GAAG,IAAIA,MAAiC;IAE9C,CAAA,SAAU,CAAmB;IAC7B,CAAA,MAAO,CAAkB;IACzB6B,cAAuC,IAAIV,0BAAyB;IACpE,CAAA,OAAQ,CAAQ;IAEzB,CAAA,MAAO,GAAG,EAAC;IACX,CAAA,QAAS,GAAG,EAAC;IAEbxB,YAAYmC,OAAkC,CAAE;QAC9C,KAAK;QAEL,IAAI,CAAC,CAAA,SAAU,GAAGA,QAAQC,SAAS;QACnC,IAAI,CAAC,CAAA,MAAO,GAAGD,QAAQE,MAAM;QAC7B,IAAI,CAAC,CAAA,OAAQ,GAAGF,QAAQG,OAAO,IAAI;QAEnC,IAAI,CAAC,CAAA,aAAc,GAAG,IAAIlC;QAC1B,IAAI,CAAC,CAAA,aAAc,GAAG,IAAIgB;QAC1B,IAAI,CAAC,CAAA,UAAW,GAAG,IAAIA;QAEvB,IAAI,CAAC,CAAA,SAAU,CAACmB,EAAE,CAAC,CAAC,EAAEhD,kBAAkBiD,KAAK,CAAC,CAAC,EAAE,CAACC;YAChD,MAAM,CAACf,WAAWM,OAAOJ,QAAQ,GAAG,IAAI,CAAC,CAAA,MAAO,CAACc,MAAM,CAACD;YACxD,MAAME,OAAO,CAAC,EAAEjB,UAAU,CAAC,EAAEM,MAAM,CAAC;YACpC,MAAMY,cAAc,IAAI,CAACV,WAAW,CAACH,WAAW,CAC9CL,WACAM,OACAJ;YAEF,IAAI,CAACiB,IAAI,CAACF,MAAMC;QAClB;QAEA,IAAI,CAAC,CAAA,SAAU,CAACL,EAAE,CAAC,CAAC,EAAEhD,kBAAkBuD,WAAW,CAAC,CAAC,EAAE,CAACL;YACtD,MAAM,EAAEM,IAAI,EAAEC,KAAK,EAAEpB,OAAO,EAAE,GAAG,IAAI,CAAC,CAAA,cAAe,CAACa;YACtD,IAAIO,OAAOD,KAAKE,MAAM,CAACD;iBAClBD,KAAKG,OAAO,CAACtB;QACpB;QAEA,IAAI,CAAC,CAAA,SAAU,CAACW,EAAE,CAAC,CAAC,EAAEhD,kBAAkB4D,iBAAiB,CAAC,CAAC,EAAE,CAACV;YAC5D,MAAM,EAAEM,IAAI,EAAEK,QAAQ,EAAExB,OAAO,EAAEoB,KAAK,EAAE,GAAG,IAAI,CAAC,CAAA,cAAe,CAACP;YAChE,IAAIO,OAAO,OAAOD,KAAKE,MAAM,CAACD;YAC9BK,QAAQC,GAAG,CAAC,uBAAuBF;YACnC,MAAM5C,SAAS,IAAIb;YACnB,IAAI,CAAC,CAAA,UAAW,CAACc,GAAG,CAAC2C,SAASG,MAAM,EAAE/C;YACtC,IAAI,CAAC,CAAA,aAAc,CAACI,GAAG,CAACwC,SAASG,MAAM,EAAE;gBACvC7B,WAAWqB,KAAKrB,SAAS;gBACzBC,WAAWoB,KAAKpB,SAAS;YAC3B;YACAoB,KAAKG,OAAO,CAAC;gBAAEtB;gBAASpB;YAAO;QACjC;QAEA,IAAI,CAAC,CAAA,SAAU,CAAC+B,EAAE,CAChB,CAAC,EAAEhD,kBAAkBiE,cAAc,CAAC,CAAC,EACrC,OAAOf;YACL,MAAMc,SAASpE,aAAasD,QAAQ;YACpCY,QAAQC,GAAG,CAAC,oBAAoBC;YAEhC,MAAMhC,QAAQkB,OAAOgB,KAAK,CAACC,YAAYC,iBAAiB;YACxD,IAAIpC,MAAMqC,UAAU,KAAK,GAAG;gBAC1B,IAAI,CAAC,CAAA,UAAW,CAACzC,GAAG,CAACoC;gBACrB,IAAI,CAAC,CAAA,aAAc,CAACzC,MAAM,CAACyC;YAC7B,OAAO;gBACL,MAAMR,OAAO,IAAI,CAAC,CAAA,aAAc,CAACzC,GAAG,CAACiD;gBACrCF,QAAQC,GAAG,CAAC,mBAAmBP;gBAC/B,IAAIA,MAAM;oBACR,MAAMnB,UAAU,IAAI,CAAC,CAAA,MAAO,CAACc,MAAM,CAACnB;oBACpC8B,QAAQC,GAAG,CAAC,sBAAsB1B;oBAClC,IAAI;wBACF,MAAMgB,cAAc,IAAI,CAACV,WAAW,CAACJ,cAAc,CACjDiB,KAAKrB,SAAS,EACdqB,KAAKpB,SAAS,EACdC;wBAEF,MAAM,IAAI,CAAC,CAAA,UAAW,CAACN,IAAI,CAACiC,QAAQX;oBACtC,EAAE,OAAOI,OAAO;wBACd,IAAI,CAAC,CAAA,IAAK,CACR3D,kBAAkBwE,cAAc,EAChCzE,aAAamE,QAAQ;wBAEvB,IAAI,CAAC,CAAA,UAAW,CAAC1C,MAAM,CAAC0C;wBACxB,IAAI,CAAC,CAAA,aAAc,CAACzC,MAAM,CAACyC;oBAC7B;gBACF;YACF;QACF;QAGF,IAAI,CAAC,CAAA,SAAU,CAAChB,EAAE,CAAC,CAAC,EAAEhD,kBAAkBsE,cAAc,CAAC,CAAC,EAAE,CAACpB;YACzD,MAAMc,SAASpE,aAAasD,QAAQ;YACpCY,QAAQC,GAAG,CAAC,oBAAoBC;YAChC,MAAMR,OAAO,IAAI,CAAC,CAAA,KAAM,CAACzC,GAAG,CAACiD;YAC7B,IAAIR,MAAM;gBACR,IAAI,CAAC,CAAA,aAAc,CAAC5B,GAAG,CAACoC;gBACxB,IAAI,CAAC,CAAA,UAAW,CAACxC,KAAK,CAACwC;YACzB;QACF;QAEA,IAAI,CAAC,CAAA,SAAU,CAAChB,EAAE,CAChB,CAAC,EAAEhD,kBAAkBuE,gBAAgB,CAAC,CAAC,EACvC,OAAOrB;YACL,MAAMlC,WAAWpB,aAAasD,QAAQ;YACtC,MAAMlB,QAAQkB,OAAOgB,KAAK,CAACC,YAAYC,iBAAiB;YACxDN,QAAQC,GAAG,CAAC,sBAAsB/C,UAAUgB,MAAMqC,UAAU;YAC5D,IAAI;gBACF,MAAM,IAAI,CAAC,CAAA,aAAc,CAACtC,IAAI,CAACf,UAAUgB;gBACzC,IAAI,CAAC,CAAA,IAAK,CACRlC,kBAAkB0E,gBAAgB,EAClC3E,aAAamB,UAAU;YAE3B,EAAE,OAAOyC,OAAO;gBACd,IAAI,CAAC,CAAA,IAAK,CACR3D,kBAAkB2E,iBAAiB,EACnC5E,aAAamB,UAAU;gBAEzB,IAAI,CAAC,CAAA,aAAc,CAACM,MAAM,CAACN;YAC7B;QACF;QAGF,IAAI,CAAC,CAAA,SAAU,CAACgC,EAAE,CAAC,CAAC,EAAEhD,kBAAkB0E,eAAe,CAAC,CAAC,EAAE,CAACxB;YAC1D,MAAMlC,WAAWpB,aAAasD,QAAQ;YACtCY,QAAQC,GAAG,CAAC,qBAAqB/C;YACjC,IAAI,CAAC,CAAA,aAAc,CAACY,GAAG,CAACZ;QAC1B;QAEA,IAAI,CAAC,CAAA,SAAU,CAACgC,EAAE,CAAC,CAAC,EAAEhD,kBAAkByE,iBAAiB,CAAC,CAAC,EAAE,CAACvB;YAC5D,MAAMlC,WAAWpB,aAAasD,QAAQ;YACtCY,QAAQC,GAAG,CAAC,uBAAuB/C;YACnC,IAAI,CAAC,CAAA,aAAc,CAACQ,KAAK,CAACR;QAC5B;QAEA,IAAI,CAAC,CAAA,SAAU,CAACgC,EAAE,CAAC,CAAC,EAAEhD,kBAAkB2E,iBAAiB,CAAC,CAAC,EAAE,CAACzB;YAC5D,MAAMlC,WAAWpB,aAAasD,QAAQ;YACtCY,QAAQC,GAAG,CAAC,uBAAuB/C;YACnC,IAAI,CAAC,CAAA,aAAc,CAACQ,KAAK,CAACR;QAC5B;QAEA,IAAI,CAAC,CAAA,SAAU,CAACgC,EAAE,CAChB,CAAC,EAAEhD,kBAAkB4E,gBAAgB,CAAC,CAAC,EACvC,OAAO1B;YACL,MAAMlC,WAAWpB,aAAasD,QAAQ;YACtCY,QAAQC,GAAG,CAAC,sBAAsB/C;YAClC,MAAMU,OAAO9B,aACXsD,QACA,UACAiB,YAAYC,iBAAiB;YAE/B,MAAMS,kBAAkBhF,aAAamB,UAAU;YAC/C,IAAI;gBACF,MAAMgB,QAAQ,MAAM,IAAI,CAAC,CAAA,aAAc,CAACP,IAAI,CAACT,UAAUU;gBACvD,IAAIM,OAAO;oBACT,IAAI,CAAC,CAAA,IAAK,CACRlC,kBAAkBgF,gBAAgB,EAClCnF,OAAOkF,iBAAiB7C;gBAE5B,OAAO;oBACL,IAAI,CAAC,CAAA,IAAK,CAAClC,kBAAkBiF,eAAe,EAAEF;oBAC9C,IAAI,CAAC,CAAA,aAAc,CAACjD,GAAG,CAACZ;gBAC1B;YACF,EAAE,OAAOyC,OAAO;gBACdK,QAAQL,KAAK,CAACA;gBACd,IAAI,CAAC,CAAA,IAAK,CAAC3D,kBAAkB6E,iBAAiB,EAAEE;YAClD;QACF;IAEJ;IAEA,MAAMG,QAAQC,IAAS,EAAE;QACvB,OAAO,MAAM,IAAI,CAAC,CAAA,SAAU,CAACD,OAAO,CAACC,MAAM,IAAI,CAAC,CAAA,MAAO,CAACC,WAAW;IACrE;IAEA,MAAMC,aAAa;QACjB,OAAO,MAAM,IAAI,CAAC,CAAA,SAAU,CAACA,UAAU;IACzC;IAEA,MAAM,CAAA,IAAK,CAACC,WAA8B,EAAElC,MAAmB;QAC7DY,QAAQC,GAAG,CACT,yBACAjE,iBAAiB,CAACsF,YAAY,EAC9BlC,OAAOmB,UAAU;QAEnB,OAAO,MAAM,IAAI,CAAC,CAAA,SAAU,CAACgB,IAAI,CAACD,aAAalC;IACjD;IAEA,MAAgBoC,MACdnD,SAAiB,EACjBC,SAAiB,EACjBC,OAAY,EACZO,UAAyC,CAAC,CAAC,EAC3C;QACA,MAAM2C,gBAAgBC,YAAYzC,OAAO,CAACH,QAAQG,OAAO,IAAI,IAAI,CAAC,CAAA,OAAQ;QAC1E,MAAM0C,SAAS7C,QAAQ6C,MAAM,GACzBD,YAAYE,GAAG,CAAC;YAAC9C,QAAQ6C,MAAM;YAAEF;SAAc,IAC/CA;QAEJ,MAAMvB,SAAS,EAAE,IAAI,CAAC,CAAA,MAAO;QAC7B,MAAMR,OAAOmC,OAAOC,MAAM,CAACnG,iBAAiB;YAC1C0C;YACAC;QACF;QACA,MAAMc,SAAS,IAAI,CAAC,CAAA,MAAO,CAAChB,SAAS,CACnC;YACE8B;YACA7B;YACAC;YACAC,SAAS,IAAI,CAACM,WAAW,CAACT,SAAS,CAACC,WAAWC,WAAWC;QAC5D,GACA;YACEwD,WAAW,CAACC;gBACV,MAAM9E,WAAW,EAAE,IAAI,CAAC,CAAA,QAAS;gBACjC,MAAMC,SAAS,IAAI,CAAC,CAAA,aAAc,CAACC,GAAG,CACpC4E,KAAK3E,MAAM,EACXH,UACA8E,KAAK1E,QAAQ;gBAEf,OAAOH;YACT;YACA8E,WAAW,CAACC;gBACV,MAAM/E,SAAS,IAAI,CAAC,CAAA,aAAc,CAACF,GAAG,CAACiF;gBACvC,OAAO/E;YACT;QACF;QAGF,IAAI,CAAC,CAAA,SAAU,CAACoE,IAAI,CAACvF,kBAAkBmG,GAAG,EAAE/C,QAAQgD,KAAK,CAACpC,QAAQL,KAAK;QAEvE,IAAI,CAAC,CAAA,KAAM,CAACpC,GAAG,CAAC2C,QAAQR;QAExB,MAAM2C,YAAYzG,YAAY+F,QAAQW,IAAI,CAAC;YACzC,IAAI,IAAI,CAAC,CAAA,KAAM,CAACtE,GAAG,CAACkC,SAAS;gBAC3B,IAAI,CAAC,CAAA,IAAK,CAAClE,kBAAkBuG,QAAQ,EAAExG,aAAamE,QAAQ;YAC9D;YACA,MAAM,IAAI3D,cAAcN,UAAUuG,cAAc,EAAE;QACpD;QAEA,OAAOC,QAAQC,IAAI,CAAC;YAAChD,KAAKiD,OAAO;YAAEN;SAAU;IAC/C;IAEA,CAAA,cAAe,CAACjD,MAAmB;QACjC,MAAMwD,cAA0C,EAAE;QAClD,MAAM7C,WAAW,IAAI,CAAC,CAAA,MAAO,CAACvB,SAAS,CAACY,QAAQ;YAC9C2C,WAAW,CAACG,IAAI5E;gBACd0C,QAAQC,GAAG,CAAC,gCAAgCiC,IAAI5E;gBAChD,MAAMH,SAAS,IAAId,yBAAyB6F,IAAI5E,UAAU;oBACxD,IAAI,CAAC,CAAA,IAAK,CACRtB,kBAAkB0E,gBAAgB,EAClC3E,aAAamG,IAAI;gBAErB;gBACAU,YAAY3E,IAAI,CAACd;gBACjB,IAAI,CAAC,CAAA,aAAc,CAACC,GAAG,CAAC8E,IAAI/E;gBAC5B,OAAOA;YACT;YACA8E,WAAW,CAACC;gBACV,OAAO,IAAI,CAAC,CAAA,aAAc,CAACjF,GAAG,CAACiF;YACjC;QACF;QAEAlC,QAAQC,GAAG,CAAC,6BAA6BF;QAEzC,MAAML,OAAO,IAAI,CAAC,CAAA,KAAM,CAACzC,GAAG,CAAC8C,SAASG,MAAM;QAE5C,IAAIR,MAAM;YACR,IAAI,CAAC,CAAA,KAAM,CAACjC,MAAM,CAACsC,SAASG,MAAM;YAElC,IAAIH,SAASJ,KAAK,EAAE;gBAClB,MAAMA,QAAQ,IAAIpD,cAChBwD,SAASJ,KAAK,CAAClD,IAAI,EACnBsD,SAASJ,KAAK,CAAC/C,OAAO,EACtBmD,SAASJ,KAAK,CAACjD,IAAI;gBAErB,OAAO;oBAAEgD;oBAAMK;oBAAUJ;gBAAM;YACjC,OAAO;gBACL,MAAMpB,UAAU,IAAI,CAACM,WAAW,CAACL,SAAS,CACxCkB,KAAKrB,SAAS,EACdqB,KAAKpB,SAAS,EACdyB,SAASxB,OAAO;gBAElB,OAAO;oBAAEmB;oBAAMK;oBAAUxB;gBAAQ;YACnC;QACF;QAEA,KAAK,MAAMpB,UAAUyF,YAAa;YAChC,IAAI,CAAC,CAAA,aAAc,CAAClF,KAAK,CAACP,OAAO+E,EAAE;QACrC;QAEA,MAAM,IAAI1F,MAAM;IAClB;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../../lib/client/protocol.ts"],"sourcesContent":["import {\n createPromise,\n type InteractivePromise,\n onceAborted,\n} from '@nmtjs/common'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlobMetadata } from '../common/blob.ts'\nimport {\n ClientMessageType,\n ErrorCode,\n ServerMessageType,\n} from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport { EventEmitter } from './events.ts'\nimport type { BaseClientFormat } from './format.ts'\nimport {\n ProtocolClientBlobStream,\n ProtocolServerBlobStream,\n ProtocolServerStream,\n} from './stream.ts'\n\nexport class ProtocolError extends Error {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport class ProtocolClientStreams {\n readonly #collection = new Map<number, ProtocolClientBlobStream>()\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(\n source: ReadableStream,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n ) {\n const stream = new ProtocolClientBlobStream(source, streamId, metadata)\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number) {\n const stream = this.get(streamId)\n stream.abort()\n this.remove(streamId)\n }\n\n pull(streamId: number, size: number) {\n const stream = this.get(streamId)\n return stream.read(size)\n }\n\n end(streamId: number) {\n 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 class ProtocolServerStreams {\n readonly #collection = new Map<number, ProtocolServerStream>()\n\n has(streamId: number) {\n return this.#collection.has(streamId)\n }\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(streamId: number, stream: ProtocolServerStream) {\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number) {\n if (this.has(streamId)) {\n const stream = this.get(streamId)\n stream.abort()\n this.remove(streamId)\n }\n }\n\n async push(streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(streamId)\n return await stream.push(chunk)\n }\n\n end(streamId: number) {\n const stream = this.get(streamId)\n stream.end()\n this.remove(streamId)\n }\n\n clear(error?: Error) {\n if (error) {\n for (const stream of this.#collection.values()) {\n stream.abort(error)\n }\n }\n this.#collection.clear()\n }\n}\n\nexport interface ProtocolTransport\n extends EventEmitter<\n {\n [K in `${ServerMessageType}`]: [ArrayBuffer]\n } & {\n connected: []\n disconnected: []\n }\n > {\n connect(\n auth: any,\n contentType: BaseClientFormat['contentType'],\n ): Promise<void>\n disconnect(): Promise<void>\n send(messageType: ClientMessageType, buffer: ArrayBuffer): Promise<void>\n}\n\nexport class ProtocolBaseTransformer {\n encodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPCChunk(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeEvent(namespace: string, event: string, payload: any) {\n return payload\n }\n}\n\nexport type ProtocolClientCall = InteractivePromise<any> &\n Pick<ProtocolRPC, 'namespace' | 'procedure'>\n\nexport type ProtocolBaseClientOptions = {\n transport: ProtocolTransport\n format: BaseClientFormat\n transformer?: ProtocolBaseTransformer\n timeout?: number\n}\n\nexport type ProtocolBaseClientCallOptions = {\n signal?: AbortSignal\n timeout?: number\n}\n\nexport abstract class ProtocolBaseClient<\n T extends Record<string, Record<string, any>>,\n> extends EventEmitter<\n {\n [N in keyof T]: {\n [E in keyof T[N] as `${Extract<N, string>}/${Extract<E, string>}`]: [\n payload: T[N][E],\n ]\n }\n }[keyof T]\n> {\n readonly #clientStreams: ProtocolClientStreams\n readonly #serverStreams: ProtocolServerStreams\n readonly #rpcStreams: ProtocolServerStreams\n readonly #rpcStreamData = new Map<\n number,\n Pick<ProtocolRPC, 'namespace' | 'procedure'>\n >()\n readonly #calls = new Map<number, ProtocolClientCall>()\n\n readonly #transport: ProtocolTransport\n readonly #format: BaseClientFormat\n readonly transformer: ProtocolBaseTransformer = new ProtocolBaseTransformer()\n readonly #timeout: number\n\n #callId = 0\n #streamId = 0\n\n constructor(options: ProtocolBaseClientOptions) {\n super()\n\n this.#transport = options.transport\n this.#format = options.format\n this.#timeout = options.timeout ?? 60000\n\n this.#clientStreams = new ProtocolClientStreams()\n this.#serverStreams = new ProtocolServerStreams()\n this.#rpcStreams = new ProtocolServerStreams()\n\n this.#transport.on(`${ServerMessageType.Event}`, (buffer) => {\n const [namespace, event, payload] = this.#format.decode(buffer)\n const name = `${namespace}/${event}`\n const transformed = this.transformer.decodeEvent(\n namespace,\n event,\n payload,\n )\n this.emit(name, transformed)\n })\n\n this.#transport.on(`${ServerMessageType.RpcResponse}`, (buffer) => {\n const { call, error, payload } = this.#handleResponse(buffer)\n if (error) call.reject(error)\n else call.resolve(payload)\n })\n\n this.#transport.on(`${ServerMessageType.RpcStreamResponse}`, (buffer) => {\n const { call, response, payload, error } = this.#handleResponse(buffer)\n if (error) return call.reject(error)\n console.log('Creating RPC stream', response)\n const stream = new ProtocolServerStream()\n this.#rpcStreams.add(response.callId, stream)\n this.#rpcStreamData.set(response.callId, {\n namespace: call.namespace,\n procedure: call.procedure,\n })\n call.resolve({ payload, stream })\n })\n\n this.#transport.on(\n `${ServerMessageType.RpcStreamChunk}`,\n async (buffer) => {\n const callId = decodeNumber(buffer, 'Uint32')\n console.log('RPC stream chunk', callId)\n\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n if (chunk.byteLength === 0) {\n this.#rpcStreams.end(callId)\n this.#rpcStreamData.delete(callId)\n } else {\n const call = this.#rpcStreamData.get(callId)\n console.log('RPC stream call', call)\n if (call) {\n const payload = this.#format.decode(chunk)\n console.log('RPC stream payload', payload)\n try {\n const transformed = this.transformer.decodeRPCChunk(\n call.namespace,\n call.procedure,\n payload,\n )\n await this.#rpcStreams.push(callId, transformed)\n } catch (error) {\n this.#send(\n ClientMessageType.RpcStreamAbort,\n encodeNumber(callId, 'Uint32'),\n )\n this.#rpcStreams.remove(callId)\n this.#rpcStreamData.delete(callId)\n }\n }\n }\n },\n )\n\n this.#transport.on(`${ServerMessageType.RpcStreamAbort}`, (buffer) => {\n const callId = decodeNumber(buffer, 'Uint32')\n console.log('RPC stream abort', callId)\n const call = this.#calls.get(callId)\n if (call) {\n this.#serverStreams.end(callId)\n this.#rpcStreams.abort(callId)\n }\n })\n\n this.#transport.on(\n `${ServerMessageType.ServerStreamPush}`,\n async (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n console.log('Server stream push', streamId, chunk.byteLength)\n try {\n await this.#serverStreams.push(streamId, chunk)\n this.#send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(streamId, 'Uint32'),\n )\n } catch (error) {\n this.#send(\n ClientMessageType.ServerStreamAbort,\n encodeNumber(streamId, 'Uint32'),\n )\n this.#serverStreams.remove(streamId)\n }\n },\n )\n\n this.#transport.on(`${ServerMessageType.ServerStreamEnd}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Server stream end', streamId)\n this.#serverStreams.end(streamId)\n })\n\n this.#transport.on(`${ServerMessageType.ServerStreamAbort}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Server stream abort', streamId)\n this.#serverStreams.abort(streamId)\n })\n\n this.#transport.on(`${ServerMessageType.ClientStreamAbort}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Client stream abort', streamId)\n this.#clientStreams.abort(streamId)\n })\n\n this.#transport.on(\n `${ServerMessageType.ClientStreamPull}`,\n async (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Client stream pull', streamId)\n const size = decodeNumber(\n buffer,\n 'Uint32',\n Uint32Array.BYTES_PER_ELEMENT,\n )\n const streamIdEncoded = encodeNumber(streamId, 'Uint32')\n try {\n const chunk = await this.#clientStreams.pull(streamId, size)\n if (chunk) {\n this.#send(\n ClientMessageType.ClientStreamPush,\n concat(streamIdEncoded, chunk),\n )\n } else {\n this.#send(ClientMessageType.ClientStreamEnd, streamIdEncoded)\n this.#clientStreams.end(streamId)\n }\n } catch (error) {\n console.error(error)\n this.#send(ClientMessageType.ClientStreamAbort, streamIdEncoded)\n }\n },\n )\n\n this.#transport.on('disconnected', () => {})\n }\n\n async connect(auth: any) {\n return await this.#transport.connect(auth, this.#format.contentType)\n }\n\n async disconnect() {\n this.#clear()\n return await this.#transport.disconnect()\n }\n\n async #send(messageType: ClientMessageType, buffer: ArrayBuffer) {\n console.log(\n 'Client transport send',\n ClientMessageType[messageType],\n buffer.byteLength,\n )\n return await this.#transport.send(messageType, buffer)\n }\n\n async #clear() {\n const error = new ProtocolError(\n ErrorCode.ConnectionError,\n 'Connection closed',\n )\n for (const call of this.#calls.values()) call.reject(error)\n this.#calls.clear()\n this.#serverStreams.clear(error)\n this.#clientStreams.clear(error)\n this.#rpcStreams.clear(error)\n this.#callId = 0\n this.#streamId = 0\n }\n\n protected async _call(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions = {},\n ) {\n const timeoutSignal = AbortSignal.timeout(options.timeout || this.#timeout)\n const signal = options.signal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : timeoutSignal\n\n const callId = ++this.#callId\n const call = Object.assign(createPromise(), {\n namespace,\n procedure,\n })\n const buffer = this.#format.encodeRPC(\n {\n callId,\n namespace,\n procedure,\n payload: this.transformer.encodeRPC(namespace, procedure, payload),\n },\n {\n addStream: (blob) => {\n const streamId = ++this.#streamId\n const stream = this.#clientStreams.add(\n blob.source,\n streamId,\n blob.metadata,\n )\n return stream\n },\n getStream: (id) => {\n const stream = this.#clientStreams.get(id)\n return stream\n },\n },\n )\n\n this.#transport.send(ClientMessageType.Rpc, buffer).catch(console.error)\n\n this.#calls.set(callId, call)\n\n const onAborted = onceAborted(signal).then(() => {\n if (this.#calls.has(callId)) {\n this.#send(ClientMessageType.RpcAbort, encodeNumber(callId, 'Uint32'))\n }\n throw new ProtocolError(ErrorCode.RequestTimeout, 'Request timeout')\n })\n\n return Promise.race([call.promise, onAborted])\n }\n\n #handleResponse(buffer: ArrayBuffer) {\n const callStreams: ProtocolServerBlobStream[] = []\n const response = this.#format.decodeRPC(buffer, {\n addStream: (id, metadata) => {\n console.log('Client transport blob stream', id, metadata)\n const stream = new ProtocolServerBlobStream(id, metadata, () => {\n this.#send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(id, 'Uint32'),\n )\n })\n callStreams.push(stream)\n this.#serverStreams.add(id, stream)\n return stream\n },\n getStream: (id) => {\n return this.#serverStreams.get(id)\n },\n })\n\n console.log('Client transport response', response)\n\n const call = this.#calls.get(response.callId)\n\n if (call) {\n this.#calls.delete(response.callId)\n\n if (response.error) {\n const error = new ProtocolError(\n response.error.code,\n response.error.message,\n response.error.data,\n )\n return { call, response, error }\n } else {\n const payload = this.transformer.decodeRPC(\n call.namespace,\n call.procedure,\n response.payload,\n )\n return { call, response, payload }\n }\n }\n\n for (const stream of callStreams) {\n this.#serverStreams.abort(stream.id)\n }\n\n throw new Error('Call not found')\n }\n}\n"],"names":["createPromise","onceAborted","concat","decodeNumber","encodeNumber","ClientMessageType","ErrorCode","ServerMessageType","EventEmitter","ProtocolClientBlobStream","ProtocolServerBlobStream","ProtocolServerStream","ProtocolError","Error","code","data","constructor","message","toString","toJSON","ProtocolClientStreams","Map","get","streamId","stream","add","source","metadata","set","remove","delete","abort","pull","size","read","end","clear","error","values","ProtocolServerStreams","has","push","chunk","ProtocolBaseTransformer","encodeRPC","namespace","procedure","payload","decodeRPC","decodeRPCChunk","decodeEvent","event","ProtocolBaseClient","transformer","options","transport","format","timeout","on","Event","buffer","decode","name","transformed","emit","RpcResponse","call","reject","resolve","RpcStreamResponse","response","console","log","callId","RpcStreamChunk","slice","Uint32Array","BYTES_PER_ELEMENT","byteLength","RpcStreamAbort","ServerStreamPush","ServerStreamPull","ServerStreamAbort","ServerStreamEnd","ClientStreamAbort","ClientStreamPull","streamIdEncoded","ClientStreamPush","ClientStreamEnd","connect","auth","contentType","disconnect","messageType","send","ConnectionError","_call","timeoutSignal","AbortSignal","signal","any","Object","assign","addStream","blob","getStream","id","Rpc","catch","onAborted","then","RpcAbort","RequestTimeout","Promise","race","promise","callStreams"],"mappings":"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"}
|
package/dist/server/protocol.js
CHANGED
|
@@ -65,7 +65,7 @@ export class ProtocolConnections {
|
|
|
65
65
|
this.#collection.delete(connectionId);
|
|
66
66
|
const { calls, serverStreams, clientStreams, rpcStreams, container } = context;
|
|
67
67
|
for (const call of calls.values()){
|
|
68
|
-
call.
|
|
68
|
+
call.abort(new Error('Connection closed'));
|
|
69
69
|
}
|
|
70
70
|
for (const stream of clientStreams.values()){
|
|
71
71
|
stream.destroy(new Error('Connection closed'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../lib/server/protocol.ts"],"sourcesContent":["import { type Callback, createPromise, defer, throwError } from '@nmtjs/common'\nimport { type Container, Hook, type Logger, Scope } 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 type { ProtocolApi, ProtocolApiCallResult } from './api.ts'\nimport {\n Connection,\n ConnectionContext,\n type ConnectionOptions,\n} from './connection.ts'\nimport type { Format } from './format.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 class ProtocolConnections {\n readonly #collection = new Map<\n string,\n {\n connection: Connection\n context: ConnectionContext\n transport: Transport\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: Transport<any>,\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\n this.#collection.set(connection.id, { connection, context, transport })\n\n await this.application.registry.hooks.call(\n Hook.OnConnect,\n { concurrent: false },\n connection,\n )\n\n return { connection, context }\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.reject(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\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.push(Buffer.from(chunk))\n }\n\n end(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.push(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 class Protocol {\n readonly connections: ProtocolConnections\n readonly clientStreams: ProtocolClientStreams\n readonly 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 rpc(\n connectionId: string,\n rpc: ProtocolRPC,\n params: { signal?: AbortSignal } = {},\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 const call = Object.assign(createPromise<ProtocolApiCallResult>(), {\n abort: () => abortController.abort(),\n })\n\n calls.set(callId, call)\n call.promise.finally(() => calls.delete(callId))\n\n const callIdEncoded = encodeNumber(callId, 'Uint32')\n const container = context.container.fork(Scope.Call)\n\n try {\n const response = await this.application.api.call({\n connection,\n container,\n namespace,\n payload,\n procedure,\n signal,\n })\n\n const responseEncoded = format.encoder.encodeRPC(\n {\n callId,\n payload: response.output,\n },\n {\n addStream: (blob) => {\n const id = context.streamId++\n const stream = this.serverStreams.add(connectionId, id, blob)\n stream.on('data', (chunk) => {\n stream.pause()\n transport.send(\n connection,\n ServerMessageType.ServerStreamPush,\n concat(\n encodeNumber(id, 'Uint32'),\n Buffer.from(chunk).buffer as ArrayBuffer,\n ),\n )\n })\n stream.on('error', (err) => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamAbort,\n encodeNumber(id, 'Uint32'),\n )\n })\n stream.on('end', () => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamEnd,\n encodeNumber(id, 'Uint32'),\n )\n })\n return stream\n },\n getStream: (id) => {\n return this.clientStreams.get(connectionId, id)\n },\n },\n )\n\n if ('subscription' in response) {\n throwError('Unimplemented')\n } else if ('iterable' in response) {\n transport.send(\n connection,\n ServerMessageType.RpcStreamResponse,\n responseEncoded,\n )\n try {\n const ab = new AbortController()\n context.rpcStreams.set(callId, ab)\n const iterable =\n typeof response.iterable === 'function'\n ? response.iterable()\n : response.iterable\n for await (const chunk of iterable) {\n if (ab.signal.aborted) break\n const chunkEncoded = format.encoder.encode(chunk)\n transport.send(\n connection,\n ServerMessageType.RpcStreamChunk,\n concat(callIdEncoded, chunkEncoded),\n )\n }\n } catch (error) {\n this.application.logger.error(error)\n transport.send(\n connection,\n ServerMessageType.RpcStreamAbort,\n callIdEncoded,\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 )\n }\n } catch (error) {\n if (error instanceof ProtocolError === false) {\n this.application.logger.error(\n { error, connection },\n 'Error during RPC call',\n )\n\n // biome-ignore lint/suspicious/noCatchAssign:\n error = new ProtocolError(\n ErrorCode.InternalServerError,\n 'Internal server error',\n )\n }\n\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 transport.send(connection, ServerMessageType.RpcResponse, payload)\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 rpcRaw(\n connectionId: string,\n buffer: ArrayBuffer,\n params: { signal?: AbortSignal } = {},\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: (id, metadata) => {\n return this.clientStreams.add(connectionId, id, metadata, (size) => {\n transport.send(\n connection,\n ServerMessageType.ClientStreamPull,\n concat(encodeNumber(id, 'Uint32'), encodeNumber(size, 'Uint32')),\n )\n })\n },\n getStream: (id) => {\n return this.serverStreams.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"],"names":["createPromise","defer","throwError","Hook","Scope","concat","decodeNumber","encodeNumber","ErrorCode","ServerMessageType","Connection","ConnectionContext","ProtocolClientStream","ProtocolServerStream","getFormat","ProtocolError","Error","code","data","constructor","message","toString","toJSON","ProtocolConnections","application","Map","get","connectionId","connection","add","transport","options","params","format","container","fork","context","set","id","registry","hooks","call","OnConnect","concurrent","remove","OnDisconnect","delete","calls","serverStreams","clientStreams","rpcStreams","values","reject","stream","destroy","abort","dispose","error","logger","ProtocolClientStreams","connections","streamId","metadata","read","push","chunk","Buffer","from","end","ProtocolServerStreams","blob","has","pull","resume","Protocol","rpc","callId","namespace","procedure","payload","abortController","AbortController","signal","AbortSignal","any","Object","assign","promise","finally","callIdEncoded","Call","response","api","responseEncoded","encoder","encodeRPC","output","addStream","on","pause","send","ServerStreamPush","buffer","err","ServerStreamAbort","ServerStreamEnd","getStream","RpcStreamResponse","ab","iterable","aborted","chunkEncoded","encode","RpcStreamChunk","RpcStreamAbort","onFinish","RpcResponse","InternalServerError","catch","rpcRaw","decoder","decodeRPC","size","ClientStreamPull","rpcAbort","rpcAbortRaw","rpcStreamAbort","rpcStreamAbortRaw","notify","event"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../lib/server/protocol.ts"],"sourcesContent":["import { type Callback, createPromise, defer, throwError } from '@nmtjs/common'\nimport { type Container, Hook, type Logger, Scope } 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 type { ProtocolApi, ProtocolApiCallResult } from './api.ts'\nimport {\n Connection,\n ConnectionContext,\n type ConnectionOptions,\n} from './connection.ts'\nimport type { Format } from './format.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 class ProtocolConnections {\n readonly #collection = new Map<\n string,\n {\n connection: Connection\n context: ConnectionContext\n transport: Transport\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: Transport<any>,\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\n this.#collection.set(connection.id, { connection, context, transport })\n\n await this.application.registry.hooks.call(\n Hook.OnConnect,\n { concurrent: false },\n connection,\n )\n\n return { connection, context }\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\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.push(Buffer.from(chunk))\n }\n\n end(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.push(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 class Protocol {\n readonly connections: ProtocolConnections\n readonly clientStreams: ProtocolClientStreams\n readonly 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 rpc(\n connectionId: string,\n rpc: ProtocolRPC,\n params: { signal?: AbortSignal } = {},\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 const call = Object.assign(createPromise<ProtocolApiCallResult>(), {\n abort: () => abortController.abort(),\n })\n\n calls.set(callId, call)\n call.promise.finally(() => calls.delete(callId))\n\n const callIdEncoded = encodeNumber(callId, 'Uint32')\n const container = context.container.fork(Scope.Call)\n\n try {\n const response = await this.application.api.call({\n connection,\n container,\n namespace,\n payload,\n procedure,\n signal,\n })\n\n const responseEncoded = format.encoder.encodeRPC(\n {\n callId,\n payload: response.output,\n },\n {\n addStream: (blob) => {\n const id = context.streamId++\n const stream = this.serverStreams.add(connectionId, id, blob)\n stream.on('data', (chunk) => {\n stream.pause()\n transport.send(\n connection,\n ServerMessageType.ServerStreamPush,\n concat(\n encodeNumber(id, 'Uint32'),\n Buffer.from(chunk).buffer as ArrayBuffer,\n ),\n )\n })\n stream.on('error', (err) => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamAbort,\n encodeNumber(id, 'Uint32'),\n )\n })\n stream.on('end', () => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamEnd,\n encodeNumber(id, 'Uint32'),\n )\n })\n return stream\n },\n getStream: (id) => {\n return this.clientStreams.get(connectionId, id)\n },\n },\n )\n\n if ('subscription' in response) {\n throwError('Unimplemented')\n } else if ('iterable' in response) {\n transport.send(\n connection,\n ServerMessageType.RpcStreamResponse,\n responseEncoded,\n )\n try {\n const ab = new AbortController()\n context.rpcStreams.set(callId, ab)\n const iterable =\n typeof response.iterable === 'function'\n ? response.iterable()\n : response.iterable\n for await (const chunk of iterable) {\n if (ab.signal.aborted) break\n const chunkEncoded = format.encoder.encode(chunk)\n transport.send(\n connection,\n ServerMessageType.RpcStreamChunk,\n concat(callIdEncoded, chunkEncoded),\n )\n }\n } catch (error) {\n this.application.logger.error(error)\n transport.send(\n connection,\n ServerMessageType.RpcStreamAbort,\n callIdEncoded,\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 )\n }\n } catch (error) {\n if (error instanceof ProtocolError === false) {\n this.application.logger.error(\n { error, connection },\n 'Error during RPC call',\n )\n\n // biome-ignore lint/suspicious/noCatchAssign:\n error = new ProtocolError(\n ErrorCode.InternalServerError,\n 'Internal server error',\n )\n }\n\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 transport.send(connection, ServerMessageType.RpcResponse, payload)\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 rpcRaw(\n connectionId: string,\n buffer: ArrayBuffer,\n params: { signal?: AbortSignal } = {},\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: (id, metadata) => {\n return this.clientStreams.add(connectionId, id, metadata, (size) => {\n transport.send(\n connection,\n ServerMessageType.ClientStreamPull,\n concat(encodeNumber(id, 'Uint32'), encodeNumber(size, 'Uint32')),\n )\n })\n },\n getStream: (id) => {\n return this.serverStreams.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"],"names":["createPromise","defer","throwError","Hook","Scope","concat","decodeNumber","encodeNumber","ErrorCode","ServerMessageType","Connection","ConnectionContext","ProtocolClientStream","ProtocolServerStream","getFormat","ProtocolError","Error","code","data","constructor","message","toString","toJSON","ProtocolConnections","application","Map","get","connectionId","connection","add","transport","options","params","format","container","fork","context","set","id","registry","hooks","call","OnConnect","concurrent","remove","OnDisconnect","delete","calls","serverStreams","clientStreams","rpcStreams","values","abort","stream","destroy","dispose","error","logger","ProtocolClientStreams","connections","streamId","metadata","read","push","chunk","Buffer","from","end","ProtocolServerStreams","blob","has","pull","resume","Protocol","rpc","callId","namespace","procedure","payload","abortController","AbortController","signal","AbortSignal","any","Object","assign","promise","finally","callIdEncoded","Call","response","api","responseEncoded","encoder","encodeRPC","output","addStream","on","pause","send","ServerStreamPush","buffer","err","ServerStreamAbort","ServerStreamEnd","getStream","RpcStreamResponse","ab","iterable","aborted","chunkEncoded","encode","RpcStreamChunk","RpcStreamAbort","onFinish","RpcResponse","InternalServerError","catch","rpcRaw","decoder","decodeRPC","size","ClientStreamPull","rpcAbort","rpcAbortRaw","rpcStreamAbort","rpcStreamAbortRaw","notify","event"],"mappings":"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"}
|
package/lib/client/protocol.ts
CHANGED
|
@@ -85,6 +85,15 @@ export class ProtocolClientStreams {
|
|
|
85
85
|
stream.end()
|
|
86
86
|
this.remove(streamId)
|
|
87
87
|
}
|
|
88
|
+
|
|
89
|
+
clear(error?: Error) {
|
|
90
|
+
if (error) {
|
|
91
|
+
for (const stream of this.#collection.values()) {
|
|
92
|
+
stream.abort(error)
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
this.#collection.clear()
|
|
96
|
+
}
|
|
88
97
|
}
|
|
89
98
|
|
|
90
99
|
export class ProtocolServerStreams {
|
|
@@ -127,12 +136,26 @@ export class ProtocolServerStreams {
|
|
|
127
136
|
stream.end()
|
|
128
137
|
this.remove(streamId)
|
|
129
138
|
}
|
|
139
|
+
|
|
140
|
+
clear(error?: Error) {
|
|
141
|
+
if (error) {
|
|
142
|
+
for (const stream of this.#collection.values()) {
|
|
143
|
+
stream.abort(error)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
this.#collection.clear()
|
|
147
|
+
}
|
|
130
148
|
}
|
|
131
149
|
|
|
132
150
|
export interface ProtocolTransport
|
|
133
|
-
extends EventEmitter<
|
|
134
|
-
|
|
135
|
-
|
|
151
|
+
extends EventEmitter<
|
|
152
|
+
{
|
|
153
|
+
[K in `${ServerMessageType}`]: [ArrayBuffer]
|
|
154
|
+
} & {
|
|
155
|
+
connected: []
|
|
156
|
+
disconnected: []
|
|
157
|
+
}
|
|
158
|
+
> {
|
|
136
159
|
connect(
|
|
137
160
|
auth: any,
|
|
138
161
|
contentType: BaseClientFormat['contentType'],
|
|
@@ -354,6 +377,8 @@ export abstract class ProtocolBaseClient<
|
|
|
354
377
|
}
|
|
355
378
|
},
|
|
356
379
|
)
|
|
380
|
+
|
|
381
|
+
this.#transport.on('disconnected', () => {})
|
|
357
382
|
}
|
|
358
383
|
|
|
359
384
|
async connect(auth: any) {
|
|
@@ -361,6 +386,7 @@ export abstract class ProtocolBaseClient<
|
|
|
361
386
|
}
|
|
362
387
|
|
|
363
388
|
async disconnect() {
|
|
389
|
+
this.#clear()
|
|
364
390
|
return await this.#transport.disconnect()
|
|
365
391
|
}
|
|
366
392
|
|
|
@@ -373,6 +399,20 @@ export abstract class ProtocolBaseClient<
|
|
|
373
399
|
return await this.#transport.send(messageType, buffer)
|
|
374
400
|
}
|
|
375
401
|
|
|
402
|
+
async #clear() {
|
|
403
|
+
const error = new ProtocolError(
|
|
404
|
+
ErrorCode.ConnectionError,
|
|
405
|
+
'Connection closed',
|
|
406
|
+
)
|
|
407
|
+
for (const call of this.#calls.values()) call.reject(error)
|
|
408
|
+
this.#calls.clear()
|
|
409
|
+
this.#serverStreams.clear(error)
|
|
410
|
+
this.#clientStreams.clear(error)
|
|
411
|
+
this.#rpcStreams.clear(error)
|
|
412
|
+
this.#callId = 0
|
|
413
|
+
this.#streamId = 0
|
|
414
|
+
}
|
|
415
|
+
|
|
376
416
|
protected async _call(
|
|
377
417
|
namespace: string,
|
|
378
418
|
procedure: string,
|
package/lib/server/protocol.ts
CHANGED
package/package.json
CHANGED
|
@@ -19,9 +19,9 @@
|
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@nmtjs/
|
|
23
|
-
"@nmtjs/core": "0.6.
|
|
24
|
-
"@nmtjs/
|
|
22
|
+
"@nmtjs/type": "0.6.5",
|
|
23
|
+
"@nmtjs/core": "0.6.5",
|
|
24
|
+
"@nmtjs/common": "0.6.5"
|
|
25
25
|
},
|
|
26
26
|
"files": [
|
|
27
27
|
"index.ts",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"LICENSE.md",
|
|
31
31
|
"README.md"
|
|
32
32
|
],
|
|
33
|
-
"version": "0.6.
|
|
33
|
+
"version": "0.6.5",
|
|
34
34
|
"scripts": {
|
|
35
35
|
"build": "neemata-build --root=./lib './**/*.ts'",
|
|
36
36
|
"type-check": "tsc --noEmit"
|