@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,30 @@
|
|
|
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
|
+
* Raised by public delivery APIs when durable delivery records are corrupt or invalid.
|
|
16
|
+
*/
|
|
17
|
+
export class DeliveryStorageCorruptionError extends Error {
|
|
18
|
+
// prettier-ignore
|
|
19
|
+
/**
|
|
20
|
+
* Creates an error describing invalid durable delivery data.
|
|
21
|
+
*
|
|
22
|
+
* @param message Describes the corrupted record or value.
|
|
23
|
+
* @param options Optionally preserves the originating failure.
|
|
24
|
+
*/
|
|
25
|
+
constructor(message, options) {
|
|
26
|
+
super(`Delivery storage corruption: ${message}`, options);
|
|
27
|
+
this.name = "DeliveryStorageCorruptionError";
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=delivery-storage-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-storage-error.js","sourceRoot":"","sources":["../../src/delivery/delivery-storage-error.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;GAEG;AACH,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACvD,kBAAkB;IAElB;;;;;OAKG;IACH,YAAY,OAAe,EAAE,OAAsB;QACjD,KAAK,CAAC,gCAAgC,OAAO,EAAE,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;IAC/C,CAAC;CACF"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import type { OnDeliveryMessage } from "./delivery.js";
|
|
2
|
+
import type { InboxMessage } from "./inbox.js";
|
|
3
|
+
import type { Delivery } from "./delivery-builder.js";
|
|
4
|
+
import type { DeliveryOperationOptions } from "./delivery-ports.js";
|
|
5
|
+
import { ShardIndex } from "./shard-index.js";
|
|
6
|
+
import type { ILogLayer } from "loglayer";
|
|
7
|
+
interface DeliverySupervisorAccess {
|
|
8
|
+
installLogger(supervisor: DeliverySupervisor, logger: ILogLayer): void;
|
|
9
|
+
loggerFor(supervisor: DeliverySupervisor): ILogLayer;
|
|
10
|
+
installAdmission(supervisor: DeliverySupervisor, admission: (message: InboxMessage) => boolean): void;
|
|
11
|
+
installFinalization(supervisor: DeliverySupervisor, onRunSettled: (shard: ShardIndex) => void): void;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* A detached shard update consumed by {@link DeliverySupervisor}.
|
|
15
|
+
*/
|
|
16
|
+
export interface DeliveryShardUpdate {
|
|
17
|
+
/**
|
|
18
|
+
* Shard whose detached delivery status changed.
|
|
19
|
+
*/
|
|
20
|
+
readonly shard: ShardIndex;
|
|
21
|
+
/**
|
|
22
|
+
* Current remote pickup state used for fail-closed admission.
|
|
23
|
+
*/
|
|
24
|
+
readonly status: "PICKED" | "NOT_PICKED";
|
|
25
|
+
/**
|
|
26
|
+
* Non-negative remote message count; only positive counts are admitted.
|
|
27
|
+
*/
|
|
28
|
+
readonly messages: number;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Structural remote source required by {@link DeliverySupervisor}.
|
|
32
|
+
*/
|
|
33
|
+
export interface DeliverySource {
|
|
34
|
+
/**
|
|
35
|
+
* Reads one detached shard snapshot for startup or recovery.
|
|
36
|
+
* The optional signal/deadline controls this read only; cancellation is cooperative.
|
|
37
|
+
*
|
|
38
|
+
* @param options Optional cancellation and deadline controls.
|
|
39
|
+
* @returns The detached shard updates.
|
|
40
|
+
*/
|
|
41
|
+
shardSnapshot(options?: DeliveryOperationOptions): Promise<readonly DeliveryShardUpdate[]>;
|
|
42
|
+
/**
|
|
43
|
+
* Observes detached Admin shard updates until completion, cancellation, or failure.
|
|
44
|
+
* The supervisor owns bounded reconnect and passes its lifecycle signal.
|
|
45
|
+
*
|
|
46
|
+
* @param options Optional cancellation and deadline controls.
|
|
47
|
+
* @returns The stream of detached shard updates.
|
|
48
|
+
*/
|
|
49
|
+
observeShardUpdates(options?: DeliveryOperationOptions): AsyncIterable<DeliveryShardUpdate>;
|
|
50
|
+
/**
|
|
51
|
+
* Deletes sessions older than `inactivityMs` as one non-retried mutation.
|
|
52
|
+
* Rejection or timeout is never treated as successful release.
|
|
53
|
+
*
|
|
54
|
+
* @param inactivityMs The stale-session age in milliseconds.
|
|
55
|
+
* @param options Optional cancellation and deadline controls.
|
|
56
|
+
* @returns Facts about the released sessions.
|
|
57
|
+
*/
|
|
58
|
+
releaseExpired(inactivityMs: number, options?: DeliveryOperationOptions): Promise<readonly unknown[]>;
|
|
59
|
+
}
|
|
60
|
+
export type { DeliveryOperationOptions } from "./delivery-ports.js";
|
|
61
|
+
/**
|
|
62
|
+
* Raised when active delivery or release cleanup exceeds its bounded close phase.
|
|
63
|
+
*/
|
|
64
|
+
export declare class DeliveryShutdownTimeoutError extends Error {
|
|
65
|
+
/**
|
|
66
|
+
* Creates the bounded-shutdown timeout error.
|
|
67
|
+
*/
|
|
68
|
+
constructor();
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Public builder-owned delivery accepted by the supervisor.
|
|
72
|
+
* Runtime validation accepts only identities created by {@link DeliveryBuilder}.
|
|
73
|
+
*/
|
|
74
|
+
export type SupervisedDelivery = Delivery;
|
|
75
|
+
/**
|
|
76
|
+
* Admits bounded local delivery and observes remote shards.
|
|
77
|
+
*/
|
|
78
|
+
export declare class DeliverySupervisor {
|
|
79
|
+
#private;
|
|
80
|
+
/**
|
|
81
|
+
* Creates a bounded delivery supervisor.
|
|
82
|
+
*
|
|
83
|
+
* @param options The source, delivery, endpoint, and bounds.
|
|
84
|
+
*/
|
|
85
|
+
constructor(options: DeliverySupervisorOptions);
|
|
86
|
+
/**
|
|
87
|
+
* Starts initial stale release and snapshot recovery, then accepts notifications and observation.
|
|
88
|
+
* Repeated successful calls are idempotent; starting after close is rejected.
|
|
89
|
+
*
|
|
90
|
+
* @returns A promise that resolves after recovery and observation start.
|
|
91
|
+
*/
|
|
92
|
+
start(): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Queues one local or remote notification for a shard.
|
|
95
|
+
* Calls before start or after close are ignored; capacity overflow requests one rescan.
|
|
96
|
+
*
|
|
97
|
+
* @param shard The shard whose work may be scheduled.
|
|
98
|
+
*/
|
|
99
|
+
notify(shard: ShardIndex): void;
|
|
100
|
+
/**
|
|
101
|
+
* Resolves when no active or retained pending shard work remains.
|
|
102
|
+
*
|
|
103
|
+
* @returns A promise that resolves when the supervisor is idle.
|
|
104
|
+
*
|
|
105
|
+
*/
|
|
106
|
+
whenIdle(): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* Stops admission and source activity, waits one bounded active-work grace phase, then fences runs.
|
|
109
|
+
* A separate release-cleanup phase uses the same bound. Cleanup failure takes precedence over
|
|
110
|
+
* an active-work timeout; incomplete cleanup is retained for a later close retry.
|
|
111
|
+
*
|
|
112
|
+
* @param options The bounded close controls.
|
|
113
|
+
* @returns A promise that settles after close cleanup completes.
|
|
114
|
+
*/
|
|
115
|
+
close(options?: DeliverySupervisorCloseOptions): Promise<void>;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Exposes framework-only delivery supervisor metadata installation.
|
|
119
|
+
*
|
|
120
|
+
* @internal
|
|
121
|
+
*/
|
|
122
|
+
export declare const deliverySupervisorAccess: DeliverySupervisorAccess;
|
|
123
|
+
/**
|
|
124
|
+
* Construction options for {@link DeliverySupervisor}.
|
|
125
|
+
*/
|
|
126
|
+
export interface DeliverySupervisorOptions {
|
|
127
|
+
/**
|
|
128
|
+
* Structural Admin source; mutable releases are serialized and never blindly retried.
|
|
129
|
+
*/
|
|
130
|
+
readonly source: DeliverySource;
|
|
131
|
+
/**
|
|
132
|
+
* Delivery returned by {@link DeliveryBuilder.build}; forged lookalike ports are rejected.
|
|
133
|
+
*/
|
|
134
|
+
readonly delivery: SupervisedDelivery;
|
|
135
|
+
/**
|
|
136
|
+
* Framework endpoint invoked for each supported admitted delivery row.
|
|
137
|
+
*/
|
|
138
|
+
readonly onMessage: OnDeliveryMessage;
|
|
139
|
+
/**
|
|
140
|
+
* Positive safe-integer active-shard limit. Defaults to `1`.
|
|
141
|
+
*/
|
|
142
|
+
readonly concurrency?: number;
|
|
143
|
+
/**
|
|
144
|
+
* Positive safe-integer retained pending-shard limit. Defaults to `100`.
|
|
145
|
+
*/
|
|
146
|
+
readonly pendingLimit?: number;
|
|
147
|
+
/**
|
|
148
|
+
* Positive safe-integer periodic recovery delay in milliseconds. Defaults to `30000`.
|
|
149
|
+
*/
|
|
150
|
+
readonly recoveryMs?: number;
|
|
151
|
+
/**
|
|
152
|
+
* Positive safe-integer stale-session age in milliseconds. Defaults to `60000`.
|
|
153
|
+
*/
|
|
154
|
+
readonly staleMs?: number;
|
|
155
|
+
/**
|
|
156
|
+
* Positive safe-integer initial watch reconnect delay. Defaults to `100` milliseconds.
|
|
157
|
+
*/
|
|
158
|
+
readonly watchInitialBackoffMs?: number;
|
|
159
|
+
/**
|
|
160
|
+
* Positive safe-integer maximum watch reconnect delay. Defaults to `30000` milliseconds and
|
|
161
|
+
* must not be smaller than `watchInitialBackoffMs`.
|
|
162
|
+
*/
|
|
163
|
+
readonly watchMaxBackoffMs?: number;
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* Bounded close controls for {@link DeliverySupervisor}.
|
|
167
|
+
*/
|
|
168
|
+
export interface DeliverySupervisorCloseOptions {
|
|
169
|
+
/**
|
|
170
|
+
* Non-negative safe-integer bound used separately for active work and release cleanup.
|
|
171
|
+
* Defaults to `30000` milliseconds. A zero value fences without waiting.
|
|
172
|
+
*/
|
|
173
|
+
readonly graceMs?: number;
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=delivery-supervisor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery-supervisor.d.ts","sourceRoot":"","sources":["../../src/delivery/delivery-supervisor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,469 @@
|
|
|
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 { DeliveryRunControl } from "./delivery-run-control.js";
|
|
16
|
+
import { ShardIndex } from "./shard-index.js";
|
|
17
|
+
import { emitServerWarning } from "../server/server-log.js";
|
|
18
|
+
const deliverySupervisorLoggers = new WeakMap();
|
|
19
|
+
const deliverySupervisorAdmissions = new WeakMap();
|
|
20
|
+
const deliverySupervisorFinalizers = new WeakMap();
|
|
21
|
+
const deliverySupervisors = new WeakSet();
|
|
22
|
+
/**
|
|
23
|
+
* Raised when active delivery or release cleanup exceeds its bounded close phase.
|
|
24
|
+
*/
|
|
25
|
+
export class DeliveryShutdownTimeoutError extends Error {
|
|
26
|
+
// prettier-ignore
|
|
27
|
+
/**
|
|
28
|
+
* Creates the bounded-shutdown timeout error.
|
|
29
|
+
*/
|
|
30
|
+
constructor() {
|
|
31
|
+
super("Delivery supervisor shutdown timed out.");
|
|
32
|
+
this.name = "DeliveryShutdownTimeoutError";
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Admits bounded local delivery and observes remote shards.
|
|
37
|
+
*/
|
|
38
|
+
export class DeliverySupervisor {
|
|
39
|
+
#source;
|
|
40
|
+
#runs;
|
|
41
|
+
#onMessage;
|
|
42
|
+
#concurrency;
|
|
43
|
+
#pendingLimit;
|
|
44
|
+
#recoveryMs;
|
|
45
|
+
#staleMs;
|
|
46
|
+
#watchInitialBackoffMs;
|
|
47
|
+
#watchMaxBackoffMs;
|
|
48
|
+
#pending = new Map();
|
|
49
|
+
#active = new Set();
|
|
50
|
+
#idle = new Set();
|
|
51
|
+
#controller = new AbortController();
|
|
52
|
+
#sourceController = new AbortController();
|
|
53
|
+
#started = false;
|
|
54
|
+
#closing = false;
|
|
55
|
+
#closed = false;
|
|
56
|
+
#rescanRequired = false;
|
|
57
|
+
#recovering;
|
|
58
|
+
#recoveryTimer;
|
|
59
|
+
#watchTimer;
|
|
60
|
+
#watchBackoffMs;
|
|
61
|
+
#watching = false;
|
|
62
|
+
#releaseConfirmed = false;
|
|
63
|
+
#releaseAttempt;
|
|
64
|
+
#closeAttempt;
|
|
65
|
+
/**
|
|
66
|
+
* Creates a bounded delivery supervisor.
|
|
67
|
+
*
|
|
68
|
+
* @param options The source, delivery, endpoint, and bounds.
|
|
69
|
+
*/
|
|
70
|
+
constructor(options) {
|
|
71
|
+
deliverySupervisors.add(this);
|
|
72
|
+
this.#source = options.source;
|
|
73
|
+
this.#runs = new DeliveryRunControl(options.delivery);
|
|
74
|
+
this.#onMessage = options.onMessage;
|
|
75
|
+
this.#concurrency = _a.#requireBound("Delivery supervisor concurrency", options.concurrency ?? 1);
|
|
76
|
+
this.#pendingLimit = _a.#requireBound("Delivery supervisor pending limit", options.pendingLimit ?? 100);
|
|
77
|
+
this.#recoveryMs = _a.#requireBound("Delivery supervisor recovery interval", options.recoveryMs ?? 30_000);
|
|
78
|
+
this.#staleMs = _a.#requireBound("Delivery supervisor stale session interval", options.staleMs ?? 60_000);
|
|
79
|
+
this.#watchInitialBackoffMs = _a.#requireBound("Delivery supervisor watch initial backoff", options.watchInitialBackoffMs ?? 100);
|
|
80
|
+
this.#watchMaxBackoffMs = _a.#requireBound("Delivery supervisor watch maximum backoff", options.watchMaxBackoffMs ?? 30_000);
|
|
81
|
+
if (this.#watchMaxBackoffMs < this.#watchInitialBackoffMs) {
|
|
82
|
+
throw new Error("Delivery supervisor watch maximum backoff must not be smaller than initial backoff.");
|
|
83
|
+
}
|
|
84
|
+
this.#watchBackoffMs = this.#watchInitialBackoffMs;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Starts initial stale release and snapshot recovery, then accepts notifications and observation.
|
|
88
|
+
* Repeated successful calls are idempotent; starting after close is rejected.
|
|
89
|
+
*
|
|
90
|
+
* @returns A promise that resolves after recovery and observation start.
|
|
91
|
+
*/
|
|
92
|
+
async start() {
|
|
93
|
+
if (this.#closing || this.#closed)
|
|
94
|
+
throw new Error("Delivery supervisor is closed.");
|
|
95
|
+
if (this.#started)
|
|
96
|
+
return;
|
|
97
|
+
this.#started = true;
|
|
98
|
+
const recovered = await this.#recover();
|
|
99
|
+
this.#scheduleRecovery();
|
|
100
|
+
if (recovered)
|
|
101
|
+
this.#startWatch();
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Queues one local or remote notification for a shard.
|
|
105
|
+
* Calls before start or after close are ignored; capacity overflow requests one rescan.
|
|
106
|
+
*
|
|
107
|
+
* @param shard The shard whose work may be scheduled.
|
|
108
|
+
*/
|
|
109
|
+
notify(shard) {
|
|
110
|
+
if (!this.#started || this.#closing || this.#closed)
|
|
111
|
+
return;
|
|
112
|
+
const key = _a.#shardKey(shard);
|
|
113
|
+
if (this.#active.has(key) || this.#active.size >= this.#concurrency) {
|
|
114
|
+
this.#queue(key, shard);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
this.#active.add(key);
|
|
118
|
+
// spine-log-boundary: server.delivery_run_terminal
|
|
119
|
+
void this.#run(shard, key).catch(() => undefined);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Resolves when no active or retained pending shard work remains.
|
|
123
|
+
*
|
|
124
|
+
* @returns A promise that resolves when the supervisor is idle.
|
|
125
|
+
*
|
|
126
|
+
*/
|
|
127
|
+
whenIdle() {
|
|
128
|
+
if (this.#active.size === 0 && this.#pending.size === 0)
|
|
129
|
+
return Promise.resolve();
|
|
130
|
+
const gate = Promise.withResolvers();
|
|
131
|
+
this.#idle.add(() => {
|
|
132
|
+
gate.resolve(undefined);
|
|
133
|
+
return undefined;
|
|
134
|
+
});
|
|
135
|
+
return gate.promise;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Stops admission and source activity, waits one bounded active-work grace phase, then fences runs.
|
|
139
|
+
* A separate release-cleanup phase uses the same bound. Cleanup failure takes precedence over
|
|
140
|
+
* an active-work timeout; incomplete cleanup is retained for a later close retry.
|
|
141
|
+
*
|
|
142
|
+
* @param options The bounded close controls.
|
|
143
|
+
* @returns A promise that settles after close cleanup completes.
|
|
144
|
+
*/
|
|
145
|
+
close(options = {}) {
|
|
146
|
+
if (this.#closed)
|
|
147
|
+
return Promise.resolve();
|
|
148
|
+
if (this.#closeAttempt !== undefined)
|
|
149
|
+
return this.#closeAttempt;
|
|
150
|
+
_a.#requireGrace(options.graceMs ?? 30_000);
|
|
151
|
+
this.#closing = true;
|
|
152
|
+
this.#pending.clear();
|
|
153
|
+
this.#cancelTimers();
|
|
154
|
+
this.#sourceController.abort(new Error("Delivery supervisor source activity is closed."));
|
|
155
|
+
const attempt = this.#closeNow(options.graceMs ?? 30_000).finally(() => {
|
|
156
|
+
this.#closeAttempt = undefined;
|
|
157
|
+
});
|
|
158
|
+
this.#closeAttempt = attempt;
|
|
159
|
+
return attempt;
|
|
160
|
+
}
|
|
161
|
+
async #closeNow(graceMs) {
|
|
162
|
+
let timedOut = false;
|
|
163
|
+
if (this.#active.size > 0) {
|
|
164
|
+
try {
|
|
165
|
+
await _a.#waitForIdle(this.whenIdle(), graceMs);
|
|
166
|
+
}
|
|
167
|
+
catch {
|
|
168
|
+
timedOut = true;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Abort is the epoch fence and also stops any lease renewal on the controlled path.
|
|
172
|
+
this.#controller.abort(new Error("Delivery supervisor is closed."));
|
|
173
|
+
let releaseError;
|
|
174
|
+
try {
|
|
175
|
+
await this.#releaseOnce(graceMs);
|
|
176
|
+
}
|
|
177
|
+
catch (error) {
|
|
178
|
+
releaseError = error;
|
|
179
|
+
}
|
|
180
|
+
if (releaseError !== undefined)
|
|
181
|
+
throw _a.#releaseError(releaseError);
|
|
182
|
+
if (this.#active.size > 0)
|
|
183
|
+
await this.whenIdle();
|
|
184
|
+
this.#closed = true;
|
|
185
|
+
deliverySupervisorLoggers.delete(this);
|
|
186
|
+
if (timedOut)
|
|
187
|
+
throw new DeliveryShutdownTimeoutError();
|
|
188
|
+
}
|
|
189
|
+
async #releaseOnce(timeoutMs) {
|
|
190
|
+
if (this.#releaseConfirmed)
|
|
191
|
+
return;
|
|
192
|
+
const controller = new AbortController();
|
|
193
|
+
const attempt = this.#releaseExpired({ signal: controller.signal }).then(() => {
|
|
194
|
+
this.#releaseConfirmed = true;
|
|
195
|
+
});
|
|
196
|
+
try {
|
|
197
|
+
await _a.#waitForIdle(attempt, timeoutMs);
|
|
198
|
+
}
|
|
199
|
+
catch (error) {
|
|
200
|
+
controller.abort(new Error("Delivery supervisor release cleanup timed out."));
|
|
201
|
+
// spine-log-boundary: server.delivery_release_timeout_observer
|
|
202
|
+
void attempt.catch(() => undefined);
|
|
203
|
+
throw error;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
#releaseExpired(options) {
|
|
207
|
+
const active = this.#releaseAttempt;
|
|
208
|
+
if (active !== undefined)
|
|
209
|
+
return active;
|
|
210
|
+
const attempt = this.#source.releaseExpired(this.#staleMs, options).then(() => undefined);
|
|
211
|
+
this.#releaseAttempt = attempt;
|
|
212
|
+
// spine-log-boundary: server.delivery_release_reset_observer
|
|
213
|
+
void attempt
|
|
214
|
+
.finally(() => {
|
|
215
|
+
if (this.#releaseAttempt === attempt)
|
|
216
|
+
this.#releaseAttempt = undefined;
|
|
217
|
+
})
|
|
218
|
+
.catch(() => undefined);
|
|
219
|
+
return attempt;
|
|
220
|
+
}
|
|
221
|
+
async #run(shard, key) {
|
|
222
|
+
try {
|
|
223
|
+
const admission = deliverySupervisorAdmissions.get(this);
|
|
224
|
+
const finalization = deliverySupervisorFinalizers.get(this);
|
|
225
|
+
await this.#runs.run({
|
|
226
|
+
shard,
|
|
227
|
+
onMessage: this.#onMessage,
|
|
228
|
+
...(admission === undefined ? {} : { acceptMessage: admission }),
|
|
229
|
+
...(finalization === undefined
|
|
230
|
+
? {}
|
|
231
|
+
: {
|
|
232
|
+
onRunSettled: () => {
|
|
233
|
+
finalization(shard);
|
|
234
|
+
},
|
|
235
|
+
}),
|
|
236
|
+
signal: this.#controller.signal,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
finally {
|
|
240
|
+
this.#active.delete(key);
|
|
241
|
+
this.#startNext(key);
|
|
242
|
+
this.#settleIdle();
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
#settleIdle() {
|
|
246
|
+
if (this.#active.size !== 0 || this.#pending.size !== 0)
|
|
247
|
+
return;
|
|
248
|
+
for (const resolve of this.#idle)
|
|
249
|
+
resolve();
|
|
250
|
+
this.#idle.clear();
|
|
251
|
+
}
|
|
252
|
+
#recover() {
|
|
253
|
+
if (this.#recovering !== undefined)
|
|
254
|
+
return this.#recovering;
|
|
255
|
+
const recovering = this.#recoverNow().finally(() => {
|
|
256
|
+
this.#recovering = undefined;
|
|
257
|
+
});
|
|
258
|
+
this.#recovering = recovering;
|
|
259
|
+
return recovering;
|
|
260
|
+
}
|
|
261
|
+
async #recoverNow() {
|
|
262
|
+
if (this.#closing || this.#closed)
|
|
263
|
+
return false;
|
|
264
|
+
try {
|
|
265
|
+
// Release is a mutation: a rejection is not treated as a successful release.
|
|
266
|
+
await this.#releaseExpired({ signal: this.#sourceController.signal });
|
|
267
|
+
const shards = await this.#source.shardSnapshot({ signal: this.#sourceController.signal });
|
|
268
|
+
for (const shard of shards) {
|
|
269
|
+
if (shard.status === "NOT_PICKED" && shard.messages > 0)
|
|
270
|
+
this.notify(shard.shard);
|
|
271
|
+
}
|
|
272
|
+
return true;
|
|
273
|
+
// spine-log-boundary: server.delivery_recovery_failure
|
|
274
|
+
}
|
|
275
|
+
catch {
|
|
276
|
+
// A later bounded recovery retries; no unknown mutation outcome is assumed successful.
|
|
277
|
+
if (!this.#isClosing())
|
|
278
|
+
this.#warnRecoveryFailure();
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
#warnRecoveryFailure() {
|
|
283
|
+
const logger = deliverySupervisorLoggers.get(this);
|
|
284
|
+
if (logger === undefined)
|
|
285
|
+
return;
|
|
286
|
+
emitServerWarning(logger, "Delivery recovery failed.", {
|
|
287
|
+
operation: "delivery.recovery",
|
|
288
|
+
reasonCode: "failed",
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
#isClosing() {
|
|
292
|
+
return this.#closing || this.#closed;
|
|
293
|
+
}
|
|
294
|
+
#scheduleRecovery() {
|
|
295
|
+
if (this.#closing || this.#closed || this.#recoveryTimer !== undefined)
|
|
296
|
+
return;
|
|
297
|
+
this.#recoveryTimer = setTimeout(() => {
|
|
298
|
+
this.#recoveryTimer = undefined;
|
|
299
|
+
void this.#recover().then((recovered) => {
|
|
300
|
+
if (recovered)
|
|
301
|
+
this.#startWatch();
|
|
302
|
+
this.#scheduleRecovery();
|
|
303
|
+
});
|
|
304
|
+
}, this.#recoveryMs);
|
|
305
|
+
this.#recoveryTimer.unref();
|
|
306
|
+
}
|
|
307
|
+
#startWatch() {
|
|
308
|
+
if (this.#closing || this.#closed || this.#watching)
|
|
309
|
+
return;
|
|
310
|
+
this.#watching = true;
|
|
311
|
+
void this.#watch();
|
|
312
|
+
}
|
|
313
|
+
async #watch() {
|
|
314
|
+
let failed = false;
|
|
315
|
+
try {
|
|
316
|
+
for await (const shard of this.#source.observeShardUpdates({
|
|
317
|
+
signal: this.#sourceController.signal,
|
|
318
|
+
})) {
|
|
319
|
+
if (this.#closing || this.#closed)
|
|
320
|
+
return;
|
|
321
|
+
this.#watchBackoffMs = this.#watchInitialBackoffMs;
|
|
322
|
+
if (shard.status === "NOT_PICKED" && shard.messages > 0)
|
|
323
|
+
this.notify(shard.shard);
|
|
324
|
+
}
|
|
325
|
+
failed = !this.#closing && !this.#closed;
|
|
326
|
+
// spine-log-boundary: server.delivery_watch_failure
|
|
327
|
+
}
|
|
328
|
+
catch {
|
|
329
|
+
failed = !this.#closing && !this.#closed;
|
|
330
|
+
}
|
|
331
|
+
finally {
|
|
332
|
+
this.#watching = false;
|
|
333
|
+
if (failed) {
|
|
334
|
+
this.#warnWatchFailure();
|
|
335
|
+
this.#scheduleWatchRestart();
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
#warnWatchFailure() {
|
|
340
|
+
const logger = deliverySupervisorLoggers.get(this);
|
|
341
|
+
if (logger === undefined)
|
|
342
|
+
return;
|
|
343
|
+
emitServerWarning(logger, "Delivery shard watch failed.", {
|
|
344
|
+
operation: "delivery.watch",
|
|
345
|
+
reasonCode: "failed",
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
#scheduleWatchRestart() {
|
|
349
|
+
if (this.#closing || this.#closed || this.#watchTimer !== undefined)
|
|
350
|
+
return;
|
|
351
|
+
const delay = this.#watchBackoffMs;
|
|
352
|
+
this.#watchBackoffMs = Math.min(this.#watchMaxBackoffMs, delay * 2);
|
|
353
|
+
this.#watchTimer = setTimeout(() => {
|
|
354
|
+
this.#watchTimer = undefined;
|
|
355
|
+
void this.#recover().then((recovered) => {
|
|
356
|
+
if (recovered)
|
|
357
|
+
this.#startWatch();
|
|
358
|
+
else
|
|
359
|
+
this.#scheduleWatchRestart();
|
|
360
|
+
});
|
|
361
|
+
}, delay);
|
|
362
|
+
this.#watchTimer.unref();
|
|
363
|
+
}
|
|
364
|
+
#cancelTimers() {
|
|
365
|
+
if (this.#recoveryTimer !== undefined)
|
|
366
|
+
clearTimeout(this.#recoveryTimer);
|
|
367
|
+
if (this.#watchTimer !== undefined)
|
|
368
|
+
clearTimeout(this.#watchTimer);
|
|
369
|
+
this.#recoveryTimer = undefined;
|
|
370
|
+
this.#watchTimer = undefined;
|
|
371
|
+
}
|
|
372
|
+
#queue(key, shard) {
|
|
373
|
+
if (this.#pending.has(key))
|
|
374
|
+
return;
|
|
375
|
+
if (this.#pending.size >= this.#pendingLimit) {
|
|
376
|
+
this.#rescanRequired = true;
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
this.#pending.set(key, shard);
|
|
380
|
+
}
|
|
381
|
+
#startNext(completed) {
|
|
382
|
+
if (this.#closing || this.#closed)
|
|
383
|
+
return;
|
|
384
|
+
const repeat = this.#pending.get(completed);
|
|
385
|
+
if (repeat !== undefined) {
|
|
386
|
+
this.#pending.delete(completed);
|
|
387
|
+
this.notify(repeat);
|
|
388
|
+
}
|
|
389
|
+
while (this.#active.size < this.#concurrency) {
|
|
390
|
+
const next = this.#pending.entries().next().value;
|
|
391
|
+
if (next === undefined)
|
|
392
|
+
break;
|
|
393
|
+
this.#pending.delete(next[0]);
|
|
394
|
+
this.notify(next[1]);
|
|
395
|
+
}
|
|
396
|
+
if (this.#rescanRequired) {
|
|
397
|
+
this.#rescanRequired = false;
|
|
398
|
+
void this.#recover();
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
static #shardKey(shard) {
|
|
402
|
+
return `${String(shard.index)}/${String(shard.ofTotal)}`;
|
|
403
|
+
}
|
|
404
|
+
static #requireBound(name, value) {
|
|
405
|
+
if (!Number.isSafeInteger(value) || value <= 0) {
|
|
406
|
+
throw new Error(`${name} must be a positive safe integer.`);
|
|
407
|
+
}
|
|
408
|
+
return value;
|
|
409
|
+
}
|
|
410
|
+
static #requireGrace(value) {
|
|
411
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
412
|
+
throw new Error("Delivery close grace must be a safe integer.");
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
static #waitForIdle(idle, graceMs) {
|
|
416
|
+
if (graceMs === 0)
|
|
417
|
+
return Promise.reject(new DeliveryShutdownTimeoutError());
|
|
418
|
+
const timeout = Promise.withResolvers();
|
|
419
|
+
const timer = setTimeout(() => {
|
|
420
|
+
timeout.reject(new DeliveryShutdownTimeoutError());
|
|
421
|
+
}, graceMs);
|
|
422
|
+
timer.unref();
|
|
423
|
+
return Promise.race([idle, timeout.promise]).finally(() => {
|
|
424
|
+
clearTimeout(timer);
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
static #releaseError(error) {
|
|
428
|
+
if (error instanceof DeliveryShutdownTimeoutError)
|
|
429
|
+
return error;
|
|
430
|
+
return new Error("Delivery supervisor release cleanup failed.");
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
_a = DeliverySupervisor;
|
|
434
|
+
/**
|
|
435
|
+
* Exposes framework-only delivery supervisor metadata installation.
|
|
436
|
+
*
|
|
437
|
+
* @internal
|
|
438
|
+
*/
|
|
439
|
+
export const deliverySupervisorAccess = Object.freeze({
|
|
440
|
+
installLogger(supervisor, logger) {
|
|
441
|
+
if (!deliverySupervisors.has(supervisor)) {
|
|
442
|
+
throw new TypeError("Delivery supervisor logger requires a DeliverySupervisor instance.");
|
|
443
|
+
}
|
|
444
|
+
deliverySupervisorLoggers.set(supervisor, logger);
|
|
445
|
+
},
|
|
446
|
+
loggerFor(supervisor) {
|
|
447
|
+
if (!deliverySupervisors.has(supervisor)) {
|
|
448
|
+
throw new TypeError("Delivery supervisor logger requires a DeliverySupervisor instance.");
|
|
449
|
+
}
|
|
450
|
+
const logger = deliverySupervisorLoggers.get(supervisor);
|
|
451
|
+
if (logger === undefined) {
|
|
452
|
+
throw new TypeError("Delivery supervisor logger is not installed.");
|
|
453
|
+
}
|
|
454
|
+
return logger;
|
|
455
|
+
},
|
|
456
|
+
installAdmission(supervisor, admission) {
|
|
457
|
+
if (!deliverySupervisors.has(supervisor)) {
|
|
458
|
+
throw new TypeError("Delivery supervisor admission requires a DeliverySupervisor instance.");
|
|
459
|
+
}
|
|
460
|
+
deliverySupervisorAdmissions.set(supervisor, admission);
|
|
461
|
+
},
|
|
462
|
+
installFinalization(supervisor, onRunSettled) {
|
|
463
|
+
if (!deliverySupervisors.has(supervisor)) {
|
|
464
|
+
throw new TypeError("Delivery supervisor finalization requires a DeliverySupervisor instance.");
|
|
465
|
+
}
|
|
466
|
+
deliverySupervisorFinalizers.set(supervisor, onRunSettled);
|
|
467
|
+
},
|
|
468
|
+
});
|
|
469
|
+
//# sourceMappingURL=delivery-supervisor.js.map
|