@temelj/workflow 0.0.0-alpha.3 → 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 +119 -280
- 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
package/dist/store/run.mjs
CHANGED
|
@@ -1,59 +1,65 @@
|
|
|
1
|
+
import { WorkflowErrorCode } from "../errors/codes.mjs";
|
|
1
2
|
import { WorkflowStateError } from "../errors/base.mjs";
|
|
2
3
|
import { WorkflowRunNotFoundError } from "../errors/run.mjs";
|
|
3
|
-
import { isTerminalWorkflowLifecycleEventForRun, isTerminalWorkflowRunStatus, limitWorkflowItems, nextRunAttempt } from "../utility.mjs";
|
|
4
4
|
import "../errors/mod.mjs";
|
|
5
|
-
import { omitUndefined } from "../collection.mjs";
|
|
6
|
-
import { supportsWorkflowConditionalWrite } from "./capabilities.mjs";
|
|
5
|
+
import { limitItems, omitUndefined } from "../collection.mjs";
|
|
7
6
|
import { makeRunKey } from "../store-keys.mjs";
|
|
8
|
-
import {
|
|
7
|
+
import { CLEARED_LEASE, CLEARED_RETRY, UNFINISHED, isTerminalEventForRun, isTerminalRunStatus, nextRunAttempt } from "../run-status.mjs";
|
|
8
|
+
import { supportsConditionalWrite } from "./capabilities.mjs";
|
|
9
|
+
import { makeRunCursorKey, pageItems } from "../pagination.mjs";
|
|
9
10
|
import { toStorageValue } from "./storage-value.mjs";
|
|
10
|
-
import {
|
|
11
|
-
import { rollbackAppendedEventIfCurrent } from "./
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import { matchesWorkflowRunListOptions, queryWorkflowRuns } from "./query.mjs";
|
|
11
|
+
import { isReadableRunRecord, parseStoredRunRecord, requireReadableStoreRun, requireValidRunTransition } from "./validation.mjs";
|
|
12
|
+
import { rollbackAppendedEventIfCurrent } from "./events.mjs";
|
|
13
|
+
import { matchesRunListOptions, queryRuns } from "./query.mjs";
|
|
14
|
+
import { deepEquals } from "@temelj/value";
|
|
15
15
|
//#region src/store/run.ts
|
|
16
16
|
async function updateRunIfCurrent(storage, namespace, store, current, next) {
|
|
17
17
|
const runId = current.id;
|
|
18
18
|
const nextRunId = next.id;
|
|
19
|
-
if (runId !== nextRunId) WorkflowStateError
|
|
19
|
+
if (runId !== nextRunId) throw new WorkflowStateError(`Workflow store runId mismatch: ${runId} !== ${nextRunId}`, {
|
|
20
|
+
code: WorkflowErrorCode.STATE_RUN_ID_MISMATCH,
|
|
21
|
+
details: {
|
|
22
|
+
actual: runId,
|
|
23
|
+
expected: nextRunId
|
|
24
|
+
}
|
|
25
|
+
});
|
|
20
26
|
requireReadableStoreRun(current, namespace);
|
|
21
27
|
if (next.namespace !== namespace) WorkflowStateError.runNamespaceMismatch(String(next.namespace), namespace);
|
|
22
|
-
if (!
|
|
28
|
+
if (!supportsConditionalWrite(storage)) {
|
|
23
29
|
const latest = await store.getRun(runId);
|
|
24
|
-
if (latest === void 0 || !
|
|
30
|
+
if (latest === void 0 || !deepEquals(omitUndefined(latest), omitUndefined(current))) return;
|
|
25
31
|
requireValidRunTransition(current, next);
|
|
26
|
-
const compact =
|
|
32
|
+
const compact = omitUndefined(next);
|
|
27
33
|
await storage.set(makeRunKey(namespace, runId), toStorageValue(compact));
|
|
28
34
|
return compact;
|
|
29
35
|
}
|
|
30
36
|
requireValidRunTransition(current, next);
|
|
31
|
-
const compact =
|
|
37
|
+
const compact = omitUndefined(next);
|
|
32
38
|
return await storage.compareAndSet(makeRunKey(namespace, runId), toStorageValue(current), toStorageValue(compact)) ? compact : void 0;
|
|
33
39
|
}
|
|
34
40
|
async function getWorkflowRun(storage, namespace, runId) {
|
|
35
41
|
const run = await storage.get(makeRunKey(namespace, runId));
|
|
36
|
-
return
|
|
42
|
+
return isReadableRunRecord(run, namespace) ? run : void 0;
|
|
37
43
|
}
|
|
38
44
|
async function listWorkflowRuns(storage, namespace, options) {
|
|
39
|
-
const runs = await
|
|
45
|
+
const runs = await queryRuns(storage, namespace, options, {
|
|
40
46
|
label: "Workflow run list options",
|
|
41
47
|
sort: true
|
|
42
48
|
});
|
|
43
|
-
return
|
|
49
|
+
return limitItems(runs, options?.limit);
|
|
44
50
|
}
|
|
45
51
|
async function listWorkflowRunsPage(storage, namespace, options) {
|
|
46
|
-
const runs = await
|
|
52
|
+
const runs = await queryRuns(storage, namespace, {
|
|
47
53
|
...options,
|
|
48
54
|
limit: void 0
|
|
49
55
|
}, {
|
|
50
56
|
label: "Workflow run page options",
|
|
51
57
|
sort: true
|
|
52
58
|
});
|
|
53
|
-
return pageItems(runs, options, "Workflow run page",
|
|
59
|
+
return pageItems(runs, options, "Workflow run page", makeRunCursorKey);
|
|
54
60
|
}
|
|
55
61
|
async function countWorkflowRuns(storage, namespace, options) {
|
|
56
|
-
return (await
|
|
62
|
+
return (await queryRuns(storage, namespace, options, {
|
|
57
63
|
label: "Workflow run list options",
|
|
58
64
|
sort: false
|
|
59
65
|
})).length;
|
|
@@ -63,147 +69,100 @@ async function updateWorkflowRun(storage, namespace, store, run) {
|
|
|
63
69
|
if (run.namespace !== namespace) WorkflowStateError.runNamespaceMismatch(String(run.namespace), namespace);
|
|
64
70
|
const current = await store.getRun(runId);
|
|
65
71
|
if (current !== void 0) requireValidRunTransition(current, run);
|
|
66
|
-
const compact =
|
|
72
|
+
const compact = omitUndefined(run);
|
|
67
73
|
await storage.set(makeRunKey(namespace, runId), toStorageValue(compact));
|
|
68
74
|
return compact;
|
|
69
75
|
}
|
|
70
76
|
async function claimWorkflowRun(storage, namespace, store, options) {
|
|
71
|
-
const listOptions =
|
|
77
|
+
const listOptions = claimableRunListOptions(options);
|
|
72
78
|
const run = options.runId === void 0 ? await firstClaimableRun(store, options, listOptions) : await store.getRun(options.runId);
|
|
73
79
|
if (run === void 0 || !canClaimRun(run, options, listOptions)) return;
|
|
74
80
|
return await updateRunIfCurrent(storage, namespace, store, run, claimedRunPatch(run, options.workerId, options.now, options.leaseDuration));
|
|
75
81
|
}
|
|
76
82
|
async function extendWorkflowRunLease(storage, namespace, store, options) {
|
|
77
83
|
const run = await store.getRun(options.runId);
|
|
78
|
-
if (!
|
|
84
|
+
if (!isRunLeaseHeldByWorker(run, options)) return;
|
|
79
85
|
return await updateRunIfCurrent(storage, namespace, store, run, extendedRunLeasePatch(run, options.now, options.leaseDuration));
|
|
80
86
|
}
|
|
81
87
|
async function releaseWorkflowRunLease(storage, namespace, store, options) {
|
|
82
88
|
const run = await store.getRun(options.runId);
|
|
83
|
-
if (!
|
|
89
|
+
if (!isRunLeaseHeldByWorker(run, options)) return;
|
|
84
90
|
return await updateRunIfCurrent(storage, namespace, store, run, releaseRunLeasePatch(run, options.now));
|
|
85
91
|
}
|
|
86
|
-
function
|
|
87
|
-
return latest !== void 0 &&
|
|
92
|
+
function isSameReadableRunRevision(latest, current, namespace) {
|
|
93
|
+
return latest !== void 0 && isReadableRunRecord(latest, namespace) && deepEquals(omitUndefined(latest), omitUndefined(current));
|
|
88
94
|
}
|
|
89
|
-
async function
|
|
90
|
-
return
|
|
95
|
+
async function isStoredRunRevisionCurrent(storage, namespace, currentRun) {
|
|
96
|
+
return isSameReadableRunRevision(await getWorkflowRun(storage, namespace, currentRun.id), currentRun, namespace);
|
|
91
97
|
}
|
|
92
|
-
async function
|
|
98
|
+
async function getReadableStoredRun(storage, namespace, runId) {
|
|
93
99
|
const runValue = await storage.get(makeRunKey(namespace, runId));
|
|
94
|
-
const run =
|
|
95
|
-
return
|
|
96
|
-
}
|
|
97
|
-
async function getReadableStoredWorkflowRunValue(storage, namespace, runId) {
|
|
98
|
-
const run = await storage.get(makeRunKey(namespace, runId));
|
|
99
|
-
return isReadableWorkflowRunRecord(run, namespace) ? run : void 0;
|
|
100
|
+
const run = parseStoredRunRecord(runValue);
|
|
101
|
+
return isReadableRunRecord(run, namespace) ? run : void 0;
|
|
100
102
|
}
|
|
101
|
-
async function
|
|
102
|
-
const run = await
|
|
103
|
+
async function requireReadableStoredRun(storage, namespace, runId) {
|
|
104
|
+
const run = await getReadableStoredRun(storage, namespace, runId);
|
|
103
105
|
if (run === void 0) WorkflowRunNotFoundError.notFound(runId);
|
|
104
106
|
return run;
|
|
105
107
|
}
|
|
106
108
|
function shouldRollbackAppendedEventForRun(namespace, run, event) {
|
|
107
|
-
if (run === void 0 || !
|
|
108
|
-
return
|
|
109
|
+
if (run === void 0 || !isReadableRunRecord(run, namespace)) return true;
|
|
110
|
+
return isTerminalRunStatus(run.status) && !isTerminalEventForRun(run, event);
|
|
109
111
|
}
|
|
110
|
-
function
|
|
111
|
-
return
|
|
112
|
+
function isRunStaleForAppend(currentRun, event) {
|
|
113
|
+
return isTerminalRunStatus(currentRun.status) && !isTerminalEventForRun(currentRun, event);
|
|
112
114
|
}
|
|
113
115
|
async function rollbackAppendedEventIfRunStale(storage, namespace, runId, event, events) {
|
|
114
|
-
if (!shouldRollbackAppendedEventForRun(namespace, await
|
|
116
|
+
if (!shouldRollbackAppendedEventForRun(namespace, await getWorkflowRun(storage, namespace, runId), event)) return false;
|
|
115
117
|
await rollbackAppendedEventIfCurrent(storage, namespace, runId, events);
|
|
116
118
|
return true;
|
|
117
119
|
}
|
|
118
120
|
function claimedRunPatch(run, workerId, now, leaseDuration) {
|
|
119
|
-
const timestamp = now;
|
|
120
121
|
const lastTransitionReason = isStaleLeaseClaim(run, now) ? "reclaimed" : "claimed";
|
|
121
122
|
return {
|
|
122
123
|
...run,
|
|
123
124
|
status: "running",
|
|
124
125
|
attempts: nextRunAttempt(run.attempts),
|
|
125
|
-
idempotencyKey: run.idempotencyKey,
|
|
126
|
-
parentRunId: run.parentRunId,
|
|
127
|
-
parentStepId: run.parentStepId,
|
|
128
|
-
parentStepName: run.parentStepName,
|
|
129
|
-
parentStepAttempt: run.parentStepAttempt,
|
|
130
126
|
workerId,
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
lastTransitionAt: timestamp,
|
|
127
|
+
updatedAt: now,
|
|
128
|
+
lastTransitionAt: now,
|
|
134
129
|
lastTransitionReason,
|
|
135
|
-
startedAt: run.startedAt ??
|
|
130
|
+
startedAt: run.startedAt ?? now,
|
|
136
131
|
leaseExpiresAt: now.add(leaseDuration),
|
|
137
|
-
deadlineAt: run.deadlineAt,
|
|
138
132
|
availableAt: void 0,
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
retryAttempt: void 0,
|
|
142
|
-
retryStepId: void 0,
|
|
143
|
-
retryStepName: void 0,
|
|
144
|
-
error: void 0,
|
|
145
|
-
output: void 0,
|
|
146
|
-
finishedAt: void 0
|
|
133
|
+
...CLEARED_RETRY,
|
|
134
|
+
...UNFINISHED
|
|
147
135
|
};
|
|
148
136
|
}
|
|
149
137
|
function extendedRunLeasePatch(run, now, leaseDuration) {
|
|
150
|
-
const timestamp = now;
|
|
151
138
|
return {
|
|
152
139
|
...run,
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
parentStepName: run.parentStepName,
|
|
157
|
-
parentStepAttempt: run.parentStepAttempt,
|
|
158
|
-
createdAt: run.createdAt,
|
|
159
|
-
updatedAt: timestamp,
|
|
160
|
-
lastTransitionAt: run.lastTransitionAt ?? timestamp,
|
|
161
|
-
deadlineAt: run.deadlineAt,
|
|
162
|
-
startedAt: run.startedAt ?? timestamp,
|
|
140
|
+
updatedAt: now,
|
|
141
|
+
lastTransitionAt: run.lastTransitionAt ?? now,
|
|
142
|
+
startedAt: run.startedAt ?? now,
|
|
163
143
|
leaseExpiresAt: now.add(leaseDuration),
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
retryAttempt: void 0,
|
|
167
|
-
retryStepId: void 0,
|
|
168
|
-
retryStepName: void 0,
|
|
169
|
-
error: void 0,
|
|
170
|
-
output: void 0,
|
|
171
|
-
finishedAt: void 0
|
|
144
|
+
...CLEARED_RETRY,
|
|
145
|
+
...UNFINISHED
|
|
172
146
|
};
|
|
173
147
|
}
|
|
174
148
|
function releaseRunLeasePatch(run, now) {
|
|
175
|
-
const timestamp = now;
|
|
176
149
|
return {
|
|
177
150
|
...run,
|
|
178
151
|
status: "waiting",
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
parentStepName: run.parentStepName,
|
|
183
|
-
parentStepAttempt: run.parentStepAttempt,
|
|
184
|
-
availableAt: timestamp,
|
|
185
|
-
createdAt: run.createdAt,
|
|
186
|
-
updatedAt: timestamp,
|
|
187
|
-
lastTransitionAt: timestamp,
|
|
152
|
+
availableAt: now,
|
|
153
|
+
updatedAt: now,
|
|
154
|
+
lastTransitionAt: now,
|
|
188
155
|
lastTransitionReason: "waiting",
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
retryAttempt: void 0,
|
|
194
|
-
retryStepId: void 0,
|
|
195
|
-
retryStepName: void 0,
|
|
196
|
-
error: void 0,
|
|
197
|
-
output: void 0,
|
|
198
|
-
finishedAt: void 0,
|
|
199
|
-
workerId: void 0,
|
|
200
|
-
leaseExpiresAt: void 0
|
|
156
|
+
startedAt: run.startedAt ?? now,
|
|
157
|
+
...CLEARED_RETRY,
|
|
158
|
+
...UNFINISHED,
|
|
159
|
+
...CLEARED_LEASE
|
|
201
160
|
};
|
|
202
161
|
}
|
|
203
162
|
async function firstClaimableRun(store, options, listOptions) {
|
|
204
163
|
return (await store.listRuns(listOptions)).find((run) => canClaimRun(run, options, listOptions));
|
|
205
164
|
}
|
|
206
|
-
function
|
|
165
|
+
function claimableRunListOptions(options) {
|
|
207
166
|
return {
|
|
208
167
|
...options,
|
|
209
168
|
workerId: void 0,
|
|
@@ -216,18 +175,18 @@ function claimableWorkflowRunListOptions(options) {
|
|
|
216
175
|
};
|
|
217
176
|
}
|
|
218
177
|
function canClaimRun(run, options, listOptions) {
|
|
219
|
-
if (!
|
|
178
|
+
if (!matchesClaimableRunListOptions(run, listOptions)) return false;
|
|
220
179
|
if (run.status === "pending" || run.status === "waiting") return run.availableAt === void 0 || Temporal.Instant.compare(run.availableAt, options.now) <= 0;
|
|
221
180
|
if (run.status !== "running") return false;
|
|
222
181
|
if (run.workerId === void 0) return true;
|
|
223
182
|
if (run.leaseExpiresAt === void 0) return true;
|
|
224
183
|
return Temporal.Instant.compare(run.leaseExpiresAt, options.now) <= 0;
|
|
225
184
|
}
|
|
226
|
-
function
|
|
185
|
+
function isRunLeaseHeldByWorker(run, options) {
|
|
227
186
|
return run !== void 0 && run.status === "running" && run.workerId === options.workerId && (options.attempts === void 0 || run.attempts === options.attempts) && run.leaseExpiresAt !== void 0 && Temporal.Instant.compare(run.leaseExpiresAt, options.now) > 0;
|
|
228
187
|
}
|
|
229
|
-
function
|
|
230
|
-
return
|
|
188
|
+
function matchesClaimableRunListOptions(run, listOptions) {
|
|
189
|
+
return matchesRunListOptions(run, listOptions) && (listOptions.retryReason !== void 0 || run.retryReason === void 0);
|
|
231
190
|
}
|
|
232
191
|
function isStaleLeaseClaim(run, now) {
|
|
233
192
|
if (run.status !== "running") return false;
|
|
@@ -236,4 +195,4 @@ function isStaleLeaseClaim(run, now) {
|
|
|
236
195
|
return Temporal.Instant.compare(run.leaseExpiresAt, now) <= 0;
|
|
237
196
|
}
|
|
238
197
|
//#endregion
|
|
239
|
-
export {
|
|
198
|
+
export { claimWorkflowRun, countWorkflowRuns, extendWorkflowRunLease, getReadableStoredRun, getWorkflowRun, isRunStaleForAppend, isStoredRunRevisionCurrent, listWorkflowRuns, listWorkflowRunsPage, releaseWorkflowRunLease, requireReadableStoredRun, rollbackAppendedEventIfRunStale, updateRunIfCurrent, updateWorkflowRun };
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import { WorkflowPage } from "../types/pagination.mjs";
|
|
2
2
|
import { ListSchedulesOptions, ListSchedulesPageOptions, ScheduleId, ScheduleRecord } from "../types/schedule.mjs";
|
|
3
3
|
import { WorkflowStorage } from "../types/store.mjs";
|
|
4
|
-
import { StorageValue } from "@temelj/storage";
|
|
5
4
|
//#region src/store/schedule.d.ts
|
|
6
|
-
declare function createSchedule
|
|
7
|
-
declare function getReadableSchedule
|
|
8
|
-
declare function updateScheduleIfCurrent
|
|
9
|
-
declare function listSchedules(storage: WorkflowStorage, namespace: string, options?: ListSchedulesOptions): Promise<readonly ScheduleRecord[]>;
|
|
10
|
-
declare function listSchedulesPage(storage: WorkflowStorage, namespace: string, options?: ListSchedulesPageOptions): Promise<WorkflowPage<ScheduleRecord>>;
|
|
11
|
-
//#endregion
|
|
12
|
-
export { createSchedule, getReadableSchedule, listSchedules, listSchedulesPage, updateScheduleIfCurrent };
|
|
5
|
+
export declare function createSchedule(storage: WorkflowStorage, namespace: string, schedule: ScheduleRecord): Promise<ScheduleRecord>;
|
|
6
|
+
export declare function getReadableSchedule(storage: WorkflowStorage, namespace: string, scheduleId: ScheduleId): Promise<ScheduleRecord | undefined>;
|
|
7
|
+
export declare function updateScheduleIfCurrent(storage: WorkflowStorage, namespace: string, current: ScheduleRecord, next: ScheduleRecord): Promise<ScheduleRecord | undefined>;
|
|
8
|
+
export declare function listSchedules(storage: WorkflowStorage, namespace: string, options?: ListSchedulesOptions): Promise<readonly ScheduleRecord[]>;
|
|
9
|
+
export declare function listSchedulesPage(storage: WorkflowStorage, namespace: string, options?: ListSchedulesPageOptions): Promise<WorkflowPage<ScheduleRecord>>;
|
|
10
|
+
//#endregion
|
package/dist/store/schedule.mjs
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { WorkflowErrorCode } from "../errors/codes.mjs";
|
|
2
2
|
import { WorkflowScheduleAlreadyExistsError, WorkflowScheduleError } from "../errors/schedule.mjs";
|
|
3
3
|
import "../errors/mod.mjs";
|
|
4
|
+
import { limitItems, omitUndefined } from "../collection.mjs";
|
|
4
5
|
import { makeScheduleKey } from "../store-keys.mjs";
|
|
6
|
+
import { makeScheduleCursorKey, pageItems } from "../pagination.mjs";
|
|
5
7
|
import { toStorageValue } from "./storage-value.mjs";
|
|
6
8
|
import { isReadableScheduleRecord } from "./validation.mjs";
|
|
7
|
-
import { makeScheduleCursorKey, pageItems } from "../pagination.mjs";
|
|
8
|
-
import { compactWorkflowStoreRecord } from "./compaction.mjs";
|
|
9
9
|
import { querySchedules } from "./query.mjs";
|
|
10
10
|
//#region src/store/schedule.ts
|
|
11
11
|
async function createSchedule(storage, namespace, schedule) {
|
|
12
12
|
if (schedule.namespace !== namespace) WorkflowScheduleError.namespaceMismatch(schedule.namespace, namespace);
|
|
13
|
-
if (!isReadableScheduleRecord(schedule, namespace)) WorkflowScheduleError.
|
|
14
|
-
const compact =
|
|
15
|
-
if (!await storage.compareAndSet(makeScheduleKey(namespace, schedule.id), void 0, toStorageValue(compact))) WorkflowScheduleAlreadyExistsError
|
|
13
|
+
if (!isReadableScheduleRecord(schedule, namespace)) throw new WorkflowScheduleError("Workflow schedule record is invalid", WorkflowErrorCode.SCHEDULE_RECORD_INVALID, void 0);
|
|
14
|
+
const compact = omitUndefined(schedule);
|
|
15
|
+
if (!await storage.compareAndSet(makeScheduleKey(namespace, schedule.id), void 0, toStorageValue(compact))) throw new WorkflowScheduleAlreadyExistsError(schedule.id);
|
|
16
16
|
return compact;
|
|
17
17
|
}
|
|
18
18
|
async function getReadableSchedule(storage, namespace, scheduleId) {
|
|
@@ -22,15 +22,15 @@ async function getReadableSchedule(storage, namespace, scheduleId) {
|
|
|
22
22
|
async function updateScheduleIfCurrent(storage, namespace, current, next) {
|
|
23
23
|
if (current.namespace !== namespace) WorkflowScheduleError.namespaceMismatch(current.namespace, namespace);
|
|
24
24
|
if (next.namespace !== namespace) WorkflowScheduleError.namespaceMismatch(next.namespace, namespace);
|
|
25
|
-
if (current.id !== next.id) WorkflowScheduleError.
|
|
26
|
-
if (!isReadableScheduleRecord(current, namespace)) WorkflowScheduleError.
|
|
27
|
-
if (!isReadableScheduleRecord(next, namespace)) WorkflowScheduleError.
|
|
28
|
-
const compact =
|
|
25
|
+
if (current.id !== next.id) throw new WorkflowScheduleError("Workflow schedule id cannot change", WorkflowErrorCode.SCHEDULE_ID_CHANGE_REJECTED, void 0);
|
|
26
|
+
if (!isReadableScheduleRecord(current, namespace)) throw new WorkflowScheduleError("Current workflow schedule record is invalid", WorkflowErrorCode.SCHEDULE_CURRENT_RECORD_INVALID, void 0);
|
|
27
|
+
if (!isReadableScheduleRecord(next, namespace)) throw new WorkflowScheduleError("Next workflow schedule record is invalid", WorkflowErrorCode.SCHEDULE_NEXT_RECORD_INVALID, void 0);
|
|
28
|
+
const compact = omitUndefined(next);
|
|
29
29
|
return await storage.compareAndSet(makeScheduleKey(namespace, current.id), toStorageValue(current), toStorageValue(compact)) ? compact : void 0;
|
|
30
30
|
}
|
|
31
31
|
async function listSchedules(storage, namespace, options) {
|
|
32
32
|
const schedules = await querySchedules(storage, namespace, options, { label: "Workflow schedule list options" });
|
|
33
|
-
return
|
|
33
|
+
return limitItems(schedules, options?.limit);
|
|
34
34
|
}
|
|
35
35
|
async function listSchedulesPage(storage, namespace, options) {
|
|
36
36
|
const schedules = await querySchedules(storage, namespace, {
|
|
@@ -1,14 +1,11 @@
|
|
|
1
|
-
import { RunId } from "../types/
|
|
1
|
+
import { RunId } from "../types/ids.mjs";
|
|
2
2
|
import { WorkflowPage } from "../types/pagination.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import "../types/
|
|
6
|
-
import { WorkflowEventReader, WorkflowRunReaderRepository, WorkflowStorage } from "../types/store.mjs";
|
|
3
|
+
import { ListStepAttemptsPageOptions } from "../types/run-list.mjs";
|
|
4
|
+
import { ListStepAttemptsOptions, StepAttemptRecord } from "../types/step-attempts.mjs";
|
|
5
|
+
import { WorkflowStorage, WorkflowStore } from "../types/store.mjs";
|
|
7
6
|
//#region src/store/step-attempt.d.ts
|
|
8
|
-
|
|
9
|
-
declare function
|
|
10
|
-
declare function
|
|
11
|
-
declare function
|
|
12
|
-
|
|
13
|
-
//#endregion
|
|
14
|
-
export { countWorkflowStepAttempts, listWorkflowStepAttempts, listWorkflowStepAttemptsPage, repairWorkflowStepAttempts };
|
|
7
|
+
export declare function listWorkflowStepAttempts(storage: WorkflowStorage, namespace: string, store: WorkflowStore, runId: RunId, options?: ListStepAttemptsOptions): Promise<readonly StepAttemptRecord[]>;
|
|
8
|
+
export declare function listWorkflowStepAttemptsPage(storage: WorkflowStorage, namespace: string, store: WorkflowStore, runId: RunId, options?: ListStepAttemptsPageOptions): Promise<WorkflowPage<StepAttemptRecord>>;
|
|
9
|
+
export declare function countWorkflowStepAttempts(storage: WorkflowStorage, namespace: string, store: WorkflowStore, runId: RunId, options?: ListStepAttemptsOptions): Promise<number>;
|
|
10
|
+
export declare function repairWorkflowStepAttempts(storage: WorkflowStorage, namespace: string, store: WorkflowStore, runId: RunId): Promise<readonly StepAttemptRecord[]>;
|
|
11
|
+
//#endregion
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { limitItems } from "../collection.mjs";
|
|
2
|
+
import { makeStepAttemptCursorKey, pageItems } from "../pagination.mjs";
|
|
3
3
|
import { reconcileStepAttempts } from "./materialization.mjs";
|
|
4
|
-
import {
|
|
4
|
+
import { getRequiredRun, queryStepAttempts } from "./query.mjs";
|
|
5
5
|
//#region src/store/step-attempt.ts
|
|
6
6
|
async function listWorkflowStepAttempts(storage, namespace, store, runId, options) {
|
|
7
|
-
const attempts = await
|
|
8
|
-
return
|
|
7
|
+
const attempts = await queryStepAttempts(storage, namespace, store, runId, options, { label: "Workflow step attempt list options" });
|
|
8
|
+
return limitItems(attempts, options?.limit);
|
|
9
9
|
}
|
|
10
10
|
async function listWorkflowStepAttemptsPage(storage, namespace, store, runId, options) {
|
|
11
|
-
const attempts = await
|
|
11
|
+
const attempts = await queryStepAttempts(storage, namespace, store, runId, {
|
|
12
12
|
...options,
|
|
13
13
|
limit: void 0
|
|
14
14
|
}, { label: "Workflow step attempt page options" });
|
|
15
|
-
return pageItems(attempts, options, "Workflow step attempt page",
|
|
15
|
+
return pageItems(attempts, options, "Workflow step attempt page", makeStepAttemptCursorKey);
|
|
16
16
|
}
|
|
17
17
|
async function countWorkflowStepAttempts(storage, namespace, store, runId, options) {
|
|
18
|
-
return (await
|
|
18
|
+
return (await queryStepAttempts(storage, namespace, store, runId, options, { label: "Workflow step attempt list options" })).length;
|
|
19
19
|
}
|
|
20
20
|
async function repairWorkflowStepAttempts(storage, namespace, store, runId) {
|
|
21
|
-
await
|
|
21
|
+
await getRequiredRun(store, runId);
|
|
22
22
|
return await reconcileStepAttempts(storage, namespace, runId, await store.getEvents(runId));
|
|
23
23
|
}
|
|
24
24
|
//#endregion
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { StorageValue } from "@temelj/storage";
|
|
2
2
|
//#region src/store/storage-value.d.ts
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
/** Validates storage writes and omits undefined optional fields from workflow records. */
|
|
4
|
+
export declare function toStorageValue(value: unknown): StorageValue;
|
|
5
|
+
//#endregion
|
|
@@ -1,6 +1,22 @@
|
|
|
1
|
+
import { parse } from "../schema/common.mjs";
|
|
2
|
+
import { persistedValueSchema } from "../schema/persisted-value.mjs";
|
|
3
|
+
import { isPlainObject } from "@temelj/value";
|
|
1
4
|
//#region src/store/storage-value.ts
|
|
5
|
+
/** Validates storage writes and omits undefined optional fields from workflow records. */
|
|
2
6
|
function toStorageValue(value) {
|
|
3
|
-
return value;
|
|
7
|
+
return normalizeStoredValue(value, /* @__PURE__ */ new WeakSet());
|
|
8
|
+
}
|
|
9
|
+
function normalizeStoredValue(value, active) {
|
|
10
|
+
if (!Array.isArray(value) && !isPlainObject(value)) return parse(persistedValueSchema, value);
|
|
11
|
+
if (active.has(value)) throw new TypeError("Circular workflow records cannot be stored");
|
|
12
|
+
active.add(value);
|
|
13
|
+
try {
|
|
14
|
+
if (Array.isArray(value)) return Array.from(value, (item) => normalizeStoredValue(item, active));
|
|
15
|
+
if (Object.getOwnPropertySymbols(value).some((key) => Object.prototype.propertyIsEnumerable.call(value, key))) throw new TypeError("Symbol keys cannot be stored in workflow records");
|
|
16
|
+
return Object.fromEntries(Object.entries(value).filter(([, item]) => item !== void 0).map(([key, item]) => [key, normalizeStoredValue(item, active)]));
|
|
17
|
+
} finally {
|
|
18
|
+
active.delete(value);
|
|
19
|
+
}
|
|
4
20
|
}
|
|
5
21
|
//#endregion
|
|
6
22
|
export { toStorageValue };
|
|
@@ -1,35 +1,32 @@
|
|
|
1
1
|
import { CleanupMarkerRecord } from "../types/cleanup.mjs";
|
|
2
2
|
import { ScheduleRecord } from "../types/schedule.mjs";
|
|
3
3
|
import { LockRecord } from "../types/lock.mjs";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { StepAttemptRecord } from "../types/step-attempts.mjs";
|
|
5
|
+
import { RunRecord, RunTransitionReason } from "../types/run.mjs";
|
|
6
6
|
import { EventRecord } from "../types/events.mjs";
|
|
7
|
-
import {
|
|
7
|
+
import { MessageIdempotencyIndex } from "../types/store.mjs";
|
|
8
8
|
import { StorageValue } from "@temelj/storage";
|
|
9
9
|
//#region src/store/validation.d.ts
|
|
10
10
|
/** Returns whether an unknown value is a readable run record in the expected namespace. */
|
|
11
|
-
declare function
|
|
11
|
+
export declare function isReadableRunRecord(run: unknown, expectedNamespace: string): run is RunRecord;
|
|
12
12
|
/** Returns whether an unknown value is a run record that can participate in indexed list queries. */
|
|
13
|
-
declare function
|
|
14
|
-
readonly lastTransitionReason:
|
|
13
|
+
export declare function isListableRunRecord(run: unknown, expectedNamespace: string): run is RunRecord & {
|
|
14
|
+
readonly lastTransitionReason: RunTransitionReason;
|
|
15
15
|
};
|
|
16
16
|
/** Parses a stored workflow run record, if one exists. */
|
|
17
|
-
declare function
|
|
17
|
+
export declare function parseStoredRunRecord(value: StorageValue | undefined): RunRecord | undefined;
|
|
18
18
|
/** Returns whether an unknown value is a readable schedule record in the expected namespace. */
|
|
19
|
-
declare function isReadableScheduleRecord
|
|
19
|
+
export declare function isReadableScheduleRecord(schedule: unknown, expectedNamespace: string): schedule is ScheduleRecord;
|
|
20
20
|
/** Returns whether an unknown value is a readable lock record in the expected namespace. */
|
|
21
|
-
declare function isReadableLockRecord(lock: unknown, expectedNamespace: string): lock is LockRecord;
|
|
22
|
-
|
|
23
|
-
declare function isReadableEventRecord(event: unknown): event is EventRecord;
|
|
21
|
+
export declare function isReadableLockRecord(lock: unknown, expectedNamespace: string): lock is LockRecord;
|
|
22
|
+
export declare function isReadableEventRecord(event: unknown): event is EventRecord;
|
|
24
23
|
/** Parses a readable cleanup marker record, if the value has the expected shape. */
|
|
25
|
-
declare function readableCleanupMarkerRecord(marker:
|
|
24
|
+
export declare function readableCleanupMarkerRecord(marker: StorageValue | undefined): CleanupMarkerRecord | undefined;
|
|
26
25
|
/** Parses a stored materialized step-attempt record, if one exists. */
|
|
27
|
-
declare function
|
|
28
|
-
|
|
29
|
-
declare function isReadableMessageIdempotencyIndex(value: unknown): value is WorkflowMessageIdempotencyIndex;
|
|
26
|
+
export declare function parseStoredStepAttemptRecord(value: StorageValue | undefined): StepAttemptRecord | undefined;
|
|
27
|
+
export declare function isReadableMessageIdempotencyIndex(value: unknown): value is MessageIdempotencyIndex;
|
|
30
28
|
/** Returns whether the stored message idempotency index matches the expected logical index. */
|
|
31
|
-
declare function isSameMessageIdempotencyIndex(current:
|
|
32
|
-
declare function requireReadableStoreRun(run:
|
|
33
|
-
declare function requireValidRunTransition(current:
|
|
34
|
-
//#endregion
|
|
35
|
-
export { isListableWorkflowRunRecord, isReadableEventRecord, isReadableLockRecord, isReadableMessageIdempotencyIndex, isReadableScheduleRecord, isReadableWorkflowRunRecord, isSameMessageIdempotencyIndex, parseStoredWorkflowRunRecord, parseStoredWorkflowStepAttemptRecord, readableCleanupMarkerRecord, requireReadableStoreRun, requireValidRunTransition };
|
|
29
|
+
export declare function isSameMessageIdempotencyIndex(current: StorageValue | MessageIdempotencyIndex | undefined, value: MessageIdempotencyIndex): boolean;
|
|
30
|
+
export declare function requireReadableStoreRun(run: RunRecord, namespace: string): void;
|
|
31
|
+
export declare function requireValidRunTransition(current: RunRecord, next: RunRecord): void;
|
|
32
|
+
//#endregion
|
|
@@ -1,69 +1,66 @@
|
|
|
1
|
+
import { parse } from "../schema/common.mjs";
|
|
1
2
|
import { WorkflowRunNotFoundError, WorkflowRunTransitionError } from "../errors/run.mjs";
|
|
2
|
-
import { workflowRunRecordSchema } from "../types/run.mjs";
|
|
3
3
|
import "../errors/mod.mjs";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import { workflowStepAttemptRecordSchema } from "../types/step-attempts.mjs";
|
|
9
|
-
import { workflowMessageIdempotencyIndexSchema } from "./schema.mjs";
|
|
4
|
+
import { runRecordSchema } from "../schema/run.mjs";
|
|
5
|
+
import { eventRecordSchema } from "../schema/events.mjs";
|
|
6
|
+
import { cleanupMarkerRecordSchema, lockRecordSchema, messageIdempotencyIndexSchema, scheduleRecordSchema, stepAttemptRecordSchema } from "../schema/store.mjs";
|
|
7
|
+
import { ss } from "@temelj/standard-schema";
|
|
10
8
|
//#region src/store/validation.ts
|
|
11
9
|
/** Returns whether an unknown value is a readable run record in the expected namespace. */
|
|
12
|
-
function
|
|
13
|
-
const parsed =
|
|
14
|
-
return parsed.success && parsed.
|
|
10
|
+
function isReadableRunRecord(run, expectedNamespace) {
|
|
11
|
+
const parsed = ss.safeParseSync(runRecordSchema, run);
|
|
12
|
+
return parsed.success && parsed.value.namespace === expectedNamespace;
|
|
15
13
|
}
|
|
16
14
|
/** Returns whether an unknown value is a run record that can participate in indexed list queries. */
|
|
17
|
-
function
|
|
18
|
-
return
|
|
15
|
+
function isListableRunRecord(run, expectedNamespace) {
|
|
16
|
+
return isReadableRunRecord(run, expectedNamespace);
|
|
19
17
|
}
|
|
20
18
|
/** Parses a stored workflow run record, if one exists. */
|
|
21
|
-
function
|
|
22
|
-
return value === void 0 ? void 0 :
|
|
19
|
+
function parseStoredRunRecord(value) {
|
|
20
|
+
return value === void 0 ? void 0 : parse(runRecordSchema, value);
|
|
23
21
|
}
|
|
24
22
|
/** Returns whether an unknown value is a readable schedule record in the expected namespace. */
|
|
25
23
|
function isReadableScheduleRecord(schedule, expectedNamespace) {
|
|
26
|
-
const parsed =
|
|
27
|
-
return parsed.success && parsed.
|
|
24
|
+
const parsed = ss.safeParseSync(scheduleRecordSchema, schedule);
|
|
25
|
+
return parsed.success && parsed.value.namespace === expectedNamespace;
|
|
28
26
|
}
|
|
29
27
|
/** Returns whether an unknown value is a readable lock record in the expected namespace. */
|
|
30
28
|
function isReadableLockRecord(lock, expectedNamespace) {
|
|
31
|
-
const parsed =
|
|
32
|
-
return parsed.success && parsed.
|
|
29
|
+
const parsed = ss.safeParseSync(lockRecordSchema, lock);
|
|
30
|
+
return parsed.success && parsed.value.namespace === expectedNamespace;
|
|
33
31
|
}
|
|
34
|
-
/** Returns whether an unknown value is a readable durable workflow event record. */
|
|
35
32
|
function isReadableEventRecord(event) {
|
|
36
|
-
return
|
|
33
|
+
return ss.safeParseSync(eventRecordSchema, event).success;
|
|
37
34
|
}
|
|
38
35
|
/** Parses a readable cleanup marker record, if the value has the expected shape. */
|
|
39
36
|
function readableCleanupMarkerRecord(marker) {
|
|
40
|
-
const parsed =
|
|
41
|
-
return parsed.success ? parsed.
|
|
37
|
+
const parsed = ss.safeParseSync(cleanupMarkerRecordSchema, marker);
|
|
38
|
+
return parsed.success ? parsed.value : void 0;
|
|
42
39
|
}
|
|
43
40
|
/** Parses a stored materialized step-attempt record, if one exists. */
|
|
44
|
-
function
|
|
45
|
-
return value === void 0 ? void 0 :
|
|
41
|
+
function parseStoredStepAttemptRecord(value) {
|
|
42
|
+
return value === void 0 ? void 0 : parse(stepAttemptRecordSchema, value);
|
|
46
43
|
}
|
|
47
|
-
/** Returns whether an unknown value is a readable message idempotency index record. */
|
|
48
44
|
function isReadableMessageIdempotencyIndex(value) {
|
|
49
|
-
return
|
|
45
|
+
return ss.safeParseSync(messageIdempotencyIndexSchema, value).success;
|
|
50
46
|
}
|
|
51
47
|
/** Returns whether the stored message idempotency index matches the expected logical index. */
|
|
52
48
|
function isSameMessageIdempotencyIndex(current, value) {
|
|
53
|
-
const parsedCurrent =
|
|
54
|
-
return parsedCurrent.success && parsedCurrent.
|
|
49
|
+
const parsedCurrent = ss.safeParseSync(messageIdempotencyIndexSchema, current);
|
|
50
|
+
return parsedCurrent.success && parsedCurrent.value.runId === value.runId && parsedCurrent.value.messageId === value.messageId && Temporal.Instant.compare(parsedCurrent.value.timestamp, value.timestamp) === 0;
|
|
55
51
|
}
|
|
56
52
|
function requireReadableStoreRun(run, namespace) {
|
|
57
53
|
const runId = run.id;
|
|
58
|
-
|
|
54
|
+
const parsed = ss.safeParseSync(runRecordSchema, run);
|
|
55
|
+
if (!parsed.success || parsed.value.namespace !== namespace) WorkflowRunNotFoundError.notFound(runId);
|
|
59
56
|
}
|
|
60
57
|
function requireValidRunTransition(current, next) {
|
|
61
58
|
if (current.status === next.status) return;
|
|
62
|
-
if (
|
|
63
|
-
WorkflowRunTransitionError
|
|
59
|
+
if (canTransitionRunStatus(current.status, next.status)) return;
|
|
60
|
+
throw new WorkflowRunTransitionError(current.id, current.status, next.status);
|
|
64
61
|
}
|
|
65
62
|
/** Returns whether a run status transition is allowed by the workflow state machine. */
|
|
66
|
-
function
|
|
63
|
+
function canTransitionRunStatus(from, to) {
|
|
67
64
|
switch (from) {
|
|
68
65
|
case "pending": return to === "running" || to === "waiting" || to === "failed" || to === "canceled";
|
|
69
66
|
case "running": return to === "waiting" || to === "completed" || to === "failed" || to === "canceled";
|
|
@@ -74,4 +71,4 @@ function canTransitionWorkflowRunStatus(from, to) {
|
|
|
74
71
|
}
|
|
75
72
|
}
|
|
76
73
|
//#endregion
|
|
77
|
-
export {
|
|
74
|
+
export { isListableRunRecord, isReadableEventRecord, isReadableLockRecord, isReadableMessageIdempotencyIndex, isReadableRunRecord, isReadableScheduleRecord, isSameMessageIdempotencyIndex, parseStoredRunRecord, parseStoredStepAttemptRecord, readableCleanupMarkerRecord, requireReadableStoreRun, requireValidRunTransition };
|