@modularizer/plat 0.7.0 → 0.9.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 (92) hide show
  1. package/README.md +75 -0
  2. package/dist/client-server-entry.d.ts +5 -0
  3. package/dist/client-server-entry.d.ts.map +1 -1
  4. package/dist/client-server-entry.js +5 -0
  5. package/dist/client-server-entry.js.map +1 -1
  6. package/dist/client-side-python/runtime.d.ts +1 -0
  7. package/dist/client-side-python/runtime.d.ts.map +1 -1
  8. package/dist/client-side-python/runtime.js +10 -1
  9. package/dist/client-side-python/runtime.js.map +1 -1
  10. package/dist/client-side-server/channel.d.ts +1 -1
  11. package/dist/client-side-server/channel.d.ts.map +1 -1
  12. package/dist/client-side-server/channel.js +113 -4
  13. package/dist/client-side-server/channel.js.map +1 -1
  14. package/dist/client-side-server/identity.d.ts +4 -2
  15. package/dist/client-side-server/identity.d.ts.map +1 -1
  16. package/dist/client-side-server/identity.js +30 -2
  17. package/dist/client-side-server/identity.js.map +1 -1
  18. package/dist/client-side-server/mqtt-webrtc.d.ts +84 -3
  19. package/dist/client-side-server/mqtt-webrtc.d.ts.map +1 -1
  20. package/dist/client-side-server/mqtt-webrtc.js +267 -10
  21. package/dist/client-side-server/mqtt-webrtc.js.map +1 -1
  22. package/dist/client-side-server/plat-bridge.d.ts +40 -0
  23. package/dist/client-side-server/plat-bridge.d.ts.map +1 -0
  24. package/dist/client-side-server/plat-bridge.js +876 -0
  25. package/dist/client-side-server/plat-bridge.js.map +1 -0
  26. package/dist/client-side-server/plat-fetch.d.ts +33 -0
  27. package/dist/client-side-server/plat-fetch.d.ts.map +1 -0
  28. package/dist/client-side-server/plat-fetch.js +199 -0
  29. package/dist/client-side-server/plat-fetch.js.map +1 -0
  30. package/dist/client-side-server/plat-service-worker-client.d.ts +30 -0
  31. package/dist/client-side-server/plat-service-worker-client.d.ts.map +1 -0
  32. package/dist/client-side-server/plat-service-worker-client.js +141 -0
  33. package/dist/client-side-server/plat-service-worker-client.js.map +1 -0
  34. package/dist/client-side-server/plat-service-worker.d.ts +35 -0
  35. package/dist/client-side-server/plat-service-worker.d.ts.map +1 -0
  36. package/dist/client-side-server/plat-service-worker.js +292 -0
  37. package/dist/client-side-server/plat-service-worker.js.map +1 -0
  38. package/dist/client-side-server/protocol.d.ts +68 -1
  39. package/dist/client-side-server/protocol.d.ts.map +1 -1
  40. package/dist/client-side-server/protocol.js +7 -0
  41. package/dist/client-side-server/protocol.js.map +1 -1
  42. package/dist/client-side-server/runtime.d.ts +16 -1
  43. package/dist/client-side-server/runtime.d.ts.map +1 -1
  44. package/dist/client-side-server/runtime.js +41 -13
  45. package/dist/client-side-server/runtime.js.map +1 -1
  46. package/dist/client-side-server/server.d.ts +34 -1
  47. package/dist/client-side-server/server.d.ts.map +1 -1
  48. package/dist/client-side-server/server.js +171 -7
  49. package/dist/client-side-server/server.js.map +1 -1
  50. package/dist/client-side-server/worker-pool.d.ts +20 -0
  51. package/dist/client-side-server/worker-pool.d.ts.map +1 -0
  52. package/dist/client-side-server/worker-pool.js +336 -0
  53. package/dist/client-side-server/worker-pool.js.map +1 -0
  54. package/dist/generated/python-browser-sources.js +4 -4
  55. package/dist/generated/python-browser-sources.js.map +1 -1
  56. package/dist/server/authority-server.d.ts +1 -1
  57. package/dist/server/authority-server.d.ts.map +1 -1
  58. package/dist/server/authority-server.js +27 -14
  59. package/dist/server/authority-server.js.map +1 -1
  60. package/dist/server/core.d.ts +8 -0
  61. package/dist/server/core.d.ts.map +1 -1
  62. package/dist/server/core.js +21 -0
  63. package/dist/server/core.js.map +1 -1
  64. package/dist/server/server.d.ts +4 -0
  65. package/dist/server/server.d.ts.map +1 -1
  66. package/dist/server/server.js +81 -2
  67. package/dist/server/server.js.map +1 -1
  68. package/dist/static/file-response.d.ts +42 -0
  69. package/dist/static/file-response.d.ts.map +1 -0
  70. package/dist/static/file-response.js +57 -0
  71. package/dist/static/file-response.js.map +1 -0
  72. package/dist/static/glob-match.d.ts +16 -0
  73. package/dist/static/glob-match.d.ts.map +1 -0
  74. package/dist/static/glob-match.js +48 -0
  75. package/dist/static/glob-match.js.map +1 -0
  76. package/dist/static/index.d.ts +9 -0
  77. package/dist/static/index.d.ts.map +1 -0
  78. package/dist/static/index.js +6 -0
  79. package/dist/static/index.js.map +1 -0
  80. package/dist/static/mime-types.d.ts +6 -0
  81. package/dist/static/mime-types.d.ts.map +1 -0
  82. package/dist/static/mime-types.js +74 -0
  83. package/dist/static/mime-types.js.map +1 -0
  84. package/dist/static/static-folder.d.ts +69 -0
  85. package/dist/static/static-folder.d.ts.map +1 -0
  86. package/dist/static/static-folder.js +206 -0
  87. package/dist/static/static-folder.js.map +1 -0
  88. package/dist/static/virtual-file-system.d.ts +45 -0
  89. package/dist/static/virtual-file-system.d.ts.map +1 -0
  90. package/dist/static/virtual-file-system.js +100 -0
  91. package/dist/static/virtual-file-system.js.map +1 -0
  92. package/package.json +5 -1
@@ -0,0 +1,336 @@
1
+ import { clientSideServerPublicKeysEqual } from './identity.js';
2
+ import { parseClientSideServerAddress } from './signaling.js';
3
+ import { connectFirstDiscovery, createClientSideServerMQTTWebRTCPeerSession, discoverClientSideServers, } from './mqtt-webrtc.js';
4
+ export function createClientSideServerMultiWorkerPool(options = {}) {
5
+ const sessions = new Map();
6
+ const normalizeAddress = (input) => typeof input === 'string' ? parseClientSideServerAddress(input) : input;
7
+ return {
8
+ async connect(input) {
9
+ const address = normalizeAddress(input);
10
+ const existing = sessions.get(address.href);
11
+ if (existing) {
12
+ const session = await existing;
13
+ if (session.isOpen())
14
+ return session;
15
+ sessions.delete(address.href);
16
+ }
17
+ const created = createWorkerPoolSession(address, options);
18
+ sessions.set(address.href, created);
19
+ try {
20
+ return await created;
21
+ }
22
+ catch (error) {
23
+ sessions.delete(address.href);
24
+ throw error;
25
+ }
26
+ },
27
+ async close(input) {
28
+ const address = normalizeAddress(input);
29
+ const existing = sessions.get(address.href);
30
+ if (!existing)
31
+ return;
32
+ sessions.delete(address.href);
33
+ const session = await existing;
34
+ await session.close();
35
+ },
36
+ async closeAll() {
37
+ const pending = Array.from(sessions.values());
38
+ sessions.clear();
39
+ for (const p of pending) {
40
+ const session = await p;
41
+ await session.close();
42
+ }
43
+ },
44
+ };
45
+ }
46
+ async function createWorkerPoolSession(address, options) {
47
+ const poolOpts = options.workerPool ?? {};
48
+ const maxActive = poolOpts.maxActiveWorkers ?? 1;
49
+ const maxStandby = poolOpts.maxStandbyWorkers ?? 0;
50
+ const maxTotal = poolOpts.maxTotalConnections ?? (maxActive + maxStandby);
51
+ const rediscoveryThreshold = poolOpts.rediscoveryThreshold ?? 1;
52
+ const healthIntervalMs = poolOpts.healthCheckIntervalMs ?? 10_000;
53
+ const healthTimeoutMs = poolOpts.healthCheckTimeoutMs ?? 5_000;
54
+ const routingStrategy = poolOpts.routingStrategy ?? 'weighted-random';
55
+ const workers = [];
56
+ const listeners = new Set();
57
+ let roundRobinIndex = 0;
58
+ let healthTimer;
59
+ let closed = false;
60
+ // Connect to primary immediately while discovering others in parallel
61
+ const { primary, discovery } = await connectFirstDiscovery(address, options);
62
+ const primaryWorker = createWorkerFromSession(primary, true);
63
+ workers.push(primaryWorker);
64
+ // Set up message forwarding from primary
65
+ setupWorkerMessageForwarding(primaryWorker);
66
+ // Connect to additional workers from discovery results in background
67
+ void discovery.then(async (result) => {
68
+ if (closed)
69
+ return;
70
+ await connectAdditionalWorkers(result);
71
+ });
72
+ // Start health checks
73
+ if (healthIntervalMs > 0) {
74
+ healthTimer = setInterval(() => void runHealthChecks(), healthIntervalMs);
75
+ }
76
+ async function connectAdditionalWorkers(result) {
77
+ const newCandidates = result.candidates.filter((c) => !c.alreadyConnected);
78
+ let activeCount = workers.filter((w) => w.status === 'active').length;
79
+ let standbyCount = workers.filter((w) => w.status === 'standby').length;
80
+ let totalCount = workers.length;
81
+ for (const candidate of newCandidates) {
82
+ if (totalCount >= maxTotal)
83
+ break;
84
+ if (closed)
85
+ break;
86
+ const needActive = activeCount < maxActive;
87
+ const needStandby = standbyCount < maxStandby;
88
+ if (!needActive && !needStandby)
89
+ break;
90
+ try {
91
+ const session = await createClientSideServerMQTTWebRTCPeerSession(address, options, candidate.instanceId);
92
+ if (closed) {
93
+ await session.close?.();
94
+ return;
95
+ }
96
+ const worker = createWorkerFromCandidate(session, candidate);
97
+ if (needActive) {
98
+ worker.status = 'active';
99
+ worker.weight = resolveWeight(candidate, options);
100
+ activeCount++;
101
+ }
102
+ else {
103
+ worker.status = 'standby';
104
+ worker.weight = 0;
105
+ standbyCount++;
106
+ }
107
+ workers.push(worker);
108
+ totalCount++;
109
+ setupWorkerMessageForwarding(worker);
110
+ }
111
+ catch {
112
+ // Connection to this candidate failed, skip it
113
+ }
114
+ }
115
+ if (poolOpts.assignWeights) {
116
+ poolOpts.assignWeights(workers);
117
+ }
118
+ }
119
+ function createWorkerFromSession(session, isActive) {
120
+ return {
121
+ instanceId: session.peerId,
122
+ session,
123
+ identity: session.identity,
124
+ status: isActive ? 'active' : 'standby',
125
+ weight: isActive ? 3 : 0,
126
+ serverAdvertisedWeight: 3,
127
+ authorityVerified: false,
128
+ pendingRequests: 0,
129
+ totalRequests: 0,
130
+ totalErrors: 0,
131
+ connectedAt: session.connectedAt,
132
+ lastPongAt: Date.now(),
133
+ };
134
+ }
135
+ function createWorkerFromCandidate(session, candidate) {
136
+ const advertisedWeight = candidate.workerInfo.weight ?? 3;
137
+ return {
138
+ instanceId: candidate.instanceId,
139
+ session,
140
+ identity: candidate.identity,
141
+ authorityRecord: candidate.authorityRecord,
142
+ status: 'verifying',
143
+ weight: 0,
144
+ serverAdvertisedWeight: advertisedWeight,
145
+ authorityVerified: !!candidate.authorityRecord,
146
+ pendingRequests: 0,
147
+ totalRequests: 0,
148
+ totalErrors: 0,
149
+ connectedAt: session.connectedAt,
150
+ lastPongAt: Date.now(),
151
+ };
152
+ }
153
+ function resolveWeight(candidate, opts) {
154
+ // Only trust self-reported weights from authority-verified servers
155
+ if (candidate.authorityRecord) {
156
+ return candidate.workerInfo.weight ?? 3;
157
+ }
158
+ return 3;
159
+ }
160
+ function setupWorkerMessageForwarding(worker) {
161
+ worker.session.subscribe(async (msg) => {
162
+ // Handle control messages
163
+ if ('platcss' in msg) {
164
+ const control = msg;
165
+ if (control.platcss === 'pong') {
166
+ worker.lastPongAt = Date.now();
167
+ return;
168
+ }
169
+ if (control.platcss === 'drain') {
170
+ worker.status = 'draining';
171
+ promoteStandbyIfNeeded();
172
+ return;
173
+ }
174
+ }
175
+ // Forward all other messages to pool subscribers
176
+ for (const listener of listeners) {
177
+ await listener(msg);
178
+ }
179
+ });
180
+ }
181
+ function promoteStandbyIfNeeded() {
182
+ const activeCount = workers.filter((w) => w.status === 'active').length;
183
+ if (activeCount >= maxActive)
184
+ return;
185
+ const standby = workers.find((w) => w.status === 'standby');
186
+ if (standby) {
187
+ standby.status = 'active';
188
+ standby.weight = standby.serverAdvertisedWeight;
189
+ if (poolOpts.assignWeights) {
190
+ poolOpts.assignWeights(workers);
191
+ }
192
+ }
193
+ }
194
+ function maybeRediscover() {
195
+ const activeCount = workers.filter((w) => w.status === 'active').length;
196
+ if (activeCount < rediscoveryThreshold && !closed) {
197
+ void rediscover();
198
+ }
199
+ }
200
+ async function rediscover() {
201
+ if (closed)
202
+ return;
203
+ const result = await discoverClientSideServers(address.serverName, options);
204
+ // Mark candidates that we already have connections to
205
+ for (const candidate of result.candidates) {
206
+ for (const worker of workers) {
207
+ if (worker.identity && candidate.identity
208
+ && clientSideServerPublicKeysEqual(worker.identity.publicKeyJwk, candidate.identity.publicKeyJwk)) {
209
+ candidate.alreadyConnected = true;
210
+ break;
211
+ }
212
+ }
213
+ }
214
+ await connectAdditionalWorkers(result);
215
+ }
216
+ async function runHealthChecks() {
217
+ const now = Date.now();
218
+ for (const worker of workers) {
219
+ if (worker.status !== 'active' && worker.status !== 'standby')
220
+ continue;
221
+ if (!worker.session.isOpen()) {
222
+ worker.status = 'failed';
223
+ promoteStandbyIfNeeded();
224
+ maybeRediscover();
225
+ continue;
226
+ }
227
+ try {
228
+ await worker.session.send({ platcss: 'ping', ts: now });
229
+ }
230
+ catch {
231
+ worker.status = 'failed';
232
+ promoteStandbyIfNeeded();
233
+ maybeRediscover();
234
+ continue;
235
+ }
236
+ // Check if previous ping timed out
237
+ if (worker.lastPongAt && (now - worker.lastPongAt) > (healthIntervalMs + healthTimeoutMs)) {
238
+ worker.status = 'failed';
239
+ promoteStandbyIfNeeded();
240
+ maybeRediscover();
241
+ }
242
+ }
243
+ }
244
+ function selectWorker() {
245
+ const active = workers.filter((w) => w.status === 'active' && w.session.isOpen());
246
+ if (active.length === 0)
247
+ return undefined;
248
+ switch (routingStrategy) {
249
+ case 'round-robin': {
250
+ roundRobinIndex = (roundRobinIndex + 1) % active.length;
251
+ return active[roundRobinIndex];
252
+ }
253
+ case 'least-pending': {
254
+ return active.sort((a, b) => {
255
+ if (a.pendingRequests !== b.pendingRequests)
256
+ return a.pendingRequests - b.pendingRequests;
257
+ return b.weight - a.weight;
258
+ })[0];
259
+ }
260
+ case 'primary-with-fallback': {
261
+ return active.sort((a, b) => b.weight - a.weight)[0];
262
+ }
263
+ case 'weighted-random':
264
+ default: {
265
+ const totalWeight = active.reduce((sum, w) => sum + Math.max(w.weight, 1), 0);
266
+ let rand = Math.random() * totalWeight;
267
+ for (const worker of active) {
268
+ rand -= Math.max(worker.weight, 1);
269
+ if (rand <= 0)
270
+ return worker;
271
+ }
272
+ return active[active.length - 1];
273
+ }
274
+ }
275
+ }
276
+ return {
277
+ address,
278
+ workers,
279
+ isOpen() {
280
+ return workers.some((w) => w.status === 'active' && w.session.isOpen());
281
+ },
282
+ async send(message) {
283
+ const worker = selectWorker();
284
+ if (!worker) {
285
+ throw new Error(`No active workers available for ${address.serverName}`);
286
+ }
287
+ worker.pendingRequests++;
288
+ worker.totalRequests++;
289
+ worker.lastRequestAt = Date.now();
290
+ try {
291
+ await worker.session.send(message);
292
+ }
293
+ catch (error) {
294
+ worker.totalErrors++;
295
+ worker.lastErrorAt = Date.now();
296
+ throw error;
297
+ }
298
+ finally {
299
+ worker.pendingRequests--;
300
+ }
301
+ },
302
+ subscribe(listener) {
303
+ listeners.add(listener);
304
+ return () => listeners.delete(listener);
305
+ },
306
+ async rediscover() {
307
+ await rediscover();
308
+ },
309
+ setWorkerWeight(instanceId, weight) {
310
+ const worker = workers.find((w) => w.instanceId === instanceId);
311
+ if (worker) {
312
+ worker.weight = weight;
313
+ if (weight === 0 && worker.status === 'active') {
314
+ worker.status = 'standby';
315
+ }
316
+ else if (weight > 0 && worker.status === 'standby') {
317
+ worker.status = 'active';
318
+ }
319
+ }
320
+ },
321
+ async close() {
322
+ closed = true;
323
+ if (healthTimer) {
324
+ clearInterval(healthTimer);
325
+ healthTimer = undefined;
326
+ }
327
+ for (const worker of workers) {
328
+ worker.status = 'closed';
329
+ await worker.session.close?.();
330
+ }
331
+ workers.length = 0;
332
+ listeners.clear();
333
+ },
334
+ };
335
+ }
336
+ //# sourceMappingURL=worker-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-pool.js","sourceRoot":"","sources":["../../src/client-side-server/worker-pool.ts"],"names":[],"mappings":"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"}