@lostgradient/weft 0.2.1 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +123 -43
- package/dist/cli/conformance.js +7 -1
- package/dist/cli/generated/operation-client.generated.d.ts +55 -13
- package/dist/cli/generated/operation-client.generated.js +3 -0
- package/dist/cli/help-text.d.ts +1 -1
- package/dist/cli/help-text.js +1 -0
- package/dist/cli/operation-catalog-snapshot.d.ts +8 -0
- package/dist/cli/operation-catalog-snapshot.js +11 -0
- package/dist/cli/parse-schedule-arguments.js +3 -1
- package/dist/cli/schedule.js +2 -1
- package/dist/cli/types.d.ts +1 -0
- package/dist/cli-main.js +80 -79
- package/dist/client/handle-delegation.d.ts +7 -2
- package/dist/client/handle-delegation.js +9 -1
- package/dist/client/http-client-requests.d.ts +4 -1
- package/dist/client/http-client-requests.js +10 -0
- package/dist/client/http-client.d.ts +10 -4
- package/dist/client/http-client.js +18 -1
- package/dist/client/http-request.d.ts +11 -1
- package/dist/client/http-request.js +17 -7
- package/dist/client/index.d.ts +1 -1
- package/dist/client/interface.d.ts +100 -4
- package/dist/client/local.d.ts +7 -1
- package/dist/client/local.js +17 -2
- package/dist/client/start-body.d.ts +9 -2
- package/dist/client/start-body.js +13 -4
- package/dist/core/byte-arrays.d.ts +5 -0
- package/dist/core/byte-arrays.js +5 -0
- package/dist/core/checkpoint/lifecycle.d.ts +3 -0
- package/dist/core/checkpoint/lifecycle.js +9 -4
- package/dist/core/checkpoint/serialization.js +12 -5
- package/dist/core/codec/extension-codec.d.ts +16 -0
- package/dist/core/codec/extension-codec.js +104 -8
- package/dist/core/codec/index.d.ts +1 -0
- package/dist/core/codec/index.js +1 -0
- package/dist/core/codec/serializer-registry.d.ts +122 -0
- package/dist/core/codec/serializer-registry.js +51 -0
- package/dist/core/context/activity-retry-state.d.ts +38 -0
- package/dist/core/context/activity-retry-state.js +89 -0
- package/dist/core/context/activity-schedule-to-close.d.ts +159 -0
- package/dist/core/context/activity-schedule-to-close.js +69 -0
- package/dist/core/context/child-workflow-pipe.d.ts +5 -5
- package/dist/core/context/child-workflow-pipe.js +15 -2
- package/dist/core/context/context-presence.d.ts +19 -0
- package/dist/core/context/context-presence.js +13 -0
- package/dist/core/context/durable-operations.d.ts +25 -0
- package/dist/core/context/durable-operations.js +64 -0
- package/dist/core/context/index.d.ts +18 -5
- package/dist/core/context/index.js +17 -12
- package/dist/core/context/internals.d.ts +29 -0
- package/dist/core/context/internals.js +6 -1
- package/dist/core/context/operation-request.d.ts +35 -0
- package/dist/core/context/parallel-cache-entry.d.ts +14 -5
- package/dist/core/context/run-operation.d.ts +21 -3
- package/dist/core/context/run-operation.js +56 -93
- package/dist/core/context/session-state.js +7 -8
- package/dist/core/context/speculative-child.js +2 -0
- package/dist/core/context/types.d.ts +15 -0
- package/dist/core/context/version-patching.d.ts +8 -0
- package/dist/core/context/version-patching.js +40 -0
- package/dist/core/context/workflow-logger.d.ts +98 -0
- package/dist/core/context/workflow-logger.js +68 -0
- package/dist/core/engine/activity-heartbeat-tracking.d.ts +64 -0
- package/dist/core/engine/activity-heartbeat-tracking.js +42 -0
- package/dist/core/engine/activity-per-attempt-timeout.d.ts +41 -0
- package/dist/core/engine/activity-per-attempt-timeout.js +36 -0
- package/dist/core/engine/activity-reconciliation.d.ts +1 -0
- package/dist/core/engine/activity-reconciliation.js +12 -1
- package/dist/core/engine/activity-resolution.d.ts +23 -0
- package/dist/core/engine/activity-resolution.js +37 -0
- package/dist/core/engine/aggregate.js +66 -30
- package/dist/core/engine/async-activity-completion.d.ts +23 -6
- package/dist/core/engine/async-activity-completion.js +53 -12
- package/dist/core/engine/attributes-tags.js +9 -4
- package/dist/core/engine/bulk-operations-purge.d.ts +26 -0
- package/dist/core/engine/bulk-operations-purge.js +38 -3
- package/dist/core/engine/bulk-operations-shared.d.ts +2 -0
- package/dist/core/engine/bulk-operations-shared.js +8 -2
- package/dist/core/engine/bulk-operations.d.ts +4 -1
- package/dist/core/engine/bulk-operations.js +235 -24
- package/dist/core/engine/callback-creators-bundles.d.ts +9 -0
- package/dist/core/engine/callback-creators-bundles.js +30 -2
- package/dist/core/engine/callback-creators-core.js +6 -4
- package/dist/core/engine/callback-creators-router.js +10 -0
- package/dist/core/engine/callback-creators-schedule.d.ts +2 -2
- package/dist/core/engine/callback-creators-schedule.js +12 -8
- package/dist/core/engine/candidate-read-batching.d.ts +6 -0
- package/dist/core/engine/candidate-read-batching.js +1 -0
- package/dist/core/engine/checkpoint-io.js +61 -25
- package/dist/core/engine/checkpoint-reads.js +3 -2
- package/dist/core/engine/checkpoint-replay.d.ts +20 -0
- package/dist/core/engine/checkpoint-replay.js +242 -0
- package/dist/core/engine/checkpoint-side-effects.d.ts +23 -0
- package/dist/core/engine/checkpoint-side-effects.js +35 -0
- package/dist/core/engine/child-workflow-cancellation.d.ts +10 -0
- package/dist/core/engine/child-workflow-cancellation.js +40 -0
- package/dist/core/engine/child-workflow.js +27 -4
- package/dist/core/engine/condition-waiters.d.ts +14 -0
- package/dist/core/engine/condition-waiters.js +5 -0
- package/dist/core/engine/construction.d.ts +3 -1
- package/dist/core/engine/construction.js +30 -8
- package/dist/core/engine/coordination-branch-executors.d.ts +70 -0
- package/dist/core/engine/coordination-branch-executors.js +107 -0
- package/dist/core/engine/deferred-consume-envelope.d.ts +59 -0
- package/dist/core/engine/deferred-consume-envelope.js +14 -0
- package/dist/core/engine/disposal.js +25 -0
- package/dist/core/engine/engine-create-types.d.ts +14 -18
- package/dist/core/engine/engine-internal-types.d.ts +38 -3
- package/dist/core/engine/engine-leak-warnings.d.ts +6 -0
- package/dist/core/engine/engine-leak-warnings.js +4 -0
- package/dist/core/engine/engine-runtime-helpers.d.ts +17 -0
- package/dist/core/engine/engine-runtime-helpers.js +26 -5
- package/dist/core/engine/errors.d.ts +121 -0
- package/dist/core/engine/errors.js +45 -1
- package/dist/core/engine/event-log-compaction.d.ts +8 -0
- package/dist/core/engine/event-log-compaction.js +20 -2
- package/dist/core/engine/fenced-write.d.ts +65 -0
- package/dist/core/engine/fenced-write.js +71 -0
- package/dist/core/engine/finalizer-state.d.ts +28 -0
- package/dist/core/engine/finalizer-state.js +16 -0
- package/dist/core/engine/handle-result.js +1 -1
- package/dist/core/engine/handles.d.ts +97 -40
- package/dist/core/engine/handles.js +25 -27
- package/dist/core/engine/index.d.ts +125 -15
- package/dist/core/engine/index.js +207 -11
- package/dist/core/engine/inline-launch-queue.d.ts +14 -0
- package/dist/core/engine/inline-launch-queue.js +32 -7
- package/dist/core/engine/inline-parking.js +3 -2
- package/dist/core/engine/internals.d.ts +125 -13
- package/dist/core/engine/lease-codec.d.ts +35 -0
- package/dist/core/engine/lease-codec.js +32 -0
- package/dist/core/engine/lease-deposition.d.ts +66 -0
- package/dist/core/engine/lease-deposition.js +10 -0
- package/dist/core/engine/lease-errors.d.ts +99 -0
- package/dist/core/engine/lease-errors.js +30 -0
- package/dist/core/engine/lease-manager.d.ts +114 -0
- package/dist/core/engine/lease-manager.js +135 -0
- package/dist/core/engine/lifecycle/fork-helpers.js +1 -7
- package/dist/core/engine/lifecycle/persist.js +15 -52
- package/dist/core/engine/lifecycle/recovered-services.d.ts +8 -6
- package/dist/core/engine/lifecycle/recovered-services.js +18 -3
- package/dist/core/engine/lifecycle/resume.js +39 -11
- package/dist/core/engine/lifecycle/shared.d.ts +8 -1
- package/dist/core/engine/lifecycle/start-batch.d.ts +1 -1
- package/dist/core/engine/lifecycle/start-batch.js +2 -1
- package/dist/core/engine/lifecycle/start-commit.d.ts +56 -0
- package/dist/core/engine/lifecycle/start-commit.js +69 -0
- package/dist/core/engine/lifecycle/start-exec.d.ts +30 -2
- package/dist/core/engine/lifecycle/start-exec.js +38 -0
- package/dist/core/engine/lifecycle/start-or-signal-create.d.ts +58 -0
- package/dist/core/engine/lifecycle/start-or-signal-create.js +95 -0
- package/dist/core/engine/lifecycle/start-or-signal-resolution.d.ts +79 -0
- package/dist/core/engine/lifecycle/start-or-signal-resolution.js +60 -0
- package/dist/core/engine/lifecycle/start-or-signal.d.ts +46 -0
- package/dist/core/engine/lifecycle/start-or-signal.js +71 -0
- package/dist/core/engine/lifecycle/start-terminal-conflict-purge.d.ts +39 -0
- package/dist/core/engine/lifecycle/start-terminal-conflict-purge.js +28 -0
- package/dist/core/engine/lifecycle/start.d.ts +6 -6
- package/dist/core/engine/lifecycle/start.js +47 -45
- package/dist/core/engine/lifecycle/transition.js +17 -5
- package/dist/core/engine/lifecycle.d.ts +3 -2
- package/dist/core/engine/lifecycle.js +9 -2
- package/dist/core/engine/list-candidate-resolution.js +2 -2
- package/dist/core/engine/listing.js +10 -6
- package/dist/core/engine/operations-activity.d.ts +4 -11
- package/dist/core/engine/operations-activity.js +22 -49
- package/dist/core/engine/operations-coordination.d.ts +10 -0
- package/dist/core/engine/operations-coordination.js +43 -8
- package/dist/core/engine/operations-router.d.ts +6 -0
- package/dist/core/engine/operations-router.js +2 -0
- package/dist/core/engine/operations-speculate.js +6 -2
- package/dist/core/engine/operations-stream.js +12 -2
- package/dist/core/engine/operations-time.d.ts +4 -2
- package/dist/core/engine/operations-time.js +14 -2
- package/dist/core/engine/operations-wait-condition.d.ts +23 -0
- package/dist/core/engine/operations-wait-condition.js +62 -0
- package/dist/core/engine/ownership-options.d.ts +23 -0
- package/dist/core/engine/ownership-options.js +26 -0
- package/dist/core/engine/payload-size-policy.d.ts +3 -0
- package/dist/core/engine/payload-size-policy.js +4 -0
- package/dist/core/engine/pending-updates.d.ts +17 -0
- package/dist/core/engine/pending-updates.js +33 -11
- package/dist/core/engine/persisted-data-version.d.ts +5 -9
- package/dist/core/engine/persisted-data-version.js +4 -5
- package/dist/core/engine/queries.js +1 -1
- package/dist/core/engine/registration.d.ts +1 -0
- package/dist/core/engine/registration.js +18 -3
- package/dist/core/engine/schedule-handle.d.ts +45 -0
- package/dist/core/engine/schedule-handle.js +26 -0
- package/dist/core/engine/schedule-jitter.d.ts +5 -0
- package/dist/core/engine/schedule-jitter.js +10 -0
- package/dist/core/engine/schedule-run.d.ts +17 -0
- package/dist/core/engine/schedule-run.js +38 -0
- package/dist/core/engine/schedule-timer.js +81 -17
- package/dist/core/engine/schedules.d.ts +8 -5
- package/dist/core/engine/schedules.js +44 -19
- package/dist/core/engine/search-attribute-records.d.ts +4 -0
- package/dist/core/engine/search-attribute-records.js +17 -0
- package/dist/core/engine/second-instance-detector.d.ts +96 -0
- package/dist/core/engine/second-instance-detector.js +108 -0
- package/dist/core/engine/signals.d.ts +38 -0
- package/dist/core/engine/signals.js +55 -19
- package/dist/core/engine/state-utilities.d.ts +49 -2
- package/dist/core/engine/state-utilities.js +114 -3
- package/dist/core/engine/storage-io.d.ts +16 -2
- package/dist/core/engine/storage-io.js +26 -5
- package/dist/core/engine/stream-chunk-loading.d.ts +2 -0
- package/dist/core/engine/stream-chunk-loading.js +24 -1
- package/dist/core/engine/sub-operation.js +22 -3
- package/dist/core/engine/termination/cleanup.d.ts +28 -1
- package/dist/core/engine/termination/cleanup.js +44 -2
- package/dist/core/engine/termination/complete.js +48 -9
- package/dist/core/engine/termination/finalizer-activity.d.ts +53 -0
- package/dist/core/engine/termination/finalizer-activity.js +30 -0
- package/dist/core/engine/termination/finalizer-claim.d.ts +110 -0
- package/dist/core/engine/termination/finalizer-claim.js +80 -0
- package/dist/core/engine/termination/finalizer.d.ts +48 -0
- package/dist/core/engine/termination/finalizer.js +159 -0
- package/dist/core/engine/termination/suspend.d.ts +70 -0
- package/dist/core/engine/termination/suspend.js +41 -0
- package/dist/core/engine/termination.d.ts +5 -2
- package/dist/core/engine/termination.js +6 -0
- package/dist/core/engine/updates.js +5 -25
- package/dist/core/engine/validation/schedule.d.ts +2 -1
- package/dist/core/engine/validation/schedule.js +51 -2
- package/dist/core/engine/validation.js +54 -3
- package/dist/core/engine/waiting-update-response.d.ts +8 -0
- package/dist/core/engine/waiting-update-response.js +22 -0
- package/dist/core/engine/workflow-concurrency.d.ts +10 -0
- package/dist/core/engine/workflow-concurrency.js +136 -0
- package/dist/core/engine/workflow-feed.d.ts +9 -8
- package/dist/core/engine/workflow-feed.js +4 -1
- package/dist/core/engine/workflow-indexes.d.ts +9 -0
- package/dist/core/engine/workflow-indexes.js +10 -0
- package/dist/core/engine/workflow-state-stream.js +33 -13
- package/dist/core/engine/workflow-visibility-queries.d.ts +2 -2
- package/dist/core/engine-helpers.js +1 -0
- package/dist/core/events/activity-events.d.ts +43 -12
- package/dist/core/events/activity-events.js +28 -0
- package/dist/core/events/attribute-events.d.ts +2 -3
- package/dist/core/events/event-map.d.ts +19 -12
- package/dist/core/events/index.d.ts +1 -0
- package/dist/core/events/index.js +1 -0
- package/dist/core/events/schedule-events.d.ts +71 -0
- package/dist/core/events/schedule-events.js +29 -0
- package/dist/core/events/signal-events.d.ts +4 -6
- package/dist/core/events/system-events.d.ts +29 -19
- package/dist/core/events/system-events.js +26 -0
- package/dist/core/events/update-events.d.ts +6 -8
- package/dist/core/events/workflow-events.d.ts +108 -20
- package/dist/core/events/workflow-events.js +35 -0
- package/dist/core/failure-categories.js +5 -17
- package/dist/core/fault-code.d.ts +9 -3
- package/dist/core/fault-code.js +1 -0
- package/dist/core/inline-execution-strategy.context-options.d.ts +69 -0
- package/dist/core/inline-execution-strategy.context-options.js +56 -0
- package/dist/core/inline-execution-strategy.d.ts +31 -36
- package/dist/core/inline-execution-strategy.js +16 -27
- package/dist/core/list-filter-validation.d.ts +1 -1
- package/dist/core/list-filter-validation.js +2 -1
- package/dist/core/payload-size.d.ts +1 -1
- package/dist/core/persisted-data-incompatible-error.d.ts +9 -7
- package/dist/core/review/events.d.ts +6 -8
- package/dist/core/scheduler/scheduler-class.d.ts +10 -1
- package/dist/core/scheduler/scheduler-class.js +38 -11
- package/dist/core/scheduler/timer-batch.js +9 -1
- package/dist/core/scheduler/timer-sources.d.ts +1 -0
- package/dist/core/scheduler/timer-sources.js +11 -5
- package/dist/core/session-state.d.ts +0 -1
- package/dist/core/session-state.js +2 -2
- package/dist/core/start-workflow-validation.d.ts +56 -0
- package/dist/core/start-workflow-validation.js +30 -1
- package/dist/core/step-context.d.ts +10 -6
- package/dist/core/step-context.js +7 -15
- package/dist/core/types/activity-verification.d.ts +67 -0
- package/dist/core/types/activity-verification.js +0 -0
- package/dist/core/types/activity.d.ts +86 -64
- package/dist/core/types/bulk.d.ts +50 -9
- package/dist/core/types/checkpoint.d.ts +44 -8
- package/dist/core/types/identity.d.ts +8 -1
- package/dist/core/types/launch-metadata.d.ts +33 -0
- package/dist/core/types/launch-metadata.js +0 -0
- package/dist/core/types/list-options.d.ts +146 -0
- package/dist/core/types/list-options.js +0 -0
- package/dist/core/types/message-handles.d.ts +25 -0
- package/dist/core/types/options.d.ts +165 -215
- package/dist/core/types/reviews.d.ts +2 -1
- package/dist/core/types/schedules.d.ts +39 -3
- package/dist/core/types/services-resolution.d.ts +47 -0
- package/dist/core/types/services-resolution.js +0 -0
- package/dist/core/types/state.d.ts +11 -11
- package/dist/core/types/workflow-builder-runtime.d.ts +12 -3
- package/dist/core/types/workflow-builder-runtime.js +11 -2
- package/dist/core/types/workflow-builder.d.ts +47 -15
- package/dist/core/types/workflow-concurrency.d.ts +39 -0
- package/dist/core/types/workflow-concurrency.js +0 -0
- package/dist/core/types/workflow-context.d.ts +157 -14
- package/dist/core/types/workflow-definition.d.ts +53 -10
- package/dist/core/types/workflow-function.d.ts +101 -9
- package/dist/core/types/workflow-log.d.ts +98 -0
- package/dist/core/types/workflow-log.js +0 -0
- package/dist/core/types/workflow-registries.d.ts +14 -3
- package/dist/core/types/workflow-registry.d.ts +3 -0
- package/dist/core/types/workflow-snapshot.d.ts +29 -0
- package/dist/core/types/workflow-snapshot.js +0 -0
- package/dist/core/types.d.ts +7 -0
- package/dist/core/types.js +7 -0
- package/dist/core/versioning.d.ts +9 -39
- package/dist/core/versioning.js +2 -12
- package/dist/core/weft-error.d.ts +44 -1
- package/dist/core/weft-error.js +19 -1
- package/dist/core/worker-execution-strategy-options.d.ts +26 -0
- package/dist/core/worker-execution-strategy.js +40 -36
- package/dist/core/worker-inbound-message.d.ts +38 -0
- package/dist/core/worker-inbound-message.js +37 -0
- package/dist/core/worker-log-abuse-counter.d.ts +175 -0
- package/dist/core/worker-log-abuse-counter.js +107 -0
- package/dist/core/worker-message-helpers.d.ts +47 -0
- package/dist/core/worker-message-helpers.js +26 -0
- package/dist/core/worker-protocol-guard.js +1 -1
- package/dist/core/worker-protocol-log.d.ts +56 -0
- package/dist/core/worker-protocol-log.js +18 -0
- package/dist/core/worker-protocol.d.ts +23 -0
- package/dist/core/worker-protocol.js +12 -2
- package/dist/core/workflow-version-tuple.d.ts +3 -9
- package/dist/core/workflow-version-tuple.js +2 -3
- package/dist/diagnostics/doctor.js +6 -3
- package/dist/diagnostics/format.js +3 -8
- package/dist/diagnostics/types.d.ts +5 -5
- package/dist/diagnostics/validate.d.ts +0 -1
- package/dist/diagnostics/version-check.d.ts +1 -1
- package/dist/diagnostics/version-check.js +10 -13
- package/dist/index.d.ts +13 -11
- package/dist/index.js +39 -4
- package/dist/json-schema.js +3 -3
- package/dist/mcp/cli.js +35 -35
- package/dist/mcp/dispatcher.js +1 -1
- package/dist/mcp/http.js +16 -6
- package/dist/mcp/list-filter.js +2 -1
- package/dist/mcp/protocol.d.ts +2 -0
- package/dist/mcp/protocol.js +1 -1
- package/dist/mcp/session.d.ts +16 -0
- package/dist/mcp/session.js +60 -6
- package/dist/mcp/tools.js +73 -6
- package/dist/observability/index.js +2 -2
- package/dist/server/asyncapi-channels.js +5 -2
- package/dist/server/attribute-filters.d.ts +8 -3
- package/dist/server/attribute-filters.js +6 -1
- package/dist/server/authentication/api-key.d.ts +2 -1
- package/dist/server/authentication/api-key.js +5 -2
- package/dist/server/authentication/constant-time-api-key.d.ts +15 -0
- package/dist/server/authentication/constant-time-api-key.js +24 -0
- package/dist/server/authentication/index.d.ts +1 -1
- package/dist/server/authentication/index.js +7 -4
- package/dist/server/authentication/rotating-api-key-store.d.ts +5 -3
- package/dist/server/authentication/rotating-api-key-store.js +19 -11
- package/dist/server/engine-event-feed-backend.d.ts +4 -5
- package/dist/server/fault-to-http.js +8 -1
- package/dist/server/fault-to-json-rpc.js +1 -0
- package/dist/server/fleet-event-feed.d.ts +31 -0
- package/dist/server/fleet-event-feed.js +157 -0
- package/dist/server/handler/index.js +1 -1
- package/dist/server/handler/response-helpers.js +2 -1
- package/dist/server/handler/route-dispatch.d.ts +6 -3
- package/dist/server/handler/route-dispatch.js +2 -2
- package/dist/server/handler.js +31 -31
- package/dist/server/index.d.ts +32 -2
- package/dist/server/index.js +35 -35
- package/dist/server/interactive-operations.js +1 -0
- package/dist/server/json-rpc-transport-helpers.d.ts +1 -0
- package/dist/server/json-rpc-transport-helpers.js +2 -1
- package/dist/server/json-rpc-websocket-runtime.d.ts +11 -2
- package/dist/server/json-rpc-websocket-runtime.js +1 -0
- package/dist/server/json-rpc-websocket-subscriptions.d.ts +10 -0
- package/dist/server/json-rpc-websocket-subscriptions.js +29 -0
- package/dist/server/json-rpc-websocket-types.d.ts +22 -0
- package/dist/server/json-rpc-websocket-types.js +0 -0
- package/dist/server/json-rpc-websocket-validation.js +20 -4
- package/dist/server/json-rpc-websocket.d.ts +2 -43
- package/dist/server/json-rpc-websocket.js +57 -74
- package/dist/server/openapi.d.ts +2 -1
- package/dist/server/openapi.js +1 -3
- package/dist/server/openrpc-document-schema.d.ts +78 -0
- package/dist/server/openrpc-document-schema.js +27 -1
- package/dist/server/openrpc-errors.d.ts +3 -0
- package/dist/server/openrpc-errors.js +2 -1
- package/dist/server/openrpc.js +32 -0
- package/dist/server/operation-catalog/index.d.ts +1 -1
- package/dist/server/operation-catalog/pipeline-helpers.js +1 -0
- package/dist/server/operation-catalog/pipeline-stages.js +26 -12
- package/dist/server/operation-catalog/pipeline.js +8 -1
- package/dist/server/operation-catalog/registry.js +13 -0
- package/dist/server/operation-catalog/types.d.ts +20 -9
- package/dist/server/operation-fault.d.ts +10 -0
- package/dist/server/operation-fault.js +2 -0
- package/dist/server/operation-registry.d.ts +12 -11
- package/dist/server/operation-registry.js +12 -3
- package/dist/server/operations/aggregate-workflows.d.ts +15 -15
- package/dist/server/operations/async-activity.d.ts +2 -2
- package/dist/server/operations/async-activity.js +12 -7
- package/dist/server/operations/bulk-cancel-workflows.d.ts +1 -1
- package/dist/server/operations/bulk-cancel-workflows.js +2 -2
- package/dist/server/operations/bulk-delete-workflows.d.ts +1 -1
- package/dist/server/operations/bulk-delete-workflows.js +2 -2
- package/dist/server/operations/bulk-filter-helpers.d.ts +8 -6
- package/dist/server/operations/bulk-filter-helpers.js +54 -24
- package/dist/server/operations/bulk-mutate-workflow-tags.d.ts +11 -9
- package/dist/server/operations/bulk-mutate-workflow-tags.js +2 -2
- package/dist/server/operations/bulk-operation-helpers.d.ts +2 -2
- package/dist/server/operations/bulk-retry-failed-workflows.d.ts +7 -0
- package/dist/server/operations/bulk-retry-failed-workflows.js +64 -0
- package/dist/server/operations/bulk-signal-workflows.d.ts +11 -9
- package/dist/server/operations/bulk-signal-workflows.js +2 -2
- package/dist/server/operations/cancel-schedule.d.ts +1 -1
- package/dist/server/operations/create-schedule.d.ts +3 -1
- package/dist/server/operations/create-schedule.js +29 -11
- package/dist/server/operations/fleet-events-subscription.d.ts +54 -0
- package/dist/server/operations/fleet-events-subscription.js +99 -0
- package/dist/server/operations/fork-workflow.d.ts +1 -1
- package/dist/server/operations/fork-workflow.js +3 -2
- package/dist/server/operations/get-checkpoint-at.d.ts +1 -1
- package/dist/server/operations/get-registry.d.ts +1 -1
- package/dist/server/operations/get-retention-overview.d.ts +1 -1
- package/dist/server/operations/get-review.d.ts +1 -1
- package/dist/server/operations/get-schedule.d.ts +1 -1
- package/dist/server/operations/get-stream-chunks.d.ts +1 -1
- package/dist/server/operations/get-system-metrics.d.ts +2 -2
- package/dist/server/operations/get-task-diagnostics.d.ts +45 -6
- package/dist/server/operations/get-task-diagnostics.js +101 -7
- package/dist/server/operations/get-update-result.d.ts +1 -1
- package/dist/server/operations/get-workflow-attributes.d.ts +1 -1
- package/dist/server/operations/get-workflow-events.d.ts +1 -1
- package/dist/server/operations/get-workflow-result.d.ts +1 -1
- package/dist/server/operations/get-workflow-timeline.d.ts +1 -1
- package/dist/server/operations/get-workflow.d.ts +1 -1
- package/dist/server/operations/list-checkpoints.d.ts +1 -1
- package/dist/server/operations/list-reviews.d.ts +1 -1
- package/dist/server/operations/list-schedules.d.ts +1 -1
- package/dist/server/operations/list-task-queues.d.ts +2 -2
- package/dist/server/operations/list-workers.d.ts +2 -2
- package/dist/server/operations/list-workflows.d.ts +1 -1
- package/dist/server/operations/operation-helpers.d.ts +16 -1
- package/dist/server/operations/operation-helpers.js +15 -3
- package/dist/server/operations/pause-schedule.d.ts +1 -1
- package/dist/server/operations/purge-workflows.d.ts +5 -5
- package/dist/server/operations/purge-workflows.js +2 -2
- package/dist/server/operations/query-workflow.d.ts +1 -1
- package/dist/server/operations/query-workflow.js +3 -2
- package/dist/server/operations/recover-all.d.ts +1 -1
- package/dist/server/operations/replay-workflow.d.ts +1 -1
- package/dist/server/operations/resume-schedule.d.ts +1 -1
- package/dist/server/operations/resume-workflow.js +2 -2
- package/dist/server/operations/set-workflow-attributes.d.ts +1 -1
- package/dist/server/operations/set-workflow-attributes.js +6 -3
- package/dist/server/operations/signal-workflow.js +8 -3
- package/dist/server/operations/single-workflow-tag-mutation.js +13 -3
- package/dist/server/operations/start-or-signal-workflow.d.ts +44 -0
- package/dist/server/operations/start-or-signal-workflow.js +130 -0
- package/dist/server/operations/start-workflow-options.d.ts +38 -0
- package/dist/server/operations/start-workflow-options.js +63 -0
- package/dist/server/operations/start-workflow-rest-input.d.ts +14 -0
- package/dist/server/operations/start-workflow-rest-input.js +31 -0
- package/dist/server/operations/start-workflow.d.ts +1 -1
- package/dist/server/operations/start-workflow.js +15 -92
- package/dist/server/operations/storage.d.ts +6 -6
- package/dist/server/operations/storage.js +24 -14
- package/dist/server/operations/stream-workflow-sse.d.ts +1 -1
- package/dist/server/operations/submit-review-decision.d.ts +1 -1
- package/dist/server/operations/submit-review-decision.js +6 -3
- package/dist/server/operations/suspend-workflow.d.ts +13 -0
- package/dist/server/operations/suspend-workflow.js +36 -0
- package/dist/server/operations/update-schedule.d.ts +1 -1
- package/dist/server/operations/update-schedule.js +7 -4
- package/dist/server/operations/update-workflow.d.ts +1 -1
- package/dist/server/operations/update-workflow.js +7 -3
- package/dist/server/operations/worker-drain.d.ts +8 -8
- package/dist/server/operations/worker-drain.js +11 -8
- package/dist/server/operations/workflow-events-subscription.d.ts +7 -8
- package/dist/server/operations/workflow-events-subscription.js +43 -8
- package/dist/server/rest-binding.d.ts +21 -8
- package/dist/server/rest-bindings.js +24 -0
- package/dist/server/rest-body.d.ts +10 -0
- package/dist/server/rest-body.js +80 -0
- package/dist/server/runtime/authentication-bridge.d.ts +1 -0
- package/dist/server/runtime/authentication-bridge.js +33 -6
- package/dist/server/runtime/client-visible-events.d.ts +3 -0
- package/dist/server/runtime/client-visible-events.js +65 -0
- package/dist/server/runtime/context.d.ts +7 -0
- package/dist/server/runtime/event-broadcasting.d.ts +6 -0
- package/dist/server/runtime/event-broadcasting.js +72 -38
- package/dist/server/runtime/retry.d.ts +1 -0
- package/dist/server/runtime/retry.js +14 -0
- package/dist/server/runtime/shutdown.d.ts +7 -6
- package/dist/server/runtime/shutdown.js +6 -1
- package/dist/server/runtime/task-dispatch.js +5 -3
- package/dist/server/runtime/task-polling.d.ts +16 -2
- package/dist/server/runtime/task-polling.js +80 -24
- package/dist/server/runtime/task-reconciliation.js +9 -1
- package/dist/server/runtime/task-result-resolution.d.ts +15 -0
- package/dist/server/runtime/task-result-resolution.js +81 -0
- package/dist/server/runtime/websocket-stream.d.ts +20 -1
- package/dist/server/runtime/websocket-stream.js +173 -7
- package/dist/server/runtime/websocket-upgrade.js +22 -3
- package/dist/server/runtime/websocket-worker.d.ts +1 -1
- package/dist/server/runtime/websocket-worker.js +46 -30
- package/dist/server/serve-internals.d.ts +11 -1
- package/dist/server/serve-internals.js +20 -2
- package/dist/server/task-state.d.ts +38 -0
- package/dist/server/task-state.js +28 -0
- package/dist/server/workflow-event-feed.d.ts +36 -115
- package/dist/server/workflow-event-feed.js +92 -27
- package/dist/service-worker/index.js +31 -31
- package/dist/storage/auto.js +1 -1
- package/dist/storage/bun-sql.js +24 -0
- package/dist/storage/capabilities.d.ts +10 -2
- package/dist/storage/capabilities.js +2 -2
- package/dist/storage/compressed-storage.js +1 -1
- package/dist/storage/default-scope.d.ts +7 -4
- package/dist/storage/http.js +2 -2
- package/dist/storage/index.d.ts +81 -4
- package/dist/storage/indexeddb.js +1 -1
- package/dist/storage/interface.d.ts +189 -0
- package/dist/storage/interface.js +1 -1
- package/dist/storage/key-prefixes.d.ts +1 -1
- package/dist/storage/key-prefixes.js +12 -0
- package/dist/storage/lmdb.d.ts +4 -3
- package/dist/storage/lmdb.js +1 -1
- package/dist/storage/memory.js +1 -1
- package/dist/storage/neon-batch.d.ts +30 -0
- package/dist/storage/neon-batch.js +30 -0
- package/dist/storage/neon-value-mapping.d.ts +74 -0
- package/dist/storage/neon-value-mapping.js +23 -0
- package/dist/storage/neon.d.ts +124 -0
- package/dist/storage/neon.js +15 -0
- package/dist/storage/node-sqlite-loader.d.ts +71 -0
- package/dist/storage/node-sqlite-loader.js +41 -0
- package/dist/storage/node-sqlite.d.ts +1 -19
- package/dist/storage/node-sqlite.js +61 -32
- package/dist/storage/postgres-key-value-queries.d.ts +104 -0
- package/dist/storage/postgres-key-value-queries.js +101 -0
- package/dist/storage/resolve.d.ts +2 -165
- package/dist/storage/resolve.js +1 -1
- package/dist/storage/scoped-storage.js +1 -1
- package/dist/storage/storage-configuration.d.ts +209 -0
- package/dist/storage/storage-configuration.js +0 -0
- package/dist/storage/testing.d.ts +168 -0
- package/dist/storage/testing.js +2 -0
- package/dist/storage/text-value-store.d.ts +9 -9
- package/dist/storage/turso.d.ts +8 -0
- package/dist/storage/turso.js +2 -2
- package/dist/storage/typed-storage.js +1 -1
- package/dist/storage/web-extension.js +1 -1
- package/dist/testing/index.js +35 -35
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/dist/worker/index.js +9 -5
- package/dist/worker/long-poll.js +4 -0
- package/dist/worker/protocol-messages.d.ts +20 -0
- package/dist/worker/protocol-schemas.d.ts +32 -0
- package/dist/worker/protocol-schemas.js +8 -4
- package/dist/worker/protocol-task-result.d.ts +28 -0
- package/dist/worker/protocol-task-result.js +76 -0
- package/dist/worker/protocol.d.ts +4 -15
- package/dist/worker/protocol.js +1 -1
- package/dist/worker/registry/fair-share.d.ts +29 -0
- package/dist/worker/registry/fair-share.js +30 -0
- package/dist/worker/registry/routing.d.ts +18 -0
- package/dist/worker/registry/routing.js +14 -0
- package/dist/worker/registry/types.d.ts +7 -0
- package/dist/worker/registry.d.ts +16 -1
- package/dist/worker/registry.js +24 -36
- package/dist/workers/worker-replay-state.d.ts +32 -0
- package/dist/workers/worker-replay-state.js +35 -0
- package/dist/workers/worker-state-namespace.d.ts +21 -0
- package/dist/workers/worker-state-namespace.js +13 -0
- package/dist/workers/workflow-runner.d.ts +19 -15
- package/dist/workers/workflow-runner.js +72 -60
- package/dist/workers/workflow-worker-entry.js +5 -2
- package/package.json +21 -4
|
@@ -1,62 +1,9 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `WorkflowEventFeed` — transport-neutral event replay + live-tail
|
|
3
|
-
* contract shared by REST SSE, WebSocket watch/stream, and JSON-RPC
|
|
4
|
-
* subscribe. Track 8 design decision 5 and 6.
|
|
5
|
-
*
|
|
6
|
-
* **Atomic handoff ordering** (the only sequence that avoids both
|
|
7
|
-
* duplicates and gaps when a subscriber joins mid-stream):
|
|
8
|
-
*
|
|
9
|
-
* 1. Register a live listener into a bounded in-memory buffer.
|
|
10
|
-
* From this moment, every newly-emitted event is captured.
|
|
11
|
-
* 2. Snapshot the current live-tail sequence `S` (read once).
|
|
12
|
-
* 3. Stream storage replay from `fromCursor` up to and including `S`.
|
|
13
|
-
* 4. Drain the buffer, dropping any envelope with `sequence <= S`
|
|
14
|
-
* (already replayed) and emitting the rest.
|
|
15
|
-
* 5. Continue emitting live envelopes directly as the listener fires.
|
|
16
|
-
*
|
|
17
|
-
* Buffer bound is configurable (default 1000 envelopes per subscription).
|
|
18
|
-
* Overflow closes the subscription with a `SubscriptionOverflow` signal
|
|
19
|
-
* (the iterable terminates; the caller reopens with its last delivered
|
|
20
|
-
* cursor). Unbounded-memory-growth is not an option here.
|
|
21
|
-
*
|
|
22
|
-
* **Cursor is opaque.** `encodeCursor(sequence)` and
|
|
23
|
-
* `decodeCursor(cursor)` are the only code that knows the representation
|
|
24
|
-
* — REST `Last-Event-ID`, WS `?resumeFrom=`, and JSON-RPC `fromCursor`
|
|
25
|
-
* all round-trip through this module.
|
|
26
|
-
*/
|
|
27
1
|
import type { WeftEventMap } from '../core/events.ts';
|
|
28
|
-
/**
|
|
29
|
-
* Discriminator string carried on every envelope. The union covers:
|
|
30
|
-
*
|
|
31
|
-
* - Dispatched `WeftEventMap` event names (`workflow:started`,
|
|
32
|
-
* `activity:completed`, `stream:token`, …) — emitted when a
|
|
33
|
-
* future log entry type corresponds to a runtime `Event`.
|
|
34
|
-
* - Durable log entry types not in `WeftEventMap`
|
|
35
|
-
* (`workflow:checkpoint` — the only one today; add others here
|
|
36
|
-
* as new log kinds land).
|
|
37
|
-
* - Selector-scoped synthetic kinds (`stream:chunk`) for records
|
|
38
|
-
* that are not dispatched `Event` objects at all.
|
|
39
|
-
* - An open `(string & {})` tail so third-party event kinds don't
|
|
40
|
-
* fail typechecking at the envelope construction site while
|
|
41
|
-
* IntelliSense still suggests the known literals.
|
|
42
|
-
*
|
|
43
|
-
* Cross-transport consumers match on `selector` first, then on
|
|
44
|
-
* `kind` within that selector. This union is extensible and preserves
|
|
45
|
-
* completion for known kinds, but the open-string tail means it does
|
|
46
|
-
* not by itself reject arbitrary or misspelled string literals.
|
|
47
|
-
*/
|
|
2
|
+
/** Discriminator string carried on every feed envelope. */
|
|
48
3
|
export type FeedEventKind = keyof WeftEventMap | 'workflow:checkpoint' | 'stream:chunk' | (string & {});
|
|
49
4
|
/** Opaque cursor. Only `encodeCursor` / `decodeCursor` know the format. */
|
|
50
5
|
export type Cursor = string;
|
|
51
|
-
/**
|
|
52
|
-
* Encode a non-negative integer sequence as an opaque cursor. The
|
|
53
|
-
* current encoding is the decimal string form of the sequence, matching
|
|
54
|
-
* the existing `sequence-cursor.ts` public representation so REST
|
|
55
|
-
* `Last-Event-ID` / `?after=` clients continue to work unchanged. The
|
|
56
|
-
* encoding is intentionally not part of the public API — a future
|
|
57
|
-
* migration to base64 / hex / compact binary can happen without
|
|
58
|
-
* breaking anything that goes through this module.
|
|
59
|
-
*/
|
|
6
|
+
/** Encode a non-negative integer sequence as an opaque cursor. */
|
|
60
7
|
export declare function encodeCursor(sequence: number): Cursor;
|
|
61
8
|
/**
|
|
62
9
|
* Decode an opaque cursor back to its sequence. `-1` is the initial
|
|
@@ -64,12 +11,6 @@ export declare function encodeCursor(sequence: number): Cursor;
|
|
|
64
11
|
*/
|
|
65
12
|
export declare function decodeCursor(cursor: Cursor): number | null;
|
|
66
13
|
export type EventSelector = 'events' | 'tokens';
|
|
67
|
-
/**
|
|
68
|
-
* Unified event envelope delivered by the feed. Transports serialize
|
|
69
|
-
* this directly (REST SSE `data:` line, WS JSON frame, JSON-RPC
|
|
70
|
-
* `weft.events.deliver` params). `kind` narrows `payload` shape in
|
|
71
|
-
* caller code via discriminated-union typing.
|
|
72
|
-
*/
|
|
73
14
|
export type EventEnvelope = {
|
|
74
15
|
readonly kind: FeedEventKind;
|
|
75
16
|
readonly workflowId: string;
|
|
@@ -79,88 +20,68 @@ export type EventEnvelope = {
|
|
|
79
20
|
readonly emittedAtMs: number;
|
|
80
21
|
readonly payload: unknown;
|
|
81
22
|
};
|
|
82
|
-
/**
|
|
83
|
-
* Pluggable storage + live-event source. The in-memory implementation
|
|
84
|
-
* is used by unit tests; the production implementation wraps
|
|
85
|
-
* `engine.storage` event scans + `EngineEventTarget` subscription.
|
|
86
|
-
*/
|
|
87
23
|
export type WorkflowEventFeedBackend = {
|
|
88
|
-
/**
|
|
89
|
-
* Yield persisted envelopes with `sequence > afterSequence` in
|
|
90
|
-
* sequence order. `afterSequence: -1` means "from the beginning."
|
|
91
|
-
*/
|
|
92
24
|
replay(options: {
|
|
93
25
|
workflowId: string;
|
|
94
26
|
selector: EventSelector;
|
|
95
27
|
afterSequence: number;
|
|
96
28
|
}): AsyncIterable<EventEnvelope>;
|
|
97
|
-
/**
|
|
98
|
-
* Snapshot the current tail sequence for a workflow. Used in the
|
|
99
|
-
* atomic-handoff sequence to bound the replay scan. Returns -1 if
|
|
100
|
-
* no events have been emitted yet.
|
|
101
|
-
*/
|
|
102
29
|
snapshotTailSequence(workflowId: string, selector: EventSelector): Promise<number>;
|
|
103
|
-
/**
|
|
104
|
-
* Register a live listener. Returns an unsubscribe function.
|
|
105
|
-
*
|
|
106
|
-
* Contract:
|
|
107
|
-
* - Envelopes MUST be delivered in monotonically increasing
|
|
108
|
-
* sequence order. The feed's live-buffer drain relies on this
|
|
109
|
-
* for its dedupe logic — an out-of-order emission would cause
|
|
110
|
-
* the feed to advance `lastDelivered` past a later-arriving
|
|
111
|
-
* lower-sequence event and silently drop it.
|
|
112
|
-
* - The listener SHOULD be invoked synchronously from the
|
|
113
|
-
* event-emitter context. Backends that defer to a microtask
|
|
114
|
-
* (or later) still work correctly because the feed's listener
|
|
115
|
-
* buffers envelopes off the fast path, but synchronous delivery
|
|
116
|
-
* minimizes handoff latency.
|
|
117
|
-
* - Listener exceptions MUST NOT propagate to the backend's
|
|
118
|
-
* event-emitter; the in-memory implementation wraps each
|
|
119
|
-
* invocation in try/catch. Production backends should match.
|
|
120
|
-
*/
|
|
121
30
|
subscribeLive(workflowId: string, selector: EventSelector, listener: (envelope: EventEnvelope) => void): () => void;
|
|
122
31
|
};
|
|
123
32
|
export type WorkflowEventFeed = {
|
|
124
|
-
/**
|
|
125
|
-
* Replay stored events only. No live subscription. Yields every
|
|
126
|
-
* envelope with `sequence > decodeCursor(fromCursor)` up to an
|
|
127
|
-
* optional `limit`, in sequence order, then completes.
|
|
128
|
-
*/
|
|
129
33
|
replay(options: {
|
|
130
34
|
workflowId: string;
|
|
131
35
|
selector: EventSelector;
|
|
132
36
|
fromCursor?: Cursor;
|
|
133
37
|
limit?: number;
|
|
134
38
|
}): AsyncIterable<EventEnvelope>;
|
|
135
|
-
/**
|
|
136
|
-
* Replay + live-tail. Implements the atomic-handoff sequence so a
|
|
137
|
-
* subscriber joining mid-stream sees every event exactly once.
|
|
138
|
-
* Caller controls termination via `signal.abort()` or by exiting
|
|
139
|
-
* the `for await` loop (the feed cleans up the live listener).
|
|
140
|
-
*/
|
|
141
39
|
subscribe(options: {
|
|
142
40
|
workflowId: string;
|
|
143
41
|
selector: EventSelector;
|
|
144
|
-
|
|
145
|
-
signal?: AbortSignal;
|
|
146
|
-
}): AsyncIterable<EventEnvelope>;
|
|
147
|
-
/** Tear down any feed-level resources (no-op for the in-memory path). */
|
|
42
|
+
} & ReplayLiveSubscribeOptions<EventEnvelope>): AsyncIterable<EventEnvelope>;
|
|
148
43
|
dispose(): void;
|
|
149
44
|
};
|
|
150
45
|
export type WorkflowEventFeedOptions = {
|
|
151
46
|
/** Max envelopes the live buffer holds before overflow terminates the subscription. */
|
|
152
47
|
liveBufferSize?: number;
|
|
153
48
|
};
|
|
49
|
+
export type SequencedEventEnvelope = {
|
|
50
|
+
readonly sequence: number;
|
|
51
|
+
readonly cursor: Cursor;
|
|
52
|
+
};
|
|
53
|
+
export type ReplayLiveFeedBackend<TEnvelope extends SequencedEventEnvelope> = {
|
|
54
|
+
replay(options: {
|
|
55
|
+
afterSequence: number;
|
|
56
|
+
}): AsyncIterable<TEnvelope>;
|
|
57
|
+
snapshotTailSequence(): Promise<number>;
|
|
58
|
+
subscribeLive(listener: (envelope: TEnvelope) => void): () => void;
|
|
59
|
+
};
|
|
60
|
+
export type ReplayLiveFeed<TEnvelope extends SequencedEventEnvelope> = {
|
|
61
|
+
replay(options?: {
|
|
62
|
+
fromCursor?: Cursor;
|
|
63
|
+
limit?: number;
|
|
64
|
+
}): AsyncIterable<TEnvelope>;
|
|
65
|
+
subscribe(options?: ReplayLiveSubscribeOptions<TEnvelope>): AsyncIterable<TEnvelope>;
|
|
66
|
+
dispose(): void;
|
|
67
|
+
};
|
|
68
|
+
export type ReplayLiveSubscribeOptions<TEnvelope extends SequencedEventEnvelope> = {
|
|
69
|
+
fromCursor?: Cursor;
|
|
70
|
+
signal?: AbortSignal;
|
|
71
|
+
replayLimit?: number;
|
|
72
|
+
filterEnvelope?: (envelope: TEnvelope) => boolean;
|
|
73
|
+
countReplayEnvelope?: (envelope: TEnvelope) => boolean;
|
|
74
|
+
createReplayLimitError?: (count: number, limit: number) => unknown;
|
|
75
|
+
};
|
|
76
|
+
export declare class ReplayWindowExceededError extends Error {
|
|
77
|
+
readonly count: number;
|
|
78
|
+
readonly limit: number;
|
|
79
|
+
constructor(count: number, limit: number);
|
|
80
|
+
}
|
|
81
|
+
export declare function createReplayLiveFeed<TEnvelope extends SequencedEventEnvelope>(backend: ReplayLiveFeedBackend<TEnvelope>, options?: WorkflowEventFeedOptions): ReplayLiveFeed<TEnvelope>;
|
|
154
82
|
export declare function createWorkflowEventFeed(backend: WorkflowEventFeedBackend, options?: WorkflowEventFeedOptions): WorkflowEventFeed;
|
|
155
83
|
export type InMemoryEventBackend = WorkflowEventFeedBackend & {
|
|
156
|
-
/** Append an envelope to storage (used by tests). */
|
|
157
84
|
append(envelope: EventEnvelope): Promise<void>;
|
|
158
|
-
/**
|
|
159
|
-
* Emit a live event to any active listener WITHOUT persisting it
|
|
160
|
-
* to storage. Used by tests to simulate the race between storage
|
|
161
|
-
* writes and live dispatch. Production backends emit and persist in
|
|
162
|
-
* one step.
|
|
163
|
-
*/
|
|
164
85
|
emitLive(envelope: EventEnvelope): Promise<void>;
|
|
165
86
|
};
|
|
166
87
|
export declare function createInMemoryEventBackend(): InMemoryEventBackend;
|
|
@@ -12,18 +12,31 @@ export function decodeCursor(cursor) {
|
|
|
12
12
|
return null;
|
|
13
13
|
return value;
|
|
14
14
|
}
|
|
15
|
+
function decodeCursorOrThrow(cursor) {
|
|
16
|
+
const sequence = decodeCursor(cursor);
|
|
17
|
+
if (sequence === null)
|
|
18
|
+
throw Error("Invalid cursor");
|
|
19
|
+
return sequence;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class ReplayWindowExceededError extends Error {
|
|
23
|
+
count;
|
|
24
|
+
limit;
|
|
25
|
+
constructor(count, limit) {
|
|
26
|
+
super(`Replay window is ${count} events; maximum is ${limit}.`);
|
|
27
|
+
this.count = count;
|
|
28
|
+
this.limit = limit;
|
|
29
|
+
this.name = "ReplayWindowExceededError";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
15
32
|
const DEFAULT_LIVE_BUFFER_SIZE = 1000;
|
|
16
|
-
export function
|
|
33
|
+
export function createReplayLiveFeed(backend, options) {
|
|
17
34
|
const bufferSize = options?.liveBufferSize ?? DEFAULT_LIVE_BUFFER_SIZE;
|
|
18
35
|
async function* replay(args) {
|
|
19
|
-
const afterSequence = args
|
|
36
|
+
const afterSequence = args?.fromCursor !== void 0 ? decodeCursorOrThrow(args.fromCursor) : -1;
|
|
20
37
|
let yielded = 0;
|
|
21
|
-
for await (const envelope of backend.replay({
|
|
22
|
-
|
|
23
|
-
selector: args.selector,
|
|
24
|
-
afterSequence
|
|
25
|
-
})) {
|
|
26
|
-
if (args.limit !== void 0 && yielded >= args.limit)
|
|
38
|
+
for await (const envelope of backend.replay({ afterSequence })) {
|
|
39
|
+
if (args?.limit !== void 0 && yielded >= args.limit)
|
|
27
40
|
return;
|
|
28
41
|
yield envelope;
|
|
29
42
|
yielded += 1;
|
|
@@ -32,7 +45,9 @@ export function createWorkflowEventFeed(backend, options) {
|
|
|
32
45
|
function subscribe(args) {
|
|
33
46
|
const buffer = [];
|
|
34
47
|
let bufferOverflowed = !1, waker = null;
|
|
35
|
-
const
|
|
48
|
+
const signal = args?.signal, fromCursor = args?.fromCursor, requestedAfter = fromCursor !== void 0 ? decodeCursorOrThrow(fromCursor) : -1, unsubscribe = backend.subscribeLive((envelope) => {
|
|
49
|
+
if (!shouldDeliverEnvelope(envelope, args))
|
|
50
|
+
return;
|
|
36
51
|
if (buffer.length >= bufferSize)
|
|
37
52
|
bufferOverflowed = !0;
|
|
38
53
|
else
|
|
@@ -49,22 +64,20 @@ export function createWorkflowEventFeed(backend, options) {
|
|
|
49
64
|
fire();
|
|
50
65
|
}
|
|
51
66
|
};
|
|
52
|
-
|
|
67
|
+
signal?.addEventListener("abort", onAbort);
|
|
53
68
|
async function* generator() {
|
|
54
69
|
try {
|
|
55
|
-
if (
|
|
70
|
+
if (signal?.aborted)
|
|
71
|
+
return;
|
|
72
|
+
const snapshot = await backend.snapshotTailSequence();
|
|
73
|
+
yield* replayUpTo(backend, requestedAfter, snapshot, signal, args);
|
|
74
|
+
if (signal?.aborted)
|
|
56
75
|
return;
|
|
57
|
-
|
|
58
|
-
if (snapshot > requestedAfter) {
|
|
59
|
-
yield* replayUpTo(backend, args, requestedAfter, snapshot);
|
|
60
|
-
if (args.signal?.aborted)
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
yield* drainLive(buffer, snapshot, args.signal, () => bufferOverflowed, (w) => {
|
|
76
|
+
yield* drainLive(buffer, snapshot, signal, () => bufferOverflowed, (w) => {
|
|
64
77
|
waker = w;
|
|
65
78
|
});
|
|
66
79
|
} finally {
|
|
67
|
-
|
|
80
|
+
signal?.removeEventListener("abort", onAbort);
|
|
68
81
|
unsubscribe();
|
|
69
82
|
}
|
|
70
83
|
}
|
|
@@ -76,19 +89,71 @@ export function createWorkflowEventFeed(backend, options) {
|
|
|
76
89
|
dispose() {}
|
|
77
90
|
};
|
|
78
91
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
92
|
+
export function createWorkflowEventFeed(backend, options) {
|
|
93
|
+
function createScopedFeed(workflowId, selector) {
|
|
94
|
+
return createReplayLiveFeed({
|
|
95
|
+
replay: ({ afterSequence }) => backend.replay({ workflowId, selector, afterSequence }),
|
|
96
|
+
snapshotTailSequence: () => backend.snapshotTailSequence(workflowId, selector),
|
|
97
|
+
subscribeLive: (listener) => backend.subscribeLive(workflowId, selector, listener)
|
|
98
|
+
}, options);
|
|
99
|
+
}
|
|
100
|
+
async function* replay(args) {
|
|
101
|
+
const replayOptions = {};
|
|
102
|
+
if (args.fromCursor !== void 0)
|
|
103
|
+
replayOptions.fromCursor = args.fromCursor;
|
|
104
|
+
if (args.limit !== void 0)
|
|
105
|
+
replayOptions.limit = args.limit;
|
|
106
|
+
yield* createScopedFeed(args.workflowId, args.selector).replay(replayOptions);
|
|
107
|
+
}
|
|
108
|
+
function subscribe(args) {
|
|
109
|
+
const subscribeOptions = {};
|
|
110
|
+
if (args.fromCursor !== void 0)
|
|
111
|
+
subscribeOptions.fromCursor = args.fromCursor;
|
|
112
|
+
if (args.signal !== void 0)
|
|
113
|
+
subscribeOptions.signal = args.signal;
|
|
114
|
+
if (args.replayLimit !== void 0)
|
|
115
|
+
subscribeOptions.replayLimit = args.replayLimit;
|
|
116
|
+
if (args.filterEnvelope !== void 0)
|
|
117
|
+
subscribeOptions.filterEnvelope = args.filterEnvelope;
|
|
118
|
+
if (args.countReplayEnvelope !== void 0)
|
|
119
|
+
subscribeOptions.countReplayEnvelope = args.countReplayEnvelope;
|
|
120
|
+
if (args.createReplayLimitError !== void 0)
|
|
121
|
+
subscribeOptions.createReplayLimitError = args.createReplayLimitError;
|
|
122
|
+
return createScopedFeed(args.workflowId, args.selector).subscribe(subscribeOptions);
|
|
123
|
+
}
|
|
124
|
+
return {
|
|
125
|
+
replay,
|
|
126
|
+
subscribe,
|
|
127
|
+
dispose() {}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
async function* replayUpTo(backend, afterSequence, snapshot, signal, replayOptions) {
|
|
131
|
+
let replayCount = 0;
|
|
132
|
+
for await (const envelope of backend.replay({ afterSequence })) {
|
|
85
133
|
if (envelope.sequence > snapshot)
|
|
86
134
|
break;
|
|
87
|
-
if (
|
|
135
|
+
if (signal?.aborted)
|
|
88
136
|
return;
|
|
137
|
+
if (!shouldDeliverEnvelope(envelope, replayOptions))
|
|
138
|
+
continue;
|
|
139
|
+
if (shouldCountReplayEnvelope(envelope, replayOptions)) {
|
|
140
|
+
replayCount += 1;
|
|
141
|
+
const replayLimit = replayOptions?.replayLimit;
|
|
142
|
+
if (replayLimit !== void 0 && replayCount > replayLimit)
|
|
143
|
+
throw createReplayLimitError(replayOptions, replayCount, replayLimit);
|
|
144
|
+
}
|
|
89
145
|
yield envelope;
|
|
90
146
|
}
|
|
91
147
|
}
|
|
148
|
+
function shouldDeliverEnvelope(envelope, replayOptions) {
|
|
149
|
+
return replayOptions?.filterEnvelope?.(envelope) ?? !0;
|
|
150
|
+
}
|
|
151
|
+
function shouldCountReplayEnvelope(envelope, replayOptions) {
|
|
152
|
+
return replayOptions?.countReplayEnvelope?.(envelope) ?? !0;
|
|
153
|
+
}
|
|
154
|
+
function createReplayLimitError(replayOptions, count, limit) {
|
|
155
|
+
return replayOptions?.createReplayLimitError?.(count, limit) ?? new ReplayWindowExceededError(count, limit);
|
|
156
|
+
}
|
|
92
157
|
function flushPendingBuffer(buffer, watermark) {
|
|
93
158
|
const batch = [];
|
|
94
159
|
let newWatermark = watermark, head = buffer.shift();
|
|
@@ -115,7 +180,7 @@ async function* drainLive(buffer, snapshot, signal, overflowed, installWaker) {
|
|
|
115
180
|
let watermark = snapshot;
|
|
116
181
|
while (!0) {
|
|
117
182
|
if (signal?.aborted || overflowed())
|
|
118
|
-
|
|
183
|
+
break;
|
|
119
184
|
const { batch, newWatermark } = flushPendingBuffer(buffer, watermark);
|
|
120
185
|
watermark = newWatermark;
|
|
121
186
|
for (const envelope of batch) {
|