@spine-event-engine/server 2.0.0-snapshot.23 → 2.0.0-snapshot.25
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.md +38 -11
- package/REFERENCE.md +278 -141
- package/dist/agent/agent-acceptance-receipts.d.ts +69 -0
- package/dist/agent/agent-acceptance-receipts.d.ts.map +1 -0
- package/dist/agent/agent-acceptance-receipts.js +198 -0
- package/dist/agent/agent-acceptance-receipts.js.map +1 -0
- package/dist/agent/agent-execution-capacity.d.ts +37 -9
- package/dist/agent/agent-execution-capacity.d.ts.map +1 -1
- package/dist/agent/agent-execution-capacity.js +73 -15
- package/dist/agent/agent-execution-capacity.js.map +1 -1
- package/dist/agent/agent-history.d.ts +15 -10
- package/dist/agent/agent-history.d.ts.map +1 -1
- package/dist/agent/agent-history.js +26 -14
- package/dist/agent/agent-history.js.map +1 -1
- package/dist/agent/agent-live-ai-audit.d.ts +95 -0
- package/dist/agent/agent-live-ai-audit.d.ts.map +1 -0
- package/dist/agent/agent-live-ai-audit.js +290 -0
- package/dist/agent/agent-live-ai-audit.js.map +1 -0
- package/dist/agent/agent-live-ai-runtime.d.ts +300 -0
- package/dist/agent/agent-live-ai-runtime.d.ts.map +1 -0
- package/dist/agent/agent-live-ai-runtime.js +611 -0
- package/dist/agent/agent-live-ai-runtime.js.map +1 -0
- package/dist/agent/agent-live-audit.d.ts +67 -0
- package/dist/agent/agent-live-audit.d.ts.map +1 -0
- package/dist/agent/agent-live-audit.js +121 -0
- package/dist/agent/agent-live-audit.js.map +1 -0
- package/dist/agent/agent-live-budget.d.ts +84 -0
- package/dist/agent/agent-live-budget.d.ts.map +1 -0
- package/dist/agent/agent-live-budget.js +161 -0
- package/dist/agent/agent-live-budget.js.map +1 -0
- package/dist/agent/agent-live-fault.d.ts +18 -0
- package/dist/agent/agent-live-fault.d.ts.map +1 -0
- package/dist/agent/{agent-execution-fault.js → agent-live-fault.js} +7 -7
- package/dist/agent/agent-live-fault.js.map +1 -0
- package/dist/agent/agent-live-inputs.d.ts +74 -0
- package/dist/agent/agent-live-inputs.d.ts.map +1 -0
- package/dist/agent/agent-live-inputs.js +15 -0
- package/dist/agent/agent-live-inputs.js.map +1 -0
- package/dist/agent/agent-live-interaction-events.d.ts +46 -0
- package/dist/agent/agent-live-interaction-events.d.ts.map +1 -0
- package/dist/agent/agent-live-interaction-events.js +104 -0
- package/dist/agent/agent-live-interaction-events.js.map +1 -0
- package/dist/agent/agent-live-mcp-controls.d.ts +129 -0
- package/dist/agent/agent-live-mcp-controls.d.ts.map +1 -0
- package/dist/agent/agent-live-mcp-controls.js +228 -0
- package/dist/agent/agent-live-mcp-controls.js.map +1 -0
- package/dist/agent/agent-live-mcp-host.d.ts +88 -0
- package/dist/agent/agent-live-mcp-host.d.ts.map +1 -0
- package/dist/agent/{agent-mcp-host.js → agent-live-mcp-host.js} +1 -1
- package/dist/agent/agent-live-mcp-host.js.map +1 -0
- package/dist/agent/{agent-mcp-runtime.d.ts → agent-live-mcp-runtime.d.ts} +6 -6
- package/dist/agent/agent-live-mcp-runtime.d.ts.map +1 -0
- package/dist/agent/{agent-mcp-runtime.js → agent-live-mcp-runtime.js} +13 -42
- package/dist/agent/agent-live-mcp-runtime.js.map +1 -0
- package/dist/agent/agent-live-read-runtime.d.ts +61 -0
- package/dist/agent/agent-live-read-runtime.d.ts.map +1 -0
- package/dist/agent/agent-live-read-runtime.js +121 -0
- package/dist/agent/agent-live-read-runtime.js.map +1 -0
- package/dist/agent/agent-model-selection.d.ts +21 -34
- package/dist/agent/agent-model-selection.d.ts.map +1 -1
- package/dist/agent/agent-model-selection.js +61 -78
- package/dist/agent/agent-model-selection.js.map +1 -1
- package/dist/bus/command-bus.d.ts +14 -18
- package/dist/bus/command-bus.d.ts.map +1 -1
- package/dist/bus/command-bus.js +31 -48
- package/dist/bus/command-bus.js.map +1 -1
- package/dist/bus/event-bus.d.ts +82 -104
- package/dist/bus/event-bus.d.ts.map +1 -1
- package/dist/bus/event-bus.js +87 -127
- package/dist/bus/event-bus.js.map +1 -1
- package/dist/context/bounded-context.d.ts +143 -91
- package/dist/context/bounded-context.d.ts.map +1 -1
- package/dist/context/bounded-context.js +753 -359
- package/dist/context/bounded-context.js.map +1 -1
- package/dist/context/entity-inbox.d.ts +7 -2
- package/dist/context/entity-inbox.d.ts.map +1 -1
- package/dist/context/entity-inbox.js +43 -20
- package/dist/context/entity-inbox.js.map +1 -1
- package/dist/context/local-inbox-handoff.d.ts +35 -34
- package/dist/context/local-inbox-handoff.d.ts.map +1 -1
- package/dist/context/local-inbox-handoff.js +123 -135
- package/dist/context/local-inbox-handoff.js.map +1 -1
- package/dist/context/projection-handoff.d.ts +2 -2
- package/dist/context/projection-handoff.d.ts.map +1 -1
- package/dist/context/projection-handoff.js +12 -8
- package/dist/context/projection-handoff.js.map +1 -1
- package/dist/context/tenant-index.d.ts +36 -31
- package/dist/context/tenant-index.d.ts.map +1 -1
- package/dist/context/tenant-index.js +123 -125
- package/dist/context/tenant-index.js.map +1 -1
- package/dist/context/tenant-unknown-error.d.ts +33 -0
- package/dist/context/tenant-unknown-error.d.ts.map +1 -0
- package/dist/context/tenant-unknown-error.js +75 -0
- package/dist/context/tenant-unknown-error.js.map +1 -0
- package/dist/delivery/agent-delivery-scope.d.ts +66 -0
- package/dist/delivery/agent-delivery-scope.d.ts.map +1 -0
- package/dist/delivery/agent-delivery-scope.js +44 -0
- package/dist/delivery/agent-delivery-scope.js.map +1 -0
- package/dist/delivery/delivery-builder.d.ts +25 -1
- package/dist/delivery/delivery-builder.d.ts.map +1 -1
- package/dist/delivery/delivery-builder.js +89 -0
- package/dist/delivery/delivery-builder.js.map +1 -1
- package/dist/delivery/delivery-monitor.d.ts +12 -9
- package/dist/delivery/delivery-monitor.d.ts.map +1 -1
- package/dist/delivery/delivery-monitor.js +15 -9
- package/dist/delivery/delivery-monitor.js.map +1 -1
- package/dist/delivery/delivery-ports.d.ts +6 -13
- package/dist/delivery/delivery-ports.d.ts.map +1 -1
- package/dist/delivery/delivery-run-control.d.ts +21 -0
- package/dist/delivery/delivery-run-control.d.ts.map +1 -1
- package/dist/delivery/delivery-run-control.js +10 -0
- package/dist/delivery/delivery-run-control.js.map +1 -1
- package/dist/delivery/delivery-supervisor.d.ts +33 -5
- package/dist/delivery/delivery-supervisor.d.ts.map +1 -1
- package/dist/delivery/delivery-supervisor.js +178 -26
- package/dist/delivery/delivery-supervisor.js.map +1 -1
- package/dist/delivery/delivery-tenant.d.ts +17 -0
- package/dist/delivery/delivery-tenant.d.ts.map +1 -0
- package/dist/delivery/delivery-tenant.js +50 -0
- package/dist/delivery/delivery-tenant.js.map +1 -0
- package/dist/delivery/delivery.d.ts +96 -2
- package/dist/delivery/delivery.d.ts.map +1 -1
- package/dist/delivery/delivery.js +803 -89
- package/dist/delivery/delivery.js.map +1 -1
- package/dist/delivery/inbox-records.d.ts.map +1 -1
- package/dist/delivery/inbox-records.js +9 -16
- package/dist/delivery/inbox-records.js.map +1 -1
- package/dist/delivery/inbox-storage.d.ts +14 -11
- package/dist/delivery/inbox-storage.d.ts.map +1 -1
- package/dist/delivery/inbox-storage.js +72 -78
- package/dist/delivery/inbox-storage.js.map +1 -1
- package/dist/delivery/inbox.d.ts +9 -12
- package/dist/delivery/inbox.d.ts.map +1 -1
- package/dist/delivery/inbox.js +13 -15
- package/dist/delivery/inbox.js.map +1 -1
- package/dist/delivery/reception-observation.d.ts +64 -0
- package/dist/delivery/reception-observation.d.ts.map +1 -0
- package/dist/delivery/reception-observation.js +78 -0
- package/dist/delivery/reception-observation.js.map +1 -0
- package/dist/delivery/sharded-work-registry.d.ts +6 -0
- package/dist/delivery/sharded-work-registry.d.ts.map +1 -1
- package/dist/delivery/sharded-work-registry.js +41 -4
- package/dist/delivery/sharded-work-registry.js.map +1 -1
- package/dist/entity/entity-storage-descriptor.d.ts.map +1 -1
- package/dist/entity/entity-storage-descriptor.js +7 -4
- package/dist/entity/entity-storage-descriptor.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/integration/external-messages.d.ts.map +1 -1
- package/dist/integration/external-messages.js +9 -15
- package/dist/integration/external-messages.js.map +1 -1
- package/dist/integration/integration-broker.d.ts.map +1 -1
- package/dist/integration/integration-broker.js +112 -6
- package/dist/integration/integration-broker.js.map +1 -1
- package/dist/integration/third-party-context.d.ts.map +1 -1
- package/dist/integration/third-party-context.js +7 -10
- package/dist/integration/third-party-context.js.map +1 -1
- package/dist/repository/primitive-id.js +26 -11
- package/dist/repository/primitive-id.js.map +1 -1
- package/dist/repository/repository.d.ts +33 -62
- package/dist/repository/repository.d.ts.map +1 -1
- package/dist/repository/repository.js +1475 -1827
- package/dist/repository/repository.js.map +1 -1
- package/dist/runtime/runtime.d.ts +24 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +31 -0
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/signal-metadata.d.ts.map +1 -1
- package/dist/runtime/signal-metadata.js +8 -15
- package/dist/runtime/signal-metadata.js.map +1 -1
- package/dist/runtime/signal-publisher.d.ts +8 -36
- package/dist/runtime/signal-publisher.d.ts.map +1 -1
- package/dist/runtime/signal-publisher.js +68 -61
- package/dist/runtime/signal-publisher.js.map +1 -1
- package/dist/runtime/standalone-handler-runtime.d.ts +0 -7
- package/dist/runtime/standalone-handler-runtime.d.ts.map +1 -1
- package/dist/runtime/standalone-handler-runtime.js +14 -130
- package/dist/runtime/standalone-handler-runtime.js.map +1 -1
- package/dist/server/managed-delivery-gate.d.ts +34 -0
- package/dist/server/managed-delivery-gate.d.ts.map +1 -0
- package/dist/server/managed-delivery-gate.js +70 -0
- package/dist/server/managed-delivery-gate.js.map +1 -0
- package/dist/server/managed-server-application.d.ts +2 -2
- package/dist/server/managed-server-application.d.ts.map +1 -1
- package/dist/server/managed-server-application.js +471 -178
- package/dist/server/managed-server-application.js.map +1 -1
- package/dist/server/node-coordinator.d.ts +14 -0
- package/dist/server/node-coordinator.d.ts.map +1 -1
- package/dist/server/node-coordinator.js +266 -45
- package/dist/server/node-coordinator.js.map +1 -1
- package/dist/server/server-environment.d.ts +203 -25
- package/dist/server/server-environment.d.ts.map +1 -1
- package/dist/server/server-environment.js +661 -133
- package/dist/server/server-environment.js.map +1 -1
- package/dist/server/server-log.d.ts +7 -0
- package/dist/server/server-log.d.ts.map +1 -1
- package/dist/server/server-log.js +18 -1
- package/dist/server/server-log.js.map +1 -1
- package/dist/server/server.d.ts +18 -32
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +62 -203
- package/dist/server/server.js.map +1 -1
- package/dist/services/spine-services.d.ts +1 -1
- package/dist/services/spine-services.d.ts.map +1 -1
- package/dist/services/spine-services.js +399 -370
- package/dist/services/spine-services.js.map +1 -1
- package/dist/stand/event-origin-filter.d.ts +16 -0
- package/dist/stand/event-origin-filter.d.ts.map +1 -0
- package/dist/stand/event-origin-filter.js +124 -0
- package/dist/stand/event-origin-filter.js.map +1 -0
- package/dist/stand/stand.d.ts +14 -0
- package/dist/stand/stand.d.ts.map +1 -1
- package/dist/stand/stand.js +53 -9
- package/dist/stand/stand.js.map +1 -1
- package/dist/stand/subscription-observer.d.ts.map +1 -1
- package/dist/stand/subscription-observer.js +61 -40
- package/dist/stand/subscription-observer.js.map +1 -1
- package/dist/stand/subscription-registry.d.ts +6 -2
- package/dist/stand/subscription-registry.d.ts.map +1 -1
- package/dist/stand/subscription-registry.js +15 -11
- package/dist/stand/subscription-registry.js.map +1 -1
- package/dist/stand/subscription-runtime.d.ts +23 -4
- package/dist/stand/subscription-runtime.d.ts.map +1 -1
- package/dist/stand/subscription-runtime.js +84 -13
- package/dist/stand/subscription-runtime.js.map +1 -1
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +3 -2
- package/dist/testing/index.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -15
- package/dist/agent/agent-admission.d.ts +0 -80
- package/dist/agent/agent-admission.d.ts.map +0 -1
- package/dist/agent/agent-admission.js +0 -127
- package/dist/agent/agent-admission.js.map +0 -1
- package/dist/agent/agent-ai-runtime.d.ts +0 -76
- package/dist/agent/agent-ai-runtime.d.ts.map +0 -1
- package/dist/agent/agent-ai-runtime.js +0 -1269
- package/dist/agent/agent-ai-runtime.js.map +0 -1
- package/dist/agent/agent-execution-fault.d.ts +0 -18
- package/dist/agent/agent-execution-fault.d.ts.map +0 -1
- package/dist/agent/agent-execution-fault.js.map +0 -1
- package/dist/agent/agent-execution-session.d.ts +0 -103
- package/dist/agent/agent-execution-session.d.ts.map +0 -1
- package/dist/agent/agent-execution-session.js +0 -238
- package/dist/agent/agent-execution-session.js.map +0 -1
- package/dist/agent/agent-interaction-audit.d.ts +0 -58
- package/dist/agent/agent-interaction-audit.d.ts.map +0 -1
- package/dist/agent/agent-interaction-audit.js +0 -114
- package/dist/agent/agent-interaction-audit.js.map +0 -1
- package/dist/agent/agent-interaction-events.d.ts +0 -40
- package/dist/agent/agent-interaction-events.d.ts.map +0 -1
- package/dist/agent/agent-interaction-events.js +0 -129
- package/dist/agent/agent-interaction-events.js.map +0 -1
- package/dist/agent/agent-mcp-budget.d.ts +0 -125
- package/dist/agent/agent-mcp-budget.d.ts.map +0 -1
- package/dist/agent/agent-mcp-budget.js +0 -566
- package/dist/agent/agent-mcp-budget.js.map +0 -1
- package/dist/agent/agent-mcp-host.d.ts +0 -125
- package/dist/agent/agent-mcp-host.d.ts.map +0 -1
- package/dist/agent/agent-mcp-host.js.map +0 -1
- package/dist/agent/agent-mcp-runtime.d.ts.map +0 -1
- package/dist/agent/agent-mcp-runtime.js.map +0 -1
- package/dist/agent/agent-read-runtime.d.ts +0 -70
- package/dist/agent/agent-read-runtime.d.ts.map +0 -1
- package/dist/agent/agent-read-runtime.js +0 -320
- package/dist/agent/agent-read-runtime.js.map +0 -1
- package/dist/agent/agent-revisions.d.ts +0 -35
- package/dist/agent/agent-revisions.d.ts.map +0 -1
- package/dist/agent/agent-revisions.js +0 -133
- package/dist/agent/agent-revisions.js.map +0 -1
- package/dist/agent/agent-scheduler.d.ts +0 -99
- package/dist/agent/agent-scheduler.d.ts.map +0 -1
- package/dist/agent/agent-scheduler.js +0 -398
- package/dist/agent/agent-scheduler.js.map +0 -1
- package/dist/bus/saved-dispatcher-binding.d.ts +0 -96
- package/dist/bus/saved-dispatcher-binding.d.ts.map +0 -1
- package/dist/bus/saved-dispatcher-binding.js +0 -35
- package/dist/bus/saved-dispatcher-binding.js.map +0 -1
- package/dist/delivery/delivery-run-coordinator.d.ts +0 -218
- package/dist/delivery/delivery-run-coordinator.d.ts.map +0 -1
- package/dist/delivery/delivery-run-coordinator.js +0 -609
- package/dist/delivery/delivery-run-coordinator.js.map +0 -1
- package/dist/delivery/parked-delivery-obligations.d.ts +0 -182
- package/dist/delivery/parked-delivery-obligations.d.ts.map +0 -1
- package/dist/delivery/parked-delivery-obligations.js +0 -390
- package/dist/delivery/parked-delivery-obligations.js.map +0 -1
- package/dist/server/environment-attachment.d.ts +0 -356
- package/dist/server/environment-attachment.d.ts.map +0 -1
- package/dist/server/environment-attachment.js +0 -2062
- package/dist/server/environment-attachment.js.map +0 -1
- package/dist/server/environment-delivery-records.d.ts +0 -77
- package/dist/server/environment-delivery-records.d.ts.map +0 -1
- package/dist/server/environment-delivery-records.js +0 -282
- package/dist/server/environment-delivery-records.js.map +0 -1
- package/dist/server/environment-delivery-worker.d.ts +0 -161
- package/dist/server/environment-delivery-worker.d.ts.map +0 -1
- package/dist/server/environment-delivery-worker.js +0 -673
- package/dist/server/environment-delivery-worker.js.map +0 -1
|
@@ -1,673 +0,0 @@
|
|
|
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
|
-
var _a;
|
|
15
|
-
import {} from "@spine-event-engine/storage";
|
|
16
|
-
import { TenantBoundary } from "@spine-event-engine/storage/provider";
|
|
17
|
-
import { fromBinary } from "@bufbuild/protobuf";
|
|
18
|
-
import { CommandSchema, EventSchema } from "@spine-event-engine/proto";
|
|
19
|
-
import { deliveryRunWorkers, } from "../delivery/delivery-run-coordinator.js";
|
|
20
|
-
import { DeliveryBuilder, UniformAcrossAllShards } from "../delivery/delivery-builder.js";
|
|
21
|
-
import { Delivery, } from "../delivery/delivery.js";
|
|
22
|
-
import { DeliverySupervisor, deliverySupervisorAccess, } from "../delivery/delivery-supervisor.js";
|
|
23
|
-
import { DeliveryWorker } from "../delivery/delivery-worker.js";
|
|
24
|
-
import { ShardIndex } from "../delivery/shard-index.js";
|
|
25
|
-
const managedChild = process.env.SPINE_MANAGED_SERVER_CHILD === "true";
|
|
26
|
-
let cancelManagedDelivery = false;
|
|
27
|
-
let managedDeliveryActivated = !managedChild;
|
|
28
|
-
const waitingManagedSupervisors = new Set();
|
|
29
|
-
/**
|
|
30
|
-
* Controls private managed-child Delivery admission.
|
|
31
|
-
*
|
|
32
|
-
* @internal
|
|
33
|
-
*/
|
|
34
|
-
export const environmentDeliveryWorkerAccess = Object.freeze({
|
|
35
|
-
activateManagedChild() {
|
|
36
|
-
managedDeliveryActivated = true;
|
|
37
|
-
for (const start of waitingManagedSupervisors)
|
|
38
|
-
start();
|
|
39
|
-
waitingManagedSupervisors.clear();
|
|
40
|
-
},
|
|
41
|
-
cancelManagedChild() {
|
|
42
|
-
cancelManagedDelivery = true;
|
|
43
|
-
waitingManagedSupervisors.clear();
|
|
44
|
-
},
|
|
45
|
-
});
|
|
46
|
-
/**
|
|
47
|
-
* Routes each owner-partitioned obligation to its exact runtime worker.
|
|
48
|
-
*
|
|
49
|
-
* @internal
|
|
50
|
-
*/
|
|
51
|
-
export class EnvironmentDeliveryWorker {
|
|
52
|
-
#workers = new Map();
|
|
53
|
-
#supervisor;
|
|
54
|
-
#stoppedWorkers = new Set();
|
|
55
|
-
#stoppedSupervisors = new Set();
|
|
56
|
-
#stoppedOwners = new Set();
|
|
57
|
-
#createWorker;
|
|
58
|
-
#nodeId;
|
|
59
|
-
#ports;
|
|
60
|
-
/**
|
|
61
|
-
* Creates an environment delivery worker.
|
|
62
|
-
*
|
|
63
|
-
* @param options Optionally supplies a worker factory for lifecycle tests.
|
|
64
|
-
*/
|
|
65
|
-
constructor(options = {}) {
|
|
66
|
-
this.#createWorker = options.createWorker ?? EnvironmentDeliveryValues.createWorker;
|
|
67
|
-
this.#ports = options.ports;
|
|
68
|
-
this.#nodeId = options.nodeId;
|
|
69
|
-
this.#supervisor = new RuntimeDeliverySupervisor(this.#ports, this.#nodeId);
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Adds one owner-specific delivery runtime.
|
|
73
|
-
* @param runtime Supplies the runtime to configure.
|
|
74
|
-
*/
|
|
75
|
-
add(runtime) {
|
|
76
|
-
if (this.#workers.has(runtime.owner.key)) {
|
|
77
|
-
throw new Error("Environment delivery owner is already configured.");
|
|
78
|
-
}
|
|
79
|
-
const worker = this.#createWorker(runtime, this.#ports, this.#nodeId);
|
|
80
|
-
this.#workers.set(runtime.owner.key, worker);
|
|
81
|
-
try {
|
|
82
|
-
this.#supervisor.add(runtime);
|
|
83
|
-
}
|
|
84
|
-
catch (error) {
|
|
85
|
-
this.#workers.delete(runtime.owner.key);
|
|
86
|
-
throw error;
|
|
87
|
-
}
|
|
88
|
-
void this.#supervisor.start();
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Starts selected shards for one owner-specific obligation.
|
|
92
|
-
*
|
|
93
|
-
* @param obligation Supplies the finite delivery obligation.
|
|
94
|
-
* @param shards Selects shards to run.
|
|
95
|
-
* @returns Evidence produced by the worker.
|
|
96
|
-
*/
|
|
97
|
-
start(obligation, shards) {
|
|
98
|
-
const owner = EnvironmentDeliveryValues.soleOwner(obligation.scopes);
|
|
99
|
-
const worker = this.#workers.get(owner.key);
|
|
100
|
-
if (worker === undefined) {
|
|
101
|
-
return Promise.reject(new Error("Environment delivery owner is not configured."));
|
|
102
|
-
}
|
|
103
|
-
return worker.start(obligation, shards).then(async (evidence) => {
|
|
104
|
-
await this.#supervisor.start();
|
|
105
|
-
return evidence;
|
|
106
|
-
});
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Notifies a running supervisor about new work.
|
|
110
|
-
* @param scope Identifies the changed scope.
|
|
111
|
-
*/
|
|
112
|
-
notify(scope) {
|
|
113
|
-
this.#requiredWorker(scope.owner.key);
|
|
114
|
-
this.#supervisor.notify(scope.owner.key, scope.ready.shard);
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Stops every configured owner and aggregates failures.
|
|
118
|
-
*/
|
|
119
|
-
stop() {
|
|
120
|
-
const failures = [];
|
|
121
|
-
for (const [key, worker] of this.#workers) {
|
|
122
|
-
if (this.#stoppedOwners.has(key)) {
|
|
123
|
-
continue;
|
|
124
|
-
}
|
|
125
|
-
this.#stopOwner(key, worker, failures);
|
|
126
|
-
}
|
|
127
|
-
try {
|
|
128
|
-
this.#supervisor.stop();
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
failures.push(error);
|
|
132
|
-
}
|
|
133
|
-
EnvironmentDeliveryValues.throwFailures(failures, "Environment delivery worker stop failed.");
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Awaits every configured worker and supervisor.
|
|
137
|
-
*
|
|
138
|
-
* @returns A promise that resolves after all configured work settles.
|
|
139
|
-
*/
|
|
140
|
-
async awaitSettled() {
|
|
141
|
-
await Promise.all([
|
|
142
|
-
...Array.from(this.#workers.values(), (worker) => worker.awaitSettled()),
|
|
143
|
-
this.#supervisor.awaitSettled(),
|
|
144
|
-
]);
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Closes every configured worker and supervisor.
|
|
148
|
-
*
|
|
149
|
-
* @returns A promise that settles after all configured resources retire.
|
|
150
|
-
*/
|
|
151
|
-
async retire() {
|
|
152
|
-
const settled = await Promise.allSettled([
|
|
153
|
-
...Array.from(this.#workers.values(), (worker) => EnvironmentDeliveryValues.attempt(() => worker.retire())),
|
|
154
|
-
EnvironmentDeliveryValues.attempt(() => this.#supervisor.retire()),
|
|
155
|
-
]);
|
|
156
|
-
const failures = [];
|
|
157
|
-
for (const result of settled) {
|
|
158
|
-
if (result.status === "rejected") {
|
|
159
|
-
failures.push(result.reason);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
EnvironmentDeliveryValues.throwFailures(failures, "Environment delivery worker retirement failed.");
|
|
163
|
-
}
|
|
164
|
-
/**
|
|
165
|
-
* Stops selected owners and aggregates failures.
|
|
166
|
-
* @param ownerKeys Identifies owners to stop.
|
|
167
|
-
*/
|
|
168
|
-
stopOwners(ownerKeys) {
|
|
169
|
-
const selected = ownerKeys.map((key) => {
|
|
170
|
-
const worker = this.#workers.get(key);
|
|
171
|
-
if (worker === undefined) {
|
|
172
|
-
throw new Error("Environment delivery owner is not configured.");
|
|
173
|
-
}
|
|
174
|
-
return { key, worker };
|
|
175
|
-
});
|
|
176
|
-
const failures = [];
|
|
177
|
-
this.#supervisor.fenceOwners(ownerKeys);
|
|
178
|
-
for (const { key, worker } of selected) {
|
|
179
|
-
if (this.#stoppedOwners.has(key)) {
|
|
180
|
-
continue;
|
|
181
|
-
}
|
|
182
|
-
this.#stopOwner(key, worker, failures);
|
|
183
|
-
}
|
|
184
|
-
EnvironmentDeliveryValues.throwFailures(failures, "Environment registration worker stop failed.");
|
|
185
|
-
}
|
|
186
|
-
/**
|
|
187
|
-
* Awaits selected owners.
|
|
188
|
-
*
|
|
189
|
-
* @param ownerKeys Identifies owners to await.
|
|
190
|
-
* @returns A promise that resolves after selected owner work settles.
|
|
191
|
-
*/
|
|
192
|
-
async awaitOwnersSettled(ownerKeys) {
|
|
193
|
-
await Promise.all([
|
|
194
|
-
...ownerKeys.map((key) => this.#requiredWorker(key).awaitSettled()),
|
|
195
|
-
this.#supervisor.awaitOwnersSettled(ownerKeys),
|
|
196
|
-
]);
|
|
197
|
-
}
|
|
198
|
-
/**
|
|
199
|
-
* Closes selected owners and releases local state.
|
|
200
|
-
*
|
|
201
|
-
* @param ownerKeys Identifies owners to retire.
|
|
202
|
-
* @returns A promise that settles after selected owners retire.
|
|
203
|
-
*/
|
|
204
|
-
async retireOwners(ownerKeys) {
|
|
205
|
-
const selected = ownerKeys.map((key) => ({ key, worker: this.#requiredWorker(key) }));
|
|
206
|
-
const retired = await Promise.allSettled(selected.map(({ worker }) => EnvironmentDeliveryValues.attempt(() => worker.retire())));
|
|
207
|
-
await this.#supervisor.retireOwners(ownerKeys);
|
|
208
|
-
for (const { key } of selected) {
|
|
209
|
-
this.#workers.delete(key);
|
|
210
|
-
this.#stoppedWorkers.delete(key);
|
|
211
|
-
this.#stoppedSupervisors.delete(key);
|
|
212
|
-
this.#stoppedOwners.delete(key);
|
|
213
|
-
}
|
|
214
|
-
const failures = retired.flatMap((result) => result.status === "rejected" ? [result.reason] : []);
|
|
215
|
-
EnvironmentDeliveryValues.throwFailures(failures, "Environment registration worker retirement failed.");
|
|
216
|
-
}
|
|
217
|
-
#requiredWorker(key) {
|
|
218
|
-
const worker = this.#workers.get(key);
|
|
219
|
-
if (worker === undefined) {
|
|
220
|
-
throw new Error("Environment delivery owner is not configured.");
|
|
221
|
-
}
|
|
222
|
-
return worker;
|
|
223
|
-
}
|
|
224
|
-
#stopOwner(key, worker, failures) {
|
|
225
|
-
if (!this.#stoppedWorkers.has(key)) {
|
|
226
|
-
try {
|
|
227
|
-
worker.stop();
|
|
228
|
-
this.#stoppedWorkers.add(key);
|
|
229
|
-
}
|
|
230
|
-
catch (error) {
|
|
231
|
-
failures.push(error);
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
if (!this.#stoppedSupervisors.has(key)) {
|
|
235
|
-
this.#stoppedSupervisors.add(key);
|
|
236
|
-
}
|
|
237
|
-
if (this.#stoppedWorkers.has(key) && this.#stoppedSupervisors.has(key)) {
|
|
238
|
-
this.#stoppedOwners.add(key);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
class RuntimeDeliverySupervisor {
|
|
243
|
-
#groups = new Map();
|
|
244
|
-
#ports;
|
|
245
|
-
#nodeId;
|
|
246
|
-
constructor(ports, nodeId) {
|
|
247
|
-
this.#ports = ports;
|
|
248
|
-
this.#nodeId = nodeId;
|
|
249
|
-
}
|
|
250
|
-
add(runtime) {
|
|
251
|
-
const grouped = new Map();
|
|
252
|
-
for (const shard of EnvironmentDeliveryValues.uniqueShards(runtime.scopes)) {
|
|
253
|
-
const shards = grouped.get(shard.ofTotal) ?? [];
|
|
254
|
-
shards.push(shard);
|
|
255
|
-
grouped.set(shard.ofTotal, shards);
|
|
256
|
-
}
|
|
257
|
-
if (grouped.size === 0) {
|
|
258
|
-
throw new Error("Environment delivery supervisor requires at least one shard.");
|
|
259
|
-
}
|
|
260
|
-
for (const [shardCount, shards] of grouped) {
|
|
261
|
-
const key = this.#groupKey(runtime.owner.key, shardCount);
|
|
262
|
-
let group = this.#groups.get(key);
|
|
263
|
-
if (group === undefined) {
|
|
264
|
-
group = EnvironmentDeliveryValues.createSupervisorGroup(runtime, shards, this.#ports, this.#nodeId);
|
|
265
|
-
this.#groups.set(key, group);
|
|
266
|
-
}
|
|
267
|
-
group.add(runtime.owner.key, runtime, shards);
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
remove(ownerKey) {
|
|
271
|
-
for (const group of this.#groups.values())
|
|
272
|
-
group.remove(ownerKey);
|
|
273
|
-
}
|
|
274
|
-
async start() {
|
|
275
|
-
if (!managedDeliveryActivated) {
|
|
276
|
-
waitingManagedSupervisors.add(() => {
|
|
277
|
-
void this.start();
|
|
278
|
-
});
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
if (cancelManagedDelivery)
|
|
282
|
-
return;
|
|
283
|
-
await Promise.all(Array.from(this.#groups.values(), (group) => group.start()));
|
|
284
|
-
}
|
|
285
|
-
notify(ownerKey, shard) {
|
|
286
|
-
this.#groups.get(this.#groupKey(ownerKey, shard.ofTotal))?.notify(shard);
|
|
287
|
-
}
|
|
288
|
-
fenceOwners(ownerKeys) {
|
|
289
|
-
for (const group of this.#groups.values())
|
|
290
|
-
group.fenceOwners(ownerKeys);
|
|
291
|
-
}
|
|
292
|
-
async awaitOwnersSettled(ownerKeys) {
|
|
293
|
-
await Promise.all(Array.from(this.#groups.values(), (group) => group.awaitOwnersSettled(ownerKeys)));
|
|
294
|
-
}
|
|
295
|
-
async retireOwners(ownerKeys) {
|
|
296
|
-
for (const [key, group] of this.#groups) {
|
|
297
|
-
await group.retireOwners(ownerKeys);
|
|
298
|
-
if (group.empty)
|
|
299
|
-
this.#groups.delete(key);
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
stop() {
|
|
303
|
-
const failures = [];
|
|
304
|
-
for (const group of this.#groups.values()) {
|
|
305
|
-
try {
|
|
306
|
-
group.stop();
|
|
307
|
-
}
|
|
308
|
-
catch (error) {
|
|
309
|
-
failures.push(error);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
EnvironmentDeliveryValues.throwFailures(failures, "Environment delivery supervisor stop failed.");
|
|
313
|
-
}
|
|
314
|
-
async awaitSettled() {
|
|
315
|
-
const settled = await Promise.allSettled(Array.from(this.#groups.values(), (group) => group.awaitSettled()));
|
|
316
|
-
EnvironmentDeliveryValues.throwFailures(settled.flatMap((result) => (result.status === "rejected" ? [result.reason] : [])), "Environment delivery supervisor settlement failed.");
|
|
317
|
-
}
|
|
318
|
-
async retire() {
|
|
319
|
-
const settled = await Promise.allSettled(Array.from(this.#groups.values(), (group) => EnvironmentDeliveryValues.attempt(() => group.retire())));
|
|
320
|
-
EnvironmentDeliveryValues.throwFailures(settled.flatMap((result) => (result.status === "rejected" ? [result.reason] : [])), "Environment delivery supervisor retirement failed.");
|
|
321
|
-
}
|
|
322
|
-
#groupKey(ownerKey, shardCount) {
|
|
323
|
-
return this.#ports?.source === undefined
|
|
324
|
-
? `${ownerKey}/${String(shardCount)}`
|
|
325
|
-
: `remote/${String(shardCount)}`;
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
class RuntimeDeliverySupervisorGroup {
|
|
329
|
-
#source;
|
|
330
|
-
#supervisor;
|
|
331
|
-
#routes = new Map();
|
|
332
|
-
#retiringOwners = new Set();
|
|
333
|
-
#active = new Map();
|
|
334
|
-
#reserved;
|
|
335
|
-
shardCount;
|
|
336
|
-
#start;
|
|
337
|
-
#stopped = false;
|
|
338
|
-
#close;
|
|
339
|
-
constructor(options) {
|
|
340
|
-
// `createSupervisorGroup()` rejects an empty shard collection before internal construction.
|
|
341
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
342
|
-
const first = options.shards[0];
|
|
343
|
-
this.shardCount = first.ofTotal;
|
|
344
|
-
this.#reserved = new Map(options.shards.map((shard) => [shard.key(), new Map()]));
|
|
345
|
-
this.#source =
|
|
346
|
-
options.source === undefined
|
|
347
|
-
? new LocalDeliverySource(options.shards)
|
|
348
|
-
: EnvironmentDeliveryValues.requireSource(options.source);
|
|
349
|
-
this.#supervisor = new DeliverySupervisor({
|
|
350
|
-
source: this.#source,
|
|
351
|
-
delivery: options.delivery,
|
|
352
|
-
onMessage: (message) => this.#route(message),
|
|
353
|
-
});
|
|
354
|
-
deliverySupervisorAccess.installAdmission(this.#supervisor, (message) => this.#accept(message));
|
|
355
|
-
deliverySupervisorAccess.installFinalization(this.#supervisor, (shard) => {
|
|
356
|
-
this.#releaseUndeliveredReservations(shard);
|
|
357
|
-
});
|
|
358
|
-
if (options.logger !== undefined) {
|
|
359
|
-
deliverySupervisorAccess.installLogger(this.#supervisor, options.logger);
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
add(ownerKey, runtime, shards) {
|
|
363
|
-
if (this.#source instanceof LocalDeliverySource)
|
|
364
|
-
this.#source.add(shards);
|
|
365
|
-
for (const scope of runtime.scopes) {
|
|
366
|
-
if (scope.ready.shard.ofTotal !== this.shardCount)
|
|
367
|
-
continue;
|
|
368
|
-
const key = _a.key(scope.ready);
|
|
369
|
-
const routes = this.#routes.get(key) ?? [];
|
|
370
|
-
routes.push({
|
|
371
|
-
ownerKey,
|
|
372
|
-
descriptor: runtime.descriptor,
|
|
373
|
-
tenant: runtime.tenant,
|
|
374
|
-
tenantKey: runtime.tenant.tenantId === undefined
|
|
375
|
-
? undefined
|
|
376
|
-
: String(TenantBoundary.from(runtime.tenant.tenantId).key),
|
|
377
|
-
});
|
|
378
|
-
this.#routes.set(key, routes);
|
|
379
|
-
}
|
|
380
|
-
}
|
|
381
|
-
get empty() {
|
|
382
|
-
return this.#routes.size === 0;
|
|
383
|
-
}
|
|
384
|
-
fenceOwners(ownerKeys) {
|
|
385
|
-
for (const ownerKey of ownerKeys)
|
|
386
|
-
this.#retiringOwners.add(ownerKey);
|
|
387
|
-
}
|
|
388
|
-
async awaitOwnersSettled(ownerKeys) {
|
|
389
|
-
await Promise.all(Array.from(this.#reserved.values(), async (reservations) => Promise.all(Array.from(reservations.values())
|
|
390
|
-
.filter((reservation) => ownerKeys.includes(reservation.route.ownerKey))
|
|
391
|
-
.map((reservation) => reservation.settled.promise))));
|
|
392
|
-
await Promise.all(ownerKeys.map(async (ownerKey) => {
|
|
393
|
-
const active = this.#active.get(ownerKey);
|
|
394
|
-
if (active !== undefined)
|
|
395
|
-
await Promise.allSettled(active);
|
|
396
|
-
}));
|
|
397
|
-
}
|
|
398
|
-
async retireOwners(ownerKeys) {
|
|
399
|
-
this.fenceOwners(ownerKeys);
|
|
400
|
-
await this.awaitOwnersSettled(ownerKeys);
|
|
401
|
-
for (const ownerKey of ownerKeys)
|
|
402
|
-
this.remove(ownerKey);
|
|
403
|
-
if (this.empty)
|
|
404
|
-
await this.retire();
|
|
405
|
-
}
|
|
406
|
-
remove(ownerKey) {
|
|
407
|
-
for (const [key, routes] of this.#routes) {
|
|
408
|
-
const retained = routes.filter((route) => route.ownerKey !== ownerKey);
|
|
409
|
-
if (retained.length === 0)
|
|
410
|
-
this.#routes.delete(key);
|
|
411
|
-
else
|
|
412
|
-
this.#routes.set(key, retained);
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
start() {
|
|
416
|
-
if (this.#stopped) {
|
|
417
|
-
return Promise.reject(new Error("Environment delivery supervisor is stopped."));
|
|
418
|
-
}
|
|
419
|
-
if (this.#start === undefined) {
|
|
420
|
-
this.#start = this.#supervisor.start().then(() => {
|
|
421
|
-
if (this.#source instanceof LocalDeliverySource)
|
|
422
|
-
this.#source.enableRecovery();
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
return this.#start;
|
|
426
|
-
}
|
|
427
|
-
notify(shard) {
|
|
428
|
-
if (this.#stopped)
|
|
429
|
-
return;
|
|
430
|
-
// spine-log-boundary: server.delivery_notify_start
|
|
431
|
-
void this.start()
|
|
432
|
-
.then(() => {
|
|
433
|
-
this.#supervisor.notify(shard);
|
|
434
|
-
})
|
|
435
|
-
.catch(() => undefined);
|
|
436
|
-
}
|
|
437
|
-
stop() {
|
|
438
|
-
if (this.#stopped)
|
|
439
|
-
return;
|
|
440
|
-
this.#stopped = true;
|
|
441
|
-
this.#close = this.#supervisor.close();
|
|
442
|
-
// spine-log-boundary: server.delivery_supervisor_close
|
|
443
|
-
void this.#close.catch(() => undefined);
|
|
444
|
-
}
|
|
445
|
-
async awaitSettled() {
|
|
446
|
-
await this.#start;
|
|
447
|
-
await this.#close;
|
|
448
|
-
}
|
|
449
|
-
async retire() {
|
|
450
|
-
this.stop();
|
|
451
|
-
await this.awaitSettled();
|
|
452
|
-
}
|
|
453
|
-
#accept(message) {
|
|
454
|
-
const route = this.#select(message);
|
|
455
|
-
if (route !== undefined) {
|
|
456
|
-
// `options.shards` initializes one private reservation map per supervised shard.
|
|
457
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
458
|
-
const reservations = this.#reserved.get(message.shard.key());
|
|
459
|
-
reservations.set(_a.messageKey(message), {
|
|
460
|
-
route,
|
|
461
|
-
settled: Promise.withResolvers(),
|
|
462
|
-
});
|
|
463
|
-
}
|
|
464
|
-
return route !== undefined;
|
|
465
|
-
}
|
|
466
|
-
#route(message) {
|
|
467
|
-
const key = _a.messageKey(message);
|
|
468
|
-
// `Delivery` invokes the callback only after this group's admission reserved its route.
|
|
469
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
470
|
-
const reservations = this.#reserved.get(message.shard.key());
|
|
471
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
472
|
-
const reservation = reservations.get(key);
|
|
473
|
-
const route = reservation.route;
|
|
474
|
-
const active = this.#active.get(route.ownerKey) ?? new Set();
|
|
475
|
-
this.#active.set(route.ownerKey, active);
|
|
476
|
-
const replay = Promise.resolve()
|
|
477
|
-
.then(() => route.descriptor.replay(message, route.tenant.tenantId))
|
|
478
|
-
.finally(() => {
|
|
479
|
-
active.delete(replay);
|
|
480
|
-
if (active.size === 0)
|
|
481
|
-
this.#active.delete(route.ownerKey);
|
|
482
|
-
});
|
|
483
|
-
active.add(replay);
|
|
484
|
-
reservations.delete(key);
|
|
485
|
-
reservation.settled.resolve(undefined);
|
|
486
|
-
return replay;
|
|
487
|
-
}
|
|
488
|
-
#releaseUndeliveredReservations(shard) {
|
|
489
|
-
// `options.shards` initializes one private reservation map per supervised shard.
|
|
490
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
491
|
-
const reservations = this.#reserved.get(shard.key());
|
|
492
|
-
for (const reservation of reservations.values()) {
|
|
493
|
-
reservation.settled.resolve(undefined);
|
|
494
|
-
}
|
|
495
|
-
reservations.clear();
|
|
496
|
-
}
|
|
497
|
-
#select(message) {
|
|
498
|
-
const key = _a.key(message);
|
|
499
|
-
const routes = this.#routes.get(key);
|
|
500
|
-
const route = _a.select(routes, message);
|
|
501
|
-
return route === undefined || this.#retiringOwners.has(route.ownerKey) ? undefined : route;
|
|
502
|
-
}
|
|
503
|
-
static select(routes, message) {
|
|
504
|
-
if (routes === undefined || routes.length === 0)
|
|
505
|
-
return undefined;
|
|
506
|
-
const tenantKey = _a.tenantKey(message);
|
|
507
|
-
return routes.find((route) => route.tenantKey === tenantKey);
|
|
508
|
-
}
|
|
509
|
-
/**
|
|
510
|
-
*
|
|
511
|
-
* Derives a tenant boundary key from the delivery label's matching envelope.
|
|
512
|
-
* `HANDLE_COMMAND` reads the Command actor tenant; Event labels read imported
|
|
513
|
-
* or past-message Event origin tenants.
|
|
514
|
-
*
|
|
515
|
-
* @param message Contains the admitted delivery message.
|
|
516
|
-
* @returns The tenant boundary key when the supported envelope carries one.
|
|
517
|
-
*/
|
|
518
|
-
static tenantKey(message) {
|
|
519
|
-
if (message.signal === undefined)
|
|
520
|
-
return undefined;
|
|
521
|
-
try {
|
|
522
|
-
if (message.label === "HANDLE_COMMAND") {
|
|
523
|
-
const tenantId = fromBinary(CommandSchema, message.signal.value).context?.actorContext
|
|
524
|
-
?.tenantId;
|
|
525
|
-
return tenantId === undefined ? undefined : String(TenantBoundary.from(tenantId).key);
|
|
526
|
-
}
|
|
527
|
-
const origin = fromBinary(EventSchema, message.signal.value).context?.origin;
|
|
528
|
-
if (origin?.case === "importContext") {
|
|
529
|
-
const value = origin.value.tenantId;
|
|
530
|
-
return value === undefined ? undefined : String(TenantBoundary.from(value).key);
|
|
531
|
-
}
|
|
532
|
-
if (origin?.case === "pastMessage") {
|
|
533
|
-
const value = origin.value.actorContext?.tenantId;
|
|
534
|
-
return value === undefined ? undefined : String(TenantBoundary.from(value).key);
|
|
535
|
-
}
|
|
536
|
-
}
|
|
537
|
-
catch {
|
|
538
|
-
return undefined;
|
|
539
|
-
}
|
|
540
|
-
return undefined;
|
|
541
|
-
}
|
|
542
|
-
static key(route) {
|
|
543
|
-
const targetTypeUrl = route.inboxId?.targetTypeUrl ?? route.targetTypeUrl;
|
|
544
|
-
if (targetTypeUrl === undefined)
|
|
545
|
-
throw new Error("Environment delivery route has no target type.");
|
|
546
|
-
return JSON.stringify([route.label, targetTypeUrl, route.shard.index, route.shard.ofTotal]);
|
|
547
|
-
}
|
|
548
|
-
static messageKey(message) {
|
|
549
|
-
return `${message.signalId}/${_a.key(message)}`;
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
_a = RuntimeDeliverySupervisorGroup;
|
|
553
|
-
class LocalDeliverySource {
|
|
554
|
-
#shards = new Map();
|
|
555
|
-
#recoveryEnabled = false;
|
|
556
|
-
constructor(shards) {
|
|
557
|
-
this.add(shards);
|
|
558
|
-
}
|
|
559
|
-
add(shards) {
|
|
560
|
-
for (const shard of shards)
|
|
561
|
-
this.#shards.set(shard.key(), shard);
|
|
562
|
-
}
|
|
563
|
-
enableRecovery() {
|
|
564
|
-
this.#recoveryEnabled = true;
|
|
565
|
-
}
|
|
566
|
-
shardSnapshot() {
|
|
567
|
-
return Promise.resolve(this.#recoveryEnabled
|
|
568
|
-
? Array.from(this.#shards.values(), (shard) => ({
|
|
569
|
-
shard,
|
|
570
|
-
status: "NOT_PICKED",
|
|
571
|
-
messages: 1,
|
|
572
|
-
}))
|
|
573
|
-
: []);
|
|
574
|
-
}
|
|
575
|
-
observeShardUpdates(options) {
|
|
576
|
-
return EnvironmentDeliveryValues.updatesUntilAborted(options?.signal);
|
|
577
|
-
}
|
|
578
|
-
releaseExpired() {
|
|
579
|
-
return Promise.resolve([]);
|
|
580
|
-
}
|
|
581
|
-
}
|
|
582
|
-
/**
|
|
583
|
-
*
|
|
584
|
-
* @internal Groups private delivery-runtime assembly and failure operations.
|
|
585
|
-
*/
|
|
586
|
-
const EnvironmentDeliveryValues = Object.freeze({
|
|
587
|
-
requireSource(source) {
|
|
588
|
-
if (source === null ||
|
|
589
|
-
typeof source !== "object" ||
|
|
590
|
-
typeof source.shardSnapshot !== "function" ||
|
|
591
|
-
typeof source.observeShardUpdates !== "function" ||
|
|
592
|
-
typeof source.releaseExpired !== "function") {
|
|
593
|
-
throw new TypeError("Environment delivery source is invalid.");
|
|
594
|
-
}
|
|
595
|
-
return source;
|
|
596
|
-
},
|
|
597
|
-
createWorker(runtime, ports, nodeId) {
|
|
598
|
-
const delivery = new Delivery({
|
|
599
|
-
context: runtime.context,
|
|
600
|
-
storageFactory: runtime.storageFactory,
|
|
601
|
-
node: nodeId ?? runtime.context.name,
|
|
602
|
-
...(ports ?? {}),
|
|
603
|
-
});
|
|
604
|
-
const worker = new DeliveryWorker({
|
|
605
|
-
delivery,
|
|
606
|
-
shards: EnvironmentDeliveryValues.uniqueShards(runtime.scopes),
|
|
607
|
-
onMessage: (message) => runtime.descriptor.replay(message, runtime.tenant.tenantId),
|
|
608
|
-
});
|
|
609
|
-
return deliveryRunWorkers.worker(worker);
|
|
610
|
-
},
|
|
611
|
-
createSupervisorGroup(runtime, shards, ports, nodeId) {
|
|
612
|
-
const first = shards[0];
|
|
613
|
-
if (first === undefined) {
|
|
614
|
-
throw new Error("Environment delivery supervisor requires at least one shard.");
|
|
615
|
-
}
|
|
616
|
-
const builder = new DeliveryBuilder()
|
|
617
|
-
.withContext(runtime.context)
|
|
618
|
-
.withStorageFactory(runtime.storageFactory)
|
|
619
|
-
.withStrategy(UniformAcrossAllShards.forNumber(first.ofTotal))
|
|
620
|
-
.withNode(nodeId ?? runtime.context.name);
|
|
621
|
-
if (ports !== undefined)
|
|
622
|
-
builder.withInbox(ports.inbox).withWorkRegistry(ports.workRegistry);
|
|
623
|
-
return new RuntimeDeliverySupervisorGroup({
|
|
624
|
-
delivery: builder.build(),
|
|
625
|
-
shards,
|
|
626
|
-
...(ports?.source === undefined ? {} : { source: ports.source }),
|
|
627
|
-
...(runtime.logger === undefined ? {} : { logger: runtime.logger }),
|
|
628
|
-
});
|
|
629
|
-
},
|
|
630
|
-
updatesUntilAborted(signal) {
|
|
631
|
-
return {
|
|
632
|
-
[Symbol.asyncIterator]() {
|
|
633
|
-
return {
|
|
634
|
-
next: () => new Promise((resolve) => {
|
|
635
|
-
if (signal?.aborted) {
|
|
636
|
-
resolve({ done: true, value: undefined });
|
|
637
|
-
return;
|
|
638
|
-
}
|
|
639
|
-
signal?.addEventListener("abort", () => {
|
|
640
|
-
resolve({ done: true, value: undefined });
|
|
641
|
-
}, { once: true });
|
|
642
|
-
}),
|
|
643
|
-
};
|
|
644
|
-
},
|
|
645
|
-
};
|
|
646
|
-
},
|
|
647
|
-
soleOwner(scopes) {
|
|
648
|
-
const first = scopes[0]?.owner;
|
|
649
|
-
if (first === undefined || scopes.some(({ owner }) => owner.key !== first.key)) {
|
|
650
|
-
throw new Error("Environment delivery obligation requires exactly one owner.");
|
|
651
|
-
}
|
|
652
|
-
return first;
|
|
653
|
-
},
|
|
654
|
-
uniqueShards(scopes) {
|
|
655
|
-
const shards = new Map();
|
|
656
|
-
for (const { ready } of scopes) {
|
|
657
|
-
shards.set(ready.shard.key(), ready.shard);
|
|
658
|
-
}
|
|
659
|
-
return Object.freeze([...shards.values()]);
|
|
660
|
-
},
|
|
661
|
-
throwFailures(failures, message) {
|
|
662
|
-
if (failures.length === 1) {
|
|
663
|
-
throw failures[0];
|
|
664
|
-
}
|
|
665
|
-
if (failures.length > 1) {
|
|
666
|
-
throw new AggregateError(failures, message);
|
|
667
|
-
}
|
|
668
|
-
},
|
|
669
|
-
async attempt(action) {
|
|
670
|
-
await action();
|
|
671
|
-
},
|
|
672
|
-
});
|
|
673
|
-
//# sourceMappingURL=environment-delivery-worker.js.map
|