@nmtjs/protocol 0.12.4 → 0.12.6

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.
Files changed (72) hide show
  1. package/dist/client/events.d.ts +17 -0
  2. package/dist/client/events.js +26 -30
  3. package/dist/client/format.d.ts +21 -0
  4. package/dist/client/format.js +2 -3
  5. package/dist/client/index.d.ts +5 -0
  6. package/dist/client/index.js +1 -2
  7. package/dist/client/protocol.d.ts +149 -0
  8. package/dist/client/protocol.js +342 -343
  9. package/dist/client/stream.d.ts +28 -0
  10. package/dist/client/stream.js +88 -80
  11. package/dist/client/types.d.ts +8 -0
  12. package/dist/client/types.js +0 -2
  13. package/dist/common/binary.d.ts +19 -0
  14. package/dist/common/binary.js +17 -17
  15. package/dist/common/blob.d.ts +22 -0
  16. package/dist/common/blob.js +44 -40
  17. package/dist/common/enums.d.ts +41 -0
  18. package/dist/common/enums.js +45 -47
  19. package/dist/common/index.d.ts +4 -0
  20. package/dist/common/index.js +0 -2
  21. package/dist/common/types.d.ts +34 -0
  22. package/dist/common/types.js +0 -2
  23. package/dist/server/api.d.ts +34 -0
  24. package/dist/server/api.js +7 -9
  25. package/dist/server/connection.d.ts +25 -0
  26. package/dist/server/connection.js +18 -20
  27. package/dist/server/constants.d.ts +4 -0
  28. package/dist/server/constants.js +2 -4
  29. package/dist/server/format.d.ts +40 -0
  30. package/dist/server/format.js +56 -43
  31. package/dist/server/index.d.ts +11 -0
  32. package/dist/server/index.js +0 -2
  33. package/dist/server/injectables.d.ts +14 -0
  34. package/dist/server/injectables.js +18 -20
  35. package/dist/server/protocol.d.ts +118 -0
  36. package/dist/server/protocol.js +365 -384
  37. package/dist/server/registry.d.ts +3 -0
  38. package/dist/server/registry.js +3 -4
  39. package/dist/server/stream.d.ts +12 -0
  40. package/dist/server/stream.js +28 -26
  41. package/dist/server/transport.d.ts +23 -0
  42. package/dist/server/transport.js +1 -7
  43. package/dist/server/types.d.ts +13 -0
  44. package/dist/server/types.js +0 -2
  45. package/dist/server/utils.d.ts +15 -0
  46. package/dist/server/utils.js +16 -13
  47. package/package.json +17 -14
  48. package/src/server/api.ts +2 -1
  49. package/src/server/protocol.ts +1 -1
  50. package/dist/client/events.js.map +0 -1
  51. package/dist/client/format.js.map +0 -1
  52. package/dist/client/index.js.map +0 -1
  53. package/dist/client/protocol.js.map +0 -1
  54. package/dist/client/stream.js.map +0 -1
  55. package/dist/client/types.js.map +0 -1
  56. package/dist/common/binary.js.map +0 -1
  57. package/dist/common/blob.js.map +0 -1
  58. package/dist/common/enums.js.map +0 -1
  59. package/dist/common/index.js.map +0 -1
  60. package/dist/common/types.js.map +0 -1
  61. package/dist/server/api.js.map +0 -1
  62. package/dist/server/connection.js.map +0 -1
  63. package/dist/server/constants.js.map +0 -1
  64. package/dist/server/format.js.map +0 -1
  65. package/dist/server/index.js.map +0 -1
  66. package/dist/server/injectables.js.map +0 -1
  67. package/dist/server/protocol.js.map +0 -1
  68. package/dist/server/registry.js.map +0 -1
  69. package/dist/server/stream.js.map +0 -1
  70. package/dist/server/transport.js.map +0 -1
  71. package/dist/server/types.js.map +0 -1
  72. package/dist/server/utils.js.map +0 -1
@@ -0,0 +1,3 @@
1
+ import { Registry } from '@nmtjs/core';
2
+ export declare class ProtocolRegistry extends Registry {
3
+ }
@@ -1,4 +1,3 @@
1
- import { Registry } from "@nmtjs/core";
2
- export class ProtocolRegistry extends Registry {}
3
-
4
- //# sourceMappingURL=registry.js.map
1
+ import { Registry } from '@nmtjs/core';
2
+ export class ProtocolRegistry extends Registry {
3
+ }
@@ -0,0 +1,12 @@
1
+ import { PassThrough, type ReadableOptions } from 'node:stream';
2
+ import type { ProtocolBlob, ProtocolBlobMetadata } from '../common/blob.ts';
3
+ export declare class ProtocolClientStream extends PassThrough {
4
+ readonly id: number;
5
+ readonly metadata: ProtocolBlobMetadata;
6
+ constructor(id: number, metadata: ProtocolBlobMetadata, options?: ReadableOptions);
7
+ }
8
+ export declare class ProtocolServerStream extends PassThrough {
9
+ readonly id: number;
10
+ readonly metadata: ProtocolBlobMetadata;
11
+ constructor(id: number, blob: ProtocolBlob);
12
+ }
@@ -1,30 +1,32 @@
1
- import { PassThrough, Readable } from "node:stream";
2
- import { ReadableStream } from "node:stream/web";
1
+ import { PassThrough, Readable } from 'node:stream';
2
+ import { ReadableStream } from 'node:stream/web';
3
3
  export class ProtocolClientStream extends PassThrough {
4
- constructor(id, metadata, options) {
5
- super(options);
6
- this.id = id;
7
- this.metadata = metadata;
8
- }
4
+ id;
5
+ metadata;
6
+ constructor(id, metadata, options) {
7
+ super(options);
8
+ this.id = id;
9
+ this.metadata = metadata;
10
+ }
9
11
  }
10
12
  export class ProtocolServerStream extends PassThrough {
11
- id;
12
- metadata;
13
- constructor(id, blob) {
14
- let readable;
15
- if (blob.source instanceof Readable) {
16
- readable = blob.source;
17
- } else if (blob.source instanceof ReadableStream) {
18
- readable = Readable.fromWeb(blob.source);
19
- } else {
20
- throw new Error("Invalid source type");
21
- }
22
- super();
23
- this.pause();
24
- readable.pipe(this);
25
- this.id = id;
26
- this.metadata = blob.metadata;
27
- }
13
+ id;
14
+ metadata;
15
+ constructor(id, blob) {
16
+ let readable;
17
+ if (blob.source instanceof Readable) {
18
+ readable = blob.source;
19
+ }
20
+ else if (blob.source instanceof ReadableStream) {
21
+ readable = Readable.fromWeb(blob.source);
22
+ }
23
+ else {
24
+ throw new Error('Invalid source type');
25
+ }
26
+ super();
27
+ this.pause();
28
+ readable.pipe(this);
29
+ this.id = id;
30
+ this.metadata = blob.metadata;
31
+ }
28
32
  }
29
-
30
- //# sourceMappingURL=stream.js.map
@@ -0,0 +1,23 @@
1
+ import type { BasePlugin, PluginContext } from '@nmtjs/core';
2
+ import type { ServerMessageType } from '../common/enums.ts';
3
+ import type { Connection } from './connection.ts';
4
+ import { kTransportPlugin } from './constants.ts';
5
+ import type { Format } from './format.ts';
6
+ import type { Protocol } from './protocol.ts';
7
+ import type { ProtocolRegistry } from './registry.ts';
8
+ import type { ProtocolSendMetadata } from './types.ts';
9
+ export interface Transport<T = unknown> {
10
+ start: () => Promise<void>;
11
+ stop: () => Promise<void>;
12
+ send: (connection: Connection<T>, messageType: ServerMessageType, buffer: ArrayBuffer, metadata: ProtocolSendMetadata) => any;
13
+ }
14
+ export interface TransportPluginContext extends PluginContext {
15
+ protocol: Protocol;
16
+ registry: ProtocolRegistry;
17
+ format: Format;
18
+ }
19
+ export interface TransportPlugin<Type = unknown, Options = unknown> extends BasePlugin<Transport<Type>, Options, TransportPluginContext> {
20
+ [kTransportPlugin]: any;
21
+ }
22
+ export declare const createTransport: <Type = unknown, Options = unknown>(name: string, init: TransportPlugin<Type, Options>["init"]) => TransportPlugin<Type, Options>;
23
+ export declare const isTransportPlugin: (plugin: BasePlugin<any, any, any>) => plugin is TransportPlugin;
@@ -1,9 +1,3 @@
1
1
  import { kTransportPlugin } from "./constants.js";
2
- export const createTransport = (name, init) => ({
3
- name,
4
- init,
5
- [kTransportPlugin]: true
6
- });
2
+ export const createTransport = (name, init) => ({ name, init, [kTransportPlugin]: true });
7
3
  export const isTransportPlugin = (plugin) => kTransportPlugin in plugin;
8
-
9
- //# sourceMappingURL=transport.js.map
@@ -0,0 +1,13 @@
1
+ import type { ProtocolBlob, ProtocolBlobInterface } from '../common/blob.ts';
2
+ import type { ProtocolClientStream } from './stream.ts';
3
+ export type InputType<T> = T extends ProtocolBlobInterface ? ProtocolClientStream : T extends object ? {
4
+ [K in keyof T]: InputType<T[K]>;
5
+ } : T;
6
+ export type OutputType<T> = T extends ProtocolBlobInterface ? ProtocolBlob : T extends object ? {
7
+ [K in keyof T]: OutputType<T[K]>;
8
+ } : T;
9
+ export type ProtocolSendMetadata = {
10
+ streamId?: number;
11
+ callId?: number;
12
+ error?: any;
13
+ };
@@ -1,3 +1 @@
1
1
  export {};
2
-
3
- //# sourceMappingURL=types.js.map
@@ -0,0 +1,15 @@
1
+ import type { Format } from './format.ts';
2
+ export type ResolveFormatParams = {
3
+ contentType?: string | null;
4
+ acceptType?: string | null;
5
+ };
6
+ export declare class UnsupportedFormatError extends Error {
7
+ }
8
+ export declare class UnsupportedContentTypeError extends UnsupportedFormatError {
9
+ }
10
+ export declare class UnsupportedAcceptTypeError extends UnsupportedFormatError {
11
+ }
12
+ export declare const getFormat: (format: Format, { acceptType, contentType }: ResolveFormatParams) => {
13
+ encoder: import("./format.ts").BaseServerEncoder;
14
+ decoder: import("./format.ts").BaseServerDecoder;
15
+ };
@@ -1,15 +1,18 @@
1
- export class UnsupportedFormatError extends Error {}
2
- export class UnsupportedContentTypeError extends UnsupportedFormatError {}
3
- export class UnsupportedAcceptTypeError extends UnsupportedFormatError {}
1
+ export class UnsupportedFormatError extends Error {
2
+ }
3
+ export class UnsupportedContentTypeError extends UnsupportedFormatError {
4
+ }
5
+ export class UnsupportedAcceptTypeError extends UnsupportedFormatError {
6
+ }
4
7
  export const getFormat = (format, { acceptType, contentType }) => {
5
- const encoder = contentType ? format.supportsEncoder(contentType) : undefined;
6
- if (!encoder) throw new UnsupportedContentTypeError("Unsupported Content-Type");
7
- const decoder = acceptType ? format.supportsDecoder(acceptType) : undefined;
8
- if (!decoder) throw new UnsupportedAcceptTypeError("Unsupported Accept-Type");
9
- return {
10
- encoder,
11
- decoder
12
- };
8
+ const encoder = contentType ? format.supportsEncoder(contentType) : undefined;
9
+ if (!encoder)
10
+ throw new UnsupportedContentTypeError('Unsupported Content-Type');
11
+ const decoder = acceptType ? format.supportsDecoder(acceptType) : undefined;
12
+ if (!decoder)
13
+ throw new UnsupportedAcceptTypeError('Unsupported Accept-Type');
14
+ return {
15
+ encoder,
16
+ decoder,
17
+ };
13
18
  };
14
-
15
- //# sourceMappingURL=utils.js.map
package/package.json CHANGED
@@ -3,27 +3,30 @@
3
3
  "type": "module",
4
4
  "exports": {
5
5
  ".": {
6
- "types": "./src/common/index.ts",
7
- "import": "./dist/common/index.js"
6
+ "types": "./dist/common/index.d.ts",
7
+ "import": "./dist/common/index.js",
8
+ "module-sync": "./dist/common/index.js"
8
9
  },
9
10
  "./server": {
10
- "types": "./src/server/index.ts",
11
- "import": "./dist/server/index.js"
11
+ "types": "./dist/server/index.d.ts",
12
+ "import": "./dist/server/index.js",
13
+ "module-sync": "./dist/server/index.js"
12
14
  },
13
15
  "./client": {
14
- "types": "./src/client/index.ts",
15
- "import": "./dist/client/index.js"
16
+ "types": "./dist/client/index.d.ts",
17
+ "import": "./dist/client/index.js",
18
+ "module-sync": "./dist/client/index.js"
16
19
  }
17
20
  },
18
21
  "dependencies": {
19
- "@nmtjs/core": "0.12.4",
20
- "@nmtjs/common": "0.12.4",
21
- "@nmtjs/type": "0.12.4"
22
+ "@nmtjs/common": "0.12.6",
23
+ "@nmtjs/core": "0.12.6",
24
+ "@nmtjs/type": "0.12.6"
22
25
  },
23
26
  "peerDependencies": {
24
- "@nmtjs/common": "0.12.4",
25
- "@nmtjs/type": "0.12.4",
26
- "@nmtjs/core": "0.12.4"
27
+ "@nmtjs/common": "0.12.6",
28
+ "@nmtjs/type": "0.12.6",
29
+ "@nmtjs/core": "0.12.6"
27
30
  },
28
31
  "files": [
29
32
  "src",
@@ -31,9 +34,9 @@
31
34
  "LICENSE.md",
32
35
  "README.md"
33
36
  ],
34
- "version": "0.12.4",
37
+ "version": "0.12.6",
35
38
  "scripts": {
36
- "build": "neemata-build --root=./src './**/*.ts'",
39
+ "build": "tsc",
37
40
  "type-check": "tsc --noEmit"
38
41
  }
39
42
  }
package/src/server/api.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { Async } from '@nmtjs/common'
1
2
  import type { Container, Hook, MetadataStore } from '@nmtjs/core'
2
3
  import type { Connection } from './connection.ts'
3
4
  import { kIterableResponse } from './constants.ts'
@@ -13,7 +14,7 @@ export type ProtocolApiCallOptions = {
13
14
  }
14
15
 
15
16
  export type ProtocolAnyIterable<T> =
16
- | ((signal: AbortSignal) => AsyncIterable<T>)
17
+ | ((signal: AbortSignal) => Async<AsyncIterable<T>>)
17
18
  | AsyncIterable<T>
18
19
 
19
20
  export interface ProtocolApiCallBaseResult<T = unknown> {
@@ -390,7 +390,7 @@ export class Protocol {
390
390
  context.rpcStreams.set(callId, controller)
391
391
  const iterable =
392
392
  typeof response.iterable === 'function'
393
- ? response.iterable(controller.signal)
393
+ ? await response.iterable(controller.signal)
394
394
  : response.iterable
395
395
  try {
396
396
  for await (const chunk of iterable) {
@@ -1 +0,0 @@
1
- {"mappings":";;;;;AASA,OAAO,MAAM,aAMX;CACA,OAAO,KAGLA,IAAOC,OAAU;AACjB,SAAO,IAAI,QAAQ,CAAC,YAAY,GAAG,KAAK,OAAO,QAAQ;CACxD;CAED,UAAU,IAAI;CACd,aAAa,IAAI;CAEjB,GACEC,OACAC,UACAC,SACA;EACA,MAAM,UAAU,CAAC,UAAU,SAAS,GAAG,MAAM,OAAO;AACpD,OAAKC,WAAW,IAAI,UAAU,QAAQ;AACtC,OAAKC,QAAQ,iBAAiB,OAAO,SAAS,QAAQ;AACtD,SAAO,MAAM,KAAKA,QAAQ,oBAAoB,OAAO,QAAQ;CAC9D;CAED,KACEJ,OACAC,UACAC,SACA;AACA,SAAO,KAAK,GAAG,OAAO,UAAU;GAAE,GAAG;GAAS,MAAM;EAAM,EAAC;CAC5D;CAED,IAAIG,OAAuCC,UAAoB;EAC7D,MAAM,UAAU,KAAKH,WAAW,IAAI,SAAS;AAC7C,MAAI,QAAS,MAAKC,QAAQ,oBAAoB,OAAO,QAAQ;CAC9D;CAED,KACEL,OACA,GAAG,MACH;AACA,SAAO,KAAKK,QAAQ,cAAc,IAAI,YAAY,OAAO,EAAE,QAAQ,KAAM,GAAE;CAC5E;AACF","names":["ee: T","event: E","event: E | (Object & string)","listener: (...args: Events[E]) => void","options?: AddEventListenerOptions","#listeners","#target","event: EventNames | (Object & string)","listener: Callback"],"sources":["../../src/client/events.ts"],"sourcesContent":["import type { Callback } from '@nmtjs/common'\n\nexport type EventMap = { [K: string]: any[] }\n\n/**\n * Very simple node-like event emitter wrapper around EventTarget\n *\n * @todo add errors and promise rejections handling\n */\nexport class EventEmitter<\n Events extends EventMap = EventMap,\n EventNames extends Extract<keyof Events, string> = Extract<\n keyof Events,\n string\n >,\n> {\n static once<\n T extends EventEmitter,\n E extends T extends EventEmitter<any, infer Event> ? Event : never,\n >(ee: T, event: E) {\n return new Promise((resolve) => ee.once(event, resolve))\n }\n\n #target = new EventTarget()\n #listeners = new Map<Callback, Callback>()\n\n on<E extends EventNames>(\n event: E | (Object & string),\n listener: (...args: Events[E]) => void,\n options?: AddEventListenerOptions,\n ) {\n const wrapper = (event) => listener(...event.detail)\n this.#listeners.set(listener, wrapper)\n this.#target.addEventListener(event, wrapper, options)\n return () => this.#target.removeEventListener(event, wrapper)\n }\n\n once<E extends EventNames>(\n event: E | (Object & string),\n listener: (...args: Events[E]) => void,\n options?: AddEventListenerOptions,\n ) {\n return this.on(event, listener, { ...options, once: true })\n }\n\n off(event: EventNames | (Object & string), listener: Callback) {\n const wrapper = this.#listeners.get(listener)\n if (wrapper) this.#target.removeEventListener(event, wrapper)\n }\n\n emit<E extends EventNames | (Object & string)>(\n event: E,\n ...args: E extends EventEmitter ? Events[E] : any[]\n ) {\n return this.#target.dispatchEvent(new CustomEvent(event, { detail: args }))\n }\n}\n"],"version":3,"file":"events.js"}
@@ -1 +0,0 @@
1
- {"mappings":"AAmCA,OAAO,MAAe,iBAEtB,CAaC","names":[],"sources":["../../src/client/format.ts"],"sourcesContent":["import type {\n // BaseClientDecoder,\n // BaseClientEncoder,\n DecodeRPCContext,\n EncodeRPCContext,\n ProtocolRPC,\n // ProtocolRPCEncode,\n ProtocolRPCResponse,\n} from '../common/types.ts'\nimport type {\n ProtocolClientBlobStream,\n ProtocolServerBlobStream,\n} from './stream.ts'\n\nexport type ProtocolRPCEncode = {\n buffer: ArrayBuffer\n streams: Record<number, ProtocolClientBlobStream>\n}\n\nexport interface BaseClientDecoder {\n decode(buffer: ArrayBuffer): any\n decodeRPC(\n buffer: ArrayBuffer,\n context: DecodeRPCContext<ProtocolServerBlobStream>,\n ): ProtocolRPCResponse<ProtocolServerBlobStream>\n}\n\nexport interface BaseClientEncoder {\n encode(data: any): ArrayBuffer\n encodeRPC(\n rpc: ProtocolRPC,\n context: EncodeRPCContext<ProtocolClientBlobStream>,\n ): ProtocolRPCEncode\n}\n\nexport abstract class BaseClientFormat\n implements BaseClientDecoder, BaseClientEncoder\n{\n abstract contentType: string\n\n abstract encode(data: any): ArrayBuffer\n abstract encodeRPC(\n rpc: ProtocolRPC,\n context: EncodeRPCContext<ProtocolClientBlobStream>,\n ): ProtocolRPCEncode\n abstract decode(buffer: ArrayBuffer): any\n abstract decodeRPC(\n buffer: ArrayBuffer,\n context: DecodeRPCContext<ProtocolServerBlobStream>,\n ): ProtocolRPCResponse<ProtocolServerBlobStream>\n}\n"],"version":3,"file":"format.js"}
@@ -1 +0,0 @@
1
- {"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AAEd,cAAc;AACd,cAAc","names":[],"sources":["../../src/client/index.ts"],"sourcesContent":["export * from './events.ts'\nexport * from './format.ts'\nexport * from './protocol.ts'\n// export * from './protocolv1.ts'\nexport * from './stream.ts'\nexport * from './types.ts'\n"],"version":3,"file":"index.js"}
@@ -1 +0,0 @@
1
- {"mappings":"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","names":["code: string","message?: string","data?: any","#collection","streamId: number","source: ReadableStream","metadata: ProtocolBlobMetadata","error?: Error","size: number","stream: T","chunk: ArrayBuffer","namespace: string","procedure: string","payload: any","event: string","format: BaseClientFormat","callId: number","call: ProtocolClientCall","response: OneOf<\n [{ error: BaseProtocolError }, { result: any; stream?: any }]\n >","transformer: ProtocolBaseTransformer","stream?: ProtocolServerStream","response: ProtocolRPCResponse","stream: ProtocolServerStream","options: ProtocolBaseClientCallOptions","chunk: any","stream: ProtocolServerBlobStream","payload: string","buffer: ArrayBuffer","transport: ProtocolTransport"],"sources":["../../src/client/protocol.ts"],"sourcesContent":["import {\n createPromise,\n type InteractivePromise,\n type OneOf,\n} from '@nmtjs/common'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlobMetadata } from '../common/blob.ts'\nimport {\n ClientMessageType,\n ErrorCode,\n ServerMessageType,\n} from '../common/enums.ts'\nimport type {\n BaseProtocolError,\n ProtocolRPC,\n ProtocolRPCResponse,\n} from '../common/types.ts'\nimport { EventEmitter } from './events.ts'\nimport type { BaseClientFormat } from './format.ts'\nimport {\n ProtocolClientBlobStream,\n ProtocolServerBlobStream,\n ProtocolServerStream,\n} from './stream.ts'\n\nexport class ProtocolError extends Error implements BaseProtocolError {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport class ProtocolClientStreams {\n readonly #collection = new Map<number, ProtocolClientBlobStream>()\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(\n source: ReadableStream,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n ) {\n const stream = new ProtocolClientBlobStream(source, streamId, metadata)\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number, error?: Error) {\n const stream = this.get(streamId)\n stream.abort(error)\n this.remove(streamId)\n }\n\n pull(streamId: number, size: number) {\n const stream = this.get(streamId)\n return stream.read(size)\n }\n\n end(streamId: number) {\n this.get(streamId).end()\n this.remove(streamId)\n }\n\n clear(error?: Error) {\n if (error) {\n for (const stream of this.#collection.values()) {\n stream.abort(error)\n }\n }\n this.#collection.clear()\n }\n}\n\nexport class ProtocolServerStreams<\n T extends ProtocolServerStream = ProtocolServerStream,\n> {\n readonly #collection = new Map<number, T>()\n\n has(streamId: number) {\n return this.#collection.has(streamId)\n }\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(streamId: number, stream: T) {\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number) {\n if (this.has(streamId)) {\n const stream = this.get(streamId)\n stream.abort()\n this.remove(streamId)\n }\n }\n\n async push(streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(streamId)\n return await stream.push(chunk)\n }\n\n end(streamId: number) {\n const stream = this.get(streamId)\n stream.end()\n this.remove(streamId)\n }\n\n clear(error?: Error) {\n if (error) {\n for (const stream of this.#collection.values()) {\n stream.abort(error)\n }\n }\n this.#collection.clear()\n }\n}\n\nexport type ProtocolTransportEventMap = {\n connected: []\n disconnected: []\n}\n\nexport interface ProtocolSendMetadata {\n callId?: number\n streamId?: number\n}\n\nexport enum ProtocolTransportStatus {\n CONNECTED = 'CONNECTED',\n DISCONNECTED = 'DISCONNECTED',\n CONNECTING = 'CONNECTING',\n}\n\nexport abstract class ProtocolTransport extends EventEmitter<ProtocolTransportEventMap> {\n status: ProtocolTransportStatus = ProtocolTransportStatus.DISCONNECTED\n\n abstract connect(\n auth: any,\n transformer: ProtocolBaseTransformer,\n ): Promise<void>\n abstract disconnect(): Promise<void>\n abstract call(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions,\n transformer: ProtocolBaseTransformer,\n ): Promise<ProtocolClientCall>\n abstract send(\n messageType: ClientMessageType,\n buffer: ArrayBuffer,\n metadata: ProtocolSendMetadata,\n ): Promise<void>\n}\n\nexport class ProtocolBaseTransformer {\n encodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPCChunk(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeEvent(namespace: string, event: string, payload: any) {\n return payload\n }\n}\n\nexport type ProtocolClientCall = InteractivePromise<any> &\n Pick<ProtocolRPC, 'namespace' | 'procedure'> & { signal: AbortSignal }\n\nexport type ProtocolBaseClientOptions = {\n transport: ProtocolTransport\n format: BaseClientFormat\n transformer?: ProtocolBaseTransformer\n timeout?: number\n}\n\nexport type ProtocolBaseClientCallOptions = {\n signal?: AbortSignal\n timeout: number\n}\n\nexport class BaseProtocol<\n T extends Record<string, Record<string, any>> = Record<\n string,\n Record<string, any>\n >,\n> extends EventEmitter<\n {\n [N in keyof T]: {\n [E in keyof T[N] as `${Extract<N, string>}/${Extract<E, string>}`]: [\n payload: T[N][E],\n ]\n }\n }[keyof T]\n> {\n protected readonly clientStreams: ProtocolClientStreams =\n new ProtocolClientStreams()\n protected readonly serverStreams: ProtocolServerStreams<ProtocolServerBlobStream> =\n new ProtocolServerStreams()\n protected readonly rpcStreams: ProtocolServerStreams =\n new ProtocolServerStreams()\n protected readonly calls = new Map<number, ProtocolClientCall>()\n protected callId = 0\n protected streamId = 0\n\n constructor(public readonly format: BaseClientFormat) {\n super()\n }\n\n get contentType() {\n return this.format.contentType\n }\n\n handleCallResponse(\n callId: number,\n call: ProtocolClientCall,\n response: OneOf<\n [{ error: BaseProtocolError }, { result: any; stream?: any }]\n >,\n transformer: ProtocolBaseTransformer,\n ) {\n if (response.error) {\n call.reject(\n new ProtocolError(\n response.error.code,\n response.error.message,\n response.error.data,\n ),\n )\n } else {\n try {\n const transformed = transformer.decodeRPC(\n call.namespace,\n call.procedure,\n response.result,\n )\n if (response.stream)\n call.resolve({ result: transformed, stream: response.stream })\n else call.resolve(transformed)\n } catch (error) {\n call.reject(\n new ProtocolError(\n ErrorCode.ClientRequestError,\n 'Unable to decode response',\n error,\n ),\n )\n }\n }\n this.calls.delete(callId)\n }\n\n handleRpcResponse(\n { callId, error, result, streams }: ProtocolRPCResponse,\n transformer: ProtocolBaseTransformer,\n stream?: ProtocolServerStream,\n ) {\n const call = this.calls.get(callId)\n if (!call) throw new Error('Call not found')\n for (const key in streams) {\n const stream = streams[key]\n this.serverStreams.add(stream.id, stream)\n }\n this.handleCallResponse(\n callId,\n call,\n error ? { error } : { result, stream },\n transformer,\n )\n return call\n }\n\n handleRpcStreamResponse(\n response: ProtocolRPCResponse,\n stream: ProtocolServerStream,\n transformer: ProtocolBaseTransformer,\n ) {\n const call = this.handleRpcResponse(response, transformer, stream)\n this.rpcStreams.add(response.callId, stream)\n return call\n }\n\n createCall(\n namespace: string,\n procedure: string,\n options: ProtocolBaseClientCallOptions,\n ) {\n const timeoutSignal = AbortSignal.timeout(options.timeout)\n const signal = options.signal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : timeoutSignal\n\n const call = Object.assign(createPromise(), {\n namespace,\n procedure,\n signal,\n })\n\n timeoutSignal.addEventListener(\n 'abort',\n () => {\n const error = new ProtocolError(\n ErrorCode.RequestTimeout,\n 'Request timeout',\n )\n call.reject(error)\n },\n { once: true },\n )\n\n return call\n }\n\n createRpc(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions,\n transformer: ProtocolBaseTransformer,\n ) {\n const callId = ++this.callId\n const call = this.createCall(namespace, procedure, options)\n const { buffer, streams } = this.format.encodeRPC(\n {\n callId,\n namespace,\n procedure,\n payload: transformer.encodeRPC(namespace, procedure, payload),\n },\n {\n addStream: (blob) => {\n const streamId = ++this.streamId\n return this.clientStreams.add(blob.source, streamId, blob.metadata)\n },\n getStream: (id) => {\n const stream = this.clientStreams.get(id)\n return stream\n },\n },\n )\n\n this.calls.set(callId, call)\n\n return { callId, call, streams, buffer }\n }\n\n pushRpcStream(callId: number, chunk: any) {\n this.rpcStreams.push(callId, chunk)\n }\n\n endRpcStream(callId: number) {\n this.rpcStreams.end(callId)\n }\n\n abortRpcStream(callId: number) {\n this.rpcStreams.abort(callId)\n }\n\n removeClientStream(streamId: number) {\n this.clientStreams.remove(streamId)\n }\n\n pullClientStream(streamId: number, size: number) {\n return this.clientStreams.pull(streamId, size)\n }\n\n endClientStream(streamId: number) {\n this.clientStreams.end(streamId)\n }\n\n abortClientStream(streamId: number, error?: Error) {\n this.clientStreams.abort(streamId, error)\n }\n\n addServerStream(stream: ProtocolServerBlobStream) {\n this.serverStreams.add(stream.id, stream)\n }\n\n removeServerStream(streamId: number) {\n this.serverStreams.remove(streamId)\n }\n\n pushServerStream(streamId: number, chunk: ArrayBuffer) {\n return this.serverStreams.push(streamId, chunk)\n }\n\n endServerStream(streamId: number) {\n this.serverStreams.end(streamId)\n }\n\n abortServerStream(streamId: number, error?: Error) {\n this.serverStreams.abort(streamId)\n }\n\n emitEvent(\n namespace: string,\n event: string,\n payload: string,\n transformer: ProtocolBaseTransformer,\n ) {\n const transformed = transformer.decodeEvent(namespace, event, payload)\n this.emit(`${namespace}/${event}`, transformed)\n }\n}\n\nexport class Protocol<\n T extends Record<string, Record<string, any>> = Record<\n string,\n Record<string, any>\n >,\n> extends BaseProtocol<T> {\n handleServerMessage(\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const type = decodeNumber(buffer, 'Uint8')\n const messageBuffer = buffer.slice(Uint8Array.BYTES_PER_ELEMENT)\n if (type in ServerMessageType) {\n const messageType = type as ServerMessageType\n if (typeof ServerMessageType[messageType] !== 'undefined') {\n this[messageType](messageBuffer, transport, transformer)\n } else {\n throw new Error(`Unknown message type: ${messageType}`)\n }\n }\n }\n\n protected [ServerMessageType.Event](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const [namespace, event, payload] = this.format.decode(buffer)\n this.emitEvent(namespace, event, payload, transformer)\n }\n\n protected [ServerMessageType.RpcResponse](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const response = this.format.decodeRPC(buffer, {\n addStream: (id, callId, metadata) => {\n return new ProtocolServerBlobStream(id, metadata, {\n start: () => {\n transport.send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(id, 'Uint32'),\n { callId, streamId: id },\n )\n },\n })\n },\n getStream: (id) => {\n return this.serverStreams.get(id)\n },\n })\n this.handleRpcResponse(response, transformer)\n }\n\n protected [ServerMessageType.RpcStreamResponse](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const response = this.format.decodeRPC(buffer, {\n addStream: (id, callId, metadata) => {\n return new ProtocolServerBlobStream(id, metadata, {\n start: () => {\n transport.send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(id, 'Uint32'),\n { callId, streamId: id },\n )\n },\n })\n },\n getStream: (id) => {\n return this.serverStreams.get(id)\n },\n })\n\n const stream = new ProtocolServerStream({\n transform: (chunk, controller) => {\n const transformed = transformer.decodeRPCChunk(\n call.namespace,\n call.procedure,\n chunk,\n )\n controller.enqueue(transformed)\n },\n })\n\n const call = this.handleRpcStreamResponse(response, stream, transformer)\n }\n\n protected [ServerMessageType.RpcStreamChunk](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const callId = decodeNumber(buffer, 'Uint32')\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n const payload = this.format.decode(chunk)\n this.pushRpcStream(callId, payload)\n }\n\n protected [ServerMessageType.RpcStreamEnd](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const callId = decodeNumber(buffer, 'Uint32')\n this.endRpcStream(callId)\n }\n\n protected [ServerMessageType.RpcStreamAbort](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const callId = decodeNumber(buffer, 'Uint32')\n this.abortRpcStream(callId)\n }\n\n protected [ServerMessageType.ServerStreamPush](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n this.pushServerStream(streamId, chunk)\n transport.send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(streamId, 'Uint32'),\n { streamId },\n )\n }\n\n protected [ServerMessageType.ServerStreamEnd](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n this.endServerStream(streamId)\n }\n\n protected [ServerMessageType.ServerStreamAbort](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n this.abortServerStream(streamId)\n }\n\n protected [ServerMessageType.ClientStreamPull](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n const size = decodeNumber(buffer, 'Uint32', Uint32Array.BYTES_PER_ELEMENT)\n this.pullClientStream(streamId, size).then((chunk) => {\n if (chunk) {\n transport.send(\n ClientMessageType.ClientStreamPush,\n concat(encodeNumber(streamId, 'Uint32'), chunk),\n { streamId },\n )\n } else {\n transport.send(\n ClientMessageType.ClientStreamEnd,\n encodeNumber(streamId, 'Uint32'),\n { streamId },\n )\n this.endClientStream(streamId)\n }\n })\n }\n\n protected [ServerMessageType.ClientStreamAbort](\n buffer: ArrayBuffer,\n transport: ProtocolTransport,\n transformer: ProtocolBaseTransformer,\n ) {\n const streamId = decodeNumber(buffer, 'Uint32')\n this.abortClientStream(streamId)\n }\n}\n"],"version":3,"file":"protocol.js"}
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"mappings":"","names":[],"sources":["../../src/client/types.ts"],"sourcesContent":["import type { ProtocolBlob, ProtocolBlobInterface } from '../common/blob.ts'\nimport type { ProtocolServerBlobStream } from './stream.ts'\n\nexport type InputType<T> = T extends ProtocolBlobInterface\n ? ProtocolBlob\n : T extends object\n ? { [K in keyof T]: InputType<T[K]> }\n : T\n\nexport type OutputType<T> = T extends ProtocolBlobInterface\n ? ProtocolServerBlobStream\n : T extends object\n ? { [K in keyof T]: OutputType<T[K]> }\n : T\n"],"version":3,"file":"types.js"}
@@ -1 +0,0 @@
1
- {"mappings":"AAGA,MAAM,cAAc,IAAI;AACxB,MAAM,cAAc,IAAI;AAexB,OAAO,MAAM,eAAe,CAC1BA,OACAC,MACA,eAAe,UACZ;CACH,MAAM,cAAc,YAAY,EAAE,KAAK,QAAQ;CAC/C,MAAM,KAAK,IAAI,YAAY;CAC3B,MAAM,KAAK,IAAI,SAAS;AACxB,KAAI,KAAK,KAAK,GAAG,GAAG,OAAgB,aAAa;AACjD,QAAO;AACR;AAED,OAAO,MAAM,eAAe,CAC1BC,QACAD,MACA,SAAS,GACT,eAAe,UACI;CACnB,MAAM,OAAO,IAAI,SAAS;AAC1B,QAAO,MAAM,KAAK,KAAK,GAAG,QAAQ,aAAa;AAChD;AAED,OAAO,MAAM,aAAa,CAACE,SACzB,IAAI,WAAW,YAAY,OAAO,KAAK,EAAE;AAE3C,OAAO,MAAM,aAAa,CAACC,WACzB,YAAY,OAAO,OAAO;AAE5B,OAAO,MAAM,SAAS,CAAC,GAAG,YAA2B;CACnD,MAAM,cAAc,QAAQ,OAC1B,CAAC,KAAK,WAAW,MAAM,OAAO,YAC9B,EACD;CACD,MAAM,OAAO,IAAI,WAAW;CAC5B,IAAI,SAAS;AACb,MAAK,MAAM,UAAU,SAAS;AAC5B,OAAK,IAAI,IAAI,WAAW,SAAS,OAAO;AACxC,YAAU,OAAO;CAClB;AACD,QAAO,KAAK;AACb","names":["value: BinaryTypes[T]","type: T","buffer: ArrayBuffer","text: string","buffer: Parameters<typeof utf8decoder.decode>[0]"],"sources":["../../src/common/binary.ts"],"sourcesContent":["// TODO: get rid of lib DOM somehow...\n/// <reference lib=\"dom\" />\n\nconst utf8decoder = new TextDecoder()\nconst utf8encoder = new TextEncoder()\n\nexport type BinaryTypes = {\n Int8: number\n Int16: number\n Int32: number\n Uint8: number\n Uint16: number\n Uint32: number\n Float32: number\n Float64: number\n BigInt64: bigint\n BigUint64: bigint\n}\n\nexport const encodeNumber = <T extends keyof BinaryTypes>(\n value: BinaryTypes[T],\n type: T,\n littleEndian = false,\n) => {\n const bytesNeeded = globalThis[`${type}Array`].BYTES_PER_ELEMENT\n const ab = new ArrayBuffer(bytesNeeded)\n const dv = new DataView(ab)\n dv[`set${type}`](0, value as never, littleEndian)\n return ab\n}\n\nexport const decodeNumber = <T extends keyof BinaryTypes>(\n buffer: ArrayBuffer,\n type: T,\n offset = 0,\n littleEndian = false,\n): BinaryTypes[T] => {\n const view = new DataView(buffer)\n return view[`get${type}`](offset, littleEndian) as BinaryTypes[T]\n}\n\nexport const encodeText = (text: string) =>\n new Uint8Array(utf8encoder.encode(text)).buffer as ArrayBuffer\n\nexport const decodeText = (buffer: Parameters<typeof utf8decoder.decode>[0]) =>\n utf8decoder.decode(buffer)\n\nexport const concat = (...buffers: ArrayBuffer[]) => {\n const totalLength = buffers.reduce(\n (acc, buffer) => acc + buffer.byteLength,\n 0,\n )\n const view = new Uint8Array(totalLength)\n let offset = 0\n for (const buffer of buffers) {\n view.set(new Uint8Array(buffer), offset)\n offset += buffer.byteLength\n }\n return view.buffer\n}\n"],"version":3,"file":"binary.js"}
@@ -1 +0,0 @@
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 +0,0 @@
1
- {"mappings":"AAAA,OAAO,IAAK,gEAAL;AACL;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;;AACD;AAED,OAAO,IAAK,gEAAL;AACL;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;;AACD;AAED,OAAO,IAAK,wDAAL;AACL;AACA;;AACD;AAED,OAAO,IAAK,gDAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACD","names":[],"sources":["../../src/common/enums.ts"],"sourcesContent":["export enum ClientMessageType {\n Rpc = 10,\n RpcAbort = 11,\n RpcStreamAbort = 12,\n\n ClientStreamPush = 20,\n ClientStreamEnd = 21,\n ClientStreamAbort = 22,\n ServerStreamAbort = 23,\n ServerStreamPull = 24,\n}\n\nexport enum ServerMessageType {\n Event = 1,\n\n RpcResponse = 10,\n RpcStreamResponse = 11,\n RpcStreamChunk = 12,\n RpcStreamEnd = 13,\n RpcStreamAbort = 14,\n\n ServerStreamPush = 20,\n ServerStreamEnd = 21,\n ServerStreamAbort = 22,\n\n ClientStreamAbort = 23,\n ClientStreamPull = 24,\n}\n\nexport enum TransportType {\n Bidirectional = 'Bidirectional',\n Unidirectional = 'Unidirectional',\n}\n\nexport enum ErrorCode {\n ValidationError = 'ValidationError',\n BadRequest = 'BadRequest',\n NotFound = 'NotFound',\n Forbidden = 'Forbidden',\n Unauthorized = 'Unauthorized',\n InternalServerError = 'InternalServerError',\n NotAcceptable = 'NotAcceptable',\n RequestTimeout = 'RequestTimeout',\n GatewayTimeout = 'GatewayTimeout',\n ServiceUnavailable = 'ServiceUnavailable',\n ClientRequestError = 'ClientRequestError',\n ConnectionError = 'ConnectionError',\n}\n"],"version":3,"file":"enums.js"}
@@ -1 +0,0 @@
1
- {"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc","names":[],"sources":["../../src/common/index.ts"],"sourcesContent":["export * from './binary.ts'\nexport * from './blob.ts'\nexport * from './enums.ts'\nexport * from './types.ts'\n"],"version":3,"file":"index.js"}
@@ -1 +0,0 @@
1
- {"mappings":"","names":[],"sources":["../../src/common/types.ts"],"sourcesContent":["import type { OneOf } from '@nmtjs/common'\nimport type { ProtocolBlob, ProtocolBlobMetadata } from './blob.ts'\n\ntype Stream = any\n\nexport interface BaseProtocolError {\n code: string\n message: string\n data?: any\n}\n\nexport type ProtocolRPC = {\n callId: number\n namespace: string\n procedure: string\n payload: any\n}\n\nexport type ProtocolRPCResponse<T = Stream> = OneOf<\n [\n {\n callId: number\n error: BaseProtocolError\n },\n {\n callId: number\n result: any\n streams: Record<number, T>\n },\n ]\n>\n\nexport interface EncodeRPCContext<T = Stream> {\n getStream: (id: number) => T\n addStream: (blob: ProtocolBlob) => T\n}\n\nexport interface DecodeRPCContext<T = Stream> {\n getStream: (id: number, callId: number) => T\n addStream: (id: number, callId: number, metadata: ProtocolBlobMetadata) => T\n}\n"],"version":3,"file":"types.js"}
@@ -1 +0,0 @@
1
- {"mappings":"AAEA,SAAS,yBAAyB,gBAAgB;AAmClD,OAAO,SAAS,iBACdA,OACwC;AACxC,QAAO,SAAS,MAAM,uBAAuB;AAC9C;AAED,OAAO,SAAS,qBACdC,UACA,SAAS,WACTC,UACqC;AACrC,QAAO;GACJ,oBAAoB;EACrB;EACA;EACA;CACD;AACF","names":["value: ProtocolApiCallResult","iterable: ProtocolAnyIterable<Y>","onFinish?: () => void"],"sources":["../../src/server/api.ts"],"sourcesContent":["import type { Container, Hook, MetadataStore } from '@nmtjs/core'\nimport type { Connection } from './connection.ts'\nimport { kIterableResponse } from './constants.ts'\n\nexport type ProtocolApiCallOptions = {\n connection: Connection\n namespace: string\n procedure: string\n container: Container\n payload: any\n signal: AbortSignal\n metadata?: (metadata: MetadataStore) => void\n}\n\nexport type ProtocolAnyIterable<T> =\n | ((signal: AbortSignal) => AsyncIterable<T>)\n | AsyncIterable<T>\n\nexport interface ProtocolApiCallBaseResult<T = unknown> {\n output: T\n}\n\nexport interface ProtocolApiCallIterableResult<Y = unknown, O = unknown>\n extends ProtocolApiCallBaseResult<O> {\n [kIterableResponse]: true\n iterable: ProtocolAnyIterable<Y>\n onFinish?: () => void\n}\n\nexport type ProtocolApiCallResult =\n | ProtocolApiCallBaseResult\n | ProtocolApiCallIterableResult\n\nexport interface ProtocolApi {\n call(options: ProtocolApiCallOptions): Promise<ProtocolApiCallResult>\n}\n\nexport function isIterableResult(\n value: ProtocolApiCallResult,\n): value is ProtocolApiCallIterableResult {\n return value && value[kIterableResponse] === true\n}\n\nexport function createStreamResponse<Y, O>(\n iterable: ProtocolAnyIterable<Y>,\n output = undefined as O,\n onFinish?: () => void,\n): ProtocolApiCallIterableResult<Y, O> {\n return {\n [kIterableResponse]: true as const,\n iterable,\n output,\n onFinish,\n }\n}\n\ndeclare module '@nmtjs/core' {\n export interface HookType {\n [Hook.OnConnect]: (connection: Connection) => any\n [Hook.OnDisconnect]: (connection: Connection) => any\n }\n}\n"],"version":3,"file":"api.js"}
@@ -1 +0,0 @@
1
- {"mappings":"AAAA,SAAS,kBAAkB,aAAa;AAUxC,OAAO,MAAM,WAA2B;CACtC,AAAS;CACT,AAAS;CAET,YAAYA,SAAkC;AAC5C,OAAK,KAAK,QAAQ,MAAM,YAAY;AACpC,OAAK,OAAO,QAAQ;CACrB;AACF;AAED,OAAO,MAAM,kBAAkB;CAC7B,WAAW;CACX,OAAO,IAAI;CACX,gBAAgB,IAAI;CACpB,gBAAgB,IAAI;CACpB,aAAa,IAAI;CACjB;CACA;CAKA,YACEC,WACAC,QACA;AACA,OAAK,YAAY;AACjB,OAAK,SAAS;CACf;AACF","names":["options: ConnectionOptions<Data>","container: ConnectionContext['container']","format: ConnectionContext['format']"],"sources":["../../src/server/connection.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\nimport type { Container } from '@nmtjs/core'\nimport type { BaseServerDecoder, BaseServerEncoder } from './format.ts'\nimport type { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\n\nexport type ConnectionOptions<Data = unknown> = {\n id?: string\n data: Data\n}\n\nexport class Connection<Data = unknown> {\n readonly id: string\n readonly data: Data\n\n constructor(options: ConnectionOptions<Data>) {\n this.id = options.id ?? randomUUID()\n this.data = options.data\n }\n}\n\nexport class ConnectionContext {\n streamId = 1\n rpcs = new Map<number, AbortController>()\n clientStreams = new Map<number, ProtocolClientStream>()\n serverStreams = new Map<number, ProtocolServerStream>()\n rpcStreams = new Map<number, AbortController>()\n container: Container\n format: {\n encoder: BaseServerEncoder\n decoder: BaseServerDecoder\n }\n\n constructor(\n container: ConnectionContext['container'],\n format: ConnectionContext['format'],\n ) {\n this.container = container\n this.format = format\n }\n}\n"],"version":3,"file":"connection.js"}
@@ -1 +0,0 @@
1
- {"mappings":"AAAA,OAAO,MAAMA,mBAAkC,OAAO,IACpD,6BACD;AAGD,OAAO,MAAMC,oBAAmC,OAAO,IACrD,8BACD","names":["kTransportPlugin: unique symbol","kIterableResponse: unique symbol"],"sources":["../../src/server/constants.ts"],"sourcesContent":["export const kTransportPlugin: unique symbol = Symbol.for(\n 'neemata:TransportPluginKey',\n)\nexport type kTransportPlugin = typeof kTransportPlugin\n\nexport const kIterableResponse: unique symbol = Symbol.for(\n 'neemata:IterableResponseKey',\n)\nexport type kIterableResponse = typeof kIterableResponse\n"],"version":3,"file":"constants.js"}
@@ -1 +0,0 @@
1
- {"mappings":"AACA,SAAS,aAA2B,aAAa;AA6BjD,OAAO,MAAe,iBAEtB,CAcC;AAED,OAAO,MAAM,oBAAoB,CAACA,UAAkB;AAClD,KAAI,UAAU,MAAO,QAAO,CAAC,KAAM;AACnC,QAAO,MACJ,MAAM,IAAI,CACV,IAAI,CAAC,MAAM;EACV,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,EAAE,MAAM,IAAI;EACpC,MAAM,SAAS,IAAI,IACjB,KAAK,IAAI,CAAC,MACR,EACG,MAAM,CACN,MAAM,IAAI,CACV,MAAM,GAAG,EAAE,CACX,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CACxB;AAEH,SAAO;GACL;GACA,GAAG,OAAO,IAAI,IAAI,GAAG,OAAO,WAAW,OAAO,IAAI,IAAI,CAAE,GAAG;EAC5D;CACF,EAAC,CACD,KAAK,CAAC,GAAG,MAAM;AACd,MAAI,EAAE,SAAS,MAAO,QAAO;AAC7B,MAAI,EAAE,SAAS,MAAO,SAAQ;AAC9B,SAAO,EAAE,IAAI,EAAE,KAAK,IAAI;CACzB,EAAC,CACD,IAAI,CAAC,MAAM,EAAE,KAAK;AACtB;AAED,OAAO,MAAM,OAAO;CAClB,WAAW,IAAI;CACf,WAAW,IAAI;CAEf,YAAYC,SAA6B;AACvC,OAAK,MAAM,UAAU,SAAS;AAC5B,QAAK,SAAS,IAAI,OAAO,aAAa,OAAO;AAC7C,QAAK,MAAM,cAAc,OAAO,QAAQ;AACtC,SAAK,SAAS,IAAI,YAAY,OAAO;GACtC;EACF;CACF;CAED,gBAAgBC,aAAqB,qBAAqB,OAAO;AAC/D,SAAO,KAAK,SAAS,KAAK,UAAU,aAAa,mBAAmB;CACrE;CAED,gBAAgBA,aAAqB,qBAAqB,OAAO;AAC/D,SAAO,KAAK,SAAS,KAAK,UAAU,aAAa,mBAAmB;CACrE;CAED,AAAQ,SACNC,SACAD,aACA,qBAAqB,OACX;EAEV,MAAM,QAAQ,kBAAkB,YAAY;AAE5C,OAAK,MAAM,QAAQ,OAAO;AACxB,QAAK,MAAM,CAAC,SAAS,OAAO,IAAI,SAAS;AACvC,QAAI,SAAS,SAAS,MAAM,MAAM,QAAQ,CAAE,QAAO;GACpD;EACF;AAED,MAAI,mBACF,OAAM,IAAI,OAAO,6BAA6B,YAAY;AAE5D,SAAO;CACR;AACF","names":["types: string","formats: BaseServerFormat[]","contentType: string","formats: Map<Pattern, T>"],"sources":["../../src/server/format.ts"],"sourcesContent":["import type { OneOf } from '@nmtjs/common'\nimport { match, type Pattern } from '@nmtjs/core'\nimport type {\n DecodeRPCContext,\n EncodeRPCContext,\n ProtocolRPC,\n ProtocolRPCResponse,\n} from '../common/types.ts'\nimport type { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\n\nexport interface BaseServerDecoder {\n accept: Pattern[]\n decode(buffer: ArrayBuffer): any\n decodeRPC(\n buffer: ArrayBuffer,\n context: DecodeRPCContext<ProtocolClientStream>,\n ): ProtocolRPC\n}\n\nexport interface BaseServerEncoder {\n contentType: string\n encode(data: any): ArrayBuffer\n encodeRPC(\n rpc: OneOf<\n [{ callId: number; error: any }, { callId: number; result: any }]\n >,\n context: EncodeRPCContext<ProtocolServerStream>,\n ): ArrayBuffer\n}\n\nexport abstract class BaseServerFormat\n implements BaseServerDecoder, BaseServerEncoder\n{\n abstract accept: Pattern[]\n abstract contentType: string\n\n abstract encode(data: any): ArrayBuffer\n abstract encodeRPC(\n rpc: ProtocolRPCResponse,\n context: EncodeRPCContext<ProtocolServerStream>,\n ): ArrayBuffer\n abstract decode(buffer: ArrayBuffer): any\n abstract decodeRPC(\n buffer: ArrayBuffer,\n context: DecodeRPCContext<ProtocolClientStream>,\n ): ProtocolRPC\n}\n\nexport const parseContentTypes = (types: string) => {\n if (types === '*/*') return ['*/*']\n return types\n .split(',')\n .map((t) => {\n const [type, ...rest] = t.split(';')\n const params = new Map(\n rest.map((p) =>\n p\n .trim()\n .split('=')\n .slice(0, 2)\n .map((p) => p.trim()),\n ) as [string, string][],\n )\n return {\n type,\n q: params.has('q') ? Number.parseFloat(params.get('q')!) : 1,\n }\n })\n .sort((a, b) => {\n if (a.type === '*/*') return 1\n if (b.type === '*/*') return -1\n return b.q - a.q ? -1 : 1\n })\n .map((t) => t.type)\n}\n\nexport class Format {\n decoders = new Map<Pattern, BaseServerDecoder>()\n encoders = new Map<Pattern, BaseServerEncoder>()\n\n constructor(formats: BaseServerFormat[]) {\n for (const format of formats) {\n this.encoders.set(format.contentType, format)\n for (const acceptType of format.accept) {\n this.decoders.set(acceptType, format)\n }\n }\n }\n\n supportsDecoder(contentType: string, throwIfUnsupported = false) {\n return this.supports(this.decoders, contentType, throwIfUnsupported)\n }\n\n supportsEncoder(contentType: string, throwIfUnsupported = false) {\n return this.supports(this.encoders, contentType, throwIfUnsupported)\n }\n\n private supports<T extends BaseServerEncoder | BaseServerDecoder>(\n formats: Map<Pattern, T>,\n contentType: string,\n throwIfUnsupported = false,\n ): T | null {\n // TODO: Use node:utils.MIMEType (not implemented yet in Deno and Bun yet)\n const types = parseContentTypes(contentType)\n\n for (const type of types) {\n for (const [pattern, format] of formats) {\n if (type === '*/*' || match(type, pattern)) return format\n }\n }\n\n if (throwIfUnsupported)\n throw new Error(`No supported format found: ${contentType}`)\n\n return null\n }\n}\n"],"version":3,"file":"format.js"}
@@ -1 +0,0 @@
1
- {"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc","names":[],"sources":["../../src/server/index.ts"],"sourcesContent":["export * from './api.ts'\nexport * from './connection.ts'\nexport * from './constants.ts'\nexport * from './format.ts'\nexport * from './injectables.ts'\nexport * from './protocol.ts'\nexport * from './registry.ts'\nexport * from './stream.ts'\nexport * from './transport.ts'\nexport * from './types.ts'\nexport * from './utils.ts'\n"],"version":3,"file":"index.js"}
@@ -1 +0,0 @@
1
- {"mappings":"AAAA,SACE,yBACA,sBACA,aACK,aAAa;AAGpB,MAAM,aAAa,qBACjB,MAAM,YACN,iBACD;AAED,MAAM,iBAAiB,qBACrB,MAAM,YACN,wBACD;AAED,MAAM,wBAAwB,qBAG5B,MAAM,YAAY,0BAA0B;AAE9C,MAAM,uBAAuB,qBAC3B,MAAM,MACN,0BACD;AAED,MAAM,mBAAmB,qBACvB,MAAM,MACN,qBACD;AAED,MAAM,iBAAiB,wBACrB;CACE,cAAc;EACZ;EACA;EACA;CACD;CACD,SAAS,CAAC,QAAQ,YAAY,IAAI,OAAO,OAAO,IAAI,CAAC;AACtD,GACD,uBACD;AAED,OAAO,MAAM,sBAAsB;CACjC;CACA;CACA;CACA;CACA;CACA;AACD","names":[],"sources":["../../src/server/injectables.ts"],"sourcesContent":["import {\n createFactoryInjectable,\n createLazyInjectable,\n Scope,\n} from '@nmtjs/core'\nimport type { Connection } from './connection.ts'\n\nconst connection = createLazyInjectable<Connection, Scope.Connection>(\n Scope.Connection,\n 'RPC connection',\n)\n\nconst connectionData = createLazyInjectable<any, Scope.Connection>(\n Scope.Connection,\n \"RPC connection's data\",\n)\n\nconst connectionAbortSignal = createLazyInjectable<\n AbortSignal,\n Scope.Connection\n>(Scope.Connection, 'Connection abort signal')\n\nconst rpcClientAbortSignal = createLazyInjectable<AbortSignal, Scope.Call>(\n Scope.Call,\n 'RPC client abort signal',\n)\n\nconst rpcTimeoutSignal = createLazyInjectable<AbortSignal, Scope.Call>(\n Scope.Call,\n 'RPC timeout signal',\n)\n\nconst rpcAbortSignal = createFactoryInjectable(\n {\n dependencies: {\n rpcTimeoutSignal,\n rpcClientAbortSignal,\n connectionAbortSignal,\n },\n factory: (ctx) => AbortSignal.any(Object.values(ctx)),\n },\n 'Any RPC abort signal',\n)\n\nexport const ProtocolInjectables = {\n connection,\n connectionData,\n connectionAbortSignal,\n rpcClientAbortSignal,\n rpcTimeoutSignal,\n rpcAbortSignal,\n} as const\n"],"version":3,"file":"injectables.js"}
@@ -1 +0,0 @@
1
- {"mappings":"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","names":["code: string","message?: string","data?: any","#collection","application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n }","connectionId: string","transport: ProtocolConnectionTransport","options: ConnectionOptions<T>","params: ResolveFormatParams","connection: Connection","connections: ProtocolConnections","streamId: number","metadata: ProtocolBlobMetadata","read: Callback","chunk: ArrayBuffer","blob: ProtocolBlob","application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n }","#connections","#clientStreams","#serverStreams","options: ProtocolApiCallOptions","rpc: ProtocolRPC","params: ProtocolRPCOptions","buffer: ArrayBuffer","callId: number","options: ConnectionOptions","error?: Error"],"sources":["../../src/server/protocol.ts"],"sourcesContent":["import { type Callback, defer, isAbortError, throwError } from '@nmtjs/common'\nimport {\n type AnyInjectable,\n type Container,\n Hook,\n type Logger,\n Scope,\n} from '@nmtjs/core'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlob, ProtocolBlobMetadata } from '../common/blob.ts'\nimport { ErrorCode, ServerMessageType } from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport {\n isIterableResult,\n type ProtocolApi,\n type ProtocolApiCallOptions,\n} from './api.ts'\nimport {\n Connection,\n ConnectionContext,\n type ConnectionOptions,\n} from './connection.ts'\nimport type { Format } from './format.ts'\nimport { ProtocolInjectables } from './injectables.ts'\nimport type { ProtocolRegistry } from './registry.ts'\nimport { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\nimport type { Transport } from './transport.ts'\nimport { getFormat, type ResolveFormatParams } from './utils.ts'\n\nexport class ProtocolError extends Error {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport type ProtocolConnectionTransport = {\n send: Transport<any>['send']\n}\n\nexport class ProtocolConnections {\n readonly #collection = new Map<\n string,\n {\n connection: Connection\n context: ConnectionContext\n transport: ProtocolConnectionTransport\n }\n >()\n\n constructor(\n private readonly application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n },\n ) {}\n\n get(connectionId: string) {\n const connection = this.#collection.get(connectionId)\n if (!connection) throwError('Connection not found')\n return connection\n }\n\n async add<T>(\n transport: ProtocolConnectionTransport,\n options: ConnectionOptions<T>,\n params: ResolveFormatParams,\n ) {\n const connection = new Connection(options)\n const format = getFormat(this.application.format, params)\n const container = this.application.container.fork(Scope.Connection)\n const context = new ConnectionContext(container, format)\n container.provide(ProtocolInjectables.connection, connection)\n try {\n await this.initialize(connection)\n this.#collection.set(connection.id, { connection, context, transport })\n return { connection, context }\n } catch (error) {\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n 'Error during disposing connection',\n )\n })\n throw error\n }\n }\n\n async remove(connectionId: string) {\n const { connection, context } = this.get(connectionId)\n\n this.application.registry.hooks.call(\n Hook.OnDisconnect,\n { concurrent: true },\n connection,\n )\n\n this.#collection.delete(connectionId)\n\n const { rpcs, serverStreams, clientStreams, rpcStreams, container } =\n context\n\n for (const call of rpcs.values()) {\n call.abort(new Error('Connection closed'))\n }\n\n for (const stream of clientStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of serverStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of rpcStreams.values()) {\n stream.abort(new Error('Connection closed'))\n }\n\n try {\n await container.dispose()\n } catch (error) {\n this.application.logger.error(\n { error, connection },\n 'Error during closing connection',\n )\n }\n }\n\n async initialize(connection: Connection) {\n await this.application.registry.hooks.call(\n Hook.OnConnect,\n { concurrent: false },\n connection,\n )\n }\n}\n\nexport class ProtocolClientStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = clientStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n clientStreams.get(streamId) || throwError('Stream not found')\n clientStreams.delete(streamId)\n }\n\n add(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = new ProtocolClientStream(streamId, metadata, { read })\n clientStreams.set(streamId, stream)\n return stream\n }\n\n push(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(connectionId, streamId)\n stream.write(Buffer.from(chunk))\n }\n\n end(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.end(null)\n this.remove(connectionId, streamId)\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport class ProtocolServerStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = serverStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n add(connectionId: string, streamId: number, blob: ProtocolBlob) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = new ProtocolServerStream(streamId, blob)\n serverStreams.set(streamId, stream)\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n serverStreams.has(streamId) || throwError('Stream not found')\n serverStreams.delete(streamId)\n }\n\n pull(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.resume()\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport type ProtocolRPCOptions = {\n signal?: AbortSignal\n provides?: [AnyInjectable, any][]\n metadata?: ProtocolApiCallOptions['metadata']\n}\n\nexport class Protocol {\n #connections: ProtocolConnections\n #clientStreams: ProtocolClientStreams\n #serverStreams: ProtocolServerStreams\n\n constructor(\n protected readonly application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n },\n ) {\n this.#connections = new ProtocolConnections(this.application)\n this.#clientStreams = new ProtocolClientStreams(this.#connections)\n this.#serverStreams = new ProtocolServerStreams(this.#connections)\n }\n\n async call(options: ProtocolApiCallOptions) {\n const { container, connection } = options\n try {\n return await this.application.api.call(options)\n } catch (error) {\n if (error instanceof ProtocolError === false) {\n this.application.logger.error(\n { error, connection },\n 'Error during RPC call',\n )\n throw new ProtocolError(\n ErrorCode.InternalServerError,\n 'Internal server error',\n )\n }\n throw error\n } finally {\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n \"Error during disposing connection's container\",\n )\n })\n }\n }\n\n async rpc(\n connectionId: string,\n rpc: ProtocolRPC,\n params: ProtocolRPCOptions = {},\n ) {\n const { connection, context, transport } =\n this.#connections.get(connectionId)\n const { rpcs, format } = context\n const { callId, namespace, procedure, payload } = rpc\n const abortController = new AbortController()\n const signal = params.signal\n ? AbortSignal.any([params.signal, abortController.signal])\n : abortController.signal\n\n rpcs.set(callId, abortController)\n\n const callIdEncoded = encodeNumber(callId, 'Uint32')\n const container = context.container.fork(Scope.Call)\n\n if (params.provides) {\n for (const [key, value] of params.provides) {\n container.provide(key, value)\n }\n }\n\n try {\n const response = await this.call({\n connection,\n container,\n namespace,\n payload,\n procedure,\n signal,\n metadata: params.metadata,\n })\n\n const responseEncoded = format.encoder.encodeRPC(\n {\n callId,\n result: response.output,\n },\n {\n addStream: (blob) => {\n const streamId = context.streamId++\n const stream = this.#serverStreams.add(connectionId, streamId, blob)\n stream.on('data', (chunk) => {\n stream.pause()\n const buf = Buffer.from(chunk)\n transport.send(\n connection,\n ServerMessageType.ServerStreamPush,\n concat(\n encodeNumber(streamId, 'Uint32'),\n (buf.buffer as ArrayBuffer).slice(\n buf.byteOffset,\n buf.byteOffset + buf.byteLength,\n ),\n ),\n { callId, streamId },\n )\n })\n stream.on('error', (err) => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamAbort,\n encodeNumber(streamId, 'Uint32'),\n { callId, streamId },\n )\n })\n stream.on('end', () => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamEnd,\n encodeNumber(streamId, 'Uint32'),\n { callId, streamId },\n )\n })\n return stream\n },\n getStream: (id) => {\n return this.#serverStreams.get(connectionId, id)\n },\n },\n )\n\n if (isIterableResult(response)) {\n transport.send(\n connection,\n ServerMessageType.RpcStreamResponse,\n responseEncoded,\n { callId },\n )\n try {\n const controller = new AbortController()\n context.rpcStreams.set(callId, controller)\n const iterable =\n typeof response.iterable === 'function'\n ? response.iterable(controller.signal)\n : response.iterable\n try {\n for await (const chunk of iterable) {\n controller.signal.throwIfAborted()\n const chunkEncoded = format.encoder.encode(chunk)\n transport.send(\n connection,\n ServerMessageType.RpcStreamChunk,\n concat(callIdEncoded, chunkEncoded),\n { callId },\n )\n }\n transport.send(\n connection,\n ServerMessageType.RpcStreamEnd,\n callIdEncoded,\n { callId },\n )\n } catch (error) {\n // do not re-throw AbortError errors, they are expected\n if (!isAbortError(error)) {\n throw error\n }\n }\n } catch (error) {\n this.application.logger.error(error)\n transport.send(\n connection,\n ServerMessageType.RpcStreamAbort,\n callIdEncoded,\n { callId },\n )\n } finally {\n context.rpcStreams.delete(callId)\n response.onFinish && defer(response.onFinish)\n }\n } else {\n transport.send(\n connection,\n ServerMessageType.RpcResponse,\n responseEncoded,\n { callId },\n )\n }\n } catch (error) {\n const payload = format.encoder.encodeRPC(\n { callId, error },\n {\n addStream(blob) {\n throwError('Cannot handle stream for error response')\n },\n getStream(id) {\n throwError('Cannot handle stream for error response')\n },\n },\n )\n\n transport.send(connection, ServerMessageType.RpcResponse, payload, {\n error,\n callId,\n })\n } finally {\n rpcs.delete(callId)\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n 'Error during disposing connection',\n )\n })\n }\n }\n\n async rpcRaw(\n connectionId: string,\n buffer: ArrayBuffer,\n params: ProtocolRPCOptions = {},\n ) {\n const { connection, context, transport } =\n this.#connections.get(connectionId)\n\n const { format } = context\n\n const rpc = format.decoder.decodeRPC(buffer, {\n addStream: (streamId, callId, metadata) => {\n return this.#clientStreams.add(\n connectionId,\n streamId,\n metadata,\n (size) => {\n transport.send(\n connection,\n ServerMessageType.ClientStreamPull,\n concat(\n encodeNumber(streamId, 'Uint32'),\n encodeNumber(size, 'Uint32'),\n ),\n { callId, streamId },\n )\n },\n )\n },\n getStream: (id) => {\n return this.#clientStreams.get(connectionId, id)\n },\n })\n\n return await this.rpc(connectionId, rpc, params)\n }\n\n rpcAbort(connectionId: string, callId: number) {\n const { context } = this.#connections.get(connectionId)\n const call = context.rpcs.get(callId) ?? throwError('Call not found')\n call.abort()\n }\n\n rpcAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcAbort(connectionId, callId)\n }\n\n rpcStreamAbort(connectionId: string, callId: number) {\n const { context } = this.#connections.get(connectionId)\n const ab =\n context.rpcStreams.get(callId) ?? throwError('Call stream not found')\n ab.abort()\n }\n\n rpcStreamAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcStreamAbort(connectionId, callId)\n }\n\n notify(connectionId: string, event, payload) {\n throw Error('Unimplemented')\n }\n\n addConnection(\n transport: ProtocolConnectionTransport,\n options: ConnectionOptions,\n params: ResolveFormatParams,\n ) {\n return this.#connections.add(transport, options, params)\n }\n\n removeConnection(connectionId: string) {\n return this.#connections.remove(connectionId)\n }\n\n getConnection(connectionId: string) {\n return this.#connections.get(connectionId)\n }\n\n initializeConnection(connection: Connection) {\n return this.#connections.initialize(connection)\n }\n\n getClientStream(\n connectionId: string,\n streamId: number,\n ): ProtocolClientStream {\n return this.#clientStreams.get(connectionId, streamId)\n }\n\n addClientStream(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n return this.#clientStreams.add(connectionId, streamId, metadata, read)\n }\n\n removeClientStream(connectionId: string, streamId: number) {\n return this.#clientStreams.remove(connectionId, streamId)\n }\n\n pushClientStream(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n return this.#clientStreams.push(connectionId, streamId, chunk)\n }\n\n endClientStream(connectionId: string, streamId: number) {\n return this.#clientStreams.end(connectionId, streamId)\n }\n\n abortClientStream(connectionId: string, streamId: number, error?: Error) {\n return this.#clientStreams.abort(connectionId, streamId, error)\n }\n\n getServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.get(connectionId, streamId)\n }\n\n addServerStream(connectionId: string, streamId: number, blob: ProtocolBlob) {\n return this.#serverStreams.add(connectionId, streamId, blob)\n }\n\n removeServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.remove(connectionId, streamId)\n }\n\n pullServerStream(connectionId: string, streamId: number) {\n return this.#serverStreams.pull(connectionId, streamId)\n }\n\n abortServerStream(connectionId: string, streamId: number, error?: Error) {\n return this.#serverStreams.abort(connectionId, streamId, error)\n }\n}\n"],"version":3,"file":"protocol.js"}
@@ -1 +0,0 @@
1
- {"mappings":"AAAA,SAAS,gBAAgB,aAAa;AAEtC,OAAO,MAAM,yBAAyB,SAAS,CAAE","names":[],"sources":["../../src/server/registry.ts"],"sourcesContent":["import { Registry } from '@nmtjs/core'\n\nexport class ProtocolRegistry extends Registry {}\n"],"version":3,"file":"registry.js"}
@@ -1 +0,0 @@
1
- {"mappings":"AAAA,SAAS,aAAa,gBAAsC,aAAa;AACzE,SAAS,sBAAsB,iBAAiB;AAGhD,OAAO,MAAM,6BAA6B,YAAY;CACpD,YACkBA,IACAC,UAChBC,SACA;AACA,QAAM,QAAQ;OAJE;OACA;CAIjB;AACF;AAED,OAAO,MAAM,6BAA6B,YAAY;CACpD,AAAgB;CAChB,AAAgB;CAEhB,YAAYF,IAAYG,MAAoB;EAC1C,IAAIC;AAEJ,MAAI,KAAK,kBAAkB,UAAU;AACnC,cAAW,KAAK;EACjB,WAAU,KAAK,kBAAkB,gBAAgB;AAChD,cAAW,SAAS,QAAQ,KAAK,OAAyB;EAC3D,OAAM;AACL,SAAM,IAAI,MAAM;EACjB;AAED,SAAO;AAEP,OAAK,OAAO;AACZ,WAAS,KAAK,KAAK;AAEnB,OAAK,KAAK;AACV,OAAK,WAAW,KAAK;CACtB;AACF","names":["id: number","metadata: ProtocolBlobMetadata","options?: ReadableOptions","blob: ProtocolBlob","readable: Readable"],"sources":["../../src/server/stream.ts"],"sourcesContent":["import { PassThrough, Readable, type ReadableOptions } from 'node:stream'\nimport { ReadableStream } from 'node:stream/web'\nimport type { ProtocolBlob, ProtocolBlobMetadata } from '../common/blob.ts'\n\nexport class ProtocolClientStream extends PassThrough {\n constructor(\n public readonly id: number,\n public readonly metadata: ProtocolBlobMetadata,\n options?: ReadableOptions,\n ) {\n super(options)\n }\n}\n\nexport class ProtocolServerStream extends PassThrough {\n public readonly id: number\n public readonly metadata: ProtocolBlobMetadata\n\n constructor(id: number, blob: ProtocolBlob) {\n let readable: Readable\n\n if (blob.source instanceof Readable) {\n readable = blob.source\n } else if (blob.source instanceof ReadableStream) {\n readable = Readable.fromWeb(blob.source as ReadableStream)\n } else {\n throw new Error('Invalid source type')\n }\n\n super()\n\n this.pause()\n readable.pipe(this)\n\n this.id = id\n this.metadata = blob.metadata\n }\n}\n"],"version":3,"file":"stream.js"}
@@ -1 +0,0 @@
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 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"mappings":"AAOA,OAAO,MAAM,+BAA+B,MAAM,CAAE;AAEpD,OAAO,MAAM,oCAAoC,uBAAuB,CAAE;AAE1E,OAAO,MAAM,mCAAmC,uBAAuB,CAAE;AAEzE,OAAO,MAAM,YAAY,CACvBA,QACA,EAAE,YAAY,aAAkC,KAC7C;CACH,MAAM,UAAU,cAAc,OAAO,gBAAgB,YAAY,GAAG;AACpE,MAAK,QACH,OAAM,IAAI,4BAA4B;CAExC,MAAM,UAAU,aAAa,OAAO,gBAAgB,WAAW,GAAG;AAClE,MAAK,QAAS,OAAM,IAAI,2BAA2B;AAEnD,QAAO;EACL;EACA;CACD;AACF","names":["format: Format"],"sources":["../../src/server/utils.ts"],"sourcesContent":["import type { Format } from './format.ts'\n\nexport type ResolveFormatParams = {\n contentType?: string | null\n acceptType?: string | null\n}\n\nexport class UnsupportedFormatError extends Error {}\n\nexport class UnsupportedContentTypeError extends UnsupportedFormatError {}\n\nexport class UnsupportedAcceptTypeError extends UnsupportedFormatError {}\n\nexport const getFormat = (\n format: Format,\n { acceptType, contentType }: ResolveFormatParams,\n) => {\n const encoder = contentType ? format.supportsEncoder(contentType) : undefined\n if (!encoder)\n throw new UnsupportedContentTypeError('Unsupported Content-Type')\n\n const decoder = acceptType ? format.supportsDecoder(acceptType) : undefined\n if (!decoder) throw new UnsupportedAcceptTypeError('Unsupported Accept-Type')\n\n return {\n encoder,\n decoder,\n }\n}\n"],"version":3,"file":"utils.js"}