@nmtjs/protocol 0.6.2 → 0.6.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.
- package/dist/client/index.js +2 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/protocol.js.map +1 -1
- package/dist/common/index.js +2 -2
- package/dist/common/index.js.map +1 -1
- package/dist/server/format.js.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/injectables.js +1 -1
- package/dist/server/injectables.js.map +1 -1
- package/dist/server/protocol.js.map +1 -1
- package/lib/client/index.ts +2 -2
- package/lib/client/protocol.ts +1 -1
- package/lib/common/index.ts +2 -2
- package/lib/server/format.ts +1 -1
- package/lib/server/index.ts +1 -1
- package/lib/server/injectables.ts +4 -3
- package/lib/server/protocol.ts +1 -1
- package/package.json +4 -5
- package/tsconfig.json +0 -3
package/dist/client/index.js
CHANGED
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../lib/client/index.ts"],"sourcesContent":["export * from './
|
|
1
|
+
{"version":3,"sources":["../../../lib/client/index.ts"],"sourcesContent":["export * from './events.ts'\nexport * from './format.ts'\nexport * from './protocol.ts'\nexport * from './stream.ts'\n"],"names":[],"mappings":"AAAA,cAAc,cAAa;AAC3B,cAAc,cAAa;AAC3B,cAAc,gBAAe;AAC7B,cAAc,cAAa"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../lib/client/protocol.ts"],"sourcesContent":["import {\n type InteractivePromise,\n createPromise,\n onceAborted,\n} from '@nmtjs/common'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlobMetadata } from '../common/blob.ts'\nimport {\n ClientMessageType,\n ErrorCode,\n ServerMessageType,\n} from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport { EventEmitter } from './events.ts'\nimport type { BaseClientFormat } from './format.ts'\nimport {\n ProtocolClientBlobStream,\n ProtocolServerBlobStream,\n ProtocolServerStream,\n} from './stream.ts'\n\nexport class ProtocolError extends Error {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport class ProtocolClientStreams {\n readonly #collection = new Map<number, ProtocolClientBlobStream>()\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(\n source: ReadableStream,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n ) {\n const stream = new ProtocolClientBlobStream(source, streamId, metadata)\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number) {\n const stream = this.get(streamId)\n stream.abort()\n this.remove(streamId)\n }\n\n pull(streamId: number, size: number) {\n const stream = this.get(streamId)\n return stream.read(size)\n }\n\n end(streamId: number) {\n const stream = this.get(streamId)\n stream.end()\n this.remove(streamId)\n }\n}\n\nexport class ProtocolServerStreams {\n readonly #collection = new Map<number, ProtocolServerStream>()\n\n has(streamId: number) {\n return this.#collection.has(streamId)\n }\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(streamId: number, stream: ProtocolServerStream) {\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number) {\n if (this.has(streamId)) {\n const stream = this.get(streamId)\n stream.abort()\n this.remove(streamId)\n }\n }\n\n async push(streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(streamId)\n return await stream.push(chunk)\n }\n\n end(streamId: number) {\n const stream = this.get(streamId)\n stream.end()\n this.remove(streamId)\n }\n}\n\nexport interface ProtocolTransport\n extends EventEmitter<{\n [K in `${ServerMessageType}`]: [ArrayBuffer]\n }> {\n connect(\n auth: any,\n contentType: BaseClientFormat['contentType'],\n ): Promise<void>\n disconnect(): Promise<void>\n send(messageType: ClientMessageType, buffer: ArrayBuffer): Promise<void>\n}\n\nexport class ProtocolBaseTransformer {\n encodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPCChunk(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeEvent(namespace: string, event: string, payload: any) {\n return payload\n }\n}\n\nexport type ProtocolClientCall = InteractivePromise<any> &\n Pick<ProtocolRPC, 'namespace' | 'procedure'>\n\nexport type ProtocolBaseClientOptions = {\n transport: ProtocolTransport\n format: BaseClientFormat\n transformer?: ProtocolBaseTransformer\n timeout?: number\n}\n\nexport type ProtocolBaseClientCallOptions = {\n signal?: AbortSignal\n timeout?: number\n}\n\nexport abstract class ProtocolBaseClient<\n T extends Record<string, Record<string, any>>,\n> extends EventEmitter<\n {\n [N in keyof T]: {\n [E in keyof T[N] as `${Extract<N, string>}/${Extract<E, string>}`]: [\n payload: T[N][E],\n ]\n }\n }[keyof T]\n> {\n readonly #clientStreams: ProtocolClientStreams\n readonly #serverStreams: ProtocolServerStreams\n readonly #rpcStreams: ProtocolServerStreams\n readonly #rpcStreamData = new Map<\n number,\n Pick<ProtocolRPC, 'namespace' | 'procedure'>\n >()\n readonly #calls = new Map<number, ProtocolClientCall>()\n\n readonly #transport: ProtocolTransport\n readonly #format: BaseClientFormat\n readonly transformer: ProtocolBaseTransformer = new ProtocolBaseTransformer()\n readonly #timeout: number\n\n #callId = 0\n #streamId = 0\n\n constructor(options: ProtocolBaseClientOptions) {\n super()\n\n this.#transport = options.transport\n this.#format = options.format\n this.#timeout = options.timeout ?? 60000\n\n this.#clientStreams = new ProtocolClientStreams()\n this.#serverStreams = new ProtocolServerStreams()\n this.#rpcStreams = new ProtocolServerStreams()\n\n this.#transport.on(`${ServerMessageType.Event}`, (buffer) => {\n const [namespace, event, payload] = this.#format.decode(buffer)\n const name = `${namespace}/${event}`\n const transformed = this.transformer.decodeEvent(\n namespace,\n event,\n payload,\n )\n this.emit(name, transformed)\n })\n\n this.#transport.on(`${ServerMessageType.RpcResponse}`, (buffer) => {\n const { call, error, payload } = this.#handleResponse(buffer)\n if (error) call.reject(error)\n else call.resolve(payload)\n })\n\n this.#transport.on(`${ServerMessageType.RpcStreamResponse}`, (buffer) => {\n const { call, response, payload, error } = this.#handleResponse(buffer)\n if (error) return call.reject(error)\n console.log('Creating RPC stream', response)\n const stream = new ProtocolServerStream()\n this.#rpcStreams.add(response.callId, stream)\n this.#rpcStreamData.set(response.callId, {\n namespace: call.namespace,\n procedure: call.procedure,\n })\n call.resolve({ payload, stream })\n })\n\n this.#transport.on(\n `${ServerMessageType.RpcStreamChunk}`,\n async (buffer) => {\n const callId = decodeNumber(buffer, 'Uint32')\n console.log('RPC stream chunk', callId)\n\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n if (chunk.byteLength === 0) {\n this.#rpcStreams.end(callId)\n this.#rpcStreamData.delete(callId)\n } else {\n const call = this.#rpcStreamData.get(callId)\n console.log('RPC stream call', call)\n if (call) {\n const payload = this.#format.decode(chunk)\n console.log('RPC stream payload', payload)\n try {\n const transformed = this.transformer.decodeRPCChunk(\n call.namespace,\n call.procedure,\n payload,\n )\n await this.#rpcStreams.push(callId, transformed)\n } catch (error) {\n this.#send(\n ClientMessageType.RpcStreamAbort,\n encodeNumber(callId, 'Uint32'),\n )\n this.#rpcStreams.remove(callId)\n this.#rpcStreamData.delete(callId)\n }\n }\n }\n },\n )\n\n this.#transport.on(`${ServerMessageType.RpcStreamAbort}`, (buffer) => {\n const callId = decodeNumber(buffer, 'Uint32')\n console.log('RPC stream abort', callId)\n const call = this.#calls.get(callId)\n if (call) {\n this.#serverStreams.end(callId)\n this.#rpcStreams.abort(callId)\n }\n })\n\n this.#transport.on(\n `${ServerMessageType.ServerStreamPush}`,\n async (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n console.log('Server stream push', streamId, chunk.byteLength)\n try {\n await this.#serverStreams.push(streamId, chunk)\n this.#send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(streamId, 'Uint32'),\n )\n } catch (error) {\n this.#send(\n ClientMessageType.ServerStreamAbort,\n encodeNumber(streamId, 'Uint32'),\n )\n this.#serverStreams.remove(streamId)\n }\n },\n )\n\n this.#transport.on(`${ServerMessageType.ServerStreamEnd}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Server stream end', streamId)\n this.#serverStreams.end(streamId)\n })\n\n this.#transport.on(`${ServerMessageType.ServerStreamAbort}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Server stream abort', streamId)\n this.#serverStreams.abort(streamId)\n })\n\n this.#transport.on(`${ServerMessageType.ClientStreamAbort}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Client stream abort', streamId)\n this.#clientStreams.abort(streamId)\n })\n\n this.#transport.on(\n `${ServerMessageType.ClientStreamPull}`,\n async (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Client stream pull', streamId)\n const size = decodeNumber(\n buffer,\n 'Uint32',\n Uint32Array.BYTES_PER_ELEMENT,\n )\n const streamIdEncoded = encodeNumber(streamId, 'Uint32')\n try {\n const chunk = await this.#clientStreams.pull(streamId, size)\n if (chunk) {\n this.#send(\n ClientMessageType.ClientStreamPush,\n concat(streamIdEncoded, chunk),\n )\n } else {\n this.#send(ClientMessageType.ClientStreamEnd, streamIdEncoded)\n this.#clientStreams.end(streamId)\n }\n } catch (error) {\n console.error(error)\n this.#send(ClientMessageType.ClientStreamAbort, streamIdEncoded)\n }\n },\n )\n }\n\n async connect(auth: any) {\n return await this.#transport.connect(auth, this.#format.contentType)\n }\n\n async disconnect() {\n return await this.#transport.disconnect()\n }\n\n async #send(messageType: ClientMessageType, buffer: ArrayBuffer) {\n console.log(\n 'Client transport send',\n ClientMessageType[messageType],\n buffer.byteLength,\n )\n return await this.#transport.send(messageType, buffer)\n }\n\n protected async _call(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions = {},\n ) {\n const timeoutSignal = AbortSignal.timeout(options.timeout || this.#timeout)\n const signal = options.signal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : timeoutSignal\n\n const callId = ++this.#callId\n const call = Object.assign(createPromise(), {\n namespace,\n procedure,\n })\n const buffer = this.#format.encodeRPC(\n {\n callId,\n namespace,\n procedure,\n payload: this.transformer.encodeRPC(namespace, procedure, payload),\n },\n {\n addStream: (blob) => {\n const streamId = ++this.#streamId\n const stream = this.#clientStreams.add(\n blob.source,\n streamId,\n blob.metadata,\n )\n return stream\n },\n getStream: (id) => {\n const stream = this.#clientStreams.get(id)\n return stream\n },\n },\n )\n\n this.#transport.send(ClientMessageType.Rpc, buffer).catch(console.error)\n\n this.#calls.set(callId, call)\n\n const onAborted = onceAborted(signal).then(() => {\n if (this.#calls.has(callId)) {\n this.#send(ClientMessageType.RpcAbort, encodeNumber(callId, 'Uint32'))\n }\n throw new ProtocolError(ErrorCode.RequestTimeout, 'Request timeout')\n })\n\n return Promise.race([call.promise, onAborted])\n }\n\n #handleResponse(buffer: ArrayBuffer) {\n const callStreams: ProtocolServerBlobStream[] = []\n const response = this.#format.decodeRPC(buffer, {\n addStream: (id, metadata) => {\n console.log('Client transport blob stream', id, metadata)\n const stream = new ProtocolServerBlobStream(id, metadata, () => {\n this.#send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(id, 'Uint32'),\n )\n })\n callStreams.push(stream)\n this.#serverStreams.add(id, stream)\n return stream\n },\n getStream: (id) => {\n return this.#serverStreams.get(id)\n },\n })\n\n console.log('Client transport response', response)\n\n const call = this.#calls.get(response.callId)\n\n if (call) {\n this.#calls.delete(response.callId)\n\n if (response.error) {\n const error = new ProtocolError(\n response.error.code,\n response.error.message,\n response.error.data,\n )\n return { call, response, error }\n } else {\n const payload = this.transformer.decodeRPC(\n call.namespace,\n call.procedure,\n response.payload,\n )\n return { call, response, payload }\n }\n }\n\n for (const stream of callStreams) {\n this.#serverStreams.abort(stream.id)\n }\n\n throw new Error('Call not found')\n }\n}\n"],"names":["createPromise","onceAborted","concat","decodeNumber","encodeNumber","ClientMessageType","ErrorCode","ServerMessageType","EventEmitter","ProtocolClientBlobStream","ProtocolServerBlobStream","ProtocolServerStream","ProtocolError","Error","code","data","constructor","message","toString","toJSON","ProtocolClientStreams","Map","get","streamId","stream","add","source","metadata","set","remove","delete","abort","pull","size","read","end","ProtocolServerStreams","has","push","chunk","ProtocolBaseTransformer","encodeRPC","namespace","procedure","payload","decodeRPC","decodeRPCChunk","decodeEvent","event","ProtocolBaseClient","transformer","options","transport","format","timeout","on","Event","buffer","decode","name","transformed","emit","RpcResponse","call","error","reject","resolve","RpcStreamResponse","response","console","log","callId","RpcStreamChunk","slice","Uint32Array","BYTES_PER_ELEMENT","byteLength","RpcStreamAbort","ServerStreamPush","ServerStreamPull","ServerStreamAbort","ServerStreamEnd","ClientStreamAbort","ClientStreamPull","streamIdEncoded","ClientStreamPush","ClientStreamEnd","connect","auth","contentType","disconnect","messageType","send","_call","timeoutSignal","AbortSignal","signal","any","Object","assign","addStream","blob","getStream","id","Rpc","catch","onAborted","then","RpcAbort","RequestTimeout","Promise","race","promise","callStreams"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../lib/client/protocol.ts"],"sourcesContent":["import {\n createPromise,\n type InteractivePromise,\n onceAborted,\n} from '@nmtjs/common'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlobMetadata } from '../common/blob.ts'\nimport {\n ClientMessageType,\n ErrorCode,\n ServerMessageType,\n} from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport { EventEmitter } from './events.ts'\nimport type { BaseClientFormat } from './format.ts'\nimport {\n ProtocolClientBlobStream,\n ProtocolServerBlobStream,\n ProtocolServerStream,\n} from './stream.ts'\n\nexport class ProtocolError extends Error {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport class ProtocolClientStreams {\n readonly #collection = new Map<number, ProtocolClientBlobStream>()\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(\n source: ReadableStream,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n ) {\n const stream = new ProtocolClientBlobStream(source, streamId, metadata)\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number) {\n const stream = this.get(streamId)\n stream.abort()\n this.remove(streamId)\n }\n\n pull(streamId: number, size: number) {\n const stream = this.get(streamId)\n return stream.read(size)\n }\n\n end(streamId: number) {\n const stream = this.get(streamId)\n stream.end()\n this.remove(streamId)\n }\n}\n\nexport class ProtocolServerStreams {\n readonly #collection = new Map<number, ProtocolServerStream>()\n\n has(streamId: number) {\n return this.#collection.has(streamId)\n }\n\n get(streamId: number) {\n const stream = this.#collection.get(streamId)\n if (!stream) throw new Error('Stream not found')\n return stream\n }\n\n add(streamId: number, stream: ProtocolServerStream) {\n this.#collection.set(streamId, stream)\n return stream\n }\n\n remove(streamId: number) {\n this.#collection.delete(streamId)\n }\n\n abort(streamId: number) {\n if (this.has(streamId)) {\n const stream = this.get(streamId)\n stream.abort()\n this.remove(streamId)\n }\n }\n\n async push(streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(streamId)\n return await stream.push(chunk)\n }\n\n end(streamId: number) {\n const stream = this.get(streamId)\n stream.end()\n this.remove(streamId)\n }\n}\n\nexport interface ProtocolTransport\n extends EventEmitter<{\n [K in `${ServerMessageType}`]: [ArrayBuffer]\n }> {\n connect(\n auth: any,\n contentType: BaseClientFormat['contentType'],\n ): Promise<void>\n disconnect(): Promise<void>\n send(messageType: ClientMessageType, buffer: ArrayBuffer): Promise<void>\n}\n\nexport class ProtocolBaseTransformer {\n encodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPC(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeRPCChunk(namespace: string, procedure: string, payload: any) {\n return payload\n }\n decodeEvent(namespace: string, event: string, payload: any) {\n return payload\n }\n}\n\nexport type ProtocolClientCall = InteractivePromise<any> &\n Pick<ProtocolRPC, 'namespace' | 'procedure'>\n\nexport type ProtocolBaseClientOptions = {\n transport: ProtocolTransport\n format: BaseClientFormat\n transformer?: ProtocolBaseTransformer\n timeout?: number\n}\n\nexport type ProtocolBaseClientCallOptions = {\n signal?: AbortSignal\n timeout?: number\n}\n\nexport abstract class ProtocolBaseClient<\n T extends Record<string, Record<string, any>>,\n> extends EventEmitter<\n {\n [N in keyof T]: {\n [E in keyof T[N] as `${Extract<N, string>}/${Extract<E, string>}`]: [\n payload: T[N][E],\n ]\n }\n }[keyof T]\n> {\n readonly #clientStreams: ProtocolClientStreams\n readonly #serverStreams: ProtocolServerStreams\n readonly #rpcStreams: ProtocolServerStreams\n readonly #rpcStreamData = new Map<\n number,\n Pick<ProtocolRPC, 'namespace' | 'procedure'>\n >()\n readonly #calls = new Map<number, ProtocolClientCall>()\n\n readonly #transport: ProtocolTransport\n readonly #format: BaseClientFormat\n readonly transformer: ProtocolBaseTransformer = new ProtocolBaseTransformer()\n readonly #timeout: number\n\n #callId = 0\n #streamId = 0\n\n constructor(options: ProtocolBaseClientOptions) {\n super()\n\n this.#transport = options.transport\n this.#format = options.format\n this.#timeout = options.timeout ?? 60000\n\n this.#clientStreams = new ProtocolClientStreams()\n this.#serverStreams = new ProtocolServerStreams()\n this.#rpcStreams = new ProtocolServerStreams()\n\n this.#transport.on(`${ServerMessageType.Event}`, (buffer) => {\n const [namespace, event, payload] = this.#format.decode(buffer)\n const name = `${namespace}/${event}`\n const transformed = this.transformer.decodeEvent(\n namespace,\n event,\n payload,\n )\n this.emit(name, transformed)\n })\n\n this.#transport.on(`${ServerMessageType.RpcResponse}`, (buffer) => {\n const { call, error, payload } = this.#handleResponse(buffer)\n if (error) call.reject(error)\n else call.resolve(payload)\n })\n\n this.#transport.on(`${ServerMessageType.RpcStreamResponse}`, (buffer) => {\n const { call, response, payload, error } = this.#handleResponse(buffer)\n if (error) return call.reject(error)\n console.log('Creating RPC stream', response)\n const stream = new ProtocolServerStream()\n this.#rpcStreams.add(response.callId, stream)\n this.#rpcStreamData.set(response.callId, {\n namespace: call.namespace,\n procedure: call.procedure,\n })\n call.resolve({ payload, stream })\n })\n\n this.#transport.on(\n `${ServerMessageType.RpcStreamChunk}`,\n async (buffer) => {\n const callId = decodeNumber(buffer, 'Uint32')\n console.log('RPC stream chunk', callId)\n\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n if (chunk.byteLength === 0) {\n this.#rpcStreams.end(callId)\n this.#rpcStreamData.delete(callId)\n } else {\n const call = this.#rpcStreamData.get(callId)\n console.log('RPC stream call', call)\n if (call) {\n const payload = this.#format.decode(chunk)\n console.log('RPC stream payload', payload)\n try {\n const transformed = this.transformer.decodeRPCChunk(\n call.namespace,\n call.procedure,\n payload,\n )\n await this.#rpcStreams.push(callId, transformed)\n } catch (error) {\n this.#send(\n ClientMessageType.RpcStreamAbort,\n encodeNumber(callId, 'Uint32'),\n )\n this.#rpcStreams.remove(callId)\n this.#rpcStreamData.delete(callId)\n }\n }\n }\n },\n )\n\n this.#transport.on(`${ServerMessageType.RpcStreamAbort}`, (buffer) => {\n const callId = decodeNumber(buffer, 'Uint32')\n console.log('RPC stream abort', callId)\n const call = this.#calls.get(callId)\n if (call) {\n this.#serverStreams.end(callId)\n this.#rpcStreams.abort(callId)\n }\n })\n\n this.#transport.on(\n `${ServerMessageType.ServerStreamPush}`,\n async (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n const chunk = buffer.slice(Uint32Array.BYTES_PER_ELEMENT)\n console.log('Server stream push', streamId, chunk.byteLength)\n try {\n await this.#serverStreams.push(streamId, chunk)\n this.#send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(streamId, 'Uint32'),\n )\n } catch (error) {\n this.#send(\n ClientMessageType.ServerStreamAbort,\n encodeNumber(streamId, 'Uint32'),\n )\n this.#serverStreams.remove(streamId)\n }\n },\n )\n\n this.#transport.on(`${ServerMessageType.ServerStreamEnd}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Server stream end', streamId)\n this.#serverStreams.end(streamId)\n })\n\n this.#transport.on(`${ServerMessageType.ServerStreamAbort}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Server stream abort', streamId)\n this.#serverStreams.abort(streamId)\n })\n\n this.#transport.on(`${ServerMessageType.ClientStreamAbort}`, (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Client stream abort', streamId)\n this.#clientStreams.abort(streamId)\n })\n\n this.#transport.on(\n `${ServerMessageType.ClientStreamPull}`,\n async (buffer) => {\n const streamId = decodeNumber(buffer, 'Uint32')\n console.log('Client stream pull', streamId)\n const size = decodeNumber(\n buffer,\n 'Uint32',\n Uint32Array.BYTES_PER_ELEMENT,\n )\n const streamIdEncoded = encodeNumber(streamId, 'Uint32')\n try {\n const chunk = await this.#clientStreams.pull(streamId, size)\n if (chunk) {\n this.#send(\n ClientMessageType.ClientStreamPush,\n concat(streamIdEncoded, chunk),\n )\n } else {\n this.#send(ClientMessageType.ClientStreamEnd, streamIdEncoded)\n this.#clientStreams.end(streamId)\n }\n } catch (error) {\n console.error(error)\n this.#send(ClientMessageType.ClientStreamAbort, streamIdEncoded)\n }\n },\n )\n }\n\n async connect(auth: any) {\n return await this.#transport.connect(auth, this.#format.contentType)\n }\n\n async disconnect() {\n return await this.#transport.disconnect()\n }\n\n async #send(messageType: ClientMessageType, buffer: ArrayBuffer) {\n console.log(\n 'Client transport send',\n ClientMessageType[messageType],\n buffer.byteLength,\n )\n return await this.#transport.send(messageType, buffer)\n }\n\n protected async _call(\n namespace: string,\n procedure: string,\n payload: any,\n options: ProtocolBaseClientCallOptions = {},\n ) {\n const timeoutSignal = AbortSignal.timeout(options.timeout || this.#timeout)\n const signal = options.signal\n ? AbortSignal.any([options.signal, timeoutSignal])\n : timeoutSignal\n\n const callId = ++this.#callId\n const call = Object.assign(createPromise(), {\n namespace,\n procedure,\n })\n const buffer = this.#format.encodeRPC(\n {\n callId,\n namespace,\n procedure,\n payload: this.transformer.encodeRPC(namespace, procedure, payload),\n },\n {\n addStream: (blob) => {\n const streamId = ++this.#streamId\n const stream = this.#clientStreams.add(\n blob.source,\n streamId,\n blob.metadata,\n )\n return stream\n },\n getStream: (id) => {\n const stream = this.#clientStreams.get(id)\n return stream\n },\n },\n )\n\n this.#transport.send(ClientMessageType.Rpc, buffer).catch(console.error)\n\n this.#calls.set(callId, call)\n\n const onAborted = onceAborted(signal).then(() => {\n if (this.#calls.has(callId)) {\n this.#send(ClientMessageType.RpcAbort, encodeNumber(callId, 'Uint32'))\n }\n throw new ProtocolError(ErrorCode.RequestTimeout, 'Request timeout')\n })\n\n return Promise.race([call.promise, onAborted])\n }\n\n #handleResponse(buffer: ArrayBuffer) {\n const callStreams: ProtocolServerBlobStream[] = []\n const response = this.#format.decodeRPC(buffer, {\n addStream: (id, metadata) => {\n console.log('Client transport blob stream', id, metadata)\n const stream = new ProtocolServerBlobStream(id, metadata, () => {\n this.#send(\n ClientMessageType.ServerStreamPull,\n encodeNumber(id, 'Uint32'),\n )\n })\n callStreams.push(stream)\n this.#serverStreams.add(id, stream)\n return stream\n },\n getStream: (id) => {\n return this.#serverStreams.get(id)\n },\n })\n\n console.log('Client transport response', response)\n\n const call = this.#calls.get(response.callId)\n\n if (call) {\n this.#calls.delete(response.callId)\n\n if (response.error) {\n const error = new ProtocolError(\n response.error.code,\n response.error.message,\n response.error.data,\n )\n return { call, response, error }\n } else {\n const payload = this.transformer.decodeRPC(\n call.namespace,\n call.procedure,\n response.payload,\n )\n return { call, response, payload }\n }\n }\n\n for (const stream of callStreams) {\n this.#serverStreams.abort(stream.id)\n }\n\n throw new Error('Call not found')\n }\n}\n"],"names":["createPromise","onceAborted","concat","decodeNumber","encodeNumber","ClientMessageType","ErrorCode","ServerMessageType","EventEmitter","ProtocolClientBlobStream","ProtocolServerBlobStream","ProtocolServerStream","ProtocolError","Error","code","data","constructor","message","toString","toJSON","ProtocolClientStreams","Map","get","streamId","stream","add","source","metadata","set","remove","delete","abort","pull","size","read","end","ProtocolServerStreams","has","push","chunk","ProtocolBaseTransformer","encodeRPC","namespace","procedure","payload","decodeRPC","decodeRPCChunk","decodeEvent","event","ProtocolBaseClient","transformer","options","transport","format","timeout","on","Event","buffer","decode","name","transformed","emit","RpcResponse","call","error","reject","resolve","RpcStreamResponse","response","console","log","callId","RpcStreamChunk","slice","Uint32Array","BYTES_PER_ELEMENT","byteLength","RpcStreamAbort","ServerStreamPush","ServerStreamPull","ServerStreamAbort","ServerStreamEnd","ClientStreamAbort","ClientStreamPull","streamIdEncoded","ClientStreamPush","ClientStreamEnd","connect","auth","contentType","disconnect","messageType","send","_call","timeoutSignal","AbortSignal","signal","any","Object","assign","addStream","blob","getStream","id","Rpc","catch","onAborted","then","RpcAbort","RequestTimeout","Promise","race","promise","callStreams"],"mappings":"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"}
|
package/dist/common/index.js
CHANGED
package/dist/common/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../lib/common/index.ts"],"sourcesContent":["export * from './
|
|
1
|
+
{"version":3,"sources":["../../../lib/common/index.ts"],"sourcesContent":["export * from './binary.ts'\nexport * from './blob.ts'\nexport * from './enums.ts'\nexport * from './types.ts'\n"],"names":[],"mappings":"AAAA,cAAc,cAAa;AAC3B,cAAc,YAAW;AACzB,cAAc,aAAY;AAC1B,cAAc,aAAY"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../lib/server/format.ts"],"sourcesContent":["import { type Pattern
|
|
1
|
+
{"version":3,"sources":["../../../lib/server/format.ts"],"sourcesContent":["import { match, type Pattern } from '@nmtjs/core'\nimport type {\n DecodeRPCContext,\n EncodeRPCContext,\n ProtocolRPC,\n ProtocolRPCResponse,\n} from '../common/types.ts'\n\nexport interface BaseServerDecoder {\n accept: Pattern[]\n decode(buffer: ArrayBuffer): any\n decodeRPC(buffer: ArrayBuffer, context: DecodeRPCContext): ProtocolRPC\n}\n\nexport interface BaseServerEncoder {\n contentType: string\n encode(data: any): ArrayBuffer\n encodeRPC(rpc: ProtocolRPCResponse, context: EncodeRPCContext): 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,\n ): ArrayBuffer\n abstract decode(buffer: ArrayBuffer): any\n abstract decodeRPC(\n buffer: ArrayBuffer,\n context: DecodeRPCContext,\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"],"names":["match","BaseServerFormat","parseContentTypes","types","split","map","t","type","rest","params","Map","p","trim","slice","q","has","Number","parseFloat","get","sort","a","b","Format","decoders","encoders","constructor","formats","format","set","contentType","acceptType","accept","supportsDecoder","throwIfUnsupported","supports","supportsEncoder","pattern","Error"],"mappings":"AAAA,SAASA,KAAK,QAAsB,cAAa;AAoBjD,OAAO,MAAeC;AAgBtB;AAEA,OAAO,MAAMC,oBAAoB,CAACC;IAChC,IAAIA,UAAU,OAAO,OAAO;QAAC;KAAM;IACnC,OAAOA,MACJC,KAAK,CAAC,KACNC,GAAG,CAAC,CAACC;QACJ,MAAM,CAACC,MAAM,GAAGC,KAAK,GAAGF,EAAEF,KAAK,CAAC;QAChC,MAAMK,SAAS,IAAIC,IACjBF,KAAKH,GAAG,CAAC,CAACM,IACRA,EACGC,IAAI,GACJR,KAAK,CAAC,KACNS,KAAK,CAAC,GAAG,GACTR,GAAG,CAAC,CAACM,IAAMA,EAAEC,IAAI;QAGxB,OAAO;YACLL;YACAO,GAAGL,OAAOM,GAAG,CAAC,OAAOC,OAAOC,UAAU,CAACR,OAAOS,GAAG,CAAC,QAAS;QAC7D;IACF,GACCC,IAAI,CAAC,CAACC,GAAGC;QACR,IAAID,EAAEb,IAAI,KAAK,OAAO,OAAO;QAC7B,IAAIc,EAAEd,IAAI,KAAK,OAAO,OAAO,CAAC;QAC9B,OAAOc,EAAEP,CAAC,GAAGM,EAAEN,CAAC,GAAG,CAAC,IAAI;IAC1B,GACCT,GAAG,CAAC,CAACC,IAAMA,EAAEC,IAAI;AACtB,EAAC;AAED,OAAO,MAAMe;IACXC,WAAW,IAAIb,MAAiC;IAChDc,WAAW,IAAId,MAAiC;IAEhDe,YAAYC,OAA2B,CAAE;QACvC,KAAK,MAAMC,UAAUD,QAAS;YAC5B,IAAI,CAACF,QAAQ,CAACI,GAAG,CAACD,OAAOE,WAAW,EAAEF;YACtC,KAAK,MAAMG,cAAcH,OAAOI,MAAM,CAAE;gBACtC,IAAI,CAACR,QAAQ,CAACK,GAAG,CAACE,YAAYH;YAChC;QACF;IACF;IAEAK,gBAAgBH,WAAmB,EAAEI,qBAAqB,KAAK,EAAE;QAC/D,OAAO,IAAI,CAACC,QAAQ,CAAC,IAAI,CAACX,QAAQ,EAAEM,aAAaI;IACnD;IAEAE,gBAAgBN,WAAmB,EAAEI,qBAAqB,KAAK,EAAE;QAC/D,OAAO,IAAI,CAACC,QAAQ,CAAC,IAAI,CAACV,QAAQ,EAAEK,aAAaI;IACnD;IAEQC,SACNR,OAAwB,EACxBG,WAAmB,EACnBI,qBAAqB,KAAK,EAChB;QAEV,MAAM9B,QAAQD,kBAAkB2B;QAEhC,KAAK,MAAMtB,QAAQJ,MAAO;YACxB,KAAK,MAAM,CAACiC,SAAST,OAAO,IAAID,QAAS;gBACvC,IAAInB,SAAS,SAASP,MAAMO,MAAM6B,UAAU,OAAOT;YACrD;QACF;QAEA,IAAIM,oBACF,MAAM,IAAII,MAAM,CAAC,2BAA2B,EAAER,YAAY,CAAC;QAE7D,OAAO;IACT;AACF"}
|
package/dist/server/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export * from "./api.js";
|
|
2
2
|
export * from "./connection.js";
|
|
3
3
|
export * from "./constants.js";
|
|
4
|
-
export * from "./injectables.js";
|
|
5
4
|
export * from "./format.js";
|
|
5
|
+
export * from "./injectables.js";
|
|
6
6
|
export * from "./protocol.js";
|
|
7
7
|
export * from "./registry.js";
|
|
8
8
|
export * from "./stream.js";
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../lib/server/index.ts"],"sourcesContent":["export * from './api.ts'\nexport * from './connection.ts'\nexport * from './constants.ts'\nexport * from './
|
|
1
|
+
{"version":3,"sources":["../../../lib/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 './utils.ts'\n"],"names":[],"mappings":"AAAA,cAAc,WAAU;AACxB,cAAc,kBAAiB;AAC/B,cAAc,iBAAgB;AAC9B,cAAc,cAAa;AAC3B,cAAc,mBAAkB;AAChC,cAAc,gBAAe;AAC7B,cAAc,gBAAe;AAC7B,cAAc,cAAa;AAC3B,cAAc,iBAAgB;AAC9B,cAAc,aAAY"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createFactoryInjectable, createLazyInjectable, Scope } from '@nmtjs/core';
|
|
2
2
|
const connection = createLazyInjectable(Scope.Connection, 'RPC connection');
|
|
3
3
|
const connectionData = createLazyInjectable(Scope.Connection, "RPC connection's data");
|
|
4
4
|
const transportStopSignal = createLazyInjectable(Scope.Global, 'Transport stop signal');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../lib/server/injectables.ts"],"sourcesContent":["import {\n
|
|
1
|
+
{"version":3,"sources":["../../../lib/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 transportStopSignal = createLazyInjectable<AbortSignal>(\n Scope.Global,\n 'Transport stop signal',\n)\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 transportStopSignal,\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 transportStopSignal,\n rpcClientAbortSignal,\n rpcTimeoutSignal,\n rpcAbortSignal,\n} as const\n"],"names":["createFactoryInjectable","createLazyInjectable","Scope","connection","Connection","connectionData","transportStopSignal","Global","rpcClientAbortSignal","Call","rpcTimeoutSignal","rpcAbortSignal","dependencies","factory","ctx","AbortSignal","any","Object","values","ProtocolInjectables"],"mappings":"AAAA,SACEA,uBAAuB,EACvBC,oBAAoB,EACpBC,KAAK,QACA,cAAa;AAGpB,MAAMC,aAAaF,qBACjBC,MAAME,UAAU,EAChB;AAGF,MAAMC,iBAAiBJ,qBACrBC,MAAME,UAAU,EAChB;AAGF,MAAME,sBAAsBL,qBAC1BC,MAAMK,MAAM,EACZ;AAGF,MAAMC,uBAAuBP,qBAC3BC,MAAMO,IAAI,EACV;AAGF,MAAMC,mBAAmBT,qBACvBC,MAAMO,IAAI,EACV;AAGF,MAAME,iBAAiBX,wBACrB;IACEY,cAAc;QACZF;QACAF;QACAF;IACF;IACAO,SAAS,CAACC,MAAQC,YAAYC,GAAG,CAACC,OAAOC,MAAM,CAACJ;AAClD,GACA;AAGF,OAAO,MAAMK,sBAAsB;IACjChB;IACAE;IACAC;IACAE;IACAE;IACAC;AACF,EAAU"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../lib/server/protocol.ts"],"sourcesContent":["import { type Callback, createPromise, defer, throwError } from '@nmtjs/common'\nimport { type Container, Hook, type Logger, Scope } from '@nmtjs/core'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlob, ProtocolBlobMetadata } from '../common/blob.ts'\nimport { ErrorCode, ServerMessageType } from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport type { ProtocolApi, ProtocolApiCallResult } from './api.ts'\nimport {\n Connection,\n ConnectionContext,\n type ConnectionOptions,\n} from './connection.ts'\nimport type { Format } from './format.ts'\nimport type { ProtocolRegistry } from './registry.ts'\nimport { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\nimport type { Transport } from './transport.ts'\nimport { type ResolveFormatParams, getFormat } from './utils.ts'\n\nexport class ProtocolError extends Error {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport class ProtocolConnections {\n readonly #collection = new Map<\n string,\n {\n connection: Connection\n context: ConnectionContext\n transport: Transport\n }\n >()\n\n constructor(\n private readonly application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n },\n ) {}\n\n get(connectionId: string) {\n const connection = this.#collection.get(connectionId)\n if (!connection) throwError('Connection not found')\n return connection\n }\n\n async add<T>(\n transport: Transport<any>,\n options: ConnectionOptions<T>,\n params: ResolveFormatParams,\n ) {\n const connection = new Connection(options)\n const format = getFormat(this.application.format, params)\n const container = this.application.container.fork(Scope.Connection)\n const context = new ConnectionContext(container, format)\n\n this.#collection.set(connection.id, { connection, context, transport })\n\n await this.application.registry.hooks.call(\n Hook.OnConnect,\n { concurrent: false },\n connection,\n )\n\n return { connection, context }\n }\n\n async remove(connectionId: string) {\n const { connection, context } = this.get(connectionId)\n\n this.application.registry.hooks.call(\n Hook.OnDisconnect,\n { concurrent: true },\n connection,\n )\n\n this.#collection.delete(connectionId)\n\n const { calls, serverStreams, clientStreams, rpcStreams, container } =\n context\n\n for (const call of calls.values()) {\n call.reject(new Error('Connection closed'))\n }\n\n for (const stream of clientStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of serverStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of rpcStreams.values()) {\n stream.abort(new Error('Connection closed'))\n }\n\n try {\n await container.dispose()\n } catch (error) {\n this.application.logger.error(\n { error, connection },\n 'Error during closing connection',\n )\n }\n }\n}\n\nexport class ProtocolClientStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = clientStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n clientStreams.get(streamId) || throwError('Stream not found')\n clientStreams.delete(streamId)\n }\n\n add(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = new ProtocolClientStream(streamId, metadata, { read })\n clientStreams.set(streamId, stream)\n return stream\n }\n\n push(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(connectionId, streamId)\n stream.push(Buffer.from(chunk))\n }\n\n end(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.push(null)\n this.remove(connectionId, streamId)\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport class ProtocolServerStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = serverStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n add(connectionId: string, streamId: number, blob: ProtocolBlob) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = new ProtocolServerStream(streamId, blob)\n serverStreams.set(streamId, stream)\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n serverStreams.has(streamId) || throwError('Stream not found')\n serverStreams.delete(streamId)\n }\n\n pull(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.resume()\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport class Protocol {\n readonly connections: ProtocolConnections\n readonly clientStreams: ProtocolClientStreams\n readonly serverStreams: ProtocolServerStreams\n\n constructor(\n protected readonly application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n },\n ) {\n this.connections = new ProtocolConnections(this.application)\n this.clientStreams = new ProtocolClientStreams(this.connections)\n this.serverStreams = new ProtocolServerStreams(this.connections)\n }\n\n async rpc(\n connectionId: string,\n rpc: ProtocolRPC,\n params: { signal?: AbortSignal } = {},\n ) {\n const { connection, context, transport } =\n this.connections.get(connectionId)\n const { calls, format } = context\n const { callId, namespace, procedure, payload } = rpc\n const abortController = new AbortController()\n const signal = params.signal\n ? AbortSignal.any([params.signal, abortController.signal])\n : abortController.signal\n\n const call = Object.assign(createPromise<ProtocolApiCallResult>(), {\n abort: () => abortController.abort(),\n })\n\n calls.set(callId, call)\n call.promise.finally(() => calls.delete(callId))\n\n const callIdEncoded = encodeNumber(callId, 'Uint32')\n const container = context.container.fork(Scope.Call)\n\n try {\n const response = await this.application.api.call({\n connection,\n container,\n namespace,\n payload,\n procedure,\n signal,\n })\n\n const responseEncoded = format.encoder.encodeRPC(\n {\n callId,\n payload: response.output,\n },\n {\n addStream: (blob) => {\n const id = context.streamId++\n const stream = this.serverStreams.add(connectionId, id, blob)\n stream.on('data', (chunk) => {\n stream.pause()\n transport.send(\n connection,\n ServerMessageType.ServerStreamPush,\n concat(\n encodeNumber(id, 'Uint32'),\n Buffer.from(chunk).buffer as ArrayBuffer,\n ),\n )\n })\n stream.on('error', (err) => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamAbort,\n encodeNumber(id, 'Uint32'),\n )\n })\n stream.on('end', () => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamEnd,\n encodeNumber(id, 'Uint32'),\n )\n })\n return stream\n },\n getStream: (id) => {\n return this.clientStreams.get(connectionId, id)\n },\n },\n )\n\n if ('subscription' in response) {\n throwError('Unimplemented')\n } else if ('iterable' in response) {\n transport.send(\n connection,\n ServerMessageType.RpcStreamResponse,\n responseEncoded,\n )\n try {\n const ab = new AbortController()\n context.rpcStreams.set(callId, ab)\n const iterable =\n typeof response.iterable === 'function'\n ? response.iterable()\n : response.iterable\n for await (const chunk of iterable) {\n if (ab.signal.aborted) break\n const chunkEncoded = format.encoder.encode(chunk)\n transport.send(\n connection,\n ServerMessageType.RpcStreamChunk,\n concat(callIdEncoded, chunkEncoded),\n )\n }\n } catch (error) {\n this.application.logger.error(error)\n transport.send(\n connection,\n ServerMessageType.RpcStreamAbort,\n callIdEncoded,\n )\n } finally {\n context.rpcStreams.delete(callId)\n response.onFinish && defer(response.onFinish)\n }\n } else {\n transport.send(\n connection,\n ServerMessageType.RpcResponse,\n responseEncoded,\n )\n }\n } catch (error) {\n if (error instanceof ProtocolError === false) {\n this.application.logger.error(\n { error, connection },\n 'Error during RPC call',\n )\n\n // biome-ignore lint/suspicious/noCatchAssign:\n error = new ProtocolError(\n ErrorCode.InternalServerError,\n 'Internal server error',\n )\n }\n\n const payload = format.encoder.encodeRPC(\n { callId, error },\n {\n addStream(blob) {\n throwError('Cannot handle stream for error response')\n },\n getStream(id) {\n throwError('Cannot handle stream for error response')\n },\n },\n )\n transport.send(connection, ServerMessageType.RpcResponse, payload)\n } finally {\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n \"Error during disposing connection's container\",\n )\n })\n }\n }\n\n async rpcRaw(\n connectionId: string,\n buffer: ArrayBuffer,\n params: { signal?: AbortSignal } = {},\n ) {\n const { connection, context, transport } =\n this.connections.get(connectionId)\n\n const { format } = context\n\n const rpc = format.decoder.decodeRPC(buffer, {\n addStream: (id, metadata) => {\n return this.clientStreams.add(connectionId, id, metadata, (size) => {\n transport.send(\n connection,\n ServerMessageType.ClientStreamPull,\n concat(encodeNumber(id, 'Uint32'), encodeNumber(size, 'Uint32')),\n )\n })\n },\n getStream: (id) => {\n return this.serverStreams.get(connectionId, id)\n },\n })\n\n return await this.rpc(connectionId, rpc, params)\n }\n\n rpcAbort(connectionId: string, callId: number) {\n const { context } = this.connections.get(connectionId)\n const call = context.calls.get(callId) ?? throwError('Call not found')\n call.abort()\n }\n\n rpcAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcAbort(connectionId, callId)\n }\n\n rpcStreamAbort(connectionId: string, callId: number) {\n const { context } = this.connections.get(connectionId)\n const ab =\n context.rpcStreams.get(callId) ?? throwError('Call stream not found')\n ab.abort()\n }\n\n rpcStreamAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcStreamAbort(connectionId, callId)\n }\n\n notify(connectionId: string, event, payload) {\n throw Error('Unimplemented')\n }\n}\n"],"names":["createPromise","defer","throwError","Hook","Scope","concat","decodeNumber","encodeNumber","ErrorCode","ServerMessageType","Connection","ConnectionContext","ProtocolClientStream","ProtocolServerStream","getFormat","ProtocolError","Error","code","data","constructor","message","toString","toJSON","ProtocolConnections","application","Map","get","connectionId","connection","add","transport","options","params","format","container","fork","context","set","id","registry","hooks","call","OnConnect","concurrent","remove","OnDisconnect","delete","calls","serverStreams","clientStreams","rpcStreams","values","reject","stream","destroy","abort","dispose","error","logger","ProtocolClientStreams","connections","streamId","metadata","read","push","chunk","Buffer","from","end","ProtocolServerStreams","blob","has","pull","resume","Protocol","rpc","callId","namespace","procedure","payload","abortController","AbortController","signal","AbortSignal","any","Object","assign","promise","finally","callIdEncoded","Call","response","api","responseEncoded","encoder","encodeRPC","output","addStream","on","pause","send","ServerStreamPush","buffer","err","ServerStreamAbort","ServerStreamEnd","getStream","RpcStreamResponse","ab","iterable","aborted","chunkEncoded","encode","RpcStreamChunk","RpcStreamAbort","onFinish","RpcResponse","InternalServerError","catch","rpcRaw","decoder","decodeRPC","size","ClientStreamPull","rpcAbort","rpcAbortRaw","rpcStreamAbort","rpcStreamAbortRaw","notify","event"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../lib/server/protocol.ts"],"sourcesContent":["import { type Callback, createPromise, defer, throwError } from '@nmtjs/common'\nimport { type Container, Hook, type Logger, Scope } from '@nmtjs/core'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlob, ProtocolBlobMetadata } from '../common/blob.ts'\nimport { ErrorCode, ServerMessageType } from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport type { ProtocolApi, ProtocolApiCallResult } from './api.ts'\nimport {\n Connection,\n ConnectionContext,\n type ConnectionOptions,\n} from './connection.ts'\nimport type { Format } from './format.ts'\nimport type { ProtocolRegistry } from './registry.ts'\nimport { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\nimport type { Transport } from './transport.ts'\nimport { getFormat, type ResolveFormatParams } from './utils.ts'\n\nexport class ProtocolError extends Error {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport class ProtocolConnections {\n readonly #collection = new Map<\n string,\n {\n connection: Connection\n context: ConnectionContext\n transport: Transport\n }\n >()\n\n constructor(\n private readonly application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n },\n ) {}\n\n get(connectionId: string) {\n const connection = this.#collection.get(connectionId)\n if (!connection) throwError('Connection not found')\n return connection\n }\n\n async add<T>(\n transport: Transport<any>,\n options: ConnectionOptions<T>,\n params: ResolveFormatParams,\n ) {\n const connection = new Connection(options)\n const format = getFormat(this.application.format, params)\n const container = this.application.container.fork(Scope.Connection)\n const context = new ConnectionContext(container, format)\n\n this.#collection.set(connection.id, { connection, context, transport })\n\n await this.application.registry.hooks.call(\n Hook.OnConnect,\n { concurrent: false },\n connection,\n )\n\n return { connection, context }\n }\n\n async remove(connectionId: string) {\n const { connection, context } = this.get(connectionId)\n\n this.application.registry.hooks.call(\n Hook.OnDisconnect,\n { concurrent: true },\n connection,\n )\n\n this.#collection.delete(connectionId)\n\n const { calls, serverStreams, clientStreams, rpcStreams, container } =\n context\n\n for (const call of calls.values()) {\n call.reject(new Error('Connection closed'))\n }\n\n for (const stream of clientStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of serverStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of rpcStreams.values()) {\n stream.abort(new Error('Connection closed'))\n }\n\n try {\n await container.dispose()\n } catch (error) {\n this.application.logger.error(\n { error, connection },\n 'Error during closing connection',\n )\n }\n }\n}\n\nexport class ProtocolClientStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = clientStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n clientStreams.get(streamId) || throwError('Stream not found')\n clientStreams.delete(streamId)\n }\n\n add(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = new ProtocolClientStream(streamId, metadata, { read })\n clientStreams.set(streamId, stream)\n return stream\n }\n\n push(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(connectionId, streamId)\n stream.push(Buffer.from(chunk))\n }\n\n end(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.push(null)\n this.remove(connectionId, streamId)\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport class ProtocolServerStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = serverStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n add(connectionId: string, streamId: number, blob: ProtocolBlob) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = new ProtocolServerStream(streamId, blob)\n serverStreams.set(streamId, stream)\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n serverStreams.has(streamId) || throwError('Stream not found')\n serverStreams.delete(streamId)\n }\n\n pull(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.resume()\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport class Protocol {\n readonly connections: ProtocolConnections\n readonly clientStreams: ProtocolClientStreams\n readonly serverStreams: ProtocolServerStreams\n\n constructor(\n protected readonly application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n },\n ) {\n this.connections = new ProtocolConnections(this.application)\n this.clientStreams = new ProtocolClientStreams(this.connections)\n this.serverStreams = new ProtocolServerStreams(this.connections)\n }\n\n async rpc(\n connectionId: string,\n rpc: ProtocolRPC,\n params: { signal?: AbortSignal } = {},\n ) {\n const { connection, context, transport } =\n this.connections.get(connectionId)\n const { calls, format } = context\n const { callId, namespace, procedure, payload } = rpc\n const abortController = new AbortController()\n const signal = params.signal\n ? AbortSignal.any([params.signal, abortController.signal])\n : abortController.signal\n\n const call = Object.assign(createPromise<ProtocolApiCallResult>(), {\n abort: () => abortController.abort(),\n })\n\n calls.set(callId, call)\n call.promise.finally(() => calls.delete(callId))\n\n const callIdEncoded = encodeNumber(callId, 'Uint32')\n const container = context.container.fork(Scope.Call)\n\n try {\n const response = await this.application.api.call({\n connection,\n container,\n namespace,\n payload,\n procedure,\n signal,\n })\n\n const responseEncoded = format.encoder.encodeRPC(\n {\n callId,\n payload: response.output,\n },\n {\n addStream: (blob) => {\n const id = context.streamId++\n const stream = this.serverStreams.add(connectionId, id, blob)\n stream.on('data', (chunk) => {\n stream.pause()\n transport.send(\n connection,\n ServerMessageType.ServerStreamPush,\n concat(\n encodeNumber(id, 'Uint32'),\n Buffer.from(chunk).buffer as ArrayBuffer,\n ),\n )\n })\n stream.on('error', (err) => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamAbort,\n encodeNumber(id, 'Uint32'),\n )\n })\n stream.on('end', () => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamEnd,\n encodeNumber(id, 'Uint32'),\n )\n })\n return stream\n },\n getStream: (id) => {\n return this.clientStreams.get(connectionId, id)\n },\n },\n )\n\n if ('subscription' in response) {\n throwError('Unimplemented')\n } else if ('iterable' in response) {\n transport.send(\n connection,\n ServerMessageType.RpcStreamResponse,\n responseEncoded,\n )\n try {\n const ab = new AbortController()\n context.rpcStreams.set(callId, ab)\n const iterable =\n typeof response.iterable === 'function'\n ? response.iterable()\n : response.iterable\n for await (const chunk of iterable) {\n if (ab.signal.aborted) break\n const chunkEncoded = format.encoder.encode(chunk)\n transport.send(\n connection,\n ServerMessageType.RpcStreamChunk,\n concat(callIdEncoded, chunkEncoded),\n )\n }\n } catch (error) {\n this.application.logger.error(error)\n transport.send(\n connection,\n ServerMessageType.RpcStreamAbort,\n callIdEncoded,\n )\n } finally {\n context.rpcStreams.delete(callId)\n response.onFinish && defer(response.onFinish)\n }\n } else {\n transport.send(\n connection,\n ServerMessageType.RpcResponse,\n responseEncoded,\n )\n }\n } catch (error) {\n if (error instanceof ProtocolError === false) {\n this.application.logger.error(\n { error, connection },\n 'Error during RPC call',\n )\n\n // biome-ignore lint/suspicious/noCatchAssign:\n error = new ProtocolError(\n ErrorCode.InternalServerError,\n 'Internal server error',\n )\n }\n\n const payload = format.encoder.encodeRPC(\n { callId, error },\n {\n addStream(blob) {\n throwError('Cannot handle stream for error response')\n },\n getStream(id) {\n throwError('Cannot handle stream for error response')\n },\n },\n )\n transport.send(connection, ServerMessageType.RpcResponse, payload)\n } finally {\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n \"Error during disposing connection's container\",\n )\n })\n }\n }\n\n async rpcRaw(\n connectionId: string,\n buffer: ArrayBuffer,\n params: { signal?: AbortSignal } = {},\n ) {\n const { connection, context, transport } =\n this.connections.get(connectionId)\n\n const { format } = context\n\n const rpc = format.decoder.decodeRPC(buffer, {\n addStream: (id, metadata) => {\n return this.clientStreams.add(connectionId, id, metadata, (size) => {\n transport.send(\n connection,\n ServerMessageType.ClientStreamPull,\n concat(encodeNumber(id, 'Uint32'), encodeNumber(size, 'Uint32')),\n )\n })\n },\n getStream: (id) => {\n return this.serverStreams.get(connectionId, id)\n },\n })\n\n return await this.rpc(connectionId, rpc, params)\n }\n\n rpcAbort(connectionId: string, callId: number) {\n const { context } = this.connections.get(connectionId)\n const call = context.calls.get(callId) ?? throwError('Call not found')\n call.abort()\n }\n\n rpcAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcAbort(connectionId, callId)\n }\n\n rpcStreamAbort(connectionId: string, callId: number) {\n const { context } = this.connections.get(connectionId)\n const ab =\n context.rpcStreams.get(callId) ?? throwError('Call stream not found')\n ab.abort()\n }\n\n rpcStreamAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcStreamAbort(connectionId, callId)\n }\n\n notify(connectionId: string, event, payload) {\n throw Error('Unimplemented')\n }\n}\n"],"names":["createPromise","defer","throwError","Hook","Scope","concat","decodeNumber","encodeNumber","ErrorCode","ServerMessageType","Connection","ConnectionContext","ProtocolClientStream","ProtocolServerStream","getFormat","ProtocolError","Error","code","data","constructor","message","toString","toJSON","ProtocolConnections","application","Map","get","connectionId","connection","add","transport","options","params","format","container","fork","context","set","id","registry","hooks","call","OnConnect","concurrent","remove","OnDisconnect","delete","calls","serverStreams","clientStreams","rpcStreams","values","reject","stream","destroy","abort","dispose","error","logger","ProtocolClientStreams","connections","streamId","metadata","read","push","chunk","Buffer","from","end","ProtocolServerStreams","blob","has","pull","resume","Protocol","rpc","callId","namespace","procedure","payload","abortController","AbortController","signal","AbortSignal","any","Object","assign","promise","finally","callIdEncoded","Call","response","api","responseEncoded","encoder","encodeRPC","output","addStream","on","pause","send","ServerStreamPush","buffer","err","ServerStreamAbort","ServerStreamEnd","getStream","RpcStreamResponse","ab","iterable","aborted","chunkEncoded","encode","RpcStreamChunk","RpcStreamAbort","onFinish","RpcResponse","InternalServerError","catch","rpcRaw","decoder","decodeRPC","size","ClientStreamPull","rpcAbort","rpcAbortRaw","rpcStreamAbort","rpcStreamAbortRaw","notify","event"],"mappings":"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"}
|
package/lib/client/index.ts
CHANGED
package/lib/client/protocol.ts
CHANGED
package/lib/common/index.ts
CHANGED
package/lib/server/format.ts
CHANGED
package/lib/server/index.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export * from './api.ts'
|
|
2
2
|
export * from './connection.ts'
|
|
3
3
|
export * from './constants.ts'
|
|
4
|
-
export * from './injectables.ts'
|
|
5
4
|
export * from './format.ts'
|
|
5
|
+
export * from './injectables.ts'
|
|
6
6
|
export * from './protocol.ts'
|
|
7
7
|
export * from './registry.ts'
|
|
8
8
|
export * from './stream.ts'
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
|
-
Scope,
|
|
3
2
|
createFactoryInjectable,
|
|
4
3
|
createLazyInjectable,
|
|
4
|
+
Scope,
|
|
5
5
|
} from '@nmtjs/core'
|
|
6
|
+
import type { Connection } from './connection.ts'
|
|
6
7
|
|
|
7
|
-
const connection = createLazyInjectable<
|
|
8
|
+
const connection = createLazyInjectable<Connection, Scope.Connection>(
|
|
8
9
|
Scope.Connection,
|
|
9
10
|
'RPC connection',
|
|
10
11
|
)
|
|
11
12
|
|
|
12
|
-
const connectionData = createLazyInjectable<
|
|
13
|
+
const connectionData = createLazyInjectable<any, Scope.Connection>(
|
|
13
14
|
Scope.Connection,
|
|
14
15
|
"RPC connection's data",
|
|
15
16
|
)
|
package/lib/server/protocol.ts
CHANGED
|
@@ -14,7 +14,7 @@ import type { Format } from './format.ts'
|
|
|
14
14
|
import type { ProtocolRegistry } from './registry.ts'
|
|
15
15
|
import { ProtocolClientStream, ProtocolServerStream } from './stream.ts'
|
|
16
16
|
import type { Transport } from './transport.ts'
|
|
17
|
-
import { type ResolveFormatParams
|
|
17
|
+
import { getFormat, type ResolveFormatParams } from './utils.ts'
|
|
18
18
|
|
|
19
19
|
export class ProtocolError extends Error {
|
|
20
20
|
code: string
|
package/package.json
CHANGED
|
@@ -19,19 +19,18 @@
|
|
|
19
19
|
}
|
|
20
20
|
},
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@nmtjs/type": "0.6.
|
|
23
|
-
"@nmtjs/
|
|
24
|
-
"@nmtjs/
|
|
22
|
+
"@nmtjs/type": "0.6.3",
|
|
23
|
+
"@nmtjs/common": "0.6.3",
|
|
24
|
+
"@nmtjs/core": "0.6.3"
|
|
25
25
|
},
|
|
26
26
|
"files": [
|
|
27
27
|
"index.ts",
|
|
28
28
|
"lib",
|
|
29
29
|
"dist",
|
|
30
|
-
"tsconfig.json",
|
|
31
30
|
"LICENSE.md",
|
|
32
31
|
"README.md"
|
|
33
32
|
],
|
|
34
|
-
"version": "0.6.
|
|
33
|
+
"version": "0.6.3",
|
|
35
34
|
"scripts": {
|
|
36
35
|
"build": "neemata-build --root=./lib './**/*.ts'",
|
|
37
36
|
"type-check": "tsc --noEmit"
|
package/tsconfig.json
DELETED