@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
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { idSchema, nonBlankStringSchema, nonNegativeSafeIntegerSchema, positiveSafeIntegerSchema, temporalDurationSchema, temporalInstantSchema } from "./common.mjs";
|
|
2
|
+
import { errorRecordSchema } from "./error.mjs";
|
|
3
|
+
import { persistedValueIssue, persistedValueSchema } from "./persisted-value.mjs";
|
|
4
|
+
import { childWorkflowCancellationPolicySchema, materializedStepTypeSchema, terminalRunStatusSchema } from "./run.mjs";
|
|
5
|
+
import { ss } from "@temelj/standard-schema";
|
|
6
|
+
//#region src/schema/store.ts
|
|
7
|
+
const lockRecordSchema = ss.object({
|
|
8
|
+
key: nonBlankStringSchema,
|
|
9
|
+
namespace: nonBlankStringSchema,
|
|
10
|
+
holderId: nonBlankStringSchema,
|
|
11
|
+
holderRunId: ss.optional(idSchema),
|
|
12
|
+
holderStepId: ss.optional(idSchema),
|
|
13
|
+
fencingToken: positiveSafeIntegerSchema,
|
|
14
|
+
acquiredAt: temporalInstantSchema,
|
|
15
|
+
leaseExpiresAt: temporalInstantSchema,
|
|
16
|
+
releasedAt: ss.optional(temporalInstantSchema)
|
|
17
|
+
});
|
|
18
|
+
const cleanupModeSchema = ss.literal("best_effort");
|
|
19
|
+
const cleanupMarkerRecordSchema = ss.object({
|
|
20
|
+
mode: cleanupModeSchema,
|
|
21
|
+
runId: idSchema,
|
|
22
|
+
workflowName: nonBlankStringSchema,
|
|
23
|
+
workflowVersion: ss.optional(nonBlankStringSchema),
|
|
24
|
+
status: terminalRunStatusSchema,
|
|
25
|
+
createdAt: temporalInstantSchema,
|
|
26
|
+
finishedAt: temporalInstantSchema,
|
|
27
|
+
cleanupStartedAt: temporalInstantSchema,
|
|
28
|
+
events: nonNegativeSafeIntegerSchema,
|
|
29
|
+
stepAttempts: nonNegativeSafeIntegerSchema,
|
|
30
|
+
idempotencyKeys: nonNegativeSafeIntegerSchema,
|
|
31
|
+
messageIdempotencyKeys: nonNegativeSafeIntegerSchema
|
|
32
|
+
});
|
|
33
|
+
const scheduleIdSchema = ss.refine(ss.string(), (value) => value.trim().length > 0, "Expected an ID");
|
|
34
|
+
const scheduleStatusSchema = ss.picklist([
|
|
35
|
+
"active",
|
|
36
|
+
"paused",
|
|
37
|
+
"archived",
|
|
38
|
+
"deleted"
|
|
39
|
+
]);
|
|
40
|
+
const scheduleCatchUpPolicySchema = ss.picklist([
|
|
41
|
+
"skip",
|
|
42
|
+
"one",
|
|
43
|
+
"all"
|
|
44
|
+
]);
|
|
45
|
+
const scheduleOverlapPolicySchema = ss.picklist([
|
|
46
|
+
"allow",
|
|
47
|
+
"skip",
|
|
48
|
+
"buffer",
|
|
49
|
+
"cancel"
|
|
50
|
+
]);
|
|
51
|
+
const schedulePositiveDurationSchema = ss.refine(temporalDurationSchema, (value) => value.total({ unit: "millisecond" }) > 0, "Expected a positive duration");
|
|
52
|
+
const scheduleRecordSchema = ss.object({
|
|
53
|
+
id: scheduleIdSchema,
|
|
54
|
+
namespace: nonBlankStringSchema,
|
|
55
|
+
workflowName: nonBlankStringSchema,
|
|
56
|
+
workflowVersion: ss.optional(nonBlankStringSchema),
|
|
57
|
+
input: ss.optional(persistedValueSchema),
|
|
58
|
+
context: ss.optional(persistedValueSchema),
|
|
59
|
+
status: scheduleStatusSchema,
|
|
60
|
+
every: schedulePositiveDurationSchema,
|
|
61
|
+
catchUp: scheduleCatchUpPolicySchema,
|
|
62
|
+
maxCatchUpRuns: ss.optional(positiveSafeIntegerSchema),
|
|
63
|
+
maxLateness: ss.optional(schedulePositiveDurationSchema),
|
|
64
|
+
overlap: scheduleOverlapPolicySchema,
|
|
65
|
+
createdAt: temporalInstantSchema,
|
|
66
|
+
updatedAt: temporalInstantSchema,
|
|
67
|
+
nextFireAt: temporalInstantSchema,
|
|
68
|
+
endAt: ss.optional(temporalInstantSchema),
|
|
69
|
+
bufferedFireAt: ss.optional(temporalInstantSchema),
|
|
70
|
+
lastFireAt: ss.optional(temporalInstantSchema),
|
|
71
|
+
lastRunId: ss.optional(idSchema),
|
|
72
|
+
tickCount: ss.union([positiveSafeIntegerSchema, ss.literal(0)])
|
|
73
|
+
});
|
|
74
|
+
const stepAttemptStatusSchema = ss.picklist([
|
|
75
|
+
"running",
|
|
76
|
+
"completed",
|
|
77
|
+
"failed",
|
|
78
|
+
"abandoned"
|
|
79
|
+
]);
|
|
80
|
+
const stepAttemptRecordSchema = ss.object({
|
|
81
|
+
runId: idSchema,
|
|
82
|
+
stepId: idSchema,
|
|
83
|
+
stepName: nonBlankStringSchema,
|
|
84
|
+
kind: materializedStepTypeSchema,
|
|
85
|
+
status: stepAttemptStatusSchema,
|
|
86
|
+
attempt: positiveSafeIntegerSchema,
|
|
87
|
+
count: ss.optional(positiveSafeIntegerSchema),
|
|
88
|
+
output: ss.optional(persistedValueSchema),
|
|
89
|
+
error: ss.optional(errorRecordSchema),
|
|
90
|
+
until: ss.optional(temporalInstantSchema),
|
|
91
|
+
duration: ss.optional(ss.instanceOf(Temporal.Duration, "Expected a Temporal.Duration")),
|
|
92
|
+
childRunId: ss.optional(idSchema),
|
|
93
|
+
workflowName: ss.optional(nonBlankStringSchema),
|
|
94
|
+
workflowVersion: ss.optional(nonBlankStringSchema),
|
|
95
|
+
cancellation: ss.optional(childWorkflowCancellationPolicySchema),
|
|
96
|
+
input: ss.optional(persistedValueSchema),
|
|
97
|
+
timeoutAt: ss.optional(temporalInstantSchema),
|
|
98
|
+
messageId: ss.optional(idSchema),
|
|
99
|
+
targetRunId: ss.optional(idSchema),
|
|
100
|
+
payload: ss.optional(persistedValueSchema),
|
|
101
|
+
messageTimestamp: ss.optional(temporalInstantSchema),
|
|
102
|
+
createdAt: temporalInstantSchema,
|
|
103
|
+
startedAt: temporalInstantSchema,
|
|
104
|
+
finishedAt: ss.optional(temporalInstantSchema)
|
|
105
|
+
});
|
|
106
|
+
const cleanupIndexKeySchema = ss.object({
|
|
107
|
+
key: nonBlankStringSchema,
|
|
108
|
+
value: ss.refine(persistedValueSchema, (value) => value !== void 0 && persistedValueIssue(value, "value", /* @__PURE__ */ new WeakSet(), true) === void 0, "Expected a storage value")
|
|
109
|
+
});
|
|
110
|
+
const messageIdempotencyIndexSchema = ss.object({
|
|
111
|
+
runId: idSchema,
|
|
112
|
+
messageId: idSchema,
|
|
113
|
+
timestamp: temporalInstantSchema
|
|
114
|
+
});
|
|
115
|
+
//#endregion
|
|
116
|
+
export { cleanupIndexKeySchema, cleanupMarkerRecordSchema, cleanupModeSchema, lockRecordSchema, messageIdempotencyIndexSchema, scheduleRecordSchema, stepAttemptRecordSchema, stepAttemptStatusSchema };
|
|
@@ -1,10 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { StepDefinition, StepDefinitionHandler, StepRunConfig } from "./types/step.mjs";
|
|
2
2
|
//#region src/step-definition.d.ts
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
type WorkflowStepHandlerOutput<THandler extends WorkflowStepHandler> = THandler extends ((...args: never[]) => infer TOutput) ? Awaited<TOutput> : never;
|
|
7
|
-
/** Defines a workflow step. */
|
|
8
|
-
declare function defineWorkflowStep<THandler extends WorkflowStepHandler>(config: WorkflowStepRunConfig, handler: THandler): WorkflowStepDefinition<WorkflowStepHandlerArgs<THandler>, WorkflowStepHandlerOutput<THandler>>;
|
|
9
|
-
//#endregion
|
|
10
|
-
export { defineWorkflowStep };
|
|
3
|
+
/** Defines a durable step whose handler receives context before its typed arguments. */
|
|
4
|
+
export declare function defineWorkflowStep<TArgs extends readonly unknown[], TOutput>(config: StepRunConfig, handler: StepDefinitionHandler<TArgs, TOutput>): StepDefinition<TArgs, TOutput>;
|
|
5
|
+
//#endregion
|
package/dist/step-definition.mjs
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { WorkflowDefinitionError } from "./errors/definition.mjs";
|
|
2
2
|
import "./errors/mod.mjs";
|
|
3
3
|
//#region src/step-definition.ts
|
|
4
|
-
/** Defines a
|
|
4
|
+
/** Defines a durable step whose handler receives context before its typed arguments. */
|
|
5
5
|
function defineWorkflowStep(config, handler) {
|
|
6
6
|
const commandId = config.commandId ?? config.name;
|
|
7
|
-
if (commandId === void 0) WorkflowDefinitionError
|
|
7
|
+
if (commandId === void 0) throw new WorkflowDefinitionError("Workflow step name or commandId is required");
|
|
8
8
|
return {
|
|
9
9
|
config,
|
|
10
10
|
name: commandId,
|
|
@@ -1,14 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { StoreCapabilities, WorkflowStorage } from "../types/store.mjs";
|
|
2
2
|
//#region src/store/capabilities.d.ts
|
|
3
3
|
/** Detects which coordination capabilities are available on a workflow store backend. */
|
|
4
|
-
declare function getWorkflowStoreCapabilities(storage: WorkflowStorage):
|
|
4
|
+
export declare function getWorkflowStoreCapabilities(storage: WorkflowStorage): StoreCapabilities;
|
|
5
5
|
/** Validates workflow store capabilities and throws when the requirement is not met. */
|
|
6
|
-
declare function
|
|
7
|
-
readonly capabilities:
|
|
8
|
-
}, requirements:
|
|
6
|
+
export declare function requireStoreCapabilities(store: {
|
|
7
|
+
readonly capabilities: StoreCapabilities;
|
|
8
|
+
}, requirements: readonly (readonly [capability: keyof StoreCapabilities, label: string])[]): void;
|
|
9
9
|
/** Returns whether a storage backend can reject stale single-key writes. */
|
|
10
|
-
declare function
|
|
10
|
+
export declare function supportsConditionalWrite(storage: WorkflowStorage): boolean;
|
|
11
11
|
/** Returns whether a storage backend can atomically reject stale multi-key writes. */
|
|
12
|
-
declare function
|
|
13
|
-
//#endregion
|
|
14
|
-
export { getWorkflowStoreCapabilities, requireWorkflowStoreCapabilities, supportsWorkflowAtomicBatchWrite, supportsWorkflowConditionalWrite };
|
|
12
|
+
export declare function supportsAtomicBatchWrite(storage: WorkflowStorage): boolean;
|
|
13
|
+
//#endregion
|
|
@@ -3,8 +3,8 @@ import "../errors/mod.mjs";
|
|
|
3
3
|
//#region src/store/capabilities.ts
|
|
4
4
|
/** Detects which coordination capabilities are available on a workflow store backend. */
|
|
5
5
|
function getWorkflowStoreCapabilities(storage) {
|
|
6
|
-
const conditionalWrites =
|
|
7
|
-
const conditionalBatches =
|
|
6
|
+
const conditionalWrites = supportsConditionalWrite(storage);
|
|
7
|
+
const conditionalBatches = supportsAtomicBatchWrite(storage);
|
|
8
8
|
return {
|
|
9
9
|
conditionalWrites,
|
|
10
10
|
conditionalRunClaims: conditionalWrites,
|
|
@@ -27,16 +27,16 @@ function getWorkflowStoreCapabilities(storage) {
|
|
|
27
27
|
};
|
|
28
28
|
}
|
|
29
29
|
/** Validates workflow store capabilities and throws when the requirement is not met. */
|
|
30
|
-
function
|
|
31
|
-
for (const [capability, label] of
|
|
30
|
+
function requireStoreCapabilities(store, requirements) {
|
|
31
|
+
for (const [capability, label] of requirements) if (store.capabilities[capability] !== true) WorkflowCapabilityError.unsupported(label ?? `workflow store ${capability}`);
|
|
32
32
|
}
|
|
33
33
|
/** Returns whether a storage backend can reject stale single-key writes. */
|
|
34
|
-
function
|
|
34
|
+
function supportsConditionalWrite(storage) {
|
|
35
35
|
return storage.capabilities.compareAndSet;
|
|
36
36
|
}
|
|
37
37
|
/** Returns whether a storage backend can atomically reject stale multi-key writes. */
|
|
38
|
-
function
|
|
38
|
+
function supportsAtomicBatchWrite(storage) {
|
|
39
39
|
return storage.capabilities.compareAndSetMany;
|
|
40
40
|
}
|
|
41
41
|
//#endregion
|
|
42
|
-
export { getWorkflowStoreCapabilities,
|
|
42
|
+
export { getWorkflowStoreCapabilities, requireStoreCapabilities, supportsAtomicBatchWrite, supportsConditionalWrite };
|
package/dist/store/cleanup.d.mts
CHANGED
|
@@ -1,18 +1,13 @@
|
|
|
1
|
-
import { RunId } from "../types/run-id.mjs";
|
|
2
1
|
import { CleanupMarkerRecord, CleanupRunsOptions, CleanupRunsResult } from "../types/cleanup.mjs";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { WorkflowCleanupIndexKey, WorkflowStorage } from "../types/store.mjs";
|
|
2
|
+
import { ListRunsOptions } from "../types/run-list.mjs";
|
|
3
|
+
import { RunRecord } from "../types/run.mjs";
|
|
4
|
+
import { CleanupIndexKey, WorkflowStorage } from "../types/store.mjs";
|
|
7
5
|
//#region src/store/cleanup.d.ts
|
|
8
|
-
interface
|
|
9
|
-
listRuns(options:
|
|
6
|
+
interface CleanupRunLister {
|
|
7
|
+
listRuns(options: ListRunsOptions): Promise<readonly RunRecord[]>;
|
|
10
8
|
}
|
|
11
|
-
declare function
|
|
12
|
-
declare function
|
|
13
|
-
declare function
|
|
14
|
-
declare function deleteCleanupIndexes(storage: WorkflowStorage, indexes: readonly WorkflowCleanupIndexKey[]): Promise<number>;
|
|
15
|
-
declare function cleanupRuns(storage: WorkflowStorage, namespace: string, runs: WorkflowCleanupRunLister, options: CleanupRunsOptions): Promise<CleanupRunsResult>;
|
|
16
|
-
declare function listCleanupMarkers(storage: WorkflowStorage, namespace: string): Promise<readonly CleanupMarkerRecord[]>;
|
|
9
|
+
export declare function deleteCleanupIndexes(storage: WorkflowStorage, indexes: readonly CleanupIndexKey[]): Promise<number>;
|
|
10
|
+
export declare function cleanupRuns(storage: WorkflowStorage, namespace: string, runs: CleanupRunLister, options: CleanupRunsOptions): Promise<CleanupRunsResult>;
|
|
11
|
+
export declare function listCleanupMarkers(storage: WorkflowStorage, namespace: string): Promise<readonly CleanupMarkerRecord[]>;
|
|
17
12
|
//#endregion
|
|
18
|
-
export {
|
|
13
|
+
export {};
|
package/dist/store/cleanup.mjs
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
+
import { compareOptionalTimestamps } from "../temporal.mjs";
|
|
2
|
+
import { WorkflowErrorCode } from "../errors/codes.mjs";
|
|
1
3
|
import { WorkflowStateError } from "../errors/base.mjs";
|
|
2
|
-
import { isTerminalWorkflowRunStatus } from "../utility.mjs";
|
|
3
4
|
import "../errors/mod.mjs";
|
|
4
|
-
import { omitUndefined } from "../collection.mjs";
|
|
5
|
-
import { compareOptionalTimestamps } from "../temporal.mjs";
|
|
6
|
-
import { supportsWorkflowConditionalWrite } from "./capabilities.mjs";
|
|
5
|
+
import { omitUndefined, uniqueBy } from "../collection.mjs";
|
|
7
6
|
import { isStepAttemptKey, makeCleanupMarkerKey, makeCleanupMarkerKeyPrefix, makeEventsKey, makeIdempotencyKey, makeMessageIdempotencyKey, makeRunKey, makeStepAttemptKeyPrefix } from "../store-keys.mjs";
|
|
8
|
-
import {
|
|
7
|
+
import { isTerminalRunStatus } from "../run-status.mjs";
|
|
8
|
+
import { supportsConditionalWrite } from "./capabilities.mjs";
|
|
9
9
|
import { toStorageValue } from "./storage-value.mjs";
|
|
10
10
|
import { isReadableMessageIdempotencyIndex, isSameMessageIdempotencyIndex, readableCleanupMarkerRecord } from "./validation.mjs";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
11
|
+
import { getReadableStoredRun } from "./run.mjs";
|
|
12
|
+
import { messageIdempotencyIndexValuesFromEvents } from "./indexes.mjs";
|
|
13
|
+
import { getStoredCleanupEventHistory } from "./events.mjs";
|
|
14
|
+
import { deepEquals } from "@temelj/value";
|
|
14
15
|
//#region src/store/cleanup.ts
|
|
15
16
|
async function stepAttemptKeysForCleanup(storage, namespace, runId) {
|
|
16
17
|
const prefix = makeStepAttemptKeyPrefix(namespace, runId);
|
|
@@ -34,19 +35,19 @@ async function idempotencyIndexesForCleanup(storage, namespace, run) {
|
|
|
34
35
|
}] : [];
|
|
35
36
|
}
|
|
36
37
|
async function deleteCleanupIndexes(storage, indexes) {
|
|
37
|
-
const uniqueIndexes = indexes
|
|
38
|
-
if (!
|
|
38
|
+
const uniqueIndexes = uniqueBy(indexes, (index) => index.key);
|
|
39
|
+
if (!supportsConditionalWrite(storage)) {
|
|
39
40
|
const currentIndexes = await Promise.all(uniqueIndexes.map(async (index) => ({
|
|
40
41
|
...index,
|
|
41
42
|
current: await storage.get(index.key)
|
|
42
43
|
})));
|
|
43
44
|
return await storage.deleteMany(currentIndexes.flatMap((index) => workflowCleanupIndexMatchesCurrentValue(index.current, index.value) ? [index.key] : []));
|
|
44
45
|
}
|
|
45
|
-
return (await Promise.all(uniqueIndexes.map(
|
|
46
|
+
return (await Promise.all(uniqueIndexes.map((index) => storage.compareAndSet(index.key, index.value, void 0)))).filter((value) => value).length;
|
|
46
47
|
}
|
|
47
48
|
function workflowCleanupIndexMatchesCurrentValue(current, expected) {
|
|
48
49
|
if (isReadableMessageIdempotencyIndex(expected)) return isSameMessageIdempotencyIndex(current, expected);
|
|
49
|
-
return
|
|
50
|
+
return deepEquals(current, expected);
|
|
50
51
|
}
|
|
51
52
|
function messageIdempotencyIndexesFromEvents(namespace, runId, events) {
|
|
52
53
|
return messageIdempotencyIndexValuesFromEvents(events, runId).map(({ idempotencyKey, value }) => ({
|
|
@@ -55,12 +56,16 @@ function messageIdempotencyIndexesFromEvents(namespace, runId, events) {
|
|
|
55
56
|
}));
|
|
56
57
|
}
|
|
57
58
|
function idempotencyKeyFromRun(namespace, run) {
|
|
58
|
-
if (run.idempotencyKey === void 0) WorkflowStateError
|
|
59
|
-
|
|
59
|
+
if (run.idempotencyKey === void 0) throw new WorkflowStateError(`Workflow run does not have an idempotency key: ${run.id}`, {
|
|
60
|
+
code: WorkflowErrorCode.STATE_RUN_MISSING_IDEMPOTENCY_KEY,
|
|
61
|
+
details: { runId: run.id }
|
|
62
|
+
});
|
|
63
|
+
const options = {
|
|
60
64
|
workflowName: run.workflowName,
|
|
61
|
-
|
|
65
|
+
workflowVersion: run.workflowVersion,
|
|
62
66
|
idempotencyKey: run.idempotencyKey
|
|
63
|
-
}
|
|
67
|
+
};
|
|
68
|
+
return makeIdempotencyKey(namespace, options);
|
|
64
69
|
}
|
|
65
70
|
function toCleanupIndex(entry) {
|
|
66
71
|
return {
|
|
@@ -72,28 +77,24 @@ function isCurrentMessageIdempotencyIndex(eventIndexes, value) {
|
|
|
72
77
|
if (!isReadableMessageIdempotencyIndex(value)) return false;
|
|
73
78
|
return eventIndexes.some((eventIndex) => isSameMessageIdempotencyIndex(value, eventIndex.value));
|
|
74
79
|
}
|
|
75
|
-
function uniqueCleanupIndexKey(index, position, indexes) {
|
|
76
|
-
return indexes.findIndex((current) => current.key === index.key) === position;
|
|
77
|
-
}
|
|
78
80
|
async function cleanupRuns(storage, namespace, runs, options) {
|
|
79
|
-
const
|
|
80
|
-
const
|
|
81
|
-
const statusFilter = cleanupOptions.status ?? [
|
|
81
|
+
const limit = options.limit;
|
|
82
|
+
const statusFilter = options.status ?? [
|
|
82
83
|
"completed",
|
|
83
84
|
"failed",
|
|
84
85
|
"canceled"
|
|
85
86
|
];
|
|
86
|
-
const selectedRuns = (await runs.listRuns({
|
|
87
|
+
const selectedRuns = uniqueBy((await runs.listRuns({
|
|
87
88
|
status: Array.isArray(statusFilter) ? [...statusFilter] : statusFilter,
|
|
88
|
-
workflowName:
|
|
89
|
-
workflowVersion:
|
|
90
|
-
idempotencyKey:
|
|
91
|
-
parentRunId:
|
|
92
|
-
parentStepId:
|
|
93
|
-
parentStepName:
|
|
94
|
-
parentStepAttempt:
|
|
95
|
-
})).filter((run) =>
|
|
96
|
-
const stepAttemptKeysByRun = await Promise.all(selectedRuns.map(
|
|
89
|
+
workflowName: options.workflowName,
|
|
90
|
+
workflowVersion: options.workflowVersion,
|
|
91
|
+
idempotencyKey: options.idempotencyKey,
|
|
92
|
+
parentRunId: options.parentRunId,
|
|
93
|
+
parentStepId: options.parentStepId,
|
|
94
|
+
parentStepName: options.parentStepName,
|
|
95
|
+
parentStepAttempt: options.parentStepAttempt
|
|
96
|
+
})).filter((run) => isRunEligibleForCleanup(run, options)).sort(compareCleanupRuns), (run) => run.id).slice(0, limit);
|
|
97
|
+
const stepAttemptKeysByRun = await Promise.all(selectedRuns.map((run) => stepAttemptKeysForCleanup(storage, namespace, run.id)));
|
|
97
98
|
const stepAttemptKeys = stepAttemptKeysByRun.flat();
|
|
98
99
|
const eventKeysByRun = selectedRuns.map((run) => makeEventsKey(namespace, run.id));
|
|
99
100
|
const storedEventsByRun = await Promise.all(eventKeysByRun.map(async (key) => {
|
|
@@ -110,13 +111,13 @@ async function cleanupRuns(storage, namespace, runs, options) {
|
|
|
110
111
|
key: makeRunKey(namespace, run.id),
|
|
111
112
|
run
|
|
112
113
|
}));
|
|
113
|
-
const idempotencyIndexesByRun = await Promise.all(selectedRuns.map(
|
|
114
|
+
const idempotencyIndexesByRun = await Promise.all(selectedRuns.map((run) => idempotencyIndexesForCleanup(storage, namespace, run)));
|
|
114
115
|
const idempotencyKeysByRun = idempotencyIndexesByRun.map((indexes) => indexes.map((index) => index.key));
|
|
115
116
|
const idempotencyKeys = idempotencyKeysByRun.flat();
|
|
116
|
-
const messageIdempotencyIndexesByRun = await Promise.all(selectedRuns.map(
|
|
117
|
+
const messageIdempotencyIndexesByRun = await Promise.all(selectedRuns.map((run, index) => messageIdempotencyIndexesForCleanup(storage, namespace, run.id, runEvents[index] ?? [])));
|
|
117
118
|
const messageIdempotencyKeysByRun = messageIdempotencyIndexesByRun.map((indexes) => indexes.map((index) => index.key));
|
|
118
119
|
const messageIdempotencyKeys = messageIdempotencyKeysByRun.flat();
|
|
119
|
-
const deletionResults =
|
|
120
|
+
const deletionResults = options.dryRun === true ? selectedRuns.map(() => ({
|
|
120
121
|
cleanupMarkerCreated: false,
|
|
121
122
|
cleanupMarkerDeleted: false,
|
|
122
123
|
runDeleted: false,
|
|
@@ -142,42 +143,42 @@ async function cleanupRuns(storage, namespace, runs, options) {
|
|
|
142
143
|
return {
|
|
143
144
|
mode: "best_effort",
|
|
144
145
|
runIds: selectedRuns.map((run) => run.id),
|
|
145
|
-
runs: selectedRuns.map((run, index) =>
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
146
|
+
runs: selectedRuns.map((run, index) => {
|
|
147
|
+
return {
|
|
148
|
+
mode: "best_effort",
|
|
149
|
+
runId: run.id,
|
|
150
|
+
workflowName: run.workflowName,
|
|
151
|
+
workflowVersion: run.workflowVersion,
|
|
152
|
+
status: isTerminalRunStatus(run.status) ? run.status : (() => {
|
|
153
|
+
WorkflowStateError.cleanupSelectedNonTerminalRun(run.id);
|
|
154
|
+
})(),
|
|
155
|
+
createdAt: run.createdAt,
|
|
156
|
+
updatedAt: run.updatedAt,
|
|
157
|
+
finishedAt: cleanupFinishedAt(run),
|
|
158
|
+
idempotencyKey: run.idempotencyKey,
|
|
159
|
+
parentRunId: run.parentRunId,
|
|
160
|
+
parentStepId: run.parentStepId,
|
|
161
|
+
parentStepName: run.parentStepName,
|
|
162
|
+
parentStepAttempt: run.parentStepAttempt,
|
|
163
|
+
events: runEvents[index]?.length ?? 0,
|
|
164
|
+
stepAttempts: stepAttemptKeysByRun[index]?.length ?? 0,
|
|
165
|
+
idempotencyKeys: idempotencyKeysByRun[index]?.length ?? 0,
|
|
166
|
+
messageIdempotencyKeys: messageIdempotencyKeysByRun[index]?.length ?? 0,
|
|
167
|
+
cleanupMarkerCreated: deletionResults[index]?.cleanupMarkerCreated ?? false,
|
|
168
|
+
cleanupMarkerDeleted: deletionResults[index]?.cleanupMarkerDeleted ?? false,
|
|
169
|
+
runDeleted: deletionResults[index]?.runDeleted ?? false,
|
|
170
|
+
deletedEvents: deletionResults[index]?.deletedEvents ?? 0,
|
|
171
|
+
deletedStepAttempts: deletionResults[index]?.deletedStepAttempts ?? 0,
|
|
172
|
+
deletedIdempotencyKeys: deletionResults[index]?.deletedIdempotencyKeys ?? 0,
|
|
173
|
+
deletedMessageIdempotencyKeys: deletionResults[index]?.deletedMessageIdempotencyKeys ?? 0
|
|
174
|
+
};
|
|
175
|
+
}),
|
|
176
|
+
dryRun: options.dryRun === true ? true : void 0,
|
|
177
|
+
matchedRuns: options.dryRun === true ? selectedRuns.length : void 0,
|
|
178
|
+
matchedEvents: options.dryRun === true ? eventKeys.length : void 0,
|
|
179
|
+
matchedStepAttempts: options.dryRun === true ? stepAttemptKeys.length : void 0,
|
|
180
|
+
matchedIdempotencyKeys: options.dryRun === true ? idempotencyKeys.length : void 0,
|
|
181
|
+
matchedMessageIdempotencyKeys: options.dryRun === true ? messageIdempotencyKeys.length : void 0,
|
|
181
182
|
deletedRuns,
|
|
182
183
|
createdCleanupMarkers,
|
|
183
184
|
deletedCleanupMarkers,
|
|
@@ -189,7 +190,7 @@ async function cleanupRuns(storage, namespace, runs, options) {
|
|
|
189
190
|
}
|
|
190
191
|
async function listCleanupMarkers(storage, namespace) {
|
|
191
192
|
const prefix = makeCleanupMarkerKeyPrefix(namespace);
|
|
192
|
-
return (await Promise.all((await storage.keys({ prefix })).filter((key) => isCleanupMarkerKey(key, prefix)).map(
|
|
193
|
+
return (await Promise.all((await storage.keys({ prefix })).filter((key) => isCleanupMarkerKey(key, prefix)).map((key) => storage.get(key)))).flatMap((marker) => {
|
|
193
194
|
const parsed = readableCleanupMarkerRecord(marker);
|
|
194
195
|
return parsed === void 0 ? [] : [parsed];
|
|
195
196
|
}).sort(compareCleanupMarkers);
|
|
@@ -207,11 +208,14 @@ function countCleanupDeletionResult(results, key) {
|
|
|
207
208
|
return results.filter((result) => result[key]).length;
|
|
208
209
|
}
|
|
209
210
|
function cleanupFinishedAt(run) {
|
|
210
|
-
if (run.finishedAt === void 0) WorkflowStateError
|
|
211
|
+
if (run.finishedAt === void 0) throw new WorkflowStateError(`Workflow cleanup run is missing finishedAt: ${run.id}`, {
|
|
212
|
+
code: WorkflowErrorCode.STATE_CLEANUP_RUN_MISSING_FINISHED_AT,
|
|
213
|
+
details: { runId: run.id }
|
|
214
|
+
});
|
|
211
215
|
return run.finishedAt;
|
|
212
216
|
}
|
|
213
|
-
function
|
|
214
|
-
if (!
|
|
217
|
+
function isRunEligibleForCleanup(run, options) {
|
|
218
|
+
if (!isTerminalRunStatus(run.status) || run.finishedAt === void 0) return false;
|
|
215
219
|
if (Temporal.Instant.compare(run.finishedAt, options.finishedAtBefore) >= 0) return false;
|
|
216
220
|
return options.status === void 0 || matchesCleanupStatus(run.status, options.status);
|
|
217
221
|
}
|
|
@@ -225,9 +229,6 @@ function compareCleanupRuns(left, right) {
|
|
|
225
229
|
if (createdOrder !== 0) return createdOrder;
|
|
226
230
|
return left.id.localeCompare(right.id);
|
|
227
231
|
}
|
|
228
|
-
function isFirstCleanupRunForId(run, index, runs) {
|
|
229
|
-
return runs.findIndex((entry) => entry.id === run.id) === index;
|
|
230
|
-
}
|
|
231
232
|
async function deleteCleanupRunsAndArtifacts(storage, options) {
|
|
232
233
|
const markers = await createCleanupMarkers(storage, options);
|
|
233
234
|
const deletedRuns = await deleteCleanupRunRecords(storage, options.runs);
|
|
@@ -279,8 +280,8 @@ async function createCleanupMarkers(storage, options) {
|
|
|
279
280
|
mode: "best_effort",
|
|
280
281
|
runId: run.id,
|
|
281
282
|
workflowName: run.workflowName,
|
|
282
|
-
|
|
283
|
-
status:
|
|
283
|
+
workflowVersion: run.workflowVersion,
|
|
284
|
+
status: isTerminalRunStatus(run.status) ? run.status : (() => {
|
|
284
285
|
WorkflowStateError.cleanupSelectedNonTerminalRun(run.id);
|
|
285
286
|
})(),
|
|
286
287
|
createdAt: run.createdAt,
|
|
@@ -302,14 +303,14 @@ function deletionCompleted(options) {
|
|
|
302
303
|
return options.deletedEvents === options.expectedEvents && options.deletedStepAttempts === options.expectedStepAttempts && options.deletedIdempotencyKeys === options.expectedIdempotencyKeys && options.deletedMessageIdempotencyKeys === options.expectedMessageIdempotencyKeys;
|
|
303
304
|
}
|
|
304
305
|
async function deleteCleanupRunRecords(storage, runs) {
|
|
305
|
-
if (!
|
|
306
|
+
if (!supportsConditionalWrite(storage)) {
|
|
306
307
|
const deletedRuns = (await Promise.all(runs.map(async (run) => {
|
|
307
|
-
return await
|
|
308
|
-
}))).map((latest, index) => latest !== void 0 &&
|
|
308
|
+
return await getReadableStoredRun(storage, run.run.namespace, run.run.id);
|
|
309
|
+
}))).map((latest, index) => latest !== void 0 && deepEquals(omitUndefined(latest), omitUndefined(runs[index].run)));
|
|
309
310
|
await storage.deleteMany(runs.flatMap((run, index) => deletedRuns[index] === true ? [run.key] : []));
|
|
310
311
|
return deletedRuns;
|
|
311
312
|
}
|
|
312
|
-
return await Promise.all(runs.map(
|
|
313
|
+
return await Promise.all(runs.map((run) => storage.compareAndSet(run.key, toStorageValue(run.run), void 0)));
|
|
313
314
|
}
|
|
314
315
|
//#endregion
|
|
315
|
-
export { cleanupRuns, deleteCleanupIndexes,
|
|
316
|
+
export { cleanupRuns, deleteCleanupIndexes, listCleanupMarkers };
|
package/dist/store/create.d.mts
CHANGED
|
@@ -1,52 +1,51 @@
|
|
|
1
|
-
import { RunId } from "../types/
|
|
1
|
+
import { RunId } from "../types/ids.mjs";
|
|
2
2
|
import { CleanupMarkerRecord, CleanupRunsOptions, CleanupRunsResult } from "../types/cleanup.mjs";
|
|
3
3
|
import { WorkflowPage } from "../types/pagination.mjs";
|
|
4
4
|
import { ListSchedulesOptions, ListSchedulesPageOptions, ScheduleRecord } from "../types/schedule.mjs";
|
|
5
5
|
import { LockRecord } from "../types/lock.mjs";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
6
|
+
import { ListRunsOptions, ListRunsPageOptions, ListStepAttemptsPageOptions } from "../types/run-list.mjs";
|
|
7
|
+
import { ListStepAttemptsOptions, StepAttemptRecord } from "../types/step-attempts.mjs";
|
|
8
|
+
import { RunRecord } from "../types/run.mjs";
|
|
9
9
|
import { EventRecord } from "../types/events.mjs";
|
|
10
|
-
import { CreateWorkflowStoreOptions,
|
|
10
|
+
import { ClaimRunOptions, CreateWorkflowStoreOptions, ExtendRunLeaseOptions, IdempotencyKeyOptions, MessageIdempotencyIndex, ReleaseRunLeaseOptions, StoreCapabilities, WorkflowEventHistoryChangeWaitOptions, WorkflowStorage, WorkflowStore as WorkflowStore$1 } from "../types/store.mjs";
|
|
11
11
|
//#region src/store/create.d.ts
|
|
12
|
-
declare function createWorkflowStore(options?: CreateWorkflowStoreOptions): WorkflowStore$1;
|
|
12
|
+
export declare function createWorkflowStore(options?: CreateWorkflowStoreOptions): WorkflowStore$1;
|
|
13
13
|
/** Storage-backed workflow store implementation. */
|
|
14
|
-
declare class WorkflowStore implements WorkflowStore$1 {
|
|
14
|
+
export declare class WorkflowStore implements WorkflowStore$1 {
|
|
15
15
|
readonly storage: WorkflowStorage;
|
|
16
16
|
readonly namespace: string;
|
|
17
|
-
readonly capabilities:
|
|
17
|
+
readonly capabilities: StoreCapabilities;
|
|
18
18
|
constructor(options?: CreateWorkflowStoreOptions);
|
|
19
|
-
createRun(run:
|
|
20
|
-
getRun(runId: RunId): Promise<
|
|
21
|
-
getRunByIdempotencyKey(options:
|
|
22
|
-
updateRun(run:
|
|
23
|
-
updateRunIfCurrent(current:
|
|
24
|
-
listRuns(options?:
|
|
25
|
-
listRunsPage(options?:
|
|
26
|
-
countRuns(options?:
|
|
27
|
-
claimRun(options:
|
|
28
|
-
extendRunLease(options:
|
|
29
|
-
releaseRunLease(options:
|
|
19
|
+
createRun(run: RunRecord): Promise<RunRecord>;
|
|
20
|
+
getRun(runId: RunId): Promise<RunRecord | undefined>;
|
|
21
|
+
getRunByIdempotencyKey(options: IdempotencyKeyOptions): Promise<RunRecord | undefined>;
|
|
22
|
+
updateRun(run: RunRecord): Promise<RunRecord>;
|
|
23
|
+
updateRunIfCurrent(current: RunRecord, next: RunRecord): Promise<RunRecord | undefined>;
|
|
24
|
+
listRuns(options?: ListRunsOptions): Promise<readonly RunRecord[]>;
|
|
25
|
+
listRunsPage(options?: ListRunsPageOptions): Promise<WorkflowPage<RunRecord>>;
|
|
26
|
+
countRuns(options?: ListRunsOptions): Promise<number>;
|
|
27
|
+
claimRun(options: ClaimRunOptions): Promise<RunRecord | undefined>;
|
|
28
|
+
extendRunLease(options: ExtendRunLeaseOptions): Promise<RunRecord | undefined>;
|
|
29
|
+
releaseRunLease(options: ReleaseRunLeaseOptions): Promise<RunRecord | undefined>;
|
|
30
30
|
appendEvent(runId: RunId, event: EventRecord): Promise<readonly EventRecord[]>;
|
|
31
|
-
appendEventIfRunCurrent(current:
|
|
31
|
+
appendEventIfRunCurrent(current: RunRecord, event: EventRecord): Promise<readonly EventRecord[] | undefined>;
|
|
32
32
|
getEvents(runId: RunId): Promise<readonly EventRecord[]>;
|
|
33
33
|
waitForEventHistoryChange(runId: RunId, options?: WorkflowEventHistoryChangeWaitOptions): Promise<void>;
|
|
34
|
-
listStepAttempts(runId: RunId, options?:
|
|
35
|
-
listStepAttemptsPage(runId: RunId, options?:
|
|
36
|
-
countStepAttempts(runId: RunId, options?:
|
|
37
|
-
repairStepAttempts(runId: RunId): Promise<readonly
|
|
38
|
-
repairMessageIdempotencyIndexes(runId: RunId): Promise<readonly
|
|
34
|
+
listStepAttempts(runId: RunId, options?: ListStepAttemptsOptions): Promise<readonly StepAttemptRecord[]>;
|
|
35
|
+
listStepAttemptsPage(runId: RunId, options?: ListStepAttemptsPageOptions): Promise<WorkflowPage<StepAttemptRecord>>;
|
|
36
|
+
countStepAttempts(runId: RunId, options?: ListStepAttemptsOptions): Promise<number>;
|
|
37
|
+
repairStepAttempts(runId: RunId): Promise<readonly StepAttemptRecord[]>;
|
|
38
|
+
repairMessageIdempotencyIndexes(runId: RunId): Promise<readonly MessageIdempotencyIndex[]>;
|
|
39
39
|
hasMessageIdempotencyKey(runId: RunId, idempotencyKey: string): Promise<boolean>;
|
|
40
40
|
cleanupRuns(options: CleanupRunsOptions): Promise<CleanupRunsResult>;
|
|
41
41
|
listCleanupMarkers(): Promise<readonly CleanupMarkerRecord[]>;
|
|
42
|
-
createSchedule
|
|
42
|
+
createSchedule(schedule: ScheduleRecord): Promise<ScheduleRecord>;
|
|
43
43
|
getSchedule(scheduleId: string): Promise<ScheduleRecord | undefined>;
|
|
44
|
-
updateScheduleIfCurrent
|
|
44
|
+
updateScheduleIfCurrent(current: ScheduleRecord, next: ScheduleRecord): Promise<ScheduleRecord | undefined>;
|
|
45
45
|
listSchedules(options?: ListSchedulesOptions): Promise<readonly ScheduleRecord[]>;
|
|
46
46
|
listSchedulesPage(options?: ListSchedulesPageOptions): Promise<WorkflowPage<ScheduleRecord>>;
|
|
47
47
|
getLock(key: string): Promise<LockRecord | undefined>;
|
|
48
48
|
listLocks(): Promise<readonly LockRecord[]>;
|
|
49
49
|
updateLockIfCurrent(current: LockRecord | undefined, next: LockRecord): Promise<LockRecord | undefined>;
|
|
50
50
|
}
|
|
51
|
-
//#endregion
|
|
52
|
-
export { WorkflowStore, createWorkflowStore };
|
|
51
|
+
//#endregion
|