@rikalabs/akter 0.1.0-alpha.0 → 0.1.0-alpha.3
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/CHANGELOG.md +46 -3
- package/README.md +2 -2
- package/dist/actor/definition.d.ts +13 -9
- package/dist/actor/descriptor.d.ts +2 -2
- package/dist/actor/descriptor.js +4 -4
- package/dist/client/calls.js +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.js +1 -1
- package/dist/errors/actor.d.ts +12 -42
- package/dist/errors/actor.js +13 -42
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/members/payload.d.ts +1 -1
- package/dist/protocol/inspection.d.ts +221 -1
- package/dist/protocol/inspection.js +151 -2
- package/dist/protocol/wire.d.ts +6 -49
- package/dist/protocol/wire.js +1 -10
- package/dist/runtime/actors.d.ts +3 -0
- package/dist/runtime/adoption/backfill.js +1 -1
- package/dist/runtime/adoption/enforce.js +2 -2
- package/dist/runtime/adoption/observe.js +1 -1
- package/dist/runtime/adoption/plan.d.ts +1 -1
- package/dist/runtime/adoption/startup.js +1 -1
- package/dist/runtime/adoption/status.d.ts +1 -1
- package/dist/runtime/app.d.ts +65 -0
- package/dist/runtime/app.js +38 -0
- package/dist/runtime/connections/holder.d.ts +11 -1
- package/dist/runtime/connections/holder.js +8 -4
- package/dist/runtime/connections/streams.d.ts +4 -4
- package/dist/runtime/content/store.js +15 -11
- package/dist/runtime/database/bounded.d.ts +4 -18
- package/dist/runtime/database/bounded.js +36 -22
- package/dist/runtime/database/coordination.d.ts +12 -3
- package/dist/runtime/database/coordination.js +29 -36
- package/dist/runtime/database/migrations.d.ts +61 -29
- package/dist/runtime/database/migrations.js +375 -139
- package/dist/runtime/database/replica.d.ts +4 -1
- package/dist/runtime/database/replica.js +4 -1
- package/dist/runtime/database/schema.d.ts +13 -0
- package/dist/runtime/database/schema.js +13 -0
- package/dist/runtime/database/shards.d.ts +31 -13
- package/dist/runtime/database/shards.js +38 -26
- package/dist/runtime/entity/register.d.ts +8 -1
- package/dist/runtime/entity/register.js +58 -7
- package/dist/runtime/fleet/checks.js +4 -4
- package/dist/runtime/fleet/maintainer.d.ts +1 -1
- package/dist/runtime/fleet/maintainer.js +1 -1
- package/dist/runtime/index.d.ts +2 -0
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/inspector/layer.d.ts +20 -0
- package/dist/runtime/inspector/layer.js +224 -5
- package/dist/runtime/inspector/queries.d.ts +54 -8
- package/dist/runtime/inspector/queries.js +84 -15
- package/dist/runtime/layer.d.ts +48 -39
- package/dist/runtime/layer.js +124 -56
- package/dist/runtime/operators/audit.d.ts +3 -0
- package/dist/runtime/operators/audit.js +6 -2
- package/dist/runtime/operators/repair.js +30 -10
- package/dist/runtime/operators/seed.js +4 -2
- package/dist/runtime/payloads/versions.d.ts +4 -4
- package/dist/runtime/payloads/versions.js +24 -15
- package/dist/runtime/queries.js +4 -2
- package/dist/runtime/registration.d.ts +5 -2
- package/dist/runtime/registration.js +3 -3
- package/dist/runtime/runner.d.ts +12 -0
- package/dist/runtime/runner.js +12 -0
- package/dist/runtime/storage/codec.d.ts +19 -7
- package/dist/runtime/storage/codec.js +23 -7
- package/dist/runtime/storage/placements.d.ts +6 -1
- package/dist/runtime/storage/placements.js +98 -6
- package/dist/runtime/storage/retention.d.ts +6 -0
- package/dist/runtime/storage/retention.js +25 -13
- package/dist/runtime/subscriptions/relay.js +47 -44
- package/dist/runtime/subscriptions/storage.d.ts +3 -2
- package/dist/runtime/subscriptions/storage.js +9 -6
- package/dist/runtime/telemetry/live.d.ts +255 -0
- package/dist/runtime/telemetry/live.js +540 -0
- package/dist/runtime/telemetry/metrics.d.ts +2 -0
- package/dist/runtime/telemetry/metrics.js +4 -1
- package/dist/runtime/telemetry/sampler.js +33 -13
- package/dist/runtime/telemetry/spans.d.ts +1 -1
- package/dist/runtime/telemetry/spans.js +1 -1
- package/dist/runtime/topology/locks.d.ts +6 -3
- package/dist/runtime/topology/locks.js +27 -4
- package/dist/runtime/turn/execute.d.ts +2 -0
- package/dist/runtime/turn/execute.js +5 -2
- package/dist/runtime/turn/pipeline.d.ts +5 -12
- package/dist/runtime/turn/pipeline.js +11 -11
- package/dist/runtime/turn/relay.d.ts +13 -3
- package/dist/runtime/turn/relay.js +27 -14
- package/dist/runtime/turn/rows.js +4 -4
- package/dist/runtime/workflows/compatibility.d.ts +1 -1
- package/dist/runtime/workflows/compatibility.js +85 -31
- package/dist/runtime/workflows/engine.js +20 -17
- package/dist/serve/layer.js +3 -2
- package/dist/tables/owned.d.ts +1 -1
- package/dist/tables/owned.js +1 -1
- package/dist/testing/actor-test.d.ts +2 -24
- package/dist/testing/actor-test.js +1 -27
- package/dist/testing/index.d.ts +0 -12
- package/dist/testing/index.js +0 -6
- package/package.json +1 -1
- package/dist/runtime/database/neki/migrations.d.ts +0 -31
- package/dist/runtime/database/neki/migrations.js +0 -276
- package/dist/runtime/database/neki/session.d.ts +0 -23
- package/dist/runtime/database/neki/session.js +0 -31
- package/dist/testing/cluster.d.ts +0 -93
- package/dist/testing/cluster.js +0 -296
- package/dist/testing/conformance/access.d.ts +0 -5
- package/dist/testing/conformance/access.js +0 -531
- package/dist/testing/conformance/admission.d.ts +0 -11
- package/dist/testing/conformance/admission.js +0 -182
- package/dist/testing/conformance/adoption.d.ts +0 -2
- package/dist/testing/conformance/adoption.js +0 -1019
- package/dist/testing/conformance/assertions.d.ts +0 -202
- package/dist/testing/conformance/assertions.js +0 -849
- package/dist/testing/conformance/batches.d.ts +0 -41
- package/dist/testing/conformance/batches.js +0 -388
- package/dist/testing/conformance/blobs.d.ts +0 -14
- package/dist/testing/conformance/blobs.js +0 -405
- package/dist/testing/conformance/capacity.d.ts +0 -8
- package/dist/testing/conformance/capacity.js +0 -433
- package/dist/testing/conformance/client.d.ts +0 -5
- package/dist/testing/conformance/client.js +0 -719
- package/dist/testing/conformance/cold-serve.d.ts +0 -16
- package/dist/testing/conformance/cold-serve.js +0 -254
- package/dist/testing/conformance/connections/actors.d.ts +0 -1143
- package/dist/testing/conformance/connections/actors.js +0 -180
- package/dist/testing/conformance/connections/harness.d.ts +0 -1754
- package/dist/testing/conformance/connections/harness.js +0 -142
- package/dist/testing/conformance/connections/holders.d.ts +0 -4
- package/dist/testing/conformance/connections/holders.js +0 -165
- package/dist/testing/conformance/connections/lifecycle.d.ts +0 -4
- package/dist/testing/conformance/connections/lifecycle.js +0 -113
- package/dist/testing/conformance/connections/limits.d.ts +0 -4
- package/dist/testing/conformance/connections/limits.js +0 -127
- package/dist/testing/conformance/connections/reauthorization.d.ts +0 -4
- package/dist/testing/conformance/connections/reauthorization.js +0 -170
- package/dist/testing/conformance/connections/resync.d.ts +0 -4
- package/dist/testing/conformance/connections/resync.js +0 -360
- package/dist/testing/conformance/connections/takeover.d.ts +0 -4
- package/dist/testing/conformance/connections/takeover.js +0 -287
- package/dist/testing/conformance/connections.d.ts +0 -4
- package/dist/testing/conformance/connections.js +0 -15
- package/dist/testing/conformance/content-blobs.d.ts +0 -16
- package/dist/testing/conformance/content-blobs.js +0 -534
- package/dist/testing/conformance/counter.d.ts +0 -16
- package/dist/testing/conformance/counter.js +0 -813
- package/dist/testing/conformance/cron.d.ts +0 -5
- package/dist/testing/conformance/cron.js +0 -665
- package/dist/testing/conformance/drain.d.ts +0 -26
- package/dist/testing/conformance/drain.js +0 -540
- package/dist/testing/conformance/effect-control.d.ts +0 -38
- package/dist/testing/conformance/effect-control.js +0 -1059
- package/dist/testing/conformance/effects.d.ts +0 -23
- package/dist/testing/conformance/effects.js +0 -432
- package/dist/testing/conformance/events.d.ts +0 -28
- package/dist/testing/conformance/events.js +0 -335
- package/dist/testing/conformance/export.d.ts +0 -2
- package/dist/testing/conformance/export.js +0 -368
- package/dist/testing/conformance/fleet.d.ts +0 -444
- package/dist/testing/conformance/fleet.js +0 -1009
- package/dist/testing/conformance/groups.d.ts +0 -7
- package/dist/testing/conformance/groups.js +0 -353
- package/dist/testing/conformance/heap.d.ts +0 -3
- package/dist/testing/conformance/heap.js +0 -149
- package/dist/testing/conformance/http.d.ts +0 -2809
- package/dist/testing/conformance/http.js +0 -1234
- package/dist/testing/conformance/inspection-views.d.ts +0 -8
- package/dist/testing/conformance/inspection-views.js +0 -272
- package/dist/testing/conformance/inspector.d.ts +0 -7
- package/dist/testing/conformance/inspector.js +0 -650
- package/dist/testing/conformance/mint.d.ts +0 -58
- package/dist/testing/conformance/mint.js +0 -692
- package/dist/testing/conformance/multi-runner.d.ts +0 -8
- package/dist/testing/conformance/multi-runner.js +0 -403
- package/dist/testing/conformance/neki/plan.d.ts +0 -19
- package/dist/testing/conformance/neki/plan.js +0 -30
- package/dist/testing/conformance/observability.d.ts +0 -3
- package/dist/testing/conformance/observability.js +0 -343
- package/dist/testing/conformance/offline.d.ts +0 -4
- package/dist/testing/conformance/offline.js +0 -474
- package/dist/testing/conformance/operator-harness.d.ts +0 -57
- package/dist/testing/conformance/operator-harness.js +0 -78
- package/dist/testing/conformance/operator.d.ts +0 -3
- package/dist/testing/conformance/operator.js +0 -379
- package/dist/testing/conformance/outbox-cross-shard.d.ts +0 -14
- package/dist/testing/conformance/outbox-cross-shard.js +0 -160
- package/dist/testing/conformance/outbox.d.ts +0 -36
- package/dist/testing/conformance/outbox.js +0 -437
- package/dist/testing/conformance/payload-migrations.d.ts +0 -3
- package/dist/testing/conformance/payload-migrations.js +0 -612
- package/dist/testing/conformance/pipeline.d.ts +0 -3
- package/dist/testing/conformance/pipeline.js +0 -1040
- package/dist/testing/conformance/placement.d.ts +0 -22
- package/dist/testing/conformance/placement.js +0 -539
- package/dist/testing/conformance/platform.d.ts +0 -40
- package/dist/testing/conformance/platform.js +0 -101
- package/dist/testing/conformance/progress.d.ts +0 -39
- package/dist/testing/conformance/progress.js +0 -666
- package/dist/testing/conformance/properties.d.ts +0 -6
- package/dist/testing/conformance/properties.js +0 -295
- package/dist/testing/conformance/protocols.d.ts +0 -4
- package/dist/testing/conformance/protocols.js +0 -618
- package/dist/testing/conformance/provider/advertise.d.ts +0 -21
- package/dist/testing/conformance/provider/advertise.js +0 -44
- package/dist/testing/conformance/read-your-writes.d.ts +0 -20
- package/dist/testing/conformance/read-your-writes.js +0 -192
- package/dist/testing/conformance/reducers.d.ts +0 -8
- package/dist/testing/conformance/reducers.js +0 -258
- package/dist/testing/conformance/relay.d.ts +0 -42
- package/dist/testing/conformance/relay.js +0 -1115
- package/dist/testing/conformance/restore.d.ts +0 -43
- package/dist/testing/conformance/restore.js +0 -341
- package/dist/testing/conformance/retention.d.ts +0 -14
- package/dist/testing/conformance/retention.js +0 -463
- package/dist/testing/conformance/rls.d.ts +0 -24
- package/dist/testing/conformance/rls.js +0 -576
- package/dist/testing/conformance/simulation.d.ts +0 -31
- package/dist/testing/conformance/simulation.js +0 -167
- package/dist/testing/conformance/single-shard.d.ts +0 -2
- package/dist/testing/conformance/single-shard.js +0 -125
- package/dist/testing/conformance/singleton.d.ts +0 -3
- package/dist/testing/conformance/singleton.js +0 -293
- package/dist/testing/conformance/statements.d.ts +0 -60
- package/dist/testing/conformance/statements.js +0 -108
- package/dist/testing/conformance/streams.d.ts +0 -7
- package/dist/testing/conformance/streams.js +0 -280
- package/dist/testing/conformance/subscriptions/access.d.ts +0 -4
- package/dist/testing/conformance/subscriptions/access.js +0 -98
- package/dist/testing/conformance/subscriptions/actors.d.ts +0 -4910
- package/dist/testing/conformance/subscriptions/actors.js +0 -372
- package/dist/testing/conformance/subscriptions/cluster.d.ts +0 -4
- package/dist/testing/conformance/subscriptions/cluster.js +0 -89
- package/dist/testing/conformance/subscriptions/delivery.d.ts +0 -4
- package/dist/testing/conformance/subscriptions/delivery.js +0 -253
- package/dist/testing/conformance/subscriptions/deploys.d.ts +0 -4
- package/dist/testing/conformance/subscriptions/deploys.js +0 -162
- package/dist/testing/conformance/subscriptions/epochs.d.ts +0 -4
- package/dist/testing/conformance/subscriptions/epochs.js +0 -169
- package/dist/testing/conformance/subscriptions/failures.d.ts +0 -4
- package/dist/testing/conformance/subscriptions/failures.js +0 -108
- package/dist/testing/conformance/subscriptions/feeds.d.ts +0 -4
- package/dist/testing/conformance/subscriptions/feeds.js +0 -218
- package/dist/testing/conformance/subscriptions/harness.d.ts +0 -124
- package/dist/testing/conformance/subscriptions/harness.js +0 -143
- package/dist/testing/conformance/subscriptions/operator.d.ts +0 -4
- package/dist/testing/conformance/subscriptions/operator.js +0 -128
- package/dist/testing/conformance/subscriptions/retention.d.ts +0 -4
- package/dist/testing/conformance/subscriptions/retention.js +0 -288
- package/dist/testing/conformance/subscriptions/routing.d.ts +0 -4
- package/dist/testing/conformance/subscriptions/routing.js +0 -179
- package/dist/testing/conformance/subscriptions.d.ts +0 -4
- package/dist/testing/conformance/subscriptions.js +0 -19
- package/dist/testing/conformance/tables.d.ts +0 -125
- package/dist/testing/conformance/tables.js +0 -664
- package/dist/testing/conformance/transports/actors.d.ts +0 -1907
- package/dist/testing/conformance/transports/actors.js +0 -163
- package/dist/testing/conformance/transports/client.d.ts +0 -3
- package/dist/testing/conformance/transports/client.js +0 -237
- package/dist/testing/conformance/transports/feeds.d.ts +0 -3
- package/dist/testing/conformance/transports/feeds.js +0 -232
- package/dist/testing/conformance/transports/harness.d.ts +0 -93
- package/dist/testing/conformance/transports/harness.js +0 -84
- package/dist/testing/conformance/transports/streams.d.ts +0 -3
- package/dist/testing/conformance/transports/streams.js +0 -96
- package/dist/testing/conformance/transports/websocket.d.ts +0 -3
- package/dist/testing/conformance/transports/websocket.js +0 -384
- package/dist/testing/conformance/transports/wire.d.ts +0 -141
- package/dist/testing/conformance/transports/wire.js +0 -204
- package/dist/testing/conformance/transports.d.ts +0 -3
- package/dist/testing/conformance/transports.js +0 -11
- package/dist/testing/conformance/watch.d.ts +0 -59
- package/dist/testing/conformance/watch.js +0 -879
- package/dist/testing/conformance/workflow-engine.d.ts +0 -97
- package/dist/testing/conformance/workflow-engine.js +0 -253
- package/dist/testing/conformance/workflow-versions.d.ts +0 -3
- package/dist/testing/conformance/workflow-versions.js +0 -545
- package/dist/testing/conformance/workflows/access.d.ts +0 -4
- package/dist/testing/conformance/workflows/access.js +0 -147
- package/dist/testing/conformance/workflows/actors.d.ts +0 -2317
- package/dist/testing/conformance/workflows/actors.js +0 -305
- package/dist/testing/conformance/workflows/basics.d.ts +0 -4
- package/dist/testing/conformance/workflows/basics.js +0 -144
- package/dist/testing/conformance/workflows/engine.d.ts +0 -4
- package/dist/testing/conformance/workflows/engine.js +0 -80
- package/dist/testing/conformance/workflows/guards.d.ts +0 -4
- package/dist/testing/conformance/workflows/guards.js +0 -172
- package/dist/testing/conformance/workflows/harness.d.ts +0 -14
- package/dist/testing/conformance/workflows/harness.js +0 -44
- package/dist/testing/conformance/workflows/recovery.d.ts +0 -4
- package/dist/testing/conformance/workflows/recovery.js +0 -181
- package/dist/testing/conformance/workflows/starts.d.ts +0 -4
- package/dist/testing/conformance/workflows/starts.js +0 -57
- package/dist/testing/conformance/workflows/suspension.d.ts +0 -4
- package/dist/testing/conformance/workflows/suspension.js +0 -106
- package/dist/testing/conformance/workflows/waits.d.ts +0 -4
- package/dist/testing/conformance/workflows/waits.js +0 -284
- package/dist/testing/conformance/workflows.d.ts +0 -4
- package/dist/testing/conformance/workflows.js +0 -19
- package/dist/testing/conformance.d.ts +0 -330
- package/dist/testing/conformance.js +0 -364
- package/dist/testing/foundation.d.ts +0 -41
- package/dist/testing/foundation.js +0 -517
- package/dist/testing/simulate-cluster.d.ts +0 -112
- package/dist/testing/simulate-cluster.js +0 -257
- package/dist/testing/simulate.d.ts +0 -90
- package/dist/testing/simulate.js +0 -127
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { Deferred, type Duration, Effect, Exit, Option, Schema, type Scope } from "effect";
|
|
2
|
-
import { Workflow } from "effect/workflow";
|
|
3
|
-
import type { WorkflowEngine } from "effect/workflow";
|
|
4
|
-
import type { ConformanceExpect, ConformanceRegistrar } from "../conformance.ts";
|
|
5
|
-
declare const Flake_base: Schema.Class<Flake, Schema.TaggedStruct<"Flake", {
|
|
6
|
-
readonly attempt: Schema.Int;
|
|
7
|
-
}>, import("effect/Cause").YieldableError>;
|
|
8
|
-
/**
|
|
9
|
-
* The shared workflow-engine suite. Every case runs the same body against
|
|
10
|
-
* the framework's engine and against Effect's `ClusterWorkflowEngine`; each
|
|
11
|
-
* engine supplies the step primitives the body compiles to and a driver for
|
|
12
|
-
* starting, polling, interrupting, and restarting executions.
|
|
13
|
-
*/
|
|
14
|
-
/** A declared activity failure; carries the attempt that failed. */
|
|
15
|
-
export declare class Flake extends Flake_base {
|
|
16
|
-
}
|
|
17
|
-
export declare const ProbeInput: {
|
|
18
|
-
scenario: Schema.String;
|
|
19
|
-
key: Schema.String;
|
|
20
|
-
};
|
|
21
|
-
export type Scenario = "plain" | "replay" | "retry" | "race" | "hold" | "compensate-sleep" | "compensate-hold" | "compensate-last" | "compensate-block";
|
|
22
|
-
/** Counters and gates the bodies share with the cases, by label and execution key. */
|
|
23
|
-
export interface EngineFixture {
|
|
24
|
-
readonly runs: Map<string, number>;
|
|
25
|
-
readonly gates: Map<string, Deferred.Deferred<void>>;
|
|
26
|
-
}
|
|
27
|
-
export declare const engineFixture: () => EngineFixture;
|
|
28
|
-
export type ActivityName = "once" | "fast" | "hold" | "flaky";
|
|
29
|
-
/** The step primitives a body uses, as each engine compiles them. */
|
|
30
|
-
export interface EnginePrimitives<R> {
|
|
31
|
-
readonly activity: (name: ActivityName, execute: Effect.Effect<string, Flake>) => Effect.Effect<string, Flake, R>;
|
|
32
|
-
readonly sleep: (name: "nap", duration: Duration.Input) => Effect.Effect<void, never, R>;
|
|
33
|
-
readonly race: (name: "pick", effects: readonly [Effect.Effect<string, never, R>, Effect.Effect<string, never, R>]) => Effect.Effect<string, never, R>;
|
|
34
|
-
}
|
|
35
|
-
/** Short enough to wait for on a real clock; long enough to observe the suspension. */
|
|
36
|
-
export declare const SHORT_SLEEP = "1 second";
|
|
37
|
-
/** The one workflow body both engines run, chosen by its input's scenario. */
|
|
38
|
-
export declare const probeBody: <R>({ primitives, fixture, input, }: {
|
|
39
|
-
readonly primitives: EnginePrimitives<R>;
|
|
40
|
-
readonly fixture: EngineFixture;
|
|
41
|
-
readonly input: {
|
|
42
|
-
readonly scenario: string;
|
|
43
|
-
readonly key: string;
|
|
44
|
-
};
|
|
45
|
-
}) => Effect.Effect<string, Flake, R | WorkflowEngine.WorkflowInstance | Scope.Scope>;
|
|
46
|
-
export type EngineResult = Workflow.Result<string, unknown>;
|
|
47
|
-
/** One execution as a case sees it. */
|
|
48
|
-
export interface EngineRun {
|
|
49
|
-
readonly executionId: string;
|
|
50
|
-
readonly poll: Effect.Effect<Option.Option<EngineResult>>;
|
|
51
|
-
readonly interrupt: Effect.Effect<void>;
|
|
52
|
-
}
|
|
53
|
-
export interface WorkflowEngineDriver {
|
|
54
|
-
/** What `poll` returns while the body runs and hasn't yet suspended. */
|
|
55
|
-
readonly pollWhileRunning: "Suspended" | "None";
|
|
56
|
-
/** Starts or attaches to the execution for `key` and waits for its result. */
|
|
57
|
-
readonly execute: (scenario: Scenario, key: string) => Effect.Effect<Exit.Exit<string, unknown>>;
|
|
58
|
-
/** Starts the execution and returns once the start is durable (`discard: true`). */
|
|
59
|
-
readonly start: (scenario: Scenario, key: string) => Effect.Effect<EngineRun>;
|
|
60
|
-
/** The execution for `key`, without starting it. */
|
|
61
|
-
readonly attach: (scenario: Scenario, key: string) => Effect.Effect<EngineRun>;
|
|
62
|
-
/** Waits until the execution has suspended, not merely started. */
|
|
63
|
-
readonly awaitSuspended: (run: EngineRun) => Effect.Effect<void>;
|
|
64
|
-
/** Moves the engine's durable clock forward. */
|
|
65
|
-
readonly advance: (duration: Duration.Input) => Effect.Effect<void>;
|
|
66
|
-
/** Tears the engine down and builds it again over the same storage. */
|
|
67
|
-
readonly restart: Effect.Effect<void>;
|
|
68
|
-
}
|
|
69
|
-
export interface EngineCaseContext {
|
|
70
|
-
readonly driver: WorkflowEngineDriver;
|
|
71
|
-
readonly fixture: EngineFixture;
|
|
72
|
-
readonly expect: ConformanceExpect;
|
|
73
|
-
/** Unique per case run, so cases sharing one engine don't collide. */
|
|
74
|
-
readonly key: string;
|
|
75
|
-
}
|
|
76
|
-
export interface EngineCase {
|
|
77
|
-
readonly name: string;
|
|
78
|
-
readonly run: (context: EngineCaseContext) => Effect.Effect<void>;
|
|
79
|
-
}
|
|
80
|
-
export declare const eventually: ({ check, what, }: {
|
|
81
|
-
readonly check: Effect.Effect<boolean>;
|
|
82
|
-
readonly what: string;
|
|
83
|
-
}) => Effect.Effect<void, never, never>;
|
|
84
|
-
/** Polls until the execution completes and returns its exit. */
|
|
85
|
-
export declare const awaitComplete: (run: EngineRun) => Effect.Effect<Exit.Exit<string, unknown>, never, never>;
|
|
86
|
-
export declare const engineCases: ReadonlyArray<EngineCase>;
|
|
87
|
-
/**
|
|
88
|
-
* Registers every shared case against one engine. `open` builds a fresh
|
|
89
|
-
* engine and its driver in the given scope; `run` executes a case.
|
|
90
|
-
*/
|
|
91
|
-
export declare const describeWorkflowEngine: (options: {
|
|
92
|
-
readonly name: string;
|
|
93
|
-
readonly registrar: ConformanceRegistrar;
|
|
94
|
-
readonly open: (fixture: EngineFixture) => Effect.Effect<WorkflowEngineDriver, never, Scope.Scope>;
|
|
95
|
-
readonly timeoutMs?: number;
|
|
96
|
-
}) => void;
|
|
97
|
-
export {};
|
|
@@ -1,253 +0,0 @@
|
|
|
1
|
-
import { Deferred, Effect, Exit, Option, Predicate, Schedule, Schema, } from "effect";
|
|
2
|
-
import { Activity, Workflow } from "effect/workflow";
|
|
3
|
-
/**
|
|
4
|
-
* The shared workflow-engine suite. Every case runs the same body against
|
|
5
|
-
* the framework's engine and against Effect's `ClusterWorkflowEngine`; each
|
|
6
|
-
* engine supplies the step primitives the body compiles to and a driver for
|
|
7
|
-
* starting, polling, interrupting, and restarting executions.
|
|
8
|
-
*/
|
|
9
|
-
/** A declared activity failure; carries the attempt that failed. */
|
|
10
|
-
export class Flake extends Schema.TaggedError()("Flake", { attempt: Schema.Int }) {
|
|
11
|
-
}
|
|
12
|
-
export const ProbeInput = { scenario: Schema.String, key: Schema.String };
|
|
13
|
-
export const engineFixture = () => ({ runs: new Map(), gates: new Map() });
|
|
14
|
-
const runsOf = (fixture, label, key) => fixture.runs.get(`${label}:${key}`) ?? 0;
|
|
15
|
-
const bump = (fixture, label, key) => Effect.sync(() => fixture.runs.set(`${label}:${key}`, runsOf(fixture, label, key) + 1));
|
|
16
|
-
/** Short enough to wait for on a real clock; long enough to observe the suspension. */
|
|
17
|
-
export const SHORT_SLEEP = "1 second";
|
|
18
|
-
const LONG_SLEEP = "1 hour";
|
|
19
|
-
/** The one workflow body both engines run, chosen by its input's scenario. */
|
|
20
|
-
export const probeBody = ({ primitives, fixture, input, }) => Effect.gen(function* () {
|
|
21
|
-
const { key } = input;
|
|
22
|
-
const once = primitives.activity("once", bump(fixture, "once", key).pipe(Effect.as("once")));
|
|
23
|
-
const hold = primitives.activity("hold", Effect.gen(function* () {
|
|
24
|
-
yield* bump(fixture, "hold", key);
|
|
25
|
-
const gate = fixture.gates.get(key);
|
|
26
|
-
if (gate !== undefined)
|
|
27
|
-
yield* Deferred.await(gate);
|
|
28
|
-
return "held";
|
|
29
|
-
}));
|
|
30
|
-
const compensated = once.pipe(Workflow.withCompensation(() => bump(fixture, "compensate", key)));
|
|
31
|
-
const blockingCompensation = once.pipe(Workflow.withCompensation(() => Effect.gen(function* () {
|
|
32
|
-
yield* bump(fixture, "compensate", key);
|
|
33
|
-
const gate = fixture.gates.get(`compensate:${key}`);
|
|
34
|
-
if (gate !== undefined)
|
|
35
|
-
yield* Deferred.await(gate);
|
|
36
|
-
})));
|
|
37
|
-
switch (input.scenario) {
|
|
38
|
-
case "plain":
|
|
39
|
-
return yield* once;
|
|
40
|
-
case "replay": {
|
|
41
|
-
const value = yield* once;
|
|
42
|
-
yield* primitives.sleep("nap", SHORT_SLEEP);
|
|
43
|
-
return value;
|
|
44
|
-
}
|
|
45
|
-
case "retry": {
|
|
46
|
-
const value = yield* primitives
|
|
47
|
-
.activity("flaky", Effect.gen(function* () {
|
|
48
|
-
const attempt = yield* Activity.CurrentAttempt;
|
|
49
|
-
yield* bump(fixture, `flaky-${attempt}`, key);
|
|
50
|
-
if (attempt < 3)
|
|
51
|
-
return yield* Flake.make({ attempt });
|
|
52
|
-
return `ok-${attempt}`;
|
|
53
|
-
}))
|
|
54
|
-
.pipe(Activity.retry({ times: 5 }));
|
|
55
|
-
yield* primitives.sleep("nap", SHORT_SLEEP);
|
|
56
|
-
return value;
|
|
57
|
-
}
|
|
58
|
-
case "race": {
|
|
59
|
-
const value = yield* primitives.race("pick", [
|
|
60
|
-
primitives
|
|
61
|
-
.activity("fast", bump(fixture, "fast", key).pipe(Effect.as("fast")))
|
|
62
|
-
.pipe(Effect.orDie),
|
|
63
|
-
bump(fixture, "loser", key).pipe(Effect.andThen(Effect.never)),
|
|
64
|
-
]);
|
|
65
|
-
yield* primitives.sleep("nap", SHORT_SLEEP);
|
|
66
|
-
return value;
|
|
67
|
-
}
|
|
68
|
-
case "compensate-sleep":
|
|
69
|
-
yield* compensated;
|
|
70
|
-
yield* primitives.sleep("nap", LONG_SLEEP);
|
|
71
|
-
return "done";
|
|
72
|
-
case "hold":
|
|
73
|
-
return yield* hold;
|
|
74
|
-
case "compensate-last":
|
|
75
|
-
yield* compensated;
|
|
76
|
-
return yield* hold;
|
|
77
|
-
case "compensate-block":
|
|
78
|
-
yield* blockingCompensation;
|
|
79
|
-
return yield* hold;
|
|
80
|
-
case "compensate-hold":
|
|
81
|
-
yield* compensated;
|
|
82
|
-
yield* hold;
|
|
83
|
-
yield* primitives.sleep("nap", LONG_SLEEP);
|
|
84
|
-
return "done";
|
|
85
|
-
}
|
|
86
|
-
return yield* Effect.die(new Error(`Unknown scenario ${input.scenario}`));
|
|
87
|
-
});
|
|
88
|
-
export const eventually = ({ check, what, }) => check.pipe(Effect.repeat({ schedule: Schedule.spaced("25 millis"), until: (held) => held }), Effect.timeoutOrElse({
|
|
89
|
-
duration: "30 seconds",
|
|
90
|
-
orElse: () => Effect.die(new Error(`Timed out waiting for ${what}`)),
|
|
91
|
-
}), Effect.asVoid);
|
|
92
|
-
const isComplete = (polled) => Option.isSome(polled) && Predicate.isTagged(polled.value, "Complete");
|
|
93
|
-
/** Polls until the execution completes and returns its exit. */
|
|
94
|
-
export const awaitComplete = (run) => Effect.gen(function* () {
|
|
95
|
-
let found = Option.none();
|
|
96
|
-
yield* eventually({
|
|
97
|
-
check: run.poll.pipe(Effect.map((polled) => {
|
|
98
|
-
found = polled;
|
|
99
|
-
return isComplete(polled);
|
|
100
|
-
})),
|
|
101
|
-
what: `${run.executionId} to complete`,
|
|
102
|
-
});
|
|
103
|
-
return found.value.exit;
|
|
104
|
-
});
|
|
105
|
-
const expectInterrupted = (expect, exit) => expect(Exit.isFailure(exit) && Exit.hasInterrupts(exit)).toBe(true);
|
|
106
|
-
export const engineCases = [
|
|
107
|
-
{
|
|
108
|
-
name: "replays a recorded activity without rerunning",
|
|
109
|
-
run: ({ driver, fixture, expect, key }) => Effect.gen(function* () {
|
|
110
|
-
const run = yield* driver.start("replay", key);
|
|
111
|
-
yield* driver.awaitSuspended(run);
|
|
112
|
-
expect(runsOf(fixture, "once", key)).toBe(1);
|
|
113
|
-
yield* driver.advance(SHORT_SLEEP);
|
|
114
|
-
expect(yield* awaitComplete(run)).toEqual(Exit.succeed("once"));
|
|
115
|
-
expect(runsOf(fixture, "once", key)).toBe(1);
|
|
116
|
-
}),
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
name: "records each Activity.retry attempt",
|
|
120
|
-
run: ({ driver, fixture, expect, key }) => Effect.gen(function* () {
|
|
121
|
-
const run = yield* driver.start("retry", key);
|
|
122
|
-
yield* driver.awaitSuspended(run);
|
|
123
|
-
expect([1, 2, 3, 4].map((attempt) => runsOf(fixture, `flaky-${attempt}`, key))).toEqual([
|
|
124
|
-
1, 1, 1, 0,
|
|
125
|
-
]);
|
|
126
|
-
yield* driver.advance(SHORT_SLEEP);
|
|
127
|
-
expect(yield* awaitComplete(run)).toEqual(Exit.succeed("ok-3"));
|
|
128
|
-
expect([1, 2, 3, 4].map((attempt) => runsOf(fixture, `flaky-${attempt}`, key))).toEqual([
|
|
129
|
-
1, 1, 1, 0,
|
|
130
|
-
]);
|
|
131
|
-
}),
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
name: "resumes a durable clock after engine restart",
|
|
135
|
-
run: ({ driver, fixture, expect, key }) => Effect.gen(function* () {
|
|
136
|
-
const run = yield* driver.start("replay", key);
|
|
137
|
-
yield* driver.awaitSuspended(run);
|
|
138
|
-
yield* driver.restart;
|
|
139
|
-
yield* driver.advance(SHORT_SLEEP);
|
|
140
|
-
const again = yield* driver.attach("replay", key);
|
|
141
|
-
expect(yield* awaitComplete(again)).toEqual(Exit.succeed("once"));
|
|
142
|
-
expect(runsOf(fixture, "once", key)).toBe(1);
|
|
143
|
-
}),
|
|
144
|
-
},
|
|
145
|
-
{
|
|
146
|
-
name: "replays a DurableDeferred.raceAll winner",
|
|
147
|
-
run: ({ driver, fixture, expect, key }) => Effect.gen(function* () {
|
|
148
|
-
const run = yield* driver.start("race", key);
|
|
149
|
-
yield* driver.awaitSuspended(run);
|
|
150
|
-
expect(runsOf(fixture, "loser", key)).toBe(1);
|
|
151
|
-
yield* driver.advance(SHORT_SLEEP);
|
|
152
|
-
expect(yield* awaitComplete(run)).toEqual(Exit.succeed("fast"));
|
|
153
|
-
expect(runsOf(fixture, "fast", key)).toBe(1);
|
|
154
|
-
expect(runsOf(fixture, "loser", key)).toBe(1);
|
|
155
|
-
}),
|
|
156
|
-
},
|
|
157
|
-
{
|
|
158
|
-
name: "interrupts a suspended execution",
|
|
159
|
-
run: ({ driver, fixture, expect, key }) => Effect.gen(function* () {
|
|
160
|
-
const run = yield* driver.start("compensate-sleep", key);
|
|
161
|
-
yield* driver.awaitSuspended(run);
|
|
162
|
-
expect(runsOf(fixture, "compensate", key)).toBe(0);
|
|
163
|
-
yield* run.interrupt;
|
|
164
|
-
expectInterrupted(expect, yield* awaitComplete(run));
|
|
165
|
-
expect(runsOf(fixture, "compensate", key)).toBe(1);
|
|
166
|
-
expect(runsOf(fixture, "once", key)).toBe(1);
|
|
167
|
-
yield* run.interrupt;
|
|
168
|
-
expectInterrupted(expect, yield* awaitComplete(run));
|
|
169
|
-
expect(runsOf(fixture, "compensate", key)).toBe(1);
|
|
170
|
-
}),
|
|
171
|
-
},
|
|
172
|
-
{
|
|
173
|
-
name: "interrupts a running execution",
|
|
174
|
-
run: ({ driver, fixture, expect, key }) => Effect.gen(function* () {
|
|
175
|
-
const gate = yield* Deferred.make();
|
|
176
|
-
fixture.gates.set(key, gate);
|
|
177
|
-
const run = yield* driver.start("compensate-hold", key);
|
|
178
|
-
yield* eventually({
|
|
179
|
-
check: Effect.sync(() => runsOf(fixture, "hold", key) >= 1),
|
|
180
|
-
what: "the activity to start",
|
|
181
|
-
});
|
|
182
|
-
yield* run.interrupt;
|
|
183
|
-
yield* Deferred.succeed(gate, undefined);
|
|
184
|
-
expectInterrupted(expect, yield* awaitComplete(run));
|
|
185
|
-
expect(runsOf(fixture, "compensate", key)).toBe(1);
|
|
186
|
-
}),
|
|
187
|
-
},
|
|
188
|
-
{
|
|
189
|
-
name: "polls unknown and complete",
|
|
190
|
-
run: ({ driver, expect, key }) => Effect.gen(function* () {
|
|
191
|
-
const unknown = yield* driver.attach("plain", key);
|
|
192
|
-
expect(Option.isNone(yield* unknown.poll)).toBe(true);
|
|
193
|
-
expect(yield* driver.execute("plain", key)).toEqual(Exit.succeed("once"));
|
|
194
|
-
const polled = yield* unknown.poll;
|
|
195
|
-
expect(isComplete(polled) && polled.value.exit).toEqual(Exit.succeed("once"));
|
|
196
|
-
}),
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
name: "attaches a repeated execute to one execution",
|
|
200
|
-
run: ({ driver, fixture, expect, key }) => Effect.gen(function* () {
|
|
201
|
-
const [first, second] = yield* Effect.all([driver.execute("plain", key), driver.execute("plain", key)], { concurrency: 2 });
|
|
202
|
-
expect(first).toEqual(Exit.succeed("once"));
|
|
203
|
-
expect(second).toEqual(Exit.succeed("once"));
|
|
204
|
-
expect(yield* driver.execute("plain", key)).toEqual(Exit.succeed("once"));
|
|
205
|
-
expect(runsOf(fixture, "once", key)).toBe(1);
|
|
206
|
-
}),
|
|
207
|
-
},
|
|
208
|
-
{
|
|
209
|
-
name: "discards an execute",
|
|
210
|
-
run: ({ driver, fixture, expect, key }) => Effect.gen(function* () {
|
|
211
|
-
const run = yield* driver.start("plain", key);
|
|
212
|
-
expect(yield* awaitComplete(run)).toEqual(Exit.succeed("once"));
|
|
213
|
-
expect(runsOf(fixture, "once", key)).toBe(1);
|
|
214
|
-
}),
|
|
215
|
-
},
|
|
216
|
-
{
|
|
217
|
-
name: "polls a running execution as the engine reports it",
|
|
218
|
-
run: ({ driver, fixture, expect, key }) => Effect.gen(function* () {
|
|
219
|
-
const gate = yield* Deferred.make();
|
|
220
|
-
fixture.gates.set(key, gate);
|
|
221
|
-
const run = yield* driver.start("hold", key);
|
|
222
|
-
yield* eventually({
|
|
223
|
-
check: Effect.sync(() => runsOf(fixture, "hold", key) >= 1),
|
|
224
|
-
what: "the activity to start",
|
|
225
|
-
});
|
|
226
|
-
const polled = yield* run.poll;
|
|
227
|
-
expect(Option.isSome(polled) ? polled.value._tag : "None").toBe(driver.pollWhileRunning);
|
|
228
|
-
yield* Deferred.succeed(gate, undefined);
|
|
229
|
-
expect(yield* awaitComplete(run)).toEqual(Exit.succeed("held"));
|
|
230
|
-
}),
|
|
231
|
-
},
|
|
232
|
-
];
|
|
233
|
-
/**
|
|
234
|
-
* Registers every shared case against one engine. `open` builds a fresh
|
|
235
|
-
* engine and its driver in the given scope; `run` executes a case.
|
|
236
|
-
*/
|
|
237
|
-
export const describeWorkflowEngine = (options) => {
|
|
238
|
-
const { registrar } = options;
|
|
239
|
-
registrar.describe(options.name, () => {
|
|
240
|
-
engineCases.forEach((engineCase, index) => {
|
|
241
|
-
registrar.it(engineCase.name, () => Effect.runPromise(Effect.gen(function* () {
|
|
242
|
-
const fixture = engineFixture();
|
|
243
|
-
const driver = yield* options.open(fixture);
|
|
244
|
-
yield* engineCase.run({
|
|
245
|
-
driver,
|
|
246
|
-
fixture,
|
|
247
|
-
expect: registrar.expect,
|
|
248
|
-
key: `case-${index}`,
|
|
249
|
-
});
|
|
250
|
-
}).pipe(Effect.scoped)), options.timeoutMs ?? 60_000);
|
|
251
|
-
});
|
|
252
|
-
});
|
|
253
|
-
};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import type { ConformanceCase } from "../conformance.ts";
|
|
2
|
-
/** Workflow-version cases: executions suspend on runners that lack their steps or marker range and resume on a compatible one, and startup refuses retention below the retry window. */
|
|
3
|
-
export declare const workflowVersionsConformance: ReadonlyArray<ConformanceCase>;
|