@fluojs/socket.io 1.0.0 → 1.0.2

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 CHANGED
@@ -125,14 +125,14 @@ Socket.IO 등록은 소유 모듈의 import 경로에서 구성하여 namespace/
125
125
  ## 공개 API 개요
126
126
 
127
127
  - `SocketIoModule.forRoot(options)`
128
- - `SocketIoModule.forRoot({ auth, cors, engine, ... })`
128
+ - `SocketIoModule.forRoot({ global, auth, cors, engine, ... })`: provider visibility, namespace/message guard, 명시적 CORS, Engine.IO payload bound를 구성합니다.
129
129
  - `SOCKETIO_SERVER`
130
130
  - `SOCKETIO_ROOM_SERVICE`
131
131
  - `SocketIoRoomService`: 공유 room 계약에 Socket.IO namespace-aware `joinRoom`, `leaveRoom`, `broadcastToRoom`, `getRooms` helper를 더한 타입입니다.
132
132
  - `SocketIoLifecycleService`: server와 room-service token 뒤에서 동작하는 lifecycle 기반 구현입니다. 애플리케이션 코드는 일반적으로 `SOCKETIO_SERVER` 또는 `SOCKETIO_ROOM_SERVICE`를 주입하세요.
133
133
  - 타입: `SocketIoModuleOptions`, `SocketIoConnectionGuardContext`, `SocketIoConnectionGuard`, `SocketIoMessageGuardContext`, `SocketIoMessageGuard`, `SocketIoGuardRejection`.
134
134
 
135
- `SocketIoModuleOptions`는 `auth`, `buffer`, `cors`, `engine`, `shutdown`, `transports`를 포함합니다. 지원되는 server-backed runtime adapter가 필요하며, unsupported/noop adapter는 bootstrap 중 빠르게 실패합니다.
135
+ `SocketIoModuleOptions`는 `global`, `auth`, `buffer`, `cors`, `engine`, `shutdown`, `transports`를 포함합니다. `global`의 기본값은 `true`이므로 `SOCKETIO_SERVER`와 `SOCKETIO_ROOM_SERVICE`가 앱 전체에서 보입니다. module-local provider visibility가 필요하면 `false`로 설정하세요. 지원되는 server-backed runtime adapter가 필요하며, unsupported/noop adapter는 bootstrap 중 빠르게 실패합니다.
136
136
 
137
137
  ## 지원 플랫폼
138
138
 
package/README.md CHANGED
@@ -127,14 +127,14 @@ Register Socket.IO through module imports in the owning module so namespace/mess
127
127
  ## Public API Overview
128
128
 
129
129
  - `SocketIoModule.forRoot(options)`: Main module for Socket.IO integration.
130
- - `SocketIoModule.forRoot({ auth, cors, engine, ... })`: Configures namespace/message guards plus explicit CORS and Engine.IO payload bounds.
130
+ - `SocketIoModule.forRoot({ global, auth, cors, engine, ... })`: Configures provider visibility, namespace/message guards, explicit CORS, and Engine.IO payload bounds.
131
131
  - `SOCKETIO_SERVER`: Token to inject the raw Socket.IO `Server`.
132
132
  - `SOCKETIO_ROOM_SERVICE`: Token to inject the `SocketIoRoomService`.
133
133
  - `SocketIoRoomService`: Shared room contract plus Socket.IO namespace-aware `joinRoom`, `leaveRoom`, `broadcastToRoom`, and `getRooms` helpers.
134
134
  - `SocketIoLifecycleService`: Lifecycle-backed implementation behind the server and room-service tokens; application code should usually inject `SOCKETIO_SERVER` or `SOCKETIO_ROOM_SERVICE` instead.
135
135
  - Types: `SocketIoModuleOptions`, `SocketIoConnectionGuardContext`, `SocketIoConnectionGuard`, `SocketIoMessageGuardContext`, `SocketIoMessageGuard`, `SocketIoGuardRejection`.
136
136
 
137
- `SocketIoModuleOptions` covers `auth`, `buffer`, `cors`, `engine`, `shutdown`, and `transports`. A supported server-backed runtime adapter is required; unsupported/noop adapters fail fast during bootstrap.
137
+ `SocketIoModuleOptions` covers `global`, `auth`, `buffer`, `cors`, `engine`, `shutdown`, and `transports`. `global` defaults to `true`, which keeps `SOCKETIO_SERVER` and `SOCKETIO_ROOM_SERVICE` visible across the app; set it to `false` when you want module-local provider visibility. A supported server-backed runtime adapter is required; unsupported/noop adapters fail fast during bootstrap.
138
138
 
139
139
  ## Supported Platforms
140
140
 
package/dist/adapter.d.ts CHANGED
@@ -83,11 +83,13 @@ export declare class SocketIoLifecycleService implements OnApplicationBootstrap,
83
83
  private createBunSocketIoBinding;
84
84
  private tryResolvePathname;
85
85
  private matchesSocketIoEnginePath;
86
+ private ensureBunRealtimeBindingForRawServerAccess;
86
87
  private assertNoServerBackedGatewayOptIn;
87
88
  private prepareNamespaceAttachments;
88
89
  private resolveNamespace;
89
90
  private resolveContextNamespace;
90
91
  private resolveRequiredNamespace;
92
+ private resolveRoomOperationTarget;
91
93
  private resolveSocket;
92
94
  private bindNamespaceHandlers;
93
95
  private runConnectionGuard;
@@ -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;AA2SpB;;;;;;GAMG;AACH,qBACa,wBACX,YAAW,sBAAsB,EAAE,qBAAqB,EAAE,eAAe,EAAE,mBAAmB;IAW5F,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;IAbhC,OAAO,CAAC,WAAW,CAA6B;IAChD,OAAO,CAAC,SAAS,CAA8B;IAC/C,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmC;IACpE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA6B;IAC5D,OAAO,CAAC,eAAe,CAA4B;IACnD,OAAO,CAAC,KAAK,CAAS;gBAGH,gBAAgB,EAAE,SAAS,EAC3B,eAAe,EAAE,SAAS,cAAc,EAAE,EAC1C,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,sBAAsB,EAC/B,aAAa,EAAE,qBAAqB;IAGvD;;;;;OAKG;IACH,SAAS,IAAI,MAAM;IAyBnB;;OAEG;IACG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB7C;;OAEG;IACG,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5C;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAItC;;;;;;OAMG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAWtE;;;;;;OAMG;IACH,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAWvE;;;;;;;OAOG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI;IAIzF;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAU/C,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,sBAAsB;IAW9B,OAAO,CAAC,kBAAkB;IAI1B,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,yBAAyB;IAWjC,OAAO,CAAC,wBAAwB;IAyBhC,OAAO,CAAC,kBAAkB;IAQ1B,OAAO,CAAC,yBAAyB;IAIjC,OAAO,CAAC,gCAAgC;IAkBxC,OAAO,CAAC,2BAA2B;IAqBnC,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,uBAAuB;IAU/B,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,aAAa;IAmBrB,OAAO,CAAC,qBAAqB;YAgBf,kBAAkB;YAsBlB,sBAAsB;IAYpC,OAAO,CAAC,4BAA4B;IAQpC,OAAO,CAAC,2BAA2B;IAMnC,OAAO,CAAC,yBAAyB;YAqEnB,8BAA8B;YAyB9B,yBAAyB;YAgBzB,kBAAkB;YAUlB,aAAa;YAyCb,4BAA4B;IA2B1C,OAAO,CAAC,qBAAqB;IAuB7B,OAAO,CAAC,qBAAqB;YAUf,gBAAgB;YAWhB,WAAW;YAaX,mBAAmB;YA8BnB,sBAAsB;IAapC,OAAO,CAAC,0BAA0B;IAsBlC,OAAO,CAAC,0BAA0B;IAYlC,OAAO,CAAC,uBAAuB;IAmB/B,OAAO,CAAC,mBAAmB;IAsC3B,OAAO,CAAC,wBAAwB;YAUlB,QAAQ;YAUR,oBAAoB;IA6BlC,OAAO,CAAC,sBAAsB;CA0B/B"}
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../src/adapter.ts"],"names":[],"mappings":"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"}
package/dist/adapter.js CHANGED
@@ -212,6 +212,7 @@ class SocketIoLifecycleService {
212
212
  }
213
213
  const descriptors = this.discoverGatewayDescriptors();
214
214
  if (descriptors.length === 0) {
215
+ this.ensureBunRealtimeBindingForRawServerAccess();
215
216
  return;
216
217
  }
217
218
  this.assertNoServerBackedGatewayOptIn(descriptors);
@@ -246,12 +247,15 @@ class SocketIoLifecycleService {
246
247
  * @param namespacePath Optional namespace path required when the helper runs outside gateway handler context.
247
248
  */
248
249
  joinRoom(socketId, room, namespacePath) {
249
- const socket = this.resolveSocket(socketId);
250
+ const {
251
+ namespace,
252
+ socket
253
+ } = this.resolveRoomOperationTarget(socketId, namespacePath);
250
254
  if (socket) {
251
255
  void socket.join(room);
252
256
  return;
253
257
  }
254
- this.resolveRequiredNamespace(namespacePath).in(socketId).socketsJoin(room);
258
+ namespace.in(socketId).socketsJoin(room);
255
259
  }
256
260
 
257
261
  /**
@@ -262,12 +266,15 @@ class SocketIoLifecycleService {
262
266
  * @param namespacePath Optional namespace path required when the helper runs outside gateway handler context.
263
267
  */
264
268
  leaveRoom(socketId, room, namespacePath) {
265
- const socket = this.resolveSocket(socketId);
269
+ const {
270
+ namespace,
271
+ socket
272
+ } = this.resolveRoomOperationTarget(socketId, namespacePath);
266
273
  if (socket) {
267
274
  void socket.leave(room);
268
275
  return;
269
276
  }
270
- this.resolveRequiredNamespace(namespacePath).in(socketId).socketsLeave(room);
277
+ namespace.in(socketId).socketsLeave(room);
271
278
  }
272
279
 
273
280
  /**
@@ -367,6 +374,12 @@ class SocketIoLifecycleService {
367
374
  matchesSocketIoEnginePath(pathname) {
368
375
  return pathname === '/socket.io' || pathname === DEFAULT_SOCKETIO_ENGINE_PATH;
369
376
  }
377
+ ensureBunRealtimeBindingForRawServerAccess() {
378
+ if (!hasBunRealtimeBindingHost(this.adapter)) {
379
+ return;
380
+ }
381
+ this.getServer();
382
+ }
370
383
  assertNoServerBackedGatewayOptIn(descriptors) {
371
384
  const runtime = resolveSocketIoBootstrapRuntime(this.adapter);
372
385
  if (runtime.kind !== 'bun') {
@@ -411,6 +424,25 @@ class SocketIoLifecycleService {
411
424
  }
412
425
  return namespace;
413
426
  }
427
+ resolveRoomOperationTarget(socketId, namespacePath) {
428
+ const namespace = namespacePath ? this.resolveRequiredNamespace(namespacePath) : this.resolveContextNamespace();
429
+ if (namespace) {
430
+ return {
431
+ namespace,
432
+ socket: namespace.sockets.get(socketId)
433
+ };
434
+ }
435
+ const socket = this.resolveSocket(socketId);
436
+ if (socket) {
437
+ return {
438
+ namespace: socket.nsp,
439
+ socket
440
+ };
441
+ }
442
+ return {
443
+ namespace: this.resolveRequiredNamespace(namespacePath)
444
+ };
445
+ }
414
446
  resolveSocket(socketId) {
415
447
  const registered = this.socketRegistry.get(socketId);
416
448
  if (registered) {
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "realtime",
10
10
  "platform"
11
11
  ],
12
- "version": "1.0.0",
12
+ "version": "1.0.2",
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/di": "^1.0.0",
41
- "@fluojs/core": "^1.0.0",
40
+ "@fluojs/core": "^1.0.2",
41
+ "@fluojs/di": "^1.0.2",
42
42
  "@fluojs/http": "^1.0.0",
43
- "@fluojs/runtime": "^1.0.0",
44
- "@fluojs/websockets": "^1.0.0"
43
+ "@fluojs/runtime": "^1.1.0",
44
+ "@fluojs/websockets": "^1.0.2"
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",
54
- "@fluojs/platform-fastify": "^1.0.0",
55
- "@fluojs/platform-nodejs": "^1.0.0"
53
+ "@fluojs/platform-express": "^1.0.2",
54
+ "@fluojs/platform-fastify": "^1.0.2",
55
+ "@fluojs/platform-nodejs": "^1.0.2"
56
56
  },
57
57
  "scripts": {
58
58
  "prebuild": "node ../../tooling/scripts/clean-dist.mjs",