@kubun/plugin-service-server 0.14.0 → 0.15.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.
Files changed (2) hide show
  1. package/lib/index.js +19 -4
  2. package/package.json +8 -8
package/lib/index.js CHANGED
@@ -101,7 +101,9 @@ const SERVICE_KIND = 'service';
101
101
  * verification (`methods = [controllerResolverFor(db)]`, pre-transaction).
102
102
  */ export function createServiceServerPlugin(options) {
103
103
  return (params)=>{
104
- const servers = [];
104
+ // Only live servers: an Array that only ever grows would retain one dead
105
+ // server per historical tunnel session for the engine's whole life.
106
+ const servers = new Set();
105
107
  const engine = params.engine;
106
108
  // Same pre-transaction, deadlock-free position as the RPC plugin: Enkaku's
107
109
  // per-message signature verification runs before any handler opens a write
@@ -160,7 +162,14 @@ const SERVICE_KIND = 'service';
160
162
  accessRules: mergedRules
161
163
  };
162
164
  const server = serve(enkakuServeParams);
163
- servers.push(server);
165
+ servers.add(server);
166
+ // Wrap `dispose` so an external dispose (e.g. session close) also
167
+ // self-removes the server, not just the plugin's own teardown loop.
168
+ const disposeServer = server.dispose.bind(server);
169
+ server.dispose = async ()=>{
170
+ servers.delete(server);
171
+ await disposeServer();
172
+ };
164
173
  return server;
165
174
  }
166
175
  };
@@ -168,9 +177,15 @@ const SERVICE_KIND = 'service';
168
177
  name: 'service-server',
169
178
  api,
170
179
  dispose: async ()=>{
171
- for (const server of servers){
172
- await server.dispose();
180
+ // Snapshot: each `dispose()` removes the server from the live set.
181
+ // Drain concurrently — the servers are independent.
182
+ const pending = [];
183
+ for (const server of [
184
+ ...servers
185
+ ]){
186
+ pending.push(server.dispose());
173
187
  }
188
+ await Promise.all(pending);
174
189
  }
175
190
  };
176
191
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubun/plugin-service-server",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "license": "see LICENSE.md",
5
5
  "sideEffects": false,
6
6
  "type": "module",
@@ -18,17 +18,17 @@
18
18
  "@enkaku/server": "^0.21.2",
19
19
  "@kokuin/capability": "^0.3.0",
20
20
  "@kokuin/token": "^0.5.0",
21
- "@kubun/engine": "^0.14.0",
22
- "@kubun/plugin-service-api": "^0.14.0",
23
- "@kubun/protocol": "^0.14.0"
21
+ "@kubun/engine": "^0.15.0",
22
+ "@kubun/plugin-service-api": "^0.15.0",
23
+ "@kubun/protocol": "^0.15.0"
24
24
  },
25
25
  "devDependencies": {
26
- "@enkaku/client": "^0.21.0",
26
+ "@enkaku/client": "^0.21.1",
27
27
  "@enkaku/transport": "^0.21.0",
28
28
  "@kokuin/controller": "^0.1.0",
29
- "@kubun/db": "^0.14.0",
30
- "@kubun/store-controller": "^0.14.0",
31
- "@kubun/store-graph": "^0.14.0",
29
+ "@kubun/db": "^0.15.0",
30
+ "@kubun/store-controller": "^0.15.0",
31
+ "@kubun/store-graph": "^0.15.0",
32
32
  "@kubun/test-utils": "^0.13.0"
33
33
  },
34
34
  "publishConfig": {