@spine-event-engine/server 2.0.0-snapshot.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/LICENSE +201 -0
- package/README.md +569 -0
- package/REFERENCE.md +488 -0
- package/dist/bus/command-bus.d.ts +61 -0
- package/dist/bus/command-bus.d.ts.map +1 -0
- package/dist/bus/command-bus.js +201 -0
- package/dist/bus/command-bus.js.map +1 -0
- package/dist/bus/command-dispatcher-registry.d.ts +33 -0
- package/dist/bus/command-dispatcher-registry.d.ts.map +1 -0
- package/dist/bus/command-dispatcher-registry.js +75 -0
- package/dist/bus/command-dispatcher-registry.js.map +1 -0
- package/dist/bus/command-dispatcher.d.ts +25 -0
- package/dist/bus/command-dispatcher.d.ts.map +1 -0
- package/dist/bus/command-dispatcher.js +15 -0
- package/dist/bus/command-dispatcher.js.map +1 -0
- package/dist/bus/command-errors.d.ts +23 -0
- package/dist/bus/command-errors.d.ts.map +1 -0
- package/dist/bus/command-errors.js +52 -0
- package/dist/bus/command-errors.js.map +1 -0
- package/dist/bus/event-bus.d.ts +113 -0
- package/dist/bus/event-bus.d.ts.map +1 -0
- package/dist/bus/event-bus.js +518 -0
- package/dist/bus/event-bus.js.map +1 -0
- package/dist/bus/event-dispatcher-origin-schemas.d.ts +17 -0
- package/dist/bus/event-dispatcher-origin-schemas.d.ts.map +1 -0
- package/dist/bus/event-dispatcher-origin-schemas.js +32 -0
- package/dist/bus/event-dispatcher-origin-schemas.js.map +1 -0
- package/dist/bus/event-dispatcher-registry.d.ts +48 -0
- package/dist/bus/event-dispatcher-registry.d.ts.map +1 -0
- package/dist/bus/event-dispatcher-registry.js +176 -0
- package/dist/bus/event-dispatcher-registry.js.map +1 -0
- package/dist/bus/event-dispatcher.d.ts +48 -0
- package/dist/bus/event-dispatcher.d.ts.map +1 -0
- package/dist/bus/event-dispatcher.js +15 -0
- package/dist/bus/event-dispatcher.js.map +1 -0
- package/dist/context/bounded-context.d.ts +606 -0
- package/dist/context/bounded-context.d.ts.map +1 -0
- package/dist/context/bounded-context.js +1780 -0
- package/dist/context/bounded-context.js.map +1 -0
- package/dist/context/entity-inbox.d.ts +63 -0
- package/dist/context/entity-inbox.d.ts.map +1 -0
- package/dist/context/entity-inbox.js +380 -0
- package/dist/context/entity-inbox.js.map +1 -0
- package/dist/context/local-inbox-handoff.d.ts +244 -0
- package/dist/context/local-inbox-handoff.d.ts.map +1 -0
- package/dist/context/local-inbox-handoff.js +334 -0
- package/dist/context/local-inbox-handoff.js.map +1 -0
- package/dist/context/projection-handoff.d.ts +46 -0
- package/dist/context/projection-handoff.d.ts.map +1 -0
- package/dist/context/projection-handoff.js +172 -0
- package/dist/context/projection-handoff.js.map +1 -0
- package/dist/context/tenant-index.d.ts +41 -0
- package/dist/context/tenant-index.d.ts.map +1 -0
- package/dist/context/tenant-index.js +92 -0
- package/dist/context/tenant-index.js.map +1 -0
- package/dist/delivery/conditional-pickup.d.ts +25 -0
- package/dist/delivery/conditional-pickup.d.ts.map +1 -0
- package/dist/delivery/conditional-pickup.js +26 -0
- package/dist/delivery/conditional-pickup.js.map +1 -0
- package/dist/delivery/delivery-builder.d.ts +216 -0
- package/dist/delivery/delivery-builder.d.ts.map +1 -0
- package/dist/delivery/delivery-builder.js +323 -0
- package/dist/delivery/delivery-builder.js.map +1 -0
- package/dist/delivery/delivery-lease.d.ts +15 -0
- package/dist/delivery/delivery-lease.d.ts.map +1 -0
- package/dist/delivery/delivery-lease.js +44 -0
- package/dist/delivery/delivery-lease.js.map +1 -0
- package/dist/delivery/delivery-loop.d.ts +113 -0
- package/dist/delivery/delivery-loop.d.ts.map +1 -0
- package/dist/delivery/delivery-loop.js +119 -0
- package/dist/delivery/delivery-loop.js.map +1 -0
- package/dist/delivery/delivery-monitor.d.ts +165 -0
- package/dist/delivery/delivery-monitor.d.ts.map +1 -0
- package/dist/delivery/delivery-monitor.js +168 -0
- package/dist/delivery/delivery-monitor.js.map +1 -0
- package/dist/delivery/delivery-ports.d.ts +141 -0
- package/dist/delivery/delivery-ports.d.ts.map +1 -0
- package/dist/delivery/delivery-ports.js +15 -0
- package/dist/delivery/delivery-ports.js.map +1 -0
- package/dist/delivery/delivery-run-control.d.ts +50 -0
- package/dist/delivery/delivery-run-control.d.ts.map +1 -0
- package/dist/delivery/delivery-run-control.js +66 -0
- package/dist/delivery/delivery-run-control.js.map +1 -0
- package/dist/delivery/delivery-run-coordinator.d.ts +218 -0
- package/dist/delivery/delivery-run-coordinator.d.ts.map +1 -0
- package/dist/delivery/delivery-run-coordinator.js +609 -0
- package/dist/delivery/delivery-run-coordinator.js.map +1 -0
- package/dist/delivery/delivery-storage-error.d.ts +13 -0
- package/dist/delivery/delivery-storage-error.d.ts.map +1 -0
- package/dist/delivery/delivery-storage-error.js +30 -0
- package/dist/delivery/delivery-storage-error.js.map +1 -0
- package/dist/delivery/delivery-supervisor.d.ts +175 -0
- package/dist/delivery/delivery-supervisor.d.ts.map +1 -0
- package/dist/delivery/delivery-supervisor.js +469 -0
- package/dist/delivery/delivery-supervisor.js.map +1 -0
- package/dist/delivery/delivery-worker.d.ts +180 -0
- package/dist/delivery/delivery-worker.d.ts.map +1 -0
- package/dist/delivery/delivery-worker.js +232 -0
- package/dist/delivery/delivery-worker.js.map +1 -0
- package/dist/delivery/delivery.d.ts +238 -0
- package/dist/delivery/delivery.d.ts.map +1 -0
- package/dist/delivery/delivery.js +400 -0
- package/dist/delivery/delivery.js.map +1 -0
- package/dist/delivery/inbox-records.d.ts +19 -0
- package/dist/delivery/inbox-records.d.ts.map +1 -0
- package/dist/delivery/inbox-records.js +291 -0
- package/dist/delivery/inbox-records.js.map +1 -0
- package/dist/delivery/inbox-storage.d.ts +81 -0
- package/dist/delivery/inbox-storage.d.ts.map +1 -0
- package/dist/delivery/inbox-storage.js +353 -0
- package/dist/delivery/inbox-storage.js.map +1 -0
- package/dist/delivery/inbox.d.ts +263 -0
- package/dist/delivery/inbox.d.ts.map +1 -0
- package/dist/delivery/inbox.js +172 -0
- package/dist/delivery/inbox.js.map +1 -0
- package/dist/delivery/parked-delivery-obligations.d.ts +182 -0
- package/dist/delivery/parked-delivery-obligations.d.ts.map +1 -0
- package/dist/delivery/parked-delivery-obligations.js +390 -0
- package/dist/delivery/parked-delivery-obligations.js.map +1 -0
- package/dist/delivery/shard-index.d.ts +41 -0
- package/dist/delivery/shard-index.d.ts.map +1 -0
- package/dist/delivery/shard-index.js +67 -0
- package/dist/delivery/shard-index.js.map +1 -0
- package/dist/delivery/sharded-work-registry.d.ts +114 -0
- package/dist/delivery/sharded-work-registry.d.ts.map +1 -0
- package/dist/delivery/sharded-work-registry.js +360 -0
- package/dist/delivery/sharded-work-registry.js.map +1 -0
- package/dist/entity/entity-metadata.d.ts +173 -0
- package/dist/entity/entity-metadata.d.ts.map +1 -0
- package/dist/entity/entity-metadata.js +187 -0
- package/dist/entity/entity-metadata.js.map +1 -0
- package/dist/entity/entity-storage-descriptor.d.ts +64 -0
- package/dist/entity/entity-storage-descriptor.d.ts.map +1 -0
- package/dist/entity/entity-storage-descriptor.js +227 -0
- package/dist/entity/entity-storage-descriptor.js.map +1 -0
- package/dist/entity/entity-transaction.d.ts +372 -0
- package/dist/entity/entity-transaction.d.ts.map +1 -0
- package/dist/entity/entity-transaction.js +413 -0
- package/dist/entity/entity-transaction.js.map +1 -0
- package/dist/entity/entity-transition-validation.d.ts +47 -0
- package/dist/entity/entity-transition-validation.d.ts.map +1 -0
- package/dist/entity/entity-transition-validation.js +327 -0
- package/dist/entity/entity-transition-validation.js.map +1 -0
- package/dist/entity/entity.d.ts +499 -0
- package/dist/entity/entity.d.ts.map +1 -0
- package/dist/entity/entity.js +829 -0
- package/dist/entity/entity.js.map +1 -0
- package/dist/entity/implicit-required-id.d.ts +15 -0
- package/dist/entity/implicit-required-id.d.ts.map +1 -0
- package/dist/entity/implicit-required-id.js +123 -0
- package/dist/entity/implicit-required-id.js.map +1 -0
- package/dist/entity/spec-scanner.d.ts +14 -0
- package/dist/entity/spec-scanner.d.ts.map +1 -0
- package/dist/entity/spec-scanner.js +37 -0
- package/dist/entity/spec-scanner.js.map +1 -0
- package/dist/handler/build-time-handler-analyzer.d.ts +150 -0
- package/dist/handler/build-time-handler-analyzer.d.ts.map +1 -0
- package/dist/handler/build-time-handler-analyzer.js +1101 -0
- package/dist/handler/build-time-handler-analyzer.js.map +1 -0
- package/dist/handler/command-registration-readiness.d.ts +99 -0
- package/dist/handler/command-registration-readiness.d.ts.map +1 -0
- package/dist/handler/command-registration-readiness.js +118 -0
- package/dist/handler/command-registration-readiness.js.map +1 -0
- package/dist/handler/event-handler-filter.d.ts +43 -0
- package/dist/handler/event-handler-filter.d.ts.map +1 -0
- package/dist/handler/event-handler-filter.js +128 -0
- package/dist/handler/event-handler-filter.js.map +1 -0
- package/dist/handler/event-registration-readiness.d.ts +196 -0
- package/dist/handler/event-registration-readiness.d.ts.map +1 -0
- package/dist/handler/event-registration-readiness.js +187 -0
- package/dist/handler/event-registration-readiness.js.map +1 -0
- package/dist/handler/external.d.ts +10 -0
- package/dist/handler/external.d.ts.map +1 -0
- package/dist/handler/external.js +15 -0
- package/dist/handler/external.js.map +1 -0
- package/dist/handler/generated-handler-registry.d.ts +154 -0
- package/dist/handler/generated-handler-registry.d.ts.map +1 -0
- package/dist/handler/generated-handler-registry.js +223 -0
- package/dist/handler/generated-handler-registry.js.map +1 -0
- package/dist/handler/generated-registry-discovery.d.ts +94 -0
- package/dist/handler/generated-registry-discovery.d.ts.map +1 -0
- package/dist/handler/generated-registry-discovery.js +228 -0
- package/dist/handler/generated-registry-discovery.js.map +1 -0
- package/dist/handler/generated-registry-writer.d.ts +58 -0
- package/dist/handler/generated-registry-writer.d.ts.map +1 -0
- package/dist/handler/generated-registry-writer.js +458 -0
- package/dist/handler/generated-registry-writer.js.map +1 -0
- package/dist/handler/handler-codegen.d.ts +48 -0
- package/dist/handler/handler-codegen.d.ts.map +1 -0
- package/dist/handler/handler-codegen.js +214 -0
- package/dist/handler/handler-codegen.js.map +1 -0
- package/dist/handler/handler-decorators.d.ts +134 -0
- package/dist/handler/handler-decorators.d.ts.map +1 -0
- package/dist/handler/handler-decorators.js +239 -0
- package/dist/handler/handler-decorators.js.map +1 -0
- package/dist/handler/handler-metadata.d.ts +510 -0
- package/dist/handler/handler-metadata.d.ts.map +1 -0
- package/dist/handler/handler-metadata.js +391 -0
- package/dist/handler/handler-metadata.js.map +1 -0
- package/dist/handler/registration-readiness-metadata.d.ts +68 -0
- package/dist/handler/registration-readiness-metadata.d.ts.map +1 -0
- package/dist/handler/registration-readiness-metadata.js +170 -0
- package/dist/handler/registration-readiness-metadata.js.map +1 -0
- package/dist/handler/rejection-source.d.ts +11 -0
- package/dist/handler/rejection-source.d.ts.map +1 -0
- package/dist/handler/rejection-source.js +25 -0
- package/dist/handler/rejection-source.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +54 -0
- package/dist/index.js.map +1 -0
- package/dist/integration/external-messages.d.ts +49 -0
- package/dist/integration/external-messages.d.ts.map +1 -0
- package/dist/integration/external-messages.js +112 -0
- package/dist/integration/external-messages.js.map +1 -0
- package/dist/integration/integration-broker.d.ts +74 -0
- package/dist/integration/integration-broker.d.ts.map +1 -0
- package/dist/integration/integration-broker.js +444 -0
- package/dist/integration/integration-broker.js.map +1 -0
- package/dist/integration/third-party-context.d.ts +56 -0
- package/dist/integration/third-party-context.d.ts.map +1 -0
- package/dist/integration/third-party-context.js +130 -0
- package/dist/integration/third-party-context.js.map +1 -0
- package/dist/repository/command-errors.d.ts +25 -0
- package/dist/repository/command-errors.d.ts.map +1 -0
- package/dist/repository/command-errors.js +43 -0
- package/dist/repository/command-errors.js.map +1 -0
- package/dist/repository/command-routing.d.ts +72 -0
- package/dist/repository/command-routing.d.ts.map +1 -0
- package/dist/repository/command-routing.js +98 -0
- package/dist/repository/command-routing.js.map +1 -0
- package/dist/repository/commit-fence.d.ts +22 -0
- package/dist/repository/commit-fence.d.ts.map +1 -0
- package/dist/repository/commit-fence.js +37 -0
- package/dist/repository/commit-fence.js.map +1 -0
- package/dist/repository/event-routing.d.ts +71 -0
- package/dist/repository/event-routing.d.ts.map +1 -0
- package/dist/repository/event-routing.js +96 -0
- package/dist/repository/event-routing.js.map +1 -0
- package/dist/repository/primitive-id.d.ts +86 -0
- package/dist/repository/primitive-id.d.ts.map +1 -0
- package/dist/repository/primitive-id.js +110 -0
- package/dist/repository/primitive-id.js.map +1 -0
- package/dist/repository/repository.d.ts +670 -0
- package/dist/repository/repository.d.ts.map +1 -0
- package/dist/repository/repository.js +3298 -0
- package/dist/repository/repository.js.map +1 -0
- package/dist/repository/routing-declarations.d.ts +75 -0
- package/dist/repository/routing-declarations.d.ts.map +1 -0
- package/dist/repository/routing-declarations.js +101 -0
- package/dist/repository/routing-declarations.js.map +1 -0
- package/dist/repository/state-update-routing.d.ts +66 -0
- package/dist/repository/state-update-routing.d.ts.map +1 -0
- package/dist/repository/state-update-routing.js +91 -0
- package/dist/repository/state-update-routing.js.map +1 -0
- package/dist/runtime/runtime.d.ts +156 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/runtime.js +215 -0
- package/dist/runtime/runtime.js.map +1 -0
- package/dist/runtime/signal-intake.d.ts +84 -0
- package/dist/runtime/signal-intake.d.ts.map +1 -0
- package/dist/runtime/signal-intake.js +94 -0
- package/dist/runtime/signal-intake.js.map +1 -0
- package/dist/runtime/signal-metadata.d.ts +242 -0
- package/dist/runtime/signal-metadata.d.ts.map +1 -0
- package/dist/runtime/signal-metadata.js +368 -0
- package/dist/runtime/signal-metadata.js.map +1 -0
- package/dist/server/browser-server.d.ts +49 -0
- package/dist/server/browser-server.d.ts.map +1 -0
- package/dist/server/browser-server.js +633 -0
- package/dist/server/browser-server.js.map +1 -0
- package/dist/server/durable-subscription-bindings.d.ts +122 -0
- package/dist/server/durable-subscription-bindings.d.ts.map +1 -0
- package/dist/server/durable-subscription-bindings.js +524 -0
- package/dist/server/durable-subscription-bindings.js.map +1 -0
- package/dist/server/environment-attachment.d.ts +356 -0
- package/dist/server/environment-attachment.d.ts.map +1 -0
- package/dist/server/environment-attachment.js +2061 -0
- package/dist/server/environment-attachment.js.map +1 -0
- package/dist/server/environment-delivery-records.d.ts +77 -0
- package/dist/server/environment-delivery-records.d.ts.map +1 -0
- package/dist/server/environment-delivery-records.js +282 -0
- package/dist/server/environment-delivery-records.js.map +1 -0
- package/dist/server/environment-delivery-worker.d.ts +161 -0
- package/dist/server/environment-delivery-worker.d.ts.map +1 -0
- package/dist/server/environment-delivery-worker.js +664 -0
- package/dist/server/environment-delivery-worker.js.map +1 -0
- package/dist/server/environment.d.ts +43 -0
- package/dist/server/environment.d.ts.map +1 -0
- package/dist/server/environment.js +90 -0
- package/dist/server/environment.js.map +1 -0
- package/dist/server/managed-child-subscription.d.ts +11 -0
- package/dist/server/managed-child-subscription.d.ts.map +1 -0
- package/dist/server/managed-child-subscription.js +44 -0
- package/dist/server/managed-child-subscription.js.map +1 -0
- package/dist/server/managed-server-application.d.ts +324 -0
- package/dist/server/managed-server-application.d.ts.map +1 -0
- package/dist/server/managed-server-application.js +937 -0
- package/dist/server/managed-server-application.js.map +1 -0
- package/dist/server/node-coordinator.d.ts +191 -0
- package/dist/server/node-coordinator.d.ts.map +1 -0
- package/dist/server/node-coordinator.js +552 -0
- package/dist/server/node-coordinator.js.map +1 -0
- package/dist/server/process-server-coordinator.d.ts +15 -0
- package/dist/server/process-server-coordinator.d.ts.map +1 -0
- package/dist/server/process-server-coordinator.js +112 -0
- package/dist/server/process-server-coordinator.js.map +1 -0
- package/dist/server/reserved-spine-rpc-paths.json +8 -0
- package/dist/server/retryable-close.d.ts +28 -0
- package/dist/server/retryable-close.d.ts.map +1 -0
- package/dist/server/retryable-close.js +129 -0
- package/dist/server/retryable-close.js.map +1 -0
- package/dist/server/server-environment.d.ts +180 -0
- package/dist/server/server-environment.d.ts.map +1 -0
- package/dist/server/server-environment.js +418 -0
- package/dist/server/server-environment.js.map +1 -0
- package/dist/server/server-log.d.ts +18 -0
- package/dist/server/server-log.d.ts.map +1 -0
- package/dist/server/server-log.js +96 -0
- package/dist/server/server-log.js.map +1 -0
- package/dist/server/server.d.ts +389 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +752 -0
- package/dist/server/server.js.map +1 -0
- package/dist/services/spine-services.d.ts +88 -0
- package/dist/services/spine-services.d.ts.map +1 -0
- package/dist/services/spine-services.js +1586 -0
- package/dist/services/spine-services.js.map +1 -0
- package/dist/stand/stand.d.ts +294 -0
- package/dist/stand/stand.d.ts.map +1 -0
- package/dist/stand/stand.js +680 -0
- package/dist/stand/stand.js.map +1 -0
- package/dist/stand/subscription-observer.d.ts +53 -0
- package/dist/stand/subscription-observer.d.ts.map +1 -0
- package/dist/stand/subscription-observer.js +444 -0
- package/dist/stand/subscription-observer.js.map +1 -0
- package/dist/stand/subscription-records.d.ts +12 -0
- package/dist/stand/subscription-records.d.ts.map +1 -0
- package/dist/stand/subscription-records.js +99 -0
- package/dist/stand/subscription-records.js.map +1 -0
- package/dist/stand/subscription-registry.d.ts +285 -0
- package/dist/stand/subscription-registry.d.ts.map +1 -0
- package/dist/stand/subscription-registry.js +403 -0
- package/dist/stand/subscription-registry.js.map +1 -0
- package/dist/stand/subscription-runtime.d.ts +102 -0
- package/dist/stand/subscription-runtime.d.ts.map +1 -0
- package/dist/stand/subscription-runtime.js +380 -0
- package/dist/stand/subscription-runtime.js.map +1 -0
- package/dist/testing/index.d.ts +14 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +34 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,390 @@
|
|
|
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
|
+
/**
|
|
15
|
+
* Tracks finite unresolved delivery obligations for one package.
|
|
16
|
+
* @internal
|
|
17
|
+
*/
|
|
18
|
+
export class ParkedDeliveryObligations {
|
|
19
|
+
#configured = new Map();
|
|
20
|
+
#records = new Map();
|
|
21
|
+
#shared;
|
|
22
|
+
/**
|
|
23
|
+
* Creates a table from the bounded generation and registration obligations.
|
|
24
|
+
*
|
|
25
|
+
* @param options Supplies the configured obligation domains.
|
|
26
|
+
*/
|
|
27
|
+
constructor(options) {
|
|
28
|
+
for (const registration of options.registrations) {
|
|
29
|
+
for (const obligation of registration.obligations) {
|
|
30
|
+
this.#addConfigured({
|
|
31
|
+
key: ParkedObligationValues.recordKey(ParkedObligationValues.registrationOwner(registration.token), obligation.key),
|
|
32
|
+
owner: ParkedObligationValues.registrationOwner(registration.token),
|
|
33
|
+
obligation: obligation.key,
|
|
34
|
+
units: obligation.units,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
for (const obligation of options.generation) {
|
|
39
|
+
this.#addConfigured({
|
|
40
|
+
key: ParkedObligationValues.recordKey(generationOwner, obligation.key),
|
|
41
|
+
owner: generationOwner,
|
|
42
|
+
obligation: obligation.key,
|
|
43
|
+
units: obligation.units,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const units = Array.from(new Set(options.generation.flatMap((obligation) => obligation.units)));
|
|
47
|
+
if (units.length === 0) {
|
|
48
|
+
throw new Error("Parked delivery obligations require a generation obligation.");
|
|
49
|
+
}
|
|
50
|
+
this.#shared = Object.freeze({
|
|
51
|
+
key: ParkedObligationValues.recordKey(sharedOwner, "shared"),
|
|
52
|
+
owner: sharedOwner,
|
|
53
|
+
obligation: "shared",
|
|
54
|
+
units: Object.freeze(units),
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Records one unresolved obligation with its current failure cause.
|
|
59
|
+
*
|
|
60
|
+
* @param owner Identifies the obligation owner.
|
|
61
|
+
* @param obligation Names the configured obligation.
|
|
62
|
+
* @param units Selects the unresolved units.
|
|
63
|
+
* @param cause Captures the representative failure.
|
|
64
|
+
* @param occurrences Adds the number of observed failures.
|
|
65
|
+
*/
|
|
66
|
+
park(owner, obligation, units, cause, occurrences = 1) {
|
|
67
|
+
ParkedObligationValues.requireOccurrences(occurrences);
|
|
68
|
+
const configured = this.#configuredObligation(owner, obligation, units);
|
|
69
|
+
const record = this.#record(configured, units);
|
|
70
|
+
record.occurrences = ParkedObligationValues.saturatingAdd(record.occurrences, occurrences);
|
|
71
|
+
ParkedObligationValues.recordCauses(record, cause, units, configured.units);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Records a failed fulfillment after resolving the selected units.
|
|
75
|
+
*
|
|
76
|
+
* @param owner Identifies the obligation owner.
|
|
77
|
+
* @param obligation Names the configured obligation.
|
|
78
|
+
* @param units Selects the resolved units.
|
|
79
|
+
*/
|
|
80
|
+
parkFulfilledFailed(owner, obligation, units) {
|
|
81
|
+
const configured = this.#configuredObligation(owner, obligation, units);
|
|
82
|
+
this.#fulfill(configured, units);
|
|
83
|
+
this.#record(configured, units);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Records a shared unresolved obligation.
|
|
87
|
+
*
|
|
88
|
+
* @param units Selects the unresolved units.
|
|
89
|
+
* @param cause Captures the representative failure.
|
|
90
|
+
* @param occurrences Adds the number of observed failures.
|
|
91
|
+
*/
|
|
92
|
+
parkShared(units, cause, occurrences = 1) {
|
|
93
|
+
ParkedObligationValues.requireOccurrences(occurrences);
|
|
94
|
+
const configured = this.#configuredObligation(sharedOwner, "shared", units);
|
|
95
|
+
const record = this.#record(configured, units);
|
|
96
|
+
record.occurrences = ParkedObligationValues.saturatingAdd(record.occurrences, occurrences);
|
|
97
|
+
ParkedObligationValues.recordCauses(record, cause, units, configured.units);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Updates one live registration's configured unit domain in stable order.
|
|
101
|
+
* @internal
|
|
102
|
+
* @param token Identifies the registration to extend.
|
|
103
|
+
* @param obligation Names the configured obligation.
|
|
104
|
+
* @param units Supplies the new units.
|
|
105
|
+
*/
|
|
106
|
+
extendRegistration(token, obligation, units) {
|
|
107
|
+
this.#extendConfigured(ParkedObligationValues.registrationOwner(token), obligation, units);
|
|
108
|
+
this.#extendConfigured(generationOwner, "generation", units);
|
|
109
|
+
this.#shared = Object.freeze({
|
|
110
|
+
...this.#shared,
|
|
111
|
+
units: Object.freeze(ParkedObligationValues.appendUnits(this.#shared.units, units)),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Returns one unreported representative cause for each selected obligation.
|
|
116
|
+
*
|
|
117
|
+
* @param selections Select the obligation units to report.
|
|
118
|
+
* @returns The representative causes that were newly reported.
|
|
119
|
+
*/
|
|
120
|
+
report(selections) {
|
|
121
|
+
const selected = this.#selectedUnits(selections);
|
|
122
|
+
const causes = [];
|
|
123
|
+
for (const configured of this.#configured.values()) {
|
|
124
|
+
this.#reportRecord(configured, selected.get(configured.key), causes);
|
|
125
|
+
}
|
|
126
|
+
this.#reportRecord(this.#shared, selected.get(this.#shared.key), causes);
|
|
127
|
+
return Object.freeze(causes);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Updates selected obligation units as fulfilled.
|
|
131
|
+
*
|
|
132
|
+
* @param owner Identifies the obligation owner.
|
|
133
|
+
* @param obligation Names the configured obligation.
|
|
134
|
+
* @param units Selects the fulfilled units.
|
|
135
|
+
*/
|
|
136
|
+
fulfilled(owner, obligation, units) {
|
|
137
|
+
const configured = this.#configuredObligation(owner, obligation, units);
|
|
138
|
+
this.#fulfill(configured, units);
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Removes a registration and reclassifies its parked obligations.
|
|
142
|
+
*
|
|
143
|
+
* @param token Identifies the removed registration.
|
|
144
|
+
*/
|
|
145
|
+
removeRegistration(token) {
|
|
146
|
+
const plan = this.#reclassificationPlan(token);
|
|
147
|
+
for (const { sourceKey } of plan) {
|
|
148
|
+
this.#records.delete(sourceKey);
|
|
149
|
+
}
|
|
150
|
+
for (const { destinations } of plan) {
|
|
151
|
+
for (const { configured, source } of destinations) {
|
|
152
|
+
this.#coalesce(configured, source);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
for (const [key, configured] of this.#configured) {
|
|
156
|
+
if (configured.owner.kind === "registration" && configured.owner.token === token) {
|
|
157
|
+
this.#configured.delete(key);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Returns immutable snapshots of all parked obligations.
|
|
163
|
+
*
|
|
164
|
+
* @returns The current parked obligation records.
|
|
165
|
+
*/
|
|
166
|
+
records() {
|
|
167
|
+
return Object.freeze(Array.from(this.#records.values(), ParkedObligationValues.snapshot));
|
|
168
|
+
}
|
|
169
|
+
#addConfigured(configured) {
|
|
170
|
+
const key = configured.key;
|
|
171
|
+
if (this.#configured.has(key) || configured.units.length === 0) {
|
|
172
|
+
throw new Error("Parked delivery obligations require unique non-empty configured obligations.");
|
|
173
|
+
}
|
|
174
|
+
this.#configured.set(key, Object.freeze({ ...configured, units: Object.freeze([...configured.units]) }));
|
|
175
|
+
}
|
|
176
|
+
#extendConfigured(owner, obligation, units) {
|
|
177
|
+
if (units.length === 0) {
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const key = ParkedObligationValues.recordKey(owner, obligation);
|
|
181
|
+
const existing = this.#configured.get(key);
|
|
182
|
+
if (existing === undefined) {
|
|
183
|
+
this.#addConfigured({ key, owner, obligation, units });
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
this.#configured.set(key, Object.freeze({
|
|
187
|
+
...existing,
|
|
188
|
+
units: Object.freeze(ParkedObligationValues.appendUnits(existing.units, units)),
|
|
189
|
+
}));
|
|
190
|
+
}
|
|
191
|
+
#configuredObligation(owner, obligation, units) {
|
|
192
|
+
if (owner.kind === "shared" &&
|
|
193
|
+
obligation === "shared" &&
|
|
194
|
+
ParkedObligationValues.isConfiguredSubset(units, this.#shared.units)) {
|
|
195
|
+
return this.#shared;
|
|
196
|
+
}
|
|
197
|
+
const configured = this.#configured.get(ParkedObligationValues.recordKey(owner, obligation));
|
|
198
|
+
if (configured === undefined ||
|
|
199
|
+
!ParkedObligationValues.isConfiguredSubset(units, configured.units)) {
|
|
200
|
+
throw new Error("Parked delivery obligation is not configured.");
|
|
201
|
+
}
|
|
202
|
+
return configured;
|
|
203
|
+
}
|
|
204
|
+
#record(configured, units) {
|
|
205
|
+
const existing = this.#records.get(configured.key);
|
|
206
|
+
if (existing !== undefined) {
|
|
207
|
+
existing.units = ParkedObligationValues.orderUnits([...existing.units, ...units], configured.units);
|
|
208
|
+
return existing;
|
|
209
|
+
}
|
|
210
|
+
const record = {
|
|
211
|
+
key: configured.key,
|
|
212
|
+
owner: configured.owner,
|
|
213
|
+
obligation: configured.obligation,
|
|
214
|
+
units: ParkedObligationValues.orderUnits(units, configured.units),
|
|
215
|
+
occurrences: 0,
|
|
216
|
+
causes: new Map(),
|
|
217
|
+
reportedSinceResolution: false,
|
|
218
|
+
};
|
|
219
|
+
this.#records.set(configured.key, record);
|
|
220
|
+
return record;
|
|
221
|
+
}
|
|
222
|
+
#fulfill(configured, units) {
|
|
223
|
+
const record = this.#records.get(configured.key);
|
|
224
|
+
if (record === undefined) {
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
const resolved = new Set(units);
|
|
228
|
+
record.units = record.units.filter((unit) => !resolved.has(unit));
|
|
229
|
+
for (const unit of resolved) {
|
|
230
|
+
record.causes.delete(unit);
|
|
231
|
+
}
|
|
232
|
+
if (record.units.length === 0) {
|
|
233
|
+
this.#records.delete(configured.key);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
#selectedUnits(selections) {
|
|
237
|
+
const selected = new Map();
|
|
238
|
+
for (const selection of selections) {
|
|
239
|
+
const configured = this.#configuredObligation(selection.owner, selection.obligation, selection.units);
|
|
240
|
+
const units = selected.get(configured.key) ?? new Set();
|
|
241
|
+
for (const unit of selection.units) {
|
|
242
|
+
units.add(unit);
|
|
243
|
+
}
|
|
244
|
+
selected.set(configured.key, units);
|
|
245
|
+
}
|
|
246
|
+
return selected;
|
|
247
|
+
}
|
|
248
|
+
#reportRecord(configured, selected, causes) {
|
|
249
|
+
const record = this.#records.get(configured.key);
|
|
250
|
+
if (record === undefined || selected === undefined) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const representative = ParkedObligationValues.reportableCause(record, configured.units, selected);
|
|
254
|
+
if (representative === undefined) {
|
|
255
|
+
return;
|
|
256
|
+
}
|
|
257
|
+
causes.push(representative.evidence.cause);
|
|
258
|
+
representative.evidence.reported = true;
|
|
259
|
+
record.reportedSinceResolution = true;
|
|
260
|
+
}
|
|
261
|
+
#reclassificationPlan(token) {
|
|
262
|
+
const plan = [];
|
|
263
|
+
for (const [sourceKey, source] of this.#records) {
|
|
264
|
+
if (source.owner.kind !== "registration" || source.owner.token !== token) {
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
plan.push({ sourceKey, destinations: this.#generationDestinations(source) });
|
|
268
|
+
}
|
|
269
|
+
return plan;
|
|
270
|
+
}
|
|
271
|
+
#generationDestinations(source) {
|
|
272
|
+
const generation = Array.from(this.#configured.values()).filter((configured) => configured.owner.kind === "generation");
|
|
273
|
+
const grouped = new Map();
|
|
274
|
+
for (const unit of source.units) {
|
|
275
|
+
const destination = generation.find((configured) => configured.units.includes(unit));
|
|
276
|
+
if (destination === undefined) {
|
|
277
|
+
throw new Error("Removed registration obligation has no configured generation destination.");
|
|
278
|
+
}
|
|
279
|
+
const units = grouped.get(destination.key) ?? [];
|
|
280
|
+
units.push(unit);
|
|
281
|
+
grouped.set(destination.key, units);
|
|
282
|
+
}
|
|
283
|
+
return generation.flatMap((configured) => {
|
|
284
|
+
const units = grouped.get(configured.key);
|
|
285
|
+
return units === undefined
|
|
286
|
+
? []
|
|
287
|
+
: [{ configured, source: ParkedObligationValues.reclassifiedSource(source, units) }];
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
#coalesce(destination, source) {
|
|
291
|
+
const target = this.#record(destination, source.units);
|
|
292
|
+
target.occurrences = ParkedObligationValues.saturatingAdd(target.occurrences, source.occurrences);
|
|
293
|
+
target.reportedSinceResolution ||= source.reportedSinceResolution;
|
|
294
|
+
for (const [unit, evidence] of source.causes) {
|
|
295
|
+
const existing = target.causes.get(unit);
|
|
296
|
+
if (existing === undefined || (existing.reported && !evidence.reported)) {
|
|
297
|
+
target.causes.set(unit, { ...evidence });
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
const generationOwner = Object.freeze({ kind: "generation" });
|
|
303
|
+
const sharedOwner = Object.freeze({ kind: "shared" });
|
|
304
|
+
const ParkedObligationValues = Object.freeze({
|
|
305
|
+
registrationOwner(token) {
|
|
306
|
+
return Object.freeze({ kind: "registration", token });
|
|
307
|
+
},
|
|
308
|
+
recordKey(owner, obligation) {
|
|
309
|
+
return JSON.stringify([
|
|
310
|
+
owner.kind,
|
|
311
|
+
owner.kind === "registration" ? owner.token : null,
|
|
312
|
+
obligation,
|
|
313
|
+
]);
|
|
314
|
+
},
|
|
315
|
+
isConfiguredSubset(units, configured) {
|
|
316
|
+
return units.length > 0 && units.every((unit) => configured.includes(unit));
|
|
317
|
+
},
|
|
318
|
+
orderUnits(units, configured) {
|
|
319
|
+
const selected = new Set(units);
|
|
320
|
+
return configured.filter((unit) => selected.has(unit));
|
|
321
|
+
},
|
|
322
|
+
appendUnits(existing, added) {
|
|
323
|
+
return Array.from(new Set([...existing, ...added]));
|
|
324
|
+
},
|
|
325
|
+
recordCauses(record, cause, units, configured) {
|
|
326
|
+
for (const unit of ParkedObligationValues.orderUnits(units, configured)) {
|
|
327
|
+
const existing = record.causes.get(unit);
|
|
328
|
+
if (existing === undefined || existing.reported) {
|
|
329
|
+
record.causes.set(unit, { cause, reported: false });
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
},
|
|
333
|
+
representativeCause(record, configured) {
|
|
334
|
+
for (const unit of configured) {
|
|
335
|
+
if (!record.units.includes(unit)) {
|
|
336
|
+
continue;
|
|
337
|
+
}
|
|
338
|
+
const evidence = record.causes.get(unit);
|
|
339
|
+
if (evidence !== undefined) {
|
|
340
|
+
return { unit, evidence };
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
return undefined;
|
|
344
|
+
},
|
|
345
|
+
reportableCause(record, configured, selected) {
|
|
346
|
+
for (const unit of configured) {
|
|
347
|
+
const evidence = record.causes.get(unit);
|
|
348
|
+
if (record.units.includes(unit) &&
|
|
349
|
+
selected.has(unit) &&
|
|
350
|
+
evidence !== undefined &&
|
|
351
|
+
!evidence.reported) {
|
|
352
|
+
return { unit, evidence };
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
return undefined;
|
|
356
|
+
},
|
|
357
|
+
reclassifiedSource(source, units) {
|
|
358
|
+
const selected = new Set(units);
|
|
359
|
+
return {
|
|
360
|
+
...source,
|
|
361
|
+
units: [...units],
|
|
362
|
+
causes: new Map(Array.from(source.causes)
|
|
363
|
+
.filter(([unit]) => selected.has(unit))
|
|
364
|
+
.map(([unit, evidence]) => [unit, { ...evidence }])),
|
|
365
|
+
};
|
|
366
|
+
},
|
|
367
|
+
requireOccurrences(increment) {
|
|
368
|
+
if (!Number.isSafeInteger(increment) || increment <= 0) {
|
|
369
|
+
throw new Error("Parked delivery occurrence increment must be a positive safe integer.");
|
|
370
|
+
}
|
|
371
|
+
},
|
|
372
|
+
saturatingAdd(current, increment) {
|
|
373
|
+
return current >= Number.MAX_SAFE_INTEGER - increment
|
|
374
|
+
? Number.MAX_SAFE_INTEGER
|
|
375
|
+
: current + increment;
|
|
376
|
+
},
|
|
377
|
+
snapshot(record) {
|
|
378
|
+
const representative = ParkedObligationValues.representativeCause(record, record.units);
|
|
379
|
+
return Object.freeze({
|
|
380
|
+
owner: record.owner,
|
|
381
|
+
obligation: record.obligation,
|
|
382
|
+
units: Object.freeze([...record.units]),
|
|
383
|
+
cause: representative?.evidence.cause,
|
|
384
|
+
hasCause: representative !== undefined,
|
|
385
|
+
occurrences: record.occurrences,
|
|
386
|
+
reportedSinceResolution: record.reportedSinceResolution,
|
|
387
|
+
});
|
|
388
|
+
},
|
|
389
|
+
});
|
|
390
|
+
//# sourceMappingURL=parked-delivery-obligations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parked-delivery-obligations.js","sourceRoot":"","sources":["../../src/delivery/parked-delivery-obligations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zero-based shard index with a stable shard count.
|
|
3
|
+
*/
|
|
4
|
+
export declare class ShardIndex {
|
|
5
|
+
/**
|
|
6
|
+
* Zero-based position of this shard.
|
|
7
|
+
*/
|
|
8
|
+
readonly index: number;
|
|
9
|
+
/**
|
|
10
|
+
* Total number of shards in the same shard set.
|
|
11
|
+
*/
|
|
12
|
+
readonly ofTotal: number;
|
|
13
|
+
/**
|
|
14
|
+
* Creates a shard index.
|
|
15
|
+
*
|
|
16
|
+
* @param index Identifies the zero-based shard position.
|
|
17
|
+
* @param ofTotal States the total shards in the shard set.
|
|
18
|
+
*/
|
|
19
|
+
constructor(
|
|
20
|
+
/**
|
|
21
|
+
* Zero-based position of this shard.
|
|
22
|
+
*/
|
|
23
|
+
index: number,
|
|
24
|
+
/**
|
|
25
|
+
* Total number of shards in the same shard set.
|
|
26
|
+
*/
|
|
27
|
+
ofTotal: number);
|
|
28
|
+
/**
|
|
29
|
+
* Creates the single local shard.
|
|
30
|
+
*
|
|
31
|
+
* @returns The only shard in a one-shard set.
|
|
32
|
+
*/
|
|
33
|
+
static single(): ShardIndex;
|
|
34
|
+
/**
|
|
35
|
+
* Returns the deterministic storage key for this shard.
|
|
36
|
+
*
|
|
37
|
+
* @returns The shard position and total encoded as a storage key.
|
|
38
|
+
*/
|
|
39
|
+
key(): string;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=shard-index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shard-index.d.ts","sourceRoot":"","sources":["../../src/delivery/shard-index.ts"],"names":[],"mappings":"AAcA;;GAEG;AACH,qBAAa,UAAU;IAYnB;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,MAAM;IAEtB;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,MAAM;IAjB1B;;;;;OAKG;;IAID;;OAEG;IACM,KAAK,EAAE,MAAM;IAEtB;;OAEG;IACM,OAAO,EAAE,MAAM;IAc1B;;;;OAIG;IACH,MAAM,CAAC,MAAM,IAAI,UAAU;IAI3B;;;;OAIG;IACH,GAAG,IAAI,MAAM;CAGd"}
|
|
@@ -0,0 +1,67 @@
|
|
|
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
|
+
/**
|
|
15
|
+
* Zero-based shard index with a stable shard count.
|
|
16
|
+
*/
|
|
17
|
+
export class ShardIndex {
|
|
18
|
+
index;
|
|
19
|
+
ofTotal;
|
|
20
|
+
// prettier-ignore
|
|
21
|
+
/**
|
|
22
|
+
* Creates a shard index.
|
|
23
|
+
*
|
|
24
|
+
* @param index Identifies the zero-based shard position.
|
|
25
|
+
* @param ofTotal States the total shards in the shard set.
|
|
26
|
+
*/
|
|
27
|
+
constructor(
|
|
28
|
+
// prettier-ignore
|
|
29
|
+
/**
|
|
30
|
+
* Zero-based position of this shard.
|
|
31
|
+
*/
|
|
32
|
+
index,
|
|
33
|
+
/**
|
|
34
|
+
* Total number of shards in the same shard set.
|
|
35
|
+
*/
|
|
36
|
+
ofTotal) {
|
|
37
|
+
this.index = index;
|
|
38
|
+
this.ofTotal = ofTotal;
|
|
39
|
+
if (!Number.isInteger(index) || index < 0) {
|
|
40
|
+
throw new Error("ShardIndex.index must be a non-negative integer.");
|
|
41
|
+
}
|
|
42
|
+
if (!Number.isInteger(ofTotal) || ofTotal <= 0) {
|
|
43
|
+
throw new Error("ShardIndex.ofTotal must be a positive integer.");
|
|
44
|
+
}
|
|
45
|
+
if (index >= ofTotal) {
|
|
46
|
+
throw new Error("ShardIndex.index must be smaller than ShardIndex.ofTotal.");
|
|
47
|
+
}
|
|
48
|
+
Object.freeze(this);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Creates the single local shard.
|
|
52
|
+
*
|
|
53
|
+
* @returns The only shard in a one-shard set.
|
|
54
|
+
*/
|
|
55
|
+
static single() {
|
|
56
|
+
return new ShardIndex(0, 1);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Returns the deterministic storage key for this shard.
|
|
60
|
+
*
|
|
61
|
+
* @returns The shard position and total encoded as a storage key.
|
|
62
|
+
*/
|
|
63
|
+
key() {
|
|
64
|
+
return `${String(this.index)}/${String(this.ofTotal)}`;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=shard-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shard-index.js","sourceRoot":"","sources":["../../src/delivery/shard-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;GAEG;AACH,MAAM,OAAO,UAAU;IAeV;IAKA;IAnBX,kBAAkB;IAElB;;;;;OAKG;IACH;IACE,kBAAkB;IAElB;;OAEG;IACM,KAAa;IAEtB;;OAEG;IACM,OAAe;QALf,UAAK,GAAL,KAAK,CAAQ;QAKb,YAAO,GAAP,OAAO,CAAQ;QAExB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACtE,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,GAAG;QACD,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IACzD,CAAC;CACF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { type ShardIndex as WireShardIndex, type ShardSessionRecord, type WorkerId } from "@spine-event-engine/proto/delivery";
|
|
2
|
+
import { RecordSpec, type StorageContext, type StorageFactory } from "@spine-event-engine/storage";
|
|
3
|
+
import { ShardIndex } from "./shard-index.js";
|
|
4
|
+
/**
|
|
5
|
+
* Defines direct durable shard-session records keyed by their generated shard index.
|
|
6
|
+
*/
|
|
7
|
+
export declare const shardSessionRecordSpec: RecordSpec<WireShardIndex, ShardSessionRecord>;
|
|
8
|
+
/**
|
|
9
|
+
* Coordinates durable exclusive ownership of delivery shards.
|
|
10
|
+
*/
|
|
11
|
+
export declare class ShardedWorkRegistry {
|
|
12
|
+
#private;
|
|
13
|
+
/**
|
|
14
|
+
* Identifies the renewable leased session model.
|
|
15
|
+
*/
|
|
16
|
+
readonly sessionKind: "LEASED";
|
|
17
|
+
/**
|
|
18
|
+
* Opens a registry over direct shard-session storage.
|
|
19
|
+
*
|
|
20
|
+
* @param options Configures durable storage, lease duration, and clock.
|
|
21
|
+
*/
|
|
22
|
+
constructor(options: ShardedWorkRegistryOptions);
|
|
23
|
+
/**
|
|
24
|
+
* Acquires a shard for one complete durable worker identity.
|
|
25
|
+
*
|
|
26
|
+
* @param shard Identifies the shard to acquire.
|
|
27
|
+
* @param worker Identifies the worker requesting ownership.
|
|
28
|
+
* @returns The live owned session, or `undefined` when another worker owns it.
|
|
29
|
+
*/
|
|
30
|
+
pickUp(shard: ShardIndex, worker: WorkerId): Promise<ShardSession | undefined>;
|
|
31
|
+
/**
|
|
32
|
+
* Returns one renewed exact live shard-session snapshot.
|
|
33
|
+
*
|
|
34
|
+
* @param expected Supplies the previously observed session.
|
|
35
|
+
* @returns The renewed session, or `undefined` when ownership was lost.
|
|
36
|
+
*/
|
|
37
|
+
renew(expected: ShardSession): Promise<ShardSession | undefined>;
|
|
38
|
+
/**
|
|
39
|
+
* Returns the renewed exact ownership session.
|
|
40
|
+
*
|
|
41
|
+
* @param expected Supplies the previously observed session.
|
|
42
|
+
* @returns The renewed session, or `undefined` when ownership was lost.
|
|
43
|
+
*/
|
|
44
|
+
validateOwnership(expected: ShardSession): Promise<ShardSession | undefined>;
|
|
45
|
+
/**
|
|
46
|
+
* Returns whether one exact live shard-session snapshot became unowned.
|
|
47
|
+
*
|
|
48
|
+
* @param expected Supplies the session to release.
|
|
49
|
+
* @returns Whether the session is or became unowned.
|
|
50
|
+
*/
|
|
51
|
+
release(expected: ShardSession): Promise<boolean>;
|
|
52
|
+
/**
|
|
53
|
+
* Returns after draining one exclusively owned shard until a full rescan is empty.
|
|
54
|
+
*
|
|
55
|
+
* @param shard Identifies the shard to drain.
|
|
56
|
+
* @param worker Identifies the worker retaining ownership.
|
|
57
|
+
* @param read Reads the next pending shard contents.
|
|
58
|
+
* @param deliver Delivers one pending value under the current session.
|
|
59
|
+
* @returns A promise that settles after release or ownership loss.
|
|
60
|
+
*/
|
|
61
|
+
drainUntilEmpty<T>(shard: ShardIndex, worker: WorkerId, read: () => Promise<readonly T[]>, deliver: (value: T, session: ShardSession) => Promise<void>): Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Represents one exact durable shard ownership snapshot.
|
|
65
|
+
*/
|
|
66
|
+
export declare class ShardSession {
|
|
67
|
+
readonly shard: ShardIndex;
|
|
68
|
+
readonly worker: WorkerId | undefined;
|
|
69
|
+
readonly pickedUpAt: Date;
|
|
70
|
+
readonly expiresAt: Date;
|
|
71
|
+
/**
|
|
72
|
+
* Identifies the leased session model.
|
|
73
|
+
*/
|
|
74
|
+
readonly kind: "LEASED";
|
|
75
|
+
/**
|
|
76
|
+
* Creates an immutable shard ownership snapshot.
|
|
77
|
+
*
|
|
78
|
+
* @param shard Identifies the owned shard.
|
|
79
|
+
* @param worker Identifies the owner, or `undefined` for an unowned row.
|
|
80
|
+
* @param pickedUpAt Records the durable pickup time.
|
|
81
|
+
* @param expiresAt Records the derived lease-expiry time.
|
|
82
|
+
*/
|
|
83
|
+
constructor(shard: ShardIndex, worker: WorkerId | undefined, pickedUpAt: Date, expiresAt: Date);
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Configures direct durable shard-session coordination.
|
|
87
|
+
*/
|
|
88
|
+
export interface ShardedWorkRegistryOptions {
|
|
89
|
+
/**
|
|
90
|
+
* Storage context that owns the shard-session family.
|
|
91
|
+
*/
|
|
92
|
+
readonly context: StorageContext;
|
|
93
|
+
/**
|
|
94
|
+
* Factory that opens direct shard-session storage.
|
|
95
|
+
*/
|
|
96
|
+
readonly storageFactory: StorageFactory;
|
|
97
|
+
/**
|
|
98
|
+
* Optional lease duration in milliseconds.
|
|
99
|
+
*/
|
|
100
|
+
readonly leaseMs?: number;
|
|
101
|
+
/**
|
|
102
|
+
* Returns the current time used to derive ownership expiry.
|
|
103
|
+
*
|
|
104
|
+
* @returns The current time.
|
|
105
|
+
*/
|
|
106
|
+
readonly now?: () => Date;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Exposes package-internal registry construction observations for integrations.
|
|
110
|
+
*/
|
|
111
|
+
export declare const shardedWorkRegistryAccess: Readonly<{
|
|
112
|
+
matches(registry: ShardedWorkRegistry, contextValue: StorageContext, storageFactory: StorageFactory): boolean;
|
|
113
|
+
}>;
|
|
114
|
+
//# sourceMappingURL=sharded-work-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sharded-work-registry.d.ts","sourceRoot":"","sources":["../../src/delivery/sharded-work-registry.ts"],"names":[],"mappings":"AAgBA,OAAO,EAIL,KAAK,UAAU,IAAI,cAAc,EACjC,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACd,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACL,UAAU,EAGV,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAK9C;;GAEG;AACH,eAAO,MAAM,sBAAsB,EAAE,UAAU,CAAC,cAAc,EAAE,kBAAkB,CAU9E,CAAC;AAEL;;GAEG;AACH,qBAAa,mBAAmB;;IAG9B;;OAEG;IACH,QAAQ,CAAC,WAAW,EAAG,QAAQ,CAAU;IAMzC;;;;OAIG;gBACS,OAAO,EAAE,0BAA0B;IAc/C;;;;;;OAMG;IACG,MAAM,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAuBpF;;;;;OAKG;IACG,KAAK,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAItE;;;;;OAKG;IACH,iBAAiB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAI5E;;;;;OAKG;IACG,OAAO,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBvD;;;;;;;;OAQG;IACG,eAAe,CAAC,CAAC,EACrB,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,QAAQ,EAChB,IAAI,EAAE,MAAM,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,EACjC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,GAC1D,OAAO,CAAC,IAAI,CAAC;CAiDjB;AAED;;GAEG;AACH,qBAAa,YAAY;IAiBrB,QAAQ,CAAC,KAAK,EAAE,UAAU;IAC1B,QAAQ,CAAC,MAAM,EAAE,QAAQ,GAAG,SAAS;IACrC,QAAQ,CAAC,UAAU,EAAE,IAAI;IACzB,QAAQ,CAAC,SAAS,EAAE,IAAI;IAjB1B;;OAEG;IACH,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAElC;;;;;;;OAOG;gBAEQ,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,QAAQ,GAAG,SAAS,EAC5B,UAAU,EAAE,IAAI,EAChB,SAAS,EAAE,IAAI;CAI3B;AAED;;GAEG;AACH,MAAM,WAAW,0BAA0B;IAGzC;;OAEG;IACH,QAAQ,CAAC,OAAO,EAAE,cAAc,CAAC;IAEjC;;OAEG;IACH,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IAExC;;OAEG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAMD;;GAEG;AACH,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC;IAC/C,OAAO,CACL,QAAQ,EAAE,mBAAmB,EAC7B,YAAY,EAAE,cAAc,EAC5B,cAAc,EAAE,cAAc,GAC7B,OAAO,CAAC;CACZ,CAcC,CAAC"}
|