@temelj/workflow 0.0.0-alpha.2 → 0.0.0-alpha.4
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 +394 -2
- package/dist/attributes.d.mts +11 -9
- package/dist/attributes.mjs +23 -5
- package/dist/bundle.d.mts +5 -23
- package/dist/bundle.mjs +2 -18
- package/dist/client/create.d.mts +26 -23
- package/dist/client/create.mjs +26 -32
- package/dist/client/facades.d.mts +12 -18
- package/dist/client/facades.mjs +102 -93
- package/dist/client/mod.mjs +1 -2
- package/dist/client/run-handle.d.mts +17 -54
- package/dist/client/run-handle.mjs +35 -105
- package/dist/client/worker-options.d.mts +8 -8
- package/dist/client/worker-options.mjs +11 -11
- package/dist/cloudflare/cloudflare.d.mts +4 -5
- package/dist/cloudflare/codec.d.mts +28 -13
- package/dist/cloudflare/codec.mjs +40 -17
- package/dist/cloudflare/entrypoint.d.mts +3 -4
- package/dist/cloudflare/entrypoint.mjs +4 -3
- package/dist/cloudflare/execution.d.mts +3 -4
- package/dist/cloudflare/execution.mjs +20 -13
- package/dist/cloudflare/host.d.mts +6 -7
- package/dist/cloudflare/host.mjs +7 -6
- package/dist/cloudflare/mod.d.mts +4 -4
- package/dist/cloudflare/mod.mjs +2 -2
- package/dist/cloudflare/name.d.mts +3 -4
- package/dist/cloudflare/name.mjs +3 -3
- package/dist/cloudflare/registry.d.mts +3 -23
- package/dist/cloudflare/registry.mjs +2 -20
- package/dist/cloudflare/runtime.d.mts +11 -18
- package/dist/cloudflare/runtime.mjs +52 -73
- package/dist/cloudflare/step.d.mts +6 -6
- package/dist/cloudflare/step.mjs +69 -57
- package/dist/cloudflare/types.d.mts +17 -36
- package/dist/collection.d.mts +8 -11
- package/dist/collection.mjs +10 -14
- package/dist/compiled-function.d.mts +14 -19
- package/dist/compiled-function.mjs +12 -24
- package/dist/compiled.d.mts +4 -0
- package/dist/compiled.mjs +4 -0
- package/dist/compiler/ast.d.mts +26 -0
- package/dist/{vite → compiler}/ast.mjs +24 -16
- package/dist/{vite → compiler}/error.d.mts +4 -6
- package/dist/{vite → compiler}/error.mjs +14 -16
- package/dist/compiler/manifest.d.mts +6 -0
- package/dist/{vite → compiler}/manifest.mjs +9 -7
- package/dist/compiler/plugin.d.mts +7 -0
- package/dist/{vite → compiler}/plugin.mjs +45 -46
- package/dist/compiler/safety.d.mts +12 -0
- package/dist/{vite → compiler}/safety.mjs +5 -11
- package/dist/{vite → compiler}/source-edit.d.mts +3 -4
- package/dist/{vite → compiler}/source-edit.mjs +1 -1
- package/dist/{vite → compiler}/source-map.d.mts +4 -3
- package/dist/{vite → compiler}/source-map.mjs +3 -3
- package/dist/compiler/source.d.mts +7 -0
- package/dist/{vite → compiler}/source.mjs +1 -1
- package/dist/compiler/transform.d.mts +12 -0
- package/dist/{vite → compiler}/transform.mjs +37 -38
- package/dist/definition.d.mts +17 -25
- package/dist/definition.mjs +19 -35
- package/dist/engine/child-workflow.d.mts +5 -9
- package/dist/engine/child-workflow.mjs +46 -67
- package/dist/engine/command-identity.d.mts +5 -6
- package/dist/engine/command-identity.mjs +9 -5
- package/dist/engine/context.d.mts +17 -0
- package/dist/engine/create.d.mts +36 -94
- package/dist/engine/create.mjs +55 -260
- package/dist/engine/deterministic.d.mts +6 -11
- package/dist/engine/deterministic.mjs +47 -68
- package/dist/engine/durable-command.d.mts +5 -5
- package/dist/engine/durable-command.mjs +2 -2
- package/dist/engine/execution-service.d.mts +20 -24
- package/dist/engine/execution-service.mjs +54 -52
- package/dist/engine/hooks.d.mts +17 -39
- package/dist/engine/hooks.mjs +73 -94
- package/dist/engine/inspection.d.mts +23 -15
- package/dist/engine/inspection.mjs +55 -29
- package/dist/engine/lifecycle.d.mts +6 -12
- package/dist/engine/lifecycle.mjs +5 -5
- package/dist/engine/lock-replay.d.mts +8 -15
- package/dist/engine/lock-replay.mjs +12 -25
- package/dist/engine/lock.d.mts +10 -15
- package/dist/engine/lock.mjs +65 -51
- package/dist/engine/message.d.mts +14 -34
- package/dist/engine/message.mjs +94 -127
- package/dist/engine/observation.d.mts +9 -11
- package/dist/engine/observation.mjs +18 -27
- package/dist/engine/replay.d.mts +18 -19
- package/dist/engine/replay.mjs +32 -56
- package/dist/engine/resume.d.mts +16 -0
- package/dist/engine/resume.mjs +24 -0
- package/dist/engine/retry.d.mts +15 -19
- package/dist/engine/retry.mjs +17 -17
- package/dist/engine/run-data.d.mts +4 -8
- package/dist/engine/run-data.mjs +24 -22
- package/dist/engine/run-service.d.mts +24 -33
- package/dist/engine/run-service.mjs +125 -93
- package/dist/engine/run-utils.d.mts +11 -13
- package/dist/engine/run-utils.mjs +23 -46
- package/dist/engine/schedule.d.mts +8 -22
- package/dist/engine/schedule.mjs +37 -34
- package/dist/engine/serialization.d.mts +9 -6
- package/dist/engine/serialization.mjs +30 -21
- package/dist/engine/signals.d.mts +23 -0
- package/dist/engine/signals.mjs +41 -0
- package/dist/engine/start.d.mts +18 -0
- package/dist/engine/start.mjs +88 -0
- package/dist/engine/state.d.mts +37 -67
- package/dist/engine/state.mjs +127 -282
- package/dist/engine/step-api.d.mts +5 -8
- package/dist/engine/step-api.mjs +16 -16
- package/dist/engine/stream-reader.d.mts +12 -0
- package/dist/engine/stream-reader.mjs +154 -0
- package/dist/engine/stream.d.mts +9 -54
- package/dist/engine/stream.mjs +54 -196
- package/dist/engine/summary/recovery.d.mts +35 -0
- package/dist/engine/summary/recovery.mjs +363 -0
- package/dist/engine/summary/runs.d.mts +43 -0
- package/dist/engine/summary/runs.mjs +294 -0
- package/dist/engine/summary/step-attempts.d.mts +5 -10
- package/dist/engine/summary/step-attempts.mjs +157 -36
- package/dist/engine/summary/tally.d.mts +44 -0
- package/dist/engine/summary/tally.mjs +142 -0
- package/dist/engine/task.d.mts +4 -5
- package/dist/engine/task.mjs +40 -48
- package/dist/errors/base.d.mts +17 -77
- package/dist/errors/base.mjs +26 -327
- package/dist/errors/capability.d.mts +3 -6
- package/dist/errors/capability.mjs +4 -8
- package/dist/errors/codes.d.mts +116 -0
- package/dist/{types/error-code.mjs → errors/codes.mjs} +2 -17
- package/dist/errors/definition.d.mts +3 -17
- package/dist/errors/definition.mjs +5 -42
- package/dist/errors/failures.d.mts +17 -51
- package/dist/errors/failures.mjs +35 -102
- package/dist/errors/hook.d.mts +5 -9
- package/dist/errors/hook.mjs +4 -16
- package/dist/errors/implementation.d.mts +3 -6
- package/dist/errors/implementation.mjs +7 -12
- package/dist/errors/lock.d.mts +7 -20
- package/dist/errors/lock.mjs +8 -44
- package/dist/errors/message.d.mts +14 -59
- package/dist/errors/message.mjs +13 -39
- package/dist/errors/mod.d.mts +4 -5
- package/dist/errors/mod.mjs +5 -7
- package/dist/errors/records.d.mts +10 -4
- package/dist/errors/records.mjs +256 -256
- package/dist/errors/run.d.mts +27 -68
- package/dist/errors/run.mjs +31 -85
- package/dist/errors/schedule.d.mts +7 -18
- package/dist/errors/schedule.mjs +7 -39
- package/dist/errors/step.d.mts +12 -45
- package/dist/errors/step.mjs +13 -34
- package/dist/errors/stream.d.mts +8 -16
- package/dist/errors/stream.mjs +7 -41
- package/dist/esbuild.d.mts +6 -4
- package/dist/esbuild.mjs +2 -1
- package/dist/events/descriptors.d.mts +12 -241
- package/dist/events/descriptors.mjs +12 -5
- package/dist/history/projection.d.mts +4 -6
- package/dist/history/projection.mjs +22 -26
- package/dist/history/replay-projection.d.mts +44 -48
- package/dist/history/replay-projection.mjs +41 -50
- package/dist/history/{mod.d.mts → replay.d.mts} +16 -21
- package/dist/history/{mod.mjs → replay.mjs} +21 -25
- package/dist/history/sequencer.d.mts +10 -11
- package/dist/history/sequencer.mjs +11 -7
- package/dist/history/step-attempts.d.mts +4 -7
- package/dist/history/step-attempts.mjs +8 -9
- package/dist/history/timeline.d.mts +4 -13
- package/dist/history/timeline.mjs +46 -265
- package/dist/history/validator.d.mts +5 -7
- package/dist/history/validator.mjs +9 -24
- package/dist/hook-token.d.mts +7 -0
- package/dist/hook-token.mjs +32 -0
- package/dist/ids.d.mts +8 -0
- package/dist/ids.mjs +21 -0
- package/dist/message-options.d.mts +11 -5
- package/dist/message-options.mjs +9 -7
- package/dist/mod.d.mts +32 -36
- package/dist/mod.mjs +9 -13
- package/dist/otel/metrics.d.mts +31 -0
- package/dist/otel/metrics.mjs +60 -0
- package/dist/otel/mod.d.mts +3 -0
- package/dist/otel/mod.mjs +3 -0
- package/dist/otel/spans.d.mts +24 -0
- package/dist/otel/spans.mjs +218 -0
- package/dist/otel/support.d.mts +15 -8
- package/dist/otel/support.mjs +18 -40
- package/dist/{otel.d.mts → otel/telemetry.d.mts} +5 -6
- package/dist/otel/telemetry.mjs +305 -0
- package/dist/pagination.d.mts +6 -12
- package/dist/pagination.mjs +10 -14
- package/dist/registry.d.mts +8 -5
- package/dist/registry.mjs +19 -10
- package/dist/rolldown.d.mts +6 -4
- package/dist/rolldown.mjs +2 -1
- package/dist/rollup.d.mts +6 -4
- package/dist/rollup.mjs +2 -1
- package/dist/rspack.d.mts +6 -4
- package/dist/rspack.mjs +2 -1
- package/dist/run-status.d.mts +29 -0
- package/dist/run-status.mjs +42 -0
- package/dist/schema/common.d.mts +22 -0
- package/dist/schema/common.mjs +54 -0
- package/dist/schema/error.d.mts +17 -0
- package/dist/schema/error.mjs +39 -0
- package/dist/schema/events.d.mts +446 -0
- package/dist/schema/events.mjs +235 -0
- package/dist/schema/pagination.d.mts +5 -0
- package/dist/schema/pagination.mjs +11 -0
- package/dist/schema/persisted-value.d.mts +8 -0
- package/dist/schema/persisted-value.mjs +94 -0
- package/dist/schema/run.d.mts +51 -0
- package/dist/schema/run.mjs +88 -0
- package/dist/schema/store.d.mts +94 -0
- package/dist/schema/store.mjs +116 -0
- package/dist/step-definition.d.mts +4 -9
- package/dist/step-definition.mjs +2 -2
- package/dist/store/capabilities.d.mts +8 -9
- package/dist/store/capabilities.mjs +7 -7
- package/dist/store/cleanup.d.mts +9 -14
- package/dist/store/cleanup.mjs +86 -85
- package/dist/store/create.d.mts +28 -29
- package/dist/store/create.mjs +10 -11
- package/dist/store/events.d.mts +48 -0
- package/dist/store/events.mjs +263 -0
- package/dist/store/indexes.d.mts +25 -0
- package/dist/store/indexes.mjs +282 -0
- package/dist/store/instrumentation.d.mts +2 -3
- package/dist/store/instrumentation.mjs +30 -30
- package/dist/store/lock.d.mts +4 -5
- package/dist/store/lock.mjs +5 -7
- package/dist/store/materialization.d.mts +10 -17
- package/dist/store/materialization.mjs +39 -33
- package/dist/store/mod.d.mts +3 -3
- package/dist/store/mod.mjs +2 -2
- package/dist/store/query.d.mts +13 -17
- package/dist/store/query.mjs +13 -13
- package/dist/store/run.d.mts +25 -34
- package/dist/store/run.mjs +67 -108
- package/dist/store/schedule.d.mts +6 -8
- package/dist/store/schedule.mjs +11 -11
- package/dist/store/step-attempt.d.mts +9 -12
- package/dist/store/step-attempt.mjs +9 -9
- package/dist/store/storage-value.d.mts +3 -3
- package/dist/store/storage-value.mjs +17 -1
- package/dist/store/validation.d.mts +17 -20
- package/dist/store/validation.mjs +30 -33
- package/dist/store-keys.d.mts +35 -47
- package/dist/store-keys.mjs +9 -17
- package/dist/telemetry.d.mts +16 -16
- package/dist/telemetry.mjs +3 -3
- package/dist/temporal.d.mts +11 -16
- package/dist/temporal.mjs +8 -9
- package/dist/timer.d.mts +12 -10
- package/dist/timer.mjs +11 -3
- package/dist/types/cleanup.d.mts +13 -50
- package/dist/types/cleanup.mjs +1 -22
- package/dist/types/client.d.mts +101 -162
- package/dist/types/{vite.d.mts → compiler.d.mts} +17 -24
- package/dist/types/compiler.mjs +1 -0
- package/dist/types/definition.d.mts +22 -34
- package/dist/types/engine-options.d.mts +10 -17
- package/dist/types/engine.d.mts +15 -274
- package/dist/types/error.d.mts +15 -217
- package/dist/types/error.mjs +1 -48
- package/dist/types/events.d.mts +59 -2730
- package/dist/types/events.mjs +1 -283
- package/dist/types/hook.d.mts +27 -85
- package/dist/types/hook.mjs +1 -66
- package/dist/types/ids.d.mts +9 -0
- package/dist/types/ids.mjs +1 -0
- package/dist/types/lock.d.mts +8 -26
- package/dist/types/lock.mjs +1 -18
- package/dist/types/message.d.mts +29 -43
- package/dist/types/observation.d.mts +43 -58
- package/dist/types/pagination.d.mts +6 -22
- package/dist/types/pagination.mjs +1 -13
- package/dist/types/result.d.mts +11 -43
- package/dist/types/retry.d.mts +7 -14
- package/dist/types/run-list.d.mts +9 -11
- package/dist/types/run-options.d.mts +25 -32
- package/dist/types/run.d.mts +35 -315
- package/dist/types/run.mjs +1 -207
- package/dist/types/runtime.d.mts +33 -145
- package/dist/types/runtime.mjs +1 -21
- package/dist/types/schedule.d.mts +13 -72
- package/dist/types/schedule.mjs +1 -48
- package/dist/types/step-attempts.d.mts +65 -261
- package/dist/types/step-attempts.mjs +1 -43
- package/dist/types/step.d.mts +66 -77
- package/dist/types/step.mjs +1 -5
- package/dist/types/store.d.mts +50 -182
- package/dist/types/stream.d.mts +19 -40
- package/dist/types/summary.d.mts +174 -278
- package/dist/types/telemetry.d.mts +23 -28
- package/dist/types/telemetry.mjs +1 -9
- package/dist/types/timeline.d.mts +46 -233
- package/dist/types/worker.d.mts +22 -29
- package/dist/values.d.mts +15 -0
- package/dist/values.mjs +57 -0
- package/dist/vite.d.mts +5 -6
- package/dist/vite.mjs +3 -4
- package/dist/webpack.d.mts +6 -4
- package/dist/webpack.mjs +2 -1
- package/dist/worker/error.d.mts +2 -9
- package/dist/worker/error.mjs +20 -32
- package/dist/worker/missing-implementation.d.mts +19 -0
- package/dist/worker/missing-implementation.mjs +62 -0
- package/dist/worker/worker.d.mts +18 -0
- package/dist/{worker.mjs → worker/worker.mjs} +64 -118
- package/package.json +28 -47
- package/dist/engine/execution-api.d.mts +0 -29
- package/dist/engine/execution-api.mjs +0 -33
- package/dist/engine/inspection-api.d.mts +0 -34
- package/dist/engine/inspection-api.mjs +0 -78
- package/dist/engine/mod.d.mts +0 -4
- package/dist/engine/mod.mjs +0 -2
- package/dist/engine/recovery.d.mts +0 -26
- package/dist/engine/recovery.mjs +0 -92
- package/dist/engine/retry-policy.d.mts +0 -4
- package/dist/engine/retry-policy.mjs +0 -4
- package/dist/engine/start-api.d.mts +0 -30
- package/dist/engine/start-api.mjs +0 -99
- package/dist/engine/summary/active-events.d.mts +0 -34
- package/dist/engine/summary/active-events.mjs +0 -69
- package/dist/engine/summary/child-workflow-runs.d.mts +0 -24
- package/dist/engine/summary/child-workflow-runs.mjs +0 -138
- package/dist/engine/summary/child-workflow-waits.d.mts +0 -21
- package/dist/engine/summary/child-workflow-waits.mjs +0 -67
- package/dist/engine/summary/recovery-child-workflow-waits.d.mts +0 -11
- package/dist/engine/summary/recovery-child-workflow-waits.mjs +0 -89
- package/dist/engine/summary/recovery-due-runs.d.mts +0 -16
- package/dist/engine/summary/recovery-due-runs.mjs +0 -52
- package/dist/engine/summary/recovery-failed-runs.d.mts +0 -14
- package/dist/engine/summary/recovery-failed-runs.mjs +0 -33
- package/dist/engine/summary/recovery-lease-runs.d.mts +0 -16
- package/dist/engine/summary/recovery-lease-runs.mjs +0 -69
- package/dist/engine/summary/recovery-locks.d.mts +0 -18
- package/dist/engine/summary/recovery-locks.mjs +0 -100
- package/dist/engine/summary/recovery-message-waits.d.mts +0 -11
- package/dist/engine/summary/recovery-message-waits.mjs +0 -74
- package/dist/engine/summary/recovery-retry-runs.d.mts +0 -17
- package/dist/engine/summary/recovery-retry-runs.mjs +0 -65
- package/dist/engine/summary/recovery-run-timestamps.d.mts +0 -13
- package/dist/engine/summary/recovery-run-timestamps.mjs +0 -18
- package/dist/engine/summary/recovery-runs.d.mts +0 -23
- package/dist/engine/summary/recovery-runs.mjs +0 -54
- package/dist/engine/summary/recovery-schedules.d.mts +0 -10
- package/dist/engine/summary/recovery-schedules.mjs +0 -46
- package/dist/engine/summary/recovery-sleep-waits.d.mts +0 -10
- package/dist/engine/summary/recovery-sleep-waits.mjs +0 -53
- package/dist/engine/summary/recovery-waits.d.mts +0 -21
- package/dist/engine/summary/recovery-waits.mjs +0 -29
- package/dist/engine/summary/run-availability.d.mts +0 -13
- package/dist/engine/summary/run-availability.mjs +0 -37
- package/dist/engine/summary/run-cleanup.d.mts +0 -14
- package/dist/engine/summary/run-cleanup.mjs +0 -44
- package/dist/engine/summary/run-failure.d.mts +0 -14
- package/dist/engine/summary/run-failure.mjs +0 -62
- package/dist/engine/summary/run-hooks.d.mts +0 -14
- package/dist/engine/summary/run-hooks.mjs +0 -63
- package/dist/engine/summary/run-lease.d.mts +0 -11
- package/dist/engine/summary/run-lease.mjs +0 -64
- package/dist/engine/summary/run-message-waits.d.mts +0 -15
- package/dist/engine/summary/run-message-waits.mjs +0 -62
- package/dist/engine/summary/run-metrics.d.mts +0 -31
- package/dist/engine/summary/run-metrics.mjs +0 -93
- package/dist/engine/summary/run-retry.d.mts +0 -9
- package/dist/engine/summary/run-retry.mjs +0 -69
- package/dist/engine/summary/run-sleeps.d.mts +0 -15
- package/dist/engine/summary/run-sleeps.mjs +0 -61
- package/dist/engine/summary/run-state.d.mts +0 -26
- package/dist/engine/summary/run-state.mjs +0 -48
- package/dist/engine/summary/run-status.d.mts +0 -16
- package/dist/engine/summary/run-status.mjs +0 -35
- package/dist/engine/summary/run-streams.d.mts +0 -14
- package/dist/engine/summary/run-streams.mjs +0 -46
- package/dist/engine/summary/run-transition.d.mts +0 -9
- package/dist/engine/summary/run-transition.mjs +0 -39
- package/dist/engine/summary/run-workflow.d.mts +0 -9
- package/dist/engine/summary/run-workflow.mjs +0 -47
- package/dist/engine/summary/step-attempt-active-child-workflows.d.mts +0 -13
- package/dist/engine/summary/step-attempt-active-child-workflows.mjs +0 -55
- package/dist/engine/summary/step-attempt-active-fields.d.mts +0 -23
- package/dist/engine/summary/step-attempt-active-fields.mjs +0 -14
- package/dist/engine/summary/step-attempt-active-message-waits.d.mts +0 -12
- package/dist/engine/summary/step-attempt-active-message-waits.mjs +0 -47
- package/dist/engine/summary/step-attempt-active-sleeps.d.mts +0 -19
- package/dist/engine/summary/step-attempt-active-sleeps.mjs +0 -44
- package/dist/engine/summary/step-attempt-buckets.d.mts +0 -22
- package/dist/engine/summary/step-attempt-buckets.mjs +0 -152
- package/dist/engine/summary/step-attempt-failure.d.mts +0 -12
- package/dist/engine/summary/step-attempt-failure.mjs +0 -61
- package/dist/engine/summary/step-attempt-lifecycle.d.mts +0 -13
- package/dist/engine/summary/step-attempt-lifecycle.mjs +0 -19
- package/dist/engine/summary.d.mts +0 -32
- package/dist/engine/summary.mjs +0 -37
- package/dist/errors/details.d.mts +0 -13
- package/dist/errors/details.mjs +0 -66
- package/dist/errors/record-view.d.mts +0 -11
- package/dist/errors/record-view.mjs +0 -24
- package/dist/errors/runtime.d.mts +0 -12
- package/dist/errors/runtime.mjs +0 -24
- package/dist/events/mod.d.mts +0 -3
- package/dist/events/mod.mjs +0 -2
- package/dist/history/attempt-key.d.mts +0 -6
- package/dist/history/attempt-key.mjs +0 -7
- package/dist/inspection/mod.d.mts +0 -5
- package/dist/inspection/mod.mjs +0 -3
- package/dist/otel.mjs +0 -590
- package/dist/runtime.d.mts +0 -35
- package/dist/runtime.mjs +0 -198
- package/dist/store/append-projection.d.mts +0 -15
- package/dist/store/append-projection.mjs +0 -26
- package/dist/store/compaction.d.mts +0 -5
- package/dist/store/compaction.mjs +0 -8
- package/dist/store/event-append-project.d.mts +0 -15
- package/dist/store/event-append-project.mjs +0 -77
- package/dist/store/event-append.d.mts +0 -37
- package/dist/store/event-append.mjs +0 -80
- package/dist/store/event-history.d.mts +0 -22
- package/dist/store/event-history.mjs +0 -75
- package/dist/store/event.d.mts +0 -10
- package/dist/store/event.mjs +0 -28
- package/dist/store/idempotency.d.mts +0 -10
- package/dist/store/idempotency.mjs +0 -167
- package/dist/store/message-index.d.mts +0 -21
- package/dist/store/message-index.mjs +0 -122
- package/dist/store/revision.d.mts +0 -4
- package/dist/store/revision.mjs +0 -7
- package/dist/store/schema.d.mts +0 -14
- package/dist/store/schema.mjs +0 -17
- package/dist/types/common.d.mts +0 -20
- package/dist/types/common.mjs +0 -16
- package/dist/types/error-code.d.mts +0 -256
- package/dist/types/message-id.d.mts +0 -7
- package/dist/types/message-id.mjs +0 -5
- package/dist/types/run-id.d.mts +0 -7
- package/dist/types/run-id.mjs +0 -5
- package/dist/types/step-id.d.mts +0 -7
- package/dist/types/step-id.mjs +0 -5
- package/dist/types/stream-id.d.mts +0 -7
- package/dist/types/stream-id.mjs +0 -5
- package/dist/types/worker-id.d.mts +0 -7
- package/dist/types/worker-id.mjs +0 -5
- package/dist/utility.d.mts +0 -49
- package/dist/utility.mjs +0 -122
- package/dist/vite/ast.d.mts +0 -23
- package/dist/vite/generated-name.d.mts +0 -7
- package/dist/vite/generated-name.mjs +0 -9
- package/dist/vite/manifest.d.mts +0 -7
- package/dist/vite/plugin.d.mts +0 -7
- package/dist/vite/safety.d.mts +0 -12
- package/dist/vite/source.d.mts +0 -7
- package/dist/vite/transform.d.mts +0 -7
- package/dist/webhook.d.mts +0 -16
- package/dist/webhook.mjs +0 -17
- package/dist/worker.d.mts +0 -19
- /package/dist/{types/vite.mjs → engine/context.mjs} +0 -0
|
@@ -1,134 +1,166 @@
|
|
|
1
|
+
import { normalizeAttributePatch } from "../attributes.mjs";
|
|
2
|
+
import { WorkflowErrorCode } from "../errors/codes.mjs";
|
|
1
3
|
import { WorkflowStateError } from "../errors/base.mjs";
|
|
2
4
|
import { WorkflowPermanentFailureError } from "../errors/failures.mjs";
|
|
3
|
-
import { getRequiredRun, isScheduledWorkflowRunStatus, nextRunAttempt } from "../utility.mjs";
|
|
4
|
-
import { normalizeWorkflowAttributePatch } from "../attributes.mjs";
|
|
5
5
|
import "../errors/mod.mjs";
|
|
6
|
-
import {
|
|
7
|
-
import "
|
|
6
|
+
import { defineFromName } from "../definition.mjs";
|
|
7
|
+
import { isScheduledRunStatus, nextRunAttempt } from "../run-status.mjs";
|
|
8
|
+
import { getRequiredRun } from "../store/query.mjs";
|
|
8
9
|
import { serializeError, toPersistedValue } from "./serialization.mjs";
|
|
9
|
-
import { cancelRunWithChildren, releaseLocksForRun, setRunAttributesIfCurrent, transitionRunAfterStaleLeaseRelease,
|
|
10
|
+
import { cancelRunWithChildren, releaseLocksForRun, setRunAttributesIfCurrent, transitionRunAfterStaleLeaseRelease, transitionRunToFailed, transitionRunToManualRetry, transitionRunToRescheduled, updateRunMetadataIfCurrent } from "./state.mjs";
|
|
11
|
+
import { retentionCleanupOptions } from "./run-utils.mjs";
|
|
10
12
|
//#region src/engine/run-service.ts
|
|
11
|
-
async function
|
|
12
|
-
const sourceRun = await getRequiredRun(
|
|
13
|
-
const
|
|
14
|
-
const
|
|
15
|
-
const
|
|
13
|
+
async function rerunRun(context, startWorkflow, runId, rerunOptions) {
|
|
14
|
+
const sourceRun = await getRequiredRun(context.store, runId);
|
|
15
|
+
const definition = await resolveRerunDefinition(sourceRun, rerunOptions);
|
|
16
|
+
const start = rerunOptions?.start;
|
|
17
|
+
const contextOptions = { context: sourceRun.context };
|
|
16
18
|
return await startWorkflow(definition, sourceRun.input, {
|
|
17
|
-
...
|
|
19
|
+
...contextOptions,
|
|
18
20
|
...start
|
|
19
21
|
});
|
|
20
22
|
}
|
|
21
|
-
async function
|
|
23
|
+
async function resolveRerunDefinition(sourceRun, options) {
|
|
22
24
|
const workflowName = options?.workflowName ?? sourceRun.workflowName;
|
|
23
|
-
const resolvedWorkflowVersion = await
|
|
24
|
-
return
|
|
25
|
+
const resolvedWorkflowVersion = await resolveVersion(workflowName, options !== void 0 && "workflowVersion" in options ? options.workflowVersion : sourceRun.workflowVersion, options?.workflowVersionResolver);
|
|
26
|
+
return defineFromName(workflowName, resolvedWorkflowVersion);
|
|
25
27
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
const now = service.now();
|
|
29
|
-
const availableAt = options?.availableAt ?? now;
|
|
28
|
+
/** Applies an operator change to a run, retrying when another writer updates the run first. */
|
|
29
|
+
async function applyRunOperation(context, lifecycle, runId, operation) {
|
|
30
30
|
for (let attempt = 0; attempt < 16; attempt++) {
|
|
31
|
-
const current = await getRequiredRun(
|
|
32
|
-
|
|
33
|
-
if (
|
|
34
|
-
const updated = await
|
|
31
|
+
const current = await getRequiredRun(context.store, runId);
|
|
32
|
+
const next = operation.next(current);
|
|
33
|
+
if (next === void 0) return current;
|
|
34
|
+
const updated = await context.store.updateRunIfCurrent(current, next);
|
|
35
35
|
if (updated !== void 0) {
|
|
36
|
-
await
|
|
36
|
+
await operation.afterUpdate?.(updated);
|
|
37
37
|
await lifecycle.emitLifecycleEvent(updated, current);
|
|
38
38
|
return updated;
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
|
-
WorkflowStateError.
|
|
41
|
+
throw new WorkflowStateError(operation.failureMessage, {
|
|
42
|
+
code: operation.failureCode,
|
|
43
|
+
details: { runId }
|
|
44
|
+
});
|
|
42
45
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const current = await getRequiredRun(service.store, runId);
|
|
49
|
-
if (isScheduledWorkflowRunStatus(current.status)) return current;
|
|
50
|
-
if (current.status !== "running") WorkflowStateError.staleLeaseReleaseRequiresRunning(runId);
|
|
51
|
-
if (current.workerId !== void 0 && typeof current.workerId === "string" && current.workerId.trim() !== "" && current.leaseExpiresAt !== void 0 && Temporal.Instant.compare(current.leaseExpiresAt, now) > 0) WorkflowStateError.runLeaseStillActive(runId);
|
|
52
|
-
const updated = await service.store.updateRunIfCurrent(current, transitionRunAfterStaleLeaseRelease(current, now, availableAt));
|
|
53
|
-
if (updated !== void 0) {
|
|
54
|
-
await lifecycle.emitLifecycleEvent(updated, current);
|
|
55
|
-
return updated;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
WorkflowStateError.failedStaleRunLeaseRelease(runId);
|
|
46
|
+
function stateError(message, code, runId) {
|
|
47
|
+
return new WorkflowStateError(message, {
|
|
48
|
+
code,
|
|
49
|
+
details: { runId }
|
|
50
|
+
});
|
|
59
51
|
}
|
|
60
|
-
async function
|
|
61
|
-
const
|
|
62
|
-
const
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
52
|
+
async function rescheduleWorkflowRun(context, lifecycle, runId, rescheduleOptions) {
|
|
53
|
+
const now = context.now();
|
|
54
|
+
const availableAt = rescheduleOptions?.availableAt ?? now;
|
|
55
|
+
return await applyRunOperation(context, lifecycle, runId, {
|
|
56
|
+
next: (current) => {
|
|
57
|
+
if (!isScheduledRunStatus(current.status)) throw stateError(`Workflow run cannot be rescheduled unless pending or waiting: ${runId}`, WorkflowErrorCode.STATE_RUN_CANNOT_BE_RESCHEDULED, runId);
|
|
58
|
+
return current.availableAt !== void 0 && Temporal.Instant.compare(current.availableAt, availableAt) === 0 && current.lastTransitionReason === "rescheduled" ? void 0 : transitionRunToRescheduled(current, now, availableAt);
|
|
59
|
+
},
|
|
60
|
+
afterUpdate: async (updated) => {
|
|
61
|
+
await releaseLocksForRun(context.store, updated.id, now);
|
|
62
|
+
},
|
|
63
|
+
failureMessage: `Failed to reschedule workflow run ${runId}`,
|
|
64
|
+
failureCode: WorkflowErrorCode.STATE_RUN_RESCHEDULE_FAILED
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async function releaseStaleWorkflowRunLease(context, lifecycle, runId, releaseOptions) {
|
|
68
|
+
const now = context.now();
|
|
69
|
+
const availableAt = releaseOptions?.availableAt ?? now;
|
|
70
|
+
return await applyRunOperation(context, lifecycle, runId, {
|
|
71
|
+
next: (current) => {
|
|
72
|
+
if (isScheduledRunStatus(current.status)) return;
|
|
73
|
+
if (current.status !== "running") throw stateError(`Workflow run stale lease cannot be released unless running: ${runId}`, WorkflowErrorCode.STATE_STALE_LEASE_RELEASE_REQUIRES_RUNNING, runId);
|
|
74
|
+
if (current.workerId !== void 0 && current.workerId.trim() !== "" && current.leaseExpiresAt !== void 0 && Temporal.Instant.compare(current.leaseExpiresAt, now) > 0) throw stateError(`Workflow run lease is still active: ${runId}`, WorkflowErrorCode.STATE_RUN_LEASE_STILL_ACTIVE, runId);
|
|
75
|
+
return transitionRunAfterStaleLeaseRelease(current, now, availableAt);
|
|
76
|
+
},
|
|
77
|
+
failureMessage: `Failed to release stale workflow run lease ${runId}`,
|
|
78
|
+
failureCode: WorkflowErrorCode.STATE_STALE_RUN_LEASE_RELEASE_FAILED
|
|
79
|
+
});
|
|
78
80
|
}
|
|
79
|
-
async function
|
|
80
|
-
const now =
|
|
81
|
+
async function retryFailedWorkflowRun(context, lifecycle, runId, retryOptions) {
|
|
82
|
+
const now = context.now();
|
|
83
|
+
const availableAt = retryOptions?.availableAt ?? now;
|
|
84
|
+
const force = retryOptions?.force === true;
|
|
85
|
+
return await applyRunOperation(context, lifecycle, runId, {
|
|
86
|
+
next: (current) => {
|
|
87
|
+
if (isScheduledRunStatus(current.status)) return;
|
|
88
|
+
if (current.status !== "failed") throw stateError(`Workflow run cannot be retried unless failed: ${runId}`, WorkflowErrorCode.STATE_RUN_RETRY_REQUIRES_FAILED, runId);
|
|
89
|
+
if (current.lastTransitionReason === "permanent_failure" && !force) throw stateError(`Workflow run cannot be retried after permanent failure without force: ${runId}`, WorkflowErrorCode.STATE_RUN_RETRY_REQUIRES_FORCE_AFTER_PERMANENT_FAILURE, runId);
|
|
90
|
+
if (!force && current.retryReason === void 0 && current.retryAt === void 0) throw stateError(`Workflow failed run retry requires force when no retry metadata exists: ${runId}`, WorkflowErrorCode.STATE_FAILED_RUN_RETRY_REQUIRES_FORCE, runId);
|
|
91
|
+
return transitionRunToManualRetry(current, now, availableAt, nextRunAttempt(current.retryAttempt));
|
|
92
|
+
},
|
|
93
|
+
failureMessage: `Failed to retry workflow run ${runId}`,
|
|
94
|
+
failureCode: WorkflowErrorCode.STATE_RUN_RETRY_FAILED
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
async function markWorkflowRunPermanentlyFailed(context, lifecycle, runId, permanentFailureOptions) {
|
|
98
|
+
const now = context.now();
|
|
81
99
|
const reason = permanentFailureOptions.reason;
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
100
|
+
return await applyRunOperation(context, lifecycle, runId, {
|
|
101
|
+
next: (current) => {
|
|
102
|
+
if (current.status === "completed" || current.status === "canceled") throw new WorkflowStateError(`Workflow run cannot be marked permanently failed from ${current.status}: ${runId}`, {
|
|
103
|
+
code: WorkflowErrorCode.STATE_PERMANENT_FAILURE_STATUS_INVALID,
|
|
104
|
+
details: {
|
|
105
|
+
runId,
|
|
106
|
+
status: current.status
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
if (current.status === "failed" && current.lastTransitionReason === "permanent_failure" && current.error?.details?.reason === reason) return;
|
|
110
|
+
return transitionRunToFailed(current, serializeError(new WorkflowPermanentFailureError({
|
|
111
|
+
runId,
|
|
112
|
+
reason
|
|
113
|
+
})), now, "permanent_failure");
|
|
114
|
+
},
|
|
115
|
+
failureMessage: `Failed to mark workflow run permanently failed ${runId}`,
|
|
116
|
+
failureCode: WorkflowErrorCode.STATE_PERMANENT_RUN_FAILURE_FAILED
|
|
117
|
+
});
|
|
96
118
|
}
|
|
97
|
-
async function updateWorkflowRunMetadata(
|
|
98
|
-
const persistedMetadata = toPersistedValue(metadata, "workflow run metadata",
|
|
99
|
-
const timestamp =
|
|
100
|
-
const previousRun = await getRequiredRun(
|
|
101
|
-
const updatedRun = await updateRunMetadataIfCurrent(
|
|
119
|
+
async function updateWorkflowRunMetadata(context, lifecycle, runId, metadata) {
|
|
120
|
+
const persistedMetadata = toPersistedValue(metadata, "workflow run metadata", context.limits);
|
|
121
|
+
const timestamp = context.now();
|
|
122
|
+
const previousRun = await getRequiredRun(context.store, runId);
|
|
123
|
+
const updatedRun = await updateRunMetadataIfCurrent(context.store, runId, persistedMetadata, timestamp);
|
|
102
124
|
lifecycle.emitRunMetadataUpdated(updatedRun, previousRun);
|
|
103
125
|
return updatedRun;
|
|
104
126
|
}
|
|
105
|
-
async function
|
|
106
|
-
const normalized =
|
|
107
|
-
const timestamp =
|
|
108
|
-
return await setRunAttributesIfCurrent(
|
|
127
|
+
async function setRunAttributes(context, runId, attributes) {
|
|
128
|
+
const normalized = normalizeAttributePatch(attributes);
|
|
129
|
+
const timestamp = context.now();
|
|
130
|
+
return await setRunAttributesIfCurrent(context.store, runId, normalized, timestamp);
|
|
109
131
|
}
|
|
110
|
-
async function cancelWorkflowRun(
|
|
111
|
-
const previousRun = await getRequiredRun(
|
|
112
|
-
const canceledRun = await cancelRunWithChildren(
|
|
132
|
+
async function cancelWorkflowRun(context, lifecycle, runId) {
|
|
133
|
+
const previousRun = await getRequiredRun(context.store, runId);
|
|
134
|
+
const canceledRun = await cancelRunWithChildren(context.store, runId, context.now());
|
|
113
135
|
if (previousRun.status !== "canceled") await lifecycle.emitLifecycleEvent(canceledRun, previousRun);
|
|
114
136
|
return canceledRun;
|
|
115
137
|
}
|
|
116
|
-
async function
|
|
138
|
+
async function resolveVersion(workflowName, fallbackVersion, resolver) {
|
|
117
139
|
if (resolver === void 0) return fallbackVersion;
|
|
118
|
-
const resolved = await resolver(workflowName,
|
|
119
|
-
return
|
|
140
|
+
const resolved = await resolver(workflowName, defineFromName(workflowName, fallbackVersion));
|
|
141
|
+
return resolved !== void 0 && resolved.trim() !== "" ? resolved : fallbackVersion;
|
|
120
142
|
}
|
|
121
|
-
async function
|
|
122
|
-
const version = await
|
|
143
|
+
async function resolveStartSpec(definition, options) {
|
|
144
|
+
const version = await resolveVersion(definition.name, options?.workflowVersion ?? definition.version, options?.workflowVersionResolver);
|
|
123
145
|
if (version === definition.version) return definition;
|
|
124
146
|
return {
|
|
125
147
|
...definition,
|
|
126
148
|
version,
|
|
127
149
|
config: {
|
|
128
150
|
...definition.config,
|
|
129
|
-
|
|
151
|
+
version
|
|
130
152
|
}
|
|
131
153
|
};
|
|
132
154
|
}
|
|
155
|
+
async function cleanupRuns(context, options) {
|
|
156
|
+
const result = await context.store.cleanupRuns(options);
|
|
157
|
+
context.observation.emitCleanupCompleted(result);
|
|
158
|
+
return result;
|
|
159
|
+
}
|
|
160
|
+
async function applyRetentionPolicy(context, options) {
|
|
161
|
+
const result = await context.store.cleanupRuns(retentionCleanupOptions(options, context.now));
|
|
162
|
+
context.observation.emitRetentionApplied(result);
|
|
163
|
+
return result;
|
|
164
|
+
}
|
|
133
165
|
//#endregion
|
|
134
|
-
export { cancelWorkflowRun, markWorkflowRunPermanentlyFailed, releaseStaleWorkflowRunLease,
|
|
166
|
+
export { applyRetentionPolicy, cancelWorkflowRun, cleanupRuns, markWorkflowRunPermanentlyFailed, releaseStaleWorkflowRunLease, rerunRun, rescheduleWorkflowRun, resolveStartSpec, retryFailedWorkflowRun, setRunAttributes, updateWorkflowRunMetadata };
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
import { RunId } from "../types/
|
|
1
|
+
import { RunId } from "../types/ids.mjs";
|
|
2
2
|
import { CleanupRunsOptions, RetentionPolicyOptions } from "../types/cleanup.mjs";
|
|
3
3
|
import { WorkflowDefinition } from "../types/definition.mjs";
|
|
4
|
-
import { CompletedResult, ExecutionResult
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
4
|
+
import { CompletedResult, ExecutionResult } from "../types/result.mjs";
|
|
5
|
+
import { RunRecord } from "../types/run.mjs";
|
|
6
|
+
import { WorkflowStore } from "../types/store.mjs";
|
|
7
7
|
//#region src/engine/run-utils.d.ts
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
declare function
|
|
12
|
-
declare function
|
|
13
|
-
declare function
|
|
14
|
-
|
|
15
|
-
//#endregion
|
|
16
|
-
export { makeCanceledRunResult, makeCompletedRunResult, readRunResult, retentionCleanupOptions, workflowHandle };
|
|
8
|
+
export declare function retentionCleanupOptions(options: RetentionPolicyOptions, engineNow: () => Temporal.Instant): CleanupRunsOptions;
|
|
9
|
+
export declare function readRunResult<TOutput>(store: WorkflowStore, definition: WorkflowDefinition<unknown, TOutput, unknown>, runId: RunId, fallbackAvailableAt: Temporal.Instant): Promise<ExecutionResult<TOutput>>;
|
|
10
|
+
/** The result of a run that has not completed: failed, canceled, or still waiting. */
|
|
11
|
+
export declare function unfinishedRunResult<TOutput>(run: RunRecord, fallbackAvailableAt: Temporal.Instant): ExecutionResult<TOutput>;
|
|
12
|
+
export declare function makeCompletedRunResult<TOutput>(definition: WorkflowDefinition<unknown, TOutput, unknown>, run: RunRecord): CompletedResult<TOutput>;
|
|
13
|
+
export declare function makeCanceledRunResult<TOutput>(run: RunRecord): ExecutionResult<TOutput>;
|
|
14
|
+
//#endregion
|
|
@@ -1,61 +1,36 @@
|
|
|
1
1
|
import { WorkflowRunCanceledError } from "../errors/run.mjs";
|
|
2
|
-
import { getRequiredRun } from "../utility.mjs";
|
|
3
2
|
import "../errors/mod.mjs";
|
|
3
|
+
import { getRequiredRun } from "../store/query.mjs";
|
|
4
4
|
import { serializeError } from "./serialization.mjs";
|
|
5
|
+
import { requireDefinitionMatchesRun } from "./state.mjs";
|
|
5
6
|
//#region src/engine/run-utils.ts
|
|
6
7
|
function retentionCleanupOptions(options, engineNow) {
|
|
7
8
|
return {
|
|
8
9
|
finishedAtBefore: (options.now === void 0 ? engineNow() : options.now).toZonedDateTimeISO("UTC").subtract(options.olderThan).toInstant(),
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
10
|
+
status: options.status,
|
|
11
|
+
workflowName: options.workflowName,
|
|
12
|
+
workflowVersion: options.workflowVersion,
|
|
13
|
+
idempotencyKey: options.idempotencyKey,
|
|
14
|
+
parentRunId: options.parentRunId,
|
|
15
|
+
parentStepId: options.parentStepId,
|
|
16
|
+
parentStepName: options.parentStepName,
|
|
17
|
+
parentStepAttempt: options.parentStepAttempt,
|
|
18
|
+
dryRun: options.dryRun,
|
|
19
|
+
limit: options.limit
|
|
19
20
|
};
|
|
20
21
|
}
|
|
21
|
-
function
|
|
22
|
-
return {
|
|
23
|
-
runId,
|
|
24
|
-
workflowName: definition.name,
|
|
25
|
-
...definition.version === void 0 ? {} : { workflowVersion: definition.version },
|
|
26
|
-
async getRun() {
|
|
27
|
-
return await getRequiredRun(store, runId);
|
|
28
|
-
},
|
|
29
|
-
async status() {
|
|
30
|
-
return (await getRequiredRun(store, runId)).status;
|
|
31
|
-
},
|
|
32
|
-
async events() {
|
|
33
|
-
return await store.getEvents(runId);
|
|
34
|
-
},
|
|
35
|
-
async timeline() {
|
|
36
|
-
return await operations.getTimeline(runId);
|
|
37
|
-
},
|
|
38
|
-
result: async () => await readRunResult(store, runId, now()),
|
|
39
|
-
async setMetadata(metadata) {
|
|
40
|
-
return await operations.setMetadata(runId, metadata);
|
|
41
|
-
},
|
|
42
|
-
async setAttributes(attributes) {
|
|
43
|
-
return await operations.setAttributes(runId, attributes);
|
|
44
|
-
},
|
|
45
|
-
async cancel() {
|
|
46
|
-
return await operations.cancel(runId);
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
async function readRunResult(store, runId, fallbackAvailableAt) {
|
|
22
|
+
async function readRunResult(store, definition, runId, fallbackAvailableAt) {
|
|
51
23
|
const run = await getRequiredRun(store, runId);
|
|
52
|
-
|
|
24
|
+
return run.status === "completed" ? makeCompletedRunResult(definition, run) : unfinishedRunResult(run, fallbackAvailableAt);
|
|
25
|
+
}
|
|
26
|
+
/** The result of a run that has not completed: failed, canceled, or still waiting. */
|
|
27
|
+
function unfinishedRunResult(run, fallbackAvailableAt) {
|
|
53
28
|
if (run.status === "failed") return {
|
|
54
29
|
kind: "failed",
|
|
55
30
|
run,
|
|
56
31
|
error: run.error ?? {
|
|
57
32
|
name: "WorkflowError",
|
|
58
|
-
message: `Workflow run failed: ${
|
|
33
|
+
message: `Workflow run failed: ${run.id}`
|
|
59
34
|
}
|
|
60
35
|
};
|
|
61
36
|
if (run.status === "canceled") return makeCanceledRunResult(run);
|
|
@@ -65,7 +40,9 @@ async function readRunResult(store, runId, fallbackAvailableAt) {
|
|
|
65
40
|
availableAt: run.availableAt ?? fallbackAvailableAt
|
|
66
41
|
};
|
|
67
42
|
}
|
|
68
|
-
function makeCompletedRunResult(run) {
|
|
43
|
+
function makeCompletedRunResult(definition, run) {
|
|
44
|
+
requireDefinitionMatchesRun(definition, run);
|
|
45
|
+
if (run.status !== "completed") throw new TypeError("A completed workflow result requires a completed run");
|
|
69
46
|
return {
|
|
70
47
|
kind: "completed",
|
|
71
48
|
run,
|
|
@@ -76,8 +53,8 @@ function makeCanceledRunResult(run) {
|
|
|
76
53
|
return {
|
|
77
54
|
kind: "failed",
|
|
78
55
|
run,
|
|
79
|
-
error: run.error ?? serializeError(WorkflowRunCanceledError
|
|
56
|
+
error: run.error ?? serializeError(new WorkflowRunCanceledError(run.id))
|
|
80
57
|
};
|
|
81
58
|
}
|
|
82
59
|
//#endregion
|
|
83
|
-
export { makeCanceledRunResult, makeCompletedRunResult, readRunResult, retentionCleanupOptions,
|
|
60
|
+
export { makeCanceledRunResult, makeCompletedRunResult, readRunResult, retentionCleanupOptions, unfinishedRunResult };
|
|
@@ -1,25 +1,11 @@
|
|
|
1
|
-
import { RunId } from "../types/run-id.mjs";
|
|
2
1
|
import { ScheduleConfig, ScheduleId, ScheduleRecord, ScheduleStatus, TickSchedulesOptions, TickSchedulesResult } from "../types/schedule.mjs";
|
|
3
2
|
import { WorkflowDefinition } from "../types/definition.mjs";
|
|
4
|
-
import "../types/
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { WorkflowRunCanceler, WorkflowRunStarter, WorkflowScheduleRunObserver } from "../types/engine.mjs";
|
|
3
|
+
import { WorkflowStore } from "../types/store.mjs";
|
|
4
|
+
import { ExecutionLimits } from "../types/engine-options.mjs";
|
|
5
|
+
import { WorkflowEngine } from "./create.mjs";
|
|
8
6
|
//#region src/engine/schedule.d.ts
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
declare function
|
|
13
|
-
|
|
14
|
-
declare function updateScheduleStatus(store: WorkflowScheduleReaderRepository & WorkflowScheduleConditionalWriterRepository, scheduleId: ScheduleId, status: ScheduleStatus, now: Temporal.Instant): Promise<ScheduleRecord>;
|
|
15
|
-
declare function workflowScheduleFireTimes(schedule: ScheduleRecord, now: Temporal.Instant): readonly Temporal.Instant[];
|
|
16
|
-
declare function advanceSchedule(store: WorkflowScheduleConditionalWriterRepository, schedule: ScheduleRecord, now: Temporal.Instant, updatedAt: Temporal.Instant, fired?: {
|
|
17
|
-
readonly fireAt: Temporal.Instant;
|
|
18
|
-
readonly runId: RunId;
|
|
19
|
-
}): Promise<ScheduleRecord | undefined>;
|
|
20
|
-
declare function bufferSchedule(store: WorkflowScheduleConditionalWriterRepository, schedule: ScheduleRecord, fireTimes: readonly Temporal.Instant[], now: Temporal.Instant, updatedAt: Temporal.Instant): Promise<ScheduleRecord | undefined>;
|
|
21
|
-
declare function hasActiveScheduledRun(store: WorkflowRunReaderRepository, schedule: ScheduleRecord): Promise<boolean>;
|
|
22
|
-
declare function cancelActiveScheduledRun(store: WorkflowRunReaderRepository, engine: WorkflowRunCanceler, schedule: ScheduleRecord): Promise<void>;
|
|
23
|
-
declare function tickSchedules(store: WorkflowScheduleTickStore, engine: WorkflowScheduleTickEngine, now: () => Temporal.Instant, tickOptions: TickSchedulesOptions | undefined): Promise<TickSchedulesResult>;
|
|
24
|
-
//#endregion
|
|
25
|
-
export { advanceSchedule, bufferSchedule, cancelActiveScheduledRun, hasActiveScheduledRun, resolveScheduleRecord, tickSchedules, updateScheduleStatus, upsertSchedule, workflowScheduleFireTimes };
|
|
7
|
+
export declare function resolveScheduleRecord<TInput, TOutput, TRawInput>(namespace: string, definition: WorkflowDefinition<TInput, TOutput, TRawInput>, options: ScheduleConfig<TInput, TRawInput>, createdAt: Temporal.Instant, limits: ExecutionLimits): Promise<ScheduleRecord>;
|
|
8
|
+
export declare function upsertSchedule<TInput, TOutput, TRawInput>(store: WorkflowStore, definition: WorkflowDefinition<TInput, TOutput, TRawInput>, options: ScheduleConfig<TInput, TRawInput>, timestamp: Temporal.Instant, limits: ExecutionLimits): Promise<ScheduleRecord>;
|
|
9
|
+
export declare function updateScheduleStatus(store: WorkflowStore, scheduleId: ScheduleId, status: ScheduleStatus, now: Temporal.Instant): Promise<ScheduleRecord>;
|
|
10
|
+
export declare function tickSchedules(store: WorkflowStore, engine: WorkflowEngine, now: () => Temporal.Instant, tickOptions: TickSchedulesOptions | undefined): Promise<TickSchedulesResult>;
|
|
11
|
+
//#endregion
|
package/dist/engine/schedule.mjs
CHANGED
|
@@ -1,45 +1,50 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { WorkflowErrorCode } from "../errors/codes.mjs";
|
|
2
|
+
import { WorkflowScheduleError } from "../errors/schedule.mjs";
|
|
3
|
+
import { matchesWorkflowError } from "../errors/records.mjs";
|
|
3
4
|
import "../errors/mod.mjs";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
5
|
+
import { defineFromName } from "../definition.mjs";
|
|
6
|
+
import { isActiveRunStatus } from "../run-status.mjs";
|
|
7
|
+
import { enforceStorageValueSize, parseInput, toPersistedValue } from "./serialization.mjs";
|
|
8
|
+
import { cancelWorkflowRun } from "./run-service.mjs";
|
|
9
|
+
import { isPlainObject } from "@temelj/value";
|
|
6
10
|
//#region src/engine/schedule.ts
|
|
7
11
|
const MAX_SCHEDULE_UPSERT_ATTEMPTS = 3;
|
|
8
|
-
function resolveScheduleRecord(namespace, definition, options, createdAt, limits) {
|
|
12
|
+
async function resolveScheduleRecord(namespace, definition, options, createdAt, limits) {
|
|
9
13
|
const nextFireAt = (options.from ?? createdAt).toZonedDateTimeISO("UTC").add(options.every).toInstant();
|
|
10
14
|
const endAt = options.endAt;
|
|
11
15
|
const catchUp = options.catchUp ?? "one";
|
|
12
16
|
const maxCatchUpRuns = options.maxCatchUpRuns;
|
|
13
17
|
const overlap = options.overlap ?? "allow";
|
|
14
|
-
const persistedInput =
|
|
18
|
+
const persistedInput = await parseInput(definition, options.input);
|
|
19
|
+
enforceStorageValueSize(persistedInput, "workflow schedule input", limits);
|
|
15
20
|
return {
|
|
16
21
|
id: options.id,
|
|
17
22
|
namespace,
|
|
18
23
|
workflowName: definition.name,
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
24
|
+
workflowVersion: definition.version,
|
|
25
|
+
input: persistedInput,
|
|
26
|
+
context: options.context !== void 0 ? toPersistedValue(options.context, "workflow schedule context", limits) : void 0,
|
|
22
27
|
status: endAt !== void 0 && Temporal.Instant.compare(nextFireAt, endAt) > 0 ? "deleted" : "active",
|
|
23
28
|
every: options.every,
|
|
24
29
|
catchUp,
|
|
25
|
-
|
|
26
|
-
|
|
30
|
+
maxCatchUpRuns,
|
|
31
|
+
maxLateness: options.maxLateness,
|
|
27
32
|
overlap,
|
|
28
33
|
createdAt,
|
|
29
34
|
updatedAt: createdAt,
|
|
30
35
|
nextFireAt,
|
|
31
|
-
|
|
36
|
+
endAt,
|
|
32
37
|
tickCount: 0
|
|
33
38
|
};
|
|
34
39
|
}
|
|
35
40
|
async function upsertSchedule(store, definition, options, timestamp, limits) {
|
|
36
|
-
const schedule = resolveScheduleRecord(store.namespace, definition, options, timestamp, limits);
|
|
41
|
+
const schedule = await resolveScheduleRecord(store.namespace, definition, options, timestamp, limits);
|
|
37
42
|
for (let attempt = 0; attempt < MAX_SCHEDULE_UPSERT_ATTEMPTS; attempt += 1) {
|
|
38
43
|
const existing = await store.getSchedule(schedule.id);
|
|
39
44
|
if (existing === void 0) try {
|
|
40
45
|
return await store.createSchedule(schedule);
|
|
41
46
|
} catch (error) {
|
|
42
|
-
if (!
|
|
47
|
+
if (!matchesWorkflowError(error, WorkflowErrorCode.SCHEDULE_ALREADY_EXISTS, { scheduleId: schedule.id })) throw error;
|
|
43
48
|
continue;
|
|
44
49
|
}
|
|
45
50
|
const next = {
|
|
@@ -47,25 +52,25 @@ async function upsertSchedule(store, definition, options, timestamp, limits) {
|
|
|
47
52
|
createdAt: existing.createdAt,
|
|
48
53
|
updatedAt: timestamp,
|
|
49
54
|
tickCount: existing.tickCount,
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
bufferedFireAt: existing.bufferedFireAt,
|
|
56
|
+
lastFireAt: existing.lastFireAt,
|
|
57
|
+
lastRunId: existing.lastRunId
|
|
53
58
|
};
|
|
54
59
|
const updated = await store.updateScheduleIfCurrent(existing, next);
|
|
55
60
|
if (updated !== void 0) return updated;
|
|
56
61
|
}
|
|
57
|
-
WorkflowScheduleError
|
|
62
|
+
throw new WorkflowScheduleError(`Failed to upsert workflow schedule ${schedule.id}`, WorkflowErrorCode.SCHEDULE_UPSERT_CONFLICT_EXHAUSTED, { scheduleId: schedule.id });
|
|
58
63
|
}
|
|
59
64
|
async function updateScheduleStatus(store, scheduleId, status, now) {
|
|
60
65
|
const current = await store.getSchedule(scheduleId);
|
|
61
|
-
if (current === void 0) WorkflowScheduleError
|
|
66
|
+
if (current === void 0) throw new WorkflowScheduleError(`Workflow schedule not found: ${scheduleId}`, WorkflowErrorCode.SCHEDULE_NOT_FOUND, { scheduleId });
|
|
62
67
|
const next = {
|
|
63
68
|
...current,
|
|
64
69
|
status,
|
|
65
70
|
updatedAt: now
|
|
66
71
|
};
|
|
67
72
|
const updated = await store.updateScheduleIfCurrent(current, next);
|
|
68
|
-
if (updated === void 0) WorkflowScheduleError
|
|
73
|
+
if (updated === void 0) throw new WorkflowScheduleError(`Failed to update workflow schedule ${scheduleId}`, WorkflowErrorCode.SCHEDULE_UPDATE_CONFLICT_EXHAUSTED, { scheduleId });
|
|
69
74
|
return updated;
|
|
70
75
|
}
|
|
71
76
|
function workflowScheduleFireTimes(schedule, now) {
|
|
@@ -95,11 +100,9 @@ async function advanceSchedule(store, schedule, now, updatedAt, fired) {
|
|
|
95
100
|
status: schedule.endAt !== void 0 && Temporal.Instant.compare(nextFireAt, schedule.endAt) > 0 ? "deleted" : schedule.status,
|
|
96
101
|
updatedAt,
|
|
97
102
|
tickCount: schedule.tickCount + (fired === void 0 ? 0 : 1),
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
lastRunId: fired.runId
|
|
102
|
-
}
|
|
103
|
+
bufferedFireAt: fired === void 0 ? schedule.bufferedFireAt : void 0,
|
|
104
|
+
lastFireAt: fired === void 0 ? schedule.lastFireAt : fired.fireAt,
|
|
105
|
+
lastRunId: fired === void 0 ? schedule.lastRunId : fired.runId
|
|
103
106
|
};
|
|
104
107
|
return await store.updateScheduleIfCurrent(schedule, next);
|
|
105
108
|
}
|
|
@@ -111,19 +114,19 @@ async function bufferSchedule(store, schedule, fireTimes, now, updatedAt) {
|
|
|
111
114
|
nextFireAt,
|
|
112
115
|
status: schedule.endAt !== void 0 && Temporal.Instant.compare(nextFireAt, schedule.endAt) > 0 ? "deleted" : schedule.status,
|
|
113
116
|
updatedAt,
|
|
114
|
-
|
|
117
|
+
bufferedFireAt: bufferAt
|
|
115
118
|
};
|
|
116
119
|
return await store.updateScheduleIfCurrent(schedule, next);
|
|
117
120
|
}
|
|
118
121
|
async function hasActiveScheduledRun(store, schedule) {
|
|
119
122
|
if (schedule.lastRunId === void 0) return false;
|
|
120
123
|
const run = await store.getRun(schedule.lastRunId);
|
|
121
|
-
return run !== void 0 &&
|
|
124
|
+
return run !== void 0 && isActiveRunStatus(run.status);
|
|
122
125
|
}
|
|
123
126
|
async function cancelActiveScheduledRun(store, engine, schedule) {
|
|
124
127
|
if (schedule.lastRunId === void 0) return;
|
|
125
128
|
const run = await store.getRun(schedule.lastRunId);
|
|
126
|
-
if (run !== void 0 &&
|
|
129
|
+
if (run !== void 0 && isActiveRunStatus(run.status)) await cancelWorkflowRun(engine.context, engine.lifecycle, schedule.lastRunId);
|
|
127
130
|
}
|
|
128
131
|
async function tickSchedules(store, engine, now, tickOptions) {
|
|
129
132
|
const tickNow = tickOptions?.now === void 0 ? now() : tickOptions.now;
|
|
@@ -153,7 +156,7 @@ async function tickSchedules(store, engine, now, tickOptions) {
|
|
|
153
156
|
continue;
|
|
154
157
|
}
|
|
155
158
|
for (const fireAt of fireTimes) {
|
|
156
|
-
const run = await engine.startWorkflow(
|
|
159
|
+
const run = await engine.startWorkflow(defineFromName(schedule.workflowName, schedule.workflowVersion), schedule.input, {
|
|
157
160
|
idempotencyKey: `schedule:${schedule.id}:${fireAt.toString()}`,
|
|
158
161
|
availableAt: fireAt,
|
|
159
162
|
context: scheduleRunContext(schedule, fireAt)
|
|
@@ -166,11 +169,11 @@ async function tickSchedules(store, engine, now, tickOptions) {
|
|
|
166
169
|
currentSchedule = advanced;
|
|
167
170
|
advancedSchedule = true;
|
|
168
171
|
runIds.push(run.runId);
|
|
169
|
-
engine.
|
|
172
|
+
engine.observation.emitScheduleRunCreated({
|
|
170
173
|
scheduleId: schedule.id,
|
|
171
174
|
runId: run.runId,
|
|
172
175
|
workflowName: schedule.workflowName,
|
|
173
|
-
|
|
176
|
+
workflowVersion: schedule.workflowVersion,
|
|
174
177
|
fireAt,
|
|
175
178
|
timestamp: tickNow
|
|
176
179
|
});
|
|
@@ -185,7 +188,7 @@ async function tickSchedules(store, engine, now, tickOptions) {
|
|
|
185
188
|
ticked: runIds.length,
|
|
186
189
|
runIds,
|
|
187
190
|
scheduleIds,
|
|
188
|
-
|
|
191
|
+
nextScheduleAt
|
|
189
192
|
};
|
|
190
193
|
}
|
|
191
194
|
function scheduleRunContext(schedule, fireAt) {
|
|
@@ -193,7 +196,7 @@ function scheduleRunContext(schedule, fireAt) {
|
|
|
193
196
|
scheduleId: schedule.id,
|
|
194
197
|
scheduleFireAt: fireAt.toString()
|
|
195
198
|
};
|
|
196
|
-
if (
|
|
199
|
+
if (isPlainObject(schedule.context)) return Object.assign({}, schedule.context, {
|
|
197
200
|
scheduleId: schedule.id,
|
|
198
201
|
scheduleFireAt: fireAt.toString()
|
|
199
202
|
});
|
|
@@ -204,4 +207,4 @@ function scheduleRunContext(schedule, fireAt) {
|
|
|
204
207
|
};
|
|
205
208
|
}
|
|
206
209
|
//#endregion
|
|
207
|
-
export {
|
|
210
|
+
export { resolveScheduleRecord, tickSchedules, updateScheduleStatus, upsertSchedule };
|