@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
package/dist/engine/hooks.mjs
CHANGED
|
@@ -1,51 +1,45 @@
|
|
|
1
|
+
import { WorkflowErrorCode } from "../errors/codes.mjs";
|
|
1
2
|
import { WorkflowHookError } from "../errors/hook.mjs";
|
|
2
3
|
import { WorkflowHookDisposedError } from "../errors/message.mjs";
|
|
4
|
+
import { matchesWorkflowError } from "../errors/records.mjs";
|
|
3
5
|
import "../errors/mod.mjs";
|
|
4
|
-
import {
|
|
6
|
+
import { WORKFLOW_HOOK_TOKEN_PREFIX, parseHookToken } from "../hook-token.mjs";
|
|
7
|
+
import { History } from "../history/replay.mjs";
|
|
5
8
|
import { serializeError, toOptionalPersistedValue, toPersistedValue } from "./serialization.mjs";
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import { sendWorkflowMessage, waitForWorkflowMessage } from "./message.mjs";
|
|
9
|
+
import { enforceEventHistoryNextLimit } from "./retry.mjs";
|
|
10
|
+
import { captureTelemetryContext } from "../telemetry.mjs";
|
|
11
|
+
import { sendWorkflowMessage, waitForMessage } from "./message.mjs";
|
|
10
12
|
import { encodeBase64UrlString } from "@temelj/string";
|
|
11
13
|
//#region src/engine/hooks.ts
|
|
12
14
|
const MAX_HOOK_DISPOSAL_APPEND_ATTEMPTS = 16;
|
|
13
|
-
function
|
|
14
|
-
return new Hook(runId, options, wait);
|
|
15
|
-
}
|
|
16
|
-
function createWebhook(runId, options, wait) {
|
|
17
|
-
return new Webhook(runId, options, wait);
|
|
18
|
-
}
|
|
19
|
-
function createWorkflowStepHookApi(environment) {
|
|
15
|
+
function createStepHookApi(environment) {
|
|
20
16
|
const { runId } = environment;
|
|
21
17
|
const tokens = /* @__PURE__ */ new Set();
|
|
18
|
+
function create(options) {
|
|
19
|
+
const hook = new Hook(runId, options, () => waitForMessage(environment, {
|
|
20
|
+
commandId: options.commandId ?? options.name,
|
|
21
|
+
messageId: options.messageId ?? options.name,
|
|
22
|
+
source: "hook",
|
|
23
|
+
timeout: options.timeout,
|
|
24
|
+
schema: options.schema
|
|
25
|
+
}));
|
|
26
|
+
requireUniqueStepHookToken(tokens, "hook", hook.name, hook.token);
|
|
27
|
+
return hook;
|
|
28
|
+
}
|
|
29
|
+
function createWebhook(options) {
|
|
30
|
+
const webhook = new Webhook(runId, options, () => waitForMessage(environment, {
|
|
31
|
+
commandId: options.commandId ?? options.name,
|
|
32
|
+
messageId: options.messageId ?? options.name,
|
|
33
|
+
source: "webhook",
|
|
34
|
+
timeout: options.timeout,
|
|
35
|
+
schema: options.schema
|
|
36
|
+
}));
|
|
37
|
+
requireUniqueStepHookToken(tokens, "webhook", webhook.name, webhook.token);
|
|
38
|
+
return webhook;
|
|
39
|
+
}
|
|
22
40
|
return {
|
|
23
|
-
create
|
|
24
|
-
|
|
25
|
-
return await waitForWorkflowMessage(environment, {
|
|
26
|
-
commandId: options.commandId ?? options.name,
|
|
27
|
-
messageId: options.messageId ?? options.name,
|
|
28
|
-
source: "hook",
|
|
29
|
-
...options.timeout === void 0 ? {} : { timeout: options.timeout },
|
|
30
|
-
...options.schema === void 0 ? {} : { schema: options.schema }
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
requireUniqueWorkflowStepHookToken(tokens, "hook", hook.name, hook.token);
|
|
34
|
-
return hook;
|
|
35
|
-
},
|
|
36
|
-
createWebhook(options) {
|
|
37
|
-
const webhook = createWebhook(runId, options, async () => {
|
|
38
|
-
return await waitForWorkflowMessage(environment, {
|
|
39
|
-
commandId: options.commandId ?? options.name,
|
|
40
|
-
messageId: options.messageId ?? options.name,
|
|
41
|
-
source: "webhook",
|
|
42
|
-
...options.timeout === void 0 ? {} : { timeout: options.timeout },
|
|
43
|
-
...options.schema === void 0 ? {} : { schema: options.schema }
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
requireUniqueWorkflowStepHookToken(tokens, "webhook", webhook.name, webhook.token);
|
|
47
|
-
return webhook;
|
|
48
|
-
}
|
|
41
|
+
create,
|
|
42
|
+
createWebhook
|
|
49
43
|
};
|
|
50
44
|
}
|
|
51
45
|
var Hook = class {
|
|
@@ -59,7 +53,8 @@ var Hook = class {
|
|
|
59
53
|
this.token = formatHookToken({
|
|
60
54
|
runId,
|
|
61
55
|
name: options.name,
|
|
62
|
-
messageId
|
|
56
|
+
messageId,
|
|
57
|
+
kind: "hook"
|
|
63
58
|
});
|
|
64
59
|
this.runId = runId;
|
|
65
60
|
this.name = options.name;
|
|
@@ -73,8 +68,11 @@ var Hook = class {
|
|
|
73
68
|
return this.wait().then(onfulfilled, onrejected);
|
|
74
69
|
}
|
|
75
70
|
};
|
|
76
|
-
function
|
|
77
|
-
if (tokens.has(token)) WorkflowHookError
|
|
71
|
+
function requireUniqueStepHookToken(tokens, kind, name, token) {
|
|
72
|
+
if (tokens.has(token)) throw new WorkflowHookError(`Workflow ${kind} token must be unique within a run: ${name}`, WorkflowErrorCode.HOOK_TOKEN_NOT_UNIQUE, {
|
|
73
|
+
kind,
|
|
74
|
+
name
|
|
75
|
+
});
|
|
78
76
|
tokens.add(token);
|
|
79
77
|
}
|
|
80
78
|
var Webhook = class {
|
|
@@ -87,13 +85,14 @@ var Webhook = class {
|
|
|
87
85
|
constructor(runId, options, wait) {
|
|
88
86
|
const messageId = options.messageId ?? options.name;
|
|
89
87
|
const metadata = options.metadata === void 0 ? void 0 : toPersistedValue(options.metadata, "workflow webhook metadata", {});
|
|
90
|
-
|
|
88
|
+
const token = {
|
|
91
89
|
runId,
|
|
92
90
|
name: options.name,
|
|
93
91
|
messageId,
|
|
94
92
|
kind: "webhook",
|
|
95
|
-
|
|
96
|
-
}
|
|
93
|
+
metadata
|
|
94
|
+
};
|
|
95
|
+
this.token = formatHookToken(token);
|
|
97
96
|
this.runId = runId;
|
|
98
97
|
this.name = options.name;
|
|
99
98
|
this.messageId = messageId;
|
|
@@ -107,56 +106,42 @@ var Webhook = class {
|
|
|
107
106
|
return this.wait().then(onfulfilled, onrejected);
|
|
108
107
|
}
|
|
109
108
|
};
|
|
110
|
-
async function resumeHook(token, options,
|
|
109
|
+
async function resumeHook(token, options, context) {
|
|
111
110
|
const hook = parseHookToken(token);
|
|
112
|
-
const payload = toOptionalPersistedValue(options?.payload,
|
|
113
|
-
const telemetryContext = captureTelemetryContext(
|
|
114
|
-
await sendWorkflowMessage(
|
|
111
|
+
const payload = toOptionalPersistedValue(options?.payload, `${hook.kind} payload`, context.limits);
|
|
112
|
+
const telemetryContext = captureTelemetryContext(context.telemetry);
|
|
113
|
+
await sendWorkflowMessage(context.store, hook.runId, {
|
|
115
114
|
messageId: hook.messageId,
|
|
116
115
|
payload,
|
|
117
116
|
idempotencyKey: options?.idempotencyKey
|
|
118
|
-
},
|
|
119
|
-
|
|
117
|
+
}, context.now, context.limits, context.observation.emitMessageSent, context.telemetry, telemetryContext);
|
|
118
|
+
context.observation.emitHookResumed(hook.kind, hook.runId, hook.messageId, payload, telemetryContext);
|
|
120
119
|
}
|
|
121
|
-
async function
|
|
122
|
-
|
|
123
|
-
const payload = toOptionalPersistedValue(options?.payload, "webhook payload", service.limits);
|
|
124
|
-
const telemetryContext = captureTelemetryContext(service.telemetry);
|
|
125
|
-
await sendWorkflowMessage(service.store, webhook.runId, {
|
|
126
|
-
messageId: webhook.messageId,
|
|
127
|
-
payload,
|
|
128
|
-
idempotencyKey: options?.idempotencyKey
|
|
129
|
-
}, service.now, service.limits, service.emitMessageSent, service.telemetry, telemetryContext);
|
|
130
|
-
service.emitWebhookResumed(webhook.runId, webhook.messageId, payload, telemetryContext);
|
|
131
|
-
}
|
|
132
|
-
async function disposeHook(token, service) {
|
|
133
|
-
return await disposeHookToken(token, parseHookToken(token), service);
|
|
134
|
-
}
|
|
135
|
-
async function disposeWebhook(token, service) {
|
|
136
|
-
return await disposeHookToken(token, parseWebhookToken(token), service);
|
|
120
|
+
async function disposeHook(token, context) {
|
|
121
|
+
return await disposeHookToken(token, parseHookToken(token), context);
|
|
137
122
|
}
|
|
138
123
|
async function getHookByToken(token, store, now) {
|
|
139
124
|
const hook = parseHookToken(token);
|
|
140
125
|
return inspectHookToken(token, await store.getRun(hook.runId), await store.getEvents(hook.runId), now);
|
|
141
126
|
}
|
|
142
|
-
async function disposeHookToken(token, hook,
|
|
127
|
+
async function disposeHookToken(token, hook, context) {
|
|
143
128
|
let timestamp;
|
|
144
129
|
for (let attempt = 0; attempt < MAX_HOOK_DISPOSAL_APPEND_ATTEMPTS; attempt++) {
|
|
145
|
-
const run = await
|
|
146
|
-
const events = run === void 0 ? [] : await
|
|
147
|
-
const inspection = inspectHookToken(token, run, events,
|
|
130
|
+
const run = await context.store.getRun(hook.runId);
|
|
131
|
+
const events = run === void 0 ? [] : await context.store.getEvents(hook.runId);
|
|
132
|
+
const inspection = inspectHookToken(token, run, events, context.now());
|
|
148
133
|
if (inspection.status !== "waiting") return inspection;
|
|
149
134
|
if (run === void 0) return inspection;
|
|
150
|
-
if (inspection.stepId === void 0) WorkflowHookError.
|
|
151
|
-
timestamp ??=
|
|
152
|
-
|
|
153
|
-
const appendedEvents = await
|
|
135
|
+
if (inspection.stepId === void 0) throw new WorkflowHookError("Workflow hook inspection is missing a waiting step id", WorkflowErrorCode.HOOK_WAITING_STEP_MISSING, void 0);
|
|
136
|
+
timestamp ??= context.now();
|
|
137
|
+
enforceEventHistoryNextLimit(events, context.limits);
|
|
138
|
+
const appendedEvents = await context.store.appendEventIfRunCurrent(run, {
|
|
154
139
|
kind: "message_wait_failed",
|
|
155
140
|
timestamp,
|
|
156
141
|
stepId: inspection.stepId,
|
|
157
142
|
stepName: hook.name,
|
|
158
143
|
messageId: hook.messageId,
|
|
159
|
-
error: serializeError(WorkflowHookDisposedError
|
|
144
|
+
error: serializeError(new WorkflowHookDisposedError({
|
|
160
145
|
runId: hook.runId,
|
|
161
146
|
stepId: inspection.stepId,
|
|
162
147
|
stepName: hook.name,
|
|
@@ -164,27 +149,25 @@ async function disposeHookToken(token, hook, service) {
|
|
|
164
149
|
}))
|
|
165
150
|
});
|
|
166
151
|
if (appendedEvents === void 0) continue;
|
|
167
|
-
if (run.status === "waiting") await
|
|
152
|
+
if (run.status === "waiting") await context.store.updateRunIfCurrent(run, {
|
|
168
153
|
...run,
|
|
169
154
|
availableAt: run.availableAt !== void 0 && Temporal.Instant.compare(run.availableAt, timestamp) <= 0 ? run.availableAt : timestamp,
|
|
170
155
|
updatedAt: timestamp,
|
|
171
156
|
lastTransitionAt: timestamp,
|
|
172
157
|
lastTransitionReason: "waiting",
|
|
173
|
-
deadlineAt: run.deadlineAt,
|
|
174
|
-
retryAt: run.retryAt,
|
|
175
158
|
error: void 0,
|
|
176
159
|
output: void 0,
|
|
177
160
|
finishedAt: void 0
|
|
178
161
|
});
|
|
179
|
-
return inspectHookToken(token, run, appendedEvents,
|
|
162
|
+
return inspectHookToken(token, run, appendedEvents, context.now());
|
|
180
163
|
}
|
|
181
|
-
const run = await
|
|
182
|
-
return inspectHookToken(token, run, run === void 0 ? [] : await
|
|
164
|
+
const run = await context.store.getRun(hook.runId);
|
|
165
|
+
return inspectHookToken(token, run, run === void 0 ? [] : await context.store.getEvents(hook.runId), context.now());
|
|
183
166
|
}
|
|
184
167
|
function inspectHookToken(token, run, events, now) {
|
|
185
168
|
const hook = parseHookToken(token);
|
|
186
169
|
if (run === void 0) return hookInspection(token, hook, "not-found");
|
|
187
|
-
const history = new
|
|
170
|
+
const history = new History(events);
|
|
188
171
|
const started = history.latestMessageWaitStartedByNameAndMessageId(hook.name, hook.messageId);
|
|
189
172
|
if (started === void 0) return hookInspection(token, hook, "not-found");
|
|
190
173
|
const terminal = history.latestMessageWaitTerminalAfterStarted(started);
|
|
@@ -193,7 +176,7 @@ function inspectHookToken(token, run, events, now) {
|
|
|
193
176
|
timeoutAt: started.timeoutAt,
|
|
194
177
|
payload: terminal.payload
|
|
195
178
|
});
|
|
196
|
-
if (terminal?.kind === "message_wait_failed") return hookInspection(token, hook,
|
|
179
|
+
if (terminal?.kind === "message_wait_failed") return hookInspection(token, hook, matchesWorkflowError(terminal.error, WorkflowErrorCode.HOOK_DISPOSED) ? "disposed" : "failed", {
|
|
197
180
|
stepId: started.stepId,
|
|
198
181
|
timeoutAt: started.timeoutAt,
|
|
199
182
|
error: terminal.error
|
|
@@ -219,19 +202,15 @@ function hookInspection(token, hook, status, state = {}) {
|
|
|
219
202
|
messageId: hook.messageId,
|
|
220
203
|
kind: hook.kind,
|
|
221
204
|
status,
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
205
|
+
metadata: hook.metadata,
|
|
206
|
+
stepId: state.stepId,
|
|
207
|
+
timeoutAt: state.timeoutAt,
|
|
208
|
+
payload: state.payload,
|
|
209
|
+
error: state.error
|
|
227
210
|
};
|
|
228
211
|
}
|
|
229
212
|
function formatHookToken(hook) {
|
|
230
|
-
|
|
231
|
-
v: 1,
|
|
232
|
-
...hook
|
|
233
|
-
};
|
|
234
|
-
return `${WORKFLOW_HOOK_TOKEN_PREFIX}v1:${encodeBase64UrlString(JSON.stringify(payload))}`;
|
|
213
|
+
return `${WORKFLOW_HOOK_TOKEN_PREFIX}v1:${encodeBase64UrlString(JSON.stringify(hook))}`;
|
|
235
214
|
}
|
|
236
215
|
//#endregion
|
|
237
|
-
export { Hook, Webhook,
|
|
216
|
+
export { Hook, Webhook, createStepHookApi, disposeHook, getHookByToken, resumeHook };
|
|
@@ -1,18 +1,26 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { RunId } from "../types/ids.mjs";
|
|
2
|
+
import { WorkflowPage } from "../types/pagination.mjs";
|
|
3
|
+
import { ListRunsOptions, ListStepAttemptsPageOptions } from "../types/run-list.mjs";
|
|
4
|
+
import { RecoverySummary, RunSummary } from "../types/summary.mjs";
|
|
5
|
+
import { ListStepAttemptsOptions, StepAttemptRecord, StepAttemptSummary } from "../types/step-attempts.mjs";
|
|
6
|
+
import { WorkflowStore } from "../types/store.mjs";
|
|
7
|
+
import { EngineContext } from "./context.mjs";
|
|
8
|
+
import { Timeline } from "../types/timeline.mjs";
|
|
3
9
|
//#region src/engine/inspection.d.ts
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
type WorkflowRecoverySummaryStore = WorkflowRunSummaryStore & WorkflowLockListerRepository & WorkflowScheduleListerRepository;
|
|
7
|
-
declare function getWorkflowRunSummary(options: {
|
|
8
|
-
readonly store: WorkflowRunSummaryStore;
|
|
10
|
+
export declare function getWorkflowRunSummary(options: {
|
|
11
|
+
readonly store: WorkflowStore;
|
|
9
12
|
readonly now: Temporal.Instant;
|
|
10
|
-
readonly filters?:
|
|
11
|
-
}): Promise<
|
|
12
|
-
declare function getWorkflowRecoverySummary(options: {
|
|
13
|
-
readonly store:
|
|
13
|
+
readonly filters?: ListRunsOptions;
|
|
14
|
+
}): Promise<RunSummary>;
|
|
15
|
+
export declare function getWorkflowRecoverySummary(options: {
|
|
16
|
+
readonly store: WorkflowStore;
|
|
14
17
|
readonly now: Temporal.Instant;
|
|
15
|
-
readonly filters?:
|
|
16
|
-
}): Promise<
|
|
17
|
-
|
|
18
|
-
export {
|
|
18
|
+
readonly filters?: ListRunsOptions;
|
|
19
|
+
}): Promise<RecoverySummary>;
|
|
20
|
+
/** A page of a run's step attempts. */
|
|
21
|
+
export declare function pageRunStepAttempts({ store }: EngineContext, runId: RunId, options?: ListStepAttemptsPageOptions): Promise<WorkflowPage<StepAttemptRecord>>;
|
|
22
|
+
export declare function countRunStepAttempts({ store }: EngineContext, runId: RunId, options?: ListStepAttemptsOptions): Promise<number>;
|
|
23
|
+
/** A run's step attempts, with the child runs its workflow steps started. */
|
|
24
|
+
export declare function getRunStepAttemptSummary({ store }: EngineContext, runId: RunId, options?: ListStepAttemptsOptions): Promise<StepAttemptSummary>;
|
|
25
|
+
export declare function getRunTimeline({ store }: EngineContext, runId: RunId): Promise<Timeline>;
|
|
26
|
+
//#endregion
|
|
@@ -1,32 +1,39 @@
|
|
|
1
|
+
import { WorkflowErrorCode } from "../errors/codes.mjs";
|
|
1
2
|
import { WorkflowOptionsError } from "../errors/base.mjs";
|
|
2
|
-
import { isActiveWorkflowRunStatus, isWorkflowRunStatus } from "../utility.mjs";
|
|
3
3
|
import "../errors/mod.mjs";
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
4
|
+
import { createTimeline } from "../history/timeline.mjs";
|
|
5
|
+
import "../history/replay.mjs";
|
|
6
|
+
import { isActiveRunStatus, isRunStatus } from "../run-status.mjs";
|
|
7
|
+
import { getRequiredRun } from "../store/query.mjs";
|
|
8
|
+
import { summarizeRecovery } from "./summary/recovery.mjs";
|
|
9
|
+
import { getChildRunsForAttempts, summarizeRuns } from "./summary/runs.mjs";
|
|
10
|
+
import { summarizeStepAttempts } from "./summary/step-attempts.mjs";
|
|
7
11
|
//#region src/engine/inspection.ts
|
|
8
|
-
function
|
|
9
|
-
return
|
|
12
|
+
function isKnownRunStatus(run) {
|
|
13
|
+
return isRunStatus(run.status);
|
|
10
14
|
}
|
|
11
15
|
function workflowRunCanHaveActiveWork(run) {
|
|
12
|
-
return
|
|
16
|
+
return isActiveRunStatus(run.status);
|
|
13
17
|
}
|
|
14
18
|
function workflowSummaryCleanupCutoff(filters) {
|
|
15
19
|
if (filters?.cleanupFinishedAtBefore === void 0) return;
|
|
16
20
|
const value = filters.cleanupFinishedAtBefore;
|
|
17
|
-
if (!(value instanceof Temporal.Instant)) WorkflowOptionsError
|
|
21
|
+
if (!(value instanceof Temporal.Instant)) throw new WorkflowOptionsError("Workflow cleanup finishedAtBefore must be a Temporal.Instant", {
|
|
22
|
+
code: WorkflowErrorCode.OPTIONS_EXPECTED_TEMPORAL_INSTANT,
|
|
23
|
+
details: { label: "Workflow cleanup finishedAtBefore" }
|
|
24
|
+
});
|
|
18
25
|
return value;
|
|
19
26
|
}
|
|
20
|
-
async function
|
|
27
|
+
async function listRunStepAttempts(store, runId, options) {
|
|
21
28
|
return await store.listStepAttempts(runId, options);
|
|
22
29
|
}
|
|
23
|
-
async function
|
|
24
|
-
return workflowRunCanHaveActiveWork(run) ? await
|
|
30
|
+
async function listActiveRunStepAttempts(store, run, kind) {
|
|
31
|
+
return workflowRunCanHaveActiveWork(run) ? await listRunStepAttempts(store, run.id, {
|
|
25
32
|
status: "running",
|
|
26
33
|
kind
|
|
27
34
|
}) : [];
|
|
28
35
|
}
|
|
29
|
-
async function
|
|
36
|
+
async function getRunSummaryActivityInputs(store, runs) {
|
|
30
37
|
const [runningChildWorkflows, runningSleeps, runningMessageWaits, runningEvents] = await Promise.all([
|
|
31
38
|
listRunningChildWorkflowWaits(store, runs),
|
|
32
39
|
listRunningStepWaits(store, runs, "sleep"),
|
|
@@ -42,12 +49,12 @@ async function getWorkflowRunSummaryActivityInputs(store, runs) {
|
|
|
42
49
|
}
|
|
43
50
|
async function listRunningChildWorkflowWaits(store, runs) {
|
|
44
51
|
return await Promise.all(runs.map(async (run) => {
|
|
45
|
-
if (!
|
|
52
|
+
if (!isKnownRunStatus(run)) return {
|
|
46
53
|
runId: run.id,
|
|
47
54
|
attempts: [],
|
|
48
55
|
childRuns: []
|
|
49
56
|
};
|
|
50
|
-
const attempts = await
|
|
57
|
+
const attempts = await listRunStepAttempts(store, run.id, {
|
|
51
58
|
status: "running",
|
|
52
59
|
kind: "workflow"
|
|
53
60
|
});
|
|
@@ -62,7 +69,7 @@ async function listRunningStepWaits(store, runs, kind) {
|
|
|
62
69
|
return await Promise.all(runs.map(async (run) => {
|
|
63
70
|
return {
|
|
64
71
|
runId: run.id,
|
|
65
|
-
attempts: await
|
|
72
|
+
attempts: await listActiveRunStepAttempts(store, run, kind)
|
|
66
73
|
};
|
|
67
74
|
}));
|
|
68
75
|
}
|
|
@@ -74,8 +81,8 @@ async function listRunningEventActivity(store, runs) {
|
|
|
74
81
|
};
|
|
75
82
|
}));
|
|
76
83
|
}
|
|
77
|
-
async function
|
|
78
|
-
return await Promise.all(runs.map(
|
|
84
|
+
async function listRunAttemptGroups(store, runs, options) {
|
|
85
|
+
return await Promise.all(runs.map((run) => listRunStepAttempts(store, run.id, options)));
|
|
79
86
|
}
|
|
80
87
|
async function getWorkflowRunSummary(options) {
|
|
81
88
|
const { store, now, filters } = options;
|
|
@@ -85,9 +92,9 @@ async function getWorkflowRunSummary(options) {
|
|
|
85
92
|
runs,
|
|
86
93
|
now,
|
|
87
94
|
cleanupCutoff,
|
|
88
|
-
...await
|
|
95
|
+
...await getRunSummaryActivityInputs(store, runs)
|
|
89
96
|
};
|
|
90
|
-
return
|
|
97
|
+
return summarizeRuns(summaryInputs);
|
|
91
98
|
}
|
|
92
99
|
async function getWorkflowRecoverySummary(options) {
|
|
93
100
|
const { store, now, filters } = options;
|
|
@@ -95,28 +102,28 @@ async function getWorkflowRecoverySummary(options) {
|
|
|
95
102
|
const activeRuns = runs.filter((run) => {
|
|
96
103
|
return workflowRunCanHaveActiveWork(run);
|
|
97
104
|
});
|
|
98
|
-
return
|
|
105
|
+
return summarizeRecovery({
|
|
99
106
|
runs,
|
|
100
107
|
now,
|
|
101
|
-
inputs: await
|
|
108
|
+
inputs: await getRecoverySummaryInputs(store, activeRuns)
|
|
102
109
|
});
|
|
103
110
|
}
|
|
104
|
-
async function
|
|
111
|
+
async function getRecoverySummaryInputs(store, activeRuns) {
|
|
105
112
|
const [sleepAttemptGroups, messageWaitAttemptGroups, childWorkflowAttemptGroups, lockWaitAttemptGroups, eventsByRunId, locks, schedules] = await Promise.all([
|
|
106
|
-
|
|
113
|
+
listRunAttemptGroups(store, activeRuns, {
|
|
107
114
|
status: "running",
|
|
108
115
|
kind: "sleep"
|
|
109
116
|
}),
|
|
110
|
-
|
|
117
|
+
listRunAttemptGroups(store, activeRuns, {
|
|
111
118
|
status: "running",
|
|
112
119
|
kind: "message-wait"
|
|
113
120
|
}),
|
|
114
121
|
listChildWorkflowAttemptGroups(store, activeRuns),
|
|
115
|
-
|
|
122
|
+
listRunAttemptGroups(store, activeRuns, {
|
|
116
123
|
status: "failed",
|
|
117
124
|
kind: "run"
|
|
118
125
|
}),
|
|
119
|
-
|
|
126
|
+
getRecoveryEventsByRunId(store, activeRuns),
|
|
120
127
|
store.listLocks(),
|
|
121
128
|
store.listSchedules()
|
|
122
129
|
]);
|
|
@@ -133,7 +140,7 @@ async function getWorkflowRecoverySummaryInputs(store, activeRuns) {
|
|
|
133
140
|
}
|
|
134
141
|
async function listChildWorkflowAttemptGroups(store, activeRuns) {
|
|
135
142
|
return await Promise.all(activeRuns.map(async (run) => {
|
|
136
|
-
const attempts = await
|
|
143
|
+
const attempts = await listRunStepAttempts(store, run.id, {
|
|
137
144
|
status: "running",
|
|
138
145
|
kind: "workflow"
|
|
139
146
|
});
|
|
@@ -144,8 +151,27 @@ async function listChildWorkflowAttemptGroups(store, activeRuns) {
|
|
|
144
151
|
};
|
|
145
152
|
}));
|
|
146
153
|
}
|
|
147
|
-
async function
|
|
154
|
+
async function getRecoveryEventsByRunId(store, activeRuns) {
|
|
148
155
|
return new Map(await Promise.all(activeRuns.map(async (run) => [run.id, await store.getEvents(run.id)])));
|
|
149
156
|
}
|
|
157
|
+
/** A page of a run's step attempts. */
|
|
158
|
+
async function pageRunStepAttempts({ store }, runId, options) {
|
|
159
|
+
await getRequiredRun(store, runId);
|
|
160
|
+
return await store.listStepAttemptsPage(runId, options);
|
|
161
|
+
}
|
|
162
|
+
async function countRunStepAttempts({ store }, runId, options) {
|
|
163
|
+
await getRequiredRun(store, runId);
|
|
164
|
+
return await store.countStepAttempts(runId, options);
|
|
165
|
+
}
|
|
166
|
+
/** A run's step attempts, with the child runs its workflow steps started. */
|
|
167
|
+
async function getRunStepAttemptSummary({ store }, runId, options) {
|
|
168
|
+
await getRequiredRun(store, runId);
|
|
169
|
+
const attempts = await store.listStepAttempts(runId, options);
|
|
170
|
+
return summarizeStepAttempts(attempts, await getChildRunsForAttempts(store, runId, attempts));
|
|
171
|
+
}
|
|
172
|
+
async function getRunTimeline({ store }, runId) {
|
|
173
|
+
const run = await getRequiredRun(store, runId);
|
|
174
|
+
return createTimeline(run, await store.getEvents(runId));
|
|
175
|
+
}
|
|
150
176
|
//#endregion
|
|
151
|
-
export { getWorkflowRecoverySummary, getWorkflowRunSummary };
|
|
177
|
+
export { countRunStepAttempts, getRunStepAttemptSummary, getRunTimeline, getWorkflowRecoverySummary, getWorkflowRunSummary, pageRunStepAttempts };
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
import { ObservationEmitter } from "../types/observation.mjs";
|
|
2
2
|
import { ExecutionResult } from "../types/result.mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { RunRecord } from "../types/run.mjs";
|
|
4
4
|
import { CreateWorkflowEngineOptions } from "../types/engine-options.mjs";
|
|
5
5
|
//#region src/engine/lifecycle.d.ts
|
|
6
|
-
declare function
|
|
7
|
-
interface
|
|
8
|
-
readonly emitLifecycleEvent: (run:
|
|
9
|
-
readonly emitResultLifecycleEvent: <TOutput>(result: ExecutionResult<TOutput>, previousRun?:
|
|
10
|
-
}
|
|
11
|
-
declare class WorkflowLifecycleEmitter implements WorkflowLifecycleEmitterContract {
|
|
12
|
-
#private;
|
|
13
|
-
constructor(options: CreateWorkflowEngineOptions, observation?: ObservationEmitter);
|
|
14
|
-
emitLifecycleEvent: (run: WorkflowRunRecord, previousRun?: WorkflowRunRecord) => Promise<void>;
|
|
15
|
-
emitResultLifecycleEvent: <TOutput>(result: ExecutionResult<TOutput>, previousRun?: WorkflowRunRecord) => Promise<ExecutionResult<TOutput>>;
|
|
6
|
+
export declare function createLifecycleEmitter(options: CreateWorkflowEngineOptions, observation?: ObservationEmitter): LifecycleEmitterContract;
|
|
7
|
+
interface LifecycleEmitterContract {
|
|
8
|
+
readonly emitLifecycleEvent: (run: RunRecord, previousRun?: RunRecord) => Promise<void>;
|
|
9
|
+
readonly emitResultLifecycleEvent: <TOutput>(result: ExecutionResult<TOutput>, previousRun?: RunRecord) => Promise<ExecutionResult<TOutput>>;
|
|
16
10
|
}
|
|
17
11
|
//#endregion
|
|
18
|
-
export {
|
|
12
|
+
export {};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
//#region src/engine/lifecycle.ts
|
|
2
|
-
function
|
|
3
|
-
return new
|
|
2
|
+
function createLifecycleEmitter(options, observation) {
|
|
3
|
+
return new LifecycleEmitter(options, observation);
|
|
4
4
|
}
|
|
5
|
-
var
|
|
5
|
+
var LifecycleEmitter = class {
|
|
6
6
|
#options;
|
|
7
7
|
#observation;
|
|
8
8
|
constructor(options, observation) {
|
|
@@ -17,7 +17,7 @@ var WorkflowLifecycleEmitter = class {
|
|
|
17
17
|
reason: run.lastTransitionReason,
|
|
18
18
|
timestamp: run.lastTransitionAt,
|
|
19
19
|
workflowName: run.workflowName,
|
|
20
|
-
|
|
20
|
+
workflowVersion: run.workflowVersion
|
|
21
21
|
};
|
|
22
22
|
this.#observation?.emitRunEvent(run, previousRun);
|
|
23
23
|
const callbacks = [];
|
|
@@ -35,4 +35,4 @@ var WorkflowLifecycleEmitter = class {
|
|
|
35
35
|
};
|
|
36
36
|
};
|
|
37
37
|
//#endregion
|
|
38
|
-
export {
|
|
38
|
+
export { createLifecycleEmitter };
|
|
@@ -1,30 +1,23 @@
|
|
|
1
|
-
import { RunId } from "../types/
|
|
2
|
-
import { StepId } from "../types/step-id.mjs";
|
|
3
|
-
import { LockRecord } from "../types/lock.mjs";
|
|
4
|
-
import "../types/step.mjs";
|
|
5
|
-
import "../types/run.mjs";
|
|
1
|
+
import { RunId } from "../types/ids.mjs";
|
|
6
2
|
import { WorkflowErrorRecord } from "../types/error.mjs";
|
|
3
|
+
import { LockRecord } from "../types/lock.mjs";
|
|
4
|
+
import { DeterministicValueRecordedEvent } from "../types/events.mjs";
|
|
7
5
|
//#region src/engine/lock-replay.d.ts
|
|
8
|
-
declare function
|
|
9
|
-
|
|
10
|
-
readonly timestamp: Temporal.Instant;
|
|
11
|
-
readonly value: unknown;
|
|
12
|
-
}, timeout: number): void;
|
|
13
|
-
declare function requireLockReplayMatches(recorded: LockRecord, expected: {
|
|
6
|
+
export declare function parseLockWaitDeadlineReplay(recorded: DeterministicValueRecordedEvent, timeout: number): Temporal.Instant;
|
|
7
|
+
export declare function requireLockReplayMatches(recorded: LockRecord, expected: {
|
|
14
8
|
readonly key: string;
|
|
15
9
|
readonly holderId: string;
|
|
16
10
|
readonly holderRunId: RunId;
|
|
17
11
|
readonly leaseDuration: number;
|
|
18
12
|
}): void;
|
|
19
|
-
declare function requireLockReleaseReplayMatches(recorded: LockRecord, expected: {
|
|
13
|
+
export declare function requireLockReleaseReplayMatches(recorded: LockRecord, expected: {
|
|
20
14
|
readonly key: string;
|
|
21
15
|
readonly holderId: string;
|
|
22
16
|
}): void;
|
|
23
|
-
declare function requireLockWaitReplayMatches(failedSteps: readonly {
|
|
17
|
+
export declare function requireLockWaitReplayMatches(failedSteps: readonly {
|
|
24
18
|
readonly error: WorkflowErrorRecord;
|
|
25
19
|
}[], expected: {
|
|
26
20
|
readonly key: string;
|
|
27
21
|
readonly wait: boolean;
|
|
28
22
|
}): void;
|
|
29
|
-
//#endregion
|
|
30
|
-
export { requireLockReleaseReplayMatches, requireLockReplayMatches, requireLockWaitDeadlineReplayMatches, requireLockWaitReplayMatches };
|
|
23
|
+
//#endregion
|
|
@@ -1,38 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { WorkflowErrorCode } from "../errors/codes.mjs";
|
|
2
|
+
import { WorkflowReplayDivergenceError } from "../errors/failures.mjs";
|
|
3
|
+
import { matchesWorkflowError } from "../errors/records.mjs";
|
|
2
4
|
import "../errors/mod.mjs";
|
|
3
5
|
//#region src/engine/lock-replay.ts
|
|
4
|
-
function
|
|
5
|
-
if (!(recorded.value instanceof Temporal.Instant)) WorkflowReplayDivergenceError.
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
});
|
|
9
|
-
if (recorded.value.since(recorded.timestamp).total({ unit: "millisecond" }) === timeout) return;
|
|
10
|
-
WorkflowReplayDivergenceError.diverged(`recorded lock wait deadline ${recorded.stepId} does not match replayed waitTimeout`, {
|
|
11
|
-
expectedStepId: recorded.stepId,
|
|
12
|
-
actualStepId: recorded.stepId
|
|
13
|
-
});
|
|
6
|
+
function parseLockWaitDeadlineReplay(recorded, timeout) {
|
|
7
|
+
if (!(recorded.value instanceof Temporal.Instant)) WorkflowReplayDivergenceError.atStep(recorded.stepId, `recorded lock wait deadline ${recorded.stepId} is invalid`);
|
|
8
|
+
if (recorded.value.since(recorded.timestamp).total({ unit: "millisecond" }) === timeout) return recorded.value;
|
|
9
|
+
WorkflowReplayDivergenceError.atStep(recorded.stepId, `recorded lock wait deadline ${recorded.stepId} does not match replayed waitTimeout`);
|
|
14
10
|
}
|
|
15
11
|
function requireLockReplayMatches(recorded, expected) {
|
|
16
12
|
const recordedLeaseDuration = recorded.leaseExpiresAt.since(recorded.acquiredAt).total({ unit: "millisecond" });
|
|
17
13
|
if (recorded.key === expected.key && recorded.holderId === expected.holderId && recorded.holderRunId === expected.holderRunId && recordedLeaseDuration === expected.leaseDuration) return;
|
|
18
|
-
WorkflowReplayDivergenceError.
|
|
19
|
-
expectedStepId: recorded.holderStepId,
|
|
20
|
-
actualStepId: recorded.holderStepId
|
|
21
|
-
});
|
|
14
|
+
WorkflowReplayDivergenceError.atStep(recorded.holderStepId, `recorded lock step ${recorded.holderStepId ?? recorded.key} does not match replayed lock acquisition`);
|
|
22
15
|
}
|
|
23
16
|
function requireLockReleaseReplayMatches(recorded, expected) {
|
|
24
17
|
if (recorded.key === expected.key && recorded.holderId === expected.holderId && recorded.releasedAt !== void 0) return;
|
|
25
|
-
WorkflowReplayDivergenceError.
|
|
26
|
-
expectedStepId: recorded.holderStepId,
|
|
27
|
-
actualStepId: recorded.holderStepId
|
|
28
|
-
});
|
|
18
|
+
WorkflowReplayDivergenceError.atStep(recorded.holderStepId, `recorded lock step ${recorded.holderStepId ?? recorded.key} does not match replayed lock release`);
|
|
29
19
|
}
|
|
30
20
|
function requireLockWaitReplayMatches(failedSteps, expected) {
|
|
31
|
-
if (!failedSteps.some((failed) =>
|
|
32
|
-
WorkflowReplayDivergenceError.
|
|
33
|
-
expectedStepId: `run:${expected.key}`,
|
|
34
|
-
actualStepId: `run:${expected.key}`
|
|
35
|
-
});
|
|
21
|
+
if (!failedSteps.some((failed) => matchesWorkflowError(failed.error, WorkflowErrorCode.LOCK_ALREADY_HELD, { key: expected.key })) || expected.wait) return;
|
|
22
|
+
WorkflowReplayDivergenceError.atStep(`run:${expected.key}`, `recorded lock ${expected.key} waited but replayed lock acquisition does not allow waiting`);
|
|
36
23
|
}
|
|
37
24
|
//#endregion
|
|
38
|
-
export { requireLockReleaseReplayMatches, requireLockReplayMatches,
|
|
25
|
+
export { parseLockWaitDeadlineReplay, requireLockReleaseReplayMatches, requireLockReplayMatches, requireLockWaitReplayMatches };
|