@nmtjs/ws-transport 0.0.1 → 0.1.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/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/injectables.js +2 -0
- package/dist/lib/injectables.js.map +1 -0
- package/dist/lib/server.js +1 -1
- package/dist/lib/server.js.map +1 -1
- package/index.ts +1 -1
- package/lib/injectables.ts +11 -0
- package/lib/server.ts +2 -1
- package/package.json +6 -5
- package/dist/lib/providers.js +0 -2
- package/dist/lib/providers.js.map +0 -1
- package/lib/providers.ts +0 -5
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../index.ts"],"sourcesContent":["export * from './lib/server.ts'\nexport * from './lib/transport.ts'\nexport * from './lib/types.ts'\nexport * from './lib/utils.ts'\nexport * from './lib/
|
|
1
|
+
{"version":3,"sources":["../../index.ts"],"sourcesContent":["export * from './lib/server.ts'\nexport * from './lib/transport.ts'\nexport * from './lib/types.ts'\nexport * from './lib/utils.ts'\nexport * from './lib/injectables.ts'\n"],"names":[],"mappings":"AAAA,cAAc,kBAAiB;AAC/B,cAAc,qBAAoB;AAClC,cAAc,iBAAgB;AAC9B,cAAc,iBAAgB;AAC9B,cAAc,uBAAsB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../lib/injectables.ts"],"sourcesContent":["import {\n type LazyInjectable,\n type Scope,\n injectables,\n} from '@nmtjs/application'\nimport type { WsConnectionData } from './types.ts'\n\nexport const connectionData = injectables.connectionData as LazyInjectable<\n WsConnectionData,\n Scope.Connection\n>\n"],"names":["injectables","connectionData"],"mappings":"AAAA,SAGEA,WAAW,QACN,qBAAoB;AAG3B,OAAO,MAAMC,iBAAiBD,YAAYC,cAAc,CAGvD"}
|
package/dist/lib/server.js
CHANGED
|
@@ -2,7 +2,7 @@ import { randomUUID } from 'node:crypto';
|
|
|
2
2
|
import { ApiError, Scope, ServerDownStream, ServerUpStream, SubscriptionResponse, onAbort } from '@nmtjs/application';
|
|
3
3
|
import { MessageType, TransportType, decodeNumber, encodeNumber } from '@nmtjs/common';
|
|
4
4
|
import { App, SSLApp } from 'uWebSockets.js';
|
|
5
|
-
import { connectionData } from "./
|
|
5
|
+
import { connectionData } from "./injectables.js";
|
|
6
6
|
import { InternalError, getFormat, getRequestData, send, sendMessage, sendRpcMessage } from "./utils.js";
|
|
7
7
|
export class WsTransportServer {
|
|
8
8
|
application;
|
package/dist/lib/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../lib/server.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\nimport {\n type AnyProcedure,\n ApiError,\n type ApplicationContext,\n type Connection,\n type Container,\n Scope,\n ServerDownStream,\n ServerUpStream,\n type Service,\n SubscriptionResponse,\n onAbort,\n} from '@nmtjs/application'\nimport {\n type ApiBlobMetadata,\n type EncodeRpcContext,\n MessageType,\n TransportType,\n decodeNumber,\n encodeNumber,\n} from '@nmtjs/common'\nimport { App, SSLApp, type TemplatedApp } from 'uWebSockets.js'\nimport { connectionData } from './providers.ts'\nimport type {\n WsTransportOptions,\n WsTransportSocket,\n WsUserData,\n} from './types.ts'\nimport {\n InternalError,\n getFormat,\n getRequestData,\n send,\n sendMessage,\n sendRpcMessage,\n} from './utils.ts'\n\nexport class WsTransportServer {\n protected server!: TemplatedApp\n protected readonly transportType = TransportType.WS\n\n constructor(\n protected readonly application: ApplicationContext,\n protected readonly options: WsTransportOptions,\n ) {\n this.server = this.options.tls ? SSLApp(options.tls!) : App()\n\n this.server\n .get('/healthy', (res) => {\n // cors\n res.writeHeader('Access-Control-Allow-Origin', '*')\n res.writeHeader('Access-Control-Allow-Headers', 'Content-Type')\n res.writeHeader('Access-Control-Allow-Methods', 'GET')\n res.writeHeader('Content-Type', 'text/plain')\n res.end('OK')\n })\n .ws<WsUserData>('/api', {\n sendPingsAutomatically: true,\n maxPayloadLength: this.options.maxPayloadLength,\n upgrade: (res, req, context) => {\n const requestData = getRequestData(req)\n const container = this.application.container.createScope(\n Scope.Connection,\n )\n const services = requestData.query.getAll('services')\n\n for (const serviceName of services) {\n const service = this.application.registry.services.get(serviceName)\n if (!service)\n throw new Response(`Service ${service} not found`, {\n status: 400,\n })\n if (this.transportType in service.contract.transports === false)\n throw new Response(`Service ${service} not supported`, {\n status: 400,\n })\n }\n\n const data: WsUserData = {\n id: randomUUID(),\n format: getFormat(requestData, this.application.format),\n container,\n streams: {\n up: new Map(),\n down: new Map(),\n streamId: 0,\n },\n abortControllers: new Map(),\n subscriptions: new Map(),\n services,\n data: {\n query: requestData.query,\n headers: requestData.headers,\n proxiedRemoteAddress: Buffer.from(\n res.getProxiedRemoteAddressAsText(),\n ).toString(),\n remoteAddress: Buffer.from(\n res.getRemoteAddressAsText(),\n ).toString(),\n },\n backpressure: null,\n context: {} as any,\n }\n\n res.upgrade(\n data,\n req.getHeader('sec-websocket-key'),\n req.getHeader('sec-websocket-protocol'),\n req.getHeader('sec-websocket-extensions'),\n context,\n )\n },\n open: (ws: WsTransportSocket) => {\n const data = ws.getUserData()\n data.context.decode = this.createDecodeRpcContext(ws)\n data.context.encode = this.createEncodeRpcContext(ws)\n data.container.provide(connectionData, data.data)\n this.application.connections.add({\n id: data.id,\n services: data.services,\n type: this.transportType,\n subscriptions: data.subscriptions,\n sendEvent: (service, event, payload) =>\n sendMessage(ws, MessageType.Event, [service, event, payload]),\n })\n },\n message: async (ws: WsTransportSocket, event) => {\n const buffer = event as unknown as ArrayBuffer\n const messageType = decodeNumber(buffer, 'Uint8')\n if (messageType in this === false) {\n ws.end(1011, 'Unknown message type')\n } else {\n try {\n await this[messageType](\n ws,\n buffer.slice(Uint8Array.BYTES_PER_ELEMENT),\n )\n } catch (error: any) {\n this.logError(error, 'Error while processing message')\n }\n }\n },\n drain: (ws: WsTransportSocket) => {\n const data = ws.getUserData()\n data.backpressure?.resolve()\n data.backpressure = null\n },\n close: (ws: WsTransportSocket) => {\n const data = ws.getUserData()\n\n this.application.connections.remove(data.id)\n const error = new Error('Connection closed')\n\n for (const ac of data.abortControllers.values()) {\n ac.abort(error)\n }\n data.abortControllers.clear()\n\n for (const stream of data.streams.down.values()) {\n stream.destroy(error)\n }\n data.streams.down.clear()\n\n for (const stream of data.streams.up.values()) {\n stream.destroy(error)\n }\n data.streams.up.clear()\n\n for (const subscription of data.subscriptions.values()) {\n subscription.destroy()\n }\n data.subscriptions.clear()\n\n this.handleContainerDisposal(data.container)\n },\n })\n }\n\n async start() {\n return new Promise<void>((resolve, reject) => {\n const hostname = this.options.hostname ?? '127.0.0.1'\n this.server.listen(hostname, this.options.port!, (socket) => {\n if (socket) {\n this.logger.info(\n 'Server started on %s:%s',\n hostname,\n this.options.port!,\n )\n resolve()\n } else {\n reject(new Error('Failed to start server'))\n }\n })\n })\n }\n\n async stop() {\n this.server.close()\n }\n\n protected get api() {\n return this.application.api\n }\n\n protected get logger() {\n return this.application.logger\n }\n\n protected async logError(\n cause: Error,\n message = 'Unknown error while processing request',\n ) {\n this.logger.error(new Error(message, { cause }))\n }\n\n protected handleContainerDisposal(container: Container) {\n container.dispose()\n }\n\n protected async handleRPC(options: {\n connection: Connection\n service: Service\n procedure: AnyProcedure\n container: Container\n signal: AbortSignal\n payload: any\n }) {\n return await this.api.call({\n ...options,\n transport: this.transportType,\n })\n }\n\n protected createEncodeRpcContext(ws: WsTransportSocket): EncodeRpcContext {\n const data = ws.getUserData()\n return {\n addStream: (blob) => {\n const id = ++data.streams.streamId\n const downstream = new ServerDownStream(id, blob)\n downstream.pause()\n downstream.on('error', console.dir)\n downstream.once('error', (err) => {\n console.log({ err })\n if (downstream.errored?.message !== 'Aborted by client')\n send(ws, MessageType.DownStreamAbort, encodeNumber(id, 'Uint32'))\n })\n downstream.on('data', (chunk) => {\n downstream.pause()\n send(\n ws,\n MessageType.DownStreamPush,\n encodeNumber(id, 'Uint32'),\n Buffer.from(chunk).buffer as ArrayBuffer,\n )\n })\n data.streams.down.set(id, downstream)\n return { id, metadata: blob.metadata }\n },\n getStream: (id) => {\n return data.streams.down.get(id)!\n },\n }\n }\n\n protected createDecodeRpcContext(ws: WsTransportSocket) {\n const data = ws.getUserData()\n return {\n addStream(signal: AbortSignal, id: number, metadata: ApiBlobMetadata) {\n const upstream = new ServerUpStream(metadata, {\n read: (size) => {\n send(\n ws,\n MessageType.UpStreamPull,\n encodeNumber(id, 'Uint32'),\n encodeNumber(size, 'Uint32'),\n )\n },\n })\n\n data.streams.up.set(id, upstream)\n onAbort(signal, () => {\n upstream.destroy(new Error('Call aborted by client'))\n })\n upstream.once('error', (error) => {\n if (error.message !== 'Aborted by server')\n send(ws, MessageType.UpStreamAbort, encodeNumber(id, 'Uint32'))\n })\n upstream.once('close', () => {\n if (upstream.errored?.message !== 'Aborted by server')\n send(ws, MessageType.UpStreamEnd, encodeNumber(id, 'Uint32'))\n })\n\n return upstream\n },\n getStream(id) {\n return data.streams.down.get(id)\n },\n }\n }\n\n protected async [MessageType.Rpc](\n ws: WsTransportSocket,\n buffer: ArrayBuffer,\n ) {\n const data = ws.getUserData()\n\n const connection = this.application.connections.get(data.id)\n if (!connection) return void ws.end(1011, 'Unknown connection')\n\n const ac = new AbortController()\n const rpc = data.format.decoder.decodeRpc(buffer, {\n ...data.context.decode,\n addStream: data.context.decode.addStream.bind(null, ac.signal),\n })\n\n data.abortControllers.set(rpc.callId, ac)\n\n const container = data.container.createScope(Scope.Call)\n\n try {\n const { service, procedure } = this.api.find(\n rpc.service,\n rpc.procedure,\n this.transportType,\n )\n\n const response = await this.handleRPC({\n connection,\n service,\n procedure,\n container,\n signal: ac.signal,\n payload: rpc.payload,\n })\n\n if (response instanceof SubscriptionResponse) {\n sendRpcMessage(ws, MessageType.RpcSubscription, {\n callId: rpc.callId,\n error: null,\n payload: [response.subscription.key, response.payload],\n })\n\n response.subscription.on('event', (event, payload) => {\n sendMessage(ws, MessageType.ServerSubscriptionEvent, [\n response.subscription.key,\n event,\n payload,\n ])\n })\n response.subscription.once('end', () => {\n sendMessage(ws, MessageType.ServerUnsubscribe, [\n response.subscription.key,\n ])\n })\n } else {\n sendRpcMessage(ws, MessageType.Rpc, {\n callId: rpc.callId,\n error: null,\n payload: response,\n })\n }\n } catch (error) {\n if (error instanceof ApiError) {\n this.logger.debug(new Error('Api error', { cause: error }))\n sendRpcMessage(ws, MessageType.Rpc, {\n callId: rpc.callId,\n error,\n payload: null,\n })\n } else {\n this.logger.error(new Error('Unexpected error', { cause: error }))\n sendRpcMessage(ws, MessageType.Rpc, {\n callId: rpc.callId,\n error: InternalError(),\n payload: null,\n })\n }\n } finally {\n data.abortControllers.delete(rpc.callId)\n this.handleContainerDisposal(container)\n }\n }\n\n async [MessageType.UpStreamPush](ws: WsTransportSocket, buffer: ArrayBuffer) {\n const data = ws.getUserData()\n const id = decodeNumber(buffer, 'Uint32')\n const stream = data.streams.up.get(id)\n if (!stream) return ws.end(1011, 'Unknown stream')\n stream.push(Buffer.from(buffer.slice(Uint32Array.BYTES_PER_ELEMENT)))\n }\n\n async [MessageType.UpStreamEnd](ws: WsTransportSocket, buffer: ArrayBuffer) {\n const data = ws.getUserData()\n const id = decodeNumber(buffer, 'Uint32')\n const stream = data.streams.up.get(id)\n if (!stream) return ws.end(1011, 'Unknown stream')\n stream.push(null)\n data.streams.up.delete(id)\n }\n\n async [MessageType.UpStreamAbort](\n ws: WsTransportSocket,\n buffer: ArrayBuffer,\n ) {\n const data = ws.getUserData()\n const id = decodeNumber(buffer, 'Uint32')\n const stream = data.streams.up.get(id)\n if (!stream) return ws.end(1011, 'Unknown stream')\n stream.destroy(new Error('Aborted by client'))\n data.streams.up.delete(id)\n }\n\n async [MessageType.DownStreamPull](\n ws: WsTransportSocket,\n buffer: ArrayBuffer,\n ) {\n const data = ws.getUserData()\n const id = decodeNumber(buffer, 'Uint32')\n const stream = data.streams.down.get(id)\n if (!stream) return ws.end(1011, 'Unknown stream')\n await data.backpressure?.promise\n if (stream.readableEnded)\n send(ws, MessageType.DownStreamEnd, encodeNumber(id, 'Uint32'))\n else stream.resume()\n }\n\n async [MessageType.DownStreamEnd](\n ws: WsTransportSocket,\n buffer: ArrayBuffer,\n ) {\n const data = ws.getUserData()\n const id = decodeNumber(buffer, 'Uint32')\n const stream = data.streams.down.get(id)\n if (!stream) return ws.end(1011, 'Unknown stream')\n data.streams.down.delete(id)\n }\n\n async [MessageType.DownStreamAbort](\n ws: WsTransportSocket,\n buffer: ArrayBuffer,\n ) {\n const data = ws.getUserData()\n const id = decodeNumber(buffer, 'Uint32')\n const stream = data.streams.down.get(id)\n if (!stream) return ws.end(1011, 'Unknown stream')\n stream.destroy(new Error('Aborted by client'))\n data.streams.down.delete(id)\n }\n\n async [MessageType.ClientUnsubscribe](\n ws: WsTransportSocket,\n buffer: ArrayBuffer,\n ) {\n const data = ws.getUserData()\n const [key] = data.format.decoder.decode(buffer)\n const subscription = data.subscriptions.get(key)\n if (!subscription) return void ws.end()\n subscription.destroy()\n data.subscriptions.delete(key)\n }\n\n async [MessageType.RpcAbort](ws: WsTransportSocket, buffer: ArrayBuffer) {\n const data = ws.getUserData()\n const callId = decodeNumber(buffer, 'Uint32')\n const ac = data.abortControllers.get(callId)\n if (ac) ac.abort(new Error('Aborted by client'))\n }\n}\n"],"names":["randomUUID","ApiError","Scope","ServerDownStream","ServerUpStream","SubscriptionResponse","onAbort","MessageType","TransportType","decodeNumber","encodeNumber","App","SSLApp","connectionData","InternalError","getFormat","getRequestData","send","sendMessage","sendRpcMessage","WsTransportServer","server","transportType","constructor","application","options","WS","tls","get","res","writeHeader","end","ws","sendPingsAutomatically","maxPayloadLength","upgrade","req","context","requestData","container","createScope","Connection","services","query","getAll","serviceName","service","registry","Response","status","contract","transports","data","id","format","streams","up","Map","down","streamId","abortControllers","subscriptions","headers","proxiedRemoteAddress","Buffer","from","getProxiedRemoteAddressAsText","toString","remoteAddress","getRemoteAddressAsText","backpressure","getHeader","open","getUserData","decode","createDecodeRpcContext","encode","createEncodeRpcContext","provide","connections","add","type","sendEvent","event","payload","Event","message","buffer","messageType","slice","Uint8Array","BYTES_PER_ELEMENT","error","logError","drain","resolve","close","remove","Error","ac","values","abort","clear","stream","destroy","subscription","handleContainerDisposal","start","Promise","reject","hostname","listen","port","socket","logger","info","stop","api","cause","dispose","handleRPC","call","transport","addStream","blob","downstream","pause","on","console","dir","once","err","log","errored","DownStreamAbort","chunk","DownStreamPush","set","metadata","getStream","signal","upstream","read","size","UpStreamPull","UpStreamAbort","UpStreamEnd","Rpc","connection","AbortController","rpc","decoder","decodeRpc","bind","callId","Call","procedure","find","response","RpcSubscription","key","ServerSubscriptionEvent","ServerUnsubscribe","debug","delete","UpStreamPush","push","Uint32Array","DownStreamPull","promise","readableEnded","DownStreamEnd","resume","ClientUnsubscribe","RpcAbort"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../lib/server.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\nimport {\n type AnyProcedure,\n ApiError,\n type ApplicationContext,\n type Connection,\n type Container,\n Scope,\n ServerDownStream,\n ServerUpStream,\n type Service,\n SubscriptionResponse,\n onAbort,\n} from '@nmtjs/application'\nimport {\n type ApiBlobMetadata,\n type EncodeRpcContext,\n MessageType,\n TransportType,\n decodeNumber,\n encodeNumber,\n} from '@nmtjs/common'\nimport { App, SSLApp, type TemplatedApp } from 'uWebSockets.js'\n\nimport { connectionData } from './injectables.ts'\nimport type {\n WsTransportOptions,\n WsTransportSocket,\n WsUserData,\n} from './types.ts'\nimport {\n InternalError,\n getFormat,\n getRequestData,\n send,\n sendMessage,\n sendRpcMessage,\n} from './utils.ts'\n\nexport class WsTransportServer {\n protected server!: TemplatedApp\n protected readonly transportType = TransportType.WS\n\n constructor(\n protected readonly application: ApplicationContext,\n protected readonly options: WsTransportOptions,\n ) {\n this.server = this.options.tls ? SSLApp(options.tls!) : App()\n\n this.server\n .get('/healthy', (res) => {\n // cors\n res.writeHeader('Access-Control-Allow-Origin', '*')\n res.writeHeader('Access-Control-Allow-Headers', 'Content-Type')\n res.writeHeader('Access-Control-Allow-Methods', 'GET')\n res.writeHeader('Content-Type', 'text/plain')\n res.end('OK')\n })\n .ws<WsUserData>('/api', {\n sendPingsAutomatically: true,\n maxPayloadLength: this.options.maxPayloadLength,\n upgrade: (res, req, context) => {\n const requestData = getRequestData(req)\n const container = this.application.container.createScope(\n Scope.Connection,\n )\n const services = requestData.query.getAll('services')\n\n for (const serviceName of services) {\n const service = this.application.registry.services.get(serviceName)\n if (!service)\n throw new Response(`Service ${service} not found`, {\n status: 400,\n })\n if (this.transportType in service.contract.transports === false)\n throw new Response(`Service ${service} not supported`, {\n status: 400,\n })\n }\n\n const data: WsUserData = {\n id: randomUUID(),\n format: getFormat(requestData, this.application.format),\n container,\n streams: {\n up: new Map(),\n down: new Map(),\n streamId: 0,\n },\n abortControllers: new Map(),\n subscriptions: new Map(),\n services,\n data: {\n query: requestData.query,\n headers: requestData.headers,\n proxiedRemoteAddress: Buffer.from(\n res.getProxiedRemoteAddressAsText(),\n ).toString(),\n remoteAddress: Buffer.from(\n res.getRemoteAddressAsText(),\n ).toString(),\n },\n backpressure: null,\n context: {} as any,\n }\n\n res.upgrade(\n data,\n req.getHeader('sec-websocket-key'),\n req.getHeader('sec-websocket-protocol'),\n req.getHeader('sec-websocket-extensions'),\n context,\n )\n },\n open: (ws: WsTransportSocket) => {\n const data = ws.getUserData()\n data.context.decode = this.createDecodeRpcContext(ws)\n data.context.encode = this.createEncodeRpcContext(ws)\n data.container.provide(connectionData, data.data)\n this.application.connections.add({\n id: data.id,\n services: data.services,\n type: this.transportType,\n subscriptions: data.subscriptions,\n sendEvent: (service, event, payload) =>\n sendMessage(ws, MessageType.Event, [service, event, payload]),\n })\n },\n message: async (ws: WsTransportSocket, event) => {\n const buffer = event as unknown as ArrayBuffer\n const messageType = decodeNumber(buffer, 'Uint8')\n if (messageType in this === false) {\n ws.end(1011, 'Unknown message type')\n } else {\n try {\n await this[messageType](\n ws,\n buffer.slice(Uint8Array.BYTES_PER_ELEMENT),\n )\n } catch (error: any) {\n this.logError(error, 'Error while processing message')\n }\n }\n },\n drain: (ws: WsTransportSocket) => {\n const data = ws.getUserData()\n data.backpressure?.resolve()\n data.backpressure = null\n },\n close: (ws: WsTransportSocket) => {\n const data = ws.getUserData()\n\n this.application.connections.remove(data.id)\n const error = new Error('Connection closed')\n\n for (const ac of data.abortControllers.values()) {\n ac.abort(error)\n }\n data.abortControllers.clear()\n\n for (const stream of data.streams.down.values()) {\n stream.destroy(error)\n }\n data.streams.down.clear()\n\n for (const stream of data.streams.up.values()) {\n stream.destroy(error)\n }\n data.streams.up.clear()\n\n for (const subscription of data.subscriptions.values()) {\n subscription.destroy()\n }\n data.subscriptions.clear()\n\n this.handleContainerDisposal(data.container)\n },\n })\n }\n\n async start() {\n return new Promise<void>((resolve, reject) => {\n const hostname = this.options.hostname ?? '127.0.0.1'\n this.server.listen(hostname, this.options.port!, (socket) => {\n if (socket) {\n this.logger.info(\n 'Server started on %s:%s',\n hostname,\n this.options.port!,\n )\n resolve()\n } else {\n reject(new Error('Failed to start server'))\n }\n })\n })\n }\n\n async stop() {\n this.server.close()\n }\n\n protected get api() {\n return this.application.api\n }\n\n protected get logger() {\n return this.application.logger\n }\n\n protected async logError(\n cause: Error,\n message = 'Unknown error while processing request',\n ) {\n this.logger.error(new Error(message, { cause }))\n }\n\n protected handleContainerDisposal(container: Container) {\n container.dispose()\n }\n\n protected async handleRPC(options: {\n connection: Connection\n service: Service\n procedure: AnyProcedure\n container: Container\n signal: AbortSignal\n payload: any\n }) {\n return await this.api.call({\n ...options,\n transport: this.transportType,\n })\n }\n\n protected createEncodeRpcContext(ws: WsTransportSocket): EncodeRpcContext {\n const data = ws.getUserData()\n return {\n addStream: (blob) => {\n const id = ++data.streams.streamId\n const downstream = new ServerDownStream(id, blob)\n downstream.pause()\n downstream.on('error', console.dir)\n downstream.once('error', (err) => {\n console.log({ err })\n if (downstream.errored?.message !== 'Aborted by client')\n send(ws, MessageType.DownStreamAbort, encodeNumber(id, 'Uint32'))\n })\n downstream.on('data', (chunk) => {\n downstream.pause()\n send(\n ws,\n MessageType.DownStreamPush,\n encodeNumber(id, 'Uint32'),\n Buffer.from(chunk).buffer as ArrayBuffer,\n )\n })\n data.streams.down.set(id, downstream)\n return { id, metadata: blob.metadata }\n },\n getStream: (id) => {\n return data.streams.down.get(id)!\n },\n }\n }\n\n protected createDecodeRpcContext(ws: WsTransportSocket) {\n const data = ws.getUserData()\n return {\n addStream(signal: AbortSignal, id: number, metadata: ApiBlobMetadata) {\n const upstream = new ServerUpStream(metadata, {\n read: (size) => {\n send(\n ws,\n MessageType.UpStreamPull,\n encodeNumber(id, 'Uint32'),\n encodeNumber(size, 'Uint32'),\n )\n },\n })\n\n data.streams.up.set(id, upstream)\n onAbort(signal, () => {\n upstream.destroy(new Error('Call aborted by client'))\n })\n upstream.once('error', (error) => {\n if (error.message !== 'Aborted by server')\n send(ws, MessageType.UpStreamAbort, encodeNumber(id, 'Uint32'))\n })\n upstream.once('close', () => {\n if (upstream.errored?.message !== 'Aborted by server')\n send(ws, MessageType.UpStreamEnd, encodeNumber(id, 'Uint32'))\n })\n\n return upstream\n },\n getStream(id) {\n return data.streams.down.get(id)\n },\n }\n }\n\n protected async [MessageType.Rpc](\n ws: WsTransportSocket,\n buffer: ArrayBuffer,\n ) {\n const data = ws.getUserData()\n\n const connection = this.application.connections.get(data.id)\n if (!connection) return void ws.end(1011, 'Unknown connection')\n\n const ac = new AbortController()\n const rpc = data.format.decoder.decodeRpc(buffer, {\n ...data.context.decode,\n addStream: data.context.decode.addStream.bind(null, ac.signal),\n })\n\n data.abortControllers.set(rpc.callId, ac)\n\n const container = data.container.createScope(Scope.Call)\n\n try {\n const { service, procedure } = this.api.find(\n rpc.service,\n rpc.procedure,\n this.transportType,\n )\n\n const response = await this.handleRPC({\n connection,\n service,\n procedure,\n container,\n signal: ac.signal,\n payload: rpc.payload,\n })\n\n if (response instanceof SubscriptionResponse) {\n sendRpcMessage(ws, MessageType.RpcSubscription, {\n callId: rpc.callId,\n error: null,\n payload: [response.subscription.key, response.payload],\n })\n\n response.subscription.on('event', (event, payload) => {\n sendMessage(ws, MessageType.ServerSubscriptionEvent, [\n response.subscription.key,\n event,\n payload,\n ])\n })\n response.subscription.once('end', () => {\n sendMessage(ws, MessageType.ServerUnsubscribe, [\n response.subscription.key,\n ])\n })\n } else {\n sendRpcMessage(ws, MessageType.Rpc, {\n callId: rpc.callId,\n error: null,\n payload: response,\n })\n }\n } catch (error) {\n if (error instanceof ApiError) {\n this.logger.debug(new Error('Api error', { cause: error }))\n sendRpcMessage(ws, MessageType.Rpc, {\n callId: rpc.callId,\n error,\n payload: null,\n })\n } else {\n this.logger.error(new Error('Unexpected error', { cause: error }))\n sendRpcMessage(ws, MessageType.Rpc, {\n callId: rpc.callId,\n error: InternalError(),\n payload: null,\n })\n }\n } finally {\n data.abortControllers.delete(rpc.callId)\n this.handleContainerDisposal(container)\n }\n }\n\n async [MessageType.UpStreamPush](ws: WsTransportSocket, buffer: ArrayBuffer) {\n const data = ws.getUserData()\n const id = decodeNumber(buffer, 'Uint32')\n const stream = data.streams.up.get(id)\n if (!stream) return ws.end(1011, 'Unknown stream')\n stream.push(Buffer.from(buffer.slice(Uint32Array.BYTES_PER_ELEMENT)))\n }\n\n async [MessageType.UpStreamEnd](ws: WsTransportSocket, buffer: ArrayBuffer) {\n const data = ws.getUserData()\n const id = decodeNumber(buffer, 'Uint32')\n const stream = data.streams.up.get(id)\n if (!stream) return ws.end(1011, 'Unknown stream')\n stream.push(null)\n data.streams.up.delete(id)\n }\n\n async [MessageType.UpStreamAbort](\n ws: WsTransportSocket,\n buffer: ArrayBuffer,\n ) {\n const data = ws.getUserData()\n const id = decodeNumber(buffer, 'Uint32')\n const stream = data.streams.up.get(id)\n if (!stream) return ws.end(1011, 'Unknown stream')\n stream.destroy(new Error('Aborted by client'))\n data.streams.up.delete(id)\n }\n\n async [MessageType.DownStreamPull](\n ws: WsTransportSocket,\n buffer: ArrayBuffer,\n ) {\n const data = ws.getUserData()\n const id = decodeNumber(buffer, 'Uint32')\n const stream = data.streams.down.get(id)\n if (!stream) return ws.end(1011, 'Unknown stream')\n await data.backpressure?.promise\n if (stream.readableEnded)\n send(ws, MessageType.DownStreamEnd, encodeNumber(id, 'Uint32'))\n else stream.resume()\n }\n\n async [MessageType.DownStreamEnd](\n ws: WsTransportSocket,\n buffer: ArrayBuffer,\n ) {\n const data = ws.getUserData()\n const id = decodeNumber(buffer, 'Uint32')\n const stream = data.streams.down.get(id)\n if (!stream) return ws.end(1011, 'Unknown stream')\n data.streams.down.delete(id)\n }\n\n async [MessageType.DownStreamAbort](\n ws: WsTransportSocket,\n buffer: ArrayBuffer,\n ) {\n const data = ws.getUserData()\n const id = decodeNumber(buffer, 'Uint32')\n const stream = data.streams.down.get(id)\n if (!stream) return ws.end(1011, 'Unknown stream')\n stream.destroy(new Error('Aborted by client'))\n data.streams.down.delete(id)\n }\n\n async [MessageType.ClientUnsubscribe](\n ws: WsTransportSocket,\n buffer: ArrayBuffer,\n ) {\n const data = ws.getUserData()\n const [key] = data.format.decoder.decode(buffer)\n const subscription = data.subscriptions.get(key)\n if (!subscription) return void ws.end()\n subscription.destroy()\n data.subscriptions.delete(key)\n }\n\n async [MessageType.RpcAbort](ws: WsTransportSocket, buffer: ArrayBuffer) {\n const data = ws.getUserData()\n const callId = decodeNumber(buffer, 'Uint32')\n const ac = data.abortControllers.get(callId)\n if (ac) ac.abort(new Error('Aborted by client'))\n }\n}\n"],"names":["randomUUID","ApiError","Scope","ServerDownStream","ServerUpStream","SubscriptionResponse","onAbort","MessageType","TransportType","decodeNumber","encodeNumber","App","SSLApp","connectionData","InternalError","getFormat","getRequestData","send","sendMessage","sendRpcMessage","WsTransportServer","server","transportType","constructor","application","options","WS","tls","get","res","writeHeader","end","ws","sendPingsAutomatically","maxPayloadLength","upgrade","req","context","requestData","container","createScope","Connection","services","query","getAll","serviceName","service","registry","Response","status","contract","transports","data","id","format","streams","up","Map","down","streamId","abortControllers","subscriptions","headers","proxiedRemoteAddress","Buffer","from","getProxiedRemoteAddressAsText","toString","remoteAddress","getRemoteAddressAsText","backpressure","getHeader","open","getUserData","decode","createDecodeRpcContext","encode","createEncodeRpcContext","provide","connections","add","type","sendEvent","event","payload","Event","message","buffer","messageType","slice","Uint8Array","BYTES_PER_ELEMENT","error","logError","drain","resolve","close","remove","Error","ac","values","abort","clear","stream","destroy","subscription","handleContainerDisposal","start","Promise","reject","hostname","listen","port","socket","logger","info","stop","api","cause","dispose","handleRPC","call","transport","addStream","blob","downstream","pause","on","console","dir","once","err","log","errored","DownStreamAbort","chunk","DownStreamPush","set","metadata","getStream","signal","upstream","read","size","UpStreamPull","UpStreamAbort","UpStreamEnd","Rpc","connection","AbortController","rpc","decoder","decodeRpc","bind","callId","Call","procedure","find","response","RpcSubscription","key","ServerSubscriptionEvent","ServerUnsubscribe","debug","delete","UpStreamPush","push","Uint32Array","DownStreamPull","promise","readableEnded","DownStreamEnd","resume","ClientUnsubscribe","RpcAbort"],"mappings":"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"}
|
package/index.ts
CHANGED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type LazyInjectable,
|
|
3
|
+
type Scope,
|
|
4
|
+
injectables,
|
|
5
|
+
} from '@nmtjs/application'
|
|
6
|
+
import type { WsConnectionData } from './types.ts'
|
|
7
|
+
|
|
8
|
+
export const connectionData = injectables.connectionData as LazyInjectable<
|
|
9
|
+
WsConnectionData,
|
|
10
|
+
Scope.Connection
|
|
11
|
+
>
|
package/lib/server.ts
CHANGED
|
@@ -21,7 +21,8 @@ import {
|
|
|
21
21
|
encodeNumber,
|
|
22
22
|
} from '@nmtjs/common'
|
|
23
23
|
import { App, SSLApp, type TemplatedApp } from 'uWebSockets.js'
|
|
24
|
-
|
|
24
|
+
|
|
25
|
+
import { connectionData } from './injectables.ts'
|
|
25
26
|
import type {
|
|
26
27
|
WsTransportOptions,
|
|
27
28
|
WsTransportSocket,
|
package/package.json
CHANGED
|
@@ -11,12 +11,13 @@
|
|
|
11
11
|
"uWebSockets.js": "github:uNetworking/uWebSockets.js#v20.47.0"
|
|
12
12
|
},
|
|
13
13
|
"peerDependencies": {
|
|
14
|
-
"@nmtjs/application": "^0.
|
|
15
|
-
"@nmtjs/common": "^0.
|
|
14
|
+
"@nmtjs/application": "^0.2.1",
|
|
15
|
+
"@nmtjs/common": "^0.2.1"
|
|
16
16
|
},
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@nmtjs/application": "^0.
|
|
19
|
-
"@nmtjs/common": "^0.
|
|
18
|
+
"@nmtjs/application": "^0.2.1",
|
|
19
|
+
"@nmtjs/common": "^0.2.1",
|
|
20
|
+
"@types/node": "^18.0.0"
|
|
20
21
|
},
|
|
21
22
|
"engines": {
|
|
22
23
|
"node": ">=18.9.0"
|
|
@@ -29,7 +30,7 @@
|
|
|
29
30
|
"LICENSE.md",
|
|
30
31
|
"README.md"
|
|
31
32
|
],
|
|
32
|
-
"version": "0.0
|
|
33
|
+
"version": "0.1.0",
|
|
33
34
|
"scripts": {
|
|
34
35
|
"build": "neemata-build ./index.ts './lib/**/*.ts'",
|
|
35
36
|
"type-check": "tsc --noEmit"
|
package/dist/lib/providers.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../lib/providers.ts"],"sourcesContent":["import { providers } from '@nmtjs/application'\nimport type { WsConnectionData } from './types.ts'\n\nexport const connectionData =\n providers.connectionData.$withType<WsConnectionData>()\n"],"names":["providers","connectionData","$withType"],"mappings":"AAAA,SAASA,SAAS,QAAQ,qBAAoB;AAG9C,OAAO,MAAMC,iBACXD,UAAUC,cAAc,CAACC,SAAS,GAAoB"}
|