@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,155 @@
|
|
|
1
|
+
import { Context, type Effect, type Scope, type Stream } from "effect";
|
|
2
|
+
import type { Transport } from "./connections/transport.ts";
|
|
3
|
+
import type { Holder } from "./connections/holder.ts";
|
|
4
|
+
import type { ProgressMessage } from "./jobs/progress.ts";
|
|
5
|
+
import type { ActorError } from "../errors/actor.ts";
|
|
6
|
+
import type { RetentionGap, UnknownCursor } from "../errors/events.ts";
|
|
7
|
+
import type { ActorRef, Caller } from "../identity/caller.ts";
|
|
8
|
+
import type { Seed } from "./operators/seed.ts";
|
|
9
|
+
import type { MintInput } from "../identity/mint.ts";
|
|
10
|
+
import type { Swept } from "./storage/retention.ts";
|
|
11
|
+
import type { BlobAccess, BlobScope } from "../state/blob.ts";
|
|
12
|
+
import type { TableAccess, TableScope } from "../tables/owned.ts";
|
|
13
|
+
import type { Executed, Outcome, Request } from "./request.ts";
|
|
14
|
+
import type { FleetRequest } from "./fleet/subscribe.ts";
|
|
15
|
+
import type { JobRegistration, QueryRegistration, Registration, StoredEvent, WatchResult, WorkflowStatus } from "./members.ts";
|
|
16
|
+
declare const InternalActors_base: Context.ServiceClass<InternalActors, "@rikalabs/akter/runtime/actors/InternalActors", {
|
|
17
|
+
readonly register: (actor: Registration) => Effect.Effect<void, never, Scope.Scope>;
|
|
18
|
+
readonly transport: Transport;
|
|
19
|
+
/** This runner's in-process connection holder. */
|
|
20
|
+
readonly holder: Holder;
|
|
21
|
+
/** Ends the actor's activation on this runner as idle expiry would. */
|
|
22
|
+
readonly hibernate: (ref: ActorRef) => Effect.Effect<void>;
|
|
23
|
+
readonly execute: (request: Request) => Effect.Effect<Executed, ActorError>;
|
|
24
|
+
/**
|
|
25
|
+
* Whether `execute` would refuse a served command without waiting, before
|
|
26
|
+
* its request is read or decoded.
|
|
27
|
+
*/
|
|
28
|
+
readonly overloaded: () => boolean;
|
|
29
|
+
/** Bounds command request processing before authentication or body parsing starts. */
|
|
30
|
+
readonly admitRequest: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | ActorError, R>;
|
|
31
|
+
/**
|
|
32
|
+
* Delivers a committed intent. The obligation was admitted by its sending
|
|
33
|
+
* turn, so external access and command-id expiry are not checked again.
|
|
34
|
+
*/
|
|
35
|
+
readonly deliver: (request: Request) => Effect.Effect<Outcome, ActorError>;
|
|
36
|
+
/** Runs relay passes until no due intent remains; used by `ActorTest.advance`. */
|
|
37
|
+
readonly drainOutbox: Effect.Effect<void>;
|
|
38
|
+
/** Runs one retention sweep now; used by `ActorTest.cleanup`. */
|
|
39
|
+
readonly cleanup: Effect.Effect<Swept>;
|
|
40
|
+
/**
|
|
41
|
+
* Sweeps every tenant's unreferenced content now, whenever each was last
|
|
42
|
+
* swept, and returns how many contents it deleted; for tests.
|
|
43
|
+
*/
|
|
44
|
+
readonly sweepContent: Effect.Effect<number>;
|
|
45
|
+
/**
|
|
46
|
+
* Moves the leases of this runner's running effect attempts forward and
|
|
47
|
+
* runs `jump`, with no relay pass between them; used by `ActorTest.advance`.
|
|
48
|
+
*/
|
|
49
|
+
readonly extendOutboxLeases: (millis: number, jump: Effect.Effect<void>) => Effect.Effect<void>;
|
|
50
|
+
readonly registerQueries: (actor: QueryRegistration) => Effect.Effect<void, never, Scope.Scope>;
|
|
51
|
+
readonly registerJobs: (actor: JobRegistration) => Effect.Effect<void, never, Scope.Scope>;
|
|
52
|
+
/**
|
|
53
|
+
* Reads committed state. With `minVersion`, a configured replica answers
|
|
54
|
+
* only once it has replayed that commit version; otherwise the primary does.
|
|
55
|
+
*/
|
|
56
|
+
readonly query: (request: Request, minVersion?: string) => Effect.Effect<Outcome, ActorError>;
|
|
57
|
+
/** The highest commit version any command sent through this runtime has returned. */
|
|
58
|
+
readonly observedVersion: () => string | undefined;
|
|
59
|
+
/** Sends one progress message to its actor's owner as an executor pool would; for tests. */
|
|
60
|
+
readonly deliverProgress: (message: ProgressMessage) => Effect.Effect<void>;
|
|
61
|
+
/** Whether the actor has a generation row, read without waking or creating it. */
|
|
62
|
+
readonly exists: (ref: ActorRef) => Effect.Effect<boolean, ActorError>;
|
|
63
|
+
/**
|
|
64
|
+
* Reads up to `limit` committed events of `tags` after an exclusive
|
|
65
|
+
* cursor, like a query, without waking the actor; an actor with no
|
|
66
|
+
* generation row fails `NotCreated` and gets none. Values are upcast to
|
|
67
|
+
* the current version of their class.
|
|
68
|
+
*/
|
|
69
|
+
readonly readFeed: (ref: ActorRef, tags: ReadonlyArray<string>, after: string | undefined, limit: number) => Effect.Effect<ReadonlyArray<Omit<StoredEvent, "version"> & {
|
|
70
|
+
readonly tag: string;
|
|
71
|
+
}>, ActorError | UnknownCursor | RetentionGap>;
|
|
72
|
+
/**
|
|
73
|
+
* Subscribes to a stream member on the actor's owner: `request.command`
|
|
74
|
+
* is the member and `request.payload` its encoded input. Elements arrive
|
|
75
|
+
* encoded; a declared failure fails with its encoding.
|
|
76
|
+
*/
|
|
77
|
+
readonly subscribe: (request: Request) => Stream.Stream<string, ActorError | {
|
|
78
|
+
readonly failure: string;
|
|
79
|
+
}>;
|
|
80
|
+
/**
|
|
81
|
+
* Watches a query declared `watch: true`: `request.command` is the query
|
|
82
|
+
* and `request.payload` its encoded input. The effect opens the watch at
|
|
83
|
+
* this runner's holder, which authorizes it with `kind: "watch"`, and
|
|
84
|
+
* fails `NotCreated` for an actor no command has created. The stream
|
|
85
|
+
* starts with the current result, then sends the newest result after each
|
|
86
|
+
* commit that wrote something the last run read, skipping intermediate
|
|
87
|
+
* results and results equal to the last one. A declared failure fails it
|
|
88
|
+
* with its encoding. `minVersion` is a commit version the first result
|
|
89
|
+
* reflects at least, and `expiresAt` the credential's expiry in epoch
|
|
90
|
+
* milliseconds, which ends the watch with `Unauthorized`.
|
|
91
|
+
*/
|
|
92
|
+
readonly watch: (request: Request, options: {
|
|
93
|
+
readonly minVersion: string | undefined;
|
|
94
|
+
readonly expiresAt: number | undefined;
|
|
95
|
+
}) => Effect.Effect<Stream.Stream<WatchResult, ActorError | {
|
|
96
|
+
readonly failure: string;
|
|
97
|
+
}>, ActorError>;
|
|
98
|
+
/**
|
|
99
|
+
* Subscribes to a fleet view for the caller's tenant: the effect
|
|
100
|
+
* authorizes it with `kind: "fleet"` and fails `RunnerAtCapacity` past
|
|
101
|
+
* the view's subscriptions on this runner. The stream starts with the
|
|
102
|
+
* current page, `{ asOf, stale, rows }` encoded as a watch result, then
|
|
103
|
+
* sends a page each time the view's state changed and its page differs;
|
|
104
|
+
* it ends `Unauthorized` once reauthorization is refused or the
|
|
105
|
+
* credential expires.
|
|
106
|
+
*/
|
|
107
|
+
readonly fleet: (request: FleetRequest) => Effect.Effect<Stream.Stream<WatchResult, ActorError>, ActorError>;
|
|
108
|
+
/** The fleet views this runtime registered, by name. */
|
|
109
|
+
readonly fleetViews: ReadonlySet<string>;
|
|
110
|
+
/**
|
|
111
|
+
* Reads one execution's status like a query: `request.command` is the
|
|
112
|
+
* workflow member, `request.payload` the execution id.
|
|
113
|
+
*/
|
|
114
|
+
readonly pollWorkflow: (request: Request) => Effect.Effect<WorkflowStatus | undefined, ActorError>;
|
|
115
|
+
readonly mintActorId: Effect.Effect<string>;
|
|
116
|
+
/** Derives the id a parent turn mints for a child actor. */
|
|
117
|
+
readonly mintChildId: (input: MintInput) => Effect.Effect<string>;
|
|
118
|
+
/** The deployment's command retry window: every id's `expiresAt - issuedAt`. */
|
|
119
|
+
readonly retryWindowMs: number;
|
|
120
|
+
/** The database clock in epoch milliseconds, the only clock command ids are checked against. */
|
|
121
|
+
readonly databaseNow: Effect.Effect<number, ActorError>;
|
|
122
|
+
/** A fresh command id issued at the database clock, as `Actors.mintCommandId` returns. */
|
|
123
|
+
readonly mintCommandId: Effect.Effect<string, ActorError>;
|
|
124
|
+
/**
|
|
125
|
+
* Binds owned-table capabilities to the calling fiber's turn or query.
|
|
126
|
+
* Writable access requires the turn transaction and never opens its own.
|
|
127
|
+
*/
|
|
128
|
+
readonly tables: (scope: TableScope, write: boolean) => Effect.Effect<TableAccess>;
|
|
129
|
+
/** The Cluster shard that places `ref`'s activation, as stored in runner shard locks. */
|
|
130
|
+
readonly shardId: (ref: ActorRef) => Effect.Effect<string>;
|
|
131
|
+
/** Binds blob capabilities the same way; writable access requires the turn transaction. */
|
|
132
|
+
readonly blobs: (scope: BlobScope, write: boolean) => Effect.Effect<BlobAccess>;
|
|
133
|
+
/** Which layers of an actor type this process registered. */
|
|
134
|
+
readonly registered: (actor: string) => {
|
|
135
|
+
readonly commands: boolean;
|
|
136
|
+
readonly queries: boolean;
|
|
137
|
+
};
|
|
138
|
+
/** The blob names a registered actor type declares, for test inspection. */
|
|
139
|
+
readonly declaredBlobs: (actor: string) => ReadonlyArray<string>;
|
|
140
|
+
/**
|
|
141
|
+
* Starts the actor `ref` from `seed` in one transaction, staging its
|
|
142
|
+
* pending work as `caller`; dies, writing nothing, when the seed is of
|
|
143
|
+
* another type, names an effect the actor does not register, or the
|
|
144
|
+
* actor already exists.
|
|
145
|
+
*/
|
|
146
|
+
readonly seed: (request: {
|
|
147
|
+
readonly ref: ActorRef;
|
|
148
|
+
readonly caller: Caller;
|
|
149
|
+
readonly seed: Seed;
|
|
150
|
+
}) => Effect.Effect<void>;
|
|
151
|
+
}>;
|
|
152
|
+
/** Runtime-only capabilities; package entry points export only Actors. */
|
|
153
|
+
export declare class InternalActors extends InternalActors_base {
|
|
154
|
+
}
|
|
155
|
+
export {};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Duration, Effect, type Scope } from "effect";
|
|
2
|
+
import { ActorError } from "../errors/actor.ts";
|
|
3
|
+
/**
|
|
4
|
+
* The cause of an `ActorUnavailable` that refused a command before it reached
|
|
5
|
+
* any queue: the runner could not admit it within its admission wait, or the
|
|
6
|
+
* actor's activation already held its limit of waiting commands. Nothing of
|
|
7
|
+
* the command ran.
|
|
8
|
+
*/
|
|
9
|
+
export declare const overloaded: (queue: "runner" | "activation") => ActorError;
|
|
10
|
+
/** Whether `error` is a refusal for overload, which a delivery never retries in place. */
|
|
11
|
+
export declare const isOverloaded: (error: ActorError) => boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Admits at most `limit` effects at once. The next `limit` callers wait for a
|
|
14
|
+
* slot in arrival order, each for at most `wait`; a caller past them, or one
|
|
15
|
+
* whose wait runs out, is refused with `ActorUnavailable`. Work past what the
|
|
16
|
+
* runner can serve therefore waits in its callers' retries instead of in the
|
|
17
|
+
* runner's mailboxes and pool queues, while a burst shorter than `wait` is
|
|
18
|
+
* absorbed rather than refused. A refusal happens before the effect starts, so
|
|
19
|
+
* a refused command never reaches admission, a mailbox, or a turn.
|
|
20
|
+
*
|
|
21
|
+
* A slot freed while callers wait goes straight to the oldest, never back to
|
|
22
|
+
* the free count, so a newcomer cannot overtake a waiter. A waiter whose wait
|
|
23
|
+
* ends after it was handed a slot passes the slot on, so a slot is never lost.
|
|
24
|
+
*/
|
|
25
|
+
export declare const admissionLimit: ({ limit, wait, }: {
|
|
26
|
+
readonly limit: number;
|
|
27
|
+
readonly wait: Duration.Duration;
|
|
28
|
+
}) => {
|
|
29
|
+
/** Whether the next caller would be refused without waiting. */
|
|
30
|
+
full: () => boolean;
|
|
31
|
+
/** Holds a slot until its scope closes, including after the acquiring fiber stops waiting. */
|
|
32
|
+
take: Effect.Effect<void, ActorError, Scope.Scope>;
|
|
33
|
+
admit: <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | ActorError, R>;
|
|
34
|
+
};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Duration, Effect, Schema } from "effect";
|
|
2
|
+
import { ActorError, ActorUnavailable } from "../errors/actor.js";
|
|
3
|
+
/**
|
|
4
|
+
* The cause of an `ActorUnavailable` that refused a command before it reached
|
|
5
|
+
* any queue: the runner could not admit it within its admission wait, or the
|
|
6
|
+
* actor's activation already held its limit of waiting commands. Nothing of
|
|
7
|
+
* the command ran.
|
|
8
|
+
*/
|
|
9
|
+
export const overloaded = (queue) => ActorError.make({
|
|
10
|
+
reason: ActorUnavailable.make({
|
|
11
|
+
overloaded: true,
|
|
12
|
+
cause: new Error(queue === "runner"
|
|
13
|
+
? "The runner holds its limit of commands in flight"
|
|
14
|
+
: "The activation holds its limit of waiting commands"),
|
|
15
|
+
}),
|
|
16
|
+
});
|
|
17
|
+
/** Whether `error` is a refusal for overload, which a delivery never retries in place. */
|
|
18
|
+
export const isOverloaded = (error) => Schema.is(ActorUnavailable)(error.reason) && error.reason.overloaded === true;
|
|
19
|
+
/**
|
|
20
|
+
* Admits at most `limit` effects at once. The next `limit` callers wait for a
|
|
21
|
+
* slot in arrival order, each for at most `wait`; a caller past them, or one
|
|
22
|
+
* whose wait runs out, is refused with `ActorUnavailable`. Work past what the
|
|
23
|
+
* runner can serve therefore waits in its callers' retries instead of in the
|
|
24
|
+
* runner's mailboxes and pool queues, while a burst shorter than `wait` is
|
|
25
|
+
* absorbed rather than refused. A refusal happens before the effect starts, so
|
|
26
|
+
* a refused command never reaches admission, a mailbox, or a turn.
|
|
27
|
+
*
|
|
28
|
+
* A slot freed while callers wait goes straight to the oldest, never back to
|
|
29
|
+
* the free count, so a newcomer cannot overtake a waiter. A waiter whose wait
|
|
30
|
+
* ends after it was handed a slot passes the slot on, so a slot is never lost.
|
|
31
|
+
*/
|
|
32
|
+
export const admissionLimit = ({ limit, wait, }) => {
|
|
33
|
+
let free = limit;
|
|
34
|
+
const waiters = new Set();
|
|
35
|
+
const release = Effect.sync(() => {
|
|
36
|
+
const next = waiters.values().next();
|
|
37
|
+
if (next.done === true) {
|
|
38
|
+
free += 1;
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
waiters.delete(next.value);
|
|
42
|
+
next.value.granted = true;
|
|
43
|
+
next.value.resume();
|
|
44
|
+
});
|
|
45
|
+
const enter = (restore) => Effect.suspend(() => {
|
|
46
|
+
if (free > 0) {
|
|
47
|
+
free -= 1;
|
|
48
|
+
return Effect.void;
|
|
49
|
+
}
|
|
50
|
+
if (Duration.isZero(wait) || waiters.size >= limit)
|
|
51
|
+
return Effect.fail(overloaded("runner"));
|
|
52
|
+
let waiter;
|
|
53
|
+
return restore(Effect.callback((resume) => {
|
|
54
|
+
const queued = { granted: false, resume: () => resume(Effect.void) };
|
|
55
|
+
waiter = queued;
|
|
56
|
+
waiters.add(queued);
|
|
57
|
+
return Effect.sync(() => {
|
|
58
|
+
waiters.delete(queued);
|
|
59
|
+
});
|
|
60
|
+
}).pipe(Effect.onInterrupt(() => (waiter?.granted === true ? release : Effect.void)), Effect.timeoutOrElse({
|
|
61
|
+
duration: wait,
|
|
62
|
+
orElse: () => Effect.fail(overloaded("runner")),
|
|
63
|
+
})));
|
|
64
|
+
});
|
|
65
|
+
return {
|
|
66
|
+
/** Whether the next caller would be refused without waiting. */
|
|
67
|
+
full: () => free === 0 && (Duration.isZero(wait) || waiters.size >= limit),
|
|
68
|
+
/** Holds a slot until its scope closes, including after the acquiring fiber stops waiting. */
|
|
69
|
+
take: Effect.uninterruptibleMask((restore) => Effect.andThen(enter(restore), Effect.addFinalizer(() => release))),
|
|
70
|
+
admit: (effect) => Effect.uninterruptibleMask((restore) => Effect.andThen(enter(restore), restore(effect).pipe(Effect.ensuring(release)))),
|
|
71
|
+
};
|
|
72
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { SqlClient } from "effect/sql";
|
|
3
|
+
import { AdoptionRefused } from "./target.ts";
|
|
4
|
+
/** What a backfill did for one table. */
|
|
5
|
+
export interface BackfillResult {
|
|
6
|
+
readonly table: string;
|
|
7
|
+
/** Rows given a `routing_key`. */
|
|
8
|
+
readonly filled: number;
|
|
9
|
+
/** Full passes over the table; the last one found nothing left to fill. */
|
|
10
|
+
readonly passes: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Fills `routing_key` of every row of each observed table of `actors`, in
|
|
14
|
+
* primary-key batches that are each their own transaction, with the runtime's
|
|
15
|
+
* own `routingKey` and the type's placement so a row's key equals the key of
|
|
16
|
+
* an actor that writes it. Nothing is stored between batches: a killed run
|
|
17
|
+
* starts again and finds only the rows still without a key. Rows written by
|
|
18
|
+
* legacy code meanwhile carry none, so it repeats until a pass fills nothing.
|
|
19
|
+
* A table with a NULL or empty mapped column is refused and its rows listed,
|
|
20
|
+
* because no actor owns them.
|
|
21
|
+
*/
|
|
22
|
+
export declare const backfillAdoption: (actors: readonly WeakKey[], options: {
|
|
23
|
+
readonly only?: string | undefined;
|
|
24
|
+
readonly batch?: number | undefined;
|
|
25
|
+
}) => Effect.Effect<BackfillResult[], AdoptionRefused | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
26
|
+
/** One line per table: how many rows were filled and how many passes it took. */
|
|
27
|
+
export declare const formatBackfill: (result: BackfillResult) => string;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { SqlClient } from "effect/sql";
|
|
3
|
+
import { ActorRef } from "../../identity/caller.js";
|
|
4
|
+
import { routingKey } from "../storage/codec.js";
|
|
5
|
+
import { quotedTable } from "./plan.js";
|
|
6
|
+
import { AdoptionRefused, adoptionTargets, qualifiedName } from "./target.js";
|
|
7
|
+
const identifier = (name) => `"${name.replaceAll('"', '""')}"`;
|
|
8
|
+
const literal = (value) => `'${value.replaceAll("'", "''")}'`;
|
|
9
|
+
const UNOWNED_SAMPLE = 20;
|
|
10
|
+
/**
|
|
11
|
+
* Fills `routing_key` of every row of each observed table of `actors`, in
|
|
12
|
+
* primary-key batches that are each their own transaction, with the runtime's
|
|
13
|
+
* own `routingKey` and the type's placement so a row's key equals the key of
|
|
14
|
+
* an actor that writes it. Nothing is stored between batches: a killed run
|
|
15
|
+
* starts again and finds only the rows still without a key. Rows written by
|
|
16
|
+
* legacy code meanwhile carry none, so it repeats until a pass fills nothing.
|
|
17
|
+
* A table with a NULL or empty mapped column is refused and its rows listed,
|
|
18
|
+
* because no actor owns them.
|
|
19
|
+
*/
|
|
20
|
+
export const backfillAdoption = Effect.fnUntraced(function* (actors, options) {
|
|
21
|
+
const batch = options.batch ?? 1000;
|
|
22
|
+
if (!Number.isInteger(batch) || batch < 1)
|
|
23
|
+
return yield* AdoptionRefused.make({ message: "--batch is a positive integer" });
|
|
24
|
+
const results = [];
|
|
25
|
+
for (const target of yield* adoptionTargets(actors, options.only)) {
|
|
26
|
+
if (target.access === "read") {
|
|
27
|
+
if (options.only !== undefined)
|
|
28
|
+
return yield* AdoptionRefused.make({
|
|
29
|
+
message: `${qualifiedName(target)} is adopted for reading only and has no routing_key`,
|
|
30
|
+
});
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
results.push(yield* backfillTable(target, batch));
|
|
34
|
+
}
|
|
35
|
+
return results;
|
|
36
|
+
});
|
|
37
|
+
const backfillTable = Effect.fnUntraced(function* (target, batch) {
|
|
38
|
+
const sql = yield* SqlClient.SqlClient;
|
|
39
|
+
const name = qualifiedName(target);
|
|
40
|
+
const [adoption] = yield* sql `
|
|
41
|
+
SELECT mode, actor_type FROM actor_adoptions
|
|
42
|
+
WHERE table_schema = ${target.schema} AND table_name = ${target.table}`;
|
|
43
|
+
if (adoption === undefined)
|
|
44
|
+
return yield* AdoptionRefused.make({
|
|
45
|
+
message: `${name} is not observed; run durable adopt observe ${target.table} first`,
|
|
46
|
+
});
|
|
47
|
+
if (adoption.mode === "enforce")
|
|
48
|
+
return yield* AdoptionRefused.make({
|
|
49
|
+
message: `${name} is enforced, so every row already has a routing_key`,
|
|
50
|
+
});
|
|
51
|
+
const table = quotedTable(target);
|
|
52
|
+
const tenant = identifier(target.tenantColumn);
|
|
53
|
+
const actor = identifier(target.actorColumn);
|
|
54
|
+
const keys = target.primaryKey.map(identifier);
|
|
55
|
+
const owned = `${tenant} IS NOT NULL AND ${actor} IS NOT NULL AND ${tenant}::text <> '' AND ${actor}::text <> ''`;
|
|
56
|
+
const unowned = yield* sql.unsafe(`SELECT ${keys.map((key, index) => `${key}::text AS k${index}`).join(", ")}
|
|
57
|
+
FROM ${table} WHERE NOT (${owned}) ORDER BY ${keys.join(", ")} LIMIT ${UNOWNED_SAMPLE}`);
|
|
58
|
+
if (unowned.length > 0)
|
|
59
|
+
return yield* AdoptionRefused.make({
|
|
60
|
+
message: `${name} has rows whose ${target.tenantColumn} or ${target.actorColumn} is NULL or empty, so no actor owns them; fix them first. First rows by primary key (${target.primaryKey.join(", ")}): ${unowned
|
|
61
|
+
.map((row) => `(${Object.values(row).join(", ")})`)
|
|
62
|
+
.join(" ")}`,
|
|
63
|
+
});
|
|
64
|
+
const types = yield* sql `
|
|
65
|
+
SELECT a.attname AS name, format_type(a.atttypid, a.atttypmod) AS type
|
|
66
|
+
FROM pg_attribute a JOIN pg_class c ON c.oid = a.attrelid
|
|
67
|
+
JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
68
|
+
WHERE n.nspname = ${target.schema} AND c.relname = ${target.table}
|
|
69
|
+
AND a.attname IN ${sql.in([...target.primaryKey, target.tenantColumn, target.actorColumn])}`;
|
|
70
|
+
const typeOf = (column) => types.find((type) => type.name === column).type;
|
|
71
|
+
const keyTypes = target.primaryKey.map(typeOf);
|
|
72
|
+
const tenantType = typeOf(target.tenantColumn);
|
|
73
|
+
const actorType = typeOf(target.actorColumn);
|
|
74
|
+
let filled = 0;
|
|
75
|
+
let passes = 0;
|
|
76
|
+
for (;;) {
|
|
77
|
+
passes += 1;
|
|
78
|
+
let cursor;
|
|
79
|
+
let passFilled = 0;
|
|
80
|
+
for (;;) {
|
|
81
|
+
const after = cursor === undefined
|
|
82
|
+
? ""
|
|
83
|
+
: `AND (${keys.join(", ")}) > (${cursor.map((value, index) => `${literal(value)}::${keyTypes[index]}`).join(", ")})`;
|
|
84
|
+
const rows = yield* sql.unsafe(`SELECT ${tenant}::text AS tenant, ${actor}::text AS actor,
|
|
85
|
+
${keys.map((key, index) => `${key}::text AS k${index}`).join(", ")}
|
|
86
|
+
FROM ${table} WHERE routing_key IS NULL AND ${owned} ${after}
|
|
87
|
+
ORDER BY ${keys.join(", ")} LIMIT ${batch}`);
|
|
88
|
+
if (rows.length === 0)
|
|
89
|
+
break;
|
|
90
|
+
const values = yield* Effect.forEach(rows, (row) => Effect.try({
|
|
91
|
+
try: () => routingKey({
|
|
92
|
+
ref: ActorRef.make({
|
|
93
|
+
tenant: row["tenant"],
|
|
94
|
+
actor: target.actor,
|
|
95
|
+
id: row["actor"],
|
|
96
|
+
}),
|
|
97
|
+
placement: target.placement,
|
|
98
|
+
}),
|
|
99
|
+
catch: (cause) => AdoptionRefused.make({
|
|
100
|
+
message: `${name} row ${target.primaryKey.map((_, index) => row[`k${index}`]).join(", ")}: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
101
|
+
}),
|
|
102
|
+
}));
|
|
103
|
+
const parameters = rows.flatMap((row, index) => [
|
|
104
|
+
row["tenant"],
|
|
105
|
+
row["actor"],
|
|
106
|
+
...target.primaryKey.map((_, key) => row[`k${key}`]),
|
|
107
|
+
values[index].toString(),
|
|
108
|
+
]);
|
|
109
|
+
const width = 3 + target.primaryKey.length;
|
|
110
|
+
const tuples = rows
|
|
111
|
+
.map((_, index) => {
|
|
112
|
+
const base = index * width;
|
|
113
|
+
const cast = [
|
|
114
|
+
`$${base + 1}::${tenantType}`,
|
|
115
|
+
`$${base + 2}::${actorType}`,
|
|
116
|
+
...keyTypes.map((type, key) => `$${base + 3 + key}::${type}`),
|
|
117
|
+
`$${base + width}::bigint`,
|
|
118
|
+
];
|
|
119
|
+
return `(${cast.join(", ")})`;
|
|
120
|
+
})
|
|
121
|
+
.join(", ");
|
|
122
|
+
const match = [
|
|
123
|
+
`t.${tenant} = v.tenant`,
|
|
124
|
+
`t.${actor} = v.actor`,
|
|
125
|
+
...keys.map((key, index) => `t.${key} = v.k${index}`),
|
|
126
|
+
].join(" AND ");
|
|
127
|
+
const updated = yield* Effect.gen(function* () {
|
|
128
|
+
yield* sql `SELECT set_config('durable.backfill', 'on', true)`;
|
|
129
|
+
return yield* sql.unsafe(`WITH changed AS (
|
|
130
|
+
UPDATE ${table} AS t SET routing_key = v.routing_key
|
|
131
|
+
FROM (VALUES ${tuples}) AS v (tenant, actor, ${keys.map((_, index) => `k${index}`).join(", ")}, routing_key)
|
|
132
|
+
WHERE ${match} AND t.routing_key IS NULL RETURNING 1)
|
|
133
|
+
SELECT count(*)::text AS n FROM changed`, parameters);
|
|
134
|
+
}).pipe(sql.withTransaction);
|
|
135
|
+
passFilled += Number(updated[0].n);
|
|
136
|
+
cursor = target.primaryKey.map((_, index) => rows[rows.length - 1][`k${index}`]);
|
|
137
|
+
}
|
|
138
|
+
filled += passFilled;
|
|
139
|
+
if (passFilled === 0)
|
|
140
|
+
return { table: name, filled, passes };
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
/** One line per table: how many rows were filled and how many passes it took. */
|
|
144
|
+
export const formatBackfill = (result) => `${result.table}: filled routing_key on ${result.filled} rows in ${result.passes} pass${result.passes === 1 ? "" : "es"}`;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { SqlClient } from "effect/sql";
|
|
3
|
+
import { AdoptionRefused, type AdoptionTarget } from "./target.ts";
|
|
4
|
+
/** The default window a table must have been observed and quiet for before it is enforced. */
|
|
5
|
+
export declare const DEFAULT_QUIET_MS: number;
|
|
6
|
+
/** The grantees holding a write privilege on `target`, with the privilege, as the catalog records them. */
|
|
7
|
+
export declare const writeGrants: (target: Pick<AdoptionTarget, "schema" | "table">) => Effect.Effect<readonly {
|
|
8
|
+
grantee: string;
|
|
9
|
+
privilege: string;
|
|
10
|
+
}[], import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
11
|
+
/** The trigger arguments the guard is installed with, in the order `actor_adoption_guard()` reads them. */
|
|
12
|
+
export declare const guardArguments: ({ target, writerRole, allowedRoles, }: {
|
|
13
|
+
readonly target: Pick<AdoptionTarget, "tenantColumn" | "actorColumn" | "actor">;
|
|
14
|
+
readonly writerRole: string;
|
|
15
|
+
readonly allowedRoles: ReadonlyArray<string>;
|
|
16
|
+
}) => string[];
|
|
17
|
+
/** What `enforce` did for one table. */
|
|
18
|
+
export interface EnforceResult {
|
|
19
|
+
readonly table: string;
|
|
20
|
+
readonly writerRole: string;
|
|
21
|
+
readonly allowedRoles: ReadonlyArray<string>;
|
|
22
|
+
/** Privileges taken away, which `release` gives back. */
|
|
23
|
+
readonly revoked: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Enforces each named adopted table of `actors`, in one transaction under a
|
|
27
|
+
* `lock_timeout`. Nothing changes unless every check passes: the table has
|
|
28
|
+
* been observed for the whole quiet window, no legacy write outside `allow`
|
|
29
|
+
* roles fell inside it, no login wrote both in and out of turns, every row
|
|
30
|
+
* has its `routing_key` and owner columns, the owner is a role no login can
|
|
31
|
+
* act as, no other login can take the writer role, and no cascade reaches the
|
|
32
|
+
* table. It then revokes write privileges from every role but the writer and
|
|
33
|
+
* the allowed ones, adds the constraint that keeps `routing_key` and the
|
|
34
|
+
* mapped columns filled, and installs the guard triggers, always enabled.
|
|
35
|
+
*/
|
|
36
|
+
export declare const enforceAdoption: (actors: readonly WeakKey[], options: {
|
|
37
|
+
readonly only: string;
|
|
38
|
+
readonly writerRole: string;
|
|
39
|
+
readonly allowedRoles?: ReadonlyArray<string> | undefined;
|
|
40
|
+
readonly quietMs?: number | undefined;
|
|
41
|
+
readonly lockTimeoutMs?: number | undefined;
|
|
42
|
+
readonly nowMs: number;
|
|
43
|
+
}) => Effect.Effect<EnforceResult[], AdoptionRefused | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
44
|
+
/**
|
|
45
|
+
* Returns `only` from enforced to observed: drops the guard and the
|
|
46
|
+
* constraint that legacy writers, which supply no `routing_key`, would
|
|
47
|
+
* violate, gives back the privileges `enforce` recorded, and reinstalls the
|
|
48
|
+
* plain observing triggers. It never removes `routing_key` or the record.
|
|
49
|
+
*/
|
|
50
|
+
export declare const releaseAdoption: (actors: readonly WeakKey[], options: {
|
|
51
|
+
readonly only: string;
|
|
52
|
+
readonly lockTimeoutMs?: number | undefined;
|
|
53
|
+
}) => Effect.Effect<string[], AdoptionRefused | import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
54
|
+
/** One line per enforced table. */
|
|
55
|
+
export declare const formatEnforce: (result: EnforceResult) => string;
|