@fluojs/socket.io 1.0.0-beta.3 → 1.0.0-beta.4
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 +5 -1
- package/README.md +5 -1
- package/dist/adapter.d.ts.map +1 -1
- package/dist/adapter.js +10 -3
- package/package.json +7 -7
package/README.ko.md
CHANGED
|
@@ -105,13 +105,17 @@ SocketIoModule.forRoot({
|
|
|
105
105
|
|
|
106
106
|
`cors`를 생략하면 `@fluojs/socket.io`는 `{ credentials: false, origin: false }`를 기본값으로 사용하므로 cross-origin 노출은 명시적 opt-in이 필요합니다. `engine.maxHttpBufferSize`를 생략하면 어댑터가 1 MiB Engine.IO payload 상한을 적용합니다. 기본값에는 `buffer.maxPendingMessagesPerSocket: 128`, `buffer.overflowPolicy: 'drop-oldest'`, `shutdown.timeoutMs: 5000`도 포함됩니다.
|
|
107
107
|
|
|
108
|
+
정적 `@WebSocketGateway({ path })` namespace는 fluo gateway discovery가 소유하며 Socket.IO dynamic child namespace로 취급하지 않습니다. 어댑터는 이러한 정적 namespace에 대해 Socket.IO의 `cleanupEmptyChildNamespaces` 동작을 비활성화합니다. 애플리케이션 코드가 raw `SOCKETIO_SERVER` 접근으로 dynamic child namespace를 만들면 해당 소유권과 cleanup 정책은 애플리케이션 수준 Socket.IO 통합이 담당합니다.
|
|
109
|
+
|
|
110
|
+
애플리케이션 종료 중 Socket.IO client 정리는 Socket.IO가 소유하지만 underlying HTTP server는 이를 제공한 platform adapter 또는 shared HTTP server 통합이 계속 소유합니다. 어댑터는 `io.close(...)` 전에 해당 HTTP server 참조를 분리하므로 client cleanup은 실행되지만 Socket.IO가 adapter-owned/shared HTTP listener를 닫지는 않습니다. 동일한 managed Socket.IO instance 주변에 별도의 manual socket-disconnect 경로를 추가하지 마세요.
|
|
111
|
+
|
|
108
112
|
### Guard 계약
|
|
109
113
|
|
|
110
114
|
`auth.connection`은 namespace connect handler가 실행되기 전에 `SocketIoConnectionGuardContext`를 받습니다. `auth.message`는 message handler가 실행되기 전에 `SocketIoMessageGuardContext`를 받습니다. Guard는 `true`, `false`, 또는 `message`, optional `data`, optional `disconnect`를 가진 `SocketIoGuardRejection`을 반환할 수 있으며, message rejection은 `{ error, data }` 형태의 ACK payload를 사용합니다.
|
|
111
115
|
|
|
112
116
|
### Bun 전용 참고
|
|
113
117
|
|
|
114
|
-
Bun path는 `@socket.io/bun-engine`을 통해 Socket.IO를 지원하지만 static CORS shape가 필요합니다. CORS delegate function과 `cors.origin` array 안의 boolean entry는 지원하지 않습니다. `@WebSocketGateway({ serverBacked })`는 Bun에서 지원하지 않습니다.
|
|
118
|
+
Bun path는 `@socket.io/bun-engine`을 통해 Socket.IO를 지원하지만 static CORS shape가 필요합니다. CORS delegate function과 `cors.origin` array 안의 boolean entry는 지원하지 않습니다. `@WebSocketGateway({ serverBacked })`는 Bun에서 지원하지 않습니다. Bun의 HTTP request body limit(`maxRequestBodySize`)과 WebSocket frame limit(`websocket.maxPayloadLength`)은 별도 host contract입니다. 어댑터는 polling request와 websocket frame이 같은 inbound payload bound를 따르도록 두 값을 모두 `engine.maxHttpBufferSize`에서 매핑합니다.
|
|
115
119
|
|
|
116
120
|
### 모듈 등록
|
|
117
121
|
`SocketIoModule.forRoot(...)`로 Socket.IO를 등록합니다.
|
package/README.md
CHANGED
|
@@ -107,13 +107,17 @@ SocketIoModule.forRoot({
|
|
|
107
107
|
|
|
108
108
|
When `cors` is omitted, `@fluojs/socket.io` defaults to `{ credentials: false, origin: false }` so cross-origin exposure stays opt-in. When `engine.maxHttpBufferSize` is omitted, the adapter applies a bounded 1 MiB Engine.IO payload limit. Defaults also include `buffer.maxPendingMessagesPerSocket: 128`, `buffer.overflowPolicy: 'drop-oldest'`, and `shutdown.timeoutMs: 5000`.
|
|
109
109
|
|
|
110
|
+
Static `@WebSocketGateway({ path })` namespaces are owned by fluo's gateway discovery and are not treated as Socket.IO dynamic child namespaces. The adapter keeps Socket.IO's `cleanupEmptyChildNamespaces` behavior disabled for those static namespaces. If application code creates dynamic child namespaces through raw `SOCKETIO_SERVER` access, that ownership and cleanup policy stays with the application-level Socket.IO integration.
|
|
111
|
+
|
|
112
|
+
During application shutdown, Socket.IO owns cleanup for connected Socket.IO clients, but the underlying HTTP server remains owned by the platform adapter or shared HTTP server integration that supplied it. The adapter detaches that HTTP server reference before `io.close(...)`, so client cleanup still runs while Socket.IO does not close adapter-owned/shared HTTP listeners. Do not add a second manual socket-disconnect path around the same managed Socket.IO instance.
|
|
113
|
+
|
|
110
114
|
### Guard contracts
|
|
111
115
|
|
|
112
116
|
`auth.connection` receives `SocketIoConnectionGuardContext` before namespace connect handlers run. `auth.message` receives `SocketIoMessageGuardContext` before message handlers run. Guards can return `true`, `false`, or a `SocketIoGuardRejection` with `message`, optional `data`, and optional `disconnect`; message rejections use ACK payloads shaped as `{ error, data }`.
|
|
113
117
|
|
|
114
118
|
### Bun-specific notes
|
|
115
119
|
|
|
116
|
-
The Bun path supports Socket.IO through `@socket.io/bun-engine`, but it requires static CORS shapes: no CORS delegate functions and no boolean entries inside `cors.origin` arrays. `@WebSocketGateway({ serverBacked })` is not supported on Bun.
|
|
120
|
+
The Bun path supports Socket.IO through `@socket.io/bun-engine`, but it requires static CORS shapes: no CORS delegate functions and no boolean entries inside `cors.origin` arrays. `@WebSocketGateway({ serverBacked })` is not supported on Bun. Bun's HTTP request body limit (`maxRequestBodySize`) and WebSocket frame limit (`websocket.maxPayloadLength`) are separate host contracts; the adapter maps both from `engine.maxHttpBufferSize` so polling requests and websocket frames share the configured inbound payload bound.
|
|
117
121
|
|
|
118
122
|
### Module registration
|
|
119
123
|
Register Socket.IO with `SocketIoModule.forRoot(...)`.
|
package/dist/adapter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,YAAY,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAiC,MAAM,cAAc,CAAC;AAE1F,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,sBAAsB,EACtB,qBAAqB,EACrB,eAAe,EAChB,MAAM,iBAAiB,CAAC;AAQzB,OAAO,EAAE,MAAM,EAAmD,MAAM,WAAW,CAAC;AAGpF,OAAO,KAAK,EAEV,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
|
package/dist/adapter.js
CHANGED
|
@@ -296,7 +296,9 @@ class SocketIoLifecycleService {
|
|
|
296
296
|
return new Set(socket.rooms);
|
|
297
297
|
}
|
|
298
298
|
createServerOptions() {
|
|
299
|
-
const options = {
|
|
299
|
+
const options = {
|
|
300
|
+
cleanupEmptyChildNamespaces: false
|
|
301
|
+
};
|
|
300
302
|
options.cors = this.resolveCorsOptions();
|
|
301
303
|
options.maxHttpBufferSize = this.resolveMaxHttpBufferSize();
|
|
302
304
|
if (this.moduleOptions.transports !== undefined) {
|
|
@@ -309,6 +311,7 @@ class SocketIoLifecycleService {
|
|
|
309
311
|
path: DEFAULT_SOCKETIO_ENGINE_PATH
|
|
310
312
|
};
|
|
311
313
|
options.cors = normalizeCorsForBunEngine(this.resolveCorsOptions());
|
|
314
|
+
options.maxHttpBufferSize = this.resolveMaxHttpBufferSize();
|
|
312
315
|
return options;
|
|
313
316
|
}
|
|
314
317
|
resolveCorsOptions() {
|
|
@@ -335,6 +338,7 @@ class SocketIoLifecycleService {
|
|
|
335
338
|
}
|
|
336
339
|
createBunSocketIoBinding(engine) {
|
|
337
340
|
const handler = engine.handler();
|
|
341
|
+
const maxHttpBufferSize = this.resolveMaxHttpBufferSize();
|
|
338
342
|
return {
|
|
339
343
|
fetch: async (request, server) => {
|
|
340
344
|
const pathname = this.tryResolvePathname(request.url);
|
|
@@ -344,10 +348,10 @@ class SocketIoLifecycleService {
|
|
|
344
348
|
return await engine.handleRequest(request, server);
|
|
345
349
|
},
|
|
346
350
|
idleTimeout: handler.idleTimeout,
|
|
347
|
-
maxRequestBodySize:
|
|
351
|
+
maxRequestBodySize: maxHttpBufferSize,
|
|
348
352
|
websocket: {
|
|
349
353
|
close: handler.websocket.close,
|
|
350
|
-
maxPayloadLength:
|
|
354
|
+
maxPayloadLength: maxHttpBufferSize,
|
|
351
355
|
message: handler.websocket.message,
|
|
352
356
|
open: handler.websocket.open
|
|
353
357
|
}
|
|
@@ -763,6 +767,9 @@ class SocketIoLifecycleService {
|
|
|
763
767
|
settled = true;
|
|
764
768
|
reject(new Error(`Timed out while closing Socket.IO server after ${String(timeoutMs)}ms.`));
|
|
765
769
|
}, timeoutMs);
|
|
770
|
+
|
|
771
|
+
// Socket.IO owns client cleanup; the shared HTTP server remains owned by the platform adapter.
|
|
772
|
+
io.httpServer = undefined;
|
|
766
773
|
io.close(() => {
|
|
767
774
|
if (settled) {
|
|
768
775
|
return;
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"realtime",
|
|
10
10
|
"platform"
|
|
11
11
|
],
|
|
12
|
-
"version": "1.0.0-beta.
|
|
12
|
+
"version": "1.0.0-beta.4",
|
|
13
13
|
"private": false,
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"repository": {
|
|
@@ -37,11 +37,11 @@
|
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@socket.io/bun-engine": "^0.1.0",
|
|
40
|
-
"@fluojs/
|
|
41
|
-
"@fluojs/di": "^1.0.0-beta.6",
|
|
40
|
+
"@fluojs/di": "^1.0.0-beta.7",
|
|
42
41
|
"@fluojs/http": "^1.0.0-beta.10",
|
|
43
|
-
"@fluojs/runtime": "^1.0.0-beta.
|
|
44
|
-
"@fluojs/websockets": "^1.0.0-beta.
|
|
42
|
+
"@fluojs/runtime": "^1.0.0-beta.12",
|
|
43
|
+
"@fluojs/websockets": "^1.0.0-beta.6",
|
|
44
|
+
"@fluojs/core": "^1.0.0-beta.5"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
47
|
"socket.io": "^4.0.0"
|
|
@@ -50,9 +50,9 @@
|
|
|
50
50
|
"socket.io": "^4.8.1",
|
|
51
51
|
"socket.io-client": "^4.8.1",
|
|
52
52
|
"vitest": "^3.2.4",
|
|
53
|
-
"@fluojs/platform-express": "^1.0.0-beta.6",
|
|
54
53
|
"@fluojs/platform-fastify": "^1.0.0-beta.8",
|
|
55
|
-
"@fluojs/platform-nodejs": "^1.0.0-beta.
|
|
54
|
+
"@fluojs/platform-nodejs": "^1.0.0-beta.5",
|
|
55
|
+
"@fluojs/platform-express": "^1.0.0-beta.7"
|
|
56
56
|
},
|
|
57
57
|
"scripts": {
|
|
58
58
|
"prebuild": "node ../../tooling/scripts/clean-dist.mjs",
|