@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,165 @@
|
|
|
1
|
+
import type { PgConnection } from "@effect/sql-pg";
|
|
2
|
+
import { Cause, Context, Duration, Effect, Exit, Fiber, Data, Layer, Scope } from "effect";
|
|
3
|
+
import type { SqlError } from "effect/sql";
|
|
4
|
+
import { type Send, TurnConnections } from "./pipeline.ts";
|
|
5
|
+
type Statement = Effect.Effect<void, SqlError.SqlError>;
|
|
6
|
+
type Replies = ReadonlyArray<Fiber.Fiber<void, SqlError.SqlError>>;
|
|
7
|
+
/**
|
|
8
|
+
* How a member's turn ended in its group: committed with the group, at the
|
|
9
|
+
* version and clock read after the group's transaction ended, or to be run
|
|
10
|
+
* again in a transaction of its own because the group ended without it.
|
|
11
|
+
*/
|
|
12
|
+
export type Shared = Data.TaggedEnum<{
|
|
13
|
+
Committed: {
|
|
14
|
+
readonly version: string;
|
|
15
|
+
readonly endedAtMs: number;
|
|
16
|
+
/** The replies of the chained admission when the member took the group's session. */
|
|
17
|
+
readonly chained: Replies | undefined;
|
|
18
|
+
};
|
|
19
|
+
Alone: {};
|
|
20
|
+
}>;
|
|
21
|
+
export declare const Shared: {
|
|
22
|
+
readonly $is: <Tag extends "Alone" | "Committed">(tag: Tag) => (u: unknown) => u is Extract<{
|
|
23
|
+
readonly _tag: "Alone";
|
|
24
|
+
}, {
|
|
25
|
+
readonly _tag: Tag;
|
|
26
|
+
}> | Extract<{
|
|
27
|
+
readonly _tag: "Committed";
|
|
28
|
+
readonly version: string;
|
|
29
|
+
readonly endedAtMs: number;
|
|
30
|
+
readonly chained: Replies | undefined;
|
|
31
|
+
}, {
|
|
32
|
+
readonly _tag: Tag;
|
|
33
|
+
}>;
|
|
34
|
+
readonly $match: {
|
|
35
|
+
<Cases extends { readonly [Tag in "Alone" | "Committed"]: (args: Extract<{
|
|
36
|
+
readonly _tag: "Alone";
|
|
37
|
+
} | {
|
|
38
|
+
readonly _tag: "Committed";
|
|
39
|
+
readonly version: string;
|
|
40
|
+
readonly endedAtMs: number;
|
|
41
|
+
readonly chained: Replies | undefined;
|
|
42
|
+
}, {
|
|
43
|
+
readonly _tag: Tag;
|
|
44
|
+
}>) => any; }>(cases: Cases): (value: {
|
|
45
|
+
readonly _tag: "Alone";
|
|
46
|
+
} | {
|
|
47
|
+
readonly _tag: "Committed";
|
|
48
|
+
readonly version: string;
|
|
49
|
+
readonly endedAtMs: number;
|
|
50
|
+
readonly chained: Replies | undefined;
|
|
51
|
+
}) => import("effect/Unify").Unify<ReturnType<Cases["Alone" | "Committed"]>>;
|
|
52
|
+
<Cases extends { readonly [Tag in "Alone" | "Committed"]: (args: Extract<{
|
|
53
|
+
readonly _tag: "Alone";
|
|
54
|
+
} | {
|
|
55
|
+
readonly _tag: "Committed";
|
|
56
|
+
readonly version: string;
|
|
57
|
+
readonly endedAtMs: number;
|
|
58
|
+
readonly chained: Replies | undefined;
|
|
59
|
+
}, {
|
|
60
|
+
readonly _tag: Tag;
|
|
61
|
+
}>) => any; }>(value: {
|
|
62
|
+
readonly _tag: "Alone";
|
|
63
|
+
} | {
|
|
64
|
+
readonly _tag: "Committed";
|
|
65
|
+
readonly version: string;
|
|
66
|
+
readonly endedAtMs: number;
|
|
67
|
+
readonly chained: Replies | undefined;
|
|
68
|
+
}, cases: Cases): import("effect/Unify").Unify<ReturnType<Cases["Alone" | "Committed"]>>;
|
|
69
|
+
};
|
|
70
|
+
readonly Alone: Data.TaggedEnum.ConstructorFrom<{
|
|
71
|
+
readonly _tag: "Alone";
|
|
72
|
+
}, "_tag">;
|
|
73
|
+
readonly Committed: Data.TaggedEnum.ConstructorFrom<{
|
|
74
|
+
readonly _tag: "Committed";
|
|
75
|
+
readonly version: string;
|
|
76
|
+
readonly endedAtMs: number;
|
|
77
|
+
readonly chained: Replies | undefined;
|
|
78
|
+
}, "_tag">;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* A member whose actor already has its next batch waiting asks to take the
|
|
82
|
+
* group's session after the commit, with that batch's `BEGIN` and admission
|
|
83
|
+
* sent right behind the group's `COMMIT`. `adopt` receives the session and
|
|
84
|
+
* the scope that returns it to the pool, and answers false when the member
|
|
85
|
+
* can no longer take it, so the group discards the session instead.
|
|
86
|
+
*/
|
|
87
|
+
export interface Handoff {
|
|
88
|
+
readonly chain: (connection: PgConnection.PgConnection) => ReadonlyArray<Statement>;
|
|
89
|
+
readonly adopt: (connection: PgConnection.PgConnection, scope: Scope.Closeable) => Effect.Effect<boolean>;
|
|
90
|
+
}
|
|
91
|
+
declare const Unseated_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => Cause.YieldableError & {
|
|
92
|
+
readonly _tag: "Unseated";
|
|
93
|
+
} & Readonly<A>;
|
|
94
|
+
/**
|
|
95
|
+
* Raised by a member's connection when the member sends a statement outside
|
|
96
|
+
* its admission and its writes. The member leaves its group and runs again
|
|
97
|
+
* alone, so nothing it sends while its handlers run can commit with others.
|
|
98
|
+
*/
|
|
99
|
+
export declare class Unseated extends Unseated_base<{}> {
|
|
100
|
+
}
|
|
101
|
+
/** Postgres refused the statement only because an earlier one aborted the transaction. */
|
|
102
|
+
export declare const abortedBefore: (error: SqlError.SqlError) => boolean;
|
|
103
|
+
export declare const errorOf: (exit: Exit.Exit<unknown, SqlError.SqlError>) => SqlError.SqlError | undefined;
|
|
104
|
+
/** Members a group holds at most, which also bounds its commit flight. */
|
|
105
|
+
export declare const GROUP_MEMBERS = 32;
|
|
106
|
+
/**
|
|
107
|
+
* How long a closed group waits for members still running before it commits
|
|
108
|
+
* without them. Tests change it to place an eviction or an interruption.
|
|
109
|
+
*/
|
|
110
|
+
export declare const TurnGroupSettings: Context.Reference<{
|
|
111
|
+
readonly wait: Duration.Duration;
|
|
112
|
+
}>;
|
|
113
|
+
/** One member's view of its group. */
|
|
114
|
+
export interface Member {
|
|
115
|
+
/** The group's session, once the member's admission is queued. */
|
|
116
|
+
readonly connection: () => PgConnection.PgConnection;
|
|
117
|
+
/** The replies of the member's admission statements, in order. */
|
|
118
|
+
readonly replies: () => Replies;
|
|
119
|
+
/** From here the member's handlers run and its connection refuses statements; false once evicted. */
|
|
120
|
+
readonly handling: Effect.Effect<boolean>;
|
|
121
|
+
/** Passes a statement only while the member admits or the group sends its writes. */
|
|
122
|
+
readonly send: Send;
|
|
123
|
+
/**
|
|
124
|
+
* Hands the member's commit writes to the group and waits for the shared
|
|
125
|
+
* commit. Interrupted before the group sends them, the writes are withdrawn.
|
|
126
|
+
*/
|
|
127
|
+
readonly commit: (writes: ReadonlyArray<Statement>, handoff?: Handoff) => Effect.Effect<Shared, SqlError.SqlError>;
|
|
128
|
+
/** Leaves without writes; `aborted` says one of the member's statements failed. */
|
|
129
|
+
readonly leave: (aborted: boolean) => Effect.Effect<void>;
|
|
130
|
+
}
|
|
131
|
+
declare const TurnGroups_base: Context.ServiceClass<TurnGroups, "@rikalabs/akter/runtime/turn/group/TurnGroups", {
|
|
132
|
+
readonly join: (options: {
|
|
133
|
+
readonly key: string;
|
|
134
|
+
readonly settings: (connection: PgConnection.PgConnection) => Statement;
|
|
135
|
+
/** Cancels the statement the session's backend is running. */
|
|
136
|
+
readonly cancel: (connection: PgConnection.PgConnection) => Effect.Effect<void>;
|
|
137
|
+
readonly admission: (member: Member) => ReadonlyArray<Statement>;
|
|
138
|
+
}) => Effect.Effect<Member, SqlError.SqlError>;
|
|
139
|
+
}>;
|
|
140
|
+
/**
|
|
141
|
+
* Concurrent warm turns of different actors sharing one transaction, one
|
|
142
|
+
* `COMMIT` and one WAL flush. Each group leases one turn session and admits
|
|
143
|
+
* members that would set the same transaction settings, until its first
|
|
144
|
+
* member hands over its writes, every member has left, or it is full. Every member sends
|
|
145
|
+
* its own admission on the group's session and waits for its own replies;
|
|
146
|
+
* the first ones ride with `BEGIN` and the settings. Once every member has
|
|
147
|
+
* handed over or left, or the wait after closing runs out and the members
|
|
148
|
+
* still running are sent to run alone, one flight carries every member's
|
|
149
|
+
* writes, `COMMIT` and the version and clock read.
|
|
150
|
+
*
|
|
151
|
+
* A warm admission writes nothing, so a member that leaves takes nothing with
|
|
152
|
+
* it and its neighbours commit unaffected. A statement error aborts the whole
|
|
153
|
+
* transaction: the member whose own statement failed gets its error, and every
|
|
154
|
+
* other member runs again alone. A lost reply after the writes were sent is a
|
|
155
|
+
* commit-unknown outcome for every member that handed over writes, and each
|
|
156
|
+
* resolves through its receipt. A member's interruption cancels the group's
|
|
157
|
+
* backend only once every member waiting on the sent commit was interrupted,
|
|
158
|
+
* as a lone turn's would; the group's own interruption discards the session. The
|
|
159
|
+
* session returns to the pool once nothing is in flight, before any member
|
|
160
|
+
* publishes.
|
|
161
|
+
*/
|
|
162
|
+
export declare class TurnGroups extends TurnGroups_base {
|
|
163
|
+
}
|
|
164
|
+
export declare const turnGroups: Layer.Layer<TurnGroups, never, TurnConnections>;
|
|
165
|
+
export {};
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
import { Cause, Clock, Context, Deferred, Duration, Effect, Exit, Fiber, Data, Layer, Option, Predicate, Scope, } from "effect";
|
|
2
|
+
import { COMMIT_VERSION } from "../database/replica.js";
|
|
3
|
+
import { Metrics, record } from "../telemetry/metrics.js";
|
|
4
|
+
import { queueStatements, TurnConnections } from "./pipeline.js";
|
|
5
|
+
export const Shared = Data.taggedEnum();
|
|
6
|
+
const alone = Shared.Alone();
|
|
7
|
+
/**
|
|
8
|
+
* Raised by a member's connection when the member sends a statement outside
|
|
9
|
+
* its admission and its writes. The member leaves its group and runs again
|
|
10
|
+
* alone, so nothing it sends while its handlers run can commit with others.
|
|
11
|
+
*/
|
|
12
|
+
export class Unseated extends Data.TaggedError("Unseated") {
|
|
13
|
+
}
|
|
14
|
+
/** Postgres refused the statement only because an earlier one aborted the transaction. */
|
|
15
|
+
export const abortedBefore = (error) => error.reason.cause?.code === "25P02";
|
|
16
|
+
export const errorOf = (exit) => Exit.isSuccess(exit) ? undefined : Option.getOrUndefined(Cause.findErrorOption(exit.cause));
|
|
17
|
+
/** Members a group holds at most, which also bounds its commit flight. */
|
|
18
|
+
export const GROUP_MEMBERS = 32;
|
|
19
|
+
/**
|
|
20
|
+
* How long a closed group waits for members still running before it commits
|
|
21
|
+
* without them. Tests change it to place an eviction or an interruption.
|
|
22
|
+
*/
|
|
23
|
+
export const TurnGroupSettings = Context.Reference("akter/TurnGroupSettings", { defaultValue: () => ({ wait: Duration.millis(100) }) });
|
|
24
|
+
/**
|
|
25
|
+
* Concurrent warm turns of different actors sharing one transaction, one
|
|
26
|
+
* `COMMIT` and one WAL flush. Each group leases one turn session and admits
|
|
27
|
+
* members that would set the same transaction settings, until its first
|
|
28
|
+
* member hands over its writes, every member has left, or it is full. Every member sends
|
|
29
|
+
* its own admission on the group's session and waits for its own replies;
|
|
30
|
+
* the first ones ride with `BEGIN` and the settings. Once every member has
|
|
31
|
+
* handed over or left, or the wait after closing runs out and the members
|
|
32
|
+
* still running are sent to run alone, one flight carries every member's
|
|
33
|
+
* writes, `COMMIT` and the version and clock read.
|
|
34
|
+
*
|
|
35
|
+
* A warm admission writes nothing, so a member that leaves takes nothing with
|
|
36
|
+
* it and its neighbours commit unaffected. A statement error aborts the whole
|
|
37
|
+
* transaction: the member whose own statement failed gets its error, and every
|
|
38
|
+
* other member runs again alone. A lost reply after the writes were sent is a
|
|
39
|
+
* commit-unknown outcome for every member that handed over writes, and each
|
|
40
|
+
* resolves through its receipt. A member's interruption cancels the group's
|
|
41
|
+
* backend only once every member waiting on the sent commit was interrupted,
|
|
42
|
+
* as a lone turn's would; the group's own interruption discards the session. The
|
|
43
|
+
* session returns to the pool once nothing is in flight, before any member
|
|
44
|
+
* publishes.
|
|
45
|
+
*/
|
|
46
|
+
export class TurnGroups extends Context.Service()("@rikalabs/akter/runtime/turn/group/TurnGroups") {
|
|
47
|
+
}
|
|
48
|
+
export const turnGroups = Layer.effect(TurnGroups, Effect.gen(function* () {
|
|
49
|
+
const turns = yield* TurnConnections;
|
|
50
|
+
const { wait } = yield* TurnGroupSettings;
|
|
51
|
+
const layer = yield* Effect.scope;
|
|
52
|
+
const waitMs = Duration.toMillis(wait);
|
|
53
|
+
const forming = new Map();
|
|
54
|
+
const wake = (group) => {
|
|
55
|
+
Deferred.doneUnsafe(group.signal, Effect.void);
|
|
56
|
+
};
|
|
57
|
+
const close = (group) => Effect.map(Clock.currentTimeMillis, (now) => {
|
|
58
|
+
if (!group.open)
|
|
59
|
+
return;
|
|
60
|
+
group.open = false;
|
|
61
|
+
group.closedAtMs = now;
|
|
62
|
+
if (forming.get(group.key) === group)
|
|
63
|
+
forming.delete(group.key);
|
|
64
|
+
});
|
|
65
|
+
const leave = (group, seat, aborted) => Effect.suspend(() => {
|
|
66
|
+
if (seat.phase === "left" || seat.phase === "committing" || seat.phase === "ended")
|
|
67
|
+
return Effect.void;
|
|
68
|
+
seat.phase = "left";
|
|
69
|
+
seat.writes = [];
|
|
70
|
+
if (aborted)
|
|
71
|
+
group.aborted = true;
|
|
72
|
+
return Effect.andThen(group.seats.every(({ phase }) => phase === "left") ? close(group) : Effect.void, Effect.sync(() => wake(group)));
|
|
73
|
+
});
|
|
74
|
+
const queue = (group, seat) => Effect.suspend(() => {
|
|
75
|
+
if (seat.sent || seat.phase !== "admitting")
|
|
76
|
+
return Effect.void;
|
|
77
|
+
seat.sent = true;
|
|
78
|
+
return Effect.flatMap(queueStatements({ scope: group.scope, group: seat.admission }), (replies) => Deferred.succeed(seat.queued, replies));
|
|
79
|
+
});
|
|
80
|
+
/** Waits for the group's next change, at most `ms` when given; true when it changed. */
|
|
81
|
+
const changed = (group, ms) => Effect.suspend(() => {
|
|
82
|
+
const signal = group.signal;
|
|
83
|
+
const waiting = Deferred.await(signal);
|
|
84
|
+
return Effect.map(ms === undefined ? waiting : Effect.timeoutOption(waiting, Duration.millis(ms)), () => {
|
|
85
|
+
const fired = Deferred.isDoneUnsafe(signal);
|
|
86
|
+
if (fired)
|
|
87
|
+
group.signal = Deferred.makeUnsafe();
|
|
88
|
+
return fired;
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
const settled = (group) => group.seats.every(({ phase }) => phase === "deposited" || phase === "left");
|
|
92
|
+
/**
|
|
93
|
+
* Ends the group's transaction, then returns or hands over the session,
|
|
94
|
+
* and only then answers every member that handed over writes, so no
|
|
95
|
+
* member publishes while the session is still out. A member whose turn
|
|
96
|
+
* ended moves to a terminal phase, so its connection refuses any later
|
|
97
|
+
* statement. The hand-off goes only to a member still waiting; an
|
|
98
|
+
* interrupted one's session is discarded with its chained transaction.
|
|
99
|
+
*/
|
|
100
|
+
const commit = Effect.fnUntraced(function* (group) {
|
|
101
|
+
group.sent = true;
|
|
102
|
+
const members = group.seats.filter(({ phase }) => phase === "deposited");
|
|
103
|
+
for (const seat of members)
|
|
104
|
+
seat.phase = "committing";
|
|
105
|
+
const writes = group.aborted ? [] : members.flatMap(({ writes }) => writes);
|
|
106
|
+
const ending = writes.length > 0 ? "COMMIT" : "ROLLBACK";
|
|
107
|
+
const connection = group.connection;
|
|
108
|
+
const held = group.scope;
|
|
109
|
+
const handoff = group.aborted ? undefined : members.find((seat) => seat.handoff !== undefined);
|
|
110
|
+
let tag;
|
|
111
|
+
let version = "";
|
|
112
|
+
let endedAtMs = 0;
|
|
113
|
+
const replies = yield* queueStatements({
|
|
114
|
+
scope: held,
|
|
115
|
+
group: [
|
|
116
|
+
...writes,
|
|
117
|
+
Effect.map(connection.query(ending, [], true), (result) => {
|
|
118
|
+
tag = result.command;
|
|
119
|
+
}),
|
|
120
|
+
Effect.map(connection.query(COMMIT_VERSION, [], true), (result) => {
|
|
121
|
+
const ended = result.rows[0];
|
|
122
|
+
version = ended.version;
|
|
123
|
+
endedAtMs = Number(ended.now);
|
|
124
|
+
}),
|
|
125
|
+
...(handoff === undefined ? [] : handoff.handoff.chain(connection)),
|
|
126
|
+
],
|
|
127
|
+
});
|
|
128
|
+
const chained = replies.slice(writes.length + 2);
|
|
129
|
+
const exits = yield* Effect.forEach(replies.slice(0, writes.length + 2), Fiber.await);
|
|
130
|
+
group.done = true;
|
|
131
|
+
const errors = exits.map(errorOf);
|
|
132
|
+
const lost = errors.find((error) => error !== undefined && Predicate.isTagged(error.reason, "ConnectionError"));
|
|
133
|
+
const ended = exits[writes.length];
|
|
134
|
+
const read = errors[writes.length + 1];
|
|
135
|
+
const committed = Exit.isSuccess(ended) && tag === "COMMIT";
|
|
136
|
+
const outcomes = [];
|
|
137
|
+
let offset = 0;
|
|
138
|
+
for (const seat of members) {
|
|
139
|
+
const own = group.aborted ? [] : errors.slice(offset, offset + seat.writes.length);
|
|
140
|
+
offset += own.length;
|
|
141
|
+
if (lost !== undefined) {
|
|
142
|
+
outcomes.push([seat, Exit.fail(lost)]);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
if (seat.writes.length === 0 ? !Exit.isSuccess(ended) : !committed) {
|
|
146
|
+
const error = own.find((failure) => failure !== undefined && !abortedBefore(failure));
|
|
147
|
+
outcomes.push([seat, error === undefined ? Exit.succeed(alone) : Exit.fail(error)]);
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
const unknown = own.find((failure) => failure !== undefined) ?? read;
|
|
151
|
+
outcomes.push([
|
|
152
|
+
seat,
|
|
153
|
+
unknown === undefined
|
|
154
|
+
? Exit.succeed(Shared.Committed({ version, endedAtMs, chained: undefined }))
|
|
155
|
+
: Exit.fail(unknown),
|
|
156
|
+
]);
|
|
157
|
+
}
|
|
158
|
+
const taking = outcomes.some(([seat, outcome]) => seat === handoff &&
|
|
159
|
+
!seat.interrupted &&
|
|
160
|
+
!group.cancelled &&
|
|
161
|
+
lost === undefined &&
|
|
162
|
+
Exit.isSuccess(outcome) &&
|
|
163
|
+
Shared.$is("Committed")(outcome.value));
|
|
164
|
+
const handed = taking && (yield* handoff.handoff.adopt(connection, held));
|
|
165
|
+
if (lost !== undefined || group.cancelled || (handoff !== undefined && !handed))
|
|
166
|
+
yield* turns.invalidate(connection);
|
|
167
|
+
if (!handed)
|
|
168
|
+
yield* Scope.close(held, Exit.void);
|
|
169
|
+
for (const [seat, outcome] of outcomes) {
|
|
170
|
+
seat.phase = "ended";
|
|
171
|
+
yield* Deferred.done(seat.result, handed &&
|
|
172
|
+
seat === handoff &&
|
|
173
|
+
Exit.isSuccess(outcome) &&
|
|
174
|
+
Shared.$is("Committed")(outcome.value)
|
|
175
|
+
? Exit.succeed(Shared.Committed({ ...outcome.value, chained }))
|
|
176
|
+
: outcome);
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
/**
|
|
180
|
+
* One group from lease to commit. A lease that fails, a refusal included,
|
|
181
|
+
* fails every member before anything of theirs was sent. An interrupted
|
|
182
|
+
* group discards its session, so an unsent `COMMIT` rolls back with it.
|
|
183
|
+
*/
|
|
184
|
+
const drive = Effect.fnUntraced(function* (group) {
|
|
185
|
+
const held = yield* Scope.make();
|
|
186
|
+
const leasing = yield* Clock.currentTimeMillis;
|
|
187
|
+
const leased = yield* Scope.provide(turns.lease, held).pipe(Effect.exit);
|
|
188
|
+
if (Exit.isFailure(leased)) {
|
|
189
|
+
yield* close(group);
|
|
190
|
+
yield* Scope.close(held, leased);
|
|
191
|
+
const error = errorOf(leased);
|
|
192
|
+
for (const seat of group.seats) {
|
|
193
|
+
yield* Deferred.failCause(seat.queued, error === undefined ? Cause.die(Cause.squash(leased.cause)) : Cause.fail(error));
|
|
194
|
+
}
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
yield* record(Metrics.poolWait, {}, (yield* Clock.currentTimeMillis) - leasing);
|
|
198
|
+
group.connection = leased.value;
|
|
199
|
+
group.scope = held;
|
|
200
|
+
yield* Effect.gen(function* () {
|
|
201
|
+
while (!group.seats.some(({ phase }) => phase === "admitting") && group.open)
|
|
202
|
+
yield* changed(group);
|
|
203
|
+
if (!group.seats.some(({ phase }) => phase === "admitting")) {
|
|
204
|
+
yield* close(group);
|
|
205
|
+
return yield* Scope.close(held, Exit.void);
|
|
206
|
+
}
|
|
207
|
+
yield* Effect.uninterruptible(Effect.gen(function* () {
|
|
208
|
+
yield* queueStatements({
|
|
209
|
+
scope: held,
|
|
210
|
+
group: [
|
|
211
|
+
Effect.asVoid(leased.value.query("BEGIN", [], true)),
|
|
212
|
+
group.settings(leased.value),
|
|
213
|
+
],
|
|
214
|
+
});
|
|
215
|
+
group.begun = true;
|
|
216
|
+
for (const seat of group.seats)
|
|
217
|
+
yield* queue(group, seat);
|
|
218
|
+
}));
|
|
219
|
+
while (group.open || !settled(group)) {
|
|
220
|
+
if (group.open) {
|
|
221
|
+
yield* changed(group);
|
|
222
|
+
continue;
|
|
223
|
+
}
|
|
224
|
+
const left = waitMs - ((yield* Clock.currentTimeMillis) - group.closedAtMs);
|
|
225
|
+
if (left <= 0 || !(yield* changed(group, left))) {
|
|
226
|
+
for (const seat of group.seats)
|
|
227
|
+
if (seat.phase === "admitting" || seat.phase === "handling") {
|
|
228
|
+
seat.phase = "ended";
|
|
229
|
+
yield* Deferred.succeed(seat.result, alone);
|
|
230
|
+
}
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
yield* Effect.uninterruptible(commit(group));
|
|
235
|
+
}).pipe(Effect.onInterrupt(() => Effect.gen(function* () {
|
|
236
|
+
group.sent = true;
|
|
237
|
+
yield* close(group);
|
|
238
|
+
if (group.begun)
|
|
239
|
+
yield* turns.invalidate(leased.value);
|
|
240
|
+
yield* Scope.close(held, Exit.void);
|
|
241
|
+
for (const seat of group.seats) {
|
|
242
|
+
yield* Deferred.interrupt(seat.queued);
|
|
243
|
+
yield* Deferred.interrupt(seat.result);
|
|
244
|
+
}
|
|
245
|
+
})));
|
|
246
|
+
});
|
|
247
|
+
const join = (options) => Effect.uninterruptibleMask((restore) => Effect.suspend(() => {
|
|
248
|
+
const found = forming.get(options.key);
|
|
249
|
+
const group = found ?? {
|
|
250
|
+
key: options.key,
|
|
251
|
+
seats: [],
|
|
252
|
+
settings: options.settings,
|
|
253
|
+
cancel: options.cancel,
|
|
254
|
+
connection: undefined,
|
|
255
|
+
scope: undefined,
|
|
256
|
+
open: true,
|
|
257
|
+
begun: false,
|
|
258
|
+
sent: false,
|
|
259
|
+
done: false,
|
|
260
|
+
cancelled: false,
|
|
261
|
+
aborted: false,
|
|
262
|
+
closedAtMs: 0,
|
|
263
|
+
signal: Deferred.makeUnsafe(),
|
|
264
|
+
};
|
|
265
|
+
if (found === undefined)
|
|
266
|
+
forming.set(options.key, group);
|
|
267
|
+
const seat = {
|
|
268
|
+
phase: "admitting",
|
|
269
|
+
admission: [],
|
|
270
|
+
sent: false,
|
|
271
|
+
queued: Deferred.makeUnsafe(),
|
|
272
|
+
writes: [],
|
|
273
|
+
handoff: undefined,
|
|
274
|
+
interrupted: false,
|
|
275
|
+
result: Deferred.makeUnsafe(),
|
|
276
|
+
};
|
|
277
|
+
let replies = [];
|
|
278
|
+
const member = {
|
|
279
|
+
connection: () => group.connection,
|
|
280
|
+
replies: () => replies,
|
|
281
|
+
handling: Effect.sync(() => {
|
|
282
|
+
if (seat.phase !== "admitting")
|
|
283
|
+
return false;
|
|
284
|
+
seat.phase = "handling";
|
|
285
|
+
return true;
|
|
286
|
+
}),
|
|
287
|
+
send: (statement) => Effect.suspend(() => seat.phase === "admitting" || seat.phase === "committing"
|
|
288
|
+
? statement
|
|
289
|
+
: Effect.die(new Unseated())),
|
|
290
|
+
commit: (writes, handoff) => Effect.suspend(() => {
|
|
291
|
+
if (seat.phase !== "handling")
|
|
292
|
+
return Effect.succeed(alone);
|
|
293
|
+
seat.phase = "deposited";
|
|
294
|
+
seat.writes = writes;
|
|
295
|
+
seat.handoff = handoff;
|
|
296
|
+
return close(group).pipe(Effect.andThen(Effect.sync(() => {
|
|
297
|
+
wake(group);
|
|
298
|
+
})), Effect.andThen(restore(Deferred.await(seat.result))), Effect.onInterrupt(() => Effect.suspend(() => {
|
|
299
|
+
if (!group.sent)
|
|
300
|
+
return leave(group, seat, false);
|
|
301
|
+
seat.interrupted = true;
|
|
302
|
+
if (group.done ||
|
|
303
|
+
group.cancelled ||
|
|
304
|
+
group.seats.some((each) => each.phase === "committing" && !each.interrupted))
|
|
305
|
+
return Effect.void;
|
|
306
|
+
group.cancelled = true;
|
|
307
|
+
return group.cancel(group.connection);
|
|
308
|
+
})));
|
|
309
|
+
}),
|
|
310
|
+
leave: (aborted) => leave(group, seat, aborted),
|
|
311
|
+
};
|
|
312
|
+
seat.admission = options.admission(member);
|
|
313
|
+
group.seats.push(seat);
|
|
314
|
+
const full = group.seats.length >= GROUP_MEMBERS ? close(group) : Effect.void;
|
|
315
|
+
const start = found === undefined
|
|
316
|
+
? Effect.asVoid(Effect.forkIn(drive(group), layer))
|
|
317
|
+
: group.begun
|
|
318
|
+
? queue(group, seat)
|
|
319
|
+
: Effect.sync(() => wake(group));
|
|
320
|
+
return full.pipe(Effect.andThen(start), Effect.andThen(restore(Deferred.await(seat.queued))), Effect.map((queued) => {
|
|
321
|
+
replies = queued;
|
|
322
|
+
return member;
|
|
323
|
+
}), Effect.onInterrupt(() => leave(group, seat, false)));
|
|
324
|
+
}));
|
|
325
|
+
return TurnGroups.of({ join });
|
|
326
|
+
}));
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Context, Effect, Schema } from "effect";
|
|
2
|
+
import type { Request } from "../request.ts";
|
|
3
|
+
/**
|
|
4
|
+
* A named moment in command delivery, turn execution, and the outbox and
|
|
5
|
+
* subscription relays where a test can pause, fail, or crash the runtime.
|
|
6
|
+
*/
|
|
7
|
+
export type TurnPoint = "beforeDelivery" | "queued" | "beforeHandler" | "beforeCommit" | "afterCommit" | "beforeFlush" | "afterClaim" | "beforeOutboxDelete" | "beforeExecute" | "afterExecute" | "beforeRenew" | "beforeDeadLetterCommit" | "beforeSettle" | "afterSettleSnapshot" | "afterExpand" | "beforeWorkflowSuspend";
|
|
8
|
+
declare const RetryTurn_base: Schema.Class<RetryTurn, Schema.TaggedStruct<"RetryTurn", {
|
|
9
|
+
readonly message: Schema.String;
|
|
10
|
+
}>, import("effect/Cause").YieldableError>;
|
|
11
|
+
/**
|
|
12
|
+
* A defect that says nothing about the command: the activation restarts and
|
|
13
|
+
* the caller retries the same command id. Tests raise it to inject a crash.
|
|
14
|
+
*/
|
|
15
|
+
export declare class RetryTurn extends RetryTurn_base {
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Called at each `TurnPoint` with the request in flight. The default does
|
|
19
|
+
* nothing; a test hook can wait, fail, or die at that point. A hook that dies
|
|
20
|
+
* with `RetryTurn` simulates a crash the runtime recovers from.
|
|
21
|
+
*/
|
|
22
|
+
export declare const TurnHooks: Context.Reference<{
|
|
23
|
+
readonly at: (point: TurnPoint, request: Request) => Effect.Effect<void>;
|
|
24
|
+
}>;
|
|
25
|
+
/**
|
|
26
|
+
* Where a test can pause a content operation between its two single-shard
|
|
27
|
+
* statements: a read after resolving the reference, the sweep after its
|
|
28
|
+
* reference scan, and `Content.grant` before it raises the grant horizon.
|
|
29
|
+
*/
|
|
30
|
+
export type ContentPoint = "afterResolve" | "afterReferenceScan" | "beforeRaise";
|
|
31
|
+
export declare const ContentHooks: Context.Reference<{
|
|
32
|
+
readonly at: (point: ContentPoint) => Effect.Effect<void>;
|
|
33
|
+
}>;
|
|
34
|
+
/**
|
|
35
|
+
* Test controls for retention cleanup: rows per batch statement, a point
|
|
36
|
+
* after each committed batch where a test can pause or crash the sweep, and
|
|
37
|
+
* whether the runtime sweeps on its own every minute.
|
|
38
|
+
*/
|
|
39
|
+
export declare const CleanupHooks: Context.Reference<{
|
|
40
|
+
readonly batchSize: number;
|
|
41
|
+
readonly afterBatch: Effect.Effect<void>;
|
|
42
|
+
readonly periodic: boolean;
|
|
43
|
+
}>;
|
|
44
|
+
export {};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Context, Effect, Schema } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* A defect that says nothing about the command: the activation restarts and
|
|
4
|
+
* the caller retries the same command id. Tests raise it to inject a crash.
|
|
5
|
+
*/
|
|
6
|
+
export class RetryTurn extends Schema.TaggedError()("RetryTurn", {
|
|
7
|
+
message: Schema.String,
|
|
8
|
+
}) {
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Called at each `TurnPoint` with the request in flight. The default does
|
|
12
|
+
* nothing; a test hook can wait, fail, or die at that point. A hook that dies
|
|
13
|
+
* with `RetryTurn` simulates a crash the runtime recovers from.
|
|
14
|
+
*/
|
|
15
|
+
export const TurnHooks = Context.Reference("akter/TurnHooks", {
|
|
16
|
+
defaultValue: () => ({ at: () => Effect.void }),
|
|
17
|
+
});
|
|
18
|
+
export const ContentHooks = Context.Reference("akter/ContentHooks", {
|
|
19
|
+
defaultValue: () => ({ at: () => Effect.void }),
|
|
20
|
+
});
|
|
21
|
+
/**
|
|
22
|
+
* Test controls for retention cleanup: rows per batch statement, a point
|
|
23
|
+
* after each committed batch where a test can pause or crash the sweep, and
|
|
24
|
+
* whether the runtime sweeps on its own every minute.
|
|
25
|
+
*/
|
|
26
|
+
export const CleanupHooks = Context.Reference("akter/CleanupHooks", {
|
|
27
|
+
defaultValue: () => ({ batchSize: 1000, afterBatch: Effect.void, periodic: true }),
|
|
28
|
+
});
|