@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,69 @@
|
|
|
1
|
+
import { Context, Effect } from "effect";
|
|
2
|
+
import { SqlClient } from "effect/sql";
|
|
3
|
+
/**
|
|
4
|
+
* The role tenant-scoped transactions run as when row-level security is on.
|
|
5
|
+
* Undefined, they run as the connecting role, which the policies exempt.
|
|
6
|
+
*/
|
|
7
|
+
export declare const TenantScope: Context.Reference<{
|
|
8
|
+
readonly role: string | undefined;
|
|
9
|
+
readonly adoption: AdoptionScope | undefined;
|
|
10
|
+
}>;
|
|
11
|
+
/**
|
|
12
|
+
* The writer role a runtime takes for turns of actor types that own an
|
|
13
|
+
* enforced adopted table, and the types that do. The turn binds the role and
|
|
14
|
+
* its tenant together, as row-level security does, because the framework
|
|
15
|
+
* tables' `durable_tenant` policies bind every role that does not bypass them. `enforced` fills as each
|
|
16
|
+
* type registers, before any turn runs.
|
|
17
|
+
*/
|
|
18
|
+
export interface AdoptionScope {
|
|
19
|
+
readonly role: string;
|
|
20
|
+
readonly enforced: Set<string>;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The settings that bind the rest of a transaction to `tenant`: its role and
|
|
24
|
+
* the `durable.tenant` setting every `durable_tenant` policy compares with.
|
|
25
|
+
* Both are local, so they end with the transaction and never leak to the
|
|
26
|
+
* next borrower of the connection.
|
|
27
|
+
*/
|
|
28
|
+
export declare const tenantSettings: ({ sql, role, tenant, }: {
|
|
29
|
+
readonly sql: SqlClient.SqlClient;
|
|
30
|
+
readonly role: string;
|
|
31
|
+
readonly tenant: string;
|
|
32
|
+
}) => import("effect/sql/Statement").Statement<import("effect/sql/SqlConnection").Row>;
|
|
33
|
+
/**
|
|
34
|
+
* Runs `effect` in a transaction bound to `tenant` as `role`, or unchanged
|
|
35
|
+
* when row-level security is off or `effect` already runs in a transaction,
|
|
36
|
+
* such as a query's, that its caller bound.
|
|
37
|
+
*/
|
|
38
|
+
export declare const inTenant: ({ sql, role, tenant, }: {
|
|
39
|
+
readonly sql: SqlClient.SqlClient;
|
|
40
|
+
readonly role: string | undefined;
|
|
41
|
+
readonly tenant: string;
|
|
42
|
+
}) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | import("effect/sql/SqlError").SqlError, R>;
|
|
43
|
+
/** `inTenant` with this runtime's role. */
|
|
44
|
+
export declare const withTenant: (tenant: string) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | import("effect/sql/SqlError").SqlError, R | SqlClient.SqlClient>;
|
|
45
|
+
/**
|
|
46
|
+
* Refuses to start unless `role` confines the runtime to one tenant per
|
|
47
|
+
* transaction: it must be settable by this login, must not bypass the
|
|
48
|
+
* policies, and must be able to write every framework table. Every
|
|
49
|
+
* framework table with a `tenant_id` must carry the policy, including tables
|
|
50
|
+
* later migrations add. Every inspection view must belong to a view-owner
|
|
51
|
+
* role the policies bind, so the views filter by the reader's tenant, and
|
|
52
|
+
* which `role` can't act as, so a turn can't alter or drop a view. Setting
|
|
53
|
+
* the role in a transaction is the one proof that works for every membership
|
|
54
|
+
* rule.
|
|
55
|
+
*/
|
|
56
|
+
export declare const checkRowLevelSecurity: (role: string) => Effect.Effect<undefined, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
57
|
+
/**
|
|
58
|
+
* Refuses an owned table that would let a tenant-scoped transaction see other
|
|
59
|
+
* tenants' rows, or that `role` cannot use: row-level security must be on with
|
|
60
|
+
* the `durable_tenant` policy its drizzle-kit migration creates, and `role`
|
|
61
|
+
* must not own it, since Postgres exempts a table's owner from its policies.
|
|
62
|
+
*/
|
|
63
|
+
export declare const checkOwnedTable: (schema: string, table: string, role: string) => Effect.Effect<undefined, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
64
|
+
/**
|
|
65
|
+
* Refuses an adopted table `role` cannot use. An adopted table carries no
|
|
66
|
+
* `durable_tenant` policy unless the application added one, so only the
|
|
67
|
+
* privileges are checked: `role` reads it, and writes it when the runtime does.
|
|
68
|
+
*/
|
|
69
|
+
export declare const checkAdoptedTable: (schema: string, table: string, role: string, writable: boolean) => Effect.Effect<undefined, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { Context, Effect, Option } from "effect";
|
|
2
|
+
import { SqlClient } from "effect/sql";
|
|
3
|
+
/**
|
|
4
|
+
* The role tenant-scoped transactions run as when row-level security is on.
|
|
5
|
+
* Undefined, they run as the connecting role, which the policies exempt.
|
|
6
|
+
*/
|
|
7
|
+
export const TenantScope = Context.Reference("akter/TenantScope", {
|
|
8
|
+
defaultValue: () => ({ role: undefined, adoption: undefined }),
|
|
9
|
+
});
|
|
10
|
+
/**
|
|
11
|
+
* The settings that bind the rest of a transaction to `tenant`: its role and
|
|
12
|
+
* the `durable.tenant` setting every `durable_tenant` policy compares with.
|
|
13
|
+
* Both are local, so they end with the transaction and never leak to the
|
|
14
|
+
* next borrower of the connection.
|
|
15
|
+
*/
|
|
16
|
+
export const tenantSettings = ({ sql, role, tenant, }) => sql `set_config('role', ${role}, true), set_config('durable.tenant', ${tenant}, true)`;
|
|
17
|
+
/**
|
|
18
|
+
* Runs `effect` in a transaction bound to `tenant` as `role`, or unchanged
|
|
19
|
+
* when row-level security is off or `effect` already runs in a transaction,
|
|
20
|
+
* such as a query's, that its caller bound.
|
|
21
|
+
*/
|
|
22
|
+
export const inTenant = ({ sql, role, tenant, }) => (effect) => Effect.gen(function* () {
|
|
23
|
+
if (role === undefined)
|
|
24
|
+
return yield* effect;
|
|
25
|
+
if (Option.isSome(yield* Effect.serviceOption(sql.transactionService)))
|
|
26
|
+
return yield* effect;
|
|
27
|
+
return yield* sql.withTransaction(sql `SELECT ${tenantSettings({ sql, role, tenant })}`.pipe(Effect.andThen(effect)));
|
|
28
|
+
});
|
|
29
|
+
/** `inTenant` with this runtime's role. */
|
|
30
|
+
export const withTenant = (tenant) => (effect) => Effect.gen(function* () {
|
|
31
|
+
const { role } = yield* TenantScope;
|
|
32
|
+
const sql = yield* SqlClient.SqlClient;
|
|
33
|
+
return yield* inTenant({ sql, role, tenant })(effect);
|
|
34
|
+
});
|
|
35
|
+
const refuse = (message) => Effect.die(new Error(`Row-level security is misconfigured: ${message}`));
|
|
36
|
+
/**
|
|
37
|
+
* Refuses to start unless `role` confines the runtime to one tenant per
|
|
38
|
+
* transaction: it must be settable by this login, must not bypass the
|
|
39
|
+
* policies, and must be able to write every framework table. Every
|
|
40
|
+
* framework table with a `tenant_id` must carry the policy, including tables
|
|
41
|
+
* later migrations add. Every inspection view must belong to a view-owner
|
|
42
|
+
* role the policies bind, so the views filter by the reader's tenant, and
|
|
43
|
+
* which `role` can't act as, so a turn can't alter or drop a view. Setting
|
|
44
|
+
* the role in a transaction is the one proof that works for every membership
|
|
45
|
+
* rule.
|
|
46
|
+
*/
|
|
47
|
+
export const checkRowLevelSecurity = Effect.fnUntraced(function* (role) {
|
|
48
|
+
const sql = yield* SqlClient.SqlClient;
|
|
49
|
+
const [found] = yield* sql `
|
|
50
|
+
SELECT rolsuper OR rolbypassrls AS exempt FROM pg_roles WHERE rolname = ${role}`;
|
|
51
|
+
if (found === undefined)
|
|
52
|
+
return yield* refuse(`role ${role} does not exist`);
|
|
53
|
+
if (found.exempt)
|
|
54
|
+
return yield* refuse(`role ${role} is a superuser or bypasses row-level security`);
|
|
55
|
+
yield* sql `SELECT set_config('role', ${role}, true)`.pipe(sql.withTransaction, Effect.catch(() => refuse(`this login cannot SET ROLE ${role}`)));
|
|
56
|
+
const tables = yield* sql `
|
|
57
|
+
SELECT c.relname AS table,
|
|
58
|
+
pg_has_role(${role}, c.relowner, 'USAGE') AS owned,
|
|
59
|
+
c.relrowsecurity AND EXISTS (
|
|
60
|
+
SELECT 1 FROM pg_policy p WHERE p.polrelid = c.oid AND p.polname = 'durable_tenant'
|
|
61
|
+
) AS protected,
|
|
62
|
+
has_table_privilege(${role}, c.oid, 'SELECT, INSERT, UPDATE, DELETE') AS writable
|
|
63
|
+
FROM pg_class c
|
|
64
|
+
WHERE c.relnamespace = current_schema()::regnamespace AND c.relkind = 'r'
|
|
65
|
+
AND (c.relname LIKE 'actor\\_%' OR c.relname LIKE 'tenant\\_content%')
|
|
66
|
+
AND EXISTS (
|
|
67
|
+
SELECT 1 FROM pg_attribute a
|
|
68
|
+
WHERE a.attrelid = c.oid AND a.attname = 'tenant_id' AND NOT a.attisdropped
|
|
69
|
+
)
|
|
70
|
+
ORDER BY c.relname`;
|
|
71
|
+
for (const table of tables) {
|
|
72
|
+
if (table.owned)
|
|
73
|
+
return yield* refuse(`role ${role} owns ${table.table}, so no policy binds it`);
|
|
74
|
+
if (!table.protected)
|
|
75
|
+
return yield* refuse(`${table.table} has no durable_tenant policy; apply migration 0018_rls`);
|
|
76
|
+
if (!table.writable)
|
|
77
|
+
return yield* refuse(`role ${role} cannot read and write ${table.table}; grant it`);
|
|
78
|
+
}
|
|
79
|
+
const views = yield* sql `
|
|
80
|
+
SELECT v.relname AS view, o.rolname AS owner,
|
|
81
|
+
o.rolsuper OR o.rolbypassrls OR EXISTS (
|
|
82
|
+
SELECT 1 FROM pg_class t
|
|
83
|
+
WHERE t.relnamespace = current_schema()::regnamespace AND t.relkind = 'r'
|
|
84
|
+
AND t.relrowsecurity AND pg_has_role(o.oid, t.relowner, 'USAGE')
|
|
85
|
+
) AS exempt,
|
|
86
|
+
pg_has_role(${role}, o.oid, 'MEMBER') AS shared,
|
|
87
|
+
NOT EXISTS (
|
|
88
|
+
SELECT 1 FROM pg_class t
|
|
89
|
+
WHERE t.relnamespace = current_schema()::regnamespace AND t.relkind = 'r'
|
|
90
|
+
AND t.relname LIKE 'actor\\_%'
|
|
91
|
+
AND NOT has_table_privilege(o.oid, t.oid, 'SELECT')
|
|
92
|
+
) AS readable
|
|
93
|
+
FROM pg_class v JOIN pg_roles o ON o.oid = v.relowner
|
|
94
|
+
WHERE v.relnamespace = 'durable'::regnamespace AND v.relkind = 'v'
|
|
95
|
+
ORDER BY v.relname`;
|
|
96
|
+
for (const view of views) {
|
|
97
|
+
if (view.exempt)
|
|
98
|
+
return yield* refuse(`durable.${view.view} belongs to ${view.owner}, which the policies exempt, so it would show every tenant; give the views to a dedicated view-owner role`);
|
|
99
|
+
if (view.shared)
|
|
100
|
+
return yield* refuse(`durable.${view.view} belongs to ${view.owner}, which ${role} can act as, so a turn could alter or drop it; give the views to a role ${role} is not a member of`);
|
|
101
|
+
if (!view.readable)
|
|
102
|
+
return yield* refuse(`durable.${view.view} belongs to ${view.owner}, which cannot read every actor_* table; grant it SELECT`);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
/**
|
|
106
|
+
* Refuses an owned table that would let a tenant-scoped transaction see other
|
|
107
|
+
* tenants' rows, or that `role` cannot use: row-level security must be on with
|
|
108
|
+
* the `durable_tenant` policy its drizzle-kit migration creates, and `role`
|
|
109
|
+
* must not own it, since Postgres exempts a table's owner from its policies.
|
|
110
|
+
*/
|
|
111
|
+
export const checkOwnedTable = Effect.fnUntraced(function* (schema, table, role) {
|
|
112
|
+
const sql = yield* SqlClient.SqlClient;
|
|
113
|
+
const [found] = yield* sql `
|
|
114
|
+
SELECT pg_has_role(${role}, c.relowner, 'USAGE') AS owned,
|
|
115
|
+
c.relrowsecurity AND EXISTS (
|
|
116
|
+
SELECT 1 FROM pg_policy p WHERE p.polrelid = c.oid AND p.polname = 'durable_tenant'
|
|
117
|
+
) AS protected,
|
|
118
|
+
has_table_privilege(${role}, c.oid, 'SELECT, INSERT, UPDATE, DELETE') AS writable
|
|
119
|
+
FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
120
|
+
WHERE n.nspname = ${schema} AND c.relname = ${table}`;
|
|
121
|
+
if (found?.protected !== true)
|
|
122
|
+
return yield* refuse(`owned table ${schema}.${table} has no durable_tenant policy; apply its drizzle-kit migration`);
|
|
123
|
+
if (found.owned)
|
|
124
|
+
return yield* refuse(`role ${role} owns ${schema}.${table}, so no policy binds it`);
|
|
125
|
+
if (!found.writable)
|
|
126
|
+
return yield* refuse(`role ${role} cannot read and write ${schema}.${table}; grant it`);
|
|
127
|
+
});
|
|
128
|
+
/**
|
|
129
|
+
* Refuses an adopted table `role` cannot use. An adopted table carries no
|
|
130
|
+
* `durable_tenant` policy unless the application added one, so only the
|
|
131
|
+
* privileges are checked: `role` reads it, and writes it when the runtime does.
|
|
132
|
+
*/
|
|
133
|
+
export const checkAdoptedTable = Effect.fnUntraced(function* (schema, table, role, writable) {
|
|
134
|
+
const sql = yield* SqlClient.SqlClient;
|
|
135
|
+
const [found] = yield* sql `
|
|
136
|
+
SELECT has_table_privilege(${role}, c.oid, 'SELECT') AS readable,
|
|
137
|
+
has_table_privilege(${role}, c.oid, 'INSERT') AND has_table_privilege(${role}, c.oid, 'UPDATE')
|
|
138
|
+
AND has_table_privilege(${role}, c.oid, 'DELETE') AS writable
|
|
139
|
+
FROM pg_class c JOIN pg_namespace n ON n.oid = c.relnamespace
|
|
140
|
+
WHERE n.nspname = ${schema} AND c.relname = ${table}`;
|
|
141
|
+
if (found?.readable !== true)
|
|
142
|
+
return yield* refuse(`role ${role} cannot read ${schema}.${table}; grant it`);
|
|
143
|
+
if (writable && !found.writable)
|
|
144
|
+
return yield* refuse(`role ${role} cannot read and write ${schema}.${table}; grant it`);
|
|
145
|
+
});
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { SqlError } from "effect/sql";
|
|
2
|
+
/**
|
|
3
|
+
* Whether a SQL failure is worth retrying unchanged: the driver says so, or
|
|
4
|
+
* the server refused the statement for its own state. SQLSTATE `57P01`–`57P03`
|
|
5
|
+
* mean an administrator or crash shutdown or a server still starting or in
|
|
6
|
+
* recovery; `53000`–`53300` cover exhausted resources, disk, memory or slots. The
|
|
7
|
+
* driver reports those as unknown, non-retryable errors, but the same
|
|
8
|
+
* statement succeeds once the server is back.
|
|
9
|
+
*/
|
|
10
|
+
export declare const transientSqlError: (error: SqlError.SqlError) => boolean;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
/** The SQLSTATE a Postgres error response carries, as the driver keeps it on the error's cause. */
|
|
3
|
+
const ServerResponse = Schema.Struct({ code: Schema.String });
|
|
4
|
+
const isServerResponse = Schema.is(ServerResponse);
|
|
5
|
+
/**
|
|
6
|
+
* Whether a SQL failure is worth retrying unchanged: the driver says so, or
|
|
7
|
+
* the server refused the statement for its own state. SQLSTATE `57P01`–`57P03`
|
|
8
|
+
* mean an administrator or crash shutdown or a server still starting or in
|
|
9
|
+
* recovery; `53000`–`53300` cover exhausted resources, disk, memory or slots. The
|
|
10
|
+
* driver reports those as unknown, non-retryable errors, but the same
|
|
11
|
+
* statement succeeds once the server is back.
|
|
12
|
+
*/
|
|
13
|
+
export const transientSqlError = (error) => {
|
|
14
|
+
if (error.isRetryable)
|
|
15
|
+
return true;
|
|
16
|
+
const cause = error.reason.cause;
|
|
17
|
+
return (isServerResponse(cause) &&
|
|
18
|
+
(cause.code === "57P01" ||
|
|
19
|
+
cause.code === "57P02" ||
|
|
20
|
+
cause.code === "57P03" ||
|
|
21
|
+
cause.code === "53000" ||
|
|
22
|
+
cause.code === "53100" ||
|
|
23
|
+
cause.code === "53200" ||
|
|
24
|
+
cause.code === "53300"));
|
|
25
|
+
};
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { Context, Duration, Effect, type Scope } from "effect";
|
|
2
|
+
import { ActorError } from "../errors/actor.ts";
|
|
3
|
+
/**
|
|
4
|
+
* Whether this runner should receive traffic. A runner is ready once its
|
|
5
|
+
* storage answers, its schemas are migrated and compatible (checked when the
|
|
6
|
+
* layer builds), it registers at least one actor, job, or query layer, its
|
|
7
|
+
* routing is up, a public runner has its currently assigned shards, and it
|
|
8
|
+
* is not draining. Readiness never waits for actors to
|
|
9
|
+
* wake or workflows to finish.
|
|
10
|
+
*/
|
|
11
|
+
export type Readiness = {
|
|
12
|
+
readonly ready: true;
|
|
13
|
+
} | {
|
|
14
|
+
readonly ready: false;
|
|
15
|
+
/**
|
|
16
|
+
* `draining` or `drained` after `drain`; `storage` when the database does
|
|
17
|
+
* not answer; `routing` while acquiring shards or once sharding has
|
|
18
|
+
* shut down; `peering` when a mutual TLS runner's certificate has
|
|
19
|
+
* expired or its credentials have failed to load for too long;
|
|
20
|
+
* `unregistered` before any actor, job, or query layer registers.
|
|
21
|
+
*/
|
|
22
|
+
readonly reason: "draining" | "drained" | "storage" | "routing" | "peering" | "unregistered";
|
|
23
|
+
};
|
|
24
|
+
/** What a drain did. */
|
|
25
|
+
export interface DrainReport {
|
|
26
|
+
/**
|
|
27
|
+
* `clean` when claims and background work stopped and every in-flight turn
|
|
28
|
+
* and job attempt finished before the deadline; `deadline-expired`
|
|
29
|
+
* otherwise, when the deadline interrupted what was still in flight.
|
|
30
|
+
*/
|
|
31
|
+
readonly outcome: "clean" | "deadline-expired";
|
|
32
|
+
/**
|
|
33
|
+
* Turns the deadline interrupted. Each rolled back, unless its commit had
|
|
34
|
+
* already been sent, in which case its receipt answers the caller's retry.
|
|
35
|
+
*/
|
|
36
|
+
readonly interruptedTurns: number;
|
|
37
|
+
/**
|
|
38
|
+
* Job attempts the deadline interrupted. The provider may have applied
|
|
39
|
+
* each call, so each stays ambiguous, and another runner takes it over once
|
|
40
|
+
* its lease ends.
|
|
41
|
+
*/
|
|
42
|
+
readonly interruptedJobs: number;
|
|
43
|
+
}
|
|
44
|
+
declare const RuntimeControl_base: Context.ServiceClass<RuntimeControl, "@rikalabs/akter/runtime/drain/RuntimeControl", {
|
|
45
|
+
readonly readiness: Effect.Effect<Readiness>;
|
|
46
|
+
/**
|
|
47
|
+
* Makes the runner unready, refuses new commands, and stops claiming
|
|
48
|
+
* intents, timers, jobs, and subscription deliveries, releasing claimed
|
|
49
|
+
* deliveries to other runners. In-flight turns and job attempts then
|
|
50
|
+
* get until `deadline` to finish before they are interrupted. Pending
|
|
51
|
+
* durable work stays in the database for other runners. The runner keeps
|
|
52
|
+
* its shards until its layer closes, which hands them to the other runners
|
|
53
|
+
* and ends workflow runs still live here, for another runner to replay; so
|
|
54
|
+
* close the layer once the drain returns. A second call waits for the
|
|
55
|
+
* first drain and returns its report.
|
|
56
|
+
*/
|
|
57
|
+
readonly drain: (options: {
|
|
58
|
+
readonly deadline: Duration.Input;
|
|
59
|
+
}) => Effect.Effect<DrainReport>;
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* Readiness and bounded graceful drain of this runner. `Actors.layer`
|
|
63
|
+
* provides it.
|
|
64
|
+
*/
|
|
65
|
+
export declare class RuntimeControl extends RuntimeControl_base {
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Admits turns until a drain closes it, counts the turns in flight, and
|
|
69
|
+
* interrupts them all once the drain's deadline passes.
|
|
70
|
+
*/
|
|
71
|
+
export declare const turnGate: () => {
|
|
72
|
+
/**
|
|
73
|
+
* Runs a turn unless the runner drains. A turn the deadline interrupts
|
|
74
|
+
* fails as unavailable once it has rolled back, so its caller retries on
|
|
75
|
+
* the actor's next owner.
|
|
76
|
+
*/
|
|
77
|
+
run: <A, E, R>(turn: Effect.Effect<A, E, R>) => Effect.Effect<A, E | ActorError, R>;
|
|
78
|
+
readonly open: boolean;
|
|
79
|
+
/** Refuses new turns and waits until none is in flight. */
|
|
80
|
+
close: Effect.Effect<void, never, never>;
|
|
81
|
+
/**
|
|
82
|
+
* Refuses new turns, interrupts every turn in flight, and returns how many
|
|
83
|
+
* it interrupted, once they have ended.
|
|
84
|
+
*/
|
|
85
|
+
expire: Effect.Effect<number, never, never>;
|
|
86
|
+
};
|
|
87
|
+
/** The turn gate a runtime creates once and shares with its drain. */
|
|
88
|
+
export type TurnGate = ReturnType<typeof turnGate>;
|
|
89
|
+
/** The runtime's side of a drain: its relay and background work. */
|
|
90
|
+
interface Drainable {
|
|
91
|
+
readonly gate: TurnGate;
|
|
92
|
+
/** Stops claims and releases claimed deliveries. */
|
|
93
|
+
readonly stopClaims: Effect.Effect<void>;
|
|
94
|
+
readonly attemptsIdle: Effect.Effect<void>;
|
|
95
|
+
/** Interrupts running job attempts and returns how many. */
|
|
96
|
+
readonly interruptAttempts: Effect.Effect<number>;
|
|
97
|
+
/** Stops background maintenance such as retention sweeps. */
|
|
98
|
+
readonly stopBackground: Effect.Effect<void>;
|
|
99
|
+
/** Readiness apart from draining. */
|
|
100
|
+
readonly serving: Effect.Effect<Readiness>;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* The drain runs in the runtime's scope, so a caller that stops waiting
|
|
104
|
+
* neither cancels it nor leaves a later caller without its report.
|
|
105
|
+
*
|
|
106
|
+
* The deadline counts from the call and covers stopping claims and background
|
|
107
|
+
* work too: releasing a claimed delivery or ending a sweep writes to the
|
|
108
|
+
* database, which a slow or contended database can hold for longer than the
|
|
109
|
+
* deadline. That stop runs on in the runtime's scope, so claims still end,
|
|
110
|
+
* while the deadline interrupts the turns and job attempts in flight and
|
|
111
|
+
* the report says it expired.
|
|
112
|
+
*/
|
|
113
|
+
export declare const runtimeControl: ({ scope, ...runtime }: Drainable & {
|
|
114
|
+
readonly scope: Scope.Scope;
|
|
115
|
+
}) => {
|
|
116
|
+
readonly readiness: Effect.Effect<Readiness>;
|
|
117
|
+
/**
|
|
118
|
+
* Makes the runner unready, refuses new commands, and stops claiming
|
|
119
|
+
* intents, timers, jobs, and subscription deliveries, releasing claimed
|
|
120
|
+
* deliveries to other runners. In-flight turns and job attempts then
|
|
121
|
+
* get until `deadline` to finish before they are interrupted. Pending
|
|
122
|
+
* durable work stays in the database for other runners. The runner keeps
|
|
123
|
+
* its shards until its layer closes, which hands them to the other runners
|
|
124
|
+
* and ends workflow runs still live here, for another runner to replay; so
|
|
125
|
+
* close the layer once the drain returns. A second call waits for the
|
|
126
|
+
* first drain and returns its report.
|
|
127
|
+
*/
|
|
128
|
+
readonly drain: (options: {
|
|
129
|
+
readonly deadline: Duration.Input;
|
|
130
|
+
}) => Effect.Effect<DrainReport>;
|
|
131
|
+
};
|
|
132
|
+
export {};
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Context, Deferred, Duration, Effect, Exit, Fiber, Option } from "effect";
|
|
2
|
+
import { ActorError, ActorUnavailable } from "../errors/actor.js";
|
|
3
|
+
/**
|
|
4
|
+
* Readiness and bounded graceful drain of this runner. `Actors.layer`
|
|
5
|
+
* provides it.
|
|
6
|
+
*/
|
|
7
|
+
export class RuntimeControl extends Context.Service()("@rikalabs/akter/runtime/drain/RuntimeControl") {
|
|
8
|
+
}
|
|
9
|
+
const refused = () => ActorError.make({
|
|
10
|
+
reason: ActorUnavailable.make({ cause: new Error("Runner is draining") }),
|
|
11
|
+
});
|
|
12
|
+
/**
|
|
13
|
+
* Admits turns until a drain closes it, counts the turns in flight, and
|
|
14
|
+
* interrupts them all once the drain's deadline passes.
|
|
15
|
+
*/
|
|
16
|
+
export const turnGate = () => {
|
|
17
|
+
let open = true;
|
|
18
|
+
let inFlight = 0;
|
|
19
|
+
let interrupted = 0;
|
|
20
|
+
let idle;
|
|
21
|
+
const expired = Deferred.makeUnsafe();
|
|
22
|
+
const deadline = Deferred.await(expired).pipe(Effect.andThen(Effect.suspend(() => {
|
|
23
|
+
interrupted += 1;
|
|
24
|
+
return Effect.fail(refused());
|
|
25
|
+
})));
|
|
26
|
+
return {
|
|
27
|
+
/**
|
|
28
|
+
* Runs a turn unless the runner drains. A turn the deadline interrupts
|
|
29
|
+
* fails as unavailable once it has rolled back, so its caller retries on
|
|
30
|
+
* the actor's next owner.
|
|
31
|
+
*/
|
|
32
|
+
run: (turn) => Effect.suspend(() => {
|
|
33
|
+
if (!open)
|
|
34
|
+
return Effect.fail(refused());
|
|
35
|
+
inFlight += 1;
|
|
36
|
+
return Effect.raceFirst(turn, deadline).pipe(Effect.ensuring(Effect.sync(() => {
|
|
37
|
+
inFlight -= 1;
|
|
38
|
+
if (inFlight === 0 && idle !== undefined)
|
|
39
|
+
Deferred.doneUnsafe(idle, Exit.void);
|
|
40
|
+
})));
|
|
41
|
+
}),
|
|
42
|
+
get open() {
|
|
43
|
+
return open;
|
|
44
|
+
},
|
|
45
|
+
/** Refuses new turns and waits until none is in flight. */
|
|
46
|
+
close: Effect.suspend(() => {
|
|
47
|
+
open = false;
|
|
48
|
+
if (inFlight === 0)
|
|
49
|
+
return Effect.void;
|
|
50
|
+
idle ??= Deferred.makeUnsafe();
|
|
51
|
+
return Deferred.await(idle);
|
|
52
|
+
}),
|
|
53
|
+
/**
|
|
54
|
+
* Refuses new turns, interrupts every turn in flight, and returns how many
|
|
55
|
+
* it interrupted, once they have ended.
|
|
56
|
+
*/
|
|
57
|
+
expire: Effect.suspend(() => {
|
|
58
|
+
open = false;
|
|
59
|
+
Deferred.doneUnsafe(expired, Exit.void);
|
|
60
|
+
if (inFlight > 0)
|
|
61
|
+
idle ??= Deferred.makeUnsafe();
|
|
62
|
+
return (idle === undefined ? Effect.void : Deferred.await(idle)).pipe(Effect.map(() => interrupted));
|
|
63
|
+
}),
|
|
64
|
+
};
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* The drain runs in the runtime's scope, so a caller that stops waiting
|
|
68
|
+
* neither cancels it nor leaves a later caller without its report.
|
|
69
|
+
*
|
|
70
|
+
* The deadline counts from the call and covers stopping claims and background
|
|
71
|
+
* work too: releasing a claimed delivery or ending a sweep writes to the
|
|
72
|
+
* database, which a slow or contended database can hold for longer than the
|
|
73
|
+
* deadline. That stop runs on in the runtime's scope, so claims still end,
|
|
74
|
+
* while the deadline interrupts the turns and job attempts in flight and
|
|
75
|
+
* the report says it expired.
|
|
76
|
+
*/
|
|
77
|
+
export const runtimeControl = ({ scope, ...runtime }) => {
|
|
78
|
+
let state = "serving";
|
|
79
|
+
const report = Deferred.makeUnsafe();
|
|
80
|
+
const run = (deadline) => Effect.gen(function* () {
|
|
81
|
+
const stopping = yield* runtime.stopClaims.pipe(Effect.andThen(runtime.stopBackground), Effect.forkIn(scope));
|
|
82
|
+
const finished = yield* Fiber.join(stopping).pipe(Effect.andThen(Effect.all([runtime.gate.close, runtime.attemptsIdle], {
|
|
83
|
+
concurrency: 2,
|
|
84
|
+
discard: true,
|
|
85
|
+
})), Effect.timeoutOption(deadline));
|
|
86
|
+
const done = Option.isSome(finished)
|
|
87
|
+
? { outcome: "clean", interruptedTurns: 0, interruptedJobs: 0 }
|
|
88
|
+
: yield* Effect.all({
|
|
89
|
+
interruptedTurns: runtime.gate.expire,
|
|
90
|
+
interruptedJobs: runtime.interruptAttempts,
|
|
91
|
+
}, { concurrency: 2 }).pipe(Effect.map((counts) => ({ outcome: "deadline-expired", ...counts })));
|
|
92
|
+
if (done.outcome === "deadline-expired")
|
|
93
|
+
yield* Effect.logWarning("Drain deadline expired; interrupted in-flight work").pipe(Effect.annotateLogs({
|
|
94
|
+
interruptedTurns: done.interruptedTurns,
|
|
95
|
+
interruptedJobs: done.interruptedJobs,
|
|
96
|
+
}));
|
|
97
|
+
state = "drained";
|
|
98
|
+
yield* Deferred.succeed(report, done);
|
|
99
|
+
});
|
|
100
|
+
return RuntimeControl.of({
|
|
101
|
+
readiness: Effect.suspend(() => state === "serving" ? runtime.serving : Effect.succeed({ ready: false, reason: state })),
|
|
102
|
+
drain: (options) => Effect.suspend(() => {
|
|
103
|
+
if (state !== "serving")
|
|
104
|
+
return Deferred.await(report);
|
|
105
|
+
state = "draining";
|
|
106
|
+
return run(Duration.fromInputUnsafe(options.deadline)).pipe(Effect.forkIn(scope), Effect.andThen(Deferred.await(report)));
|
|
107
|
+
}),
|
|
108
|
+
});
|
|
109
|
+
};
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { Request } from "../request.ts";
|
|
2
|
+
/**
|
|
3
|
+
* The most commands one turn batch runs. It stays below the 64 open
|
|
4
|
+
* subtransactions past which Postgres overflows its per-backend subtransaction
|
|
5
|
+
* cache, since a batch of an actor whose handlers issue statements can hold a
|
|
6
|
+
* savepoint per command.
|
|
7
|
+
*/
|
|
8
|
+
export declare const BATCH_CAP = 32;
|
|
9
|
+
/**
|
|
10
|
+
* The most calls of one commutative reducer that one merged turn combines.
|
|
11
|
+
* Merging never waits for calls: it takes only those already waiting.
|
|
12
|
+
*/
|
|
13
|
+
export declare const MERGE_CAP = 1024;
|
|
14
|
+
/**
|
|
15
|
+
* The most command ids an activation keeps to run alone after a failed batch.
|
|
16
|
+
* An id leaves the set when its retry is taken, and a caller that never
|
|
17
|
+
* retries would otherwise leave it for the activation's lifetime. Past the
|
|
18
|
+
* cap the oldest go first: an evicted id's late retry may join a batch again,
|
|
19
|
+
* which a retryable failure makes safe.
|
|
20
|
+
*/
|
|
21
|
+
export declare const ALONE_CAP: number;
|
|
22
|
+
/** Adds `ids` to `alone` as its newest entries, then drops the oldest past `ALONE_CAP`. */
|
|
23
|
+
export declare const markAlone: ({ alone, ids, }: {
|
|
24
|
+
readonly alone: Set<string>;
|
|
25
|
+
readonly ids: Iterable<string>;
|
|
26
|
+
}) => void;
|
|
27
|
+
/** A waiting command, and whether its reducer merges with its neighbours. */
|
|
28
|
+
interface Mergeable {
|
|
29
|
+
readonly request: Request;
|
|
30
|
+
readonly command: {
|
|
31
|
+
readonly merge?: unknown;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** True when `next` joins a merged turn of `previous`'s commutative reducer. */
|
|
35
|
+
export declare const merges: ({ previous, next, }: {
|
|
36
|
+
readonly previous: Mergeable;
|
|
37
|
+
readonly next: Mergeable;
|
|
38
|
+
}) => boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Removes the next batch from the front of `waiting`, in delivery order: the
|
|
41
|
+
* first command, then each command behind it that is already waiting, up to
|
|
42
|
+
* `BATCH_CAP` turns. Consecutive calls of one commutative reducer are one
|
|
43
|
+
* merged turn of up to `MERGE_CAP` calls. Nothing waits for more to arrive. A
|
|
44
|
+
* command joins a batch only once its own `queued` hook has finished, so the
|
|
45
|
+
* batch stops at the first command that is still in it, and takes nothing when
|
|
46
|
+
* that is the first.
|
|
47
|
+
*
|
|
48
|
+
* A batch stops before a command id it already holds, so a retry queued
|
|
49
|
+
* behind its original resolves through the receipt the original commits. It
|
|
50
|
+
* also stops before a command listed in `alone`, and such a command runs in a
|
|
51
|
+
* batch of its own, once: these are the commands of a batch that failed, run
|
|
52
|
+
* one per transaction until each has been processed.
|
|
53
|
+
*/
|
|
54
|
+
export declare const takeBatch: <W extends Mergeable & {
|
|
55
|
+
/** Set once the request's `queued` hook has finished. */
|
|
56
|
+
readonly queued: boolean;
|
|
57
|
+
}>({ waiting, alone, }: {
|
|
58
|
+
readonly waiting: Array<W>;
|
|
59
|
+
readonly alone: Set<string>;
|
|
60
|
+
}) => Array<W>;
|
|
61
|
+
/**
|
|
62
|
+
* One activation handler's waiting commands in arrival order, and its
|
|
63
|
+
* worker's wake-up. A command is offered as Cluster delivers it and becomes
|
|
64
|
+
* takeable once its `queued` hook finished; the wake-up stays open while the
|
|
65
|
+
* front command is takeable, so the worker never sleeps past ready work and a
|
|
66
|
+
* command whose hook is still running holds back every command behind it.
|
|
67
|
+
* `alone` outlives the handler: it holds the ids of a failed batch, each run
|
|
68
|
+
* in a transaction of its own once.
|
|
69
|
+
*/
|
|
70
|
+
export declare const activationMailbox: <W extends Mergeable & {
|
|
71
|
+
queued: boolean;
|
|
72
|
+
}>(alone: Set<string>) => {
|
|
73
|
+
offer: (entry: W) => void;
|
|
74
|
+
/** Marks `entry`'s `queued` hook finished, so a batch may take it. */
|
|
75
|
+
queued: (entry: W) => void;
|
|
76
|
+
/** Waits until the front command may be takeable. */
|
|
77
|
+
await: import("effect/Effect").Effect<void, never, never>;
|
|
78
|
+
/** The next batch, possibly empty; the wake-up closes once the front command is not takeable. */
|
|
79
|
+
take: () => W[];
|
|
80
|
+
/** Puts taken commands back in front of everything that arrived since. */
|
|
81
|
+
requeue: (entries: ReadonlyArray<W>) => void;
|
|
82
|
+
/** Runs each of `ids` alone once, the next time it is taken. */
|
|
83
|
+
isolate: (ids: Iterable<string>) => void;
|
|
84
|
+
size: () => number;
|
|
85
|
+
};
|
|
86
|
+
export {};
|