@nmtjs/protocol 0.10.1 → 0.10.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { defer, noopFn } from "@nmtjs/common";
1
+ import { defer } from "@nmtjs/common";
2
2
  import { concat, encodeText } from "../common/binary.js";
3
3
  export class ProtocolClientBlobStream extends TransformStream {
4
4
  #queue;
@@ -53,6 +53,11 @@ export class ProtocolClientBlobStream extends TransformStream {
53
53
  }
54
54
  }
55
55
  export class ProtocolServerStream extends TransformStream {
56
+ #writer;
57
+ constructor(options) {
58
+ super(options);
59
+ this.#writer = this.writable.getWriter();
60
+ }
56
61
  async *[Symbol.asyncIterator]() {
57
62
  const reader = this.readable.getReader();
58
63
  while (true) {
@@ -62,13 +67,13 @@ export class ProtocolServerStream extends TransformStream {
62
67
  }
63
68
  }
64
69
  async push(chunk) {
65
- await this.writable.getWriter().write(chunk);
70
+ await this.#writer.write(chunk);
66
71
  }
67
72
  async end() {
68
- await this.writable.getWriter().close();
73
+ await this.#writer.close();
69
74
  }
70
- abort(error = new Error("Stream aborted")) {
71
- this.writable.getWriter().abort(error);
75
+ async abort(error = new Error("Stream aborted")) {
76
+ await this.#writer.abort(error);
72
77
  }
73
78
  }
74
79
  export class ProtocolServerBlobStream extends ProtocolServerStream {
@@ -1 +1 @@
1
- {"mappings":"AAAA,SAAwB,OAAO,cAAc,eAAe;AAC5D,SAAS,QAAQ,kBAAkB,qBAAqB;AAGxD,OAAO,MAAM,iCAAiC,gBAG5C;CACA;CACA;CAEA,YACWA,QACAC,IACAC,UACT;AACA,QAAM;GACJ,OAAO,MAAM;AACX,UAAM,MAAM,OAAO,YAAY,KAAK,CAAC;GACtC;GACD,WAAW,CAAC,OAAO,eAAe;AAChC,QAAI,iBAAiB,aAAa;AAChC,gBAAW,QAAQ,MAAM;IAC1B,WAAU,iBAAiB,YAAY;AACtC,gBAAW,QAAQ,MAAM,OAAiC;IAC3D,kBAAiB,UAAU,UAAU;AACpC,gBAAW,QAAQ,WAAW,MAAM,CAAC;IACtC,OAAM;AACL,WAAM,IAAI,MACR;IAEH;GACF;EACF,EAAC;OArBO;OACA;OACA;AAqBT,OAAKC,SAAS,IAAI,YAAY;AAC9B,OAAKC,UAAU,KAAK,SAAS,WAAW;CACzC;CAED,MAAM,KAAKC,MAAc;AACvB,SAAO,KAAKF,OAAO,aAAa,MAAM;GACpC,MAAM,EAAE,MAAM,OAAO,GAAG,MAAM,KAAKC,QAAQ,MAAM;AACjD,OAAI,MAAM;AACR,QAAI,KAAKD,OAAO,aAAa,GAAG;KAC9B,MAAM,QAAQ,KAAKA;AACnB,UAAKA,SAAS,IAAI,YAAY;AAC9B,YAAO;IACR;AACD,WAAO;GACR;GACD,MAAM,SAAS;AACf,QAAKA,SAAS,OAAO,KAAKA,QAAQ,OAAO;EAC1C;EACD,MAAM,QAAQ,KAAKA,OAAO,MAAM,GAAG,KAAK;AACxC,OAAKA,SAAS,KAAKA,OAAO,MAAM,KAAK;AACrC,SAAO;CACR;CAED,MAAM,QAAQ,IAAI,MAAM,mBAAmB;AACzC,OAAKC,QAAQ,OAAO,MAAM;AAC1B,OAAK,OAAO,OAAO,MAAM;CAC1B;CAED,MAAM;AACJ,SAAO,KAAK,OAAO,OAAO,eAAe;CAC1C;AACF;AAOD,OAAO,MAAM,6BACH,gBAEV;CACE,QAAQ,OAAO,iBAAiB;EAC9B,MAAM,SAAS,KAAK,SAAS,WAAW;AACxC,SAAO,MAAM;GACX,MAAM,EAAE,MAAM,OAAO,GAAG,MAAM,OAAO,MAAM;AAC3C,QAAK,KAAM,OAAM;OACZ;EACN;CACF;CAED,MAAM,KAAKE,OAAU;AACnB,QAAM,KAAK,SAAS,WAAW,CAAC,MAAM,MAAM;CAC7C;CAED,MAAM,MAAM;AACV,QAAM,KAAK,SAAS,WAAW,CAAC,OAAO;CACxC;CAED,MAAM,QAAQ,IAAI,MAAM,mBAAmB;AACzC,OAAK,SAAS,WAAW,CAAC,MAAM,MAAM;CACvC;AACF;AAED,OAAO,MAAM,iCAAiC,qBAAkC;CAC9E,YACWL,IACAC,UACTK,SACA;AACA,QAAM,QAAQ;OAJL;OACA;CAIV;AACF","names":["source: ReadableStream","id: number","metadata: ProtocolBlobMetadata","#queue","#reader","size: number","chunk: T","options?: Transformer<any, ArrayBuffer>"],"sources":["../../src/client/stream.ts"],"sourcesContent":["import { type Callback, defer, noopFn } from '@nmtjs/common'\nimport { concat, encodeText } from '../common/binary.ts'\nimport type { ProtocolBlobMetadata } from '../common/blob.ts'\n\nexport class ProtocolClientBlobStream extends TransformStream<\n any,\n ArrayBuffer\n> {\n #queue: ArrayBuffer\n #reader: ReadableStreamDefaultReader\n\n constructor(\n readonly source: ReadableStream,\n readonly id: number,\n readonly metadata: ProtocolBlobMetadata,\n ) {\n super({\n start: () => {\n defer(() => source.pipeThrough(this))\n },\n transform: (chunk, controller) => {\n if (chunk instanceof ArrayBuffer) {\n controller.enqueue(chunk)\n } else if (chunk instanceof Uint8Array) {\n controller.enqueue(chunk.buffer as unknown as ArrayBuffer)\n } else if (typeof chunk === 'string') {\n controller.enqueue(encodeText(chunk))\n } else {\n throw new Error(\n 'Invalid chunk data type. Expected ArrayBuffer, Uint8Array, or string.',\n )\n }\n },\n })\n\n this.#queue = new ArrayBuffer(0)\n this.#reader = this.readable.getReader()\n }\n\n async read(size: number) {\n while (this.#queue.byteLength < size) {\n const { done, value } = await this.#reader.read()\n if (done) {\n if (this.#queue.byteLength > 0) {\n const chunk = this.#queue\n this.#queue = new ArrayBuffer(0)\n return chunk\n }\n return null\n }\n const buffer = value as ArrayBuffer\n this.#queue = concat(this.#queue, buffer)\n }\n const chunk = this.#queue.slice(0, size)\n this.#queue = this.#queue.slice(size)\n return chunk\n }\n\n abort(error = new Error('Stream aborted')) {\n this.#reader.cancel(error)\n this.source.cancel(error)\n }\n\n end() {\n return this.source.cancel('Stream ended')\n }\n}\n\nexport interface ProtocolServerStreamInterface<T = any> {\n [Symbol.asyncIterator](): AsyncGenerator<T>\n abort(error?: Error): void\n}\n\nexport class ProtocolServerStream<T = any>\n extends TransformStream<any, T>\n implements ProtocolServerStreamInterface<T>\n{\n async *[Symbol.asyncIterator]() {\n const reader = this.readable.getReader()\n while (true) {\n const { done, value } = await reader.read()\n if (!done) yield value\n else break\n }\n }\n\n async push(chunk: T) {\n await this.writable.getWriter().write(chunk)\n }\n\n async end() {\n await this.writable.getWriter().close()\n }\n\n abort(error = new Error('Stream aborted')) {\n this.writable.getWriter().abort(error)\n }\n}\n\nexport class ProtocolServerBlobStream extends ProtocolServerStream<ArrayBuffer> {\n constructor(\n readonly id: number,\n readonly metadata: ProtocolBlobMetadata,\n options?: Transformer<any, ArrayBuffer>,\n ) {\n super(options)\n }\n}\n"],"version":3,"file":"stream.js"}
1
+ {"mappings":"AAAA,SAAS,aAAa,eAAe;AACrC,SAAS,QAAQ,kBAAkB,qBAAqB;AAGxD,OAAO,MAAM,iCAAiC,gBAG5C;CACA;CACA;CAEA,YACWA,QACAC,IACAC,UACT;AACA,QAAM;GACJ,OAAO,MAAM;AACX,UAAM,MAAM,OAAO,YAAY,KAAK,CAAC;GACtC;GACD,WAAW,CAAC,OAAO,eAAe;AAChC,QAAI,iBAAiB,aAAa;AAChC,gBAAW,QAAQ,MAAM;IAC1B,WAAU,iBAAiB,YAAY;AACtC,gBAAW,QAAQ,MAAM,OAAiC;IAC3D,kBAAiB,UAAU,UAAU;AACpC,gBAAW,QAAQ,WAAW,MAAM,CAAC;IACtC,OAAM;AACL,WAAM,IAAI,MACR;IAEH;GACF;EACF,EAAC;OArBO;OACA;OACA;AAqBT,OAAKC,SAAS,IAAI,YAAY;AAC9B,OAAKC,UAAU,KAAK,SAAS,WAAW;CACzC;CAED,MAAM,KAAKC,MAAc;AACvB,SAAO,KAAKF,OAAO,aAAa,MAAM;GACpC,MAAM,EAAE,MAAM,OAAO,GAAG,MAAM,KAAKC,QAAQ,MAAM;AACjD,OAAI,MAAM;AACR,QAAI,KAAKD,OAAO,aAAa,GAAG;KAC9B,MAAM,QAAQ,KAAKA;AACnB,UAAKA,SAAS,IAAI,YAAY;AAC9B,YAAO;IACR;AACD,WAAO;GACR;GACD,MAAM,SAAS;AACf,QAAKA,SAAS,OAAO,KAAKA,QAAQ,OAAO;EAC1C;EACD,MAAM,QAAQ,KAAKA,OAAO,MAAM,GAAG,KAAK;AACxC,OAAKA,SAAS,KAAKA,OAAO,MAAM,KAAK;AACrC,SAAO;CACR;CAED,MAAM,QAAQ,IAAI,MAAM,mBAAmB;AACzC,OAAKC,QAAQ,OAAO,MAAM;AAC1B,OAAK,OAAO,OAAO,MAAM;CAC1B;CAED,MAAM;AACJ,SAAO,KAAK,OAAO,OAAO,eAAe;CAC1C;AACF;AAOD,OAAO,MAAM,6BACH,gBAEV;CACE;CAEA,YAAYE,SAA+B;AACzC,QAAM,QAAQ;AAEd,OAAKC,UAAU,KAAK,SAAS,WAAW;CACzC;CAED,QAAQ,OAAO,iBAAiB;EAC9B,MAAM,SAAS,KAAK,SAAS,WAAW;AACxC,SAAO,MAAM;GACX,MAAM,EAAE,MAAM,OAAO,GAAG,MAAM,OAAO,MAAM;AAC3C,QAAK,KAAM,OAAM;OACZ;EACN;CACF;CAED,MAAM,KAAKC,OAAU;AACnB,QAAM,KAAKD,QAAQ,MAAM,MAAM;CAChC;CAED,MAAM,MAAM;AACV,QAAM,KAAKA,QAAQ,OAAO;CAC3B;CAED,MAAM,MAAM,QAAQ,IAAI,MAAM,mBAAmB;AAC/C,QAAM,KAAKA,QAAQ,MAAM,MAAM;CAChC;AACF;AAED,OAAO,MAAM,iCAAiC,qBAAkC;CAC9E,YACWN,IACAC,UACTO,SACA;AACA,QAAM,QAAQ;OAJL;OACA;CAIV;AACF","names":["source: ReadableStream","id: number","metadata: ProtocolBlobMetadata","#queue","#reader","size: number","options?: Transformer<any, T>","#writer","chunk: T","options?: Transformer<any, ArrayBuffer>"],"sources":["../../src/client/stream.ts"],"sourcesContent":["import { defer } from '@nmtjs/common'\nimport { concat, encodeText } from '../common/binary.ts'\nimport type { ProtocolBlobMetadata } from '../common/blob.ts'\n\nexport class ProtocolClientBlobStream extends TransformStream<\n any,\n ArrayBuffer\n> {\n #queue: ArrayBuffer\n #reader: ReadableStreamDefaultReader\n\n constructor(\n readonly source: ReadableStream,\n readonly id: number,\n readonly metadata: ProtocolBlobMetadata,\n ) {\n super({\n start: () => {\n defer(() => source.pipeThrough(this))\n },\n transform: (chunk, controller) => {\n if (chunk instanceof ArrayBuffer) {\n controller.enqueue(chunk)\n } else if (chunk instanceof Uint8Array) {\n controller.enqueue(chunk.buffer as unknown as ArrayBuffer)\n } else if (typeof chunk === 'string') {\n controller.enqueue(encodeText(chunk))\n } else {\n throw new Error(\n 'Invalid chunk data type. Expected ArrayBuffer, Uint8Array, or string.',\n )\n }\n },\n })\n\n this.#queue = new ArrayBuffer(0)\n this.#reader = this.readable.getReader()\n }\n\n async read(size: number) {\n while (this.#queue.byteLength < size) {\n const { done, value } = await this.#reader.read()\n if (done) {\n if (this.#queue.byteLength > 0) {\n const chunk = this.#queue\n this.#queue = new ArrayBuffer(0)\n return chunk\n }\n return null\n }\n const buffer = value as ArrayBuffer\n this.#queue = concat(this.#queue, buffer)\n }\n const chunk = this.#queue.slice(0, size)\n this.#queue = this.#queue.slice(size)\n return chunk\n }\n\n abort(error = new Error('Stream aborted')) {\n this.#reader.cancel(error)\n this.source.cancel(error)\n }\n\n end() {\n return this.source.cancel('Stream ended')\n }\n}\n\nexport interface ProtocolServerStreamInterface<T = any> {\n [Symbol.asyncIterator](): AsyncGenerator<T>\n abort(error?: Error): void\n}\n\nexport class ProtocolServerStream<T = any>\n extends TransformStream<any, T>\n implements ProtocolServerStreamInterface<T>\n{\n #writer: WritableStreamDefaultWriter\n\n constructor(options?: Transformer<any, T>) {\n super(options)\n\n this.#writer = this.writable.getWriter()\n }\n\n async *[Symbol.asyncIterator]() {\n const reader = this.readable.getReader()\n while (true) {\n const { done, value } = await reader.read()\n if (!done) yield value\n else break\n }\n }\n\n async push(chunk: T) {\n await this.#writer.write(chunk)\n }\n\n async end() {\n await this.#writer.close()\n }\n\n async abort(error = new Error('Stream aborted')) {\n await this.#writer.abort(error)\n }\n}\n\nexport class ProtocolServerBlobStream extends ProtocolServerStream<ArrayBuffer> {\n constructor(\n readonly id: number,\n readonly metadata: ProtocolBlobMetadata,\n options?: Transformer<any, ArrayBuffer>,\n ) {\n super(options)\n }\n}\n"],"version":3,"file":"stream.js"}
@@ -13,7 +13,7 @@ export class ProtocolBlob {
13
13
  };
14
14
  }
15
15
  static from(source, metadata = {}) {
16
- let _source = undefined;
16
+ let _source;
17
17
  if (source instanceof globalThis.ReadableStream) {
18
18
  _source = source;
19
19
  } else if ("File" in globalThis && source instanceof globalThis.File) {
@@ -1 +1 @@
1
- {"mappings":"AAAA,OAAO,MAAMA,UAAyB,OAAO,IAAI,kBAAkB;AAcnE,OAAO,MAAM,aAA8C;CACzD,CAAU,WAAW;CAErB,AAAgB;CAChB,AAAgB;CAEhB,YACEC,QACAC,MACA,OAAO,4BACPC,UACA;AACA,aAAW,SAAS,eAAe,QAAQ,EACzC,OAAM,IAAI,MAAM;AAElB,OAAK,SAAS;AACd,OAAK,WAAW;GACd;GACA;GACA;EACD;CACF;CAED,OAAO,KACLF,QACAG,WAII,CAAE,GACN;EACA,IAAIC,UAAe;AAEnB,MAAI,kBAAkB,WAAW,gBAAgB;AAC/C,aAAU;EACX,WAAU,UAAU,cAAc,kBAAkB,WAAW,MAAM;AACpE,aAAU,OAAO,QAAQ;AACzB,YAAS,OAAO,OAAO;AACvB,YAAS,WAAW,OAAO;EAC5B,WAAU,kBAAkB,WAAW,MAAM;AAC5C,aAAU,OAAO,QAAQ;AACzB,YAAS,OAAO,OAAO;EACxB,kBAAiB,WAAW,UAAU;GACrC,MAAM,OAAO,IAAI,KAAK,CAAC,MAAO;AAC9B,aAAU,KAAK,QAAQ;AACvB,YAAS,OAAO,KAAK;AACrB,YAAS,OAAO,SAAS,QAAQ;EAClC,WAAU,kBAAkB,WAAW,aAAa;GACnD,MAAM,OAAO,IAAI,KAAK,CAAC,MAAO;AAC9B,aAAU,KAAK,QAAQ;AACvB,YAAS,OAAO,KAAK;EACtB,OAAM;AACL,aAAU;EACX;AAED,SAAO,IAAI,aACT,SACA,SAAS,MACT,SAAS,MACT,SAAS;CAEZ;AACF","names":["BlobKey: unique symbol","source: any","size?: number","filename?: string","metadata: {\n size?: number\n type?: string\n filename?: string\n }","_source: any"],"sources":["../../src/common/blob.ts"],"sourcesContent":["export const BlobKey: unique symbol = Symbol.for('neemata:BlobKey')\nexport type BlobKey = typeof BlobKey\n\nexport type ProtocolBlobMetadata = {\n type: string\n size?: number\n filename?: string\n}\n\nexport interface ProtocolBlobInterface {\n readonly metadata: ProtocolBlobMetadata\n readonly [BlobKey]: true\n}\n\nexport class ProtocolBlob implements ProtocolBlobInterface {\n readonly [BlobKey] = true\n\n public readonly metadata: ProtocolBlobMetadata\n public readonly source: any\n\n constructor(\n source: any,\n size?: number,\n type = 'application/octet-stream',\n filename?: string,\n ) {\n if (typeof size !== 'undefined' && size <= 0)\n throw new Error('Blob size is invalid')\n\n this.source = source\n this.metadata = {\n size,\n type,\n filename,\n }\n }\n\n static from(\n source: any,\n metadata: {\n size?: number\n type?: string\n filename?: string\n } = {},\n ) {\n let _source: any = undefined\n\n if (source instanceof globalThis.ReadableStream) {\n _source = source\n } else if ('File' in globalThis && source instanceof globalThis.File) {\n _source = source.stream()\n metadata.size = source.size\n metadata.filename = source.name\n } else if (source instanceof globalThis.Blob) {\n _source = source.stream()\n metadata.size = source.size\n } else if (typeof source === 'string') {\n const blob = new Blob([source])\n _source = blob.stream()\n metadata.size = blob.size\n metadata.type = metadata.type || 'text/plain'\n } else if (source instanceof globalThis.ArrayBuffer) {\n const blob = new Blob([source])\n _source = blob.stream()\n metadata.size = blob.size\n } else {\n _source = source\n }\n\n return new ProtocolBlob(\n _source,\n metadata.size,\n metadata.type,\n metadata.filename,\n )\n }\n}\n"],"version":3,"file":"blob.js"}
1
+ {"mappings":"AAAA,OAAO,MAAMA,UAAyB,OAAO,IAAI,kBAAkB;AAcnE,OAAO,MAAM,aAA8C;CACzD,CAAU,WAAW;CAErB,AAAgB;CAChB,AAAgB;CAEhB,YACEC,QACAC,MACA,OAAO,4BACPC,UACA;AACA,aAAW,SAAS,eAAe,QAAQ,EACzC,OAAM,IAAI,MAAM;AAElB,OAAK,SAAS;AACd,OAAK,WAAW;GACd;GACA;GACA;EACD;CACF;CAED,OAAO,KACLF,QACAG,WAII,CAAE,GACN;EACA,IAAIC;AAEJ,MAAI,kBAAkB,WAAW,gBAAgB;AAC/C,aAAU;EACX,WAAU,UAAU,cAAc,kBAAkB,WAAW,MAAM;AACpE,aAAU,OAAO,QAAQ;AACzB,YAAS,OAAO,OAAO;AACvB,YAAS,WAAW,OAAO;EAC5B,WAAU,kBAAkB,WAAW,MAAM;AAC5C,aAAU,OAAO,QAAQ;AACzB,YAAS,OAAO,OAAO;EACxB,kBAAiB,WAAW,UAAU;GACrC,MAAM,OAAO,IAAI,KAAK,CAAC,MAAO;AAC9B,aAAU,KAAK,QAAQ;AACvB,YAAS,OAAO,KAAK;AACrB,YAAS,OAAO,SAAS,QAAQ;EAClC,WAAU,kBAAkB,WAAW,aAAa;GACnD,MAAM,OAAO,IAAI,KAAK,CAAC,MAAO;AAC9B,aAAU,KAAK,QAAQ;AACvB,YAAS,OAAO,KAAK;EACtB,OAAM;AACL,aAAU;EACX;AAED,SAAO,IAAI,aACT,SACA,SAAS,MACT,SAAS,MACT,SAAS;CAEZ;AACF","names":["BlobKey: unique symbol","source: any","size?: number","filename?: string","metadata: {\n size?: number\n type?: string\n filename?: string\n }","_source: any"],"sources":["../../src/common/blob.ts"],"sourcesContent":["export const BlobKey: unique symbol = Symbol.for('neemata:BlobKey')\nexport type BlobKey = typeof BlobKey\n\nexport type ProtocolBlobMetadata = {\n type: string\n size?: number\n filename?: string\n}\n\nexport interface ProtocolBlobInterface {\n readonly metadata: ProtocolBlobMetadata\n readonly [BlobKey]: true\n}\n\nexport class ProtocolBlob implements ProtocolBlobInterface {\n readonly [BlobKey] = true\n\n public readonly metadata: ProtocolBlobMetadata\n public readonly source: any\n\n constructor(\n source: any,\n size?: number,\n type = 'application/octet-stream',\n filename?: string,\n ) {\n if (typeof size !== 'undefined' && size <= 0)\n throw new Error('Blob size is invalid')\n\n this.source = source\n this.metadata = {\n size,\n type,\n filename,\n }\n }\n\n static from(\n source: any,\n metadata: {\n size?: number\n type?: string\n filename?: string\n } = {},\n ) {\n let _source: any\n\n if (source instanceof globalThis.ReadableStream) {\n _source = source\n } else if ('File' in globalThis && source instanceof globalThis.File) {\n _source = source.stream()\n metadata.size = source.size\n metadata.filename = source.name\n } else if (source instanceof globalThis.Blob) {\n _source = source.stream()\n metadata.size = source.size\n } else if (typeof source === 'string') {\n const blob = new Blob([source])\n _source = blob.stream()\n metadata.size = blob.size\n metadata.type = metadata.type || 'text/plain'\n } else if (source instanceof globalThis.ArrayBuffer) {\n const blob = new Blob([source])\n _source = blob.stream()\n metadata.size = blob.size\n } else {\n _source = source\n }\n\n return new ProtocolBlob(\n _source,\n metadata.size,\n metadata.type,\n metadata.filename,\n )\n }\n}\n"],"version":3,"file":"blob.js"}
@@ -1 +1 @@
1
- {"mappings":"AA0CA,OAAO,MAAM,mBAAmB,CAC9BA,WAC4C,cAAc;AAE5D,OAAO,MAAM,uBAAuB,CAClCA,WACgD,kBAAkB","names":["result: ProtocolApiCallResult"],"sources":["../../src/server/api.ts"],"sourcesContent":["import type {\n Container,\n Metadata,\n MetadataKey,\n MetadataStore,\n} from '@nmtjs/core'\nimport type { Hook } from '@nmtjs/core'\nimport type { Connection } from './connection.ts'\n\nexport type ProtocolApiCallOptions = {\n connection: Connection\n namespace: string\n procedure: string\n container: Container\n payload: any\n signal: AbortSignal\n metadata?: (metadata: MetadataStore) => void\n}\n\nexport type ProtocolAnyIterable<T> =\n | (() => AsyncGenerator<T>)\n | AsyncIterable<T>\n\nexport interface ProtocolApiCallBaseResult {\n output: unknown\n}\nexport interface ProtocolApiCallSubscriptionResult\n extends ProtocolApiCallBaseResult {\n subscription: never\n}\n\nexport interface ProtocolApiCallIterableResult\n extends ProtocolApiCallBaseResult {\n iterable: ProtocolAnyIterable<unknown>\n onFinish?: () => void\n}\n\nexport type ProtocolApiCallResult =\n | ProtocolApiCallBaseResult\n | ProtocolApiCallSubscriptionResult\n | ProtocolApiCallIterableResult\n\nexport const isIterableResult = (\n result: ProtocolApiCallResult,\n): result is ProtocolApiCallIterableResult => 'iterable' in result\n\nexport const isSubscriptionResult = (\n result: ProtocolApiCallResult,\n): result is ProtocolApiCallSubscriptionResult => 'subscription' in result\n\nexport interface ProtocolApi {\n call(options: ProtocolApiCallOptions): Promise<ProtocolApiCallResult>\n}\n\ndeclare module '@nmtjs/core' {\n export interface HookType {\n [Hook.OnConnect]: (connection: Connection) => any\n [Hook.OnDisconnect]: (connection: Connection) => any\n }\n}\n"],"version":3,"file":"api.js"}
1
+ {"mappings":"AAoCA,OAAO,MAAM,mBAAmB,CAC9BA,WAC4C,cAAc;AAE5D,OAAO,MAAM,uBAAuB,CAClCA,WACgD,kBAAkB","names":["result: ProtocolApiCallResult"],"sources":["../../src/server/api.ts"],"sourcesContent":["import type { Container, Hook, MetadataStore } from '@nmtjs/core'\nimport type { Connection } from './connection.ts'\n\nexport type ProtocolApiCallOptions = {\n connection: Connection\n namespace: string\n procedure: string\n container: Container\n payload: any\n signal: AbortSignal\n metadata?: (metadata: MetadataStore) => void\n}\n\nexport type ProtocolAnyIterable<T> =\n | (() => AsyncGenerator<T>)\n | AsyncIterable<T>\n\nexport interface ProtocolApiCallBaseResult {\n output: unknown\n}\nexport interface ProtocolApiCallSubscriptionResult\n extends ProtocolApiCallBaseResult {\n subscription: never\n}\n\nexport interface ProtocolApiCallIterableResult\n extends ProtocolApiCallBaseResult {\n iterable: ProtocolAnyIterable<unknown>\n onFinish?: () => void\n}\n\nexport type ProtocolApiCallResult =\n | ProtocolApiCallBaseResult\n | ProtocolApiCallSubscriptionResult\n | ProtocolApiCallIterableResult\n\nexport const isIterableResult = (\n result: ProtocolApiCallResult,\n): result is ProtocolApiCallIterableResult => 'iterable' in result\n\nexport const isSubscriptionResult = (\n result: ProtocolApiCallResult,\n): result is ProtocolApiCallSubscriptionResult => 'subscription' in result\n\nexport interface ProtocolApi {\n call(options: ProtocolApiCallOptions): Promise<ProtocolApiCallResult>\n}\n\ndeclare module '@nmtjs/core' {\n export interface HookType {\n [Hook.OnConnect]: (connection: Connection) => any\n [Hook.OnDisconnect]: (connection: Connection) => any\n }\n}\n"],"version":3,"file":"api.js"}
@@ -1 +1 @@
1
- {"mappings":"AAAA,SAAS,kBAAkB,aAAa;AAYxC,OAAO,MAAM,WAA2B;CACtC,AAAS;CACT,AAAS;CAET,YAAYA,SAAkC;AAC5C,OAAK,KAAK,QAAQ,MAAM,YAAY;AACpC,OAAK,OAAO,QAAQ;CACrB;AACF;AAED,OAAO,MAAM,kBAAkB;CAC7B,WAAW;CACX,QAAQ,IAAI;CACZ,gBAAgB,IAAI;CACpB,gBAAgB,IAAI;CACpB,aAAa,IAAI;CACjB;CACA;CAKA,YACEC,WACAC,QACA;AACA,OAAK,YAAY;AACjB,OAAK,SAAS;CACf;AACF","names":["options: ConnectionOptions<Data>","container: ConnectionContext['container']","format: ConnectionContext['format']"],"sources":["../../src/server/connection.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\nimport type { Container } from '@nmtjs/core'\nimport type { InteractivePromise } from '../../../common/src/index.ts'\nimport type { ProtocolApiCallResult } from './api.ts'\nimport type { BaseServerDecoder, BaseServerEncoder } from './format.ts'\nimport type { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\n\nexport type ConnectionOptions<Data = unknown> = {\n id?: string\n data: Data\n}\n\nexport class Connection<Data = unknown> {\n readonly id: string\n readonly data: Data\n\n constructor(options: ConnectionOptions<Data>) {\n this.id = options.id ?? randomUUID()\n this.data = options.data\n }\n}\n\nexport class ConnectionContext {\n streamId = 1\n calls = new Map<number, AbortController>()\n clientStreams = new Map<number, ProtocolClientStream>()\n serverStreams = new Map<number, ProtocolServerStream>()\n rpcStreams = new Map<number, AbortController>()\n container: Container\n format: {\n encoder: BaseServerEncoder\n decoder: BaseServerDecoder\n }\n\n constructor(\n container: ConnectionContext['container'],\n format: ConnectionContext['format'],\n ) {\n this.container = container\n this.format = format\n }\n}\n"],"version":3,"file":"connection.js"}
1
+ {"mappings":"AAAA,SAAS,kBAAkB,aAAa;AAUxC,OAAO,MAAM,WAA2B;CACtC,AAAS;CACT,AAAS;CAET,YAAYA,SAAkC;AAC5C,OAAK,KAAK,QAAQ,MAAM,YAAY;AACpC,OAAK,OAAO,QAAQ;CACrB;AACF;AAED,OAAO,MAAM,kBAAkB;CAC7B,WAAW;CACX,QAAQ,IAAI;CACZ,gBAAgB,IAAI;CACpB,gBAAgB,IAAI;CACpB,aAAa,IAAI;CACjB;CACA;CAKA,YACEC,WACAC,QACA;AACA,OAAK,YAAY;AACjB,OAAK,SAAS;CACf;AACF","names":["options: ConnectionOptions<Data>","container: ConnectionContext['container']","format: ConnectionContext['format']"],"sources":["../../src/server/connection.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\nimport type { Container } from '@nmtjs/core'\nimport type { BaseServerDecoder, BaseServerEncoder } from './format.ts'\nimport type { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\n\nexport type ConnectionOptions<Data = unknown> = {\n id?: string\n data: Data\n}\n\nexport class Connection<Data = unknown> {\n readonly id: string\n readonly data: Data\n\n constructor(options: ConnectionOptions<Data>) {\n this.id = options.id ?? randomUUID()\n this.data = options.data\n }\n}\n\nexport class ConnectionContext {\n streamId = 1\n calls = new Map<number, AbortController>()\n clientStreams = new Map<number, ProtocolClientStream>()\n serverStreams = new Map<number, ProtocolServerStream>()\n rpcStreams = new Map<number, AbortController>()\n container: Container\n format: {\n encoder: BaseServerEncoder\n decoder: BaseServerDecoder\n }\n\n constructor(\n container: ConnectionContext['container'],\n format: ConnectionContext['format'],\n ) {\n this.container = container\n this.format = format\n }\n}\n"],"version":3,"file":"connection.js"}
@@ -56,13 +56,14 @@ export class ProtocolConnections {
56
56
  connection,
57
57
  context
58
58
  };
59
- } finally {
59
+ } catch (error) {
60
60
  container.dispose().catch((error) => {
61
61
  this.application.logger.error({
62
62
  error,
63
63
  connection
64
64
  }, "Error during disposing connection");
65
65
  });
66
+ throw error;
66
67
  }
67
68
  }
68
69
  async remove(connectionId) {
@@ -157,7 +158,6 @@ export class ProtocolServerStreams {
157
158
  serverStreams.delete(streamId);
158
159
  }
159
160
  pull(connectionId, streamId) {
160
- console.log("Pulling stream", streamId);
161
161
  const stream = this.get(connectionId, streamId);
162
162
  stream.resume();
163
163
  }
@@ -245,7 +245,6 @@ export class Protocol {
245
245
  });
246
246
  });
247
247
  stream.on("end", () => {
248
- console.log("Stream ended");
249
248
  transport.send(connection, ServerMessageType.ServerStreamEnd, encodeNumber(streamId, "Uint32"), {
250
249
  callId,
251
250
  streamId
@@ -1 +1 @@
1
- {"mappings":"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","names":["code: string","message?: string","data?: any","#collection","application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n }","connectionId: string","transport: ProtocolConnectionTransport","options: ConnectionOptions<T>","params: ResolveFormatParams","connection: Connection","connections: ProtocolConnections","streamId: number","metadata: ProtocolBlobMetadata","read: Callback","chunk: ArrayBuffer","blob: ProtocolBlob","application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n }","#connections","#clientStreams","#serverStreams","options: ProtocolApiCallOptions","rpc: ProtocolRPC","params: ProtocolRPCOptions","buffer: ArrayBuffer","callId: number","options: ConnectionOptions","error?: Error"],"sources":["../../src/server/protocol.ts"],"sourcesContent":["import { type Callback, defer, throwError } from '@nmtjs/common'\nimport {\n type AnyInjectable,\n type Container,\n Hook,\n type Logger,\n Scope,\n} from '@nmtjs/core'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlob, ProtocolBlobMetadata } from '../common/blob.ts'\nimport { ErrorCode, ServerMessageType } from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport {\n isIterableResult,\n type ProtocolApi,\n type ProtocolApiCallOptions,\n} from './api.ts'\nimport {\n Connection,\n ConnectionContext,\n type ConnectionOptions,\n} from './connection.ts'\nimport type { Format } from './format.ts'\nimport { ProtocolInjectables } from './injectables.ts'\nimport type { ProtocolRegistry } from './registry.ts'\nimport { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\nimport type { Transport } from './transport.ts'\nimport { getFormat, type ResolveFormatParams } from './utils.ts'\n\nexport class ProtocolError extends Error {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport type ProtocolConnectionTransport = {\n send: Transport<any>['send']\n}\n\nexport class ProtocolConnections {\n readonly #collection = new Map<\n string,\n {\n connection: Connection\n context: ConnectionContext\n transport: ProtocolConnectionTransport\n }\n >()\n\n constructor(\n private readonly application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n },\n ) {}\n\n get(connectionId: string) {\n const connection = this.#collection.get(connectionId)\n if (!connection) throwError('Connection not found')\n return connection\n }\n\n async add<T>(\n transport: ProtocolConnectionTransport,\n options: ConnectionOptions<T>,\n params: ResolveFormatParams,\n ) {\n const connection = new Connection(options)\n const format = getFormat(this.application.format, params)\n const container = this.application.container.fork(Scope.Connection)\n const context = new ConnectionContext(container, format)\n container.provide(ProtocolInjectables.connection, connection)\n try {\n await this.initialize(connection)\n this.#collection.set(connection.id, { connection, context, transport })\n return { connection, context }\n } finally {\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n 'Error during disposing connection',\n )\n })\n }\n }\n\n async remove(connectionId: string) {\n const { connection, context } = this.get(connectionId)\n\n this.application.registry.hooks.call(\n Hook.OnDisconnect,\n { concurrent: true },\n connection,\n )\n\n this.#collection.delete(connectionId)\n\n const { calls, serverStreams, clientStreams, rpcStreams, container } =\n context\n\n for (const call of calls.values()) {\n call.abort(new Error('Connection closed'))\n }\n\n for (const stream of clientStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of serverStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of rpcStreams.values()) {\n stream.abort(new Error('Connection closed'))\n }\n\n try {\n await container.dispose()\n } catch (error) {\n this.application.logger.error(\n { error, connection },\n 'Error during closing connection',\n )\n }\n }\n\n async initialize(connection: Connection) {\n await this.application.registry.hooks.call(\n Hook.OnConnect,\n { concurrent: false },\n connection,\n )\n }\n}\n\nexport class ProtocolClientStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = clientStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n clientStreams.get(streamId) || throwError('Stream not found')\n clientStreams.delete(streamId)\n }\n\n add(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = new ProtocolClientStream(streamId, metadata, { read })\n clientStreams.set(streamId, stream)\n return stream\n }\n\n push(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(connectionId, streamId)\n stream.write(Buffer.from(chunk))\n }\n\n end(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.end(null)\n this.remove(connectionId, streamId)\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport class ProtocolServerStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = serverStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n add(connectionId: string, streamId: number, blob: ProtocolBlob) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = new ProtocolServerStream(streamId, blob)\n serverStreams.set(streamId, stream)\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n serverStreams.has(streamId) || throwError('Stream not found')\n serverStreams.delete(streamId)\n }\n\n pull(connectionId: string, streamId: number) {\n console.log('Pulling stream', streamId)\n const stream = this.get(connectionId, streamId)\n stream.resume()\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport type ProtocolRPCOptions = {\n signal?: AbortSignal\n provides?: [AnyInjectable, any][]\n metadata?: ProtocolApiCallOptions['metadata']\n}\n\nexport class Protocol {\n #connections: ProtocolConnections\n #clientStreams: ProtocolClientStreams\n #serverStreams: ProtocolServerStreams\n\n constructor(\n protected readonly application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n },\n ) {\n this.#connections = new ProtocolConnections(this.application)\n this.#clientStreams = new ProtocolClientStreams(this.#connections)\n this.#serverStreams = new ProtocolServerStreams(this.#connections)\n }\n\n async call(options: ProtocolApiCallOptions) {\n const { container, connection } = options\n try {\n return await this.application.api.call(options)\n } catch (error) {\n if (error instanceof ProtocolError === false) {\n this.application.logger.error(\n { error, connection },\n 'Error during RPC call',\n )\n throw new ProtocolError(\n ErrorCode.InternalServerError,\n 'Internal server error',\n )\n }\n throw error\n } finally {\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n \"Error during disposing connection's container\",\n )\n })\n }\n }\n\n async rpc(\n connectionId: string,\n rpc: ProtocolRPC,\n params: ProtocolRPCOptions = {},\n ) {\n const { connection, context, transport } =\n this.#connections.get(connectionId)\n const { calls, format } = context\n const { callId, namespace, procedure, payload } = rpc\n const abortController = new AbortController()\n const signal = params.signal\n ? AbortSignal.any([params.signal, abortController.signal])\n : abortController.signal\n\n calls.set(callId, abortController)\n\n const callIdEncoded = encodeNumber(callId, 'Uint32')\n const container = context.container.fork(Scope.Call)\n\n if (params.provides) {\n for (const [key, value] of params.provides) {\n container.provide(key, value)\n }\n }\n\n try {\n const response = await this.call({\n connection,\n container,\n namespace,\n payload,\n procedure,\n signal,\n metadata: params.metadata,\n })\n\n const responseEncoded = format.encoder.encodeRPC(\n {\n callId,\n result: response.output,\n },\n {\n addStream: (blob) => {\n const streamId = context.streamId++\n const stream = this.#serverStreams.add(connectionId, streamId, blob)\n stream.on('data', (chunk) => {\n stream.pause()\n const buf = Buffer.from(chunk)\n transport.send(\n connection,\n ServerMessageType.ServerStreamPush,\n concat(\n encodeNumber(streamId, 'Uint32'),\n (buf.buffer as ArrayBuffer).slice(\n buf.byteOffset,\n buf.byteOffset + buf.byteLength,\n ),\n ),\n { callId, streamId },\n )\n })\n stream.on('error', (err) => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamAbort,\n encodeNumber(streamId, 'Uint32'),\n { callId, streamId },\n )\n })\n stream.on('end', () => {\n console.log('Stream ended')\n transport.send(\n connection,\n ServerMessageType.ServerStreamEnd,\n encodeNumber(streamId, 'Uint32'),\n { callId, streamId },\n )\n })\n return stream\n },\n getStream: (id) => {\n return this.#serverStreams.get(connectionId, id)\n },\n },\n )\n\n if ('subscription' in response) {\n throwError('Unimplemented')\n } else if (isIterableResult(response)) {\n transport.send(\n connection,\n ServerMessageType.RpcStreamResponse,\n responseEncoded,\n { callId },\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 ab.signal.throwIfAborted()\n const chunkEncoded = format.encoder.encode(chunk)\n transport.send(\n connection,\n ServerMessageType.RpcStreamChunk,\n concat(callIdEncoded, chunkEncoded),\n { callId },\n )\n }\n transport.send(\n connection,\n ServerMessageType.RpcStreamEnd,\n callIdEncoded,\n { callId },\n )\n } catch (error) {\n this.application.logger.error(error)\n transport.send(\n connection,\n ServerMessageType.RpcStreamAbort,\n callIdEncoded,\n { callId },\n )\n } finally {\n context.rpcStreams.delete(callId)\n response.onFinish && defer(response.onFinish)\n }\n } else {\n transport.send(\n connection,\n ServerMessageType.RpcResponse,\n responseEncoded,\n { callId },\n )\n }\n } catch (error) {\n const payload = format.encoder.encodeRPC(\n { callId, error },\n {\n addStream(blob) {\n throwError('Cannot handle stream for error response')\n },\n getStream(id) {\n throwError('Cannot handle stream for error response')\n },\n },\n )\n\n transport.send(connection, ServerMessageType.RpcResponse, payload, {\n error,\n callId,\n })\n } finally {\n calls.delete(callId)\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n 'Error during disposing connection',\n )\n })\n }\n }\n\n async rpcRaw(\n connectionId: string,\n buffer: ArrayBuffer,\n params: ProtocolRPCOptions = {},\n ) {\n const { connection, context, transport } =\n this.#connections.get(connectionId)\n\n const { format } = context\n\n const rpc = format.decoder.decodeRPC(buffer, {\n addStream: (streamId, callId, metadata) => {\n return this.#clientStreams.add(\n connectionId,\n streamId,\n metadata,\n (size) => {\n transport.send(\n connection,\n ServerMessageType.ClientStreamPull,\n concat(\n encodeNumber(streamId, 'Uint32'),\n encodeNumber(size, 'Uint32'),\n ),\n { callId, streamId },\n )\n },\n )\n },\n getStream: (id) => {\n return this.#clientStreams.get(connectionId, id)\n },\n })\n\n return await this.rpc(connectionId, rpc, params)\n }\n\n rpcAbort(connectionId: string, callId: number) {\n const { context } = this.#connections.get(connectionId)\n const call = context.calls.get(callId) ?? throwError('Call not found')\n call.abort()\n }\n\n rpcAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcAbort(connectionId, callId)\n }\n\n rpcStreamAbort(connectionId: string, callId: number) {\n const { context } = this.#connections.get(connectionId)\n const ab =\n context.rpcStreams.get(callId) ?? throwError('Call stream not found')\n ab.abort()\n }\n\n rpcStreamAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcStreamAbort(connectionId, callId)\n }\n\n notify(connectionId: string, event, payload) {\n throw Error('Unimplemented')\n }\n\n addConnection(\n transport: ProtocolConnectionTransport,\n options: ConnectionOptions,\n params: ResolveFormatParams,\n ) {\n return this.#connections.add(transport, options, params)\n }\n\n removeConnection(connectionId: string) {\n return this.#connections.remove(connectionId)\n }\n\n getConnection(connectionId: string) {\n return this.#connections.get(connectionId)\n }\n\n initializeConnection(connection: Connection) {\n return this.#connections.initialize(connection)\n }\n\n getClientStream(\n connectionId: string,\n streamId: number,\n ): ProtocolClientStream {\n return this.#clientStreams.get(connectionId, streamId)\n }\n\n addClientStream(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n return this.#clientStreams.add(connectionId, streamId, metadata, read)\n }\n\n removeClientStream(connectionId: string, streamId: number) {\n return this.#clientStreams.remove(connectionId, streamId)\n }\n\n pushClientStream(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n return this.#clientStreams.push(connectionId, streamId, chunk)\n }\n\n endClientStream(connectionId: string, streamId: number) {\n return this.#clientStreams.end(connectionId, streamId)\n }\n\n abortClientStream(connectionId: string, streamId: number, error?: Error) {\n return this.#clientStreams.abort(connectionId, streamId, error)\n }\n\n getServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.get(connectionId, streamId)\n }\n\n addServerStream(connectionId: string, streamId: number, blob: ProtocolBlob) {\n return this.#serverStreams.add(connectionId, streamId, blob)\n }\n\n removeServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.remove(connectionId, streamId)\n }\n\n pullServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.pull(connectionId, streamId)\n }\n\n abortServerStream(connectionId: string, streamId: number, error?: Error) {\n return this.#serverStreams.abort(connectionId, streamId, error)\n }\n}\n"],"version":3,"file":"protocol.js"}
1
+ {"mappings":"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","names":["code: string","message?: string","data?: any","#collection","application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n }","connectionId: string","transport: ProtocolConnectionTransport","options: ConnectionOptions<T>","params: ResolveFormatParams","connection: Connection","connections: ProtocolConnections","streamId: number","metadata: ProtocolBlobMetadata","read: Callback","chunk: ArrayBuffer","blob: ProtocolBlob","application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n }","#connections","#clientStreams","#serverStreams","options: ProtocolApiCallOptions","rpc: ProtocolRPC","params: ProtocolRPCOptions","buffer: ArrayBuffer","callId: number","options: ConnectionOptions","error?: Error"],"sources":["../../src/server/protocol.ts"],"sourcesContent":["import { type Callback, defer, throwError } from '@nmtjs/common'\nimport {\n type AnyInjectable,\n type Container,\n Hook,\n type Logger,\n Scope,\n} from '@nmtjs/core'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlob, ProtocolBlobMetadata } from '../common/blob.ts'\nimport { ErrorCode, ServerMessageType } from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport {\n isIterableResult,\n type ProtocolApi,\n type ProtocolApiCallOptions,\n} from './api.ts'\nimport {\n Connection,\n ConnectionContext,\n type ConnectionOptions,\n} from './connection.ts'\nimport type { Format } from './format.ts'\nimport { ProtocolInjectables } from './injectables.ts'\nimport type { ProtocolRegistry } from './registry.ts'\nimport { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\nimport type { Transport } from './transport.ts'\nimport { getFormat, type ResolveFormatParams } from './utils.ts'\n\nexport class ProtocolError extends Error {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport type ProtocolConnectionTransport = {\n send: Transport<any>['send']\n}\n\nexport class ProtocolConnections {\n readonly #collection = new Map<\n string,\n {\n connection: Connection\n context: ConnectionContext\n transport: ProtocolConnectionTransport\n }\n >()\n\n constructor(\n private readonly application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n },\n ) {}\n\n get(connectionId: string) {\n const connection = this.#collection.get(connectionId)\n if (!connection) throwError('Connection not found')\n return connection\n }\n\n async add<T>(\n transport: ProtocolConnectionTransport,\n options: ConnectionOptions<T>,\n params: ResolveFormatParams,\n ) {\n const connection = new Connection(options)\n const format = getFormat(this.application.format, params)\n const container = this.application.container.fork(Scope.Connection)\n const context = new ConnectionContext(container, format)\n container.provide(ProtocolInjectables.connection, connection)\n try {\n await this.initialize(connection)\n this.#collection.set(connection.id, { connection, context, transport })\n return { connection, context }\n } catch (error) {\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n 'Error during disposing connection',\n )\n })\n throw error\n }\n }\n\n async remove(connectionId: string) {\n const { connection, context } = this.get(connectionId)\n\n this.application.registry.hooks.call(\n Hook.OnDisconnect,\n { concurrent: true },\n connection,\n )\n\n this.#collection.delete(connectionId)\n\n const { calls, serverStreams, clientStreams, rpcStreams, container } =\n context\n\n for (const call of calls.values()) {\n call.abort(new Error('Connection closed'))\n }\n\n for (const stream of clientStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of serverStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of rpcStreams.values()) {\n stream.abort(new Error('Connection closed'))\n }\n\n try {\n await container.dispose()\n } catch (error) {\n this.application.logger.error(\n { error, connection },\n 'Error during closing connection',\n )\n }\n }\n\n async initialize(connection: Connection) {\n await this.application.registry.hooks.call(\n Hook.OnConnect,\n { concurrent: false },\n connection,\n )\n }\n}\n\nexport class ProtocolClientStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = clientStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n clientStreams.get(streamId) || throwError('Stream not found')\n clientStreams.delete(streamId)\n }\n\n add(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = new ProtocolClientStream(streamId, metadata, { read })\n clientStreams.set(streamId, stream)\n return stream\n }\n\n push(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(connectionId, streamId)\n stream.write(Buffer.from(chunk))\n }\n\n end(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.end(null)\n this.remove(connectionId, streamId)\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport class ProtocolServerStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = serverStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n add(connectionId: string, streamId: number, blob: ProtocolBlob) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = new ProtocolServerStream(streamId, blob)\n serverStreams.set(streamId, stream)\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n serverStreams.has(streamId) || throwError('Stream not found')\n serverStreams.delete(streamId)\n }\n\n pull(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.resume()\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport type ProtocolRPCOptions = {\n signal?: AbortSignal\n provides?: [AnyInjectable, any][]\n metadata?: ProtocolApiCallOptions['metadata']\n}\n\nexport class Protocol {\n #connections: ProtocolConnections\n #clientStreams: ProtocolClientStreams\n #serverStreams: ProtocolServerStreams\n\n constructor(\n protected readonly application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n },\n ) {\n this.#connections = new ProtocolConnections(this.application)\n this.#clientStreams = new ProtocolClientStreams(this.#connections)\n this.#serverStreams = new ProtocolServerStreams(this.#connections)\n }\n\n async call(options: ProtocolApiCallOptions) {\n const { container, connection } = options\n try {\n return await this.application.api.call(options)\n } catch (error) {\n if (error instanceof ProtocolError === false) {\n this.application.logger.error(\n { error, connection },\n 'Error during RPC call',\n )\n throw new ProtocolError(\n ErrorCode.InternalServerError,\n 'Internal server error',\n )\n }\n throw error\n } finally {\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n \"Error during disposing connection's container\",\n )\n })\n }\n }\n\n async rpc(\n connectionId: string,\n rpc: ProtocolRPC,\n params: ProtocolRPCOptions = {},\n ) {\n const { connection, context, transport } =\n this.#connections.get(connectionId)\n const { calls, format } = context\n const { callId, namespace, procedure, payload } = rpc\n const abortController = new AbortController()\n const signal = params.signal\n ? AbortSignal.any([params.signal, abortController.signal])\n : abortController.signal\n\n calls.set(callId, abortController)\n\n const callIdEncoded = encodeNumber(callId, 'Uint32')\n const container = context.container.fork(Scope.Call)\n\n if (params.provides) {\n for (const [key, value] of params.provides) {\n container.provide(key, value)\n }\n }\n\n try {\n const response = await this.call({\n connection,\n container,\n namespace,\n payload,\n procedure,\n signal,\n metadata: params.metadata,\n })\n\n const responseEncoded = format.encoder.encodeRPC(\n {\n callId,\n result: response.output,\n },\n {\n addStream: (blob) => {\n const streamId = context.streamId++\n const stream = this.#serverStreams.add(connectionId, streamId, blob)\n stream.on('data', (chunk) => {\n stream.pause()\n const buf = Buffer.from(chunk)\n transport.send(\n connection,\n ServerMessageType.ServerStreamPush,\n concat(\n encodeNumber(streamId, 'Uint32'),\n (buf.buffer as ArrayBuffer).slice(\n buf.byteOffset,\n buf.byteOffset + buf.byteLength,\n ),\n ),\n { callId, streamId },\n )\n })\n stream.on('error', (err) => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamAbort,\n encodeNumber(streamId, 'Uint32'),\n { callId, streamId },\n )\n })\n stream.on('end', () => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamEnd,\n encodeNumber(streamId, 'Uint32'),\n { callId, streamId },\n )\n })\n return stream\n },\n getStream: (id) => {\n return this.#serverStreams.get(connectionId, id)\n },\n },\n )\n\n if ('subscription' in response) {\n throwError('Unimplemented')\n } else if (isIterableResult(response)) {\n transport.send(\n connection,\n ServerMessageType.RpcStreamResponse,\n responseEncoded,\n { callId },\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 ab.signal.throwIfAborted()\n const chunkEncoded = format.encoder.encode(chunk)\n transport.send(\n connection,\n ServerMessageType.RpcStreamChunk,\n concat(callIdEncoded, chunkEncoded),\n { callId },\n )\n }\n transport.send(\n connection,\n ServerMessageType.RpcStreamEnd,\n callIdEncoded,\n { callId },\n )\n } catch (error) {\n this.application.logger.error(error)\n transport.send(\n connection,\n ServerMessageType.RpcStreamAbort,\n callIdEncoded,\n { callId },\n )\n } finally {\n context.rpcStreams.delete(callId)\n response.onFinish && defer(response.onFinish)\n }\n } else {\n transport.send(\n connection,\n ServerMessageType.RpcResponse,\n responseEncoded,\n { callId },\n )\n }\n } catch (error) {\n const payload = format.encoder.encodeRPC(\n { callId, error },\n {\n addStream(blob) {\n throwError('Cannot handle stream for error response')\n },\n getStream(id) {\n throwError('Cannot handle stream for error response')\n },\n },\n )\n\n transport.send(connection, ServerMessageType.RpcResponse, payload, {\n error,\n callId,\n })\n } finally {\n calls.delete(callId)\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n 'Error during disposing connection',\n )\n })\n }\n }\n\n async rpcRaw(\n connectionId: string,\n buffer: ArrayBuffer,\n params: ProtocolRPCOptions = {},\n ) {\n const { connection, context, transport } =\n this.#connections.get(connectionId)\n\n const { format } = context\n\n const rpc = format.decoder.decodeRPC(buffer, {\n addStream: (streamId, callId, metadata) => {\n return this.#clientStreams.add(\n connectionId,\n streamId,\n metadata,\n (size) => {\n transport.send(\n connection,\n ServerMessageType.ClientStreamPull,\n concat(\n encodeNumber(streamId, 'Uint32'),\n encodeNumber(size, 'Uint32'),\n ),\n { callId, streamId },\n )\n },\n )\n },\n getStream: (id) => {\n return this.#clientStreams.get(connectionId, id)\n },\n })\n\n return await this.rpc(connectionId, rpc, params)\n }\n\n rpcAbort(connectionId: string, callId: number) {\n const { context } = this.#connections.get(connectionId)\n const call = context.calls.get(callId) ?? throwError('Call not found')\n call.abort()\n }\n\n rpcAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcAbort(connectionId, callId)\n }\n\n rpcStreamAbort(connectionId: string, callId: number) {\n const { context } = this.#connections.get(connectionId)\n const ab =\n context.rpcStreams.get(callId) ?? throwError('Call stream not found')\n ab.abort()\n }\n\n rpcStreamAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcStreamAbort(connectionId, callId)\n }\n\n notify(connectionId: string, event, payload) {\n throw Error('Unimplemented')\n }\n\n addConnection(\n transport: ProtocolConnectionTransport,\n options: ConnectionOptions,\n params: ResolveFormatParams,\n ) {\n return this.#connections.add(transport, options, params)\n }\n\n removeConnection(connectionId: string) {\n return this.#connections.remove(connectionId)\n }\n\n getConnection(connectionId: string) {\n return this.#connections.get(connectionId)\n }\n\n initializeConnection(connection: Connection) {\n return this.#connections.initialize(connection)\n }\n\n getClientStream(\n connectionId: string,\n streamId: number,\n ): ProtocolClientStream {\n return this.#clientStreams.get(connectionId, streamId)\n }\n\n addClientStream(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n return this.#clientStreams.add(connectionId, streamId, metadata, read)\n }\n\n removeClientStream(connectionId: string, streamId: number) {\n return this.#clientStreams.remove(connectionId, streamId)\n }\n\n pushClientStream(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n return this.#clientStreams.push(connectionId, streamId, chunk)\n }\n\n endClientStream(connectionId: string, streamId: number) {\n return this.#clientStreams.end(connectionId, streamId)\n }\n\n abortClientStream(connectionId: string, streamId: number, error?: Error) {\n return this.#clientStreams.abort(connectionId, streamId, error)\n }\n\n getServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.get(connectionId, streamId)\n }\n\n addServerStream(connectionId: string, streamId: number, blob: ProtocolBlob) {\n return this.#serverStreams.add(connectionId, streamId, blob)\n }\n\n removeServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.remove(connectionId, streamId)\n }\n\n pullServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.pull(connectionId, streamId)\n }\n\n abortServerStream(connectionId: string, streamId: number, error?: Error) {\n return this.#serverStreams.abort(connectionId, streamId, error)\n }\n}\n"],"version":3,"file":"protocol.js"}
@@ -1 +1 @@
1
- {"mappings":"AAIA,SAAS,wBAAwB,gBAAgB;AA4BjD,OAAO,MAAM,kBAAkB,CAC7BA,MACAC,UACoC;CAAE;CAAM;EAAO,mBAAmB;AAAM;AAE9E,OAAO,MAAM,oBAAoB,CAC/BC,WAC8B,oBAAoB","names":["name: string","init: TransportPlugin<Type, Options>['init']","plugin: BasePlugin<any, any, any>"],"sources":["../../src/server/transport.ts"],"sourcesContent":["import type { Async } from '@nmtjs/common'\nimport type { BasePlugin, PluginContext } from '@nmtjs/core'\nimport type { ServerMessageType } from '../common/enums.ts'\nimport type { Connection } from './connection.ts'\nimport { kTransportPlugin } from './constants.ts'\nimport type { Format } from './format.ts'\nimport type { Protocol } from './protocol.ts'\nimport type { ProtocolRegistry } from './registry.ts'\nimport type { ProtocolSendMetadata } from './types.ts'\n\nexport interface Transport<T = unknown> {\n start: () => Promise<void>\n stop: () => Promise<void>\n send: (\n connection: Connection<T>,\n messageType: ServerMessageType,\n buffer: ArrayBuffer,\n metadata: ProtocolSendMetadata,\n ) => any\n}\n\nexport interface TransportPluginContext extends PluginContext {\n protocol: Protocol\n registry: ProtocolRegistry\n format: Format\n}\n\nexport interface TransportPlugin<Type = unknown, Options = unknown>\n extends BasePlugin<Transport<Type>, Options, TransportPluginContext> {\n [kTransportPlugin]: any\n}\n\nexport const createTransport = <Type = unknown, Options = unknown>(\n name: string,\n init: TransportPlugin<Type, Options>['init'],\n): TransportPlugin<Type, Options> => ({ name, init, [kTransportPlugin]: true })\n\nexport const isTransportPlugin = (\n plugin: BasePlugin<any, any, any>,\n): plugin is TransportPlugin => kTransportPlugin in plugin\n"],"version":3,"file":"transport.js"}
1
+ {"mappings":"AAGA,SAAS,wBAAwB,gBAAgB;AA4BjD,OAAO,MAAM,kBAAkB,CAC7BA,MACAC,UACoC;CAAE;CAAM;EAAO,mBAAmB;AAAM;AAE9E,OAAO,MAAM,oBAAoB,CAC/BC,WAC8B,oBAAoB","names":["name: string","init: TransportPlugin<Type, Options>['init']","plugin: BasePlugin<any, any, any>"],"sources":["../../src/server/transport.ts"],"sourcesContent":["import type { BasePlugin, PluginContext } from '@nmtjs/core'\nimport type { ServerMessageType } from '../common/enums.ts'\nimport type { Connection } from './connection.ts'\nimport { kTransportPlugin } from './constants.ts'\nimport type { Format } from './format.ts'\nimport type { Protocol } from './protocol.ts'\nimport type { ProtocolRegistry } from './registry.ts'\nimport type { ProtocolSendMetadata } from './types.ts'\n\nexport interface Transport<T = unknown> {\n start: () => Promise<void>\n stop: () => Promise<void>\n send: (\n connection: Connection<T>,\n messageType: ServerMessageType,\n buffer: ArrayBuffer,\n metadata: ProtocolSendMetadata,\n ) => any\n}\n\nexport interface TransportPluginContext extends PluginContext {\n protocol: Protocol\n registry: ProtocolRegistry\n format: Format\n}\n\nexport interface TransportPlugin<Type = unknown, Options = unknown>\n extends BasePlugin<Transport<Type>, Options, TransportPluginContext> {\n [kTransportPlugin]: any\n}\n\nexport const createTransport = <Type = unknown, Options = unknown>(\n name: string,\n init: TransportPlugin<Type, Options>['init'],\n): TransportPlugin<Type, Options> => ({ name, init, [kTransportPlugin]: true })\n\nexport const isTransportPlugin = (\n plugin: BasePlugin<any, any, any>,\n): plugin is TransportPlugin => kTransportPlugin in plugin\n"],"version":3,"file":"transport.js"}
@@ -1 +1 @@
1
- {"mappings":"","names":[],"sources":["../../src/server/types.ts"],"sourcesContent":["import type { ProtocolServerBlobStream } from '../client/stream.ts'\nimport type { ProtocolBlob, ProtocolBlobInterface } from '../common/blob.ts'\nimport type { ProtocolClientStream } from './stream.ts'\n\nexport type InputType<T> = T extends ProtocolBlobInterface\n ? ProtocolClientStream\n : T extends object\n ? { [K in keyof T]: InputType<T[K]> }\n : T\n\nexport type OutputType<T> = T extends ProtocolBlobInterface\n ? ProtocolBlob\n : T extends object\n ? { [K in keyof T]: OutputType<T[K]> }\n : T\n\nexport type ProtocolSendMetadata = {\n streamId?: number\n callId?: number\n error?: any\n}\n"],"version":3,"file":"types.js"}
1
+ {"mappings":"","names":[],"sources":["../../src/server/types.ts"],"sourcesContent":["import type { ProtocolBlob, ProtocolBlobInterface } from '../common/blob.ts'\nimport type { ProtocolClientStream } from './stream.ts'\n\nexport type InputType<T> = T extends ProtocolBlobInterface\n ? ProtocolClientStream\n : T extends object\n ? { [K in keyof T]: InputType<T[K]> }\n : T\n\nexport type OutputType<T> = T extends ProtocolBlobInterface\n ? ProtocolBlob\n : T extends object\n ? { [K in keyof T]: OutputType<T[K]> }\n : T\n\nexport type ProtocolSendMetadata = {\n streamId?: number\n callId?: number\n error?: any\n}\n"],"version":3,"file":"types.js"}
package/package.json CHANGED
@@ -16,14 +16,14 @@
16
16
  }
17
17
  },
18
18
  "dependencies": {
19
- "@nmtjs/common": "0.10.1",
20
- "@nmtjs/type": "0.10.1",
21
- "@nmtjs/core": "0.10.1"
19
+ "@nmtjs/common": "0.10.3",
20
+ "@nmtjs/type": "0.10.3",
21
+ "@nmtjs/core": "0.10.3"
22
22
  },
23
23
  "peerDependencies": {
24
- "@nmtjs/common": "0.10.1",
25
- "@nmtjs/core": "0.10.1",
26
- "@nmtjs/type": "0.10.1"
24
+ "@nmtjs/common": "0.10.3",
25
+ "@nmtjs/core": "0.10.3",
26
+ "@nmtjs/type": "0.10.3"
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.10.1",
34
+ "version": "0.10.3",
35
35
  "scripts": {
36
36
  "build": "neemata-build --root=./src './**/*.ts'",
37
37
  "type-check": "tsc --noEmit"
@@ -1,4 +1,4 @@
1
- import { type Callback, defer, noopFn } from '@nmtjs/common'
1
+ import { defer } from '@nmtjs/common'
2
2
  import { concat, encodeText } from '../common/binary.ts'
3
3
  import type { ProtocolBlobMetadata } from '../common/blob.ts'
4
4
 
@@ -75,6 +75,14 @@ export class ProtocolServerStream<T = any>
75
75
  extends TransformStream<any, T>
76
76
  implements ProtocolServerStreamInterface<T>
77
77
  {
78
+ #writer: WritableStreamDefaultWriter
79
+
80
+ constructor(options?: Transformer<any, T>) {
81
+ super(options)
82
+
83
+ this.#writer = this.writable.getWriter()
84
+ }
85
+
78
86
  async *[Symbol.asyncIterator]() {
79
87
  const reader = this.readable.getReader()
80
88
  while (true) {
@@ -85,15 +93,15 @@ export class ProtocolServerStream<T = any>
85
93
  }
86
94
 
87
95
  async push(chunk: T) {
88
- await this.writable.getWriter().write(chunk)
96
+ await this.#writer.write(chunk)
89
97
  }
90
98
 
91
99
  async end() {
92
- await this.writable.getWriter().close()
100
+ await this.#writer.close()
93
101
  }
94
102
 
95
- abort(error = new Error('Stream aborted')) {
96
- this.writable.getWriter().abort(error)
103
+ async abort(error = new Error('Stream aborted')) {
104
+ await this.#writer.abort(error)
97
105
  }
98
106
  }
99
107
 
@@ -43,7 +43,7 @@ export class ProtocolBlob implements ProtocolBlobInterface {
43
43
  filename?: string
44
44
  } = {},
45
45
  ) {
46
- let _source: any = undefined
46
+ let _source: any
47
47
 
48
48
  if (source instanceof globalThis.ReadableStream) {
49
49
  _source = source
package/src/server/api.ts CHANGED
@@ -1,10 +1,4 @@
1
- import type {
2
- Container,
3
- Metadata,
4
- MetadataKey,
5
- MetadataStore,
6
- } from '@nmtjs/core'
7
- import type { Hook } from '@nmtjs/core'
1
+ import type { Container, Hook, MetadataStore } from '@nmtjs/core'
8
2
  import type { Connection } from './connection.ts'
9
3
 
10
4
  export type ProtocolApiCallOptions = {
@@ -1,7 +1,5 @@
1
1
  import { randomUUID } from 'node:crypto'
2
2
  import type { Container } from '@nmtjs/core'
3
- import type { InteractivePromise } from '../../../common/src/index.ts'
4
- import type { ProtocolApiCallResult } from './api.ts'
5
3
  import type { BaseServerDecoder, BaseServerEncoder } from './format.ts'
6
4
  import type { ProtocolClientStream, ProtocolServerStream } from './stream.ts'
7
5
 
@@ -97,13 +97,14 @@ export class ProtocolConnections {
97
97
  await this.initialize(connection)
98
98
  this.#collection.set(connection.id, { connection, context, transport })
99
99
  return { connection, context }
100
- } finally {
100
+ } catch (error) {
101
101
  container.dispose().catch((error) => {
102
102
  this.application.logger.error(
103
103
  { error, connection },
104
104
  'Error during disposing connection',
105
105
  )
106
106
  })
107
+ throw error
107
108
  }
108
109
  }
109
110
 
@@ -230,7 +231,6 @@ export class ProtocolServerStreams {
230
231
  }
231
232
 
232
233
  pull(connectionId: string, streamId: number) {
233
- console.log('Pulling stream', streamId)
234
234
  const stream = this.get(connectionId, streamId)
235
235
  stream.resume()
236
236
  }
@@ -363,7 +363,6 @@ export class Protocol {
363
363
  )
364
364
  })
365
365
  stream.on('end', () => {
366
- console.log('Stream ended')
367
366
  transport.send(
368
367
  connection,
369
368
  ServerMessageType.ServerStreamEnd,
@@ -1,4 +1,3 @@
1
- import type { Async } from '@nmtjs/common'
2
1
  import type { BasePlugin, PluginContext } from '@nmtjs/core'
3
2
  import type { ServerMessageType } from '../common/enums.ts'
4
3
  import type { Connection } from './connection.ts'
@@ -1,4 +1,3 @@
1
- import type { ProtocolServerBlobStream } from '../client/stream.ts'
2
1
  import type { ProtocolBlob, ProtocolBlobInterface } from '../common/blob.ts'
3
2
  import type { ProtocolClientStream } from './stream.ts'
4
3