@fluojs/websockets 1.0.7 → 1.0.8
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 +15 -8
- package/README.md +15 -8
- package/dist/bun/bun-service.d.ts.map +1 -1
- package/dist/bun/bun-types.d.ts +11 -2
- package/dist/bun/bun-types.d.ts.map +1 -1
- package/dist/cloudflare-workers/cloudflare-workers-service.d.ts.map +1 -1
- package/dist/cloudflare-workers/cloudflare-workers-service.js +19 -13
- 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 +2 -1
- package/dist/node/node-service.d.ts.map +1 -1
- package/dist/node/node-service.js +5 -3
- 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/service.d.ts +1 -8
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +1 -8
- package/package.json +10 -9
package/README.ko.md
CHANGED
|
@@ -21,7 +21,7 @@ fluo 런타임을 위한 데코레이터 기반 WebSocket 게이트웨이 작성
|
|
|
21
21
|
npm install @fluojs/websockets
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
Root Node.js
|
|
24
|
+
Root Node.js module path는 `WebSocketModule.forRoot()`가 runtime에서 해석될 때만 패키지가 직접 소유한 `ws` dependency를 사용합니다. 애플리케이션 코드에서 `ws`를 직접 사용하지 않는 한 별도 설치가 필요하지 않습니다.
|
|
25
25
|
|
|
26
26
|
## 사용 시점
|
|
27
27
|
|
|
@@ -102,16 +102,20 @@ WebSocketModule.forRoot({
|
|
|
102
102
|
});
|
|
103
103
|
```
|
|
104
104
|
|
|
105
|
-
옵션을 생략하면 `@fluojs/websockets`는 동시 연결 수, inbound payload 크기, pending message buffer, shutdown cleanup에 bounded default를 적용합니다. 기본값은 `maxConnections: 1000`, `maxPayloadBytes: 1 MiB`, `buffer.maxPendingMessagesPerSocket: 256`, `shutdown.timeoutMs: 5000`, Node heartbeat interval `30s`, Node backpressure `maxBufferedAmountBytes: 1 MiB`와 drop behavior입니다. 또한 server-backed Node listener는 `heartbeat.enabled`를 명시적으로 `false`로 두지 않는 한 heartbeat timer를 활성화합니다. Node shutdown은 shutdown이 시작된 뒤 in-flight async upgrade를 거절하고, 애플리케이션 shutdown 시 추적 중인 websocket 클라이언트를 닫고, `shutdown.timeoutMs` 범위 안에서 `@OnDisconnect()` cleanup이 마무리될 수 있도록 bounded 기회를 제공합니다. 해결되지 않은 cleanup은 shutdown을 무기한 막지 않고 해당 timeout 안에서 로그로 남습니다. 공식 fetch-style runtime module(`@fluojs/websockets/bun`, `@fluojs/websockets/deno`, `@fluojs/websockets/cloudflare-workers`)은 `Request` typed upgrade guard를 노출하며, 애플리케이션 shutdown 중 동일한 bounded close와 disconnect cleanup 동작을 제공합니다.
|
|
105
|
+
옵션을 생략하면 `@fluojs/websockets`는 동시 연결 수, inbound payload 크기, pending message buffer, shutdown cleanup에 bounded default를 적용합니다. 기본값은 `maxConnections: 1000`, `maxPayloadBytes: 1 MiB`, `buffer.maxPendingMessagesPerSocket: 256`, `shutdown.timeoutMs: 5000`, Node heartbeat interval `30s`, Node backpressure `maxBufferedAmountBytes: 1 MiB`와 drop behavior입니다. 또한 server-backed Node listener는 `heartbeat.enabled`를 명시적으로 `false`로 두지 않는 한 heartbeat timer를 활성화합니다. Node shutdown은 shutdown이 시작된 뒤 in-flight async upgrade를 거절하고, 애플리케이션 shutdown 시 추적 중인 websocket 클라이언트를 닫고, `shutdown.timeoutMs` 범위 안에서 `@OnDisconnect()` cleanup이 마무리될 수 있도록 bounded 기회를 제공합니다. 해결되지 않은 cleanup은 shutdown을 무기한 막지 않고 해당 timeout 안에서 로그로 남습니다. 공식 fetch-style runtime module(`@fluojs/websockets/bun`, `@fluojs/websockets/deno`, `@fluojs/websockets/cloudflare-workers`)은 `Request` typed upgrade guard를 노출하며, 애플리케이션 shutdown 중 동일한 bounded close와 disconnect cleanup 동작을 제공합니다. Cloudflare Workers 애플리케이션 shutdown 중에는 worker subpath가 adapter-owned binding을 유지하고, 새 upgrade 시도를 HTTP dispatch로 넘기지 않고 JSON `503` shutdown response로 거절합니다.
|
|
106
106
|
|
|
107
|
-
Root `@fluojs/websockets` / `@fluojs/websockets/node` guard는 Node의 `IncomingMessage`를 받습니다. Fetch-style subpath는 Web standard `Request`를 받으므로, 재사용 가능한 옵션 객체를 작성할 때는 subpath별 `WebSocketModuleOptions` 타입을 선택하세요.
|
|
107
|
+
Root `@fluojs/websockets` / `@fluojs/websockets/node` guard는 Node의 `IncomingMessage`를 받습니다. Fetch-style subpath는 Web standard `Request`를 받으므로, 재사용 가능한 옵션 객체를 작성할 때는 subpath별 `WebSocketModuleOptions` 타입을 선택하세요. Guard는 `true`, `undefined`, 또는 return 없음으로 upgrade를 허용하고, `false` 또는 `{ status, body? }` 형태의 `WebSocketUpgradeRejection`으로 거절하거나 `UnauthorizedException` 같은 `HttpException` 계열 오류를 throw할 수 있습니다. Throw된 HTTP exception은 socket이 accept되기 전에 동일한 pre-handshake rejection response로 변환됩니다.
|
|
108
108
|
|
|
109
109
|
### Room
|
|
110
|
-
`WebSocketRoomService`를 사용하면 gateway 또는 application service가 adapter 내부에 접근하지 않고도 가벼운 room membership state를 유지할 수 있습니다. Runtime lifecycle service는 `joinRoom(socketId, room)`, `leaveRoom(socketId, room)`, `broadcastToRoom(room, event, data)`, `getRooms(socketId)`를 구현합니다. `broadcastToRoom(...)`은 현재 room에 있는 열린 socket에 `{ event, data }` 형태의 JSON frame을
|
|
110
|
+
`WebSocketRoomService`를 사용하면 gateway 또는 application service가 adapter 내부에 접근하지 않고도 가벼운 room membership state를 유지할 수 있습니다. Runtime lifecycle service는 `joinRoom(socketId, room)`, `leaveRoom(socketId, room)`, `broadcastToRoom(room, event, data)`, `getRooms(socketId)`를 구현합니다. `broadcastToRoom(...)`은 현재 room에 있는 열린 socket에 `{ event, data }` 형태의 JSON frame을 보냅니다. Node.js 기반 adapter는 전송 전에 설정된 `backpressure` policy를 적용하지만, fetch-style runtime(`@fluojs/websockets/bun`, `@fluojs/websockets/deno`, `@fluojs/websockets/cloudflare-workers`)은 room broadcast에 backpressure policy를 적용하지 않습니다.
|
|
111
|
+
|
|
112
|
+
`WebSocketRoomService`는 runtime lifecycle service가 구현하는 type-only contract입니다. `@Inject(...)`로 lifecycle service token을 주입하고 constructor parameter를 `WebSocketRoomService`로 type 지정하세요. Root `@fluojs/websockets`와 `@fluojs/websockets/node` entrypoint는 `WebSocketGatewayLifecycleService`를 DI token으로 노출하고, runtime-specific subpath는 아래 runtime 표에 나열된 해당 `*WebSocketGatewayLifecycleService` token을 노출합니다.
|
|
111
113
|
|
|
112
114
|
```typescript
|
|
113
|
-
import {
|
|
115
|
+
import { Inject } from '@fluojs/core';
|
|
116
|
+
import { WebSocketGatewayLifecycleService, type WebSocketRoomService } from '@fluojs/websockets';
|
|
114
117
|
|
|
118
|
+
@Inject(WebSocketGatewayLifecycleService)
|
|
115
119
|
class OrderStatusPublisher {
|
|
116
120
|
constructor(private readonly rooms: WebSocketRoomService) {}
|
|
117
121
|
|
|
@@ -125,6 +129,8 @@ class OrderStatusPublisher {
|
|
|
125
129
|
|
|
126
130
|
Gateway `@OnMessage()` handler는 지원 런타임 전반에서 하나의 정규화된 payload contract를 받습니다. Text frame은 가능한 경우 JSON으로 파싱하고, 그렇지 않으면 string으로 전달합니다. Binary frame은 런타임이 Node `Buffer`/typed array, Bun `ArrayBuffer`/view, Deno `ArrayBuffer`/view/`Blob`, Cloudflare Workers `ArrayBuffer`/view/`Blob` 중 어떤 형태로 노출하더라도 UTF-8로 디코딩한 뒤 동일한 JSON/event dispatch 단계를 거칩니다. `limits.maxPayloadBytes` 검사는 모든 표현에 byte length를 사용하며, 허용된 socket에서 oversized payload가 들어오면 close code `1009`로 닫습니다.
|
|
127
131
|
|
|
132
|
+
Handler return value는 Node, Bun, Deno, Cloudflare Workers 전반에서 완료될 때까지 await된 뒤 무시됩니다. Raw WebSocket handler에서 event object를 반환하지 말고, `socket.send(JSON.stringify({ event: 'pong', data }))`처럼 runtime socket argument를 통해 명시적으로 reply를 보내세요.
|
|
133
|
+
|
|
128
134
|
## 공개 API 개요
|
|
129
135
|
|
|
130
136
|
- `@WebSocketGateway(options)`: 클래스를 WebSocket 게이트웨이로 표시합니다.
|
|
@@ -133,17 +139,18 @@ Gateway `@OnMessage()` handler는 지원 런타임 전반에서 하나의 정규
|
|
|
133
139
|
- `@OnDisconnect()`: 연결 해제 핸들러를 위한 데코레이터입니다.
|
|
134
140
|
- `WebSocketModule`: WebSocket 통합을 위한 루트 모듈입니다.
|
|
135
141
|
- `WebSocketModule.forRoot({ upgrade, limits, backpressure, buffer, heartbeat, shutdown })`: pre-upgrade guard와 bounded runtime default를 구성합니다.
|
|
136
|
-
- `WebSocketGatewayLifecycleService`: 기본 Node.js 기반 lifecycle service token
|
|
142
|
+
- `WebSocketGatewayLifecycleService`: 기본 Node.js 기반 lifecycle service token인 `NodeWebSocketGatewayLifecycleService`의 루트 alias입니다. 직접 instantiate하는 concrete class가 아니라 DI token placeholder이며, `WebSocketModule.forRoot(...)`가 lazy Node implementation을 연결한 뒤 application container에서 resolve해야 합니다.
|
|
137
143
|
- `WebSocketRoomService`: websocket room join, leave, broadcast, 조회를 위해 runtime lifecycle service가 구현하는 Room management contract입니다.
|
|
144
|
+
- Typed runtime seam: `WebSocketUpgradeContext`, `WebSocketUpgradeGuard`, `WebSocketUpgradeRejection`, `WebSocketGatewayDescriptor`, `WebSocketGatewayHandlerDescriptor`, 그리고 Node, Bun, Deno, Cloudflare Workers subpath의 runtime socket/binding type.
|
|
138
145
|
- Metadata helper와 symbol: `defineWebSocketGatewayMetadata`, `getWebSocketGatewayMetadata`, `defineWebSocketHandlerMetadata`, `getWebSocketHandlerMetadata`, `getWebSocketHandlerMetadataEntries`, `webSocketGatewayMetadataSymbol`, `webSocketHandlerMetadataSymbol`.
|
|
139
146
|
|
|
140
147
|
## 런타임별 서브패스
|
|
141
148
|
|
|
142
|
-
기본 루트 Node.js alias 대신 런타임을 명시적으로 고정하고 싶다면 런타임별 서브패스를 사용하세요. 루트 `@fluojs/websockets` 진입점은 Node.js 기본 module
|
|
149
|
+
기본 루트 Node.js alias 대신 런타임을 명시적으로 고정하고 싶다면 런타임별 서브패스를 사용하세요. 루트 `@fluojs/websockets` 진입점은 Node.js 기본 module export name을 유지하고 `WebSocketGatewayLifecycleService`를 `NodeWebSocketGatewayLifecycleService`와 같은 DI token으로 alias하지만, 단순 root package import는 concrete Node implementation을 lazy runtime provider resolution 뒤에 둡니다. Fetch-style 애플리케이션은 선택한 런타임 서브패스에서 gateway decorator와 metadata helper를 import해 authoring code가 root Node.js-backed module boundary에 의존하지 않게 해야 합니다.
|
|
143
150
|
|
|
144
151
|
Package manifest의 `engines.node >=20.0.0` 선언은 published package와 기본 Node.js entrypoint 기준입니다. Bun, Deno, Cloudflare Workers 지원은 아래 전용 fetch-style subpath를 통해 노출되며, 해당 subpath는 request/handler type을 web-standard로 유지하고 application code가 root Node.js lifecycle-service alias에 의존하지 않게 합니다.
|
|
145
152
|
|
|
146
|
-
각 서브패스는 해당 `*WebSocketModule.forRoot(...)` 진입점, 일치하는 런타임 lifecycle service export, 그리고 공유 gateway authoring primitive인 `WebSocketGateway`, `OnConnect`, `OnMessage`, `OnDisconnect`, `defineWebSocketGatewayMetadata`, `getWebSocketGatewayMetadata`, `defineWebSocketHandlerMetadata`, `getWebSocketHandlerMetadata`, `getWebSocketHandlerMetadataEntries`, `webSocketGatewayMetadataSymbol`, `webSocketHandlerMetadataSymbol`을 제공합니다.
|
|
153
|
+
각 서브패스는 해당 `*WebSocketModule.forRoot(...)` 진입점, 일치하는 런타임 lifecycle service export, 그리고 공유 gateway authoring primitive인 `WebSocketGateway`, `OnConnect`, `OnMessage`, `OnDisconnect`, `defineWebSocketGatewayMetadata`, `getWebSocketGatewayMetadata`, `defineWebSocketHandlerMetadata`, `getWebSocketHandlerMetadata`, `getWebSocketHandlerMetadataEntries`, `webSocketGatewayMetadataSymbol`, `webSocketHandlerMetadataSymbol`을 제공합니다. Bun 서브패스의 low-level binding은 `upgrade(...)`만 가진 `BunWebSocketUpgradeHost`를 받으며, adapter-owned listener shutdown과 raw HTTP fetch 제어는 `@fluojs/platform-bun`에 남습니다.
|
|
147
154
|
|
|
148
155
|
| 런타임 | 서브패스 | 모듈 | Lifecycle service |
|
|
149
156
|
| --- | --- | --- | --- |
|
package/README.md
CHANGED
|
@@ -21,7 +21,7 @@ Decorator-based WebSocket gateway authoring for the fluo runtime.
|
|
|
21
21
|
npm install @fluojs/websockets
|
|
22
22
|
```
|
|
23
23
|
|
|
24
|
-
The root Node.js
|
|
24
|
+
The root Node.js module path uses the package-owned `ws` dependency only when `WebSocketModule.forRoot()` is resolved at runtime. Applications do not need to install `ws` separately unless they use it directly in their own code.
|
|
25
25
|
|
|
26
26
|
## When to Use
|
|
27
27
|
|
|
@@ -102,16 +102,20 @@ WebSocketModule.forRoot({
|
|
|
102
102
|
});
|
|
103
103
|
```
|
|
104
104
|
|
|
105
|
-
When omitted, `@fluojs/websockets` applies bounded defaults for concurrent connections, inbound payload size, pending message buffers, and shutdown cleanup. Default settings are `maxConnections: 1000`, `maxPayloadBytes: 1 MiB`, `buffer.maxPendingMessagesPerSocket: 256`, `shutdown.timeoutMs: 5000`, Node heartbeat interval `30s`, and Node backpressure `maxBufferedAmountBytes: 1 MiB` with drop behavior. Server-backed Node listeners enable heartbeat timers unless you explicitly set `heartbeat.enabled` to `false`. Node shutdown rejects in-flight async upgrades once shutdown begins, will close tracked websocket clients during application shutdown, and gives `@OnDisconnect()` cleanup a bounded chance to finish within `shutdown.timeoutMs`; unresolved cleanup is logged and bounded by that timeout instead of blocking shutdown indefinitely. The official fetch-style runtime modules (`@fluojs/websockets/bun`, `@fluojs/websockets/deno`, and `@fluojs/websockets/cloudflare-workers`) expose `Request`-typed upgrade guards and provide the same bounded close and disconnect cleanup behavior during application shutdown.
|
|
105
|
+
When omitted, `@fluojs/websockets` applies bounded defaults for concurrent connections, inbound payload size, pending message buffers, and shutdown cleanup. Default settings are `maxConnections: 1000`, `maxPayloadBytes: 1 MiB`, `buffer.maxPendingMessagesPerSocket: 256`, `shutdown.timeoutMs: 5000`, Node heartbeat interval `30s`, and Node backpressure `maxBufferedAmountBytes: 1 MiB` with drop behavior. Server-backed Node listeners enable heartbeat timers unless you explicitly set `heartbeat.enabled` to `false`. Node shutdown rejects in-flight async upgrades once shutdown begins, will close tracked websocket clients during application shutdown, and gives `@OnDisconnect()` cleanup a bounded chance to finish within `shutdown.timeoutMs`; unresolved cleanup is logged and bounded by that timeout instead of blocking shutdown indefinitely. The official fetch-style runtime modules (`@fluojs/websockets/bun`, `@fluojs/websockets/deno`, and `@fluojs/websockets/cloudflare-workers`) expose `Request`-typed upgrade guards and provide the same bounded close and disconnect cleanup behavior during application shutdown. During Cloudflare Workers application shutdown, the worker subpath keeps the adapter-owned binding installed and rejects new upgrade attempts with a JSON `503` shutdown response instead of falling through to HTTP dispatch.
|
|
106
106
|
|
|
107
|
-
The root `@fluojs/websockets` / `@fluojs/websockets/node` guard receives Node's `IncomingMessage`. Fetch-style subpaths receive a Web-standard `Request`, so choose the subpath-specific `WebSocketModuleOptions` type when authoring reusable option objects.
|
|
107
|
+
The root `@fluojs/websockets` / `@fluojs/websockets/node` guard receives Node's `IncomingMessage`. Fetch-style subpaths receive a Web-standard `Request`, so choose the subpath-specific `WebSocketModuleOptions` type when authoring reusable option objects. Guards may allow an upgrade with `true`, `undefined`, or no return value; reject with `false` or a `{ status, body? }` `WebSocketUpgradeRejection`; or throw an `HttpException`-like error such as `UnauthorizedException`. Thrown HTTP exceptions are converted to the same pre-handshake rejection response before any socket is accepted.
|
|
108
108
|
|
|
109
109
|
### Rooms
|
|
110
|
-
`WebSocketRoomService` lets gateway or application services keep lightweight room membership state without reaching into adapter internals. Runtime lifecycle services implement `joinRoom(socketId, room)`, `leaveRoom(socketId, room)`, `broadcastToRoom(room, event, data)`, and `getRooms(socketId)`. `broadcastToRoom(...)` sends a JSON frame shaped as `{ event, data }` to currently open sockets in the room
|
|
110
|
+
`WebSocketRoomService` lets gateway or application services keep lightweight room membership state without reaching into adapter internals. Runtime lifecycle services implement `joinRoom(socketId, room)`, `leaveRoom(socketId, room)`, `broadcastToRoom(room, event, data)`, and `getRooms(socketId)`. `broadcastToRoom(...)` sends a JSON frame shaped as `{ event, data }` to currently open sockets in the room. The Node.js-backed adapter applies the configured `backpressure` policy before sending; the fetch-style runtimes (`@fluojs/websockets/bun`, `@fluojs/websockets/deno`, and `@fluojs/websockets/cloudflare-workers`) do not apply a backpressure policy to room broadcasts.
|
|
111
|
+
|
|
112
|
+
`WebSocketRoomService` is a type-only contract implemented by the runtime lifecycle service. Inject the lifecycle service token with `@Inject(...)` and type the constructor parameter as `WebSocketRoomService`. The root `@fluojs/websockets` and `@fluojs/websockets/node` entrypoints expose `WebSocketGatewayLifecycleService` as the DI token; runtime-specific subpaths expose the matching `*WebSocketGatewayLifecycleService` token listed in the runtime table below.
|
|
111
113
|
|
|
112
114
|
```typescript
|
|
113
|
-
import {
|
|
115
|
+
import { Inject } from '@fluojs/core';
|
|
116
|
+
import { WebSocketGatewayLifecycleService, type WebSocketRoomService } from '@fluojs/websockets';
|
|
114
117
|
|
|
118
|
+
@Inject(WebSocketGatewayLifecycleService)
|
|
115
119
|
class OrderStatusPublisher {
|
|
116
120
|
constructor(private readonly rooms: WebSocketRoomService) {}
|
|
117
121
|
|
|
@@ -125,6 +129,8 @@ class OrderStatusPublisher {
|
|
|
125
129
|
|
|
126
130
|
Gateway `@OnMessage()` handlers receive one normalized payload contract across supported runtimes. Text frames are parsed as JSON when possible and otherwise delivered as strings. Binary frames are decoded as UTF-8 before the same JSON/event dispatch step, whether the runtime surfaces them as Node `Buffer`/typed arrays, Bun `ArrayBuffer`/views, Deno `ArrayBuffer`/views/`Blob`, or Cloudflare Workers `ArrayBuffer`/views/`Blob`. The `limits.maxPayloadBytes` check uses byte length for every representation and closes oversized accepted sockets with close code `1009`.
|
|
127
131
|
|
|
132
|
+
Handler return values are awaited for completion and then ignored across Node, Bun, Deno, and Cloudflare Workers. Send replies explicitly through the runtime socket argument, for example `socket.send(JSON.stringify({ event: 'pong', data }))`, instead of returning an event object from a raw WebSocket handler.
|
|
133
|
+
|
|
128
134
|
## Public API Overview
|
|
129
135
|
|
|
130
136
|
- `@WebSocketGateway(options)`: Marks a class as a WebSocket gateway.
|
|
@@ -133,17 +139,18 @@ Gateway `@OnMessage()` handlers receive one normalized payload contract across s
|
|
|
133
139
|
- `@OnDisconnect()`: Decorator for disconnection handlers.
|
|
134
140
|
- `WebSocketModule`: Root module for WebSocket integration.
|
|
135
141
|
- `WebSocketModule.forRoot({ upgrade, limits, backpressure, buffer, heartbeat, shutdown })`: Configures pre-upgrade guards and bounded runtime defaults.
|
|
136
|
-
- `WebSocketGatewayLifecycleService`: Root alias for the default Node.js-backed lifecycle service token.
|
|
142
|
+
- `WebSocketGatewayLifecycleService`: Root alias for `NodeWebSocketGatewayLifecycleService`, the default Node.js-backed lifecycle service token. It is a DI token placeholder, not a concrete class to instantiate directly; resolve it from the application container after `WebSocketModule.forRoot(...)` wires the lazy Node implementation.
|
|
137
143
|
- `WebSocketRoomService`: Room management contract implemented by runtime lifecycle services for joining, leaving, broadcasting to, and inspecting websocket rooms.
|
|
144
|
+
- Typed runtime seams: `WebSocketUpgradeContext`, `WebSocketUpgradeGuard`, `WebSocketUpgradeRejection`, `WebSocketGatewayDescriptor`, and `WebSocketGatewayHandlerDescriptor`, plus runtime socket/binding types from the Node, Bun, Deno, and Cloudflare Workers subpaths.
|
|
138
145
|
- Metadata helpers and symbols: `defineWebSocketGatewayMetadata`, `getWebSocketGatewayMetadata`, `defineWebSocketHandlerMetadata`, `getWebSocketHandlerMetadata`, `getWebSocketHandlerMetadataEntries`, `webSocketGatewayMetadataSymbol`, `webSocketHandlerMetadataSymbol`.
|
|
139
146
|
|
|
140
147
|
## Runtime-Specific Subpaths
|
|
141
148
|
|
|
142
|
-
Use the runtime subpaths when you want an explicit runtime binding instead of the default root Node.js alias. The root `@fluojs/websockets` entrypoint preserves the Node.js default module and
|
|
149
|
+
Use the runtime subpaths when you want an explicit runtime binding instead of the default root Node.js alias. The root `@fluojs/websockets` entrypoint preserves the Node.js default module export name and aliases `WebSocketGatewayLifecycleService` to the same DI token as `NodeWebSocketGatewayLifecycleService`, but plain root-package imports keep the concrete Node implementation behind lazy runtime provider resolution. Fetch-style applications should still import gateway decorators and metadata helpers from their selected runtime subpath so authoring code does not rely on the root Node.js-backed module boundary.
|
|
143
150
|
|
|
144
151
|
The package manifest declares `engines.node >=20.0.0` for the published package and default Node.js entrypoint. Bun, Deno, and Cloudflare Workers support is exposed through the dedicated fetch-style subpaths listed below; those subpaths keep request/handler types web-standard and avoid the root Node.js lifecycle-service alias in application code.
|
|
145
152
|
|
|
146
|
-
Each subpath exposes its `*WebSocketModule.forRoot(...)` entrypoint, the matching runtime lifecycle service export, and the shared gateway authoring primitives: `WebSocketGateway`, `OnConnect`, `OnMessage`, `OnDisconnect`, `defineWebSocketGatewayMetadata`, `getWebSocketGatewayMetadata`, `defineWebSocketHandlerMetadata`, `getWebSocketHandlerMetadata`, `getWebSocketHandlerMetadataEntries`, `webSocketGatewayMetadataSymbol`, and `webSocketHandlerMetadataSymbol`.
|
|
153
|
+
Each subpath exposes its `*WebSocketModule.forRoot(...)` entrypoint, the matching runtime lifecycle service export, and the shared gateway authoring primitives: `WebSocketGateway`, `OnConnect`, `OnMessage`, `OnDisconnect`, `defineWebSocketGatewayMetadata`, `getWebSocketGatewayMetadata`, `defineWebSocketHandlerMetadata`, `getWebSocketHandlerMetadata`, `getWebSocketHandlerMetadataEntries`, `webSocketGatewayMetadataSymbol`, and `webSocketHandlerMetadataSymbol`. The Bun subpath's low-level binding receives a `BunWebSocketUpgradeHost` with only `upgrade(...)`; adapter-owned listener shutdown and raw HTTP fetch control stay with `@fluojs/platform-bun`.
|
|
147
154
|
|
|
148
155
|
| Runtime | Subpath | Module | Lifecycle service |
|
|
149
156
|
| --- | --- | --- | --- |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bun-service.d.ts","sourceRoot":"","sources":["../../src/bun/bun-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAezI,OAAO,KAAK,EAEV,oBAAoB,EAErB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"bun-service.d.ts","sourceRoot":"","sources":["../../src/bun/bun-service.ts"],"names":[],"mappings":"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"}
|
package/dist/bun/bun-types.d.ts
CHANGED
|
@@ -20,7 +20,7 @@ export interface BunServerWebSocket<TData = unknown> {
|
|
|
20
20
|
unsubscribe(topic: string): void;
|
|
21
21
|
}
|
|
22
22
|
/**
|
|
23
|
-
* Describes the
|
|
23
|
+
* Describes the complete Bun server handle used by Bun-specific tests and host doubles.
|
|
24
24
|
*/
|
|
25
25
|
export interface BunServerLike {
|
|
26
26
|
fetch?(request: Request): Response | Promise<Response> | undefined | Promise<Response | undefined>;
|
|
@@ -33,6 +33,15 @@ export interface BunServerLike {
|
|
|
33
33
|
}): boolean;
|
|
34
34
|
url?: URL;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Describes the upgrade-only Bun host exposed to websocket bindings.
|
|
38
|
+
*/
|
|
39
|
+
export interface BunWebSocketUpgradeHost {
|
|
40
|
+
upgrade<TData = unknown>(request: Request, options?: {
|
|
41
|
+
data?: TData;
|
|
42
|
+
headers?: HeadersInit;
|
|
43
|
+
}): boolean;
|
|
44
|
+
}
|
|
36
45
|
/**
|
|
37
46
|
* Describes the bun web socket handler contract.
|
|
38
47
|
*/
|
|
@@ -58,7 +67,7 @@ export interface BunWebSocketHandler<TData = unknown> {
|
|
|
58
67
|
* Describes the bun web socket binding contract.
|
|
59
68
|
*/
|
|
60
69
|
export interface BunWebSocketBinding<TData = unknown> {
|
|
61
|
-
fetch(request: Request, server:
|
|
70
|
+
fetch(request: Request, server: BunWebSocketUpgradeHost): Response | Promise<Response> | undefined | Promise<Response | undefined>;
|
|
62
71
|
websocket: BunWebSocketHandler<TData>;
|
|
63
72
|
}
|
|
64
73
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bun-types.d.ts","sourceRoot":"","sources":["../../src/bun/bun-types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bun-types.d.ts","sourceRoot":"","sources":["../../src/bun/bun-types.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudflare-workers-service.d.ts","sourceRoot":"","sources":["../../src/cloudflare-workers/cloudflare-workers-service.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAgBzI,OAAO,KAAK,EAA8B,oBAAoB,EAA6B,MAAM,aAAa,CAAC;AAC/G,OAAO,KAAK,EAKV,sBAAsB,EACvB,MAAM,+BAA+B,CAAC;AAuEvC;;GAEG;AACH,qBACa,iDACX,YAAW,sBAAsB,EAAE,qBAAqB,EAAE,eAAe,EAAE,oBAAoB;IAY7F,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAdhC,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAA4B;IACrE,OAAO,CAAC,0BAA0B,CAAK;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAC9D,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgD;IAC/E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAC9D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA6C;gBAGvD,gBAAgB,EAAE,SAAS,EAC3B,eAAe,EAAE,SAAS,cAAc,EAAE,EAC1C,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,sBAAsB,EAC/B,aAAa,EAAE,sBAAsB;IAGlD,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBvC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC,OAAO,CAAC,aAAa;YAUP,oBAAoB;
|
|
1
|
+
{"version":3,"file":"cloudflare-workers-service.d.ts","sourceRoot":"","sources":["../../src/cloudflare-workers/cloudflare-workers-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -114,6 +114,9 @@ class CloudflareWorkersWebSocketGatewayLifecycleService {
|
|
|
114
114
|
status: 404
|
|
115
115
|
});
|
|
116
116
|
}
|
|
117
|
+
if (this.isShuttingDown) {
|
|
118
|
+
return createCloudflareWorkersWebSocketShutdownResponse();
|
|
119
|
+
}
|
|
117
120
|
const rejection = await this.resolveUpgradeRejection(request, targetPath);
|
|
118
121
|
if (rejection) {
|
|
119
122
|
return new Response(rejection.body ?? null, {
|
|
@@ -123,9 +126,7 @@ class CloudflareWorkersWebSocketGatewayLifecycleService {
|
|
|
123
126
|
}
|
|
124
127
|
if (this.isShuttingDown) {
|
|
125
128
|
this.releaseUpgradeReservation();
|
|
126
|
-
return
|
|
127
|
-
status: 503
|
|
128
|
-
});
|
|
129
|
+
return createCloudflareWorkersWebSocketShutdownResponse();
|
|
129
130
|
}
|
|
130
131
|
let response;
|
|
131
132
|
let serverSocket;
|
|
@@ -407,12 +408,6 @@ class CloudflareWorkersWebSocketGatewayLifecycleService {
|
|
|
407
408
|
return '';
|
|
408
409
|
}
|
|
409
410
|
async resolveUpgradeRejection(request, path) {
|
|
410
|
-
if (this.isShuttingDown) {
|
|
411
|
-
return {
|
|
412
|
-
body: 'WebSocket server is shutting down.',
|
|
413
|
-
status: 503
|
|
414
|
-
};
|
|
415
|
-
}
|
|
416
411
|
if (!this.tryReserveUpgradeSlot()) {
|
|
417
412
|
return {
|
|
418
413
|
body: 'WebSocket connection limit exceeded.',
|
|
@@ -506,9 +501,6 @@ class CloudflareWorkersWebSocketGatewayLifecycleService {
|
|
|
506
501
|
}
|
|
507
502
|
async runShutdownLifecycle() {
|
|
508
503
|
this.isShuttingDown = true;
|
|
509
|
-
if (hasCloudflareWorkerWebSocketBindingHost(this.adapter)) {
|
|
510
|
-
this.adapter.configureWebSocketBinding(undefined);
|
|
511
|
-
}
|
|
512
504
|
const shutdownTimeoutMs = this.resolveShutdownTimeoutMs();
|
|
513
505
|
await this.awaitPendingUpgradeOperations(shutdownTimeoutMs);
|
|
514
506
|
await this.closeActiveSockets(shutdownTimeoutMs);
|
|
@@ -688,4 +680,18 @@ class CloudflareWorkersWebSocketGatewayLifecycleService {
|
|
|
688
680
|
_initClass();
|
|
689
681
|
}
|
|
690
682
|
}
|
|
691
|
-
export { _CloudflareWorkersWeb as CloudflareWorkersWebSocketGatewayLifecycleService };
|
|
683
|
+
export { _CloudflareWorkersWeb as CloudflareWorkersWebSocketGatewayLifecycleService };
|
|
684
|
+
function createCloudflareWorkersWebSocketShutdownResponse() {
|
|
685
|
+
return new Response(JSON.stringify({
|
|
686
|
+
error: {
|
|
687
|
+
code: 'SERVICE_UNAVAILABLE',
|
|
688
|
+
message: 'Server is shutting down.',
|
|
689
|
+
status: 503
|
|
690
|
+
}
|
|
691
|
+
}), {
|
|
692
|
+
headers: {
|
|
693
|
+
'content-type': 'application/json'
|
|
694
|
+
},
|
|
695
|
+
status: 503
|
|
696
|
+
});
|
|
697
|
+
}
|
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
|
+
}
|
|
@@ -2,6 +2,7 @@ import type { Container } from '@fluojs/di';
|
|
|
2
2
|
import type { ApplicationLogger, CompiledModule, OnApplicationBootstrap, OnApplicationShutdown, OnModuleDestroy } from '@fluojs/runtime';
|
|
3
3
|
import type { HttpApplicationAdapter } from '@fluojs/http';
|
|
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;
|
|
@@ -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;AAEzI,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAc3D,OAAO,KAAK,EAIV,oBAAoB,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAgO9D;;;;;;GAMG;AACH,qBACa,
|
|
1
|
+
{"version":3,"file":"node-service.d.ts","sourceRoot":"","sources":["../../src/node/node-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@ import { APPLICATION_LOGGER, COMPILED_MODULES, HTTP_APPLICATION_ADAPTER, RUNTIME
|
|
|
11
11
|
import { WebSocket, WebSocketServer } from 'ws';
|
|
12
12
|
import { dispatchGatewayDisconnect, dispatchGatewayMessage, discoverGatewayDescriptors, 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;
|
|
@@ -1075,7 +1077,7 @@ class NodeWebSocketGatewayLifecycleService {
|
|
|
1075
1077
|
_initClass();
|
|
1076
1078
|
}
|
|
1077
1079
|
}
|
|
1078
|
-
export { _NodeWebSocketGateway as
|
|
1080
|
+
export { _NodeWebSocketGateway as NodeWebSocketGatewayLifecycleServiceImplementation };
|
|
1079
1081
|
function createOwnedGatewayServer() {
|
|
1080
1082
|
return createHttpServer((_request, response) => {
|
|
1081
1083
|
response.statusCode = 404;
|
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/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/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"realtime",
|
|
10
10
|
"upgrade"
|
|
11
11
|
],
|
|
12
|
-
"version": "1.0.
|
|
12
|
+
"version": "1.0.8",
|
|
13
13
|
"private": false,
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"repository": {
|
|
@@ -69,18 +69,19 @@
|
|
|
69
69
|
],
|
|
70
70
|
"dependencies": {
|
|
71
71
|
"ws": "^8.18.3",
|
|
72
|
-
"@fluojs/core": "^1.0
|
|
73
|
-
"@fluojs/
|
|
74
|
-
"@fluojs/
|
|
75
|
-
"@fluojs/
|
|
72
|
+
"@fluojs/core": "^1.1.0",
|
|
73
|
+
"@fluojs/http": "^2.0.1",
|
|
74
|
+
"@fluojs/runtime": "^2.0.1",
|
|
75
|
+
"@fluojs/di": "^2.0.0"
|
|
76
76
|
},
|
|
77
77
|
"devDependencies": {
|
|
78
78
|
"@types/ws": "^8.18.1",
|
|
79
79
|
"vitest": "^3.2.4",
|
|
80
|
-
"@fluojs/platform-
|
|
81
|
-
"@fluojs/platform-bun": "^
|
|
82
|
-
"@fluojs/platform-
|
|
83
|
-
"@fluojs/
|
|
80
|
+
"@fluojs/platform-cloudflare-workers": "^1.0.5",
|
|
81
|
+
"@fluojs/platform-bun": "^2.0.0",
|
|
82
|
+
"@fluojs/platform-express": "^1.1.0",
|
|
83
|
+
"@fluojs/platform-fastify": "^1.0.9",
|
|
84
|
+
"@fluojs/testing": "^2.0.0"
|
|
84
85
|
},
|
|
85
86
|
"scripts": {
|
|
86
87
|
"prebuild": "node ../../tooling/scripts/clean-dist.mjs",
|