@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
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export function createInlineContextOptions(dependencies, registration, parameters, workflowAbort) {
|
|
2
|
+
return {
|
|
3
|
+
workflowId: parameters.workflowId,
|
|
4
|
+
workflowType: parameters.workflowType,
|
|
5
|
+
startedAt: parameters.startedAt ?? dependencies.getNow(),
|
|
6
|
+
abortController: workflowAbort,
|
|
7
|
+
getNow: dependencies.getNow,
|
|
8
|
+
nestingDepth: parameters.nestingDepth ?? 0,
|
|
9
|
+
executionStateOwnerId: parameters.executionStateOwnerId ?? parameters.workflowId,
|
|
10
|
+
...parameters.sleepReferenceTime !== void 0 && {
|
|
11
|
+
sleepReferenceTime: parameters.sleepReferenceTime
|
|
12
|
+
},
|
|
13
|
+
...dependencies.resolveWorkflowType !== void 0 && {
|
|
14
|
+
resolveWorkflowType: dependencies.resolveWorkflowType
|
|
15
|
+
},
|
|
16
|
+
...registration.searchAttributes && {
|
|
17
|
+
searchAttributeSchema: registration.searchAttributes
|
|
18
|
+
},
|
|
19
|
+
...parameters.deadline !== void 0 && { deadline: parameters.deadline },
|
|
20
|
+
...resolveWorkflowScopedCallbackOptions(dependencies, parameters.workflowId),
|
|
21
|
+
services: dependencies.getWorkflowServices?.(parameters.workflowId),
|
|
22
|
+
...resolveLogSinkOption(dependencies)
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function resolveWorkflowScopedCallbackOptions(dependencies, workflowId) {
|
|
26
|
+
const { registerCancelHandler, recordFinalizerState } = dependencies;
|
|
27
|
+
return {
|
|
28
|
+
...registerCancelHandler !== void 0 && {
|
|
29
|
+
registerCancelHandler: (handler) => registerCancelHandler(workflowId, handler)
|
|
30
|
+
},
|
|
31
|
+
...recordFinalizerState !== void 0 && {
|
|
32
|
+
recordFinalizerState: (value) => recordFinalizerState(workflowId, value)
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
function resolveLogSinkOption(dependencies) {
|
|
37
|
+
const logSink = dependencies.getLogSink?.();
|
|
38
|
+
return logSink === void 0 ? {} : { logSink };
|
|
39
|
+
}
|
|
40
|
+
export function optionalInlineDependencies(candidates) {
|
|
41
|
+
return {
|
|
42
|
+
...candidates.getComposedWorkflowInterceptor !== void 0 && {
|
|
43
|
+
getComposedWorkflowInterceptor: candidates.getComposedWorkflowInterceptor
|
|
44
|
+
},
|
|
45
|
+
...candidates.registerCancelHandler !== void 0 && {
|
|
46
|
+
registerCancelHandler: candidates.registerCancelHandler
|
|
47
|
+
},
|
|
48
|
+
...candidates.recordFinalizerState !== void 0 && {
|
|
49
|
+
recordFinalizerState: candidates.recordFinalizerState
|
|
50
|
+
},
|
|
51
|
+
...candidates.getWorkflowServices !== void 0 && {
|
|
52
|
+
getWorkflowServices: candidates.getWorkflowServices
|
|
53
|
+
},
|
|
54
|
+
...candidates.getLogSink !== void 0 && { getLogSink: candidates.getLogSink }
|
|
55
|
+
};
|
|
56
|
+
}
|
|
@@ -11,38 +11,8 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { Context } from './context.ts';
|
|
13
13
|
import type { ExecutionStrategy } from './execution-strategy.ts';
|
|
14
|
-
import type {
|
|
15
|
-
import type { FailureCategory, OperationOutcome,
|
|
16
|
-
export interface InlineExecutionDependencies {
|
|
17
|
-
getRegistration: (workflowType: string) => {
|
|
18
|
-
handler: WorkflowFunction;
|
|
19
|
-
version: string;
|
|
20
|
-
searchAttributes?: SearchAttributeSchema;
|
|
21
|
-
} | undefined;
|
|
22
|
-
getNow: () => number;
|
|
23
|
-
resolveWorkflowType?: (target: string | Function) => string;
|
|
24
|
-
maxNestingDepth: number;
|
|
25
|
-
development?: boolean;
|
|
26
|
-
getComposedWorkflowInterceptor?: () => ComposedWorkflowInterceptor | null;
|
|
27
|
-
registerCancelHandler?: (workflowId: string, handler: () => Promise<void> | void) => () => void;
|
|
28
|
-
/**
|
|
29
|
-
* Look up the non-serialized per-run `services` value for a workflow, exposed
|
|
30
|
-
* to the body as `ctx.services`. Returns `undefined` when none was supplied.
|
|
31
|
-
*/
|
|
32
|
-
getWorkflowServices?: (workflowId: string) => unknown;
|
|
33
|
-
}
|
|
34
|
-
type InlineStartWorkflowParameters = {
|
|
35
|
-
workflowId: string;
|
|
36
|
-
workflowType: string;
|
|
37
|
-
input: unknown;
|
|
38
|
-
checkpoint: ArrayBuffer | Uint8Array;
|
|
39
|
-
nestingDepth?: number;
|
|
40
|
-
executionStateOwnerId?: string;
|
|
41
|
-
startedAt?: number;
|
|
42
|
-
sleepReferenceTime?: number;
|
|
43
|
-
deadline?: number;
|
|
44
|
-
headers?: [string, string][];
|
|
45
|
-
};
|
|
14
|
+
import type { InlineExecutionDependencies, InlineStartWorkflowParameters } from './inline-execution-strategy.context-options.ts';
|
|
15
|
+
import type { FailureCategory, OperationOutcome, WorkerOutboundMessage } from './types.ts';
|
|
46
16
|
export declare class InlineExecutionStrategy implements ExecutionStrategy {
|
|
47
17
|
#private;
|
|
48
18
|
constructor(dependencies: InlineExecutionDependencies);
|
|
@@ -54,8 +24,33 @@ export declare class InlineExecutionStrategy implements ExecutionStrategy {
|
|
|
54
24
|
operationResult: OperationOutcome;
|
|
55
25
|
}): void;
|
|
56
26
|
cancelWorkflow(workflowId: string): void;
|
|
57
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Evict a workflow's in-memory execution state (generator, abort controller,
|
|
29
|
+
* live context, tracked turns/advances).
|
|
30
|
+
*
|
|
31
|
+
* By default this is a hard eviction: nothing about the run stays reachable —
|
|
32
|
+
* which is what the suspend/general teardown path requires. The inline
|
|
33
|
+
* `waitForSignal` parking optimization opts into `retainContext: true` so the
|
|
34
|
+
* run's Context survives in `#parkedContexts` and its `ctx.onQuery` handlers
|
|
35
|
+
* stay callable while the run is parked. Retention is therefore strictly
|
|
36
|
+
* opt-in at the one call site that wants it; every other caller gets eviction.
|
|
37
|
+
*/
|
|
38
|
+
parkWorkflow(workflowId: string, options?: {
|
|
39
|
+
retainContext?: boolean;
|
|
40
|
+
}): void;
|
|
41
|
+
/** Returns the live Context for a workflow, or `undefined` if not running. For parked workflows use {@link getParkedContext}. */
|
|
58
42
|
getContext(workflowId: string): Context | undefined;
|
|
43
|
+
/** Returns the retained Context for a parked workflow, or `undefined` if not parked or already cleaned up. */
|
|
44
|
+
getParkedContext(workflowId: string): Context | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* Drop any retained parked Context for a workflow without touching the abort
|
|
47
|
+
* controller or other live state. Terminal cleanup calls this so a workflow
|
|
48
|
+
* that reached a terminal status while parked (e.g. a failed resume, or normal
|
|
49
|
+
* completion of a run that had parked) cannot keep resolving `ctx.onQuery`
|
|
50
|
+
* handlers from a stale parked Context — and so the Context is not retained
|
|
51
|
+
* for the engine's lifetime.
|
|
52
|
+
*/
|
|
53
|
+
clearParkedContext(workflowId: string): void;
|
|
59
54
|
getAbortController(workflowId: string): AbortController | undefined;
|
|
60
55
|
waitForWorkflowTurn(workflowId: string): Promise<void> | undefined;
|
|
61
56
|
waitForWorkflowAdvance(workflowId: string): Promise<void> | undefined;
|
|
@@ -71,11 +66,11 @@ export declare class InlineExecutionStrategy implements ExecutionStrategy {
|
|
|
71
66
|
*/
|
|
72
67
|
throwIntoWorkflow(workflowId: string, error: unknown, operationFailureCategory?: FailureCategory): void;
|
|
73
68
|
/**
|
|
74
|
-
* Store a context and generator
|
|
75
|
-
*
|
|
69
|
+
* Store a context and generator created externally (engine resume path).
|
|
70
|
+
* Clears any retained parked context so a concurrent query sees the new
|
|
71
|
+
* live context rather than the stale parked one.
|
|
76
72
|
*/
|
|
77
73
|
adoptWorkflow(workflowId: string, generator: AsyncGenerator, context: Context, abortController: AbortController): void;
|
|
78
74
|
[Symbol.dispose](): void;
|
|
79
75
|
[Symbol.asyncDispose](): Promise<void>;
|
|
80
76
|
}
|
|
81
|
-
export {};
|
|
@@ -3,38 +3,14 @@ import {
|
|
|
3
3
|
classifyErrorAsFailureCategory,
|
|
4
4
|
errorFromFailedOperationOutcome
|
|
5
5
|
} from "./failure-categories.js";
|
|
6
|
-
|
|
7
|
-
const { registerCancelHandler } = dependencies;
|
|
8
|
-
return {
|
|
9
|
-
workflowId: parameters.workflowId,
|
|
10
|
-
workflowType: parameters.workflowType,
|
|
11
|
-
startedAt: parameters.startedAt ?? dependencies.getNow(),
|
|
12
|
-
abortController: workflowAbort,
|
|
13
|
-
getNow: dependencies.getNow,
|
|
14
|
-
nestingDepth: parameters.nestingDepth ?? 0,
|
|
15
|
-
executionStateOwnerId: parameters.executionStateOwnerId ?? parameters.workflowId,
|
|
16
|
-
...parameters.sleepReferenceTime !== void 0 && {
|
|
17
|
-
sleepReferenceTime: parameters.sleepReferenceTime
|
|
18
|
-
},
|
|
19
|
-
...dependencies.resolveWorkflowType !== void 0 && {
|
|
20
|
-
resolveWorkflowType: dependencies.resolveWorkflowType
|
|
21
|
-
},
|
|
22
|
-
...registration.searchAttributes && {
|
|
23
|
-
searchAttributeSchema: registration.searchAttributes
|
|
24
|
-
},
|
|
25
|
-
...parameters.deadline !== void 0 && { deadline: parameters.deadline },
|
|
26
|
-
...registerCancelHandler !== void 0 && {
|
|
27
|
-
registerCancelHandler: (handler) => registerCancelHandler(parameters.workflowId, handler)
|
|
28
|
-
},
|
|
29
|
-
services: dependencies.getWorkflowServices?.(parameters.workflowId)
|
|
30
|
-
};
|
|
31
|
-
}
|
|
6
|
+
import { createInlineContextOptions } from "./inline-execution-strategy.context-options.js";
|
|
32
7
|
|
|
33
8
|
export class InlineExecutionStrategy {
|
|
34
9
|
#dependencies;
|
|
35
10
|
#generators;
|
|
36
11
|
#abortControllers;
|
|
37
12
|
#contexts;
|
|
13
|
+
#parkedContexts;
|
|
38
14
|
#workflowAdvances;
|
|
39
15
|
#workflowTurns;
|
|
40
16
|
#messageHandler;
|
|
@@ -43,6 +19,7 @@ export class InlineExecutionStrategy {
|
|
|
43
19
|
this.#generators = new Map;
|
|
44
20
|
this.#abortControllers = new Map;
|
|
45
21
|
this.#contexts = new Map;
|
|
22
|
+
this.#parkedContexts = new Map;
|
|
46
23
|
this.#workflowAdvances = new Map;
|
|
47
24
|
this.#workflowTurns = new Map;
|
|
48
25
|
this.#messageHandler = null;
|
|
@@ -93,12 +70,21 @@ export class InlineExecutionStrategy {
|
|
|
93
70
|
abortController.abort();
|
|
94
71
|
this.#cleanup(workflowId);
|
|
95
72
|
}
|
|
96
|
-
parkWorkflow(workflowId) {
|
|
73
|
+
parkWorkflow(workflowId, options) {
|
|
74
|
+
const context = options?.retainContext ? this.#contexts.get(workflowId) ?? this.#parkedContexts.get(workflowId) : void 0;
|
|
97
75
|
this.#cleanup(workflowId);
|
|
76
|
+
if (context !== void 0)
|
|
77
|
+
this.#parkedContexts.set(workflowId, context);
|
|
98
78
|
}
|
|
99
79
|
getContext(workflowId) {
|
|
100
80
|
return this.#contexts.get(workflowId);
|
|
101
81
|
}
|
|
82
|
+
getParkedContext(workflowId) {
|
|
83
|
+
return this.#parkedContexts.get(workflowId);
|
|
84
|
+
}
|
|
85
|
+
clearParkedContext(workflowId) {
|
|
86
|
+
this.#parkedContexts.delete(workflowId);
|
|
87
|
+
}
|
|
102
88
|
getAbortController(workflowId) {
|
|
103
89
|
return this.#abortControllers.get(workflowId);
|
|
104
90
|
}
|
|
@@ -124,6 +110,7 @@ export class InlineExecutionStrategy {
|
|
|
124
110
|
this.#throwIntoGenerator(workflowId, generator, error, operationFailureCategory);
|
|
125
111
|
}
|
|
126
112
|
adoptWorkflow(workflowId, generator, context, abortController) {
|
|
113
|
+
this.#parkedContexts.delete(workflowId);
|
|
127
114
|
this.#generators.set(workflowId, generator);
|
|
128
115
|
this.#contexts.set(workflowId, context);
|
|
129
116
|
this.#abortControllers.set(workflowId, abortController);
|
|
@@ -132,6 +119,7 @@ export class InlineExecutionStrategy {
|
|
|
132
119
|
this.#generators.clear();
|
|
133
120
|
this.#abortControllers.clear();
|
|
134
121
|
this.#contexts.clear();
|
|
122
|
+
this.#parkedContexts.clear();
|
|
135
123
|
this.#workflowAdvances.clear();
|
|
136
124
|
this.#workflowTurns.clear();
|
|
137
125
|
this.#messageHandler = null;
|
|
@@ -257,6 +245,7 @@ export class InlineExecutionStrategy {
|
|
|
257
245
|
this.#generators.delete(workflowId);
|
|
258
246
|
this.#abortControllers.delete(workflowId);
|
|
259
247
|
this.#contexts.delete(workflowId);
|
|
248
|
+
this.#parkedContexts.delete(workflowId);
|
|
260
249
|
if (!options?.preserveTrackedAdvance)
|
|
261
250
|
this.#workflowAdvances.delete(workflowId);
|
|
262
251
|
if (!options?.preserveTrackedTurn)
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
import { z } from 'zod';
|
|
12
12
|
import { isFailureCategory } from './failure-categories.ts';
|
|
13
13
|
import type { FailureCategory, WorkflowStatus } from './types/identity.ts';
|
|
14
|
-
import type { ListFilter } from './types/options.ts';
|
|
14
|
+
import type { ListFilter } from './types/list-options.ts';
|
|
15
15
|
import { WeftError } from './weft-error.ts';
|
|
16
16
|
/**
|
|
17
17
|
* Concrete object schema for {@link ListFilter}. Supports `.omit()` and
|
|
@@ -7,7 +7,8 @@ const WORKFLOW_STATUSES = [
|
|
|
7
7
|
"completed",
|
|
8
8
|
"failed",
|
|
9
9
|
"cancelled",
|
|
10
|
-
"timed-out"
|
|
10
|
+
"timed-out",
|
|
11
|
+
"suspended"
|
|
11
12
|
], ID_PREFIX_PATTERN = /^[A-Za-z0-9_-]+$/, workflowStatusSchema = z.enum(WORKFLOW_STATUSES), failureCategorySchema = z.enum(FAILURE_CATEGORIES), timeRangeSchema = z.object({
|
|
12
13
|
gte: z.number().optional(),
|
|
13
14
|
lte: z.number().optional(),
|
|
@@ -4,7 +4,7 @@ import { WeftError } from './weft-error.ts';
|
|
|
4
4
|
* {@link PayloadSizeExceededError} message so operators can tell which
|
|
5
5
|
* admission point rejected the value.
|
|
6
6
|
*/
|
|
7
|
-
export type PayloadKind = 'workflow input' | 'signal payload' | 'activity result';
|
|
7
|
+
export type PayloadKind = 'workflow input' | 'signal payload' | 'activity result' | 'finalizer state';
|
|
8
8
|
/**
|
|
9
9
|
* Thrown at admission when a payload's serialized (codec-encoded) size exceeds
|
|
10
10
|
* the operator-configured {@link PayloadSizePolicy.maxBytes}. The rejection
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import { WeftError } from './weft-error.ts';
|
|
2
2
|
/**
|
|
3
3
|
* Thrown by {@link Engine.create} (and other storage-opening entry points) when
|
|
4
|
-
* a persisted Weft database
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
4
|
+
* a persisted Weft database's schema version does not match what the engine
|
|
5
|
+
* requires — an older version, a newer one, an unparseable sentinel, or user
|
|
6
|
+
* data present with no sentinel at all. Weft loads persisted data only at the
|
|
7
|
+
* exact current schema version; it never reshapes a non-matching database in
|
|
8
|
+
* place. Bumping {@link CURRENT_PERSISTED_DATA_SCHEMA_VERSION} intentionally
|
|
9
|
+
* invalidates databases stamped with any other version so the failure surfaces
|
|
10
|
+
* deterministically at boot, before any workflow attempts replay.
|
|
9
11
|
*
|
|
10
12
|
* Inspect `foundVersion` to see what the storage advertised and `expectedVersion`
|
|
11
|
-
* to see what this engine requires. Resolve by deleting the database
|
|
12
|
-
*
|
|
13
|
+
* to see what this engine requires. Resolve by deleting the database or by
|
|
14
|
+
* starting from fresh storage.
|
|
13
15
|
*
|
|
14
16
|
* @example
|
|
15
17
|
* ```ts
|
|
@@ -6,12 +6,11 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @example Route review notifications to a webhook
|
|
8
8
|
* ```ts
|
|
9
|
-
* import { ReviewRequestedEvent } from '@lostgradient/weft';
|
|
9
|
+
* import { ReviewRequestedEvent, type TypedEventTarget, type WeftReviewEventMap } from '@lostgradient/weft';
|
|
10
10
|
*
|
|
11
|
-
* const target
|
|
11
|
+
* declare const target: TypedEventTarget<WeftReviewEventMap>;
|
|
12
12
|
*
|
|
13
|
-
* target.addEventListener(ReviewRequestedEvent.type, (
|
|
14
|
-
* const event = e as ReviewRequestedEvent;
|
|
13
|
+
* target.addEventListener(ReviewRequestedEvent.type, (event) => {
|
|
15
14
|
* console.log(`Review ${event.reviewId} requested for workflow ${event.workflowId}`);
|
|
16
15
|
* console.log('Reviewers:', event.reviewers);
|
|
17
16
|
* });
|
|
@@ -33,12 +32,11 @@ export declare class ReviewRequestedEvent extends Event {
|
|
|
33
32
|
*
|
|
34
33
|
* @example Record review decisions in an audit log
|
|
35
34
|
* ```ts
|
|
36
|
-
* import { ReviewCompletedEvent } from '@lostgradient/weft';
|
|
35
|
+
* import { ReviewCompletedEvent, type TypedEventTarget, type WeftReviewEventMap } from '@lostgradient/weft';
|
|
37
36
|
*
|
|
38
|
-
* const target
|
|
37
|
+
* declare const target: TypedEventTarget<WeftReviewEventMap>;
|
|
39
38
|
*
|
|
40
|
-
* target.addEventListener(ReviewCompletedEvent.type, (
|
|
41
|
-
* const event = e as ReviewCompletedEvent;
|
|
39
|
+
* target.addEventListener(ReviewCompletedEvent.type, (event) => {
|
|
42
40
|
* console.log(`Review ${event.reviewId}: '${event.decision}' by ${event.reviewer} in ${event.duration}ms`);
|
|
43
41
|
* });
|
|
44
42
|
* ```
|
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
import type { Storage } from '../../storage/interface.ts';
|
|
1
|
+
import type { BatchOperation, Storage } from '../../storage/interface.ts';
|
|
2
2
|
import type { TimerEntry } from '../types.ts';
|
|
3
3
|
export interface SchedulerOptions {
|
|
4
4
|
storage: Storage;
|
|
5
5
|
onTimerFired: (entry: TimerEntry) => void | Promise<void>;
|
|
6
6
|
pollIntervalMs?: number;
|
|
7
7
|
getNow?: () => number;
|
|
8
|
+
/**
|
|
9
|
+
* Commit the batch that deletes a fired timer's keys after its callback
|
|
10
|
+
* returns. Defaults to an unfenced `storage.batch`. The engine supplies a
|
|
11
|
+
* lease-fenced commit (#563) so the fired-timer delete and the callback's own
|
|
12
|
+
* follow-up writes share the same ownership fence — under deposition both are
|
|
13
|
+
* rejected and the timer survives for the successor to re-drive. With no lease
|
|
14
|
+
* held this commits exactly as the unfenced default would.
|
|
15
|
+
*/
|
|
16
|
+
commitTimerCleanup?: (operations: BatchOperation[]) => Promise<void>;
|
|
8
17
|
}
|
|
9
18
|
/**
|
|
10
19
|
* Scheduler manages durable timers and polls for expired deadlines.
|
|
@@ -4,16 +4,19 @@ import { buildTimerBatchOperations } from "./timer-batch.js";
|
|
|
4
4
|
import {
|
|
5
5
|
advanceTimerSource,
|
|
6
6
|
readNextScannedTimerEntry,
|
|
7
|
+
readNextTeardownTimerEntry,
|
|
7
8
|
readNextTerminalCleanupTimerEntry,
|
|
8
9
|
selectNextTimerSource,
|
|
9
10
|
shouldDeleteTimerIndexWithoutLookup
|
|
10
11
|
} from "./timer-sources.js";
|
|
12
|
+
const EXPIRED_TIMER_SCAN_LIMIT_PER_SOURCE = 1000;
|
|
11
13
|
|
|
12
14
|
export class Scheduler {
|
|
13
15
|
#storage;
|
|
14
16
|
#onTimerFired;
|
|
15
17
|
#pollIntervalMs;
|
|
16
18
|
#getNow;
|
|
19
|
+
#commitTimerCleanup;
|
|
17
20
|
#intervalHandle = null;
|
|
18
21
|
#stopped = !1;
|
|
19
22
|
constructor(options) {
|
|
@@ -21,6 +24,7 @@ export class Scheduler {
|
|
|
21
24
|
this.#onTimerFired = options.onTimerFired;
|
|
22
25
|
this.#pollIntervalMs = options.pollIntervalMs ?? 1000;
|
|
23
26
|
this.#getNow = options.getNow ?? Date.now;
|
|
27
|
+
this.#commitTimerCleanup = options.commitTimerCleanup ?? ((operations) => this.#storage.batch(operations));
|
|
24
28
|
}
|
|
25
29
|
start() {
|
|
26
30
|
if (this.#intervalHandle !== null)
|
|
@@ -66,7 +70,7 @@ export class Scheduler {
|
|
|
66
70
|
this.stop();
|
|
67
71
|
}
|
|
68
72
|
async#processExpiredTimers(now, { respectStopped }) {
|
|
69
|
-
const currentTime = now ?? this.#getNow(), timerSources = this.#createTimerSources(this.#scanExpiredTimers(currentTime));
|
|
73
|
+
const currentTime = now ?? this.#getNow(), timerSources = this.#createTimerSources(this.#scanExpiredTimers(currentTime)), cleanupOperations = [];
|
|
70
74
|
for (const timerSource of timerSources)
|
|
71
75
|
await advanceTimerSource(timerSource, this.#storage);
|
|
72
76
|
while (this.#hasPendingTimer(timerSources)) {
|
|
@@ -74,27 +78,36 @@ export class Scheduler {
|
|
|
74
78
|
if (!nextEntry || !selectedSource)
|
|
75
79
|
break;
|
|
76
80
|
if (respectStopped && this.#stopped)
|
|
77
|
-
|
|
78
|
-
if (await this.#processSelectedTimer(nextEntry) === "retry") {
|
|
81
|
+
break;
|
|
82
|
+
if (await this.#processSelectedTimer(nextEntry, cleanupOperations) === "retry") {
|
|
79
83
|
await advanceTimerSource(selectedSource, this.#storage);
|
|
80
84
|
continue;
|
|
81
85
|
}
|
|
82
86
|
await advanceTimerSource(selectedSource, this.#storage);
|
|
83
87
|
}
|
|
88
|
+
await this.#deleteProcessedTimerKeys(cleanupOperations);
|
|
84
89
|
}
|
|
85
90
|
#scanExpiredTimers(currentTime) {
|
|
86
91
|
return {
|
|
87
92
|
deadline: this.#storage.scan("wf-deadline:", {
|
|
88
|
-
lt: resolvePrefixRangeEnd(KEYS.deadline(currentTime, ""))
|
|
93
|
+
lt: resolvePrefixRangeEnd(KEYS.deadline(currentTime, "")),
|
|
94
|
+
limit: EXPIRED_TIMER_SCAN_LIMIT_PER_SOURCE
|
|
89
95
|
}),
|
|
90
96
|
delayedStart: this.#storage.scan("wf-delayed:", {
|
|
91
|
-
lt: resolvePrefixRangeEnd(KEYS.delayedStart(currentTime, ""))
|
|
97
|
+
lt: resolvePrefixRangeEnd(KEYS.delayedStart(currentTime, "")),
|
|
98
|
+
limit: EXPIRED_TIMER_SCAN_LIMIT_PER_SOURCE
|
|
92
99
|
}),
|
|
93
100
|
schedule: this.#storage.scan("schedule-due:", {
|
|
94
|
-
lt: resolvePrefixRangeEnd(KEYS.scheduleTick(currentTime, ""))
|
|
101
|
+
lt: resolvePrefixRangeEnd(KEYS.scheduleTick(currentTime, "")),
|
|
102
|
+
limit: EXPIRED_TIMER_SCAN_LIMIT_PER_SOURCE
|
|
95
103
|
}),
|
|
96
104
|
terminalCleanup: this.#storage.scan("wf-cleanup:", {
|
|
97
|
-
lt: resolvePrefixRangeEnd(KEYS.terminalCleanup(currentTime, ""))
|
|
105
|
+
lt: resolvePrefixRangeEnd(KEYS.terminalCleanup(currentTime, "")),
|
|
106
|
+
limit: EXPIRED_TIMER_SCAN_LIMIT_PER_SOURCE
|
|
107
|
+
}),
|
|
108
|
+
teardown: this.#storage.scan("wf-teardown:", {
|
|
109
|
+
lt: resolvePrefixRangeEnd(KEYS.teardownTimer(currentTime, "")),
|
|
110
|
+
limit: EXPIRED_TIMER_SCAN_LIMIT_PER_SOURCE
|
|
98
111
|
})
|
|
99
112
|
};
|
|
100
113
|
}
|
|
@@ -119,29 +132,43 @@ export class Scheduler {
|
|
|
119
132
|
iterator: iterators.terminalCleanup[Symbol.asyncIterator](),
|
|
120
133
|
next: null,
|
|
121
134
|
readNext: readNextTerminalCleanupTimerEntry
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
iterator: iterators.teardown[Symbol.asyncIterator](),
|
|
138
|
+
next: null,
|
|
139
|
+
readNext: readNextTeardownTimerEntry
|
|
122
140
|
}
|
|
123
141
|
];
|
|
124
142
|
}
|
|
125
143
|
#hasPendingTimer(timerSources) {
|
|
126
144
|
return timerSources.some((timerSource) => timerSource.next !== null);
|
|
127
145
|
}
|
|
128
|
-
async#processSelectedTimer(nextEntry) {
|
|
146
|
+
async#processSelectedTimer(nextEntry, cleanupOperations) {
|
|
129
147
|
try {
|
|
130
148
|
await this.#onTimerFired(nextEntry.entry);
|
|
131
149
|
} catch (error) {
|
|
132
150
|
console.error(`Timer callback failed for timer ${nextEntry.entry.id}:`, error);
|
|
133
151
|
return "retry";
|
|
134
152
|
}
|
|
135
|
-
await this.#
|
|
153
|
+
await this.#appendTimerCleanupOperationsAfterCallback(nextEntry, cleanupOperations);
|
|
136
154
|
return "processed";
|
|
137
155
|
}
|
|
138
|
-
async#
|
|
156
|
+
async#appendTimerCleanupOperationsAfterCallback(nextEntry, cleanupOperations) {
|
|
139
157
|
try {
|
|
140
|
-
|
|
158
|
+
cleanupOperations.push(...await this.#buildTimerCleanupOperations(nextEntry));
|
|
141
159
|
} catch (deleteError) {
|
|
142
160
|
console.error(`Failed to delete timer keys for ${nextEntry.entry.id}:`, deleteError);
|
|
143
161
|
}
|
|
144
162
|
}
|
|
163
|
+
async#deleteProcessedTimerKeys(cleanupOperations) {
|
|
164
|
+
if (cleanupOperations.length === 0)
|
|
165
|
+
return;
|
|
166
|
+
try {
|
|
167
|
+
await this.#commitTimerCleanup(cleanupOperations);
|
|
168
|
+
} catch (deleteError) {
|
|
169
|
+
console.error("Failed to delete timer keys for processed scheduler tick:", deleteError);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
145
172
|
async#buildTimerCleanupOperations(nextEntry) {
|
|
146
173
|
const cleanupOperations = [{ type: "delete", key: nextEntry.key }], indexDeleteOperation = await this.#buildTimerIndexDeleteOperation(nextEntry);
|
|
147
174
|
if (indexDeleteOperation)
|
|
@@ -2,7 +2,7 @@ import { KEYS } from "../../storage/interface.js";
|
|
|
2
2
|
import { encode } from "../codec.js";
|
|
3
3
|
import { normalizeStorageTimestamp } from "./duration.js";
|
|
4
4
|
function isTimerEntryKind(value) {
|
|
5
|
-
return value === "sleep" || value === "visibility-timeout" || value === "execution-deadline" || value === "delayed-start" || value === "schedule" || value === "terminal-cleanup";
|
|
5
|
+
return value === "sleep" || value === "visibility-timeout" || value === "execution-deadline" || value === "delayed-start" || value === "schedule" || value === "terminal-cleanup" || value === "teardown" || value === "wait-condition";
|
|
6
6
|
}
|
|
7
7
|
function isRecord(value) {
|
|
8
8
|
return typeof value === "object" && value !== null;
|
|
@@ -30,6 +30,14 @@ export function buildTimerBatchOperations(entry) {
|
|
|
30
30
|
value: encode(normalizedEntry.workflowId)
|
|
31
31
|
}
|
|
32
32
|
];
|
|
33
|
+
if (normalizedEntry.kind === "teardown")
|
|
34
|
+
return [
|
|
35
|
+
{
|
|
36
|
+
type: "put",
|
|
37
|
+
key: KEYS.teardownTimer(normalizedEntry.fireAt, normalizedEntry.id),
|
|
38
|
+
value: encode(normalizedEntry.workflowId)
|
|
39
|
+
}
|
|
40
|
+
];
|
|
33
41
|
const deadlineKey = normalizedEntry.kind === "delayed-start" ? KEYS.delayedStart(normalizedEntry.fireAt, normalizedEntry.workflowId) : normalizedEntry.kind === "schedule" ? KEYS.scheduleTick(normalizedEntry.fireAt, normalizedEntry.workflowId) : KEYS.deadline(normalizedEntry.fireAt, normalizedEntry.id), operations = [
|
|
34
42
|
{ type: "put", key: deadlineKey, value: encode(normalizedEntry) }
|
|
35
43
|
];
|
|
@@ -12,6 +12,7 @@ export type TimerSource = {
|
|
|
12
12
|
export declare function compareScannedTimerEntries(left: ScannedTimerEntry, right: ScannedTimerEntry): number;
|
|
13
13
|
export declare function readNextScannedTimerEntry(iterator: AsyncIterator<[string, Uint8Array]>, storage: Storage): Promise<ScannedTimerEntry | null>;
|
|
14
14
|
export declare function readNextTerminalCleanupTimerEntry(iterator: AsyncIterator<[string, Uint8Array]>, storage: Storage): Promise<ScannedTimerEntry | null>;
|
|
15
|
+
export declare function readNextTeardownTimerEntry(iterator: AsyncIterator<[string, Uint8Array]>, storage: Storage): Promise<ScannedTimerEntry | null>;
|
|
15
16
|
export declare function advanceTimerSource(timerSource: TimerSource, storage: Storage): Promise<void>;
|
|
16
17
|
export declare function selectNextTimerSource(timerSources: TimerSource[]): TimerSource | undefined;
|
|
17
18
|
export declare function shouldDeleteTimerIndexWithoutLookup(entry: TimerEntry): boolean;
|
|
@@ -20,15 +20,15 @@ export async function readNextScannedTimerEntry(iterator, storage) {
|
|
|
20
20
|
return { key, entry: decoded };
|
|
21
21
|
}
|
|
22
22
|
}
|
|
23
|
-
|
|
24
|
-
const prefix = "wf-cleanup:";
|
|
23
|
+
async function readNextWorkflowTimerEntry(iterator, storage, kind) {
|
|
24
|
+
const { diagnosticName, prefix } = kind === "terminal-cleanup" ? { diagnosticName: "terminal cleanup", prefix: "wf-cleanup:" } : { diagnosticName: "teardown timer", prefix: "wf-teardown:" };
|
|
25
25
|
while (!0) {
|
|
26
26
|
const next = await iterator.next();
|
|
27
27
|
if (next.done)
|
|
28
28
|
return null;
|
|
29
29
|
const [key, value] = next.value, separatorIndex = key.indexOf(":", prefix.length), fireAtValue = separatorIndex === -1 ? Number.NaN : Number(key.slice(prefix.length, separatorIndex)), timerId = separatorIndex === -1 ? null : tryDecodeStorageKeyComponent(key.slice(separatorIndex + 1)), decodedWorkflowId = decode(value);
|
|
30
30
|
if (!Number.isSafeInteger(fireAtValue) || fireAtValue < 0 || timerId === null || typeof decodedWorkflowId !== "string") {
|
|
31
|
-
console.error(`Corrupted
|
|
31
|
+
console.error(`Corrupted ${diagnosticName} entry at ${key}: removing`);
|
|
32
32
|
await storage.delete(key);
|
|
33
33
|
continue;
|
|
34
34
|
}
|
|
@@ -38,11 +38,17 @@ export async function readNextTerminalCleanupTimerEntry(iterator, storage) {
|
|
|
38
38
|
id: timerId,
|
|
39
39
|
workflowId: decodedWorkflowId,
|
|
40
40
|
fireAt: fireAtValue,
|
|
41
|
-
kind
|
|
41
|
+
kind
|
|
42
42
|
}
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
+
export async function readNextTerminalCleanupTimerEntry(iterator, storage) {
|
|
47
|
+
return readNextWorkflowTimerEntry(iterator, storage, "terminal-cleanup");
|
|
48
|
+
}
|
|
49
|
+
export async function readNextTeardownTimerEntry(iterator, storage) {
|
|
50
|
+
return readNextWorkflowTimerEntry(iterator, storage, "teardown");
|
|
51
|
+
}
|
|
46
52
|
export async function advanceTimerSource(timerSource, storage) {
|
|
47
53
|
timerSource.next = await timerSource.readNext(timerSource.iterator, storage);
|
|
48
54
|
}
|
|
@@ -57,5 +63,5 @@ export function selectNextTimerSource(timerSources) {
|
|
|
57
63
|
return selectedSource;
|
|
58
64
|
}
|
|
59
65
|
export function shouldDeleteTimerIndexWithoutLookup(entry) {
|
|
60
|
-
return entry.kind !== "schedule" && entry.kind !== "terminal-cleanup";
|
|
66
|
+
return entry.kind !== "schedule" && entry.kind !== "terminal-cleanup" && entry.kind !== "teardown";
|
|
61
67
|
}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { WeftError } from './weft-error.ts';
|
|
2
2
|
export declare const SESSION_STATE_LOCAL_KEY = "stateSession";
|
|
3
|
-
export declare const LEGACY_SESSION_STATE_LOCAL_KEY = "sessionState";
|
|
4
3
|
export declare const MAX_SESSION_STATE_ENTRY_COUNT = 256;
|
|
5
4
|
export declare const MAX_SESSION_STATE_KEY_LENGTH = 256;
|
|
6
5
|
export declare const MAX_SESSION_STATE_SERIALIZED_BYTES: number;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { encode } from "./codec.js";
|
|
2
2
|
import { WeftError } from "./weft-error.js";
|
|
3
|
-
export const SESSION_STATE_LOCAL_KEY = "stateSession",
|
|
3
|
+
export const SESSION_STATE_LOCAL_KEY = "stateSession", MAX_SESSION_STATE_ENTRY_COUNT = 256, MAX_SESSION_STATE_KEY_LENGTH = 256, MAX_SESSION_STATE_SERIALIZED_BYTES = 32768;
|
|
4
4
|
const RESERVED_SESSION_STATE_KEYS = new Set(["__proto__", "constructor", "prototype"]);
|
|
5
5
|
|
|
6
6
|
export class SessionStateValidationError extends WeftError {
|
|
@@ -55,7 +55,7 @@ export function normalizeSessionStateRecord(value) {
|
|
|
55
55
|
export function normalizeSessionStateLocals(locals) {
|
|
56
56
|
if (!locals)
|
|
57
57
|
return;
|
|
58
|
-
return normalizeSessionStateRecord(locals[SESSION_STATE_LOCAL_KEY]
|
|
58
|
+
return normalizeSessionStateRecord(locals[SESSION_STATE_LOCAL_KEY]);
|
|
59
59
|
}
|
|
60
60
|
export function validateSessionStateStore(store) {
|
|
61
61
|
const keys = Object.keys(store);
|
|
@@ -2,11 +2,67 @@ import type { Duration } from './types.ts';
|
|
|
2
2
|
import { WeftError } from './weft-error.ts';
|
|
3
3
|
export declare const MAX_WORKFLOW_TAGS = 32;
|
|
4
4
|
export declare const MAX_WORKFLOW_TAG_BYTES = 128;
|
|
5
|
+
/**
|
|
6
|
+
* Upper bound on a start `idempotencyKey`, in UTF-8 bytes. `startOrSignal`
|
|
7
|
+
* derives a signal id of `start-idem:${key}` (an 11-byte prefix) from the key,
|
|
8
|
+
* and `validateSignalId` caps a signal id at 128 bytes — so the raw key must fit
|
|
9
|
+
* in `128 - 11 = 117` bytes for the derived id to stay within that ceiling.
|
|
10
|
+
*/
|
|
11
|
+
export declare const MAX_IDEMPOTENCY_KEY_BYTES = 117;
|
|
5
12
|
export declare class StartWorkflowValidationError extends WeftError<'StartWorkflowValidationError'> {
|
|
6
13
|
constructor(message: string);
|
|
7
14
|
}
|
|
8
15
|
export declare const assertExclusiveStartWorkflowOptions: (startAt: unknown, startAfter: unknown) => void;
|
|
9
16
|
export declare const coerceStartWorkflowId: (value: unknown, fieldName: string) => string;
|
|
17
|
+
/**
|
|
18
|
+
* Coerce a transport-supplied idempotency key to a non-empty string. The key is
|
|
19
|
+
* a caller-chosen dedup token (it becomes part of a `start-idem:` storage key),
|
|
20
|
+
* so an empty string — which would collide across unrelated starts — is rejected.
|
|
21
|
+
*/
|
|
22
|
+
export declare const coerceStartWorkflowIdempotencyKey: (value: unknown, fieldName: string) => string;
|
|
23
|
+
/**
|
|
24
|
+
* Validate an already-string `idempotencyKey`: non-empty (an empty key would
|
|
25
|
+
* collide across unrelated starts under the shared `start-idem:` mapping) and at
|
|
26
|
+
* most {@link MAX_IDEMPOTENCY_KEY_BYTES} UTF-8 bytes (so the derived
|
|
27
|
+
* `start-idem:${key}` signal id stays within the signal-id ceiling). Shared by
|
|
28
|
+
* the transport coercion and the engine boundary so a direct `engine.start`
|
|
29
|
+
* caller gets the same guarantees as an HTTP caller.
|
|
30
|
+
*/
|
|
31
|
+
export declare const assertValidIdempotencyKey: (value: string, fieldName: string) => string;
|
|
32
|
+
/**
|
|
33
|
+
* Validate the `onTerminalConflict` start policy against the rest of the start
|
|
34
|
+
* options. `'error'` (the default) and `'start-new'` are the only accepted
|
|
35
|
+
* values. `'start-new'` (Temporal's `ALLOW_DUPLICATE` for terminal runs) requires
|
|
36
|
+
* an explicit, caller-chosen `id` and is mutually exclusive with `idempotencyKey`:
|
|
37
|
+
* idempotency is a permanent at-most-once mapping that survives terminal state, so
|
|
38
|
+
* restarting under it would contradict that contract. A generated UUID is never a
|
|
39
|
+
* meaningful restart target, hence the explicit-`id` requirement.
|
|
40
|
+
*/
|
|
41
|
+
export declare function assertValidOnTerminalConflict(options: {
|
|
42
|
+
onTerminalConflict?: unknown;
|
|
43
|
+
id?: unknown;
|
|
44
|
+
idempotencyKey?: unknown;
|
|
45
|
+
} | undefined): void;
|
|
46
|
+
/**
|
|
47
|
+
* `options.id` and `options.idempotencyKey` are mutually exclusive: idempotency
|
|
48
|
+
* assigns its own generated workflow id and dedups through the key, so pinning a
|
|
49
|
+
* caller id alongside it conflates "id already taken" with "lost the idempotency
|
|
50
|
+
* race". Reject the combination so each concern stays separable. Shared by the
|
|
51
|
+
* plain idempotent-start path and `startOrSignal` convergence validation.
|
|
52
|
+
*/
|
|
53
|
+
export declare function assertIdAndIdempotencyKeyExclusive(options: {
|
|
54
|
+
id?: unknown;
|
|
55
|
+
idempotencyKey?: unknown;
|
|
56
|
+
}): void;
|
|
57
|
+
/**
|
|
58
|
+
* Reject `onTerminalConflict` on a start surface that does not support it
|
|
59
|
+
* (`engine.startOrSignal`). The option is type-absent from those surfaces, but a
|
|
60
|
+
* transport or untyped JS caller could still smuggle the field into the options
|
|
61
|
+
* object — this is the runtime backstop. `engine.startOrSignal`'s identity is the
|
|
62
|
+
* permanent at-most-once idempotency mapping, which `'start-new'` would violate,
|
|
63
|
+
* so the policy is `engine.start`-only (see follow-up issue #489).
|
|
64
|
+
*/
|
|
65
|
+
export declare function assertOnTerminalConflictUnsupported(options: object | undefined, surface: string): void;
|
|
10
66
|
export declare function coerceStartWorkflowTimestamp(value: unknown, fieldName: string): number;
|
|
11
67
|
export declare function parseStartWorkflowDuration(duration: Duration, fieldName: string): number;
|
|
12
68
|
export declare function coerceStartWorkflowDuration(value: unknown, fieldName: string): Duration;
|