@nmtjs/protocol 0.10.5 → 0.11.1
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
|
@@ -104,7 +104,7 @@ export class ProtocolServerStreams {
|
|
|
104
104
|
this.#collection.clear();
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
|
-
export class ProtocolTransport {}
|
|
107
|
+
export class ProtocolTransport extends EventEmitter {}
|
|
108
108
|
export class ProtocolBaseTransformer {
|
|
109
109
|
encodeRPC(namespace, procedure, payload) {
|
|
110
110
|
return payload;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"mappings":"AAAA,SACE,qBAGK,eAAe;AACtB,SAAS,QAAQ,cAAc,oBAAoB,qBAAqB;AAExE,SACE,mBACA,WACA,yBACK,oBAAoB;AAM3B,SAAS,oBAAoB,aAAa;AAE1C,SACE,0BACA,0BACA,4BACK,aAAa;AAEpB,OAAO,MAAM,sBAAsB,MAAmC;CACpE;CACA;CAEA,YAAYA,MAAcC,SAAkBC,MAAY;AACtD,QAAM,QAAQ;AACd,OAAK,OAAO;AACZ,OAAK,OAAO;CACb;CAED,IAAI,UAAU;AACZ,UAAQ,EAAE,KAAK,KAAK,GAAG,MAAM,QAAQ;CACtC;CAED,WAAW;AACT,UAAQ,EAAE,KAAK,KAAK,GAAG,KAAK,QAAQ;CACrC;CAED,SAAS;AACP,SAAO;GACL,MAAM,KAAK;GACX,SAAS,KAAK;GACd,MAAM,KAAK;EACZ;CACF;AACF;AAED,OAAO,MAAM,sBAAsB;CACjC,AAASC,cAAc,IAAI;CAE3B,IAAIC,UAAkB;EACpB,MAAM,SAAS,KAAKD,YAAY,IAAI,SAAS;AAC7C,OAAK,OAAQ,OAAM,IAAI,MAAM;AAC7B,SAAO;CACR;CAED,IACEE,QACAD,UACAE,UACA;EACA,MAAM,SAAS,IAAI,yBAAyB,QAAQ,UAAU;AAC9D,OAAKH,YAAY,IAAI,UAAU,OAAO;AACtC,SAAO;CACR;CAED,OAAOC,UAAkB;AACvB,OAAKD,YAAY,OAAO,SAAS;CAClC;CAED,MAAMC,UAAkBG,OAAe;EACrC,MAAM,SAAS,KAAK,IAAI,SAAS;AACjC,SAAO,MAAM,MAAM;AACnB,OAAK,OAAO,SAAS;CACtB;CAED,KAAKH,UAAkBI,MAAc;EACnC,MAAM,SAAS,KAAK,IAAI,SAAS;AACjC,SAAO,OAAO,KAAK,KAAK;CACzB;CAED,IAAIJ,UAAkB;AACpB,OAAK,IAAI,SAAS,CAAC,KAAK;AACxB,OAAK,OAAO,SAAS;CACtB;CAED,MAAMG,OAAe;AACnB,MAAI,OAAO;AACT,QAAK,MAAM,UAAU,KAAKJ,YAAY,QAAQ,EAAE;AAC9C,WAAO,MAAM,MAAM;GACpB;EACF;AACD,OAAKA,YAAY,OAAO;CACzB;AACF;AAED,OAAO,MAAM,sBAEX;CACA,AAASA,cAAc,IAAI;CAE3B,IAAIC,UAAkB;AACpB,SAAO,KAAKD,YAAY,IAAI,SAAS;CACtC;CAED,IAAIC,UAAkB;EACpB,MAAM,SAAS,KAAKD,YAAY,IAAI,SAAS;AAC7C,OAAK,OAAQ,OAAM,IAAI,MAAM;AAC7B,SAAO;CACR;CAED,IAAIC,UAAkBK,QAAW;AAC/B,OAAKN,YAAY,IAAI,UAAU,OAAO;AACtC,SAAO;CACR;CAED,OAAOC,UAAkB;AACvB,OAAKD,YAAY,OAAO,SAAS;CAClC;CAED,MAAMC,UAAkB;AACtB,MAAI,KAAK,IAAI,SAAS,EAAE;GACtB,MAAM,SAAS,KAAK,IAAI,SAAS;AACjC,UAAO,OAAO;AACd,QAAK,OAAO,SAAS;EACtB;CACF;CAED,MAAM,KAAKA,UAAkBM,OAAoB;EAC/C,MAAM,SAAS,KAAK,IAAI,SAAS;AACjC,SAAO,MAAM,OAAO,KAAK,MAAM;CAChC;CAED,IAAIN,UAAkB;EACpB,MAAM,SAAS,KAAK,IAAI,SAAS;AACjC,SAAO,KAAK;AACZ,OAAK,OAAO,SAAS;CACtB;CAED,MAAMG,OAAe;AACnB,MAAI,OAAO;AACT,QAAK,MAAM,UAAU,KAAKJ,YAAY,QAAQ,EAAE;AAC9C,WAAO,MAAM,MAAM;GACpB;EACF;AACD,OAAKA,YAAY,OAAO;CACzB;AACF;AAcD,OAAO,MAAe,kBAAkB,CAkBvC;AAED,OAAO,MAAM,wBAAwB;CACnC,UAAUQ,WAAmBC,WAAmBC,SAAc;AAC5D,SAAO;CACR;CACD,UAAUF,WAAmBC,WAAmBC,SAAc;AAC5D,SAAO;CACR;CACD,eAAeF,WAAmBC,WAAmBC,SAAc;AACjE,SAAO;CACR;CACD,YAAYF,WAAmBG,OAAeD,SAAc;AAC1D,SAAO;CACR;AACF;AAiBD,OAAO,MAAM,qBAKH,aAQR;CACA,AAAmB,gBACjB,IAAI;CACN,AAAmB,gBACjB,IAAI;CACN,AAAmB,aACjB,IAAI;CACN,AAAmB,QAAQ,IAAI;CAC/B,AAAU,SAAS;CACnB,AAAU,WAAW;CAErB,YAA4BE,QAA0B;AACpD,SAAO;OADmB;CAE3B;CAED,IAAI,cAAc;AAChB,SAAO,KAAK,OAAO;CACpB;CAED,mBACEC,QACAC,MACAC,UAGAC,aACA;AACA,MAAI,SAAS,OAAO;AAClB,QAAK,OACH,IAAI,cACF,SAAS,MAAM,MACf,SAAS,MAAM,SACf,SAAS,MAAM,MAElB;EACF,OAAM;AACL,OAAI;IACF,MAAM,cAAc,YAAY,UAC9B,KAAK,WACL,KAAK,WACL,SAAS,OACV;AACD,QAAI,SAAS,OACX,MAAK,QAAQ;KAAE,QAAQ;KAAa,QAAQ,SAAS;IAAQ,EAAC;QAC3D,MAAK,QAAQ,YAAY;GAC/B,SAAQ,OAAO;AACd,SAAK,OACH,IAAI,cACF,UAAU,oBACV,6BACA,OAEH;GACF;EACF;AACD,OAAK,MAAM,OAAO,OAAO;CAC1B;CAED,kBACE,EAAE,QAAQ,OAAO,QAAQ,SAA8B,EACvDA,aACAC,QACA;EACA,MAAM,OAAO,KAAK,MAAM,IAAI,OAAO;AACnC,OAAK,KAAM,OAAM,IAAI,MAAM;AAC3B,OAAK,MAAM,OAAO,SAAS;GACzB,MAAM,SAAS,QAAQ;AACvB,QAAK,cAAc,IAAI,OAAO,IAAI,OAAO;EAC1C;AACD,OAAK,mBACH,QACA,MACA,QAAQ,EAAE,MAAO,IAAG;GAAE;GAAQ;EAAQ,GACtC,YACD;AACD,SAAO;CACR;CAED,wBACEC,UACAC,QACAH,aACA;EACA,MAAM,OAAO,KAAK,kBAAkB,UAAU,aAAa,OAAO;AAClE,OAAK,WAAW,IAAI,SAAS,QAAQ,OAAO;AAC5C,SAAO;CACR;CAED,WACER,WACAC,WACAW,SACA;EACA,MAAM,gBAAgB,YAAY,QAAQ,QAAQ,QAAQ;EAC1D,MAAM,SAAS,QAAQ,SACnB,YAAY,IAAI,CAAC,QAAQ,QAAQ,aAAc,EAAC,GAChD;EAEJ,MAAM,OAAO,OAAO,OAAO,eAAe,EAAE;GAC1C;GACA;GACA;EACD,EAAC;AAEF,gBAAc,iBACZ,SACA,MAAM;GACJ,MAAM,QAAQ,IAAI,cAChB,UAAU,gBACV;AAEF,QAAK,OAAO,MAAM;EACnB,GACD,EAAE,MAAM,KAAM,EACf;AAED,SAAO;CACR;CAED,UACEZ,WACAC,WACAC,SACAU,SACAJ,aACA;EACA,MAAM,SAAS,EAAE,KAAK;EACtB,MAAM,OAAO,KAAK,WAAW,WAAW,WAAW,QAAQ;EAC3D,MAAM,EAAE,QAAQ,SAAS,GAAG,KAAK,OAAO,UACtC;GACE;GACA;GACA;GACA,SAAS,YAAY,UAAU,WAAW,WAAW,QAAQ;EAC9D,GACD;GACE,WAAW,CAAC,SAAS;IACnB,MAAM,WAAW,EAAE,KAAK;AACxB,WAAO,KAAK,cAAc,IAAI,KAAK,QAAQ,UAAU,KAAK,SAAS;GACpE;GACD,WAAW,CAAC,OAAO;IACjB,MAAM,SAAS,KAAK,cAAc,IAAI,GAAG;AACzC,WAAO;GACR;EACF,EACF;AAED,OAAK,MAAM,IAAI,QAAQ,KAAK;AAE5B,SAAO;GAAE;GAAQ;GAAM;GAAS;EAAQ;CACzC;CAED,cAAcH,QAAgBQ,OAAY;AACxC,OAAK,WAAW,KAAK,QAAQ,MAAM;CACpC;CAED,aAAaR,QAAgB;AAC3B,OAAK,WAAW,IAAI,OAAO;CAC5B;CAED,eAAeA,QAAgB;AAC7B,OAAK,WAAW,MAAM,OAAO;CAC9B;CAED,mBAAmBZ,UAAkB;AACnC,OAAK,cAAc,OAAO,SAAS;CACpC;CAED,iBAAiBA,UAAkBI,MAAc;AAC/C,SAAO,KAAK,cAAc,KAAK,UAAU,KAAK;CAC/C;CAED,gBAAgBJ,UAAkB;AAChC,OAAK,cAAc,IAAI,SAAS;CACjC;CAED,kBAAkBA,UAAkBG,OAAe;AACjD,OAAK,cAAc,MAAM,UAAU,MAAM;CAC1C;CAED,gBAAgBkB,QAAkC;AAChD,OAAK,cAAc,IAAI,OAAO,IAAI,OAAO;CAC1C;CAED,mBAAmBrB,UAAkB;AACnC,OAAK,cAAc,OAAO,SAAS;CACpC;CAED,iBAAiBA,UAAkBM,OAAoB;AACrD,SAAO,KAAK,cAAc,KAAK,UAAU,MAAM;CAChD;CAED,gBAAgBN,UAAkB;AAChC,OAAK,cAAc,IAAI,SAAS;CACjC;CAED,kBAAkBA,UAAkBG,OAAe;AACjD,OAAK,cAAc,MAAM,SAAS;CACnC;CAED,UACEI,WACAG,OACAY,SACAP,aACA;EACA,MAAM,cAAc,YAAY,YAAY,WAAW,OAAO,QAAQ;AACtE,OAAK,MAAM,EAAE,UAAU,GAAG,MAAM,GAAG,YAAY;CAChD;AACF;AAED,OAAO,MAAM,iBAKH,aAAgB;CACxB,oBACEQ,QACAC,WACAT,aACA;EACA,MAAM,OAAO,aAAa,QAAQ,QAAQ;EAC1C,MAAM,gBAAgB,OAAO,MAAM,WAAW,kBAAkB;AAChE,MAAI,QAAQ,mBAAmB;GAC7B,MAAM,cAAc;AACpB,cAAW,kBAAkB,iBAAiB,aAAa;AACzD,SAAK,aAAa,eAAe,WAAW,YAAY;GACzD,OAAM;AACL,UAAM,IAAI,OAAO,wBAAwB,YAAY;GACtD;EACF;CACF;CAED,CAAW,kBAAkB,OAC3BQ,QACAC,WACAT,aACA;EACA,MAAM,CAAC,WAAW,OAAO,QAAQ,GAAG,KAAK,OAAO,OAAO,OAAO;AAC9D,OAAK,UAAU,WAAW,OAAO,SAAS,YAAY;CACvD;CAED,CAAW,kBAAkB,aAC3BQ,QACAC,WACAT,aACA;EACA,MAAM,WAAW,KAAK,OAAO,UAAU,QAAQ;GAC7C,WAAW,CAAC,IAAI,QAAQ,aAAa;AACnC,WAAO,IAAI,yBAAyB,IAAI,UAAU,EAChD,OAAO,MAAM;AACX,eAAU,KACR,kBAAkB,kBAClB,aAAa,IAAI,SAAS,EAC1B;MAAE;MAAQ,UAAU;KAAI,EACzB;IACF,EACF;GACF;GACD,WAAW,CAAC,OAAO;AACjB,WAAO,KAAK,cAAc,IAAI,GAAG;GAClC;EACF,EAAC;AACF,OAAK,kBAAkB,UAAU,YAAY;CAC9C;CAED,CAAW,kBAAkB,mBAC3BQ,QACAC,WACAT,aACA;EACA,MAAM,WAAW,KAAK,OAAO,UAAU,QAAQ;GAC7C,WAAW,CAAC,IAAI,QAAQ,aAAa;AACnC,WAAO,IAAI,yBAAyB,IAAI,UAAU,EAChD,OAAO,MAAM;AACX,eAAU,KACR,kBAAkB,kBAClB,aAAa,IAAI,SAAS,EAC1B;MAAE;MAAQ,UAAU;KAAI,EACzB;IACF,EACF;GACF;GACD,WAAW,CAAC,OAAO;AACjB,WAAO,KAAK,cAAc,IAAI,GAAG;GAClC;EACF,EAAC;EAEF,MAAM,SAAS,IAAI,qBAAqB,EACtC,WAAW,CAAC,OAAO,eAAe;GAChC,MAAM,cAAc,YAAY,eAC9B,KAAK,WACL,KAAK,WACL,MACD;AACD,cAAW,QAAQ,YAAY;EAChC,EACF;EAED,MAAM,OAAO,KAAK,wBAAwB,UAAU,QAAQ,YAAY;CACzE;CAED,CAAW,kBAAkB,gBAC3BQ,QACAC,WACAT,aACA;EACA,MAAM,SAAS,aAAa,QAAQ,SAAS;EAC7C,MAAM,QAAQ,OAAO,MAAM,YAAY,kBAAkB;EACzD,MAAM,UAAU,KAAK,OAAO,OAAO,MAAM;AACzC,OAAK,cAAc,QAAQ,QAAQ;CACpC;CAED,CAAW,kBAAkB,cAC3BQ,QACAC,WACAT,aACA;EACA,MAAM,SAAS,aAAa,QAAQ,SAAS;AAC7C,OAAK,aAAa,OAAO;CAC1B;CAED,CAAW,kBAAkB,gBAC3BQ,QACAC,WACAT,aACA;EACA,MAAM,SAAS,aAAa,QAAQ,SAAS;AAC7C,OAAK,eAAe,OAAO;CAC5B;CAED,CAAW,kBAAkB,kBAC3BQ,QACAC,WACAT,aACA;EACA,MAAM,WAAW,aAAa,QAAQ,SAAS;EAC/C,MAAM,QAAQ,OAAO,MAAM,YAAY,kBAAkB;AACzD,OAAK,iBAAiB,UAAU,MAAM;AACtC,YAAU,KACR,kBAAkB,kBAClB,aAAa,UAAU,SAAS,EAChC,EAAE,SAAU,EACb;CACF;CAED,CAAW,kBAAkB,iBAC3BQ,QACAC,WACAT,aACA;EACA,MAAM,WAAW,aAAa,QAAQ,SAAS;AAC/C,OAAK,gBAAgB,SAAS;CAC/B;CAED,CAAW,kBAAkB,mBAC3BQ,QACAC,WACAT,aACA;EACA,MAAM,WAAW,aAAa,QAAQ,SAAS;AAC/C,OAAK,kBAAkB,SAAS;CACjC;CAED,CAAW,kBAAkB,kBAC3BQ,QACAC,WACAT,aACA;EACA,MAAM,WAAW,aAAa,QAAQ,SAAS;EAC/C,MAAM,OAAO,aAAa,QAAQ,UAAU,YAAY,kBAAkB;AAC1E,OAAK,iBAAiB,UAAU,KAAK,CAAC,KAAK,CAAC,UAAU;AACpD,OAAI,OAAO;AACT,cAAU,KACR,kBAAkB,kBAClB,OAAO,aAAa,UAAU,SAAS,EAAE,MAAM,EAC/C,EAAE,SAAU,EACb;GACF,OAAM;AACL,cAAU,KACR,kBAAkB,iBAClB,aAAa,UAAU,SAAS,EAChC,EAAE,SAAU,EACb;AACD,SAAK,gBAAgB,SAAS;GAC/B;EACF,EAAC;CACH;CAED,CAAW,kBAAkB,mBAC3BQ,QACAC,WACAT,aACA;EACA,MAAM,WAAW,aAAa,QAAQ,SAAS;AAC/C,OAAK,kBAAkB,SAAS;CACjC;AACF","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 [K in `${ServerMessageType}`]: [ArrayBuffer]\n} & {\n connected: []\n disconnected: []\n}\n\nexport interface ProtocolSendMetadata {\n callId?: number\n streamId?: number\n}\n\nexport abstract class ProtocolTransport {\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 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"}
|
package/package.json
CHANGED
|
@@ -16,14 +16,14 @@
|
|
|
16
16
|
}
|
|
17
17
|
},
|
|
18
18
|
"dependencies": {
|
|
19
|
-
"@nmtjs/
|
|
20
|
-
"@nmtjs/
|
|
21
|
-
"@nmtjs/core": "0.
|
|
19
|
+
"@nmtjs/common": "0.11.1",
|
|
20
|
+
"@nmtjs/type": "0.11.1",
|
|
21
|
+
"@nmtjs/core": "0.11.1"
|
|
22
22
|
},
|
|
23
23
|
"peerDependencies": {
|
|
24
|
-
"@nmtjs/
|
|
25
|
-
"@nmtjs/
|
|
26
|
-
"@nmtjs/
|
|
24
|
+
"@nmtjs/common": "0.11.1",
|
|
25
|
+
"@nmtjs/core": "0.11.1",
|
|
26
|
+
"@nmtjs/type": "0.11.1"
|
|
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.
|
|
34
|
+
"version": "0.11.1",
|
|
35
35
|
"scripts": {
|
|
36
36
|
"build": "neemata-build --root=./src './**/*.ts'",
|
|
37
37
|
"type-check": "tsc --noEmit"
|
package/src/client/protocol.ts
CHANGED
|
@@ -153,8 +153,6 @@ export class ProtocolServerStreams<
|
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
export type ProtocolTransportEventMap = {
|
|
156
|
-
[K in `${ServerMessageType}`]: [ArrayBuffer]
|
|
157
|
-
} & {
|
|
158
156
|
connected: []
|
|
159
157
|
disconnected: []
|
|
160
158
|
}
|
|
@@ -164,7 +162,7 @@ export interface ProtocolSendMetadata {
|
|
|
164
162
|
streamId?: number
|
|
165
163
|
}
|
|
166
164
|
|
|
167
|
-
export abstract class ProtocolTransport {
|
|
165
|
+
export abstract class ProtocolTransport extends EventEmitter<ProtocolTransportEventMap> {
|
|
168
166
|
abstract connect(
|
|
169
167
|
auth: any,
|
|
170
168
|
transformer: ProtocolBaseTransformer,
|