@fluojs/websockets 1.0.7 → 2.0.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/README.ko.md +30 -10
- package/README.md +30 -10
- package/dist/bun/bun-service.d.ts +3 -1
- package/dist/bun/bun-service.d.ts.map +1 -1
- package/dist/bun/bun-service.js +75 -26
- package/dist/bun/bun-types.d.ts +15 -4
- package/dist/bun/bun-types.d.ts.map +1 -1
- package/dist/bun.d.ts +2 -1
- package/dist/bun.d.ts.map +1 -1
- package/dist/bun.js +2 -1
- package/dist/cloudflare-workers/cloudflare-workers-service.d.ts +4 -0
- package/dist/cloudflare-workers/cloudflare-workers-service.d.ts.map +1 -1
- package/dist/cloudflare-workers/cloudflare-workers-service.js +108 -33
- package/dist/cloudflare-workers/cloudflare-workers-types.d.ts +2 -2
- package/dist/cloudflare-workers/cloudflare-workers-types.d.ts.map +1 -1
- package/dist/cloudflare-workers.d.ts +2 -1
- package/dist/cloudflare-workers.d.ts.map +1 -1
- package/dist/cloudflare-workers.js +2 -1
- package/dist/decorators.d.ts +2 -2
- package/dist/decorators.d.ts.map +1 -1
- package/dist/decorators.js +4 -4
- package/dist/deno/deno-service.d.ts +4 -0
- package/dist/deno/deno-service.d.ts.map +1 -1
- package/dist/deno/deno-service.js +85 -16
- package/dist/deno/deno-types.d.ts +2 -2
- package/dist/deno/deno-types.d.ts.map +1 -1
- package/dist/deno.d.ts +2 -1
- package/dist/deno.d.ts.map +1 -1
- package/dist/deno.js +2 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/internal/shared.d.ts +6 -3
- package/dist/internal/shared.d.ts.map +1 -1
- package/dist/internal/shared.js +26 -6
- package/dist/internal.d.ts +7 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +6 -0
- package/dist/module.d.ts +1 -1
- package/dist/module.d.ts.map +1 -1
- package/dist/module.js +23 -3
- package/dist/node/node-module.d.ts.map +1 -1
- package/dist/node/node-module.js +6 -2
- package/dist/node/node-service-token.d.ts +20 -0
- package/dist/node/node-service-token.d.ts.map +1 -0
- package/dist/node/node-service-token.js +29 -0
- package/dist/node/node-service.d.ts +5 -3
- package/dist/node/node-service.d.ts.map +1 -1
- package/dist/node/node-service.js +26 -8
- package/dist/node/node-types.d.ts +2 -2
- package/dist/node/node-types.d.ts.map +1 -1
- package/dist/node/node.d.ts +1 -1
- package/dist/node/node.d.ts.map +1 -1
- package/dist/node/node.js +1 -1
- package/dist/node.d.ts +1 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +2 -1
- package/dist/service.d.ts +1 -8
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +1 -8
- package/dist/types.d.ts +26 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +21 -12
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export * from './decorators.js';
|
|
2
2
|
export * from './metadata.js';
|
|
3
3
|
export * from './module.js';
|
|
4
|
-
export * from './service.js';
|
|
5
|
-
export type { WebSocketEventMap, WebSocketGatewayDescriptor, WebSocketGatewayHandlerDescriptor, WebSocketGatewayHandlerMetadata, WebSocketGatewayHandlerType, WebSocketGatewayMetadata, WebSocketGatewayOptions, WebSocketGatewayServerBackedOptions, WebSocketRoomService, WebSocketUpgradeContext, WebSocketUpgradeRejection, } from './types.js';
|
|
6
4
|
export type { TypedOnMessageHandler, WebSocketGatewayContext, WebSocketModuleOptions, WebSocketUpgradeGuard, } from './node/node-types.js';
|
|
5
|
+
export * from './service.js';
|
|
6
|
+
export type { WebSocketEventEnvelope, WebSocketEventMap, WebSocketGatewayDescriptor, WebSocketGatewayHandlerDescriptor, WebSocketGatewayHandlerMetadata, WebSocketGatewayHandlerType, WebSocketGatewayMetadata, WebSocketGatewayOptions, WebSocketGatewayServerBackedOptions, WebSocketReplyMode, WebSocketRoomService, WebSocketUpgradeContext, WebSocketUpgradeRejection, } from './types.js';
|
|
7
7
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,YAAY,EACV,iBAAiB,EACjB,0BAA0B,EAC1B,iCAAiC,EACjC,+BAA+B,EAC/B,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,mCAAmC,EACnC,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,YAAY,CAAC
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,YAAY,EACV,qBAAqB,EACrB,uBAAuB,EACvB,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,sBAAsB,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,YAAY,EACV,sBAAsB,EACtB,iBAAiB,EACjB,0BAA0B,EAC1B,iCAAiC,EACjC,+BAA+B,EAC/B,2BAA2B,EAC3B,wBAAwB,EACxB,uBAAuB,EACvB,mCAAmC,EACnC,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,yBAAyB,GAC1B,MAAM,YAAY,CAAC"}
|
|
@@ -2,7 +2,7 @@ import type { Token } from '@fluojs/core';
|
|
|
2
2
|
import type { Container } from '@fluojs/di';
|
|
3
3
|
import type { FetchStyleHttpAdapterRealtimeCapability, HttpApplicationAdapter } from '@fluojs/http';
|
|
4
4
|
import type { ApplicationLogger, CompiledModule } from '@fluojs/runtime';
|
|
5
|
-
import type { WebSocketGatewayDescriptor, WebSocketGatewayHandlerDescriptor } from '../types.js';
|
|
5
|
+
import type { WebSocketGatewayDescriptor, WebSocketGatewayHandlerDescriptor, WebSocketReplyMode } from '../types.js';
|
|
6
6
|
/**
|
|
7
7
|
* Describes the discovery candidate contract.
|
|
8
8
|
*/
|
|
@@ -98,11 +98,14 @@ export declare function resolveGatewayInstance(runtimeContainer: Container, desc
|
|
|
98
98
|
* @param socket The socket.
|
|
99
99
|
* @param request The request.
|
|
100
100
|
* @param data The data.
|
|
101
|
+
* @param socketId Stable connection identity passed to message handlers.
|
|
102
|
+
* @param replyMode Optional policy for serializing valid handler return envelopes.
|
|
103
|
+
* @param sendReply Runtime-owned reply sender that reports terminal send failures.
|
|
101
104
|
* @param logger The logger.
|
|
102
105
|
* @param loggerContext The logger context.
|
|
103
|
-
* @returns
|
|
106
|
+
* @returns `terminal` when reply delivery failed; otherwise `completed`.
|
|
104
107
|
*/
|
|
105
|
-
export declare function dispatchGatewayMessage<TSocket, TRequest>(resolved: readonly ResolvedGatewayInstance[], socket: TSocket, request: TRequest, data: SharedWebSocketIncomingMessage, logger: ApplicationLogger, loggerContext: string): Promise<
|
|
108
|
+
export declare function dispatchGatewayMessage<TSocket, TRequest>(resolved: readonly ResolvedGatewayInstance[], socket: TSocket, request: TRequest, data: SharedWebSocketIncomingMessage, socketId: string, replyMode: WebSocketReplyMode | undefined, sendReply: (message: string) => boolean, logger: ApplicationLogger, loggerContext: string): Promise<'completed' | 'terminal'>;
|
|
106
109
|
/**
|
|
107
110
|
* Dispatch gateway disconnect.
|
|
108
111
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/internal/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAuB,KAAK,EAAE,MAAM,cAAc,CAAC;AAE/D,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,uCAAuC,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACpG,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAGzE,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"shared.d.ts","sourceRoot":"","sources":["../../src/internal/shared.ts"],"names":[],"mappings":"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"}
|
package/dist/internal/shared.js
CHANGED
|
@@ -179,27 +179,46 @@ export async function resolveGatewayInstance(runtimeContainer, descriptor, logge
|
|
|
179
179
|
* @param socket The socket.
|
|
180
180
|
* @param request The request.
|
|
181
181
|
* @param data The data.
|
|
182
|
+
* @param socketId Stable connection identity passed to message handlers.
|
|
183
|
+
* @param replyMode Optional policy for serializing valid handler return envelopes.
|
|
184
|
+
* @param sendReply Runtime-owned reply sender that reports terminal send failures.
|
|
182
185
|
* @param logger The logger.
|
|
183
186
|
* @param loggerContext The logger context.
|
|
184
|
-
* @returns
|
|
187
|
+
* @returns `terminal` when reply delivery failed; otherwise `completed`.
|
|
185
188
|
*/
|
|
186
|
-
export async function dispatchGatewayMessage(resolved, socket, request, data, logger, loggerContext) {
|
|
189
|
+
export async function dispatchGatewayMessage(resolved, socket, request, data, socketId, replyMode, sendReply, logger, loggerContext) {
|
|
187
190
|
const parsed = parseIncomingMessage(data);
|
|
188
191
|
for (const {
|
|
189
192
|
descriptor,
|
|
190
193
|
instance
|
|
191
194
|
} of resolved) {
|
|
192
195
|
for (const handler of descriptor.wildcardMessageHandlers) {
|
|
193
|
-
await invokeGatewayMethod(instance, descriptor, handler, [parsed.payload, socket, request], logger, loggerContext);
|
|
196
|
+
const result = await invokeGatewayMethod(instance, descriptor, handler, [parsed.payload, socket, request, socketId], logger, loggerContext);
|
|
197
|
+
if (!sendHandlerReply(result, replyMode, sendReply)) {
|
|
198
|
+
return 'terminal';
|
|
199
|
+
}
|
|
194
200
|
}
|
|
195
201
|
if (parsed.event === undefined) {
|
|
196
202
|
continue;
|
|
197
203
|
}
|
|
198
204
|
const eventHandlers = descriptor.messageHandlersByEvent.get(parsed.event) ?? [];
|
|
199
205
|
for (const handler of eventHandlers) {
|
|
200
|
-
await invokeGatewayMethod(instance, descriptor, handler, [parsed.payload, socket, request], logger, loggerContext);
|
|
206
|
+
const result = await invokeGatewayMethod(instance, descriptor, handler, [parsed.payload, socket, request, socketId], logger, loggerContext);
|
|
207
|
+
if (!sendHandlerReply(result, replyMode, sendReply)) {
|
|
208
|
+
return 'terminal';
|
|
209
|
+
}
|
|
201
210
|
}
|
|
202
211
|
}
|
|
212
|
+
return 'completed';
|
|
213
|
+
}
|
|
214
|
+
function sendHandlerReply(result, replyMode, sendReply) {
|
|
215
|
+
if (replyMode !== 'event-envelope' || !isWebSocketEventEnvelope(result)) {
|
|
216
|
+
return true;
|
|
217
|
+
}
|
|
218
|
+
return sendReply(JSON.stringify(result));
|
|
219
|
+
}
|
|
220
|
+
function isWebSocketEventEnvelope(value) {
|
|
221
|
+
return typeof value === 'object' && value !== null && 'event' in value && typeof value.event === 'string';
|
|
203
222
|
}
|
|
204
223
|
|
|
205
224
|
/**
|
|
@@ -244,12 +263,13 @@ async function invokeGatewayMethod(instance, descriptor, handler, args, logger,
|
|
|
244
263
|
const value = instance[handler.methodKey];
|
|
245
264
|
if (typeof value !== 'function') {
|
|
246
265
|
logger.warn(`WebSocket gateway handler ${descriptor.targetName}.${handler.methodName} is not callable and was skipped.`, loggerContext);
|
|
247
|
-
return;
|
|
266
|
+
return undefined;
|
|
248
267
|
}
|
|
249
268
|
try {
|
|
250
|
-
await Promise.resolve(value.call(instance, ...args));
|
|
269
|
+
return await Promise.resolve(value.call(instance, ...args));
|
|
251
270
|
} catch (error) {
|
|
252
271
|
logger.error(`WebSocket gateway handler ${descriptor.targetName}.${handler.methodName} failed.`, error, loggerContext);
|
|
272
|
+
return undefined;
|
|
253
273
|
}
|
|
254
274
|
}
|
|
255
275
|
function discoveryCandidates(compiledModules) {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework-internal gateway discovery and dispatch primitives shared by protocol adapters.
|
|
3
|
+
*
|
|
4
|
+
* @internal
|
|
5
|
+
*/
|
|
6
|
+
export { discoverGatewayDescriptors, resolveGatewayInstance, type ResolvedGatewayInstance, } from './internal/shared.js';
|
|
7
|
+
//# sourceMappingURL=internal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../src/internal.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACL,0BAA0B,EAC1B,sBAAsB,EACtB,KAAK,uBAAuB,GAC7B,MAAM,sBAAsB,CAAC"}
|
package/dist/internal.js
ADDED
package/dist/module.d.ts
CHANGED
|
@@ -8,7 +8,7 @@ export declare class WebSocketModule {
|
|
|
8
8
|
* Creates a module definition backed by the default Node.js WebSocket runtime.
|
|
9
9
|
*
|
|
10
10
|
* @param options WebSocket adapter options shared with the runtime lifecycle service.
|
|
11
|
-
* @returns A runtime module definition that
|
|
11
|
+
* @returns A runtime module definition that lazily binds the Node.js lifecycle implementation.
|
|
12
12
|
*
|
|
13
13
|
* @example
|
|
14
14
|
* ```ts
|
package/dist/module.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../src/module.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAqC,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGrF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAInE;;GAEG;AACH,qBAAa,eAAe;IAC1B;;;;;;;;;;;;;;;;OAgBG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,sBAA2B,GAAG,UAAU;CAkCjE"}
|
package/dist/module.js
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { defineModule } from '@fluojs/runtime';
|
|
2
|
+
import { APPLICATION_LOGGER, COMPILED_MODULES, HTTP_APPLICATION_ADAPTER, RUNTIME_CONTAINER } from '@fluojs/runtime/internal';
|
|
3
|
+
import { WEBSOCKET_OPTIONS_INTERNAL } from './options-token.internal.js';
|
|
4
|
+
import { WebSocketGatewayLifecycleService } from './service.js';
|
|
5
|
+
|
|
2
6
|
/**
|
|
3
7
|
* Root module entry point that defaults to the Node.js WebSocket adapter.
|
|
4
8
|
*/
|
|
@@ -7,7 +11,7 @@ export class WebSocketModule {
|
|
|
7
11
|
* Creates a module definition backed by the default Node.js WebSocket runtime.
|
|
8
12
|
*
|
|
9
13
|
* @param options WebSocket adapter options shared with the runtime lifecycle service.
|
|
10
|
-
* @returns A runtime module definition that
|
|
14
|
+
* @returns A runtime module definition that lazily binds the Node.js lifecycle implementation.
|
|
11
15
|
*
|
|
12
16
|
* @example
|
|
13
17
|
* ```ts
|
|
@@ -21,6 +25,22 @@ export class WebSocketModule {
|
|
|
21
25
|
* ```
|
|
22
26
|
*/
|
|
23
27
|
static forRoot(options = {}) {
|
|
24
|
-
|
|
28
|
+
class WebSocketRuntimeModule extends WebSocketModule {}
|
|
29
|
+
return defineModule(WebSocketRuntimeModule, {
|
|
30
|
+
providers: [{
|
|
31
|
+
provide: WEBSOCKET_OPTIONS_INTERNAL,
|
|
32
|
+
useValue: options
|
|
33
|
+
}, {
|
|
34
|
+
inject: [RUNTIME_CONTAINER, COMPILED_MODULES, APPLICATION_LOGGER, HTTP_APPLICATION_ADAPTER, WEBSOCKET_OPTIONS_INTERNAL],
|
|
35
|
+
provide: WebSocketGatewayLifecycleService,
|
|
36
|
+
useFactory: async (...deps) => {
|
|
37
|
+
const [runtimeContainer, compiledModules, logger, adapter, moduleOptions] = deps;
|
|
38
|
+
const {
|
|
39
|
+
NodeWebSocketGatewayLifecycleServiceImplementation
|
|
40
|
+
} = await import('./node/node-service.js');
|
|
41
|
+
return new NodeWebSocketGatewayLifecycleServiceImplementation(runtimeContainer, compiledModules, logger, adapter, moduleOptions);
|
|
42
|
+
}
|
|
43
|
+
}]
|
|
44
|
+
});
|
|
25
45
|
}
|
|
26
46
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-module.d.ts","sourceRoot":"","sources":["../../src/node/node-module.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"node-module.d.ts","sourceRoot":"","sources":["../../src/node/node-module.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAKhE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAe9D;;GAEG;AACH,qBAAa,mBAAmB;IAC9B;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,sBAA2B,GAAG,UAAU;CAOjE"}
|
package/dist/node/node-module.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
import { defineModule } from '@fluojs/runtime';
|
|
2
2
|
import { WEBSOCKET_OPTIONS_INTERNAL } from '../options-token.internal.js';
|
|
3
|
-
import {
|
|
3
|
+
import { NodeWebSocketGatewayLifecycleServiceImplementation } from './node-service.js';
|
|
4
|
+
import { NodeWebSocketGatewayLifecycleService } from './node-service-token.js';
|
|
4
5
|
function createNodeWebSocketProviders(options = {}) {
|
|
5
6
|
return [{
|
|
6
7
|
provide: WEBSOCKET_OPTIONS_INTERNAL,
|
|
7
8
|
useValue: options
|
|
8
|
-
},
|
|
9
|
+
}, {
|
|
10
|
+
provide: NodeWebSocketGatewayLifecycleService,
|
|
11
|
+
useClass: NodeWebSocketGatewayLifecycleServiceImplementation
|
|
12
|
+
}];
|
|
9
13
|
}
|
|
10
14
|
|
|
11
15
|
/**
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { WebSocketRoomService } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Lifecycle-service token for the default Node.js-backed websocket runtime.
|
|
4
|
+
*
|
|
5
|
+
* @remarks
|
|
6
|
+
* The root `WebSocketGatewayLifecycleService` export is an alias of this token. Runtime modules bind this
|
|
7
|
+
* token to the Node.js lifecycle implementation lazily during provider resolution so root-package imports
|
|
8
|
+
* preserve token identity without eagerly loading Node-only `node:*` or `ws` implementation modules.
|
|
9
|
+
*/
|
|
10
|
+
export declare class NodeWebSocketGatewayLifecycleService implements WebSocketRoomService {
|
|
11
|
+
/** @inheritdoc */
|
|
12
|
+
joinRoom(_socketId: string, _room: string): void;
|
|
13
|
+
/** @inheritdoc */
|
|
14
|
+
leaveRoom(_socketId: string, _room: string): void;
|
|
15
|
+
/** @inheritdoc */
|
|
16
|
+
broadcastToRoom(_room: string, _event: string, _data: unknown): void;
|
|
17
|
+
/** @inheritdoc */
|
|
18
|
+
getRooms(_socketId: string): ReadonlySet<string>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=node-service-token.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-service-token.d.ts","sourceRoot":"","sources":["../../src/node/node-service-token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAExD;;;;;;;GAOG;AACH,qBAAa,oCAAqC,YAAW,oBAAoB;IAC/E,kBAAkB;IAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIhD,kBAAkB;IAClB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIjD,kBAAkB;IAClB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAIpE,kBAAkB;IAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;CAGjD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lifecycle-service token for the default Node.js-backed websocket runtime.
|
|
3
|
+
*
|
|
4
|
+
* @remarks
|
|
5
|
+
* The root `WebSocketGatewayLifecycleService` export is an alias of this token. Runtime modules bind this
|
|
6
|
+
* token to the Node.js lifecycle implementation lazily during provider resolution so root-package imports
|
|
7
|
+
* preserve token identity without eagerly loading Node-only `node:*` or `ws` implementation modules.
|
|
8
|
+
*/
|
|
9
|
+
export class NodeWebSocketGatewayLifecycleService {
|
|
10
|
+
/** @inheritdoc */
|
|
11
|
+
joinRoom(_socketId, _room) {
|
|
12
|
+
throw new Error('NodeWebSocketGatewayLifecycleService is a runtime provider token and must be resolved from DI.');
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** @inheritdoc */
|
|
16
|
+
leaveRoom(_socketId, _room) {
|
|
17
|
+
throw new Error('NodeWebSocketGatewayLifecycleService is a runtime provider token and must be resolved from DI.');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** @inheritdoc */
|
|
21
|
+
broadcastToRoom(_room, _event, _data) {
|
|
22
|
+
throw new Error('NodeWebSocketGatewayLifecycleService is a runtime provider token and must be resolved from DI.');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** @inheritdoc */
|
|
26
|
+
getRooms(_socketId) {
|
|
27
|
+
throw new Error('NodeWebSocketGatewayLifecycleService is a runtime provider token and must be resolved from DI.');
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import type { Container } from '@fluojs/di';
|
|
2
|
-
import type { ApplicationLogger, CompiledModule, OnApplicationBootstrap, OnApplicationShutdown, OnModuleDestroy } from '@fluojs/runtime';
|
|
3
2
|
import type { HttpApplicationAdapter } from '@fluojs/http';
|
|
3
|
+
import type { ApplicationLogger, CompiledModule, OnApplicationBootstrap, OnApplicationShutdown, OnModuleDestroy } from '@fluojs/runtime';
|
|
4
4
|
import type { WebSocketRoomService } from '../types.js';
|
|
5
|
+
import { NodeWebSocketGatewayLifecycleService } from './node-service-token.js';
|
|
5
6
|
import type { WebSocketModuleOptions } from './node-types.js';
|
|
6
7
|
/**
|
|
7
8
|
* Lifecycle service that discovers WebSocket gateways, attaches upgrade listeners, and manages room state.
|
|
@@ -10,7 +11,7 @@ import type { WebSocketModuleOptions } from './node-types.js';
|
|
|
10
11
|
* This service preserves the documented runtime behavior for shared-path discovery order, optional server-backed
|
|
11
12
|
* listeners, buffered pre-ready events, heartbeat handling, and graceful shutdown.
|
|
12
13
|
*/
|
|
13
|
-
export declare class NodeWebSocketGatewayLifecycleService implements OnApplicationBootstrap, OnApplicationShutdown, OnModuleDestroy, WebSocketRoomService {
|
|
14
|
+
export declare class NodeWebSocketGatewayLifecycleServiceImplementation extends NodeWebSocketGatewayLifecycleService implements OnApplicationBootstrap, OnApplicationShutdown, OnModuleDestroy, WebSocketRoomService {
|
|
14
15
|
private readonly runtimeContainer;
|
|
15
16
|
private readonly compiledModules;
|
|
16
17
|
private readonly logger;
|
|
@@ -104,7 +105,8 @@ export declare class NodeWebSocketGatewayLifecycleService implements OnApplicati
|
|
|
104
105
|
private closeGatewayAttachment;
|
|
105
106
|
private clearConnectionTrackingState;
|
|
106
107
|
/**
|
|
107
|
-
* Adds one socket to an in-memory room membership set.
|
|
108
|
+
* Adds one currently open, runtime-registered socket to an in-memory room membership set.
|
|
109
|
+
* Unknown or already closed socket identifiers are ignored.
|
|
108
110
|
*
|
|
109
111
|
* @param socketId Socket identifier to add.
|
|
110
112
|
* @param room Room identifier to join.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-service.d.ts","sourceRoot":"","sources":["../../src/node/node-service.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"node-service.d.ts","sourceRoot":"","sources":["../../src/node/node-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,8 +9,9 @@ import { createServer as createHttpServer } from 'node:http';
|
|
|
9
9
|
import { Inject } from '@fluojs/core';
|
|
10
10
|
import { APPLICATION_LOGGER, COMPILED_MODULES, HTTP_APPLICATION_ADAPTER, RUNTIME_CONTAINER } from '@fluojs/runtime/internal';
|
|
11
11
|
import { WebSocket, WebSocketServer } from 'ws';
|
|
12
|
-
import { dispatchGatewayDisconnect, dispatchGatewayMessage,
|
|
12
|
+
import { discoverGatewayDescriptors, dispatchGatewayDisconnect, dispatchGatewayMessage, isFinitePositiveInteger, normalizeGatewayPath, resolveGatewayInstance, runGatewayHandlers } from '../internal/shared.js';
|
|
13
13
|
import { WEBSOCKET_OPTIONS_INTERNAL } from '../options-token.internal.js';
|
|
14
|
+
import { NodeWebSocketGatewayLifecycleService } from './node-service-token.js';
|
|
14
15
|
function resolveHttpStatusText(status) {
|
|
15
16
|
switch (status) {
|
|
16
17
|
case 400:
|
|
@@ -128,9 +129,9 @@ function createCompletionSignal() {
|
|
|
128
129
|
* listeners, buffered pre-ready events, heartbeat handling, and graceful shutdown.
|
|
129
130
|
*/
|
|
130
131
|
let _NodeWebSocketGateway;
|
|
131
|
-
class NodeWebSocketGatewayLifecycleService {
|
|
132
|
+
class NodeWebSocketGatewayLifecycleServiceImplementation extends NodeWebSocketGatewayLifecycleService {
|
|
132
133
|
static {
|
|
133
|
-
[_NodeWebSocketGateway, _initClass] = _applyDecs(this, [Inject(RUNTIME_CONTAINER, COMPILED_MODULES, APPLICATION_LOGGER, HTTP_APPLICATION_ADAPTER, WEBSOCKET_OPTIONS_INTERNAL)], []).c;
|
|
134
|
+
[_NodeWebSocketGateway, _initClass] = _applyDecs(this, [Inject(RUNTIME_CONTAINER, COMPILED_MODULES, APPLICATION_LOGGER, HTTP_APPLICATION_ADAPTER, WEBSOCKET_OPTIONS_INTERNAL)], [], 0, void 0, NodeWebSocketGatewayLifecycleService).c;
|
|
134
135
|
}
|
|
135
136
|
attachments = [];
|
|
136
137
|
heartbeatTimer;
|
|
@@ -148,6 +149,7 @@ class NodeWebSocketGatewayLifecycleService {
|
|
|
148
149
|
upgradeListener;
|
|
149
150
|
upgradeServer;
|
|
150
151
|
constructor(runtimeContainer, compiledModules, logger, adapter, moduleOptions) {
|
|
152
|
+
super();
|
|
151
153
|
this.runtimeContainer = runtimeContainer;
|
|
152
154
|
this.compiledModules = compiledModules;
|
|
153
155
|
this.logger = logger;
|
|
@@ -327,6 +329,14 @@ class NodeWebSocketGatewayLifecycleService {
|
|
|
327
329
|
rejectUpgradeRequestWithStatus(socket, rejection);
|
|
328
330
|
return;
|
|
329
331
|
}
|
|
332
|
+
if (this.isShuttingDown) {
|
|
333
|
+
this.releaseUpgradeReservation();
|
|
334
|
+
rejectUpgradeRequestWithStatus(socket, {
|
|
335
|
+
body: 'WebSocket server is shutting down.',
|
|
336
|
+
status: 503
|
|
337
|
+
});
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
330
340
|
try {
|
|
331
341
|
attachment.server.handleUpgrade(request, socket, head, websocket => {
|
|
332
342
|
attachment.server.emit('connection', websocket, request);
|
|
@@ -483,12 +493,15 @@ class NodeWebSocketGatewayLifecycleService {
|
|
|
483
493
|
if (nextMessage === undefined) {
|
|
484
494
|
continue;
|
|
485
495
|
}
|
|
486
|
-
await this.handleMessage(state.resolved, socket, request, nextMessage);
|
|
496
|
+
await this.handleMessage(state.resolved, socket, request, nextMessage, state.socketId);
|
|
487
497
|
}
|
|
488
498
|
this.clearQueuedMessages(state);
|
|
489
499
|
}
|
|
490
|
-
async handleMessage(resolved, socket, request, data) {
|
|
491
|
-
await dispatchGatewayMessage(resolved, socket, request, data, this.
|
|
500
|
+
async handleMessage(resolved, socket, request, data, socketId) {
|
|
501
|
+
await dispatchGatewayMessage(resolved, socket, request, data, socketId, this.moduleOptions.replies?.mode, message => {
|
|
502
|
+
socket.send(message);
|
|
503
|
+
return true;
|
|
504
|
+
}, this.logger, 'WebSocketGatewayLifecycleService');
|
|
492
505
|
}
|
|
493
506
|
enqueueDisconnectDispatch(state, socket, disconnectEvent) {
|
|
494
507
|
state.handlerQueue = state.handlerQueue.then(async () => {
|
|
@@ -926,12 +939,17 @@ class NodeWebSocketGatewayLifecycleService {
|
|
|
926
939
|
}
|
|
927
940
|
|
|
928
941
|
/**
|
|
929
|
-
* Adds one socket to an in-memory room membership set.
|
|
942
|
+
* Adds one currently open, runtime-registered socket to an in-memory room membership set.
|
|
943
|
+
* Unknown or already closed socket identifiers are ignored.
|
|
930
944
|
*
|
|
931
945
|
* @param socketId Socket identifier to add.
|
|
932
946
|
* @param room Room identifier to join.
|
|
933
947
|
*/
|
|
934
948
|
joinRoom(socketId, room) {
|
|
949
|
+
const socket = this.socketRegistry.get(socketId);
|
|
950
|
+
if (!socket || socket.readyState !== WebSocket.OPEN) {
|
|
951
|
+
return;
|
|
952
|
+
}
|
|
935
953
|
let rooms = this.socketRooms.get(socketId);
|
|
936
954
|
if (!rooms) {
|
|
937
955
|
rooms = new Set();
|
|
@@ -1075,7 +1093,7 @@ class NodeWebSocketGatewayLifecycleService {
|
|
|
1075
1093
|
_initClass();
|
|
1076
1094
|
}
|
|
1077
1095
|
}
|
|
1078
|
-
export { _NodeWebSocketGateway as
|
|
1096
|
+
export { _NodeWebSocketGateway as NodeWebSocketGatewayLifecycleServiceImplementation };
|
|
1079
1097
|
function createOwnedGatewayServer() {
|
|
1080
1098
|
return createHttpServer((_request, response) => {
|
|
1081
1099
|
response.statusCode = 404;
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type { IncomingMessage } from 'node:http';
|
|
2
2
|
import type { WebSocket } from 'ws';
|
|
3
|
-
import type { WebSocketModuleOptions as SharedWebSocketModuleOptions,
|
|
3
|
+
import type { WebSocketModuleOptions as SharedWebSocketModuleOptions, WebSocketUpgradeGuard as SharedWebSocketUpgradeGuard, WebSocketUpgradeContext, WebSocketUpgradeRejection } from '../types.js';
|
|
4
4
|
/**
|
|
5
5
|
* Strongly typed message handler signature for the Node websocket runtime.
|
|
6
6
|
*/
|
|
7
|
-
export type TypedOnMessageHandler<TEvents extends Record<string, unknown>, K extends keyof TEvents> = (
|
|
7
|
+
export type TypedOnMessageHandler<TEvents extends Record<string, unknown>, K extends keyof TEvents> = import('../types.js').TypedOnMessageHandler<TEvents, K, WebSocket, IncomingMessage>;
|
|
8
8
|
/**
|
|
9
9
|
* Request and socket context passed to Node websocket gateway handlers.
|
|
10
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-types.d.ts","sourceRoot":"","sources":["../../src/node/node-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,OAAO,KAAK,EACV,sBAAsB,IAAI,4BAA4B,EACtD,
|
|
1
|
+
{"version":3,"file":"node-types.d.ts","sourceRoot":"","sources":["../../src/node/node-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAEpC,OAAO,KAAK,EACV,sBAAsB,IAAI,4BAA4B,EACtD,qBAAqB,IAAI,2BAA2B,EACpD,uBAAuB,EACvB,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,MAAM,MAAM,qBAAqB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,MAAM,OAAO,IAAI,OAAO,aAAa,EAAE,qBAAqB,CAC/I,OAAO,EACP,CAAC,EACD,SAAS,EACT,eAAe,CAChB,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,eAAe,CAAC;IACzB,MAAM,EAAE,SAAS,CAAC;CACnB;AAED,YAAY,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,CAAC;AAEnE;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,2BAA2B,CAAC,eAAe,CAAC,CAAC;AAEjF;;GAEG;AACH,MAAM,MAAM,sBAAsB,GAAG,4BAA4B,CAAC,eAAe,CAAC,CAAC"}
|
package/dist/node/node.d.ts
CHANGED
package/dist/node/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/node/node.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/node/node.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,yBAAyB,CAAC;AACxC,cAAc,iBAAiB,CAAC"}
|
package/dist/node/node.js
CHANGED
package/dist/node.d.ts
CHANGED
package/dist/node.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../src/node.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/node.js
CHANGED
package/dist/service.d.ts
CHANGED
|
@@ -1,9 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
* Root export alias for the default Node.js-backed websocket lifecycle service.
|
|
3
|
-
*
|
|
4
|
-
* @remarks
|
|
5
|
-
* Import this alias from `@fluojs/websockets` when you need the shared lifecycle service token without reaching
|
|
6
|
-
* into runtime-specific subpaths.
|
|
7
|
-
*/
|
|
8
|
-
export { NodeWebSocketGatewayLifecycleService as WebSocketGatewayLifecycleService } from './node/node-service.js';
|
|
1
|
+
export { NodeWebSocketGatewayLifecycleService as WebSocketGatewayLifecycleService } from './node/node-service-token.js';
|
|
9
2
|
//# sourceMappingURL=service.d.ts.map
|
package/dist/service.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../src/service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oCAAoC,IAAI,gCAAgC,EAAE,MAAM,8BAA8B,CAAC"}
|
package/dist/service.js
CHANGED
|
@@ -1,8 +1 @@
|
|
|
1
|
-
|
|
2
|
-
* Root export alias for the default Node.js-backed websocket lifecycle service.
|
|
3
|
-
*
|
|
4
|
-
* @remarks
|
|
5
|
-
* Import this alias from `@fluojs/websockets` when you need the shared lifecycle service token without reaching
|
|
6
|
-
* into runtime-specific subpaths.
|
|
7
|
-
*/
|
|
8
|
-
export { NodeWebSocketGatewayLifecycleService as WebSocketGatewayLifecycleService } from './node/node-service.js';
|
|
1
|
+
export { NodeWebSocketGatewayLifecycleService as WebSocketGatewayLifecycleService } from './node/node-service-token.js';
|
package/dist/types.d.ts
CHANGED
|
@@ -3,6 +3,19 @@ import type { MetadataPropertyKey, Token } from '@fluojs/core';
|
|
|
3
3
|
* Event-name-to-payload map used to type `@OnMessage(...)` handlers.
|
|
4
4
|
*/
|
|
5
5
|
export type WebSocketEventMap = Record<string, unknown>;
|
|
6
|
+
/**
|
|
7
|
+
* Event envelope that a message handler can return when event-envelope replies are enabled.
|
|
8
|
+
*/
|
|
9
|
+
export interface WebSocketEventEnvelope {
|
|
10
|
+
/** Reply payload sent as the envelope `data` field. */
|
|
11
|
+
data?: unknown;
|
|
12
|
+
/** Reply event name sent as the envelope `event` field. */
|
|
13
|
+
event: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Opt-in policy for processing message handler return values.
|
|
17
|
+
*/
|
|
18
|
+
export type WebSocketReplyMode = 'event-envelope';
|
|
6
19
|
/**
|
|
7
20
|
* Runtime-neutral message handler signature resolved from one {@link WebSocketEventMap} entry.
|
|
8
21
|
*
|
|
@@ -10,8 +23,13 @@ export type WebSocketEventMap = Record<string, unknown>;
|
|
|
10
23
|
* @typeParam K Event key handled by this callback.
|
|
11
24
|
* @typeParam TSocket Socket shape surfaced by the selected runtime subpath.
|
|
12
25
|
* @typeParam TRequest Request shape surfaced by the selected runtime subpath.
|
|
26
|
+
* @param payload Parsed payload for the decorated event.
|
|
27
|
+
* @param socket Accepted runtime socket.
|
|
28
|
+
* @param request Upgrade request associated with the connection.
|
|
29
|
+
* @param socketId Stable connection identity used by room operations.
|
|
30
|
+
* @returns An optional event envelope. Returns are ignored unless `replies.mode` is `event-envelope`.
|
|
13
31
|
*/
|
|
14
|
-
export type TypedOnMessageHandler<TEvents extends WebSocketEventMap, K extends keyof TEvents, TSocket = unknown, TRequest = Request> = (payload: TEvents[K], socket: TSocket, request: TRequest) => void |
|
|
32
|
+
export type TypedOnMessageHandler<TEvents extends WebSocketEventMap, K extends keyof TEvents, TSocket = unknown, TRequest = Request> = (payload: TEvents[K], socket: TSocket, request: TRequest, socketId: string) => Promise<WebSocketEventEnvelope | void> | WebSocketEventEnvelope | void;
|
|
15
33
|
/**
|
|
16
34
|
* Dedicated listener configuration for runtimes that can host a standalone WebSocket server.
|
|
17
35
|
*/
|
|
@@ -131,7 +149,8 @@ export type WebSocketUpgradeGuard<TRequest = Request> = (request: TRequest, cont
|
|
|
131
149
|
*/
|
|
132
150
|
export interface WebSocketRoomService {
|
|
133
151
|
/**
|
|
134
|
-
* Adds one socket to a room.
|
|
152
|
+
* Adds one currently open, runtime-registered socket to a room.
|
|
153
|
+
* Unknown or already closed socket identifiers are ignored.
|
|
135
154
|
*
|
|
136
155
|
* @param socketId Socket identifier to add.
|
|
137
156
|
* @param room Room identifier to join.
|
|
@@ -191,6 +210,11 @@ export interface WebSocketModuleOptions<TRequest = Request> {
|
|
|
191
210
|
intervalMs?: number;
|
|
192
211
|
timeoutMs?: number;
|
|
193
212
|
};
|
|
213
|
+
/** Opt-in processing for message handler return values. Returns are ignored when omitted. */
|
|
214
|
+
replies?: {
|
|
215
|
+
/** Sends valid `{ event, data? }` handler returns through the accepted socket. */
|
|
216
|
+
mode: WebSocketReplyMode;
|
|
217
|
+
};
|
|
194
218
|
shutdown?: {
|
|
195
219
|
timeoutMs?: number;
|
|
196
220
|
};
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAE/D;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAExD
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|