@nmtjs/protocol 0.6.4 → 0.7.0
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/events.js +29 -26
- package/dist/client/events.js.map +1 -1
- package/dist/client/format.js +1 -2
- package/dist/client/format.js.map +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/protocol.js +331 -308
- package/dist/client/protocol.js.map +1 -1
- package/dist/client/stream.js +79 -92
- package/dist/client/stream.js.map +1 -1
- package/dist/common/binary.js +20 -20
- package/dist/common/binary.js.map +1 -1
- package/dist/common/blob.js +36 -40
- package/dist/common/blob.js.map +1 -1
- package/dist/common/enums.js +44 -44
- package/dist/common/enums.js.map +1 -1
- package/dist/common/index.js.map +1 -1
- package/dist/common/types.js +1 -1
- package/dist/common/types.js.map +1 -1
- package/dist/server/api.js +1 -1
- package/dist/server/api.js.map +1 -1
- package/dist/server/connection.js +18 -18
- package/dist/server/connection.js.map +1 -1
- package/dist/server/constants.js +1 -1
- package/dist/server/constants.js.map +1 -1
- package/dist/server/format.js +42 -45
- package/dist/server/format.js.map +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/injectables.js +18 -18
- package/dist/server/injectables.js.map +1 -1
- package/dist/server/protocol.js +282 -296
- package/dist/server/protocol.js.map +1 -1
- package/dist/server/registry.js +2 -19
- package/dist/server/registry.js.map +1 -1
- package/dist/server/stream.js +24 -26
- package/dist/server/stream.js.map +1 -1
- package/dist/server/transport.js +6 -6
- package/dist/server/transport.js.map +1 -1
- package/dist/server/utils.js +9 -9
- package/dist/server/utils.js.map +1 -1
- package/package.json +12 -16
- package/{lib → src}/client/protocol.ts +46 -5
- package/{lib → src}/client/stream.ts +18 -26
- package/{lib → src}/server/connection.ts +1 -1
- package/{lib → src}/server/protocol.ts +19 -9
- package/src/server/registry.ts +3 -0
- package/lib/server/registry.ts +0 -24
- /package/{lib → src}/client/events.ts +0 -0
- /package/{lib → src}/client/format.ts +0 -0
- /package/{lib → src}/client/index.ts +0 -0
- /package/{lib → src}/common/binary.ts +0 -0
- /package/{lib → src}/common/blob.ts +0 -0
- /package/{lib → src}/common/enums.ts +0 -0
- /package/{lib → src}/common/index.ts +0 -0
- /package/{lib → src}/common/types.ts +0 -0
- /package/{lib → src}/server/api.ts +0 -0
- /package/{lib → src}/server/constants.ts +0 -0
- /package/{lib → src}/server/format.ts +0 -0
- /package/{lib → src}/server/index.ts +0 -0
- /package/{lib → src}/server/injectables.ts +0 -0
- /package/{lib → src}/server/stream.ts +0 -0
- /package/{lib → src}/server/transport.ts +0 -0
- /package/{lib → src}/server/utils.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../lib/server/protocol.ts"],"sourcesContent":["import { type Callback, createPromise, defer, throwError } from '@nmtjs/common'\nimport { type Container, Hook, type Logger, Scope } from '@nmtjs/core'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlob, ProtocolBlobMetadata } from '../common/blob.ts'\nimport { ErrorCode, ServerMessageType } from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport type { ProtocolApi, ProtocolApiCallResult } from './api.ts'\nimport {\n Connection,\n ConnectionContext,\n type ConnectionOptions,\n} from './connection.ts'\nimport type { Format } from './format.ts'\nimport type { ProtocolRegistry } from './registry.ts'\nimport { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\nimport type { Transport } from './transport.ts'\nimport { getFormat, type ResolveFormatParams } from './utils.ts'\n\nexport class ProtocolError extends Error {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport class ProtocolConnections {\n readonly #collection = new Map<\n string,\n {\n connection: Connection\n context: ConnectionContext\n transport: Transport\n }\n >()\n\n constructor(\n private readonly application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n },\n ) {}\n\n get(connectionId: string) {\n const connection = this.#collection.get(connectionId)\n if (!connection) throwError('Connection not found')\n return connection\n }\n\n async add<T>(\n transport: Transport<any>,\n options: ConnectionOptions<T>,\n params: ResolveFormatParams,\n ) {\n const connection = new Connection(options)\n const format = getFormat(this.application.format, params)\n const container = this.application.container.fork(Scope.Connection)\n const context = new ConnectionContext(container, format)\n\n this.#collection.set(connection.id, { connection, context, transport })\n\n await this.application.registry.hooks.call(\n Hook.OnConnect,\n { concurrent: false },\n connection,\n )\n\n return { connection, context }\n }\n\n async remove(connectionId: string) {\n const { connection, context } = this.get(connectionId)\n\n this.application.registry.hooks.call(\n Hook.OnDisconnect,\n { concurrent: true },\n connection,\n )\n\n this.#collection.delete(connectionId)\n\n const { calls, serverStreams, clientStreams, rpcStreams, container } =\n context\n\n for (const call of calls.values()) {\n call.reject(new Error('Connection closed'))\n }\n\n for (const stream of clientStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of serverStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of rpcStreams.values()) {\n stream.abort(new Error('Connection closed'))\n }\n\n try {\n await container.dispose()\n } catch (error) {\n this.application.logger.error(\n { error, connection },\n 'Error during closing connection',\n )\n }\n }\n}\n\nexport class ProtocolClientStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = clientStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n clientStreams.get(streamId) || throwError('Stream not found')\n clientStreams.delete(streamId)\n }\n\n add(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = new ProtocolClientStream(streamId, metadata, { read })\n clientStreams.set(streamId, stream)\n return stream\n }\n\n push(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(connectionId, streamId)\n stream.push(Buffer.from(chunk))\n }\n\n end(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.push(null)\n this.remove(connectionId, streamId)\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport class ProtocolServerStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = serverStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n add(connectionId: string, streamId: number, blob: ProtocolBlob) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = new ProtocolServerStream(streamId, blob)\n serverStreams.set(streamId, stream)\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n serverStreams.has(streamId) || throwError('Stream not found')\n serverStreams.delete(streamId)\n }\n\n pull(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.resume()\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport class Protocol {\n readonly connections: ProtocolConnections\n readonly clientStreams: ProtocolClientStreams\n readonly serverStreams: ProtocolServerStreams\n\n constructor(\n protected readonly application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n },\n ) {\n this.connections = new ProtocolConnections(this.application)\n this.clientStreams = new ProtocolClientStreams(this.connections)\n this.serverStreams = new ProtocolServerStreams(this.connections)\n }\n\n async rpc(\n connectionId: string,\n rpc: ProtocolRPC,\n params: { signal?: AbortSignal } = {},\n ) {\n const { connection, context, transport } =\n this.connections.get(connectionId)\n const { calls, format } = context\n const { callId, namespace, procedure, payload } = rpc\n const abortController = new AbortController()\n const signal = params.signal\n ? AbortSignal.any([params.signal, abortController.signal])\n : abortController.signal\n\n const call = Object.assign(createPromise<ProtocolApiCallResult>(), {\n abort: () => abortController.abort(),\n })\n\n calls.set(callId, call)\n call.promise.finally(() => calls.delete(callId))\n\n const callIdEncoded = encodeNumber(callId, 'Uint32')\n const container = context.container.fork(Scope.Call)\n\n try {\n const response = await this.application.api.call({\n connection,\n container,\n namespace,\n payload,\n procedure,\n signal,\n })\n\n const responseEncoded = format.encoder.encodeRPC(\n {\n callId,\n payload: response.output,\n },\n {\n addStream: (blob) => {\n const id = context.streamId++\n const stream = this.serverStreams.add(connectionId, id, blob)\n stream.on('data', (chunk) => {\n stream.pause()\n transport.send(\n connection,\n ServerMessageType.ServerStreamPush,\n concat(\n encodeNumber(id, 'Uint32'),\n Buffer.from(chunk).buffer as ArrayBuffer,\n ),\n )\n })\n stream.on('error', (err) => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamAbort,\n encodeNumber(id, 'Uint32'),\n )\n })\n stream.on('end', () => {\n transport.send(\n connection,\n ServerMessageType.ServerStreamEnd,\n encodeNumber(id, 'Uint32'),\n )\n })\n return stream\n },\n getStream: (id) => {\n return this.clientStreams.get(connectionId, id)\n },\n },\n )\n\n if ('subscription' in response) {\n throwError('Unimplemented')\n } else if ('iterable' in response) {\n transport.send(\n connection,\n ServerMessageType.RpcStreamResponse,\n responseEncoded,\n )\n try {\n const ab = new AbortController()\n context.rpcStreams.set(callId, ab)\n const iterable =\n typeof response.iterable === 'function'\n ? response.iterable()\n : response.iterable\n for await (const chunk of iterable) {\n if (ab.signal.aborted) break\n const chunkEncoded = format.encoder.encode(chunk)\n transport.send(\n connection,\n ServerMessageType.RpcStreamChunk,\n concat(callIdEncoded, chunkEncoded),\n )\n }\n } catch (error) {\n this.application.logger.error(error)\n transport.send(\n connection,\n ServerMessageType.RpcStreamAbort,\n callIdEncoded,\n )\n } finally {\n context.rpcStreams.delete(callId)\n response.onFinish && defer(response.onFinish)\n }\n } else {\n transport.send(\n connection,\n ServerMessageType.RpcResponse,\n responseEncoded,\n )\n }\n } catch (error) {\n if (error instanceof ProtocolError === false) {\n this.application.logger.error(\n { error, connection },\n 'Error during RPC call',\n )\n\n // biome-ignore lint/suspicious/noCatchAssign:\n error = new ProtocolError(\n ErrorCode.InternalServerError,\n 'Internal server error',\n )\n }\n\n const payload = format.encoder.encodeRPC(\n { callId, error },\n {\n addStream(blob) {\n throwError('Cannot handle stream for error response')\n },\n getStream(id) {\n throwError('Cannot handle stream for error response')\n },\n },\n )\n transport.send(connection, ServerMessageType.RpcResponse, payload)\n } finally {\n container.dispose().catch((error) => {\n this.application.logger.error(\n { error, connection },\n \"Error during disposing connection's container\",\n )\n })\n }\n }\n\n async rpcRaw(\n connectionId: string,\n buffer: ArrayBuffer,\n params: { signal?: AbortSignal } = {},\n ) {\n const { connection, context, transport } =\n this.connections.get(connectionId)\n\n const { format } = context\n\n const rpc = format.decoder.decodeRPC(buffer, {\n addStream: (id, metadata) => {\n return this.clientStreams.add(connectionId, id, metadata, (size) => {\n transport.send(\n connection,\n ServerMessageType.ClientStreamPull,\n concat(encodeNumber(id, 'Uint32'), encodeNumber(size, 'Uint32')),\n )\n })\n },\n getStream: (id) => {\n return this.serverStreams.get(connectionId, id)\n },\n })\n\n return await this.rpc(connectionId, rpc, params)\n }\n\n rpcAbort(connectionId: string, callId: number) {\n const { context } = this.connections.get(connectionId)\n const call = context.calls.get(callId) ?? throwError('Call not found')\n call.abort()\n }\n\n rpcAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcAbort(connectionId, callId)\n }\n\n rpcStreamAbort(connectionId: string, callId: number) {\n const { context } = this.connections.get(connectionId)\n const ab =\n context.rpcStreams.get(callId) ?? throwError('Call stream not found')\n ab.abort()\n }\n\n rpcStreamAbortRaw(connectionId: string, buffer: ArrayBuffer) {\n const callId = decodeNumber(buffer, 'Uint32')\n return this.rpcStreamAbort(connectionId, callId)\n }\n\n notify(connectionId: string, event, payload) {\n throw Error('Unimplemented')\n }\n}\n"],"names":["createPromise","defer","throwError","Hook","Scope","concat","decodeNumber","encodeNumber","ErrorCode","ServerMessageType","Connection","ConnectionContext","ProtocolClientStream","ProtocolServerStream","getFormat","ProtocolError","Error","code","data","constructor","message","toString","toJSON","ProtocolConnections","application","Map","get","connectionId","connection","add","transport","options","params","format","container","fork","context","set","id","registry","hooks","call","OnConnect","concurrent","remove","OnDisconnect","delete","calls","serverStreams","clientStreams","rpcStreams","values","reject","stream","destroy","abort","dispose","error","logger","ProtocolClientStreams","connections","streamId","metadata","read","push","chunk","Buffer","from","end","ProtocolServerStreams","blob","has","pull","resume","Protocol","rpc","callId","namespace","procedure","payload","abortController","AbortController","signal","AbortSignal","any","Object","assign","promise","finally","callIdEncoded","Call","response","api","responseEncoded","encoder","encodeRPC","output","addStream","on","pause","send","ServerStreamPush","buffer","err","ServerStreamAbort","ServerStreamEnd","getStream","RpcStreamResponse","ab","iterable","aborted","chunkEncoded","encode","RpcStreamChunk","RpcStreamAbort","onFinish","RpcResponse","InternalServerError","catch","rpcRaw","decoder","decodeRPC","size","ClientStreamPull","rpcAbort","rpcAbortRaw","rpcStreamAbort","rpcStreamAbortRaw","notify","event"],"mappings":"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"}
|
|
1
|
+
{"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: Transport<any>","options: ConnectionOptions<T>","params: ResolveFormatParams","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 }","rpc: ProtocolRPC","params: { signal?: AbortSignal }","buffer: ArrayBuffer","callId: number"],"sources":["src/server/protocol.ts"],"sourcesContent":["import { type Callback, createPromise, defer, throwError } from '@nmtjs/common'\nimport { type Container, Hook, type Logger, Scope } from '@nmtjs/core'\nimport { concat, decodeNumber, encodeNumber } from '../common/binary.ts'\nimport type { ProtocolBlob, ProtocolBlobMetadata } from '../common/blob.ts'\nimport { ErrorCode, ServerMessageType } from '../common/enums.ts'\nimport type { ProtocolRPC } from '../common/types.ts'\nimport type { ProtocolApi, ProtocolApiCallResult } from './api.ts'\nimport {\n Connection,\n ConnectionContext,\n type ConnectionOptions,\n} from './connection.ts'\nimport type { Format } from './format.ts'\nimport type { ProtocolRegistry } from './registry.ts'\nimport { ProtocolClientStream, ProtocolServerStream } from './stream.ts'\nimport type { Transport } from './transport.ts'\nimport { getFormat, type ResolveFormatParams } from './utils.ts'\n\nexport class ProtocolError extends Error {\n code: string\n data?: any\n\n constructor(code: string, message?: string, data?: any) {\n super(message)\n this.code = code\n this.data = data\n }\n\n get message() {\n return `${this.code} ${super.message}`\n }\n\n toString() {\n return `${this.code} ${this.message}`\n }\n\n toJSON() {\n return {\n code: this.code,\n message: this.message,\n data: this.data,\n }\n }\n}\n\nexport class ProtocolConnections {\n readonly #collection = new Map<\n string,\n {\n connection: Connection\n context: ConnectionContext\n transport: Transport\n }\n >()\n\n constructor(\n private readonly application: {\n logger: Logger\n registry: ProtocolRegistry\n format: Format\n container: Container\n },\n ) {}\n\n get(connectionId: string) {\n const connection = this.#collection.get(connectionId)\n if (!connection) throwError('Connection not found')\n return connection\n }\n\n async add<T>(\n transport: Transport<any>,\n options: ConnectionOptions<T>,\n params: ResolveFormatParams,\n ) {\n const connection = new Connection(options)\n const format = getFormat(this.application.format, params)\n const container = this.application.container.fork(Scope.Connection)\n const context = new ConnectionContext(container, format)\n\n this.#collection.set(connection.id, { connection, context, transport })\n\n await this.application.registry.hooks.call(\n Hook.OnConnect,\n { concurrent: false },\n connection,\n )\n\n return { connection, context }\n }\n\n async remove(connectionId: string) {\n const { connection, context } = this.get(connectionId)\n\n this.application.registry.hooks.call(\n Hook.OnDisconnect,\n { concurrent: true },\n connection,\n )\n\n this.#collection.delete(connectionId)\n\n const { calls, serverStreams, clientStreams, rpcStreams, container } =\n context\n\n for (const call of calls.values()) {\n call.abort(new Error('Connection closed'))\n }\n\n for (const stream of clientStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of serverStreams.values()) {\n stream.destroy(new Error('Connection closed'))\n }\n\n for (const stream of rpcStreams.values()) {\n stream.abort(new Error('Connection closed'))\n }\n\n try {\n await container.dispose()\n } catch (error) {\n this.application.logger.error(\n { error, connection },\n 'Error during closing connection',\n )\n }\n }\n}\n\nexport class ProtocolClientStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = clientStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n clientStreams.get(streamId) || throwError('Stream not found')\n clientStreams.delete(streamId)\n }\n\n add(\n connectionId: string,\n streamId: number,\n metadata: ProtocolBlobMetadata,\n read: Callback,\n ) {\n const { context } = this.connections.get(connectionId)\n const { clientStreams } = context\n const stream = new ProtocolClientStream(streamId, metadata, { read })\n clientStreams.set(streamId, stream)\n return stream\n }\n\n push(connectionId: string, streamId: number, chunk: ArrayBuffer) {\n const stream = this.get(connectionId, streamId)\n stream.push(Buffer.from(chunk))\n }\n\n end(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.push(null)\n this.remove(connectionId, streamId)\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport class ProtocolServerStreams {\n constructor(private readonly connections: ProtocolConnections) {}\n\n get(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = serverStreams.get(streamId) ?? throwError('Stream not found')\n return stream\n }\n\n add(connectionId: string, streamId: number, blob: ProtocolBlob) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n const stream = new ProtocolServerStream(streamId, blob)\n serverStreams.set(streamId, stream)\n return stream\n }\n\n remove(connectionId: string, streamId: number) {\n const { context } = this.connections.get(connectionId)\n const { serverStreams } = context\n serverStreams.has(streamId) || throwError('Stream not found')\n serverStreams.delete(streamId)\n }\n\n pull(connectionId: string, streamId: number) {\n const stream = this.get(connectionId, streamId)\n stream.resume()\n }\n\n abort(connectionId: string, streamId: number, error = new Error('Aborted')) {\n const stream = this.get(connectionId, streamId)\n stream.destroy(error)\n this.remove(connectionId, streamId)\n }\n}\n\nexport class Protocol {\n readonly connections: ProtocolConnections\n readonly clientStreams: ProtocolClientStreams\n readonly serverStreams: ProtocolServerStreams\n\n constructor(\n protected readonly application: {\n logger: Logger\n format: Format\n container: Container\n registry: ProtocolRegistry\n api: ProtocolApi\n },\n ) {\n this.connections = new ProtocolConnections(this.application)\n this.clientStreams = new ProtocolClientStreams(this.connections)\n this.serverStreams = new ProtocolServerStreams(this.connections)\n }\n\n async rpc(\n connectionId: string,\n rpc: ProtocolRPC,\n params: { signal?: AbortSignal } = {},\n ) {\n const { connection, context, transport } =\n this.connections.get(connectionId)\n const { calls, format } = context\n const { callId, namespace, procedure, payload } = rpc\n const abortController = new AbortController()\n const signal = params.signal\n ? AbortSignal.any([params.signal, abortController.signal])\n : abortController.signal\n\n const call = Object.assign(createPromise<ProtocolApiCallResult>(), {\n abort: () => abortController.abort(),\n })\n\n calls.set(callId, call)\n call.promise.finally(() => calls.delete(callId))\n\n const callIdEncoded = encodeNumber(callId, 'Uint32')\n const container = context.container.fork(Scope.Call)\n\n try {\n const response = await this.application.api.call({\n connection,\n container,\n namespace,\n payload,\n procedure,\n signal,\n })\n\n const responseEncoded = format.encoder.encodeRPC(\n {\n callId,\n payload: response.output,\n },\n {\n addStream: (blob) => {\n const id = context.streamId++\n const stream = this.serverStreams.add(connectionId, id, blob)\n stream.on('data', (chunk) => {\n stream.pause()\n const buf = Buffer.from(chunk)\n transport.send(\n connection,\n ServerMessageType.ServerStreamPush,\n concat(\n encodeNumber(id, 'Uint32'),\n (buf.buffer as ArrayBuffer).slice(\n buf.byteOffset,\n buf.byteOffset + buf.byteLength,\n ),\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 const stream = this.clientStreams.add(\n connectionId,\n id,\n metadata,\n (size) => {\n transport.send(\n connection,\n ServerMessageType.ClientStreamPull,\n concat(encodeNumber(id, 'Uint32'), encodeNumber(size, 'Uint32')),\n )\n },\n )\n return stream\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"],"version":3}
|
package/dist/server/registry.js
CHANGED
|
@@ -1,19 +1,2 @@
|
|
|
1
|
-
import { Registry } from
|
|
2
|
-
|
|
3
|
-
export class ProtocolRegistry extends Registry {
|
|
4
|
-
types = new Set();
|
|
5
|
-
compiled = new Map();
|
|
6
|
-
registerType(type) {
|
|
7
|
-
this.types.add(type);
|
|
8
|
-
}
|
|
9
|
-
compile() {
|
|
10
|
-
for (const type of this.types){
|
|
11
|
-
this.compiled.set(type, compile(type));
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
clear() {
|
|
15
|
-
super.clear();
|
|
16
|
-
this.types.clear();
|
|
17
|
-
this.compiled.clear();
|
|
18
|
-
}
|
|
19
|
-
}
|
|
1
|
+
import { Registry } from "@nmtjs/core";
|
|
2
|
+
export class ProtocolRegistry extends Registry {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"
|
|
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}
|
package/dist/server/stream.js
CHANGED
|
@@ -1,30 +1,28 @@
|
|
|
1
|
-
import { PassThrough, Readable } from
|
|
2
|
-
import { ReadableStream } from
|
|
1
|
+
import { PassThrough, Readable } from "node:stream";
|
|
2
|
+
import { ReadableStream } from "node:stream/web";
|
|
3
3
|
export class ProtocolClientStream extends Readable {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
this.metadata = metadata;
|
|
10
|
-
}
|
|
4
|
+
constructor(id, metadata, options) {
|
|
5
|
+
super(options);
|
|
6
|
+
this.id = id;
|
|
7
|
+
this.metadata = metadata;
|
|
8
|
+
}
|
|
11
9
|
}
|
|
12
10
|
export class ProtocolServerStream extends PassThrough {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
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
|
+
}
|
|
30
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"
|
|
1
|
+
{"mappings":"AAAA,SACE,aACA,gBAGK,aAAa;AACpB,SAAS,sBAAsB,iBAAiB;AAGhD,OAAO,MAAM,6BAA6B,SAAS;CACjD,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 {\n PassThrough,\n Readable,\n type ReadableOptions,\n type TransformOptions,\n} from 'node:stream'\nimport { ReadableStream } from 'node:stream/web'\nimport type { ProtocolBlob, ProtocolBlobMetadata } from '../common/blob.ts'\n\nexport class ProtocolClientStream extends Readable {\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}
|
package/dist/server/transport.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { kTransportPlugin } from "./constants.js";
|
|
2
|
-
export const createTransport = (name, init)=>({
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
export const isTransportPlugin = (plugin)=>kTransportPlugin in plugin;
|
|
2
|
+
export const createTransport = (name, init) => ({
|
|
3
|
+
name,
|
|
4
|
+
init,
|
|
5
|
+
[kTransportPlugin]: true
|
|
6
|
+
});
|
|
7
|
+
export const isTransportPlugin = (plugin) => kTransportPlugin in plugin;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"
|
|
1
|
+
{"mappings":"AAIA,SAAS,wBAAwB,gBAAgB;AAwBjD,OAAO,MAAM,kBAAkB,CAC7BA,MACAC,UACoC;CAAE;CAAM;EAAO,mBAAmB;AAAM;AAE9E,OAAO,MAAM,oBAAoB,CAC/BC,WAC8B,oBAAoB","names":["name: string","init: TransportPlugin<Type, Options>['init']","plugin: BasePlugin<any, any, any>"],"sources":["src/server/transport.ts"],"sourcesContent":["import type { Async } from '@nmtjs/common'\nimport type { BasePlugin, PluginContext } from '@nmtjs/core'\nimport type { ServerMessageType } from '../common/enums.ts'\nimport type { Connection } from './connection.ts'\nimport { kTransportPlugin } from './constants.ts'\nimport type { Protocol } from './protocol.ts'\nimport type { ProtocolRegistry } from './registry.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 ) => Async<void>\n}\n\nexport interface TransportPluginContext extends PluginContext {\n protocol: Protocol\n registry: ProtocolRegistry\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}
|
package/dist/server/utils.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export const getFormat = (format, { acceptType, contentType })=>{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
1
|
+
export const getFormat = (format, { acceptType, contentType }) => {
|
|
2
|
+
const encoder = contentType ? format.supportsEncoder(contentType) : undefined;
|
|
3
|
+
if (!encoder) throw new Error("Unsupported content-type");
|
|
4
|
+
const decoder = acceptType ? format.supportsDecoder(acceptType) : undefined;
|
|
5
|
+
if (!decoder) throw new Error("Unsupported accept");
|
|
6
|
+
return {
|
|
7
|
+
encoder,
|
|
8
|
+
decoder
|
|
9
|
+
};
|
|
10
10
|
};
|
package/dist/server/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"
|
|
1
|
+
{"mappings":"AAOA,OAAO,MAAM,YAAY,CACvBA,QACA,EAAE,YAAY,aAAkC,KAC7C;CACH,MAAM,UAAU,cAAc,OAAO,gBAAgB,YAAY,GAAG;AACpE,MAAK,QAAS,OAAM,IAAI,MAAM;CAE9B,MAAM,UAAU,aAAa,OAAO,gBAAgB,WAAW,GAAG;AAClE,MAAK,QAAS,OAAM,IAAI,MAAM;AAE9B,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 const getFormat = (\n format: Format,\n { acceptType, contentType }: ResolveFormatParams,\n) => {\n const encoder = contentType ? format.supportsEncoder(contentType) : undefined\n if (!encoder) throw new Error('Unsupported content-type')\n\n const decoder = acceptType ? format.supportsDecoder(acceptType) : undefined\n if (!decoder) throw new Error('Unsupported accept')\n\n return {\n encoder,\n decoder,\n }\n}\n"],"version":3}
|
package/package.json
CHANGED
|
@@ -3,36 +3,32 @@
|
|
|
3
3
|
"type": "module",
|
|
4
4
|
"exports": {
|
|
5
5
|
"./common": {
|
|
6
|
-
"
|
|
7
|
-
"
|
|
8
|
-
"types": "./lib/common/index.ts"
|
|
6
|
+
"types": "./src/common/index.ts",
|
|
7
|
+
"import": "./dist/common/index.js"
|
|
9
8
|
},
|
|
10
9
|
"./server": {
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"types": "./lib/server/index.ts"
|
|
10
|
+
"types": "./src/server/index.ts",
|
|
11
|
+
"import": "./dist/server/index.js"
|
|
14
12
|
},
|
|
15
13
|
"./client": {
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"types": "./lib/client/index.ts"
|
|
14
|
+
"types": "./src/client/index.ts",
|
|
15
|
+
"import": "./dist/client/index.js"
|
|
19
16
|
}
|
|
20
17
|
},
|
|
21
18
|
"dependencies": {
|
|
22
|
-
"@nmtjs/common": "0.
|
|
23
|
-
"@nmtjs/
|
|
24
|
-
"@nmtjs/
|
|
19
|
+
"@nmtjs/common": "0.7.0",
|
|
20
|
+
"@nmtjs/type": "0.7.0",
|
|
21
|
+
"@nmtjs/core": "0.7.0"
|
|
25
22
|
},
|
|
26
23
|
"files": [
|
|
27
|
-
"
|
|
28
|
-
"lib",
|
|
24
|
+
"src",
|
|
29
25
|
"dist",
|
|
30
26
|
"LICENSE.md",
|
|
31
27
|
"README.md"
|
|
32
28
|
],
|
|
33
|
-
"version": "0.
|
|
29
|
+
"version": "0.7.0",
|
|
34
30
|
"scripts": {
|
|
35
|
-
"build": "neemata-build --root=./
|
|
31
|
+
"build": "neemata-build --root=./src './**/*.ts'",
|
|
36
32
|
"type-check": "tsc --noEmit"
|
|
37
33
|
}
|
|
38
34
|
}
|
|
@@ -81,10 +81,18 @@ export class ProtocolClientStreams {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
end(streamId: number) {
|
|
84
|
-
|
|
85
|
-
stream.end()
|
|
84
|
+
this.get(streamId).end()
|
|
86
85
|
this.remove(streamId)
|
|
87
86
|
}
|
|
87
|
+
|
|
88
|
+
clear(error?: Error) {
|
|
89
|
+
if (error) {
|
|
90
|
+
for (const stream of this.#collection.values()) {
|
|
91
|
+
stream.abort(error)
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
this.#collection.clear()
|
|
95
|
+
}
|
|
88
96
|
}
|
|
89
97
|
|
|
90
98
|
export class ProtocolServerStreams {
|
|
@@ -127,12 +135,26 @@ export class ProtocolServerStreams {
|
|
|
127
135
|
stream.end()
|
|
128
136
|
this.remove(streamId)
|
|
129
137
|
}
|
|
138
|
+
|
|
139
|
+
clear(error?: Error) {
|
|
140
|
+
if (error) {
|
|
141
|
+
for (const stream of this.#collection.values()) {
|
|
142
|
+
stream.abort(error)
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
this.#collection.clear()
|
|
146
|
+
}
|
|
130
147
|
}
|
|
131
148
|
|
|
132
149
|
export interface ProtocolTransport
|
|
133
|
-
extends EventEmitter<
|
|
134
|
-
|
|
135
|
-
|
|
150
|
+
extends EventEmitter<
|
|
151
|
+
{
|
|
152
|
+
[K in `${ServerMessageType}`]: [ArrayBuffer]
|
|
153
|
+
} & {
|
|
154
|
+
connected: []
|
|
155
|
+
disconnected: []
|
|
156
|
+
}
|
|
157
|
+
> {
|
|
136
158
|
connect(
|
|
137
159
|
auth: any,
|
|
138
160
|
contentType: BaseClientFormat['contentType'],
|
|
@@ -354,6 +376,10 @@ export abstract class ProtocolBaseClient<
|
|
|
354
376
|
}
|
|
355
377
|
},
|
|
356
378
|
)
|
|
379
|
+
|
|
380
|
+
this.#transport.on('disconnected', () => {
|
|
381
|
+
this.#clear()
|
|
382
|
+
})
|
|
357
383
|
}
|
|
358
384
|
|
|
359
385
|
async connect(auth: any) {
|
|
@@ -361,6 +387,7 @@ export abstract class ProtocolBaseClient<
|
|
|
361
387
|
}
|
|
362
388
|
|
|
363
389
|
async disconnect() {
|
|
390
|
+
this.#clear()
|
|
364
391
|
return await this.#transport.disconnect()
|
|
365
392
|
}
|
|
366
393
|
|
|
@@ -373,6 +400,20 @@ export abstract class ProtocolBaseClient<
|
|
|
373
400
|
return await this.#transport.send(messageType, buffer)
|
|
374
401
|
}
|
|
375
402
|
|
|
403
|
+
async #clear() {
|
|
404
|
+
const error = new ProtocolError(
|
|
405
|
+
ErrorCode.ConnectionError,
|
|
406
|
+
'Connection closed',
|
|
407
|
+
)
|
|
408
|
+
for (const call of this.#calls.values()) call.reject(error)
|
|
409
|
+
this.#calls.clear()
|
|
410
|
+
this.#serverStreams.clear(error)
|
|
411
|
+
this.#clientStreams.clear(error)
|
|
412
|
+
this.#rpcStreams.clear(error)
|
|
413
|
+
this.#callId = 0
|
|
414
|
+
this.#streamId = 0
|
|
415
|
+
}
|
|
416
|
+
|
|
376
417
|
protected async _call(
|
|
377
418
|
namespace: string,
|
|
378
419
|
procedure: string,
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Callback, defer } from '@nmtjs/common'
|
|
2
|
-
import { encodeText } from '../common/binary.ts'
|
|
2
|
+
import { concat, encodeText } from '../common/binary.ts'
|
|
3
3
|
import type { ProtocolBlobMetadata } from '../common/blob.ts'
|
|
4
4
|
|
|
5
5
|
export class ProtocolClientBlobStream extends TransformStream<
|
|
@@ -38,31 +38,31 @@ export class ProtocolClientBlobStream extends TransformStream<
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
async read(size: number) {
|
|
41
|
-
|
|
42
|
-
const chunk = this.#queue.slice(0, size)
|
|
43
|
-
const remaining = this.#queue.slice(size)
|
|
44
|
-
this.#queue = remaining
|
|
45
|
-
return chunk
|
|
46
|
-
} else {
|
|
41
|
+
while (this.#queue.byteLength < size) {
|
|
47
42
|
const { done, value } = await this.#reader.read()
|
|
48
|
-
if (
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
43
|
+
if (done) {
|
|
44
|
+
if (this.#queue.byteLength > 0) {
|
|
45
|
+
const chunk = this.#queue
|
|
46
|
+
this.#queue = new ArrayBuffer(0)
|
|
47
|
+
return chunk
|
|
48
|
+
}
|
|
49
|
+
return null
|
|
54
50
|
}
|
|
55
|
-
|
|
51
|
+
const buffer = value as ArrayBuffer
|
|
52
|
+
this.#queue = concat(this.#queue, buffer)
|
|
56
53
|
}
|
|
54
|
+
const chunk = this.#queue.slice(0, size)
|
|
55
|
+
this.#queue = this.#queue.slice(size)
|
|
56
|
+
return chunk
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
abort(error = new Error('Stream aborted')) {
|
|
60
60
|
this.#reader.cancel(error)
|
|
61
|
+
this.source.cancel(error)
|
|
61
62
|
}
|
|
62
63
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
else await this.writable.abort(new Error('Stream closed'))
|
|
64
|
+
end() {
|
|
65
|
+
return this.source.cancel('Stream ended')
|
|
66
66
|
}
|
|
67
67
|
}
|
|
68
68
|
|
|
@@ -91,7 +91,7 @@ export class ProtocolServerStream<T = any>
|
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
93
|
|
|
94
|
-
async push(chunk:
|
|
94
|
+
async push(chunk: T) {
|
|
95
95
|
await this.#writer.write(chunk)
|
|
96
96
|
}
|
|
97
97
|
|
|
@@ -112,12 +112,4 @@ export class ProtocolServerBlobStream extends ProtocolServerStream<ArrayBuffer>
|
|
|
112
112
|
) {
|
|
113
113
|
super(start)
|
|
114
114
|
}
|
|
115
|
-
|
|
116
|
-
push(chunk: ArrayBuffer) {
|
|
117
|
-
return super.push(chunk)
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
end() {
|
|
121
|
-
return super.end()
|
|
122
|
-
}
|
|
123
115
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from 'node:crypto'
|
|
2
|
-
import type { InteractivePromise } from '@nmtjs/common'
|
|
3
2
|
import type { Container } from '@nmtjs/core'
|
|
3
|
+
import type { InteractivePromise } from '../../../common/src/index.ts'
|
|
4
4
|
import type { ProtocolApiCallResult } from './api.ts'
|
|
5
5
|
import type { BaseServerDecoder, BaseServerEncoder } from './format.ts'
|
|
6
6
|
import type { ProtocolClientStream, ProtocolServerStream } from './stream.ts'
|
|
@@ -104,7 +104,7 @@ export class ProtocolConnections {
|
|
|
104
104
|
context
|
|
105
105
|
|
|
106
106
|
for (const call of calls.values()) {
|
|
107
|
-
call.
|
|
107
|
+
call.abort(new Error('Connection closed'))
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
for (const stream of clientStreams.values()) {
|
|
@@ -279,12 +279,16 @@ export class Protocol {
|
|
|
279
279
|
const stream = this.serverStreams.add(connectionId, id, blob)
|
|
280
280
|
stream.on('data', (chunk) => {
|
|
281
281
|
stream.pause()
|
|
282
|
+
const buf = Buffer.from(chunk)
|
|
282
283
|
transport.send(
|
|
283
284
|
connection,
|
|
284
285
|
ServerMessageType.ServerStreamPush,
|
|
285
286
|
concat(
|
|
286
287
|
encodeNumber(id, 'Uint32'),
|
|
287
|
-
|
|
288
|
+
(buf.buffer as ArrayBuffer).slice(
|
|
289
|
+
buf.byteOffset,
|
|
290
|
+
buf.byteOffset + buf.byteLength,
|
|
291
|
+
),
|
|
288
292
|
),
|
|
289
293
|
)
|
|
290
294
|
})
|
|
@@ -400,13 +404,19 @@ export class Protocol {
|
|
|
400
404
|
|
|
401
405
|
const rpc = format.decoder.decodeRPC(buffer, {
|
|
402
406
|
addStream: (id, metadata) => {
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
407
|
+
const stream = this.clientStreams.add(
|
|
408
|
+
connectionId,
|
|
409
|
+
id,
|
|
410
|
+
metadata,
|
|
411
|
+
(size) => {
|
|
412
|
+
transport.send(
|
|
413
|
+
connection,
|
|
414
|
+
ServerMessageType.ClientStreamPull,
|
|
415
|
+
concat(encodeNumber(id, 'Uint32'), encodeNumber(size, 'Uint32')),
|
|
416
|
+
)
|
|
417
|
+
},
|
|
418
|
+
)
|
|
419
|
+
return stream
|
|
410
420
|
},
|
|
411
421
|
getStream: (id) => {
|
|
412
422
|
return this.serverStreams.get(connectionId, id)
|
package/lib/server/registry.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { Registry } from '@nmtjs/core'
|
|
2
|
-
import type { BaseType, BaseTypeAny } from '@nmtjs/type'
|
|
3
|
-
import { type Compiled, compile } from '@nmtjs/type/compiler'
|
|
4
|
-
|
|
5
|
-
export class ProtocolRegistry extends Registry {
|
|
6
|
-
readonly types = new Set<BaseType>()
|
|
7
|
-
readonly compiled = new Map<any, Compiled>()
|
|
8
|
-
|
|
9
|
-
registerType(type: BaseTypeAny) {
|
|
10
|
-
this.types.add(type)
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
compile() {
|
|
14
|
-
for (const type of this.types) {
|
|
15
|
-
this.compiled.set(type, compile(type))
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
clear() {
|
|
20
|
-
super.clear()
|
|
21
|
-
this.types.clear()
|
|
22
|
-
this.compiled.clear()
|
|
23
|
-
}
|
|
24
|
-
}
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|