@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,238 @@
|
|
|
1
|
+
import { type WorkerId } from "@spine-event-engine/proto/delivery";
|
|
2
|
+
import type { StorageContext, StorageFactory } from "@spine-event-engine/storage";
|
|
3
|
+
import type { DeliveryControlledRun } from "./delivery-run-control.js";
|
|
4
|
+
import { DeliveryMonitor } from "./delivery-monitor.js";
|
|
5
|
+
import type { DeliveryInbox, DeliveryWorkRegistry } from "./delivery-ports.js";
|
|
6
|
+
import { type InboxMessage } from "./inbox.js";
|
|
7
|
+
import { ShardIndex } from "./shard-index.js";
|
|
8
|
+
import type { DeliveryResult, DeliveryRunOptions, DeliveryStrategy } from "./delivery-builder.js";
|
|
9
|
+
/**
|
|
10
|
+
* Describes an endpoint snapshot supplied for direct Inbox delivery.
|
|
11
|
+
*/
|
|
12
|
+
export type DeliveryEndpointMessage = InboxMessage;
|
|
13
|
+
/**
|
|
14
|
+
* Dispatches one persisted Inbox message to an endpoint.
|
|
15
|
+
*
|
|
16
|
+
* @param message The message to dispatch.
|
|
17
|
+
* @returns A promise that settles when endpoint dispatch completes.
|
|
18
|
+
*/
|
|
19
|
+
export type OnDeliveryMessage = (message: DeliveryEndpointMessage) => void | Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Reports one direct drain and whether it durably acknowledged the selected message.
|
|
22
|
+
*
|
|
23
|
+
* @internal
|
|
24
|
+
*/
|
|
25
|
+
export interface DeliveryDirectRun {
|
|
26
|
+
/**
|
|
27
|
+
* Contains the terminal shard-drain outcome.
|
|
28
|
+
*/
|
|
29
|
+
readonly run: DeliveryRun;
|
|
30
|
+
/**
|
|
31
|
+
* Indicates whether this drain durably marked the selected message delivered.
|
|
32
|
+
*/
|
|
33
|
+
readonly acknowledged: boolean;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Summarizes one finite direct delivery run.
|
|
37
|
+
*/
|
|
38
|
+
export interface DeliveryRun {
|
|
39
|
+
/**
|
|
40
|
+
* Identifies the terminal delivery outcome.
|
|
41
|
+
*/
|
|
42
|
+
readonly status: "DRAINED" | "SKIPPED" | "FAILED" | "STOPPED";
|
|
43
|
+
/**
|
|
44
|
+
* Counts messages considered for dispatch.
|
|
45
|
+
*/
|
|
46
|
+
readonly processed: number;
|
|
47
|
+
/**
|
|
48
|
+
* Counts messages admitted to the endpoint.
|
|
49
|
+
*/
|
|
50
|
+
readonly accepted: number;
|
|
51
|
+
/**
|
|
52
|
+
* Counts messages durably acknowledged as delivered.
|
|
53
|
+
*/
|
|
54
|
+
readonly delivered: number;
|
|
55
|
+
/**
|
|
56
|
+
* Counts dispatch or acknowledgement failures.
|
|
57
|
+
*/
|
|
58
|
+
readonly failed: number;
|
|
59
|
+
/**
|
|
60
|
+
* Lists ephemeral delivery failures.
|
|
61
|
+
*/
|
|
62
|
+
readonly failures: readonly DeliveryFailure[];
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Describes ephemeral delivery failure evidence that is never persisted.
|
|
66
|
+
*/
|
|
67
|
+
export interface DeliveryFailure {
|
|
68
|
+
/**
|
|
69
|
+
* Identifies the message associated with the failure.
|
|
70
|
+
*/
|
|
71
|
+
readonly message: InboxMessage;
|
|
72
|
+
/**
|
|
73
|
+
* Supplies the observed failure.
|
|
74
|
+
*/
|
|
75
|
+
readonly error: unknown;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Executes direct Inbox delivery for one complete worker identity.
|
|
79
|
+
*/
|
|
80
|
+
export declare class Delivery {
|
|
81
|
+
#private;
|
|
82
|
+
/**
|
|
83
|
+
* Identifies the immutable storage namespace.
|
|
84
|
+
*/
|
|
85
|
+
readonly context: StorageContext;
|
|
86
|
+
/**
|
|
87
|
+
* Supplies durable record storage.
|
|
88
|
+
*/
|
|
89
|
+
readonly storageFactory: StorageFactory;
|
|
90
|
+
/**
|
|
91
|
+
* Maps targets to delivery shards.
|
|
92
|
+
*/
|
|
93
|
+
readonly strategy: DeliveryStrategy;
|
|
94
|
+
/**
|
|
95
|
+
* Identifies this worker's opaque durable ownership identity.
|
|
96
|
+
*/
|
|
97
|
+
readonly worker: WorkerId;
|
|
98
|
+
/**
|
|
99
|
+
* Names the worker node for compatibility integrations.
|
|
100
|
+
*/
|
|
101
|
+
readonly node: string;
|
|
102
|
+
/**
|
|
103
|
+
* Bounds each direct Inbox read.
|
|
104
|
+
*/
|
|
105
|
+
readonly pageSize: number;
|
|
106
|
+
/**
|
|
107
|
+
* Reads and acknowledges direct Inbox rows.
|
|
108
|
+
*/
|
|
109
|
+
readonly inbox: DeliveryInbox;
|
|
110
|
+
/**
|
|
111
|
+
* Acquires and releases direct shard ownership.
|
|
112
|
+
*/
|
|
113
|
+
readonly shards: DeliveryWorkRegistry;
|
|
114
|
+
/**
|
|
115
|
+
* Creates direct delivery from immutable options.
|
|
116
|
+
*
|
|
117
|
+
* @param options The delivery configuration.
|
|
118
|
+
*/
|
|
119
|
+
constructor(options: DeliveryOptions);
|
|
120
|
+
/**
|
|
121
|
+
* Executes one finite shard delivery.
|
|
122
|
+
*
|
|
123
|
+
* @param options The selected shard and endpoint callback.
|
|
124
|
+
* @returns The terminal public delivery result.
|
|
125
|
+
*/
|
|
126
|
+
run(options: DeliveryRunOptions): Promise<DeliveryResult>;
|
|
127
|
+
/**
|
|
128
|
+
* Executes one finite shard delivery under an operation signal.
|
|
129
|
+
*
|
|
130
|
+
* @param options The controlled shard, endpoint, and cancellation signal.
|
|
131
|
+
* @returns The terminal public delivery result.
|
|
132
|
+
*/
|
|
133
|
+
runControlled(options: DeliveryControlledRun): Promise<DeliveryResult>;
|
|
134
|
+
/**
|
|
135
|
+
* Delivers the selected message's shard for local handoff integration.
|
|
136
|
+
*
|
|
137
|
+
* @param message The message selecting the shard to drain.
|
|
138
|
+
* @param input The endpoint callback or callback configuration.
|
|
139
|
+
* @returns The terminal direct-delivery result.
|
|
140
|
+
*/
|
|
141
|
+
drainMessage(message: InboxMessage, input: OnDeliveryMessage | {
|
|
142
|
+
readonly node?: string;
|
|
143
|
+
readonly onMessage: OnDeliveryMessage;
|
|
144
|
+
/**
|
|
145
|
+
* Observes a durable delivered transition.
|
|
146
|
+
*
|
|
147
|
+
* @param message Contains the acknowledged Inbox message.
|
|
148
|
+
* @internal
|
|
149
|
+
*/
|
|
150
|
+
readonly onDelivered?: (message: InboxMessage) => void;
|
|
151
|
+
/**
|
|
152
|
+
* Selects messages owned by this direct callback.
|
|
153
|
+
*
|
|
154
|
+
* @param message Contains a pending Inbox message.
|
|
155
|
+
* @returns `true` when the callback owns the message.
|
|
156
|
+
* @internal
|
|
157
|
+
*/
|
|
158
|
+
readonly acceptMessage?: (message: InboxMessage) => boolean;
|
|
159
|
+
}): Promise<DeliveryDirectRun>;
|
|
160
|
+
/**
|
|
161
|
+
* Executes one owned shard drain while containing monitor and endpoint failures.
|
|
162
|
+
*
|
|
163
|
+
* @param shard The shard to acquire and drain.
|
|
164
|
+
* @param options The endpoint and optional operation signal.
|
|
165
|
+
* @returns The terminal direct-delivery result.
|
|
166
|
+
*/
|
|
167
|
+
drain(shard: ShardIndex, options: DeliveryDrainOptions): Promise<DeliveryRun>;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Configures one direct delivery owner.
|
|
171
|
+
*/
|
|
172
|
+
export interface DeliveryOptions {
|
|
173
|
+
/**
|
|
174
|
+
* Identifies the storage namespace.
|
|
175
|
+
*/
|
|
176
|
+
readonly context: StorageContext;
|
|
177
|
+
/**
|
|
178
|
+
* Supplies durable record storage.
|
|
179
|
+
*/
|
|
180
|
+
readonly storageFactory: StorageFactory;
|
|
181
|
+
/**
|
|
182
|
+
* Supplies direct shard ownership when customized.
|
|
183
|
+
*/
|
|
184
|
+
readonly workRegistry?: DeliveryWorkRegistry;
|
|
185
|
+
/**
|
|
186
|
+
* Supplies direct Inbox access when customized.
|
|
187
|
+
*/
|
|
188
|
+
readonly inbox?: DeliveryInbox;
|
|
189
|
+
/**
|
|
190
|
+
* Maps targets to shards when customized.
|
|
191
|
+
*/
|
|
192
|
+
readonly strategy?: DeliveryStrategy;
|
|
193
|
+
/**
|
|
194
|
+
* Supplies delivery lifecycle and failure policy hooks.
|
|
195
|
+
*/
|
|
196
|
+
readonly monitor?: DeliveryMonitor;
|
|
197
|
+
/**
|
|
198
|
+
* Supplies a complete opaque worker identity.
|
|
199
|
+
*/
|
|
200
|
+
readonly worker?: WorkerId;
|
|
201
|
+
/**
|
|
202
|
+
* Names the node used to derive a default worker identity.
|
|
203
|
+
*/
|
|
204
|
+
readonly node?: string;
|
|
205
|
+
/**
|
|
206
|
+
* Bounds each direct Inbox read.
|
|
207
|
+
*/
|
|
208
|
+
readonly pageSize?: number;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Configures one direct shard drain.
|
|
212
|
+
*/
|
|
213
|
+
export interface DeliveryDrainOptions {
|
|
214
|
+
/**
|
|
215
|
+
* Dispatches supported Inbox messages.
|
|
216
|
+
*/
|
|
217
|
+
readonly onMessage: OnDeliveryMessage;
|
|
218
|
+
/**
|
|
219
|
+
* Observes a durable delivered transition.
|
|
220
|
+
*
|
|
221
|
+
* @param message Contains the acknowledged Inbox message.
|
|
222
|
+
* @internal
|
|
223
|
+
*/
|
|
224
|
+
readonly onDelivered?: (message: InboxMessage) => void;
|
|
225
|
+
/**
|
|
226
|
+
* Determines whether this drain callback owns a message.
|
|
227
|
+
*
|
|
228
|
+
* @param message Contains a pending Inbox message.
|
|
229
|
+
* @returns `true` when the callback owns the message.
|
|
230
|
+
* @internal
|
|
231
|
+
*/
|
|
232
|
+
readonly acceptMessage?: (message: InboxMessage) => boolean;
|
|
233
|
+
/**
|
|
234
|
+
* Propagates cancellation through the drain.
|
|
235
|
+
*/
|
|
236
|
+
readonly operation?: import("./delivery-ports.js").DeliveryOperationOptions;
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=delivery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.d.ts","sourceRoot":"","sources":["../../src/delivery/delivery.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,400 @@
|
|
|
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
|
+
import { clone, create } from "@bufbuild/protobuf";
|
|
15
|
+
import { AnySchema } from "@bufbuild/protobuf/wkt";
|
|
16
|
+
import { randomUUID } from "node:crypto";
|
|
17
|
+
import { WorkerIdSchema } from "@spine-event-engine/proto/delivery";
|
|
18
|
+
import { AlreadyPickedUp, DeliveryMonitor, FailedPickUp, FailedReception, } from "./delivery-monitor.js";
|
|
19
|
+
import { Inbox, InboxTargets } from "./inbox.js";
|
|
20
|
+
import { InboxStorage } from "./inbox-storage.js";
|
|
21
|
+
import { ShardIndex } from "./shard-index.js";
|
|
22
|
+
import { ShardedWorkRegistry } from "./sharded-work-registry.js";
|
|
23
|
+
import { withDeliveryCommitFence } from "../repository/commit-fence.js";
|
|
24
|
+
/**
|
|
25
|
+
* Executes direct Inbox delivery for one complete worker identity.
|
|
26
|
+
*/
|
|
27
|
+
export class Delivery {
|
|
28
|
+
// prettier-ignore
|
|
29
|
+
/**
|
|
30
|
+
* Identifies the immutable storage namespace.
|
|
31
|
+
*/
|
|
32
|
+
context;
|
|
33
|
+
/**
|
|
34
|
+
* Supplies durable record storage.
|
|
35
|
+
*/
|
|
36
|
+
storageFactory;
|
|
37
|
+
/**
|
|
38
|
+
* Maps targets to delivery shards.
|
|
39
|
+
*/
|
|
40
|
+
strategy;
|
|
41
|
+
/**
|
|
42
|
+
* Identifies this worker's opaque durable ownership identity.
|
|
43
|
+
*/
|
|
44
|
+
worker;
|
|
45
|
+
/**
|
|
46
|
+
* Names the worker node for compatibility integrations.
|
|
47
|
+
*/
|
|
48
|
+
node;
|
|
49
|
+
/**
|
|
50
|
+
* Bounds each direct Inbox read.
|
|
51
|
+
*/
|
|
52
|
+
pageSize;
|
|
53
|
+
/**
|
|
54
|
+
* Reads and acknowledges direct Inbox rows.
|
|
55
|
+
*/
|
|
56
|
+
inbox;
|
|
57
|
+
/**
|
|
58
|
+
* Acquires and releases direct shard ownership.
|
|
59
|
+
*/
|
|
60
|
+
shards;
|
|
61
|
+
#monitor;
|
|
62
|
+
/**
|
|
63
|
+
* Creates direct delivery from immutable options.
|
|
64
|
+
*
|
|
65
|
+
* @param options The delivery configuration.
|
|
66
|
+
*/
|
|
67
|
+
constructor(options) {
|
|
68
|
+
if (options.worker !== undefined &&
|
|
69
|
+
options.node !== undefined &&
|
|
70
|
+
options.worker.nodeId?.value !== options.node) {
|
|
71
|
+
throw new Error("Delivery worker node must match the configured delivery node.");
|
|
72
|
+
}
|
|
73
|
+
this.context = Object.freeze({ ...options.context });
|
|
74
|
+
this.storageFactory = options.storageFactory;
|
|
75
|
+
this.strategy = options.strategy ?? { shardCount: 1, shardFor: () => ShardIndex.single() };
|
|
76
|
+
this.worker =
|
|
77
|
+
options.worker === undefined
|
|
78
|
+
? workerId(options.node ?? "local")
|
|
79
|
+
: snapshotWorker(options.worker);
|
|
80
|
+
this.node = this.worker.nodeId?.value ?? "local";
|
|
81
|
+
this.pageSize = options.pageSize ?? 100;
|
|
82
|
+
this.inbox =
|
|
83
|
+
options.inbox ??
|
|
84
|
+
new Inbox(new InboxStorage({ context: this.context, storageFactory: this.storageFactory }));
|
|
85
|
+
this.shards =
|
|
86
|
+
options.workRegistry ??
|
|
87
|
+
new ShardedWorkRegistry({ context: this.context, storageFactory: this.storageFactory });
|
|
88
|
+
this.#monitor = options.monitor ?? new DeliveryMonitor();
|
|
89
|
+
Object.freeze(this);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Executes one finite shard delivery.
|
|
93
|
+
*
|
|
94
|
+
* @param options The selected shard and endpoint callback.
|
|
95
|
+
* @returns The terminal public delivery result.
|
|
96
|
+
*/
|
|
97
|
+
async run(options) {
|
|
98
|
+
const shard = options.shard ?? ShardIndex.single();
|
|
99
|
+
const run = await this.drain(shard, { onMessage: options.onMessage });
|
|
100
|
+
return Object.freeze({
|
|
101
|
+
status: run.status === "SKIPPED"
|
|
102
|
+
? "SKIPPED"
|
|
103
|
+
: run.status === "FAILED"
|
|
104
|
+
? "FAILED"
|
|
105
|
+
: run.status === "STOPPED"
|
|
106
|
+
? "STOPPED"
|
|
107
|
+
: "COMPLETED",
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Executes one finite shard delivery under an operation signal.
|
|
112
|
+
*
|
|
113
|
+
* @param options The controlled shard, endpoint, and cancellation signal.
|
|
114
|
+
* @returns The terminal public delivery result.
|
|
115
|
+
*/
|
|
116
|
+
runControlled(options) {
|
|
117
|
+
const shard = options.shard;
|
|
118
|
+
return this.drain(shard, {
|
|
119
|
+
onMessage: options.onMessage,
|
|
120
|
+
...(options.acceptMessage === undefined ? {} : { acceptMessage: options.acceptMessage }),
|
|
121
|
+
operation: { signal: options.signal },
|
|
122
|
+
}).then((run) => Object.freeze({
|
|
123
|
+
status: run.status === "SKIPPED"
|
|
124
|
+
? "SKIPPED"
|
|
125
|
+
: run.status === "FAILED"
|
|
126
|
+
? "FAILED"
|
|
127
|
+
: run.status === "STOPPED"
|
|
128
|
+
? "STOPPED"
|
|
129
|
+
: "COMPLETED",
|
|
130
|
+
}));
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Delivers the selected message's shard for local handoff integration.
|
|
134
|
+
*
|
|
135
|
+
* @param message The message selecting the shard to drain.
|
|
136
|
+
* @param input The endpoint callback or callback configuration.
|
|
137
|
+
* @returns The terminal direct-delivery result.
|
|
138
|
+
*/
|
|
139
|
+
async drainMessage(message, input) {
|
|
140
|
+
const onMessage = typeof input === "function" ? input : input.onMessage;
|
|
141
|
+
const observeDelivered = typeof input === "function" ? undefined : input.onDelivered;
|
|
142
|
+
let acknowledged = false;
|
|
143
|
+
const run = await this.drain(message.shard, {
|
|
144
|
+
onMessage,
|
|
145
|
+
...(typeof input === "function" || input.acceptMessage === undefined
|
|
146
|
+
? {}
|
|
147
|
+
: { acceptMessage: input.acceptMessage }),
|
|
148
|
+
onDelivered: (next) => {
|
|
149
|
+
acknowledged ||=
|
|
150
|
+
next.id.value === message.id.value && next.id.shard.key() === message.id.shard.key();
|
|
151
|
+
observeDelivered?.(next);
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
return Object.freeze({ run, acknowledged });
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Executes one owned shard drain while containing monitor and endpoint failures.
|
|
158
|
+
*
|
|
159
|
+
* @param shard The shard to acquire and drain.
|
|
160
|
+
* @param options The endpoint and optional operation signal.
|
|
161
|
+
* @returns The terminal direct-delivery result.
|
|
162
|
+
*/
|
|
163
|
+
async drain(shard, options) {
|
|
164
|
+
if (options.operation?.signal?.aborted)
|
|
165
|
+
return result("STOPPED");
|
|
166
|
+
let session;
|
|
167
|
+
try {
|
|
168
|
+
session = await this.shards.pickUp(shard, this.worker, options.operation);
|
|
169
|
+
}
|
|
170
|
+
catch (error) {
|
|
171
|
+
await safely(async () => (await this.#monitor.onShardPickUpFailure(new FailedPickUp(shard, error))).execute());
|
|
172
|
+
return result("FAILED");
|
|
173
|
+
}
|
|
174
|
+
if (session === undefined) {
|
|
175
|
+
await safely(async () => (await this.#monitor.onShardAlreadyPicked(new AlreadyPickedUp(shard))).execute());
|
|
176
|
+
return result("SKIPPED");
|
|
177
|
+
}
|
|
178
|
+
if (options.operation?.signal?.aborted) {
|
|
179
|
+
const released = await safelyValue(() => this.shards.release(session), false);
|
|
180
|
+
return result(released ? "STOPPED" : "FAILED");
|
|
181
|
+
}
|
|
182
|
+
const statistics = counts();
|
|
183
|
+
const failures = [];
|
|
184
|
+
const complete = (status, value = statistics, runFailures = failures) => result(status, value, runFailures);
|
|
185
|
+
let current = session;
|
|
186
|
+
const ownership = { lost: false };
|
|
187
|
+
const validate = async () => {
|
|
188
|
+
const validated = await safelyValue(() => this.shards.validateOwnership(current, options.operation), undefined);
|
|
189
|
+
if (validated === undefined) {
|
|
190
|
+
ownership.lost = true;
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
current = validated;
|
|
194
|
+
return true;
|
|
195
|
+
};
|
|
196
|
+
const cleanupPage = async () => {
|
|
197
|
+
if (this.inbox.removeDelivered === undefined)
|
|
198
|
+
return true;
|
|
199
|
+
if (!(await validate()))
|
|
200
|
+
return false;
|
|
201
|
+
let after;
|
|
202
|
+
for (let page = 0; page < 2; page += 1) {
|
|
203
|
+
let removedAny = false;
|
|
204
|
+
const delivered = await this.inbox.read(shard, {
|
|
205
|
+
statuses: ["DELIVERED"],
|
|
206
|
+
limit: this.pageSize,
|
|
207
|
+
...(after === undefined ? {} : { after }),
|
|
208
|
+
...(options.operation ?? {}),
|
|
209
|
+
});
|
|
210
|
+
for (const message of delivered) {
|
|
211
|
+
if (options.operation?.signal?.aborted || !(await validate()))
|
|
212
|
+
return false;
|
|
213
|
+
const removed = await this.inbox.removeDelivered(message, current, options.operation);
|
|
214
|
+
if (options.operation?.signal?.aborted || (!removed && !(await validate())))
|
|
215
|
+
return false;
|
|
216
|
+
removedAny ||= removed;
|
|
217
|
+
}
|
|
218
|
+
const last = delivered.at(-1);
|
|
219
|
+
if (removedAny || last === undefined || delivered.length < this.pageSize)
|
|
220
|
+
break;
|
|
221
|
+
after = {
|
|
222
|
+
messageId: last.id.value,
|
|
223
|
+
whenReceived: last.whenReceived,
|
|
224
|
+
version: last.version,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
return true;
|
|
228
|
+
};
|
|
229
|
+
const dispatch = (message) => withDeliveryCommitFence(async () => {
|
|
230
|
+
if (!(await validate()))
|
|
231
|
+
throw new Error("Shard ownership was lost.");
|
|
232
|
+
}, () => Promise.resolve(options.onMessage(message)));
|
|
233
|
+
const markDelivered = async (message) => {
|
|
234
|
+
if ((await this.inbox.markDelivered(message, options.operation)) === undefined)
|
|
235
|
+
throw new Error("Inbox message was not marked delivered.");
|
|
236
|
+
statistics.delivered += 1;
|
|
237
|
+
options.onDelivered?.(message);
|
|
238
|
+
};
|
|
239
|
+
try {
|
|
240
|
+
if (!(await safelyBoolean(() => this.#monitor.shouldContinueAfter("DELIVERY"))))
|
|
241
|
+
return complete("STOPPED");
|
|
242
|
+
if (!(await safely(() => this.#monitor.onDeliveryStarted(shard))))
|
|
243
|
+
return complete("STOPPED");
|
|
244
|
+
const blockedTargets = new Set();
|
|
245
|
+
let after;
|
|
246
|
+
for (;;) {
|
|
247
|
+
const messages = await this.inbox.read(shard, {
|
|
248
|
+
statuses: ["TO_DELIVER"],
|
|
249
|
+
limit: this.pageSize,
|
|
250
|
+
...(after === undefined ? {} : { after }),
|
|
251
|
+
...(options.operation ?? {}),
|
|
252
|
+
});
|
|
253
|
+
if (messages.length === 0) {
|
|
254
|
+
if (!(await cleanupPage()))
|
|
255
|
+
return complete("STOPPED");
|
|
256
|
+
break;
|
|
257
|
+
}
|
|
258
|
+
const deliveredBefore = statistics.delivered;
|
|
259
|
+
for (const message of messages) {
|
|
260
|
+
if (options.operation?.signal?.aborted)
|
|
261
|
+
return complete("STOPPED");
|
|
262
|
+
if (!isEndpointMessage(message))
|
|
263
|
+
continue;
|
|
264
|
+
if (options.acceptMessage !== undefined && !options.acceptMessage(message))
|
|
265
|
+
continue;
|
|
266
|
+
const target = `${message.inboxId.targetTypeUrl}:${InboxTargets.key(message.inboxId.targetId)}`;
|
|
267
|
+
if (blockedTargets.has(target))
|
|
268
|
+
continue;
|
|
269
|
+
statistics.processed += 1;
|
|
270
|
+
if (!(await safelyBoolean(() => this.#monitor.shouldContinueAfter("PAGE"))))
|
|
271
|
+
return complete("STOPPED");
|
|
272
|
+
if (!(await validate()))
|
|
273
|
+
return complete("STOPPED");
|
|
274
|
+
try {
|
|
275
|
+
statistics.accepted += 1;
|
|
276
|
+
await dispatch(message);
|
|
277
|
+
if (options.operation?.signal?.aborted)
|
|
278
|
+
return complete("STOPPED");
|
|
279
|
+
if (!(await validate()))
|
|
280
|
+
return complete("STOPPED");
|
|
281
|
+
await markDelivered(message);
|
|
282
|
+
}
|
|
283
|
+
catch (error) {
|
|
284
|
+
statistics.failed += 1;
|
|
285
|
+
failures.push(Object.freeze({ message: snapshot(message), error }));
|
|
286
|
+
const reception = new FailedReception(message, error, async () => {
|
|
287
|
+
if (!(await validate()))
|
|
288
|
+
throw new Error("Shard ownership was lost.");
|
|
289
|
+
await markDelivered(message);
|
|
290
|
+
}, async () => {
|
|
291
|
+
await dispatch(message);
|
|
292
|
+
if (!(await validate()))
|
|
293
|
+
throw new Error("Shard ownership was lost.");
|
|
294
|
+
await markDelivered(message);
|
|
295
|
+
});
|
|
296
|
+
const action = await safelyValue(() => this.#monitor.onReceptionFailure(reception), reception.markDelivered());
|
|
297
|
+
if (!(await safely(() => action.execute())) &&
|
|
298
|
+
!(await safely(() => reception.markDelivered().execute()))) {
|
|
299
|
+
blockedTargets.add(target);
|
|
300
|
+
}
|
|
301
|
+
if (ownership.lost)
|
|
302
|
+
return complete("STOPPED");
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
if (!(await cleanupPage()))
|
|
306
|
+
return complete("STOPPED");
|
|
307
|
+
const last = messages.at(-1);
|
|
308
|
+
if (statistics.delivered !== deliveredBefore) {
|
|
309
|
+
after = undefined;
|
|
310
|
+
continue;
|
|
311
|
+
}
|
|
312
|
+
if (last === undefined || messages.length < this.pageSize)
|
|
313
|
+
break;
|
|
314
|
+
after = {
|
|
315
|
+
messageId: last.id.value,
|
|
316
|
+
whenReceived: last.whenReceived,
|
|
317
|
+
version: last.version,
|
|
318
|
+
};
|
|
319
|
+
// Reached a full page without progress: continue past it once. A later
|
|
320
|
+
// independent target may still be actionable; exhaustion ends the run.
|
|
321
|
+
}
|
|
322
|
+
return complete("DRAINED");
|
|
323
|
+
}
|
|
324
|
+
finally {
|
|
325
|
+
const released = await safelyValue(() => this.shards.release(current, options.operation), false);
|
|
326
|
+
if (!released) {
|
|
327
|
+
// The release result changes the terminal delivery outcome: a shard is
|
|
328
|
+
// not complete until ownership is confirmed released.
|
|
329
|
+
// eslint-disable-next-line no-unsafe-finally
|
|
330
|
+
return complete("FAILED");
|
|
331
|
+
}
|
|
332
|
+
await safely(() => this.#monitor.onDeliveryCompleted(Object.freeze({
|
|
333
|
+
processed: statistics.processed,
|
|
334
|
+
delivered: statistics.delivered,
|
|
335
|
+
failed: statistics.failed,
|
|
336
|
+
})));
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
function workerId(node) {
|
|
341
|
+
return create(WorkerIdSchema, { nodeId: { value: node }, value: randomUUID() });
|
|
342
|
+
}
|
|
343
|
+
function snapshotWorker(worker) {
|
|
344
|
+
return Object.freeze({
|
|
345
|
+
nodeId: Object.freeze({ value: worker.nodeId?.value ?? "" }),
|
|
346
|
+
value: worker.value,
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
function counts() {
|
|
350
|
+
return { processed: 0, accepted: 0, delivered: 0, failed: 0 };
|
|
351
|
+
}
|
|
352
|
+
function result(status, value = counts(), failures = []) {
|
|
353
|
+
const run = Object.freeze({ status, ...value, failures: Object.freeze([...failures]) });
|
|
354
|
+
return run;
|
|
355
|
+
}
|
|
356
|
+
function snapshot(message) {
|
|
357
|
+
return Object.freeze({
|
|
358
|
+
...message,
|
|
359
|
+
id: Object.freeze({
|
|
360
|
+
...message.id,
|
|
361
|
+
shard: new ShardIndex(message.id.shard.index, message.id.shard.ofTotal),
|
|
362
|
+
}),
|
|
363
|
+
inboxId: Object.freeze({ ...message.inboxId }),
|
|
364
|
+
...(message.signal === undefined ? {} : { signal: clone(AnySchema, message.signal) }),
|
|
365
|
+
shard: new ShardIndex(message.shard.index, message.shard.ofTotal),
|
|
366
|
+
whenReceived: new Date(message.whenReceived),
|
|
367
|
+
...(message.keepUntil === undefined ? {} : { keepUntil: new Date(message.keepUntil) }),
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
async function safely(action) {
|
|
371
|
+
try {
|
|
372
|
+
await action();
|
|
373
|
+
return true;
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
return false;
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
async function safelyBoolean(action) {
|
|
380
|
+
try {
|
|
381
|
+
return await action();
|
|
382
|
+
}
|
|
383
|
+
catch {
|
|
384
|
+
return false;
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
async function safelyValue(action, fallback) {
|
|
388
|
+
try {
|
|
389
|
+
return await action();
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
return fallback;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
function isEndpointMessage(message) {
|
|
396
|
+
return (message.label === "HANDLE_COMMAND" ||
|
|
397
|
+
message.label === "UPDATE_SUBSCRIBER" ||
|
|
398
|
+
message.label === "REACT_UPON_EVENT");
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"delivery.js","sourceRoot":"","sources":["../../src/delivery/delivery.ts"],"names":[],"mappings":"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"}
|