@rikalabs/akter 0.1.0-alpha.0
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 +15 -0
- package/LICENSE +202 -0
- package/NOTICE +8 -0
- package/README.md +116 -0
- package/dist/actor/codecs.d.ts +77 -0
- package/dist/actor/codecs.js +87 -0
- package/dist/actor/connections.d.ts +34 -0
- package/dist/actor/connections.js +145 -0
- package/dist/actor/definition.d.ts +893 -0
- package/dist/actor/definition.js +147 -0
- package/dist/actor/descriptor.d.ts +172 -0
- package/dist/actor/descriptor.js +367 -0
- package/dist/actor/handles.d.ts +77 -0
- package/dist/actor/handles.js +265 -0
- package/dist/actor/jobs.d.ts +10 -0
- package/dist/actor/jobs.js +137 -0
- package/dist/actor/layers.d.ts +41 -0
- package/dist/actor/layers.js +177 -0
- package/dist/actor/reads.d.ts +47 -0
- package/dist/actor/reads.js +224 -0
- package/dist/actor/served.d.ts +120 -0
- package/dist/actor/served.js +72 -0
- package/dist/actor/turns.d.ts +13 -0
- package/dist/actor/turns.js +332 -0
- package/dist/actor/workflows.d.ts +16 -0
- package/dist/actor/workflows.js +37 -0
- package/dist/client/calls.d.ts +47 -0
- package/dist/client/calls.js +425 -0
- package/dist/client/clock.d.ts +56 -0
- package/dist/client/clock.js +119 -0
- package/dist/client/fleet-page.d.ts +15 -0
- package/dist/client/fleet-page.js +13 -0
- package/dist/client/fleet.d.ts +29 -0
- package/dist/client/fleet.js +51 -0
- package/dist/client/index.d.ts +17 -0
- package/dist/client/index.js +6 -0
- package/dist/client/make.d.ts +157 -0
- package/dist/client/make.js +221 -0
- package/dist/client/offline/queue.d.ts +118 -0
- package/dist/client/offline/queue.js +292 -0
- package/dist/client/offline/store.d.ts +74 -0
- package/dist/client/offline/store.js +78 -0
- package/dist/client/optimistic.d.ts +57 -0
- package/dist/client/optimistic.js +136 -0
- package/dist/client/report.d.ts +2 -0
- package/dist/client/report.js +8 -0
- package/dist/client/sessions/connection.d.ts +118 -0
- package/dist/client/sessions/connection.js +162 -0
- package/dist/client/sessions/feed.d.ts +42 -0
- package/dist/client/sessions/feed.js +43 -0
- package/dist/client/sessions/sse.d.ts +47 -0
- package/dist/client/sessions/sse.js +112 -0
- package/dist/client/sessions/stream.d.ts +28 -0
- package/dist/client/sessions/stream.js +35 -0
- package/dist/client/sessions/watch.d.ts +34 -0
- package/dist/client/sessions/watch.js +40 -0
- package/dist/client/transport.d.ts +37 -0
- package/dist/client/transport.js +66 -0
- package/dist/contexts/command.d.ts +132 -0
- package/dist/contexts/command.js +20 -0
- package/dist/contexts/connection.d.ts +68 -0
- package/dist/contexts/connection.js +0 -0
- package/dist/contexts/job.d.ts +49 -0
- package/dist/contexts/job.js +0 -0
- package/dist/contexts/workflow.d.ts +147 -0
- package/dist/contexts/workflow.js +22 -0
- package/dist/errors/actor.d.ts +200 -0
- package/dist/errors/actor.js +271 -0
- package/dist/errors/content.d.ts +19 -0
- package/dist/errors/content.js +14 -0
- package/dist/errors/database.d.ts +22 -0
- package/dist/errors/database.js +23 -0
- package/dist/errors/events.d.ts +17 -0
- package/dist/errors/events.js +14 -0
- package/dist/errors/subscription.d.ts +12 -0
- package/dist/errors/subscription.js +8 -0
- package/dist/errors/workflow.d.ts +28 -0
- package/dist/errors/workflow.js +17 -0
- package/dist/handles/actors.d.ts +17 -0
- package/dist/handles/actors.js +7 -0
- package/dist/handles/content.d.ts +59 -0
- package/dist/handles/content.js +36 -0
- package/dist/handles/intents.d.ts +164 -0
- package/dist/handles/intents.js +214 -0
- package/dist/handles/run.d.ts +31 -0
- package/dist/handles/run.js +21 -0
- package/dist/handles/workflow.d.ts +27 -0
- package/dist/handles/workflow.js +23 -0
- package/dist/identity/caller.d.ts +105 -0
- package/dist/identity/caller.js +68 -0
- package/dist/identity/child.d.ts +18 -0
- package/dist/identity/child.js +39 -0
- package/dist/identity/command.d.ts +19 -0
- package/dist/identity/command.js +21 -0
- package/dist/identity/connection.d.ts +24 -0
- package/dist/identity/connection.js +29 -0
- package/dist/identity/content.d.ts +18 -0
- package/dist/identity/content.js +12 -0
- package/dist/identity/digest.d.ts +4 -0
- package/dist/identity/digest.js +5 -0
- package/dist/identity/execution.d.ts +32 -0
- package/dist/identity/execution.js +63 -0
- package/dist/identity/mint.d.ts +51 -0
- package/dist/identity/mint.js +76 -0
- package/dist/identity/version.d.ts +2 -0
- package/dist/identity/version.js +3 -0
- package/dist/index.d.ts +159 -0
- package/dist/index.js +97 -0
- package/dist/members/blob.d.ts +43 -0
- package/dist/members/blob.js +29 -0
- package/dist/members/command.d.ts +109 -0
- package/dist/members/command.js +61 -0
- package/dist/members/connection.d.ts +55 -0
- package/dist/members/connection.js +49 -0
- package/dist/members/event.d.ts +36 -0
- package/dist/members/event.js +24 -0
- package/dist/members/job.d.ts +157 -0
- package/dist/members/job.js +67 -0
- package/dist/members/payload.d.ts +93 -0
- package/dist/members/payload.js +145 -0
- package/dist/members/reducer.d.ts +64 -0
- package/dist/members/reducer.js +27 -0
- package/dist/members/stream.d.ts +36 -0
- package/dist/members/stream.js +14 -0
- package/dist/members/subscription.d.ts +182 -0
- package/dist/members/subscription.js +91 -0
- package/dist/members/workflow.d.ts +99 -0
- package/dist/members/workflow.js +2 -0
- package/dist/policies/access.d.ts +35 -0
- package/dist/policies/access.js +6 -0
- package/dist/policies/command.d.ts +127 -0
- package/dist/policies/command.js +45 -0
- package/dist/policies/job.d.ts +28 -0
- package/dist/policies/job.js +60 -0
- package/dist/policies/schedules.d.ts +33 -0
- package/dist/policies/schedules.js +131 -0
- package/dist/protocol/frames.d.ts +66 -0
- package/dist/protocol/frames.js +55 -0
- package/dist/protocol/inspection.d.ts +807 -0
- package/dist/protocol/inspection.js +243 -0
- package/dist/protocol/wire.d.ts +184 -0
- package/dist/protocol/wire.js +150 -0
- package/dist/runtime/actors.d.ts +155 -0
- package/dist/runtime/actors.js +4 -0
- package/dist/runtime/admission.d.ts +34 -0
- package/dist/runtime/admission.js +72 -0
- package/dist/runtime/adoption/backfill.d.ts +27 -0
- package/dist/runtime/adoption/backfill.js +144 -0
- package/dist/runtime/adoption/enforce.d.ts +55 -0
- package/dist/runtime/adoption/enforce.js +241 -0
- package/dist/runtime/adoption/observe.d.ts +43 -0
- package/dist/runtime/adoption/observe.js +139 -0
- package/dist/runtime/adoption/plan.d.ts +45 -0
- package/dist/runtime/adoption/plan.js +192 -0
- package/dist/runtime/adoption/startup.d.ts +32 -0
- package/dist/runtime/adoption/startup.js +76 -0
- package/dist/runtime/adoption/status.d.ts +23 -0
- package/dist/runtime/adoption/status.js +47 -0
- package/dist/runtime/adoption/target.d.ts +33 -0
- package/dist/runtime/adoption/target.js +49 -0
- package/dist/runtime/connections/holder.d.ts +221 -0
- package/dist/runtime/connections/holder.js +816 -0
- package/dist/runtime/connections/owner.d.ts +263 -0
- package/dist/runtime/connections/owner.js +896 -0
- package/dist/runtime/connections/protocol.d.ts +441 -0
- package/dist/runtime/connections/protocol.js +222 -0
- package/dist/runtime/connections/reads.d.ts +24 -0
- package/dist/runtime/connections/reads.js +19 -0
- package/dist/runtime/connections/streams.d.ts +62 -0
- package/dist/runtime/connections/streams.js +128 -0
- package/dist/runtime/connections/transport.d.ts +40 -0
- package/dist/runtime/connections/transport.js +68 -0
- package/dist/runtime/connections/watch.d.ts +52 -0
- package/dist/runtime/connections/watch.js +159 -0
- package/dist/runtime/content/grant.d.ts +34 -0
- package/dist/runtime/content/grant.js +58 -0
- package/dist/runtime/content/store.d.ts +63 -0
- package/dist/runtime/content/store.js +294 -0
- package/dist/runtime/cron/key.d.ts +2 -0
- package/dist/runtime/cron/key.js +2 -0
- package/dist/runtime/cron/schedule.d.ts +69 -0
- package/dist/runtime/cron/schedule.js +144 -0
- package/dist/runtime/database/bounded.d.ts +43 -0
- package/dist/runtime/database/bounded.js +108 -0
- package/dist/runtime/database/connection.d.ts +8 -0
- package/dist/runtime/database/connection.js +18 -0
- package/dist/runtime/database/coordination.d.ts +19 -0
- package/dist/runtime/database/coordination.js +72 -0
- package/dist/runtime/database/flock.d.ts +10 -0
- package/dist/runtime/database/flock.js +60 -0
- package/dist/runtime/database/gate.d.ts +26 -0
- package/dist/runtime/database/gate.js +54 -0
- package/dist/runtime/database/keepalive.d.ts +11 -0
- package/dist/runtime/database/keepalive.js +22 -0
- package/dist/runtime/database/migrations.d.ts +177 -0
- package/dist/runtime/database/migrations.js +1018 -0
- package/dist/runtime/database/neki/migrations.d.ts +31 -0
- package/dist/runtime/database/neki/migrations.js +276 -0
- package/dist/runtime/database/neki/session.d.ts +23 -0
- package/dist/runtime/database/neki/session.js +31 -0
- package/dist/runtime/database/pglite.d.ts +21 -0
- package/dist/runtime/database/pglite.js +74 -0
- package/dist/runtime/database/replica.d.ts +41 -0
- package/dist/runtime/database/replica.js +51 -0
- package/dist/runtime/database/shards.d.ts +21 -0
- package/dist/runtime/database/shards.js +37 -0
- package/dist/runtime/database/snapshot.d.ts +7 -0
- package/dist/runtime/database/snapshot.js +7 -0
- package/dist/runtime/database/tenancy.d.ts +69 -0
- package/dist/runtime/database/tenancy.js +145 -0
- package/dist/runtime/database/transient.d.ts +10 -0
- package/dist/runtime/database/transient.js +25 -0
- package/dist/runtime/drain.d.ts +132 -0
- package/dist/runtime/drain.js +109 -0
- package/dist/runtime/entity/mailbox.d.ts +86 -0
- package/dist/runtime/entity/mailbox.js +121 -0
- package/dist/runtime/entity/register.d.ts +424 -0
- package/dist/runtime/entity/register.js +669 -0
- package/dist/runtime/events/append.d.ts +192 -0
- package/dist/runtime/events/append.js +128 -0
- package/dist/runtime/events/cursor.d.ts +2 -0
- package/dist/runtime/events/cursor.js +5 -0
- package/dist/runtime/events/replay.d.ts +20 -0
- package/dist/runtime/events/replay.js +45 -0
- package/dist/runtime/feeds.d.ts +26 -0
- package/dist/runtime/feeds.js +100 -0
- package/dist/runtime/fleet/checks.d.ts +17 -0
- package/dist/runtime/fleet/checks.js +106 -0
- package/dist/runtime/fleet/maintainer.d.ts +38 -0
- package/dist/runtime/fleet/maintainer.js +383 -0
- package/dist/runtime/fleet/pgoutput.d.ts +41 -0
- package/dist/runtime/fleet/pgoutput.js +102 -0
- package/dist/runtime/fleet/setup.d.ts +36 -0
- package/dist/runtime/fleet/setup.js +58 -0
- package/dist/runtime/fleet/subscribe.d.ts +42 -0
- package/dist/runtime/fleet/subscribe.js +147 -0
- package/dist/runtime/index.d.ts +66 -0
- package/dist/runtime/index.js +37 -0
- package/dist/runtime/inspector/http.d.ts +19 -0
- package/dist/runtime/inspector/http.js +36 -0
- package/dist/runtime/inspector/layer.d.ts +46 -0
- package/dist/runtime/inspector/layer.js +180 -0
- package/dist/runtime/inspector/queries.d.ts +711 -0
- package/dist/runtime/inspector/queries.js +494 -0
- package/dist/runtime/jobs/attempt.d.ts +254 -0
- package/dist/runtime/jobs/attempt.js +413 -0
- package/dist/runtime/jobs/isolation.d.ts +20 -0
- package/dist/runtime/jobs/isolation.js +10 -0
- package/dist/runtime/jobs/progress.d.ts +95 -0
- package/dist/runtime/jobs/progress.js +144 -0
- package/dist/runtime/layer.d.ts +260 -0
- package/dist/runtime/layer.js +876 -0
- package/dist/runtime/members.d.ts +381 -0
- package/dist/runtime/members.js +8 -0
- package/dist/runtime/operators/audit.d.ts +64 -0
- package/dist/runtime/operators/audit.js +56 -0
- package/dist/runtime/operators/auth.d.ts +29 -0
- package/dist/runtime/operators/auth.js +42 -0
- package/dist/runtime/operators/export.d.ts +68 -0
- package/dist/runtime/operators/export.js +137 -0
- package/dist/runtime/operators/grants.d.ts +45 -0
- package/dist/runtime/operators/grants.js +40 -0
- package/dist/runtime/operators/repair.d.ts +206 -0
- package/dist/runtime/operators/repair.js +226 -0
- package/dist/runtime/operators/routes.d.ts +35 -0
- package/dist/runtime/operators/routes.js +190 -0
- package/dist/runtime/operators/seed.d.ts +123 -0
- package/dist/runtime/operators/seed.js +123 -0
- package/dist/runtime/payloads/versions.d.ts +65 -0
- package/dist/runtime/payloads/versions.js +240 -0
- package/dist/runtime/peering/authority.d.ts +42 -0
- package/dist/runtime/peering/authority.js +132 -0
- package/dist/runtime/peering/credentials.d.ts +21 -0
- package/dist/runtime/peering/credentials.js +13 -0
- package/dist/runtime/peering/transport.d.ts +51 -0
- package/dist/runtime/peering/transport.js +175 -0
- package/dist/runtime/queries.d.ts +18 -0
- package/dist/runtime/queries.js +169 -0
- package/dist/runtime/readiness.d.ts +36 -0
- package/dist/runtime/readiness.js +44 -0
- package/dist/runtime/registration.d.ts +58 -0
- package/dist/runtime/registration.js +186 -0
- package/dist/runtime/request.d.ts +158 -0
- package/dist/runtime/request.js +102 -0
- package/dist/runtime/retry.d.ts +8 -0
- package/dist/runtime/retry.js +11 -0
- package/dist/runtime/runner.d.ts +93 -0
- package/dist/runtime/runner.js +122 -0
- package/dist/runtime/storage/codec.d.ts +39 -0
- package/dist/runtime/storage/codec.js +41 -0
- package/dist/runtime/storage/generation.d.ts +69 -0
- package/dist/runtime/storage/generation.js +49 -0
- package/dist/runtime/storage/placements.d.ts +15 -0
- package/dist/runtime/storage/placements.js +38 -0
- package/dist/runtime/storage/platform.d.ts +6 -0
- package/dist/runtime/storage/platform.js +9 -0
- package/dist/runtime/storage/retention.d.ts +73 -0
- package/dist/runtime/storage/retention.js +158 -0
- package/dist/runtime/subscriptions/identity.d.ts +31 -0
- package/dist/runtime/subscriptions/identity.js +45 -0
- package/dist/runtime/subscriptions/relay.d.ts +175 -0
- package/dist/runtime/subscriptions/relay.js +763 -0
- package/dist/runtime/subscriptions/storage.d.ts +40 -0
- package/dist/runtime/subscriptions/storage.js +98 -0
- package/dist/runtime/sweeps.d.ts +39 -0
- package/dist/runtime/sweeps.js +54 -0
- package/dist/runtime/telemetry/defects.d.ts +57 -0
- package/dist/runtime/telemetry/defects.js +43 -0
- package/dist/runtime/telemetry/metrics.d.ts +52 -0
- package/dist/runtime/telemetry/metrics.js +138 -0
- package/dist/runtime/telemetry/routes.d.ts +19 -0
- package/dist/runtime/telemetry/routes.js +18 -0
- package/dist/runtime/telemetry/sampler.d.ts +26 -0
- package/dist/runtime/telemetry/sampler.js +101 -0
- package/dist/runtime/telemetry/spans.d.ts +38 -0
- package/dist/runtime/telemetry/spans.js +44 -0
- package/dist/runtime/telemetry/usage.d.ts +52 -0
- package/dist/runtime/telemetry/usage.js +30 -0
- package/dist/runtime/topology/admission.d.ts +13 -0
- package/dist/runtime/topology/admission.js +36 -0
- package/dist/runtime/topology/locks.d.ts +56 -0
- package/dist/runtime/topology/locks.js +81 -0
- package/dist/runtime/topology/messages.d.ts +15 -0
- package/dist/runtime/topology/messages.js +32 -0
- package/dist/runtime/turn/admission.d.ts +22 -0
- package/dist/runtime/turn/admission.js +41 -0
- package/dist/runtime/turn/blobs.d.ts +38 -0
- package/dist/runtime/turn/blobs.js +215 -0
- package/dist/runtime/turn/execute.d.ts +208 -0
- package/dist/runtime/turn/execute.js +972 -0
- package/dist/runtime/turn/group.d.ts +165 -0
- package/dist/runtime/turn/group.js +326 -0
- package/dist/runtime/turn/hooks.d.ts +44 -0
- package/dist/runtime/turn/hooks.js +28 -0
- package/dist/runtime/turn/outbox.d.ts +159 -0
- package/dist/runtime/turn/outbox.js +269 -0
- package/dist/runtime/turn/pipeline.d.ts +68 -0
- package/dist/runtime/turn/pipeline.js +83 -0
- package/dist/runtime/turn/receipt.d.ts +81 -0
- package/dist/runtime/turn/receipt.js +32 -0
- package/dist/runtime/turn/relay.d.ts +179 -0
- package/dist/runtime/turn/relay.js +685 -0
- package/dist/runtime/turn/rows.d.ts +43 -0
- package/dist/runtime/turn/rows.js +592 -0
- package/dist/runtime/workflows/compatibility.d.ts +125 -0
- package/dist/runtime/workflows/compatibility.js +285 -0
- package/dist/runtime/workflows/engine.d.ts +107 -0
- package/dist/runtime/workflows/engine.js +826 -0
- package/dist/runtime/workflows/manifest.d.ts +34 -0
- package/dist/runtime/workflows/manifest.js +39 -0
- package/dist/runtime/workflows/steps.d.ts +33 -0
- package/dist/runtime/workflows/steps.js +152 -0
- package/dist/serve/api.d.ts +99 -0
- package/dist/serve/api.js +403 -0
- package/dist/serve/assertion/binding.d.ts +41 -0
- package/dist/serve/assertion/binding.js +92 -0
- package/dist/serve/assertion/verify.d.ts +93 -0
- package/dist/serve/assertion/verify.js +189 -0
- package/dist/serve/auth.d.ts +200 -0
- package/dist/serve/auth.js +92 -0
- package/dist/serve/clock.d.ts +10 -0
- package/dist/serve/clock.js +25 -0
- package/dist/serve/jwt.d.ts +65 -0
- package/dist/serve/jwt.js +202 -0
- package/dist/serve/layer.d.ts +98 -0
- package/dist/serve/layer.js +809 -0
- package/dist/serve/mcp/endpoint.d.ts +39 -0
- package/dist/serve/mcp/endpoint.js +187 -0
- package/dist/serve/mcp/tools.d.ts +37 -0
- package/dist/serve/mcp/tools.js +125 -0
- package/dist/serve/origin.d.ts +6 -0
- package/dist/serve/origin.js +21 -0
- package/dist/serve/sessions/feed.d.ts +79 -0
- package/dist/serve/sessions/feed.js +115 -0
- package/dist/serve/sessions/socket.d.ts +56 -0
- package/dist/serve/sessions/socket.js +212 -0
- package/dist/serve/sessions/sse.d.ts +27 -0
- package/dist/serve/sessions/sse.js +26 -0
- package/dist/serve/sessions/stream.d.ts +9 -0
- package/dist/serve/sessions/stream.js +9 -0
- package/dist/serve/sessions/watch.d.ts +12 -0
- package/dist/serve/sessions/watch.js +11 -0
- package/dist/serve/wire.d.ts +16 -0
- package/dist/serve/wire.js +50 -0
- package/dist/state/blob.d.ts +71 -0
- package/dist/state/blob.js +0 -0
- package/dist/state/migration.d.ts +53 -0
- package/dist/state/migration.js +29 -0
- package/dist/tables/fleet.d.ts +170 -0
- package/dist/tables/fleet.js +214 -0
- package/dist/tables/owned.d.ts +250 -0
- package/dist/tables/owned.js +233 -0
- package/dist/testing/actor-test.d.ts +360 -0
- package/dist/testing/actor-test.js +337 -0
- package/dist/testing/cluster.d.ts +93 -0
- package/dist/testing/cluster.js +296 -0
- package/dist/testing/conformance/access.d.ts +5 -0
- package/dist/testing/conformance/access.js +531 -0
- package/dist/testing/conformance/admission.d.ts +11 -0
- package/dist/testing/conformance/admission.js +182 -0
- package/dist/testing/conformance/adoption.d.ts +2 -0
- package/dist/testing/conformance/adoption.js +1019 -0
- package/dist/testing/conformance/assertions.d.ts +202 -0
- package/dist/testing/conformance/assertions.js +849 -0
- package/dist/testing/conformance/batches.d.ts +41 -0
- package/dist/testing/conformance/batches.js +388 -0
- package/dist/testing/conformance/blobs.d.ts +14 -0
- package/dist/testing/conformance/blobs.js +405 -0
- package/dist/testing/conformance/capacity.d.ts +8 -0
- package/dist/testing/conformance/capacity.js +433 -0
- package/dist/testing/conformance/client.d.ts +5 -0
- package/dist/testing/conformance/client.js +719 -0
- package/dist/testing/conformance/cold-serve.d.ts +16 -0
- package/dist/testing/conformance/cold-serve.js +254 -0
- package/dist/testing/conformance/connections/actors.d.ts +1143 -0
- package/dist/testing/conformance/connections/actors.js +180 -0
- package/dist/testing/conformance/connections/harness.d.ts +1754 -0
- package/dist/testing/conformance/connections/harness.js +142 -0
- package/dist/testing/conformance/connections/holders.d.ts +4 -0
- package/dist/testing/conformance/connections/holders.js +165 -0
- package/dist/testing/conformance/connections/lifecycle.d.ts +4 -0
- package/dist/testing/conformance/connections/lifecycle.js +113 -0
- package/dist/testing/conformance/connections/limits.d.ts +4 -0
- package/dist/testing/conformance/connections/limits.js +127 -0
- package/dist/testing/conformance/connections/reauthorization.d.ts +4 -0
- package/dist/testing/conformance/connections/reauthorization.js +170 -0
- package/dist/testing/conformance/connections/resync.d.ts +4 -0
- package/dist/testing/conformance/connections/resync.js +360 -0
- package/dist/testing/conformance/connections/takeover.d.ts +4 -0
- package/dist/testing/conformance/connections/takeover.js +287 -0
- package/dist/testing/conformance/connections.d.ts +4 -0
- package/dist/testing/conformance/connections.js +15 -0
- package/dist/testing/conformance/content-blobs.d.ts +16 -0
- package/dist/testing/conformance/content-blobs.js +534 -0
- package/dist/testing/conformance/counter.d.ts +16 -0
- package/dist/testing/conformance/counter.js +813 -0
- package/dist/testing/conformance/cron.d.ts +5 -0
- package/dist/testing/conformance/cron.js +665 -0
- package/dist/testing/conformance/drain.d.ts +26 -0
- package/dist/testing/conformance/drain.js +540 -0
- package/dist/testing/conformance/effect-control.d.ts +38 -0
- package/dist/testing/conformance/effect-control.js +1059 -0
- package/dist/testing/conformance/effects.d.ts +23 -0
- package/dist/testing/conformance/effects.js +432 -0
- package/dist/testing/conformance/events.d.ts +28 -0
- package/dist/testing/conformance/events.js +335 -0
- package/dist/testing/conformance/export.d.ts +2 -0
- package/dist/testing/conformance/export.js +368 -0
- package/dist/testing/conformance/fleet.d.ts +444 -0
- package/dist/testing/conformance/fleet.js +1009 -0
- package/dist/testing/conformance/groups.d.ts +7 -0
- package/dist/testing/conformance/groups.js +353 -0
- package/dist/testing/conformance/heap.d.ts +3 -0
- package/dist/testing/conformance/heap.js +149 -0
- package/dist/testing/conformance/http.d.ts +2809 -0
- package/dist/testing/conformance/http.js +1234 -0
- package/dist/testing/conformance/inspection-views.d.ts +8 -0
- package/dist/testing/conformance/inspection-views.js +272 -0
- package/dist/testing/conformance/inspector.d.ts +7 -0
- package/dist/testing/conformance/inspector.js +650 -0
- package/dist/testing/conformance/mint.d.ts +58 -0
- package/dist/testing/conformance/mint.js +692 -0
- package/dist/testing/conformance/multi-runner.d.ts +8 -0
- package/dist/testing/conformance/multi-runner.js +403 -0
- package/dist/testing/conformance/neki/plan.d.ts +19 -0
- package/dist/testing/conformance/neki/plan.js +30 -0
- package/dist/testing/conformance/observability.d.ts +3 -0
- package/dist/testing/conformance/observability.js +343 -0
- package/dist/testing/conformance/offline.d.ts +4 -0
- package/dist/testing/conformance/offline.js +474 -0
- package/dist/testing/conformance/operator-harness.d.ts +57 -0
- package/dist/testing/conformance/operator-harness.js +78 -0
- package/dist/testing/conformance/operator.d.ts +3 -0
- package/dist/testing/conformance/operator.js +379 -0
- package/dist/testing/conformance/outbox-cross-shard.d.ts +14 -0
- package/dist/testing/conformance/outbox-cross-shard.js +160 -0
- package/dist/testing/conformance/outbox.d.ts +36 -0
- package/dist/testing/conformance/outbox.js +437 -0
- package/dist/testing/conformance/payload-migrations.d.ts +3 -0
- package/dist/testing/conformance/payload-migrations.js +612 -0
- package/dist/testing/conformance/pipeline.d.ts +3 -0
- package/dist/testing/conformance/pipeline.js +1040 -0
- package/dist/testing/conformance/placement.d.ts +22 -0
- package/dist/testing/conformance/placement.js +539 -0
- package/dist/testing/conformance/platform.d.ts +40 -0
- package/dist/testing/conformance/platform.js +101 -0
- package/dist/testing/conformance/progress.d.ts +39 -0
- package/dist/testing/conformance/progress.js +666 -0
- package/dist/testing/conformance/properties.d.ts +6 -0
- package/dist/testing/conformance/properties.js +295 -0
- package/dist/testing/conformance/protocols.d.ts +4 -0
- package/dist/testing/conformance/protocols.js +618 -0
- package/dist/testing/conformance/provider/advertise.d.ts +21 -0
- package/dist/testing/conformance/provider/advertise.js +44 -0
- package/dist/testing/conformance/read-your-writes.d.ts +20 -0
- package/dist/testing/conformance/read-your-writes.js +192 -0
- package/dist/testing/conformance/reducers.d.ts +8 -0
- package/dist/testing/conformance/reducers.js +258 -0
- package/dist/testing/conformance/relay.d.ts +42 -0
- package/dist/testing/conformance/relay.js +1115 -0
- package/dist/testing/conformance/restore.d.ts +43 -0
- package/dist/testing/conformance/restore.js +341 -0
- package/dist/testing/conformance/retention.d.ts +14 -0
- package/dist/testing/conformance/retention.js +463 -0
- package/dist/testing/conformance/rls.d.ts +24 -0
- package/dist/testing/conformance/rls.js +576 -0
- package/dist/testing/conformance/simulation.d.ts +31 -0
- package/dist/testing/conformance/simulation.js +167 -0
- package/dist/testing/conformance/single-shard.d.ts +2 -0
- package/dist/testing/conformance/single-shard.js +125 -0
- package/dist/testing/conformance/singleton.d.ts +3 -0
- package/dist/testing/conformance/singleton.js +293 -0
- package/dist/testing/conformance/statements.d.ts +60 -0
- package/dist/testing/conformance/statements.js +108 -0
- package/dist/testing/conformance/streams.d.ts +7 -0
- package/dist/testing/conformance/streams.js +280 -0
- package/dist/testing/conformance/subscriptions/access.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/access.js +98 -0
- package/dist/testing/conformance/subscriptions/actors.d.ts +4910 -0
- package/dist/testing/conformance/subscriptions/actors.js +372 -0
- package/dist/testing/conformance/subscriptions/cluster.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/cluster.js +89 -0
- package/dist/testing/conformance/subscriptions/delivery.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/delivery.js +253 -0
- package/dist/testing/conformance/subscriptions/deploys.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/deploys.js +162 -0
- package/dist/testing/conformance/subscriptions/epochs.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/epochs.js +169 -0
- package/dist/testing/conformance/subscriptions/failures.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/failures.js +108 -0
- package/dist/testing/conformance/subscriptions/feeds.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/feeds.js +218 -0
- package/dist/testing/conformance/subscriptions/harness.d.ts +124 -0
- package/dist/testing/conformance/subscriptions/harness.js +143 -0
- package/dist/testing/conformance/subscriptions/operator.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/operator.js +128 -0
- package/dist/testing/conformance/subscriptions/retention.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/retention.js +288 -0
- package/dist/testing/conformance/subscriptions/routing.d.ts +4 -0
- package/dist/testing/conformance/subscriptions/routing.js +179 -0
- package/dist/testing/conformance/subscriptions.d.ts +4 -0
- package/dist/testing/conformance/subscriptions.js +19 -0
- package/dist/testing/conformance/tables.d.ts +125 -0
- package/dist/testing/conformance/tables.js +664 -0
- package/dist/testing/conformance/transports/actors.d.ts +1907 -0
- package/dist/testing/conformance/transports/actors.js +163 -0
- package/dist/testing/conformance/transports/client.d.ts +3 -0
- package/dist/testing/conformance/transports/client.js +237 -0
- package/dist/testing/conformance/transports/feeds.d.ts +3 -0
- package/dist/testing/conformance/transports/feeds.js +232 -0
- package/dist/testing/conformance/transports/harness.d.ts +93 -0
- package/dist/testing/conformance/transports/harness.js +84 -0
- package/dist/testing/conformance/transports/streams.d.ts +3 -0
- package/dist/testing/conformance/transports/streams.js +96 -0
- package/dist/testing/conformance/transports/websocket.d.ts +3 -0
- package/dist/testing/conformance/transports/websocket.js +384 -0
- package/dist/testing/conformance/transports/wire.d.ts +141 -0
- package/dist/testing/conformance/transports/wire.js +204 -0
- package/dist/testing/conformance/transports.d.ts +3 -0
- package/dist/testing/conformance/transports.js +11 -0
- package/dist/testing/conformance/watch.d.ts +59 -0
- package/dist/testing/conformance/watch.js +879 -0
- package/dist/testing/conformance/workflow-engine.d.ts +97 -0
- package/dist/testing/conformance/workflow-engine.js +253 -0
- package/dist/testing/conformance/workflow-versions.d.ts +3 -0
- package/dist/testing/conformance/workflow-versions.js +545 -0
- package/dist/testing/conformance/workflows/access.d.ts +4 -0
- package/dist/testing/conformance/workflows/access.js +147 -0
- package/dist/testing/conformance/workflows/actors.d.ts +2317 -0
- package/dist/testing/conformance/workflows/actors.js +305 -0
- package/dist/testing/conformance/workflows/basics.d.ts +4 -0
- package/dist/testing/conformance/workflows/basics.js +144 -0
- package/dist/testing/conformance/workflows/engine.d.ts +4 -0
- package/dist/testing/conformance/workflows/engine.js +80 -0
- package/dist/testing/conformance/workflows/guards.d.ts +4 -0
- package/dist/testing/conformance/workflows/guards.js +172 -0
- package/dist/testing/conformance/workflows/harness.d.ts +14 -0
- package/dist/testing/conformance/workflows/harness.js +44 -0
- package/dist/testing/conformance/workflows/recovery.d.ts +4 -0
- package/dist/testing/conformance/workflows/recovery.js +181 -0
- package/dist/testing/conformance/workflows/starts.d.ts +4 -0
- package/dist/testing/conformance/workflows/starts.js +57 -0
- package/dist/testing/conformance/workflows/suspension.d.ts +4 -0
- package/dist/testing/conformance/workflows/suspension.js +106 -0
- package/dist/testing/conformance/workflows/waits.d.ts +4 -0
- package/dist/testing/conformance/workflows/waits.js +284 -0
- package/dist/testing/conformance/workflows.d.ts +4 -0
- package/dist/testing/conformance/workflows.js +19 -0
- package/dist/testing/conformance.d.ts +330 -0
- package/dist/testing/conformance.js +364 -0
- package/dist/testing/database.d.ts +31 -0
- package/dist/testing/database.js +70 -0
- package/dist/testing/foundation.d.ts +41 -0
- package/dist/testing/foundation.js +517 -0
- package/dist/testing/index.d.ts +20 -0
- package/dist/testing/index.js +12 -0
- package/dist/testing/property.d.ts +40 -0
- package/dist/testing/property.js +95 -0
- package/dist/testing/simulate-cluster.d.ts +112 -0
- package/dist/testing/simulate-cluster.js +257 -0
- package/dist/testing/simulate.d.ts +90 -0
- package/dist/testing/simulate.js +127 -0
- package/package.json +1 -0
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { DateTime, Deferred, Effect, Fiber } from "effect";
|
|
2
|
+
import { SqlClient } from "effect/sql";
|
|
3
|
+
import { ActorTest } from "../../actor-test.js";
|
|
4
|
+
import { Keeper, Shipper, Watch } from "./actors.js";
|
|
5
|
+
import { eventually, reset, suspendedRow } from "./harness.js";
|
|
6
|
+
/** Owner-event waits, clocks, and retention pins of workflows. */
|
|
7
|
+
export const workflowWaitConformance = [
|
|
8
|
+
{
|
|
9
|
+
name: "workflows: resolves an event committed between start and registration",
|
|
10
|
+
run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
|
|
11
|
+
yield* reset(fixture);
|
|
12
|
+
const gate = yield* Deferred.make();
|
|
13
|
+
fixture.gates.set("w2-between", gate);
|
|
14
|
+
const shipper = yield* Shipper.get("w2-between");
|
|
15
|
+
const run = yield* shipper.Watch({ mode: "gated", orderId: "w2-between" });
|
|
16
|
+
yield* eventually(Effect.sync(() => fixture.runs.get("hold:w2-between") === 1), "the activity before the wait");
|
|
17
|
+
yield* shipper.Pay({ orderId: "w2-between", amount: 4 });
|
|
18
|
+
yield* Deferred.succeed(gate, undefined);
|
|
19
|
+
expect(yield* run.result).toBe("paid-4");
|
|
20
|
+
}).pipe(Effect.ensuring(Effect.sync(() => fixture.gates.delete("w2-between"))))),
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
name: "workflows: resolves an event committed while the run is suspending",
|
|
24
|
+
run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
|
|
25
|
+
yield* reset(fixture);
|
|
26
|
+
const test = yield* ActorTest;
|
|
27
|
+
const shipper = yield* Shipper.get("w2-suspending");
|
|
28
|
+
const pause = yield* test.pauseNext("beforeWorkflowSuspend");
|
|
29
|
+
const run = yield* shipper.Watch({ mode: "plain", orderId: "w2-suspending" });
|
|
30
|
+
yield* pause.reached;
|
|
31
|
+
yield* shipper.Pay({ orderId: "w2-suspending", amount: 5 });
|
|
32
|
+
yield* pause.release;
|
|
33
|
+
expect(yield* run.result).toBe("paid-5");
|
|
34
|
+
})),
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
name: "workflows: resolves an event delivered while the run is live",
|
|
38
|
+
run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
|
|
39
|
+
yield* reset(fixture);
|
|
40
|
+
const sql = yield* SqlClient.SqlClient;
|
|
41
|
+
const gate = yield* Deferred.make();
|
|
42
|
+
fixture.gates.set("w2-live", gate);
|
|
43
|
+
const shipper = yield* Shipper.get("w2-live");
|
|
44
|
+
const run = yield* shipper.Watch({ mode: "race", orderId: "w2-live" });
|
|
45
|
+
yield* eventually(Effect.gen(function* () {
|
|
46
|
+
const rows = yield* sql `SELECT step FROM actor_workflow_step
|
|
47
|
+
WHERE execution_id = ${run.executionId} AND step = 'first'`;
|
|
48
|
+
return rows.length === 1 && fixture.runs.get("slow:w2-live") === 1;
|
|
49
|
+
}).pipe(Effect.orDie), "the wait to park beside the running activity");
|
|
50
|
+
yield* shipper.Pay({ orderId: "w2-live", amount: 6 });
|
|
51
|
+
const result = yield* run.result.pipe(Effect.timeoutOrElse({
|
|
52
|
+
duration: "15 seconds",
|
|
53
|
+
orElse: () => Effect.die(new Error("The live run was not preempted for its event")),
|
|
54
|
+
}));
|
|
55
|
+
expect(result).toBe("paid-6");
|
|
56
|
+
}).pipe(Effect.ensuring(Effect.gen(function* () {
|
|
57
|
+
const gate = fixture.gates.get("w2-live");
|
|
58
|
+
if (gate !== undefined)
|
|
59
|
+
yield* Deferred.succeed(gate, undefined);
|
|
60
|
+
fixture.gates.delete("w2-live");
|
|
61
|
+
})))),
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
name: "workflows: a parked wait resolves by the event its sibling activity emits as that sibling finishes",
|
|
65
|
+
timeoutMs: 120_000,
|
|
66
|
+
run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
|
|
67
|
+
yield* reset(fixture);
|
|
68
|
+
const sql = yield* SqlClient.SqlClient;
|
|
69
|
+
const gate = yield* Deferred.make();
|
|
70
|
+
fixture.gates.set("sibling-gated", gate);
|
|
71
|
+
const ids = ["sibling-gated", "sibling-0", "sibling-1", "sibling-2", "sibling-3"];
|
|
72
|
+
const runs = yield* Effect.forEach(ids, (id) => Shipper.get(id).pipe(Effect.flatMap((shipper) => shipper.Watch({ mode: "sibling", orderId: id }))));
|
|
73
|
+
yield* eventually(Effect.gen(function* () {
|
|
74
|
+
const rows = yield* sql `SELECT step FROM actor_workflow_step
|
|
75
|
+
WHERE execution_id = ${runs[0].executionId} AND step = 'first' AND exit IS NULL`;
|
|
76
|
+
return rows.length === 1 && fixture.runs.get("emit:sibling-gated") === 1;
|
|
77
|
+
}).pipe(Effect.orDie), "the wait to park beside the gated sibling");
|
|
78
|
+
yield* Deferred.succeed(gate, undefined);
|
|
79
|
+
const results = yield* Effect.forEach(runs, (run) => run.result, {
|
|
80
|
+
concurrency: "unbounded",
|
|
81
|
+
}).pipe(Effect.timeoutOrElse({
|
|
82
|
+
duration: "60 seconds",
|
|
83
|
+
orElse: () => Effect.die(new Error("A run never resumed for its sibling's event")),
|
|
84
|
+
}));
|
|
85
|
+
expect(results).toEqual(ids.map(() => "paid-8|emitted"));
|
|
86
|
+
for (const [index, id] of ids.entries()) {
|
|
87
|
+
const [events] = yield* sql `SELECT count(*)::int AS count
|
|
88
|
+
FROM actor_events WHERE actor_type = 'Shipper' AND actor_id = ${id} AND event = 'Paid'`;
|
|
89
|
+
const [leftover] = yield* sql `SELECT
|
|
90
|
+
(SELECT count(*)::int FROM actor_workflow_step
|
|
91
|
+
WHERE execution_id = ${runs[index].executionId}) AS steps,
|
|
92
|
+
(SELECT count(*)::int FROM actor_outbox
|
|
93
|
+
WHERE timer_key = ${`wf:${runs[index].executionId}`}) AS timers`;
|
|
94
|
+
expect({ id, events: events.count, ...leftover }).toEqual({
|
|
95
|
+
id,
|
|
96
|
+
events: 1,
|
|
97
|
+
steps: 0,
|
|
98
|
+
timers: 0,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
}).pipe(Effect.ensuring(Effect.sync(() => {
|
|
102
|
+
fixture.gates.delete("sibling-gated");
|
|
103
|
+
})))),
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
name: "workflows: a workflow command that kicks a running execution commits and answers while the owner call its activity makes waits behind it",
|
|
107
|
+
requiresIndependentConnections: true,
|
|
108
|
+
timeoutMs: 120_000,
|
|
109
|
+
run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
|
|
110
|
+
yield* reset(fixture);
|
|
111
|
+
const sql = yield* SqlClient.SqlClient;
|
|
112
|
+
const test = yield* ActorTest;
|
|
113
|
+
const id = "kick-behind";
|
|
114
|
+
const gate = yield* Deferred.make();
|
|
115
|
+
fixture.gates.set(id, gate);
|
|
116
|
+
const shipper = yield* Shipper.get(id);
|
|
117
|
+
const run = yield* shipper.Watch({ mode: "sibling", orderId: id });
|
|
118
|
+
yield* eventually(Effect.sync(() => fixture.runs.get(`emit:${id}`) === 1), "the sibling activity to start");
|
|
119
|
+
const committing = yield* test.pauseNext("beforeCommit");
|
|
120
|
+
const reattach = yield* shipper
|
|
121
|
+
.Watch({ mode: "sibling", orderId: id })
|
|
122
|
+
.pipe(Effect.forkChild({ startImmediately: true }));
|
|
123
|
+
yield* committing.reached;
|
|
124
|
+
const arriving = yield* test.pauseNext("queued");
|
|
125
|
+
yield* Deferred.succeed(gate, undefined);
|
|
126
|
+
yield* arriving.reached;
|
|
127
|
+
yield* arriving.release;
|
|
128
|
+
yield* Effect.sleep("500 millis");
|
|
129
|
+
yield* committing.release;
|
|
130
|
+
const reattached = yield* Fiber.join(reattach).pipe(Effect.timeoutOrElse({
|
|
131
|
+
duration: "10 seconds",
|
|
132
|
+
orElse: () => Effect.die(new Error("The kicking turn never answered behind the owner call")),
|
|
133
|
+
}));
|
|
134
|
+
expect(reattached.executionId).toBe(run.executionId);
|
|
135
|
+
expect(yield* run.result).toBe("paid-8|emitted");
|
|
136
|
+
expect(fixture.runs.get(`emit:${id}`)).toBe(1);
|
|
137
|
+
expect(yield* test.receiptsFor(shipper.ref, "Pay")).toBe(1);
|
|
138
|
+
const [leftover] = yield* sql `SELECT
|
|
139
|
+
(SELECT count(*)::int FROM actor_workflow_step
|
|
140
|
+
WHERE execution_id = ${run.executionId}) AS steps,
|
|
141
|
+
(SELECT count(*)::int FROM actor_outbox
|
|
142
|
+
WHERE timer_key = ${`wf:${run.executionId}`}) AS timers`;
|
|
143
|
+
expect(leftover).toEqual({ steps: 0, timers: 0 });
|
|
144
|
+
}).pipe(Effect.ensuring(Effect.sync(() => {
|
|
145
|
+
fixture.gates.delete("kick-behind");
|
|
146
|
+
})))),
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
name: "workflows: resolves two sequential waits with two events",
|
|
150
|
+
run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
|
|
151
|
+
yield* reset(fixture);
|
|
152
|
+
const shipper = yield* Shipper.get("w2-two");
|
|
153
|
+
const run = yield* shipper.Watch({ mode: "two", orderId: "w2-two" });
|
|
154
|
+
yield* shipper.Pay({ orderId: "w2-two", amount: 1 });
|
|
155
|
+
yield* shipper.Pay({ orderId: "w2-two", amount: 2 });
|
|
156
|
+
expect(yield* run.result).toBe("paid-1|paid-2");
|
|
157
|
+
})),
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
name: "workflows: resolves concurrent waits for one tag",
|
|
161
|
+
run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
|
|
162
|
+
yield* reset(fixture);
|
|
163
|
+
const shipper = yield* Shipper.get("w2-concurrent");
|
|
164
|
+
const runs = yield* Effect.forEach(["c1", "c2", "c3"], (orderId) => shipper.Watch({ mode: "any", orderId }));
|
|
165
|
+
yield* Effect.forEach(runs, (run) => suspendedRow(run.executionId));
|
|
166
|
+
yield* shipper.Pay({ orderId: "anyone", amount: 9 });
|
|
167
|
+
expect(yield* Effect.forEach(runs, (run) => run.result, { concurrency: 3 })).toEqual([
|
|
168
|
+
"paid-9",
|
|
169
|
+
"paid-9",
|
|
170
|
+
"paid-9",
|
|
171
|
+
]);
|
|
172
|
+
})),
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
name: "workflows: settles a wait exactly once when its event and timeout race",
|
|
176
|
+
timeoutMs: 120_000,
|
|
177
|
+
run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
|
|
178
|
+
yield* reset(fixture);
|
|
179
|
+
const sql = yield* SqlClient.SqlClient;
|
|
180
|
+
const test = yield* ActorTest;
|
|
181
|
+
for (let round = 0; round < 6; round++) {
|
|
182
|
+
const orderId = `w2-timeout-${round}`;
|
|
183
|
+
const shipper = yield* Shipper.get(orderId);
|
|
184
|
+
const run = yield* shipper.Watch({ mode: "plain", orderId });
|
|
185
|
+
yield* suspendedRow(run.executionId);
|
|
186
|
+
const [wait] = yield* sql `SELECT due_at_ms::text AS due
|
|
187
|
+
FROM actor_workflow_step WHERE execution_id = ${run.executionId} AND step = 'first'`;
|
|
188
|
+
if (round === 0) {
|
|
189
|
+
yield* test.advance("59 seconds");
|
|
190
|
+
yield* shipper.Pay({ orderId, amount: round });
|
|
191
|
+
yield* test.advance("2 seconds");
|
|
192
|
+
}
|
|
193
|
+
else
|
|
194
|
+
yield* Effect.all([shipper.Pay({ orderId, amount: round }), test.advance("61 seconds")], {
|
|
195
|
+
concurrency: 2,
|
|
196
|
+
});
|
|
197
|
+
const result = yield* run.result;
|
|
198
|
+
const [event] = yield* sql `SELECT emitted_at_ms::text AS at
|
|
199
|
+
FROM actor_events WHERE actor_type = 'Shipper' AND actor_id = ${orderId}
|
|
200
|
+
AND tenant_id = ${shipper.ref.tenant}`;
|
|
201
|
+
if (Number(event.at) <= Number(wait.due))
|
|
202
|
+
expect(result).toBe(`paid-${round}`);
|
|
203
|
+
else
|
|
204
|
+
expect([`paid-${round}`, "unpaid"]).toContain(result);
|
|
205
|
+
expect(yield* (yield* Shipper.run(Watch, run.executionId)).result).toBe(result);
|
|
206
|
+
}
|
|
207
|
+
})),
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
name: "workflows: resumes two concurrent clocks at their own due times",
|
|
211
|
+
run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
|
|
212
|
+
yield* reset(fixture);
|
|
213
|
+
const test = yield* ActorTest;
|
|
214
|
+
const shipper = yield* Shipper.get("clocks");
|
|
215
|
+
const run = yield* shipper.Watch({ mode: "clocks", orderId: "clocks" });
|
|
216
|
+
yield* suspendedRow(run.executionId);
|
|
217
|
+
const marks = () => ["mark-a", "mark-b"].map((label) => fixture.runs.get(`${label}:clocks`) ?? 0);
|
|
218
|
+
expect(marks()).toEqual([0, 0]);
|
|
219
|
+
yield* test.advance("6 seconds");
|
|
220
|
+
yield* eventually(Effect.sync(() => marks()[0] === 1), "the 5-second clock to resume");
|
|
221
|
+
yield* suspendedRow(run.executionId);
|
|
222
|
+
expect(marks()).toEqual([1, 0]);
|
|
223
|
+
yield* test.advance("5 seconds");
|
|
224
|
+
expect(yield* run.result).toBe("clocks");
|
|
225
|
+
expect(marks()).toEqual([1, 1]);
|
|
226
|
+
})),
|
|
227
|
+
},
|
|
228
|
+
{
|
|
229
|
+
name: "workflows: keeps a clock's due time across replays",
|
|
230
|
+
run: ({ expect, environment, fixture }) => environment.run(Effect.gen(function* () {
|
|
231
|
+
yield* reset(fixture);
|
|
232
|
+
const sql = yield* SqlClient.SqlClient;
|
|
233
|
+
const test = yield* ActorTest;
|
|
234
|
+
const shipper = yield* Shipper.get("long");
|
|
235
|
+
const run = yield* shipper.Watch({ mode: "long", orderId: "long" });
|
|
236
|
+
yield* suspendedRow(run.executionId);
|
|
237
|
+
const due = () => sql `SELECT due_at_ms::text AS due FROM actor_workflow_step
|
|
238
|
+
WHERE execution_id = ${run.executionId} AND step = 'long'`.pipe(Effect.map((rows) => rows[0]?.due));
|
|
239
|
+
const recorded = yield* due();
|
|
240
|
+
yield* test.advance("5 seconds");
|
|
241
|
+
yield* test.invalidate(shipper.ref);
|
|
242
|
+
const now = DateTime.toEpochMillis(yield* test.now);
|
|
243
|
+
yield* sql `UPDATE actor_outbox SET due_at_ms = ${now}
|
|
244
|
+
WHERE timer_key = ${`wf:${run.executionId}`}`;
|
|
245
|
+
yield* test.advance("1 second");
|
|
246
|
+
yield* eventually(test
|
|
247
|
+
.receiptsFor(shipper.ref, "$workflow/resume")
|
|
248
|
+
.pipe(Effect.map((count) => count > 0)), "the replay");
|
|
249
|
+
yield* suspendedRow(run.executionId);
|
|
250
|
+
expect(yield* due()).toBe(recorded);
|
|
251
|
+
yield* test.advance("2 seconds");
|
|
252
|
+
expect(fixture.runs.get("slept:long") ?? 0).toBe(0);
|
|
253
|
+
yield* test.advance("3 seconds");
|
|
254
|
+
expect(yield* run.result).toBe("slept");
|
|
255
|
+
expect(fixture.runs.get("slept:long")).toBe(1);
|
|
256
|
+
})),
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
name: "workflows: keeps events above an open cursor or pending wait from pruning",
|
|
260
|
+
run: ({ expect, environment }) => environment.run(Effect.gen(function* () {
|
|
261
|
+
const sql = yield* SqlClient.SqlClient;
|
|
262
|
+
const test = yield* ActorTest;
|
|
263
|
+
const keeper = yield* Keeper.get("pinned");
|
|
264
|
+
const sequences = () => sql `SELECT sequence::text AS sequence FROM actor_events
|
|
265
|
+
WHERE tenant_id = ${keeper.ref.tenant} AND actor_type = 'Keeper' AND actor_id = 'pinned'
|
|
266
|
+
ORDER BY sequence`.pipe(Effect.map((rows) => rows.map((row) => Number(row.sequence))));
|
|
267
|
+
for (const amount of [1, 2, 3])
|
|
268
|
+
yield* keeper.Emit({ orderId: "noise", amount });
|
|
269
|
+
const run = yield* keeper.Held({});
|
|
270
|
+
yield* suspendedRow(run.executionId);
|
|
271
|
+
for (const amount of [4, 5])
|
|
272
|
+
yield* keeper.Emit({ orderId: "noise", amount });
|
|
273
|
+
yield* Effect.sleep("200 millis");
|
|
274
|
+
yield* test.advance("2 hours");
|
|
275
|
+
yield* test.cleanup;
|
|
276
|
+
expect(yield* sequences()).toEqual([4, 5]);
|
|
277
|
+
yield* keeper.Emit({ orderId: "k", amount: 6 });
|
|
278
|
+
expect(yield* run.result).toBe("paid-6");
|
|
279
|
+
yield* test.advance("2 hours");
|
|
280
|
+
yield* test.cleanup;
|
|
281
|
+
expect(yield* sequences()).toEqual([]);
|
|
282
|
+
})),
|
|
283
|
+
},
|
|
284
|
+
];
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ConformanceCase } from "../conformance.ts";
|
|
2
|
+
import type { WorkflowsFixture } from "./workflows/actors.ts";
|
|
3
|
+
/** Workflow cases: stable execution ids, once-recorded activities, interrupts, and recovery. */
|
|
4
|
+
export declare const workflowsConformance: ReadonlyArray<ConformanceCase<WorkflowsFixture>>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { workflowAccessConformance } from "./workflows/access.js";
|
|
2
|
+
import { workflowBasicConformance } from "./workflows/basics.js";
|
|
3
|
+
import { engineConformance } from "./workflows/engine.js";
|
|
4
|
+
import { workflowGuardConformance } from "./workflows/guards.js";
|
|
5
|
+
import { workflowRecoveryConformance } from "./workflows/recovery.js";
|
|
6
|
+
import { workflowStartConformance } from "./workflows/starts.js";
|
|
7
|
+
import { workflowSuspensionConformance } from "./workflows/suspension.js";
|
|
8
|
+
import { workflowWaitConformance } from "./workflows/waits.js";
|
|
9
|
+
/** Workflow cases: stable execution ids, once-recorded activities, interrupts, and recovery. */
|
|
10
|
+
export const workflowsConformance = [
|
|
11
|
+
...engineConformance,
|
|
12
|
+
...workflowBasicConformance,
|
|
13
|
+
...workflowSuspensionConformance,
|
|
14
|
+
...workflowRecoveryConformance,
|
|
15
|
+
...workflowStartConformance,
|
|
16
|
+
...workflowAccessConformance,
|
|
17
|
+
...workflowGuardConformance,
|
|
18
|
+
...workflowWaitConformance,
|
|
19
|
+
];
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import { Effect, Layer, Logger, ManagedRuntime, type Crypto, type Scope } from "effect";
|
|
2
|
+
import type { Redacted } from "effect";
|
|
3
|
+
import type { HttpServer } from "effect/http";
|
|
4
|
+
import { type SqlClient, Statement } from "effect/sql";
|
|
5
|
+
import type { Actors } from "../index.ts";
|
|
6
|
+
import type { InternalActors } from "../runtime/actors.ts";
|
|
7
|
+
import type { RuntimeControl } from "../runtime/drain.ts";
|
|
8
|
+
import type { OperatorRuntime } from "../runtime/operators/repair.ts";
|
|
9
|
+
import type { Request } from "../runtime/request.ts";
|
|
10
|
+
import { type ContentPoint, type TurnPoint } from "../runtime/turn/hooks.ts";
|
|
11
|
+
import type { ContentStore } from "../handles/content.ts";
|
|
12
|
+
import type { Options } from "../runtime/layer.ts";
|
|
13
|
+
import { ActorTest } from "./actor-test.ts";
|
|
14
|
+
import type { ConformanceEdge } from "./conformance/assertions.ts";
|
|
15
|
+
/**
|
|
16
|
+
* Assertions injected by the test framework running the suite, e.g. Vitest's
|
|
17
|
+
* `expect`. The framework itself is never imported here.
|
|
18
|
+
*/
|
|
19
|
+
export interface ConformanceMatchers {
|
|
20
|
+
readonly not: ConformanceMatchers;
|
|
21
|
+
readonly toBe: <T>(expected: T) => void;
|
|
22
|
+
readonly toEqual: <T>(expected: T) => void;
|
|
23
|
+
readonly toContain: <T>(expected: T) => void;
|
|
24
|
+
readonly toMatchObject: <T extends object | ReadonlyArray<unknown>>(expected: T) => void;
|
|
25
|
+
readonly toBeInstanceOf: <T>(expected: T) => void;
|
|
26
|
+
}
|
|
27
|
+
export type ConformanceExpect = <T>(actual: T) => ConformanceMatchers;
|
|
28
|
+
/**
|
|
29
|
+
* The subset of `describe`/`it`/lifecycle a registrar must supply. Vitest's
|
|
30
|
+
* exported functions satisfy this shape.
|
|
31
|
+
*/
|
|
32
|
+
export interface ConformanceRegistrar {
|
|
33
|
+
readonly describe: (name: string, body: () => void) => void;
|
|
34
|
+
/**
|
|
35
|
+
* Registers one case. A runner that aborts `signal` when the case times
|
|
36
|
+
* out or is cancelled, as Vitest does, interrupts the case's effects so
|
|
37
|
+
* their finalizers run before the next case starts.
|
|
38
|
+
*/
|
|
39
|
+
readonly it: (name: string, body: (context: {
|
|
40
|
+
readonly signal?: AbortSignal | undefined;
|
|
41
|
+
}) => Promise<void>, timeout?: number) => void;
|
|
42
|
+
readonly beforeAll: (body: () => Promise<void> | void, timeout?: number) => void;
|
|
43
|
+
readonly afterAll: (body: () => Promise<void> | void) => void;
|
|
44
|
+
readonly expect: ConformanceExpect;
|
|
45
|
+
/** Registers an inapplicable case by name so it is reported, never silently dropped. */
|
|
46
|
+
readonly skip: (name: string) => void;
|
|
47
|
+
}
|
|
48
|
+
export type ConformanceDatabase = NonNullable<NonNullable<Parameters<typeof ActorTest.layer>[0]>["database"]>;
|
|
49
|
+
export interface ConformanceConnection {
|
|
50
|
+
readonly query: (statement: string, parameters?: ReadonlyArray<unknown>) => Effect.Effect<ReadonlyArray<unknown>>;
|
|
51
|
+
}
|
|
52
|
+
/** Services every `environment.run` effect may require; Scope is provided. */
|
|
53
|
+
export type ConformanceServices = Actors | InternalActors | RuntimeControl | ActorTest | SqlClient.SqlClient | Crypto.Crypto | ContentStore | OperatorRuntime;
|
|
54
|
+
export type ConformanceRuntime = ManagedRuntime.ManagedRuntime<ConformanceServices, never>;
|
|
55
|
+
export interface ConformanceEnvironment {
|
|
56
|
+
/** Runs an effect against the current runtime. */
|
|
57
|
+
readonly run: <A, E>(effect: Effect.Effect<A, E, ConformanceServices | Scope.Scope>) => Promise<A>;
|
|
58
|
+
/** Builds a new runtime without installing it; warm it explicitly. */
|
|
59
|
+
readonly build: (options?: {
|
|
60
|
+
readonly retryWindowMs?: number;
|
|
61
|
+
/** Deployment admission settings for cases that deliberately queue more than the defaults allow. */
|
|
62
|
+
readonly admission?: Options["admission"];
|
|
63
|
+
readonly database?: ConformanceDatabase;
|
|
64
|
+
/** Queries read this streaming replica of `database` once it has caught up. */
|
|
65
|
+
readonly replica?: Redacted.Redacted<string> | undefined;
|
|
66
|
+
readonly content?: Options["content"];
|
|
67
|
+
/**
|
|
68
|
+
* Sees every statement the runtime compiles, from any fiber. It replaces
|
|
69
|
+
* the current statement transformer of every fiber the runtime starts, so
|
|
70
|
+
* a case that installs its own on a caller cannot share the runtime.
|
|
71
|
+
*/
|
|
72
|
+
readonly observe?: (statement: Statement.Statement<unknown>) => void;
|
|
73
|
+
}) => ConformanceRuntime;
|
|
74
|
+
/** Stops the current runtime; the retained database survives. */
|
|
75
|
+
readonly stop: Effect.Effect<void>;
|
|
76
|
+
/** Restarts the current runtime against the retained database. */
|
|
77
|
+
readonly restart: Effect.Effect<void>;
|
|
78
|
+
/**
|
|
79
|
+
* A second database untouched by the current runtime, for isolation cases.
|
|
80
|
+
* Only a case that declares `requiresFreshDatabase` may open one.
|
|
81
|
+
*/
|
|
82
|
+
readonly freshDatabase: Effect.Effect<ConformanceDatabase>;
|
|
83
|
+
/**
|
|
84
|
+
* Copies the retained database whole, as a backup of a stopped deployment
|
|
85
|
+
* would, into a new database no runtime has opened. Requires `stop` first,
|
|
86
|
+
* and a case that declares `requiresFreshDatabase`.
|
|
87
|
+
*/
|
|
88
|
+
readonly snapshot: Effect.Effect<ConformanceDatabase>;
|
|
89
|
+
/**
|
|
90
|
+
* Opens an independent SQL connection to the same database. Only present
|
|
91
|
+
* when the backend advertises `independentConnections`.
|
|
92
|
+
*/
|
|
93
|
+
readonly connect?: Effect.Effect<ConformanceConnection, never, Scope.Scope>;
|
|
94
|
+
/** The retained database on a streaming replica; only present when the backend has one. */
|
|
95
|
+
readonly replica?: ConformanceReplica | undefined;
|
|
96
|
+
/** A fresh listening HTTP server that supports WebSocket upgrades; each build listens anew. */
|
|
97
|
+
readonly httpServer: Layer.Layer<HttpServer.HttpServer>;
|
|
98
|
+
/** The hosted edge under test, when the backend supplies one. */
|
|
99
|
+
readonly edge?: ConformanceEdge;
|
|
100
|
+
}
|
|
101
|
+
/** A physical streaming replica of the backend's Postgres primary. */
|
|
102
|
+
export interface ConformanceReplica {
|
|
103
|
+
/** The retained database's connection string on the replica. */
|
|
104
|
+
readonly database: Redacted.Redacted<string>;
|
|
105
|
+
/** A superuser connection to the replica, e.g. to pause and resume WAL replay. */
|
|
106
|
+
readonly connect: Effect.Effect<ConformanceConnection, never, Scope.Scope>;
|
|
107
|
+
}
|
|
108
|
+
export interface ConformanceBackend {
|
|
109
|
+
/** True when the backend can open concurrent SQL connections (real Postgres). */
|
|
110
|
+
readonly independentConnections: boolean;
|
|
111
|
+
/** True when `open` returns a streaming replica of the primary. */
|
|
112
|
+
readonly hasReplica?: boolean;
|
|
113
|
+
/**
|
|
114
|
+
* True when the database is a Neki router. Turn sessions then run in
|
|
115
|
+
* single transaction mode and single fanout, and the cases flagged
|
|
116
|
+
* `requiresNeki` run; every other backend reports them through
|
|
117
|
+
* `registrar.skip`.
|
|
118
|
+
*/
|
|
119
|
+
readonly neki?: boolean;
|
|
120
|
+
/** True when the server runs `wal_level=logical`, which fleet views need. */
|
|
121
|
+
readonly logicalDecoding?: boolean;
|
|
122
|
+
/**
|
|
123
|
+
* True when `open` can create further databases and snapshots; cases that
|
|
124
|
+
* declare `requiresFreshDatabase` are reported through `registrar.skip`
|
|
125
|
+
* otherwise.
|
|
126
|
+
*/
|
|
127
|
+
readonly freshDatabases: boolean;
|
|
128
|
+
/** Extra services merged into every test runtime, e.g. BunCrypto.layer. */
|
|
129
|
+
readonly services: Layer.Layer<Crypto.Crypto, never, never>;
|
|
130
|
+
/**
|
|
131
|
+
* A listening HTTP server on an ephemeral loopback port that supports
|
|
132
|
+
* WebSocket upgrades, e.g. `BunHttpServer.layerServer({ port: 0 })`; the
|
|
133
|
+
* served-transport cases build one per case.
|
|
134
|
+
*/
|
|
135
|
+
readonly httpServer: Layer.Layer<HttpServer.HttpServer>;
|
|
136
|
+
/**
|
|
137
|
+
* A hosted edge to run the edge half of the assertion cases against; a
|
|
138
|
+
* backend without one reports those cases through `registrar.skip`.
|
|
139
|
+
*/
|
|
140
|
+
readonly edge?: ConformanceEdge;
|
|
141
|
+
readonly open: () => Promise<{
|
|
142
|
+
readonly database: ConformanceDatabase;
|
|
143
|
+
readonly freshDatabase: Effect.Effect<ConformanceDatabase>;
|
|
144
|
+
/** Copies a database that no runtime has open into a new one. */
|
|
145
|
+
readonly copy: (database: ConformanceDatabase) => Effect.Effect<ConformanceDatabase>;
|
|
146
|
+
readonly connect?: Effect.Effect<ConformanceConnection, never, Scope.Scope>;
|
|
147
|
+
readonly replica?: ConformanceReplica | undefined;
|
|
148
|
+
readonly close: Effect.Effect<void>;
|
|
149
|
+
}>;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* The test authorization every conformance runtime applies. The harness
|
|
153
|
+
* resets it before each case, so a case that times out holding it closed
|
|
154
|
+
* does not deny the next one.
|
|
155
|
+
*/
|
|
156
|
+
export interface ConformanceAccess {
|
|
157
|
+
allowed: boolean;
|
|
158
|
+
/** Commands the test authorization refuses while `allowed` holds. */
|
|
159
|
+
readonly denied: Set<string>;
|
|
160
|
+
/** Principals that lost access: refused as callers and as `onBehalfOf`, as an application would. */
|
|
161
|
+
readonly revoked: Set<string>;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* The actors and mutable fixture a group of cases owns. A registration builds
|
|
165
|
+
* each selected suite, and every suite it `uses`, once: its fixture when the
|
|
166
|
+
* registration starts and its layer into every runtime the registration
|
|
167
|
+
* builds. Suites without a fixture receive `undefined`.
|
|
168
|
+
*/
|
|
169
|
+
export interface ConformanceSuite<F = undefined> {
|
|
170
|
+
readonly fixture?: () => F;
|
|
171
|
+
/** Declared as a method so its parameter stays bivariant and any suite fits `ConformanceSuite<unknown>`. */
|
|
172
|
+
layer?(fixture: F): Layer.Layer<never, never, ConformanceSuiteServices>;
|
|
173
|
+
/** Other suites whose actors this suite's cases call. */
|
|
174
|
+
readonly uses?: ReadonlyArray<ConformanceSuite<unknown>>;
|
|
175
|
+
/** Runs at every turn fault point, as the process-level `TurnHooks`. */
|
|
176
|
+
turn?(fixture: F): (point: TurnPoint, request: Request) => Effect.Effect<void>;
|
|
177
|
+
/** Runs at every content-store fault point, as `ContentHooks`. */
|
|
178
|
+
content?(fixture: F): (point: ContentPoint) => Effect.Effect<void>;
|
|
179
|
+
/** Receives every log line the runtimes write; conformance runtimes print none. */
|
|
180
|
+
logger?(fixture: F): Logger.Logger<unknown, void>;
|
|
181
|
+
}
|
|
182
|
+
/** Services a suite's layer may require: what `ActorTest.layer` and the backend provide. */
|
|
183
|
+
export type ConformanceSuiteServices = Layer.Success<ReturnType<typeof ActorTest.layer>> | Crypto.Crypto;
|
|
184
|
+
export interface ConformanceContext<F = undefined> {
|
|
185
|
+
readonly expect: ConformanceExpect;
|
|
186
|
+
readonly environment: ConformanceEnvironment;
|
|
187
|
+
/** The fixture of the suite that owns the case. */
|
|
188
|
+
readonly fixture: F;
|
|
189
|
+
readonly access: ConformanceAccess;
|
|
190
|
+
/** The fixture of a suite the case's own suite `uses`. */
|
|
191
|
+
readonly fixtureOf: <G>(suite: ConformanceSuite<G>) => G;
|
|
192
|
+
}
|
|
193
|
+
export interface ConformanceCase<F = undefined> {
|
|
194
|
+
readonly name: string;
|
|
195
|
+
/**
|
|
196
|
+
* Requires `backend.independentConnections`; backends without it register
|
|
197
|
+
* the case through `registrar.skip` instead of running it.
|
|
198
|
+
*/
|
|
199
|
+
readonly requiresIndependentConnections?: boolean;
|
|
200
|
+
/** Requires a streaming replica; backends without one skip the case. */
|
|
201
|
+
readonly requiresReplica?: boolean;
|
|
202
|
+
/** Requires `backend.edge`; backends without one register the case through `registrar.skip`. */
|
|
203
|
+
readonly requiresEdge?: boolean;
|
|
204
|
+
/** Requires `backend.neki`; every other backend registers the case through `registrar.skip`. */
|
|
205
|
+
readonly requiresNeki?: boolean;
|
|
206
|
+
/** Requires a server with `wal_level=logical`; backends without one skip the case. */
|
|
207
|
+
readonly requiresLogicalDecoding?: boolean;
|
|
208
|
+
/**
|
|
209
|
+
* Opens `environment.freshDatabase` or `environment.snapshot`. Only a case
|
|
210
|
+
* that declares it may, and backends without `freshDatabases` skip it.
|
|
211
|
+
*/
|
|
212
|
+
readonly requiresFreshDatabase?: boolean;
|
|
213
|
+
/** Declared as a method so its parameter stays bivariant and any case fits `ConformanceCase<unknown>`. */
|
|
214
|
+
run(context: ConformanceContext<F>): Promise<void>;
|
|
215
|
+
readonly timeoutMs?: number;
|
|
216
|
+
}
|
|
217
|
+
/** A named group's cases and the suite that owns their actors and fixture. */
|
|
218
|
+
export interface ConformanceGroupCases<F = unknown> {
|
|
219
|
+
readonly suite: ConformanceSuite<F>;
|
|
220
|
+
readonly cases: ReadonlyArray<ConformanceCase<F>>;
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Every conformance case, grouped by the file that owns it, with the suite
|
|
224
|
+
* that owns its actors. `describeConformance` runs a subset through `groups`,
|
|
225
|
+
* so a group can run in its own Vitest file and worker; `conformance` is
|
|
226
|
+
* their union and the order within a group is kept.
|
|
227
|
+
*/
|
|
228
|
+
export declare const conformanceGroups: {
|
|
229
|
+
foundation: ConformanceGroupCases<unknown>;
|
|
230
|
+
access: ConformanceGroupCases<unknown>;
|
|
231
|
+
admission: ConformanceGroupCases<unknown>;
|
|
232
|
+
http: ConformanceGroupCases<unknown>;
|
|
233
|
+
protocols: ConformanceGroupCases<unknown>;
|
|
234
|
+
assertions: ConformanceGroupCases<unknown>;
|
|
235
|
+
edge: ConformanceGroupCases<unknown>;
|
|
236
|
+
coldServeEdge: ConformanceGroupCases<unknown>;
|
|
237
|
+
client: ConformanceGroupCases<unknown>;
|
|
238
|
+
offline: ConformanceGroupCases<unknown>;
|
|
239
|
+
capacity: ConformanceGroupCases<unknown>;
|
|
240
|
+
heap: ConformanceGroupCases<unknown>;
|
|
241
|
+
events: ConformanceGroupCases<unknown>;
|
|
242
|
+
reducer: ConformanceGroupCases<unknown>;
|
|
243
|
+
outbox: ConformanceGroupCases<unknown>;
|
|
244
|
+
tables: ConformanceGroupCases<unknown>;
|
|
245
|
+
effects: ConformanceGroupCases<unknown>;
|
|
246
|
+
progress: ConformanceGroupCases<unknown>;
|
|
247
|
+
multiRunner: ConformanceGroupCases<unknown>;
|
|
248
|
+
simulation: ConformanceGroupCases<unknown>;
|
|
249
|
+
drain: ConformanceGroupCases<unknown>;
|
|
250
|
+
pipeline: ConformanceGroupCases<unknown>;
|
|
251
|
+
batches: ConformanceGroupCases<unknown>;
|
|
252
|
+
groups: ConformanceGroupCases<unknown>;
|
|
253
|
+
relay: ConformanceGroupCases<unknown>;
|
|
254
|
+
relayCluster: ConformanceGroupCases<unknown>;
|
|
255
|
+
effectControl: ConformanceGroupCases<unknown>;
|
|
256
|
+
effectControlCluster: ConformanceGroupCases<unknown>;
|
|
257
|
+
singleton: ConformanceGroupCases<unknown>;
|
|
258
|
+
cron: ConformanceGroupCases<unknown>;
|
|
259
|
+
cronCluster: ConformanceGroupCases<unknown>;
|
|
260
|
+
blobs: ConformanceGroupCases<unknown>;
|
|
261
|
+
inspectionViews: ConformanceGroupCases<unknown>;
|
|
262
|
+
inspector: ConformanceGroupCases<unknown>;
|
|
263
|
+
rls: ConformanceGroupCases<unknown>;
|
|
264
|
+
retention: ConformanceGroupCases<unknown>;
|
|
265
|
+
restore: ConformanceGroupCases<unknown>;
|
|
266
|
+
workflows: ConformanceGroupCases<unknown>;
|
|
267
|
+
connections: ConformanceGroupCases<unknown>;
|
|
268
|
+
streams: ConformanceGroupCases<unknown>;
|
|
269
|
+
progressDelivery: ConformanceGroupCases<unknown>;
|
|
270
|
+
transports: ConformanceGroupCases<unknown>;
|
|
271
|
+
workflowVersions: ConformanceGroupCases<unknown>;
|
|
272
|
+
payloadMigrations: ConformanceGroupCases<unknown>;
|
|
273
|
+
subscriptions: ConformanceGroupCases<unknown>;
|
|
274
|
+
subscriptionsRetention: ConformanceGroupCases<unknown>;
|
|
275
|
+
subscriptionsCluster: ConformanceGroupCases<unknown>;
|
|
276
|
+
content: ConformanceGroupCases<unknown>;
|
|
277
|
+
counter: ConformanceGroupCases<unknown>;
|
|
278
|
+
properties: ConformanceGroupCases<unknown>;
|
|
279
|
+
mint: ConformanceGroupCases<unknown>;
|
|
280
|
+
readYourWrites: ConformanceGroupCases<unknown>;
|
|
281
|
+
observability: ConformanceGroupCases<unknown>;
|
|
282
|
+
operator: ConformanceGroupCases<unknown>;
|
|
283
|
+
export: ConformanceGroupCases<unknown>;
|
|
284
|
+
coldServe: ConformanceGroupCases<unknown>;
|
|
285
|
+
placement: ConformanceGroupCases<unknown>;
|
|
286
|
+
watch: ConformanceGroupCases<unknown>;
|
|
287
|
+
adoption: ConformanceGroupCases<unknown>;
|
|
288
|
+
singleShard: ConformanceGroupCases<unknown>;
|
|
289
|
+
crossShardOutbox: ConformanceGroupCases<unknown>;
|
|
290
|
+
fleet: ConformanceGroupCases<unknown>;
|
|
291
|
+
};
|
|
292
|
+
export type ConformanceGroup = keyof typeof conformanceGroups;
|
|
293
|
+
/**
|
|
294
|
+
* The shared durable-turn conformance cases. Cases flagged
|
|
295
|
+
* `requiresIndependentConnections` need real Postgres: a second database
|
|
296
|
+
* connection to read committed state while a turn holds its transaction open
|
|
297
|
+
* or to take a competing row lock, or a database outside the JavaScript heap
|
|
298
|
+
* they measure. They never run on single-connection backends such as PGlite.
|
|
299
|
+
*/
|
|
300
|
+
export declare const conformance: ReadonlyArray<ConformanceCase<unknown>>;
|
|
301
|
+
/** A backend capability a case can require, as `ConformanceCase` flags name it. */
|
|
302
|
+
export type ConformanceRequirement = "independentConnections" | "replica" | "edge" | "neki" | "logicalDecoding" | "freshDatabase";
|
|
303
|
+
/** The capabilities `conformanceCase` requires, in a fixed order. */
|
|
304
|
+
export declare const requirementsOf: (conformanceCase: ConformanceCase<unknown>) => ReadonlyArray<ConformanceRequirement>;
|
|
305
|
+
/** The capabilities `backend` provides. */
|
|
306
|
+
export declare const capabilitiesOf: (backend: Pick<ConformanceBackend, "independentConnections" | "hasReplica" | "edge" | "neki" | "logicalDecoding" | "freshDatabases">) => ReadonlySet<ConformanceRequirement>;
|
|
307
|
+
/**
|
|
308
|
+
* Registers the named groups' cases, or every group's, against `backend`.
|
|
309
|
+
* Only the selected groups' suites, and the suites they use, build their
|
|
310
|
+
* actors and fixtures. The same case names run on every backend; a case
|
|
311
|
+
* whose requirements the backend lacks is reported through `registrar.skip`.
|
|
312
|
+
*
|
|
313
|
+
* Each case runs under the registrar's abort signal: a timed-out or
|
|
314
|
+
* cancelled case is interrupted, its finalizers run, and the next case waits
|
|
315
|
+
* for them, then restarts a runtime the case left stopped and starts with
|
|
316
|
+
* open test authorization.
|
|
317
|
+
*/
|
|
318
|
+
export declare const describeConformance: (options: {
|
|
319
|
+
readonly name: string;
|
|
320
|
+
readonly backend: ConformanceBackend;
|
|
321
|
+
readonly registrar: ConformanceRegistrar;
|
|
322
|
+
readonly groups?: ReadonlyArray<ConformanceGroup>;
|
|
323
|
+
}) => void;
|
|
324
|
+
/** Registers `selected` groups; `describeConformance` passes registry groups, tests pass their own. */
|
|
325
|
+
export declare const registerConformance: (options: {
|
|
326
|
+
readonly name: string;
|
|
327
|
+
readonly backend: ConformanceBackend;
|
|
328
|
+
readonly registrar: ConformanceRegistrar;
|
|
329
|
+
readonly selected: ReadonlyArray<ConformanceGroupCases>;
|
|
330
|
+
}) => void;
|