@spine-event-engine/deployment 2.0.0-snapshot.10

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.
@@ -0,0 +1,614 @@
1
+ /*
2
+ * Copyright 2026, CodeMatters. All rights reserved.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5
+ * in compliance with the License. You may obtain a copy of the License at
6
+ *
7
+ * https://www.apache.org/licenses/LICENSE-2.0
8
+ *
9
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
10
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11
+ * or implied. See the License for the specific language governing permissions and limitations under
12
+ * the License.
13
+ */
14
+ const childCleanupTimeoutMs = 1_000;
15
+ /**
16
+ * Manages ephemeral backend membership and its native subscription children.
17
+ * Logical-definition persistence intentionally remains with callers.
18
+ */
19
+ export class BackendMembershipKernel {
20
+ #options;
21
+ #limit;
22
+ #maxChildBytes;
23
+ #members = new Map();
24
+ #definitions = new Map();
25
+ #nodes = [];
26
+ #generation = 0;
27
+ #incarnation = 0;
28
+ #next = 0;
29
+ #closed = false;
30
+ #running;
31
+ #pending;
32
+ #completion = Promise.resolve();
33
+ #complete;
34
+ #creating = new Set();
35
+ #childStarts = new Set();
36
+ #failedDisposals = new Set();
37
+ #failedChildCleanup = new Set();
38
+ #childCleanup = new Map();
39
+ #closing;
40
+ /**
41
+ * Creates a kernel with bounded member and child creation.
42
+ *
43
+ * @param options Configures member creation and child subscription handling.
44
+ */
45
+ constructor(options) {
46
+ if (options.maxConcurrentStarts !== undefined &&
47
+ (!Number.isSafeInteger(options.maxConcurrentStarts) || options.maxConcurrentStarts < 1))
48
+ throw new RangeError("maxConcurrentStarts must be a positive safe integer.");
49
+ if (options.maxChildBytes !== undefined &&
50
+ (!Number.isSafeInteger(options.maxChildBytes) || options.maxChildBytes < 1))
51
+ throw new RangeError("maxChildBytes must be a positive safe integer.");
52
+ this.#options = options;
53
+ this.#limit = options.maxConcurrentStarts ?? 8;
54
+ this.#maxChildBytes = options.maxChildBytes ?? 1_048_576;
55
+ }
56
+ /**
57
+ * Updates the live member set from a complete discovery snapshot.
58
+ *
59
+ * @param members Supplies the complete member snapshot.
60
+ * @returns Completion of member reconciliation.
61
+ */
62
+ reconcile(members) {
63
+ return this.#schedule(members, true);
64
+ }
65
+ /**
66
+ * Creates children for one retained logical subscription definition.
67
+ *
68
+ * @param definition Supplies the logical subscription definition.
69
+ * @param signal Cancels subscription creation.
70
+ * @param maxChildBytes Limits each child envelope size.
71
+ * @returns Completion of child creation.
72
+ */
73
+ async subscribe(definition, signal, maxChildBytes = this.#maxChildBytes) {
74
+ if (!Number.isSafeInteger(maxChildBytes) || maxChildBytes < 1)
75
+ throw new RangeError("maxChildBytes must be a positive safe integer.");
76
+ const key = this.#options.definitionKey(definition);
77
+ if (key === undefined || key.length === 0)
78
+ throw new Error("subscription ID is required");
79
+ if (signal.aborted || this.#closed || this.#nodes.length === 0)
80
+ throw new Error("backend membership is unavailable.");
81
+ if (!this.#definitions.has(key))
82
+ this.#definitions.set(key, {
83
+ definition: definition.slice(),
84
+ maxChildBytes,
85
+ children: new Map(),
86
+ starts: new Set(),
87
+ active: false,
88
+ activationController: undefined,
89
+ updates: undefined,
90
+ failure: undefined,
91
+ });
92
+ const state = this.#definitions.get(key);
93
+ if (state === undefined)
94
+ throw new Error("subscription creation was cancelled");
95
+ await this.#schedule(this.#nodes, false);
96
+ // Re-evaluate cancellation after reconciliation can yield to close().
97
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
98
+ if (signal.aborted || this.#isClosed() || !this.#definitions.has(key))
99
+ throw new Error("subscription creation was cancelled");
100
+ if (state.failure !== undefined || state.children.size !== this.#members.size) {
101
+ await this.#removeDefinition(key, new AbortController().signal);
102
+ throw state.failure ?? new Error("backend membership is unavailable.");
103
+ }
104
+ }
105
+ /**
106
+ * Updates live children for one previously retained logical definition.
107
+ *
108
+ * @param definition Supplies the retained logical definition.
109
+ * @param maxChildBytes Limits each child envelope size.
110
+ * @returns Completion of child recreation.
111
+ */
112
+ async rehydrate(definition, maxChildBytes = this.#maxChildBytes) {
113
+ if (!Number.isSafeInteger(maxChildBytes) || maxChildBytes < 1)
114
+ throw new RangeError("maxChildBytes must be a positive safe integer.");
115
+ if (this.#closed)
116
+ throw new Error("backend membership kernel is closed.");
117
+ const key = this.#options.definitionKey(definition);
118
+ if (key === undefined || key.length === 0)
119
+ throw new Error("subscription ID is required");
120
+ if (!this.#definitions.has(key))
121
+ this.#definitions.set(key, {
122
+ definition: definition.slice(),
123
+ maxChildBytes,
124
+ children: new Map(),
125
+ starts: new Set(),
126
+ active: false,
127
+ activationController: undefined,
128
+ updates: undefined,
129
+ failure: undefined,
130
+ });
131
+ await this.#schedule(this.#nodes, false);
132
+ const failure = this.#definitions.get(key)?.failure;
133
+ if (failure !== undefined)
134
+ throw failure;
135
+ }
136
+ /**
137
+ * Creates update relay for a retained logical definition until cancellation.
138
+ *
139
+ * @param definition Supplies the retained logical definition.
140
+ * @param updates Receives relayed child updates.
141
+ * @param signal Cancels update relay.
142
+ * @returns Completion after cancellation.
143
+ */
144
+ async activate(definition, updates, signal) {
145
+ const key = this.#options.definitionKey(definition);
146
+ const state = key === undefined ? undefined : this.#definitions.get(key);
147
+ if (state === undefined)
148
+ return;
149
+ if (state.activationController !== undefined)
150
+ throw new Error("subscription activation is already active");
151
+ const controller = new AbortController();
152
+ state.activationController = controller;
153
+ state.active = true;
154
+ state.updates = updates;
155
+ const abort = () => {
156
+ controller.abort();
157
+ for (const start of state.starts)
158
+ start.abort();
159
+ for (const child of state.children.values())
160
+ child.activationController?.abort();
161
+ };
162
+ if (signal.aborted) {
163
+ abort();
164
+ state.activationController = undefined;
165
+ state.active = false;
166
+ return;
167
+ }
168
+ signal.addEventListener("abort", abort, { once: true });
169
+ try {
170
+ await this.#schedule(this.#nodes, false);
171
+ await Promise.race([
172
+ BackendMembershipKernel.waitForAbort(signal),
173
+ BackendMembershipKernel.waitForAbort(controller.signal),
174
+ ]);
175
+ }
176
+ finally {
177
+ signal.removeEventListener("abort", abort);
178
+ if (state.activationController === controller) {
179
+ state.activationController = undefined;
180
+ state.active = false;
181
+ state.updates = undefined;
182
+ }
183
+ }
184
+ }
185
+ /**
186
+ * Clears one logical definition and its live child subscriptions.
187
+ *
188
+ * @param definition Supplies the logical definition to remove.
189
+ * @param signal Cancels child cleanup when supported.
190
+ * @returns Completion of child cleanup.
191
+ */
192
+ async cancel(definition, signal) {
193
+ const key = this.#options.definitionKey(definition);
194
+ if (key === undefined)
195
+ return;
196
+ if (this.#definitions.has(key))
197
+ await this.#removeDefinition(key, signal);
198
+ if (this.#failedChildCleanup.size === 0)
199
+ return;
200
+ await this.#retryChildCleanup();
201
+ if (this.#failedChildCleanup.size > 0)
202
+ throw new Error("backend child cleanup remains incomplete.");
203
+ }
204
+ /**
205
+ * Returns a unary response from the next available member.
206
+ *
207
+ * @param request Supplies the request to forward.
208
+ * @returns The backend response bytes.
209
+ */
210
+ forward(request) {
211
+ const eligible = [...this.#members.values()].filter((member) => member.eligible);
212
+ const member = eligible[this.#next++ % eligible.length];
213
+ return member === undefined
214
+ ? Promise.reject(new Error("backend membership is unavailable."))
215
+ : member.client.forward(request);
216
+ }
217
+ /**
218
+ * Clears live work and closes every member connection.
219
+ *
220
+ * @returns Completion of member cleanup.
221
+ */
222
+ async close() {
223
+ this.#closing ??= this.#closeOnce().catch((error) => {
224
+ this.#closing = undefined;
225
+ throw error;
226
+ });
227
+ return this.#closing;
228
+ }
229
+ /**
230
+ * Resolves when an abort signal is observed.
231
+ *
232
+ * @param signal Supplies the signal to observe.
233
+ * @returns Completion after the signal aborts.
234
+ */
235
+ static waitForAbort(signal) {
236
+ return new Promise((resolve) => {
237
+ signal.addEventListener("abort", () => {
238
+ resolve();
239
+ }, { once: true });
240
+ if (signal.aborted)
241
+ resolve();
242
+ });
243
+ }
244
+ #schedule(members, abortStarts) {
245
+ this.#nodes = [...members];
246
+ this.#pending = { members: this.#nodes, generation: ++this.#generation };
247
+ if (abortStarts)
248
+ for (const state of this.#definitions.values())
249
+ for (const start of state.starts)
250
+ start.abort();
251
+ if (this.#running === undefined) {
252
+ this.#completion = new Promise((resolve) => {
253
+ this.#complete = resolve;
254
+ });
255
+ this.#running = this.#run();
256
+ }
257
+ return this.#completion;
258
+ }
259
+ async #run() {
260
+ while (this.#pending !== undefined && !this.#closed) {
261
+ const pending = this.#pending;
262
+ this.#pending = undefined;
263
+ try {
264
+ await this.#replace(pending.members, pending.generation);
265
+ }
266
+ catch (error) {
267
+ // spine-log-boundary: deployment.membership_reconciliation
268
+ void error;
269
+ /* a later snapshot can recover */
270
+ }
271
+ }
272
+ this.#running = undefined;
273
+ this.#complete?.();
274
+ this.#complete = undefined;
275
+ }
276
+ async #replace(members, generation) {
277
+ if (generation !== this.#generation || this.#closed)
278
+ return;
279
+ await this.#retryDisposals();
280
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
281
+ if (generation !== this.#generation || this.#closed)
282
+ return;
283
+ if (this.#failedChildCleanup.size > 0)
284
+ await this.#retryChildCleanup();
285
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
286
+ if (generation !== this.#generation || this.#closed)
287
+ return;
288
+ const wanted = new Map();
289
+ for (const member of members) {
290
+ const key = this.#options.memberKey(member);
291
+ const previous = wanted.get(key);
292
+ if (previous !== undefined && !this.#options.sameMember(previous, member))
293
+ throw new Error("Application node IDs must not identify conflicting endpoints.");
294
+ wanted.set(key, member);
295
+ }
296
+ for (const [key, current] of this.#members)
297
+ if (!this.#options.sameMember(current.member, wanted.get(key) ?? current.member) ||
298
+ !wanted.has(key)) {
299
+ this.#members.delete(key);
300
+ if (this.#definitions.size > 0)
301
+ await this.#removeMemberChildren(key, current.client);
302
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
303
+ if (generation !== this.#generation || this.#closed)
304
+ return;
305
+ await this.#dispose(current.client);
306
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
307
+ if (generation !== this.#generation || this.#closed)
308
+ return;
309
+ }
310
+ const added = [...wanted.entries()].filter(([key]) => !this.#members.has(key));
311
+ for (let index = 0; index < added.length; index += this.#limit)
312
+ await Promise.allSettled(added
313
+ .slice(index, index + this.#limit)
314
+ .map(([key, member]) => this.#start(key, member, generation)));
315
+ if (generation !== this.#generation)
316
+ return;
317
+ for (const state of this.#definitions.values())
318
+ await this.#syncDefinition(state, generation);
319
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
320
+ if (generation !== this.#generation || this.#closed)
321
+ return;
322
+ if ([...this.#definitions.values()].every((state) => state.failure === undefined))
323
+ for (const key of wanted.keys()) {
324
+ const current = this.#members.get(key);
325
+ if (current !== undefined)
326
+ current.eligible = true;
327
+ }
328
+ this.#next = 0;
329
+ }
330
+ async #start(key, member, generation) {
331
+ const controller = new AbortController();
332
+ this.#creating.add(controller);
333
+ let client;
334
+ try {
335
+ client = await this.#options.create(member, controller.signal);
336
+ }
337
+ finally {
338
+ this.#creating.delete(controller);
339
+ }
340
+ if (this.#closed || generation !== this.#generation)
341
+ await this.#dispose(client);
342
+ else
343
+ this.#members.set(key, { member, client, incarnation: ++this.#incarnation, eligible: false });
344
+ }
345
+ async #syncDefinition(state, generation) {
346
+ state.failure = undefined;
347
+ for (const [key, child] of state.children)
348
+ if (!this.#members.has(key)) {
349
+ state.children.delete(key);
350
+ child.controller.abort();
351
+ child.activationController?.abort();
352
+ // spine-log-boundary: deployment.membership_child_completion
353
+ await this.#awaitActivationCompletion(child);
354
+ if (generation !== this.#generation || this.#closed)
355
+ return;
356
+ }
357
+ const missing = [...this.#members.entries()].filter(([key]) => !state.children.has(key));
358
+ for (let index = 0; index < missing.length; index += this.#limit)
359
+ for (const result of await Promise.allSettled(missing
360
+ .slice(index, index + this.#limit)
361
+ .map(([key, current]) => this.#startChild(state, key, current, generation))))
362
+ if (result.status === "rejected" && state.failure === undefined)
363
+ state.failure =
364
+ result.reason instanceof Error
365
+ ? result.reason
366
+ : new Error("native subscription creation failed");
367
+ if (generation !== this.#generation || this.#closed)
368
+ return;
369
+ if (state.active && state.updates !== undefined)
370
+ for (const [key, child] of state.children) {
371
+ const current = this.#members.get(key);
372
+ if (current !== undefined)
373
+ this.#activateChild(state, key, child, current.client);
374
+ }
375
+ }
376
+ async #startChild(state, key, current, generation) {
377
+ if (this.#closed || generation !== this.#generation)
378
+ return;
379
+ const controller = new AbortController();
380
+ state.starts.add(controller);
381
+ this.#childStarts.add(controller);
382
+ let child;
383
+ try {
384
+ child = await current.client.subscribe(this.#options.childDefinition(state.definition, current.member), controller.signal);
385
+ }
386
+ finally {
387
+ state.starts.delete(controller);
388
+ this.#childStarts.delete(controller);
389
+ }
390
+ if (this.#options.childSize(child) > state.maxChildBytes) {
391
+ await this.#compensateChild(current.client, child, controller.signal);
392
+ throw new Error("backend-envelope-too-large");
393
+ }
394
+ if (generation !== this.#generation ||
395
+ this.#members.get(key)?.incarnation !== current.incarnation ||
396
+ this.#isClosed()) {
397
+ await this.#compensateChild(current.client, child, controller.signal);
398
+ return;
399
+ }
400
+ const stored = {
401
+ child,
402
+ controller,
403
+ active: false,
404
+ activationController: undefined,
405
+ activation: Promise.resolve(),
406
+ };
407
+ state.children.set(key, stored);
408
+ if (state.active && state.updates !== undefined)
409
+ this.#activateChild(state, key, stored, current.client);
410
+ }
411
+ #activateChild(state, key, child, client) {
412
+ if (child.active || state.updates === undefined)
413
+ return;
414
+ child.active = true;
415
+ const controller = new AbortController();
416
+ child.activationController = controller;
417
+ // spine-log-boundary: deployment.membership_child_activation
418
+ child.activation = client
419
+ .activate(child.child, state.updates, controller.signal)
420
+ .catch(() => undefined)
421
+ .then(() => {
422
+ if (child.activationController !== controller)
423
+ return;
424
+ child.activationController = undefined;
425
+ child.active = false;
426
+ if (controller.signal.aborted &&
427
+ state.children.get(key) === child &&
428
+ state.active &&
429
+ state.activationController !== undefined &&
430
+ !state.activationController.signal.aborted &&
431
+ state.updates !== undefined) {
432
+ this.#activateChild(state, key, child, client);
433
+ return;
434
+ }
435
+ if (state.children.get(key) === child && !controller.signal.aborted)
436
+ state.children.delete(key);
437
+ });
438
+ }
439
+ async #removeDefinition(key, signal) {
440
+ const state = this.#definitions.get(key);
441
+ if (state === undefined)
442
+ return;
443
+ this.#definitions.delete(key);
444
+ state.activationController?.abort();
445
+ for (const start of state.starts)
446
+ start.abort();
447
+ for (const child of state.children.values())
448
+ child.activationController?.abort();
449
+ await Promise.all([...state.children.entries()].map(async ([memberKey, child]) => {
450
+ state.children.delete(memberKey);
451
+ await this.#cleanupChild(child, this.#members.get(memberKey)?.client, signal);
452
+ }));
453
+ }
454
+ async #removeMemberChildren(key, client) {
455
+ for (const state of this.#definitions.values()) {
456
+ const child = state.children.get(key);
457
+ if (child === undefined)
458
+ continue;
459
+ state.children.delete(key);
460
+ try {
461
+ await this.#cleanupChild(child, client);
462
+ }
463
+ catch (error) {
464
+ // spine-log-boundary: deployment.membership_child_cleanup_retained
465
+ void error;
466
+ }
467
+ }
468
+ }
469
+ async #cleanupChild(child, client, signal = new AbortController().signal) {
470
+ child.controller.abort();
471
+ child.activationController?.abort();
472
+ const cleanup = async () => {
473
+ if (client !== undefined && !(await this.#compensateChild(client, child.child, signal)))
474
+ throw new Error("backend child cleanup remains incomplete.");
475
+ // spine-log-boundary: deployment.membership_child_cleanup
476
+ await this.#awaitActivationCompletion(child);
477
+ };
478
+ if (client === undefined) {
479
+ await cleanup();
480
+ return;
481
+ }
482
+ const running = cleanup();
483
+ const cleanups = this.#childCleanup.get(client) ?? new Set();
484
+ cleanups.add(running);
485
+ this.#childCleanup.set(client, cleanups);
486
+ try {
487
+ await running;
488
+ }
489
+ finally {
490
+ cleanups.delete(running);
491
+ if (cleanups.size === 0)
492
+ this.#childCleanup.delete(client);
493
+ }
494
+ }
495
+ async #compensateChild(client, child, signal) {
496
+ const pending = this.#retainFailedChildCleanup(client, child);
497
+ if (!(await this.#disposeChild(pending, signal)))
498
+ return false;
499
+ this.#failedChildCleanup.delete(pending);
500
+ return true;
501
+ }
502
+ async #awaitActivationCompletion(child) {
503
+ let timer;
504
+ const timeout = new Promise((resolve) => {
505
+ timer = setTimeout(resolve, childCleanupTimeoutMs);
506
+ timer.unref();
507
+ });
508
+ try {
509
+ await Promise.race([child.activation, timeout]);
510
+ }
511
+ finally {
512
+ if (timer !== undefined)
513
+ clearTimeout(timer);
514
+ }
515
+ }
516
+ async #retryChildCleanup() {
517
+ for (const pending of [...this.#failedChildCleanup])
518
+ if (await this.#disposeChild(pending, new AbortController().signal))
519
+ this.#failedChildCleanup.delete(pending);
520
+ else
521
+ continue;
522
+ }
523
+ async #disposeChild(pending, signal) {
524
+ if (pending.running !== undefined)
525
+ return false;
526
+ const controller = new AbortController();
527
+ const abort = () => {
528
+ controller.abort();
529
+ };
530
+ signal.addEventListener("abort", abort, { once: true });
531
+ if (signal.aborted)
532
+ abort();
533
+ try {
534
+ let timer;
535
+ const timeout = new Promise((_resolve, reject) => {
536
+ timer = setTimeout(() => {
537
+ reject(new Error("backend child cleanup timed out"));
538
+ }, childCleanupTimeoutMs);
539
+ timer.unref();
540
+ });
541
+ try {
542
+ const running = pending.client.dispose(pending.child, controller.signal);
543
+ pending.running = running;
544
+ const settled = () => {
545
+ if (pending.running === running)
546
+ pending.running = undefined;
547
+ };
548
+ // spine-log-boundary: deployment.membership_child_cleanup_retry
549
+ void running.then(settled, settled);
550
+ await Promise.race([running, timeout]);
551
+ }
552
+ finally {
553
+ if (timer !== undefined)
554
+ clearTimeout(timer);
555
+ }
556
+ return true;
557
+ }
558
+ catch {
559
+ controller.abort();
560
+ return false;
561
+ }
562
+ finally {
563
+ signal.removeEventListener("abort", abort);
564
+ }
565
+ }
566
+ #retainFailedChildCleanup(client, child) {
567
+ const existing = [...this.#failedChildCleanup].find((pending) => pending.client === client && pending.child === child);
568
+ if (existing !== undefined)
569
+ return existing;
570
+ const pending = { client, child, running: undefined };
571
+ this.#failedChildCleanup.add(pending);
572
+ return pending;
573
+ }
574
+ async #dispose(client) {
575
+ try {
576
+ const pending = this.#childCleanup.get(client);
577
+ if (pending !== undefined)
578
+ await Promise.allSettled(pending);
579
+ await client.close();
580
+ this.#failedDisposals.delete(client);
581
+ }
582
+ catch {
583
+ this.#failedDisposals.add(client);
584
+ }
585
+ }
586
+ async #retryDisposals() {
587
+ for (const client of this.#failedDisposals)
588
+ await this.#dispose(client);
589
+ }
590
+ #isClosed() {
591
+ return this.#closed;
592
+ }
593
+ async #closeOnce() {
594
+ this.#closed = true;
595
+ for (const controller of this.#creating)
596
+ controller.abort();
597
+ for (const start of this.#childStarts)
598
+ start.abort();
599
+ for (const state of this.#definitions.values())
600
+ for (const start of state.starts)
601
+ start.abort();
602
+ await this.#running;
603
+ await Promise.allSettled([...this.#definitions.keys()].map((key) => this.#removeDefinition(key, new AbortController().signal)));
604
+ await this.#retryChildCleanup();
605
+ await Promise.all([...this.#members.values()].map(({ client }) => this.#dispose(client)));
606
+ this.#members.clear();
607
+ await this.#retryDisposals();
608
+ if (this.#failedDisposals.size > 0)
609
+ throw new Error("backend client cleanup remains incomplete.");
610
+ if (this.#failedChildCleanup.size > 0)
611
+ throw new Error("backend child cleanup remains incomplete.");
612
+ }
613
+ }
614
+ //# sourceMappingURL=backend-membership-kernel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backend-membership-kernel.js","sourceRoot":"","sources":["../../src/internal/backend-membership-kernel.ts"],"names":[],"mappings":"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"}