@fluojs/websockets 1.0.0-beta.1
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/LICENSE +21 -0
- package/README.ko.md +133 -0
- package/README.md +133 -0
- package/dist/bun/bun-module.d.ts +15 -0
- package/dist/bun/bun-module.d.ts.map +1 -0
- package/dist/bun/bun-module.js +27 -0
- package/dist/bun/bun-service.d.ts +63 -0
- package/dist/bun/bun-service.d.ts.map +1 -0
- package/dist/bun/bun-service.js +558 -0
- package/dist/bun/bun-types.d.ts +58 -0
- package/dist/bun/bun-types.d.ts.map +1 -0
- package/dist/bun/bun-types.js +1 -0
- package/dist/bun/bun.d.ts +4 -0
- package/dist/bun/bun.d.ts.map +1 -0
- package/dist/bun/bun.js +3 -0
- package/dist/bun.d.ts +2 -0
- package/dist/bun.d.ts.map +1 -0
- package/dist/bun.js +1 -0
- package/dist/cloudflare-workers/cloudflare-workers-module.d.ts +15 -0
- package/dist/cloudflare-workers/cloudflare-workers-module.d.ts.map +1 -0
- package/dist/cloudflare-workers/cloudflare-workers-module.js +27 -0
- package/dist/cloudflare-workers/cloudflare-workers-service.d.ts +61 -0
- package/dist/cloudflare-workers/cloudflare-workers-service.d.ts.map +1 -0
- package/dist/cloudflare-workers/cloudflare-workers-service.js +538 -0
- package/dist/cloudflare-workers/cloudflare-workers-types.d.ts +30 -0
- package/dist/cloudflare-workers/cloudflare-workers-types.d.ts.map +1 -0
- package/dist/cloudflare-workers/cloudflare-workers-types.js +1 -0
- package/dist/cloudflare-workers/cloudflare-workers.d.ts +4 -0
- package/dist/cloudflare-workers/cloudflare-workers.d.ts.map +1 -0
- package/dist/cloudflare-workers/cloudflare-workers.js +3 -0
- package/dist/cloudflare-workers.d.ts +2 -0
- package/dist/cloudflare-workers.d.ts.map +1 -0
- package/dist/cloudflare-workers.js +1 -0
- package/dist/decorators.d.ts +56 -0
- package/dist/decorators.d.ts.map +1 -0
- package/dist/decorators.js +115 -0
- package/dist/deno/deno-module.d.ts +15 -0
- package/dist/deno/deno-module.d.ts.map +1 -0
- package/dist/deno/deno-module.js +27 -0
- package/dist/deno/deno-service.d.ts +61 -0
- package/dist/deno/deno-service.d.ts.map +1 -0
- package/dist/deno/deno-service.js +533 -0
- package/dist/deno/deno-types.d.ts +25 -0
- package/dist/deno/deno-types.d.ts.map +1 -0
- package/dist/deno/deno-types.js +1 -0
- package/dist/deno/deno.d.ts +4 -0
- package/dist/deno/deno.d.ts.map +1 -0
- package/dist/deno/deno.js +3 -0
- package/dist/deno.d.ts +2 -0
- package/dist/deno.d.ts.map +1 -0
- package/dist/deno.js +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/internal/shared.d.ts +28 -0
- package/dist/internal/shared.d.ts.map +1 -0
- package/dist/internal/shared.js +188 -0
- package/dist/metadata.d.ts +13 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +81 -0
- package/dist/module.d.ts +26 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +26 -0
- package/dist/node/node-module.d.ts +15 -0
- package/dist/node/node-module.d.ts.map +1 -0
- package/dist/node/node-module.js +27 -0
- package/dist/node/node-service.d.ts +129 -0
- package/dist/node/node-service.d.ts.map +1 -0
- package/dist/node/node-service.js +892 -0
- package/dist/node/node-types.d.ts +81 -0
- package/dist/node/node-types.d.ts.map +1 -0
- package/dist/node/node-types.js +1 -0
- package/dist/node/node.d.ts +4 -0
- package/dist/node/node.d.ts.map +1 -0
- package/dist/node/node.js +3 -0
- package/dist/node.d.ts +2 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +1 -0
- package/dist/options-token.internal.d.ts +7 -0
- package/dist/options-token.internal.d.ts.map +1 -0
- package/dist/options-token.internal.js +4 -0
- package/dist/service.d.ts +9 -0
- package/dist/service.d.ts.map +1 -0
- package/dist/service.js +8 -0
- package/dist/types.d.ts +133 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -0
- package/package.json +91 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 fluo contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.ko.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# @fluojs/websockets
|
|
2
|
+
|
|
3
|
+
<p><a href="./README.md"><kbd>English</kbd></a> <strong><kbd>한국어</kbd></strong></p>
|
|
4
|
+
|
|
5
|
+
fluo 런타임을 위한 데코레이터 기반 WebSocket 게이트웨이 작성 패키지입니다.
|
|
6
|
+
|
|
7
|
+
## 목차
|
|
8
|
+
|
|
9
|
+
- [설치](#설치)
|
|
10
|
+
- [사용 시점](#사용-시점)
|
|
11
|
+
- [빠른 시작](#빠른-시작)
|
|
12
|
+
- [주요 패턴](#주요-패턴)
|
|
13
|
+
- [공개 API 개요](#공개-api-개요)
|
|
14
|
+
- [런타임별 서브패스](#런타임별-서브패스)
|
|
15
|
+
- [예제 소스](#예제-소스)
|
|
16
|
+
|
|
17
|
+
## 설치
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install @fluojs/websockets ws
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## 사용 시점
|
|
24
|
+
|
|
25
|
+
fluo 애플리케이션에 실시간 WebSocket 기능을 추가할 때 이 패키지를 사용합니다. 연결, 메시지 및 연결 해제 처리를 위한 깔끔한 데코레이터 기반 API를 제공하며, 다양한 런타임(Node.js, Bun, Deno, Cloudflare Workers)을 최고 수준으로 지원합니다.
|
|
26
|
+
|
|
27
|
+
## 빠른 시작
|
|
28
|
+
|
|
29
|
+
기본 Node.js 기반 websocket 런타임을 사용하려면 `WebSocketModule.forRoot()`를 사용합니다.
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { WebSocketGateway, OnConnect, OnMessage, WebSocketModule } from '@fluojs/websockets';
|
|
33
|
+
import { Module } from '@fluojs/core';
|
|
34
|
+
|
|
35
|
+
@WebSocketGateway({ path: '/chat' })
|
|
36
|
+
class ChatGateway {
|
|
37
|
+
@OnConnect()
|
|
38
|
+
handleConnect(socket) {
|
|
39
|
+
console.log('클라이언트 연결됨');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@OnMessage('ping')
|
|
43
|
+
handlePing(payload, socket) {
|
|
44
|
+
socket.send(JSON.stringify({ event: 'pong', data: payload }));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@Module({
|
|
49
|
+
imports: [WebSocketModule.forRoot()],
|
|
50
|
+
providers: [ChatGateway],
|
|
51
|
+
})
|
|
52
|
+
export class AppModule {}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## 주요 패턴
|
|
56
|
+
|
|
57
|
+
### 경로 공유 게이트웨이
|
|
58
|
+
여러 게이트웨이가 동일한 경로를 공유할 수 있으며, 이들의 핸들러는 탐색된 순서대로 실행됩니다.
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
@WebSocketGateway({ path: '/events' })
|
|
62
|
+
class MetricsGateway {
|
|
63
|
+
@OnMessage('metrics')
|
|
64
|
+
handleMetrics(data) { /* ... */ }
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Server-Backed (Node.js 전용)
|
|
69
|
+
Node 기반 어댑터(Express/Fastify)의 경우 전용 리스너 포트를 사용하도록 설정할 수 있습니다.
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
@WebSocketGateway({
|
|
73
|
+
path: '/chat',
|
|
74
|
+
serverBacked: { port: 3101 }
|
|
75
|
+
})
|
|
76
|
+
class DedicatedChatGateway {}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### pre-upgrade guard와 기본 제한값
|
|
80
|
+
`WebSocketModule.forRoot(...)`를 사용하면 핸드셰이크 전에 익명 업그레이드를 거절하고, 공통 연결/페이로드 제한을 조정할 수 있습니다.
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
import { UnauthorizedException } from '@fluojs/http';
|
|
84
|
+
|
|
85
|
+
WebSocketModule.forRoot({
|
|
86
|
+
limits: {
|
|
87
|
+
maxConnections: 500,
|
|
88
|
+
maxPayloadBytes: 65_536,
|
|
89
|
+
},
|
|
90
|
+
upgrade: {
|
|
91
|
+
guard(request) {
|
|
92
|
+
const authorization = request instanceof Request
|
|
93
|
+
? request.headers.get('authorization')
|
|
94
|
+
: request.headers.authorization;
|
|
95
|
+
|
|
96
|
+
if (authorization !== 'Bearer demo-token') {
|
|
97
|
+
throw new UnauthorizedException('Authentication required.');
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
옵션을 생략하면 `@fluojs/websockets`는 동시 연결 수와 인바운드 페이로드 크기에 대해 기본 제한값을 적용합니다. 또한 server-backed Node 리스너는 `heartbeat.enabled`를 명시적으로 `false`로 두지 않는 한 heartbeat 타이머를 활성화합니다.
|
|
105
|
+
|
|
106
|
+
## 공개 API 개요
|
|
107
|
+
|
|
108
|
+
- `@WebSocketGateway(options)`: 클래스를 WebSocket 게이트웨이로 표시합니다.
|
|
109
|
+
- `@OnConnect()`: 연결 핸들러를 위한 데코레이터입니다.
|
|
110
|
+
- `@OnMessage(event?)`: 인바운드 메시지 핸들러를 위한 데코레이터입니다.
|
|
111
|
+
- `@OnDisconnect()`: 연결 해제 핸들러를 위한 데코레이터입니다.
|
|
112
|
+
- `WebSocketModule`: WebSocket 통합을 위한 루트 모듈입니다.
|
|
113
|
+
- `WebSocketModule.forRoot({ upgrade, limits, heartbeat, ... })`: pre-upgrade guard와 기본 제한값을 구성합니다.
|
|
114
|
+
- `WebSocketGatewayLifecycleService`: 기본 Node.js 기반 lifecycle service token을 위한 루트 alias입니다.
|
|
115
|
+
- `WebSocketModule.forRoot(...)`: 기본 루트 WebSocket 모듈의 패키지 수준 등록을 구성합니다.
|
|
116
|
+
|
|
117
|
+
## 런타임별 서브패스
|
|
118
|
+
|
|
119
|
+
기본 루트 Node.js alias 대신 런타임을 명시적으로 고정하고 싶다면 런타임별 서브패스를 사용하세요. 각 서브패스는 해당 `*WebSocketModule.forRoot(...)` 진입점과 일치하는 런타임 lifecycle service export를 제공합니다.
|
|
120
|
+
|
|
121
|
+
| 런타임 | 서브패스 | 모듈 |
|
|
122
|
+
| --- | --- | --- |
|
|
123
|
+
| Node.js | `@fluojs/websockets/node` | `NodeWebSocketModule` |
|
|
124
|
+
| Bun | `@fluojs/websockets/bun` | `BunWebSocketModule` |
|
|
125
|
+
| Deno | `@fluojs/websockets/deno` | `DenoWebSocketModule` |
|
|
126
|
+
| Workers | `@fluojs/websockets/cloudflare-workers` | `CloudflareWorkersWebSocketModule` |
|
|
127
|
+
|
|
128
|
+
## 예제 소스
|
|
129
|
+
|
|
130
|
+
- `packages/websockets/src/module.test.ts`
|
|
131
|
+
- `packages/websockets/src/public-surface.test.ts`
|
|
132
|
+
- `packages/websockets/src/node/node.test.ts`
|
|
133
|
+
- `packages/websockets/src/bun/bun.test.ts`
|
package/README.md
ADDED
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# @fluojs/websockets
|
|
2
|
+
|
|
3
|
+
<p><strong><kbd>English</kbd></strong> <a href="./README.ko.md"><kbd>한국어</kbd></a></p>
|
|
4
|
+
|
|
5
|
+
Decorator-based WebSocket gateway authoring for the fluo runtime.
|
|
6
|
+
|
|
7
|
+
## Table of Contents
|
|
8
|
+
|
|
9
|
+
- [Installation](#installation)
|
|
10
|
+
- [When to Use](#when-to-use)
|
|
11
|
+
- [Quick Start](#quick-start)
|
|
12
|
+
- [Common Patterns](#common-patterns)
|
|
13
|
+
- [Public API Overview](#public-api-overview)
|
|
14
|
+
- [Runtime-Specific Subpaths](#runtime-specific-subpaths)
|
|
15
|
+
- [Example Sources](#example-sources)
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install @fluojs/websockets ws
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## When to Use
|
|
24
|
+
|
|
25
|
+
Use this package to add real-time WebSocket capabilities to your fluo application. It provides a clean, decorator-driven API for handling connections, messages, and disconnections, with first-class support for multiple runtimes (Node.js, Bun, Deno, Cloudflare Workers).
|
|
26
|
+
|
|
27
|
+
## Quick Start
|
|
28
|
+
|
|
29
|
+
Use `WebSocketModule.forRoot()` when you want the default Node.js-backed websocket runtime.
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { WebSocketGateway, OnConnect, OnMessage, WebSocketModule } from '@fluojs/websockets';
|
|
33
|
+
import { Module } from '@fluojs/core';
|
|
34
|
+
|
|
35
|
+
@WebSocketGateway({ path: '/chat' })
|
|
36
|
+
class ChatGateway {
|
|
37
|
+
@OnConnect()
|
|
38
|
+
handleConnect(socket) {
|
|
39
|
+
console.log('Client connected');
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@OnMessage('ping')
|
|
43
|
+
handlePing(payload, socket) {
|
|
44
|
+
socket.send(JSON.stringify({ event: 'pong', data: payload }));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@Module({
|
|
49
|
+
imports: [WebSocketModule.forRoot()],
|
|
50
|
+
providers: [ChatGateway],
|
|
51
|
+
})
|
|
52
|
+
export class AppModule {}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Common Patterns
|
|
56
|
+
|
|
57
|
+
### Shared Path Gateways
|
|
58
|
+
Multiple gateways can share the same path; their handlers will execute in discovery order.
|
|
59
|
+
|
|
60
|
+
```typescript
|
|
61
|
+
@WebSocketGateway({ path: '/events' })
|
|
62
|
+
class MetricsGateway {
|
|
63
|
+
@OnMessage('metrics')
|
|
64
|
+
handleMetrics(data) { /* ... */ }
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### Server-Backed (Node.js Only)
|
|
69
|
+
For Node-based adapters (Express/Fastify), you can opt into a dedicated listener port.
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
@WebSocketGateway({
|
|
73
|
+
path: '/chat',
|
|
74
|
+
serverBacked: { port: 3101 }
|
|
75
|
+
})
|
|
76
|
+
class DedicatedChatGateway {}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### Pre-upgrade guards and bounded defaults
|
|
80
|
+
Use `WebSocketModule.forRoot(...)` to reject anonymous upgrades before the handshake completes and to tune the shared connection/payload limits.
|
|
81
|
+
|
|
82
|
+
```typescript
|
|
83
|
+
import { UnauthorizedException } from '@fluojs/http';
|
|
84
|
+
|
|
85
|
+
WebSocketModule.forRoot({
|
|
86
|
+
limits: {
|
|
87
|
+
maxConnections: 500,
|
|
88
|
+
maxPayloadBytes: 65_536,
|
|
89
|
+
},
|
|
90
|
+
upgrade: {
|
|
91
|
+
guard(request) {
|
|
92
|
+
const authorization = request instanceof Request
|
|
93
|
+
? request.headers.get('authorization')
|
|
94
|
+
: request.headers.authorization;
|
|
95
|
+
|
|
96
|
+
if (authorization !== 'Bearer demo-token') {
|
|
97
|
+
throw new UnauthorizedException('Authentication required.');
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
When omitted, `@fluojs/websockets` now applies bounded defaults for concurrent connections and inbound payload size. Server-backed Node listeners also enable heartbeat timers unless you explicitly set `heartbeat.enabled` to `false`.
|
|
105
|
+
|
|
106
|
+
## Public API Overview
|
|
107
|
+
|
|
108
|
+
- `@WebSocketGateway(options)`: Marks a class as a WebSocket gateway.
|
|
109
|
+
- `@OnConnect()`: Decorator for connection handlers.
|
|
110
|
+
- `@OnMessage(event?)`: Decorator for inbound message handlers.
|
|
111
|
+
- `@OnDisconnect()`: Decorator for disconnection handlers.
|
|
112
|
+
- `WebSocketModule`: Root module for WebSocket integration.
|
|
113
|
+
- `WebSocketModule.forRoot({ upgrade, limits, heartbeat, ... })`: Configures pre-upgrade guards and bounded runtime defaults.
|
|
114
|
+
- `WebSocketGatewayLifecycleService`: Root alias for the default Node.js-backed lifecycle service token.
|
|
115
|
+
- `WebSocketModule.forRoot(...)`: Configures package-level registration for the default root websocket module.
|
|
116
|
+
|
|
117
|
+
## Runtime-Specific Subpaths
|
|
118
|
+
|
|
119
|
+
Use the runtime subpaths when you want an explicit runtime binding instead of the default root Node.js alias. Each subpath exposes its `*WebSocketModule.forRoot(...)` entrypoint plus the matching runtime lifecycle service export.
|
|
120
|
+
|
|
121
|
+
| Runtime | Subpath | Module |
|
|
122
|
+
| --- | --- | --- |
|
|
123
|
+
| Node.js | `@fluojs/websockets/node` | `NodeWebSocketModule` |
|
|
124
|
+
| Bun | `@fluojs/websockets/bun` | `BunWebSocketModule` |
|
|
125
|
+
| Deno | `@fluojs/websockets/deno` | `DenoWebSocketModule` |
|
|
126
|
+
| Workers | `@fluojs/websockets/cloudflare-workers` | `CloudflareWorkersWebSocketModule` |
|
|
127
|
+
|
|
128
|
+
## Example Sources
|
|
129
|
+
|
|
130
|
+
- `packages/websockets/src/module.test.ts`
|
|
131
|
+
- `packages/websockets/src/public-surface.test.ts`
|
|
132
|
+
- `packages/websockets/src/node/node.test.ts`
|
|
133
|
+
- `packages/websockets/src/bun/bun.test.ts`
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type ModuleType } from '@fluojs/runtime';
|
|
2
|
+
import type { WebSocketModuleOptions } from './bun-types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Explicit Bun websocket module entrypoint.
|
|
5
|
+
*/
|
|
6
|
+
export declare class BunWebSocketModule {
|
|
7
|
+
/**
|
|
8
|
+
* Registers the Bun websocket lifecycle service for request-upgrade gateway hosting.
|
|
9
|
+
*
|
|
10
|
+
* @param options Websocket gateway runtime options for guards, limits, heartbeat, and shutdown behavior.
|
|
11
|
+
* @returns A runtime module definition scoped to the Bun websocket adapter.
|
|
12
|
+
*/
|
|
13
|
+
static forRoot(options?: WebSocketModuleOptions): ModuleType;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=bun-module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bun-module.d.ts","sourceRoot":"","sources":["../../src/bun/bun-module.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAIhE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAY7D;;GAEG;AACH,qBAAa,kBAAkB;IAC7B;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,GAAE,sBAA2B,GAAG,UAAU;CAOjE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { defineModule } from '@fluojs/runtime';
|
|
2
|
+
import { WEBSOCKET_OPTIONS_INTERNAL } from '../options-token.internal.js';
|
|
3
|
+
import { BunWebSocketGatewayLifecycleService } from './bun-service.js';
|
|
4
|
+
function createBunWebSocketProviders(options = {}) {
|
|
5
|
+
return [{
|
|
6
|
+
provide: WEBSOCKET_OPTIONS_INTERNAL,
|
|
7
|
+
useValue: options
|
|
8
|
+
}, BunWebSocketGatewayLifecycleService];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Explicit Bun websocket module entrypoint.
|
|
13
|
+
*/
|
|
14
|
+
export class BunWebSocketModule {
|
|
15
|
+
/**
|
|
16
|
+
* Registers the Bun websocket lifecycle service for request-upgrade gateway hosting.
|
|
17
|
+
*
|
|
18
|
+
* @param options Websocket gateway runtime options for guards, limits, heartbeat, and shutdown behavior.
|
|
19
|
+
* @returns A runtime module definition scoped to the Bun websocket adapter.
|
|
20
|
+
*/
|
|
21
|
+
static forRoot(options = {}) {
|
|
22
|
+
class BunWebSocketRuntimeModule extends BunWebSocketModule {}
|
|
23
|
+
return defineModule(BunWebSocketRuntimeModule, {
|
|
24
|
+
providers: createBunWebSocketProviders(options)
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { Container } from '@fluojs/di';
|
|
2
|
+
import type { ApplicationLogger, CompiledModule, OnApplicationBootstrap, OnApplicationShutdown, OnModuleDestroy } from '@fluojs/runtime';
|
|
3
|
+
import type { HttpApplicationAdapter } from '@fluojs/http';
|
|
4
|
+
import type { WebSocketRoomService } from '../types.js';
|
|
5
|
+
import type { WebSocketModuleOptions } from './bun-types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Boots Bun-backed websocket gateways and manages their room lifecycle state.
|
|
8
|
+
*/
|
|
9
|
+
export declare class BunWebSocketGatewayLifecycleService implements OnApplicationBootstrap, OnApplicationShutdown, OnModuleDestroy, WebSocketRoomService {
|
|
10
|
+
private readonly runtimeContainer;
|
|
11
|
+
private readonly compiledModules;
|
|
12
|
+
private readonly logger;
|
|
13
|
+
private readonly adapter;
|
|
14
|
+
private readonly moduleOptions;
|
|
15
|
+
private pendingUpgradeReservations;
|
|
16
|
+
private readonly roomSockets;
|
|
17
|
+
private shutdownPromise;
|
|
18
|
+
private readonly socketRegistry;
|
|
19
|
+
private readonly socketRooms;
|
|
20
|
+
constructor(runtimeContainer: Container, compiledModules: readonly CompiledModule[], logger: ApplicationLogger, adapter: HttpApplicationAdapter, moduleOptions: WebSocketModuleOptions);
|
|
21
|
+
onApplicationBootstrap(): Promise<void>;
|
|
22
|
+
private assertNoServerBackedGatewayOptIn;
|
|
23
|
+
onApplicationShutdown(): Promise<void>;
|
|
24
|
+
onModuleDestroy(): Promise<void>;
|
|
25
|
+
private createBinding;
|
|
26
|
+
private groupDescriptorsByPath;
|
|
27
|
+
private handleUpgradeRequest;
|
|
28
|
+
private bindConnectionHandlers;
|
|
29
|
+
private createConnectionHandlerState;
|
|
30
|
+
private getBufferedMessageCount;
|
|
31
|
+
private getQueuedMessageCount;
|
|
32
|
+
private maybeCompactBufferedMessages;
|
|
33
|
+
private clearBufferedMessages;
|
|
34
|
+
private maybeCompactQueuedMessages;
|
|
35
|
+
private clearQueuedMessages;
|
|
36
|
+
private handleSocketMessage;
|
|
37
|
+
private handleSocketClose;
|
|
38
|
+
private bufferIncomingMessage;
|
|
39
|
+
private enqueueMessageDispatch;
|
|
40
|
+
private drainMessageQueue;
|
|
41
|
+
private enqueueDisconnectDispatch;
|
|
42
|
+
private resolveConnectionGateways;
|
|
43
|
+
private runConnectHandlers;
|
|
44
|
+
private finalizeConnectionBinding;
|
|
45
|
+
private replayBufferedConnectionEvents;
|
|
46
|
+
private resolveBackpressureLimit;
|
|
47
|
+
private resolveUpgradeRejection;
|
|
48
|
+
private closeOversizedPayload;
|
|
49
|
+
private resolveMaxConnectionCount;
|
|
50
|
+
private resolveReservedConnectionCount;
|
|
51
|
+
private tryReserveUpgradeSlot;
|
|
52
|
+
private releaseUpgradeReservation;
|
|
53
|
+
private resolveMaxPayloadBytes;
|
|
54
|
+
private resolveIdleTimeoutSeconds;
|
|
55
|
+
private shutdown;
|
|
56
|
+
private runShutdownLifecycle;
|
|
57
|
+
joinRoom(socketId: string, room: string): void;
|
|
58
|
+
leaveRoom(socketId: string, room: string): void;
|
|
59
|
+
broadcastToRoom(room: string, event: string, data: unknown): void;
|
|
60
|
+
getRooms(socketId: string): ReadonlySet<string>;
|
|
61
|
+
private unregisterSocket;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=bun-service.d.ts.map
|
|
@@ -0,0 +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,iBAAiB,EAAE,cAAc,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AASzI,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAa3D,OAAO,KAAK,EAGV,oBAAoB,EACrB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAyG7D;;GAEG;AACH,qBACa,mCACX,YAAW,sBAAsB,EAAE,qBAAqB,EAAE,eAAe,EAAE,oBAAoB;IAS7F,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;IAXhC,OAAO,CAAC,0BAA0B,CAAK;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;IAC9D,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwD;IACvF,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAkC;gBAG3C,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;IAqB7C,OAAO,CAAC,gCAAgC;IAclC,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC,OAAO,CAAC,aAAa;IAiCrB,OAAO,CAAC,sBAAsB;YAmBhB,oBAAoB;YAkDpB,sBAAsB;IAWpC,OAAO,CAAC,4BAA4B;IAqBpC,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,4BAA4B;IASpC,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,0BAA0B;IASlC,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,iBAAiB;IAYzB,OAAO,CAAC,qBAAqB;IA0C7B,OAAO,CAAC,sBAAsB;YAwDhB,iBAAiB;IAmB/B,OAAO,CAAC,yBAAyB;YAsBnB,yBAAyB;YAczB,kBAAkB;YASlB,yBAAyB;IASvC,OAAO,CAAC,8BAA8B;IAoBtC,OAAO,CAAC,wBAAwB;YAUlB,uBAAuB;IAmDrC,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,yBAAyB;IAUjC,OAAO,CAAC,8BAA8B;IAItC,OAAO,CAAC,qBAAqB;IAS7B,OAAO,CAAC,yBAAyB;IAMjC,OAAO,CAAC,sBAAsB;IAU9B,OAAO,CAAC,yBAAyB;YAcnB,QAAQ;YAUR,oBAAoB;IAYlC,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAmB9C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAc/C,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI;IA4BjE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAU/C,OAAO,CAAC,gBAAgB;CAgBzB"}
|