@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,35 @@
|
|
|
1
|
+
import { HttpRouter } from "effect/http";
|
|
2
|
+
import { DefectLog } from "../telemetry/defects.ts";
|
|
3
|
+
import type { OperatorAuth } from "./auth.ts";
|
|
4
|
+
import { OperatorRuntime } from "./repair.ts";
|
|
5
|
+
/** Options for serving the operator routes. */
|
|
6
|
+
export interface OperatorsOptions<R> {
|
|
7
|
+
/** Authenticates every operator request to a grant; an `Actor.auth` provider is not accepted. */
|
|
8
|
+
readonly auth: OperatorAuth<R>;
|
|
9
|
+
/** Prefix for every route. Default `"/operator"`. */
|
|
10
|
+
readonly basePath?: `/${string}`;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Serves the operator routes on the application's `HttpRouter`. Every
|
|
14
|
+
* request is authenticated to an operator grant, checked against the one
|
|
15
|
+
* capability its action and resource need, and recorded in the operator
|
|
16
|
+
* audit log: a repair in its own transaction, a read before it is answered,
|
|
17
|
+
* and a refusal by scope as `"denied"`. A browser page on another origin is
|
|
18
|
+
* refused before its credentials are read.
|
|
19
|
+
*
|
|
20
|
+
* - `GET /actors/:type/:id?tenant&limit`: `inspect`; receipt outcomes only under `receipts.read`.
|
|
21
|
+
* - `GET /actors/:type/:id/export?tenant`: `export`; the actor's seed, read-only. Answers 409 `ExportRefused` when a stored value does not decode or the actor holds too much pending work.
|
|
22
|
+
* - `GET /receipts/:type/:id/:commandId?tenant`: `receipts.read`; never runs the command.
|
|
23
|
+
* - `GET /defects?tenant&actor&sinceMs&limit`: `defects.read`; `tenant` may be `*`.
|
|
24
|
+
* - `POST /dead-letters/:jobId/retry` `{ tenant, actorType, actorId, reason, providerChecked? }`: `dead-letters.retry`.
|
|
25
|
+
* - `POST /dead-letters/:jobId/discard` `{ tenant, actorType, actorId, reason }`: `dead-letters.discard`.
|
|
26
|
+
* - `POST /subscriptions/skip` `{ tenant, sourceType, sourceId, subscriberType, subscription, subscriberId, through, reason }`: `subscriptions.skip`, scoped to the source actor.
|
|
27
|
+
* - `GET /subscriptions/lagging?tenant&minAttempts&limit`: `inspect`, tenant-wide; failing subscription rows with their lag and last error.
|
|
28
|
+
* - `GET /audit?tenant&limit`: `audit.read`; `tenant` may be `*`.
|
|
29
|
+
*/
|
|
30
|
+
declare const serve: <R = never>(options: OperatorsOptions<R>) => import("effect/Layer").Layer<never, never, DefectLog | HttpRouter.HttpRouter | OperatorRuntime | Exclude<R, import("effect/Scope").Scope> | Exclude<HttpRouter.Request.From<"Requires", Exclude<Exclude<R, R>, HttpRouter.Provided>>, import("effect/Scope").Scope>>;
|
|
31
|
+
/** Operator route constructors; `serve` mounts the routes. */
|
|
32
|
+
export declare const Operators: {
|
|
33
|
+
serve: typeof serve;
|
|
34
|
+
};
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { Effect, Match, Option, Schema } from "effect";
|
|
2
|
+
import { HttpRouter, HttpServerRequest, HttpServerResponse } from "effect/http";
|
|
3
|
+
import { ActorError, Unauthorized } from "../../errors/actor.js";
|
|
4
|
+
import { invalidInput, undecodable } from "../../serve/wire.js";
|
|
5
|
+
import { foundOrNotFound, notFoundResponse, operatorResponse, refuseCrossOrigin, } from "../inspector/http.js";
|
|
6
|
+
import { DefectLog } from "../telemetry/defects.js";
|
|
7
|
+
import { authorizing } from "./grants.js";
|
|
8
|
+
import { OperatorRuntime } from "./repair.js";
|
|
9
|
+
/** The most rows one list returns. */
|
|
10
|
+
const MAX_ROWS = 1000;
|
|
11
|
+
const Tenant = Schema.NonEmptyString;
|
|
12
|
+
const Limit = Schema.FiniteFromString.check(Schema.isInt(), Schema.isBetween({ minimum: 1, maximum: MAX_ROWS }));
|
|
13
|
+
const ActorParams = Schema.Struct({ type: Schema.NonEmptyString, id: Schema.NonEmptyString });
|
|
14
|
+
const ReceiptParams = Schema.Struct({
|
|
15
|
+
type: Schema.NonEmptyString,
|
|
16
|
+
id: Schema.NonEmptyString,
|
|
17
|
+
commandId: Schema.NonEmptyString,
|
|
18
|
+
});
|
|
19
|
+
const JobParams = Schema.Struct({ jobId: Schema.NonEmptyString });
|
|
20
|
+
const PageQuery = Schema.Struct({ tenant: Tenant, limit: Schema.optional(Limit) });
|
|
21
|
+
const TenantQuery = Schema.Struct({ tenant: Tenant });
|
|
22
|
+
const DefectsQuery = Schema.Struct({
|
|
23
|
+
tenant: Tenant,
|
|
24
|
+
actor: Schema.optional(Schema.NonEmptyString),
|
|
25
|
+
sinceMs: Schema.optional(Schema.FiniteFromString.check(Schema.isInt())),
|
|
26
|
+
limit: Schema.optional(Limit),
|
|
27
|
+
});
|
|
28
|
+
/** Rows that failed this many deliveries in a row count as lagging. */
|
|
29
|
+
const LAGGING_ATTEMPTS = 8;
|
|
30
|
+
const LaggingQuery = Schema.Struct({
|
|
31
|
+
tenant: Tenant,
|
|
32
|
+
minAttempts: Schema.optional(Schema.FiniteFromString.check(Schema.isInt(), Schema.isGreaterThanOrEqualTo(1))),
|
|
33
|
+
limit: Schema.optional(Limit),
|
|
34
|
+
});
|
|
35
|
+
const Reason = Schema.String.check(Schema.isMinLength(1), Schema.isMaxLength(500));
|
|
36
|
+
const DiscardBody = Schema.Struct({
|
|
37
|
+
tenant: Tenant,
|
|
38
|
+
actorType: Schema.NonEmptyString,
|
|
39
|
+
actorId: Schema.NonEmptyString,
|
|
40
|
+
reason: Reason,
|
|
41
|
+
});
|
|
42
|
+
const SkipBody = Schema.Struct({
|
|
43
|
+
tenant: Tenant,
|
|
44
|
+
sourceType: Schema.NonEmptyString,
|
|
45
|
+
sourceId: Schema.NonEmptyString,
|
|
46
|
+
subscriberType: Schema.NonEmptyString,
|
|
47
|
+
subscription: Schema.NonEmptyString,
|
|
48
|
+
subscriberId: Schema.NonEmptyString,
|
|
49
|
+
through: Schema.String.check(Schema.isPattern(/^[1-9][0-9]{0,17}$/u)),
|
|
50
|
+
reason: Reason,
|
|
51
|
+
});
|
|
52
|
+
const RetryBody = Schema.Struct({
|
|
53
|
+
...DiscardBody.fields,
|
|
54
|
+
providerChecked: Schema.optional(Schema.Boolean),
|
|
55
|
+
});
|
|
56
|
+
/** Answers a repair's result as JSON and each refusal with its own status. */
|
|
57
|
+
const repairResponse = (repair) => repair.pipe(Effect.map((result) => HttpServerResponse.jsonUnsafe(result)), Effect.catch((error) => Effect.succeed(Match.value(error).pipe(Match.tagsExhaustive({
|
|
58
|
+
OperatorNotFound: notFoundResponse,
|
|
59
|
+
ProviderOutcomeUnknown: (refused) => HttpServerResponse.jsonUnsafe(refused, { status: 409 }),
|
|
60
|
+
JobNotServed: (refused) => HttpServerResponse.jsonUnsafe(refused, { status: 503 }),
|
|
61
|
+
})))));
|
|
62
|
+
/** Decodes a JSON request body; a body that is not JSON is refused as `decode`. */
|
|
63
|
+
const decodeBody = (schema) => HttpServerRequest.schemaBodyJson(schema).pipe(Effect.catchTag("HttpServerError", () => Effect.fail(invalidInput("decode"))));
|
|
64
|
+
/**
|
|
65
|
+
* Serves the operator routes on the application's `HttpRouter`. Every
|
|
66
|
+
* request is authenticated to an operator grant, checked against the one
|
|
67
|
+
* capability its action and resource need, and recorded in the operator
|
|
68
|
+
* audit log: a repair in its own transaction, a read before it is answered,
|
|
69
|
+
* and a refusal by scope as `"denied"`. A browser page on another origin is
|
|
70
|
+
* refused before its credentials are read.
|
|
71
|
+
*
|
|
72
|
+
* - `GET /actors/:type/:id?tenant&limit`: `inspect`; receipt outcomes only under `receipts.read`.
|
|
73
|
+
* - `GET /actors/:type/:id/export?tenant`: `export`; the actor's seed, read-only. Answers 409 `ExportRefused` when a stored value does not decode or the actor holds too much pending work.
|
|
74
|
+
* - `GET /receipts/:type/:id/:commandId?tenant`: `receipts.read`; never runs the command.
|
|
75
|
+
* - `GET /defects?tenant&actor&sinceMs&limit`: `defects.read`; `tenant` may be `*`.
|
|
76
|
+
* - `POST /dead-letters/:jobId/retry` `{ tenant, actorType, actorId, reason, providerChecked? }`: `dead-letters.retry`.
|
|
77
|
+
* - `POST /dead-letters/:jobId/discard` `{ tenant, actorType, actorId, reason }`: `dead-letters.discard`.
|
|
78
|
+
* - `POST /subscriptions/skip` `{ tenant, sourceType, sourceId, subscriberType, subscription, subscriberId, through, reason }`: `subscriptions.skip`, scoped to the source actor.
|
|
79
|
+
* - `GET /subscriptions/lagging?tenant&minAttempts&limit`: `inspect`, tenant-wide; failing subscription rows with their lag and last error.
|
|
80
|
+
* - `GET /audit?tenant&limit`: `audit.read`; `tenant` may be `*`.
|
|
81
|
+
*/
|
|
82
|
+
const serve = (options) => HttpRouter.use(Effect.fnUntraced(function* (router) {
|
|
83
|
+
const basePath = (options.basePath ?? "/operator").replace(/\/+$/, "");
|
|
84
|
+
const context = yield* Effect.context();
|
|
85
|
+
const runtime = yield* OperatorRuntime;
|
|
86
|
+
const defects = yield* DefectLog;
|
|
87
|
+
const authenticate = (request) => Effect.gen(function* () {
|
|
88
|
+
yield* refuseCrossOrigin(request);
|
|
89
|
+
return yield* options.auth
|
|
90
|
+
.authenticate({
|
|
91
|
+
headers: request.headers,
|
|
92
|
+
cookies: {},
|
|
93
|
+
})
|
|
94
|
+
.pipe(Effect.provideContext(context), Effect.mapError((reason) => ActorError.make({ reason })), Effect.tapError(() => Effect.logWarning("Operator request not authenticated")));
|
|
95
|
+
});
|
|
96
|
+
const authorize = (grant, action, resource, target) => Effect.gen(function* () {
|
|
97
|
+
const entry = {
|
|
98
|
+
operator: grant.operator,
|
|
99
|
+
action,
|
|
100
|
+
tenant: resource.tenant,
|
|
101
|
+
actorType: resource.actorType,
|
|
102
|
+
actorId: resource.actorId,
|
|
103
|
+
target,
|
|
104
|
+
capability: authorizing({ grant, action, resource }),
|
|
105
|
+
};
|
|
106
|
+
if (Option.isNone(entry.capability)) {
|
|
107
|
+
yield* runtime.record(entry, "denied");
|
|
108
|
+
return yield* ActorError.make({ reason: Unauthorized.make({ code: "access_denied" }) });
|
|
109
|
+
}
|
|
110
|
+
return entry;
|
|
111
|
+
});
|
|
112
|
+
/** Authorizes a read and records it in the audit log before it is answered. */
|
|
113
|
+
const authorizeRead = (grant, action, resource, target) => authorize(grant, action, resource, target).pipe(Effect.flatMap((entry) => runtime.record(entry, "read")));
|
|
114
|
+
const route = (method, path, handle) => router.add(method, `${basePath}${path}`, (request) => authenticate(request).pipe(Effect.flatMap(handle), Effect.catchTag("SchemaError", (error) => Effect.fail(undecodable(error))), operatorResponse("Operator request failed")));
|
|
115
|
+
yield* route("GET", "/actors/:type/:id", (grant) => Effect.gen(function* () {
|
|
116
|
+
const { type, id } = yield* HttpRouter.schemaPathParams(ActorParams);
|
|
117
|
+
const { tenant, limit } = yield* HttpRouter.schemaParams(PageQuery);
|
|
118
|
+
const resource = { tenant, actorType: type, actorId: id };
|
|
119
|
+
const entry = yield* authorize(grant, "inspect", resource);
|
|
120
|
+
const outcomes = Option.isSome(authorizing({ grant, action: "receipts.read", resource }));
|
|
121
|
+
yield* runtime.record(entry, { outcomes });
|
|
122
|
+
return foundOrNotFound(yield* runtime.inspect({ ...resource, limit: limit ?? 20, outcomes }));
|
|
123
|
+
}));
|
|
124
|
+
yield* route("GET", "/actors/:type/:id/export", (grant) => Effect.gen(function* () {
|
|
125
|
+
const { type, id } = yield* HttpRouter.schemaPathParams(ActorParams);
|
|
126
|
+
const { tenant } = yield* HttpRouter.schemaParams(TenantQuery);
|
|
127
|
+
const resource = { tenant, actorType: type, actorId: id };
|
|
128
|
+
yield* authorizeRead(grant, "export", resource);
|
|
129
|
+
return yield* runtime.exportSeed(resource).pipe(Effect.map(foundOrNotFound), Effect.catchTag("ExportRefused", (refused) => Effect.succeed(HttpServerResponse.jsonUnsafe(refused, { status: 409 }))));
|
|
130
|
+
}));
|
|
131
|
+
yield* route("GET", "/receipts/:type/:id/:commandId", (grant) => Effect.gen(function* () {
|
|
132
|
+
const { type, id, commandId } = yield* HttpRouter.schemaPathParams(ReceiptParams);
|
|
133
|
+
const { tenant } = yield* HttpRouter.schemaParams(TenantQuery);
|
|
134
|
+
const resource = { tenant, actorType: type, actorId: id, commandId };
|
|
135
|
+
yield* authorizeRead(grant, "receipts.read", resource, commandId);
|
|
136
|
+
return foundOrNotFound(yield* runtime.receipt(resource));
|
|
137
|
+
}));
|
|
138
|
+
yield* route("GET", "/defects", (grant) => Effect.gen(function* () {
|
|
139
|
+
const { tenant, actor, sinceMs, limit } = yield* HttpRouter.schemaParams(DefectsQuery);
|
|
140
|
+
yield* authorizeRead(grant, "defects.read", { tenant, actorType: actor });
|
|
141
|
+
const listed = yield* defects.list({ actorType: actor, sinceMs });
|
|
142
|
+
const own = tenant === "*" ? listed : listed.filter((defect) => defect.tenant === tenant);
|
|
143
|
+
return HttpServerResponse.jsonUnsafe(own.slice(-(limit ?? MAX_ROWS)));
|
|
144
|
+
}));
|
|
145
|
+
const repair = (path, run) => route("POST", `/dead-letters/:jobId/${path}`, (grant) => Effect.gen(function* () {
|
|
146
|
+
const { jobId } = yield* HttpRouter.schemaPathParams(JobParams);
|
|
147
|
+
const body = yield* decodeBody(RetryBody);
|
|
148
|
+
const entry = yield* authorize(grant, path === "retry" ? "dead-letters.retry" : "dead-letters.discard", target(body), jobId);
|
|
149
|
+
return yield* repairResponse(run(body, jobId, { ...entry, reason: body.reason }));
|
|
150
|
+
}));
|
|
151
|
+
yield* repair("retry", (body, jobId, audit) => runtime.retry({
|
|
152
|
+
target: target(body),
|
|
153
|
+
jobId,
|
|
154
|
+
providerChecked: body.providerChecked === true,
|
|
155
|
+
audit,
|
|
156
|
+
}));
|
|
157
|
+
yield* repair("discard", (body, jobId, audit) => runtime
|
|
158
|
+
.discard({ target: target(body), jobId, audit })
|
|
159
|
+
.pipe(Effect.as({ discarded: jobId })));
|
|
160
|
+
yield* route("POST", "/subscriptions/skip", (grant) => Effect.gen(function* () {
|
|
161
|
+
const body = yield* decodeBody(SkipBody);
|
|
162
|
+
const source = { tenant: body.tenant, actorType: body.sourceType, actorId: body.sourceId };
|
|
163
|
+
const entry = yield* authorize(grant, "subscriptions.skip", source, `${body.subscriberType}.${body.subscription}/${body.subscriberId}`);
|
|
164
|
+
return yield* repairResponse(runtime.skip({
|
|
165
|
+
target: source,
|
|
166
|
+
subscriberType: body.subscriberType,
|
|
167
|
+
subscription: body.subscription,
|
|
168
|
+
subscriberId: body.subscriberId,
|
|
169
|
+
through: body.through,
|
|
170
|
+
audit: { ...entry, reason: body.reason },
|
|
171
|
+
}));
|
|
172
|
+
}));
|
|
173
|
+
yield* route("GET", "/subscriptions/lagging", (grant) => Effect.gen(function* () {
|
|
174
|
+
const { tenant, minAttempts, limit } = yield* HttpRouter.schemaParams(LaggingQuery);
|
|
175
|
+
yield* authorizeRead(grant, "inspect", { tenant });
|
|
176
|
+
return HttpServerResponse.jsonUnsafe(yield* runtime.lagging({
|
|
177
|
+
tenant,
|
|
178
|
+
minAttempts: minAttempts ?? LAGGING_ATTEMPTS,
|
|
179
|
+
limit: limit ?? 100,
|
|
180
|
+
}));
|
|
181
|
+
}));
|
|
182
|
+
yield* route("GET", "/audit", (grant) => Effect.gen(function* () {
|
|
183
|
+
const { tenant, limit } = yield* HttpRouter.schemaParams(PageQuery);
|
|
184
|
+
yield* authorizeRead(grant, "audit.read", { tenant });
|
|
185
|
+
return HttpServerResponse.jsonUnsafe(yield* runtime.audit({ tenant, limit: limit ?? 100 }));
|
|
186
|
+
}));
|
|
187
|
+
}));
|
|
188
|
+
const target = (resource) => ({ tenant: resource.tenant, actorType: resource.actorType, actorId: resource.actorId });
|
|
189
|
+
/** Operator route constructors; `serve` mounts the routes. */
|
|
190
|
+
export const Operators = { serve };
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { type Context, type Crypto, Effect, Schema } from "effect";
|
|
2
|
+
import { SqlClient } from "effect/sql";
|
|
3
|
+
import type { RegisteredJob } from "../members.ts";
|
|
4
|
+
import { ActorRef, type Caller } from "../../identity/caller.ts";
|
|
5
|
+
import { TenantScope } from "../database/tenancy.ts";
|
|
6
|
+
import { FrameworkClock } from "../turn/admission.ts";
|
|
7
|
+
import { OutboxRuntime } from "../turn/outbox.ts";
|
|
8
|
+
/** The only seed format this build writes and reads. */
|
|
9
|
+
export declare const SEED_FORMAT = 1;
|
|
10
|
+
/**
|
|
11
|
+
* One actor's exported state and pending obligations, with nothing that
|
|
12
|
+
* identifies its tenant, caller, or credentials: a seed is replayed under the
|
|
13
|
+
* tenant and caller of the test that reads it. `dueInMs` is measured from the
|
|
14
|
+
* moment of export, so a replay follows the test's own clock. `omitted` counts
|
|
15
|
+
* what the seed does not carry: receipts, events, workflow executions, dead
|
|
16
|
+
* letters, rows of the actor's owned tables, and its blob entries, so a reader
|
|
17
|
+
* can see what a replay starts without.
|
|
18
|
+
*/
|
|
19
|
+
export declare const Seed: Schema.Struct<{
|
|
20
|
+
readonly format: Schema.Literal<1>;
|
|
21
|
+
readonly actor: Schema.Struct<{
|
|
22
|
+
readonly type: Schema.NonEmptyString;
|
|
23
|
+
readonly id: Schema.NonEmptyString;
|
|
24
|
+
}>;
|
|
25
|
+
readonly created: Schema.Boolean;
|
|
26
|
+
readonly stateVersion: Schema.Int;
|
|
27
|
+
readonly state: Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>;
|
|
28
|
+
readonly intents: Schema.$Array<Schema.Struct<{
|
|
29
|
+
readonly target: Schema.Struct<{
|
|
30
|
+
readonly actor: Schema.NonEmptyString;
|
|
31
|
+
readonly id: Schema.NonEmptyString;
|
|
32
|
+
}>;
|
|
33
|
+
readonly command: Schema.NonEmptyString;
|
|
34
|
+
readonly payload: Schema.Codec<Schema.Json, Schema.Json, never, never>;
|
|
35
|
+
readonly key: Schema.optional<Schema.NonEmptyString>;
|
|
36
|
+
readonly dueInMs: Schema.Int;
|
|
37
|
+
}>>;
|
|
38
|
+
readonly jobs: Schema.$Array<Schema.Struct<{
|
|
39
|
+
readonly job: Schema.NonEmptyString;
|
|
40
|
+
readonly payload: Schema.Codec<Schema.Json, Schema.Json, never, never>;
|
|
41
|
+
readonly payloadVersion: Schema.Int;
|
|
42
|
+
readonly key: Schema.optional<Schema.NonEmptyString>;
|
|
43
|
+
readonly dueInMs: Schema.Int;
|
|
44
|
+
}>>;
|
|
45
|
+
readonly omitted: Schema.Struct<{
|
|
46
|
+
readonly receipts: Schema.Int;
|
|
47
|
+
readonly events: Schema.Int;
|
|
48
|
+
readonly workflows: Schema.Int;
|
|
49
|
+
readonly deadLetters: Schema.Int;
|
|
50
|
+
readonly tableRows: Schema.Int;
|
|
51
|
+
readonly blobs: Schema.Int;
|
|
52
|
+
}>;
|
|
53
|
+
}>;
|
|
54
|
+
/** A decoded `Seed`. */
|
|
55
|
+
export type Seed = typeof Seed.Type;
|
|
56
|
+
/** Codec between a `Seed` and the JSON text a seed file holds. */
|
|
57
|
+
export declare const SeedJson: Schema.fromJsonString<Schema.Struct<{
|
|
58
|
+
readonly format: Schema.Literal<1>;
|
|
59
|
+
readonly actor: Schema.Struct<{
|
|
60
|
+
readonly type: Schema.NonEmptyString;
|
|
61
|
+
readonly id: Schema.NonEmptyString;
|
|
62
|
+
}>;
|
|
63
|
+
readonly created: Schema.Boolean;
|
|
64
|
+
readonly stateVersion: Schema.Int;
|
|
65
|
+
readonly state: Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>;
|
|
66
|
+
readonly intents: Schema.$Array<Schema.Struct<{
|
|
67
|
+
readonly target: Schema.Struct<{
|
|
68
|
+
readonly actor: Schema.NonEmptyString;
|
|
69
|
+
readonly id: Schema.NonEmptyString;
|
|
70
|
+
}>;
|
|
71
|
+
readonly command: Schema.NonEmptyString;
|
|
72
|
+
readonly payload: Schema.Codec<Schema.Json, Schema.Json, never, never>;
|
|
73
|
+
readonly key: Schema.optional<Schema.NonEmptyString>;
|
|
74
|
+
readonly dueInMs: Schema.Int;
|
|
75
|
+
}>>;
|
|
76
|
+
readonly jobs: Schema.$Array<Schema.Struct<{
|
|
77
|
+
readonly job: Schema.NonEmptyString;
|
|
78
|
+
readonly payload: Schema.Codec<Schema.Json, Schema.Json, never, never>;
|
|
79
|
+
readonly payloadVersion: Schema.Int;
|
|
80
|
+
readonly key: Schema.optional<Schema.NonEmptyString>;
|
|
81
|
+
readonly dueInMs: Schema.Int;
|
|
82
|
+
}>>;
|
|
83
|
+
readonly omitted: Schema.Struct<{
|
|
84
|
+
readonly receipts: Schema.Int;
|
|
85
|
+
readonly events: Schema.Int;
|
|
86
|
+
readonly workflows: Schema.Int;
|
|
87
|
+
readonly deadLetters: Schema.Int;
|
|
88
|
+
readonly tableRows: Schema.Int;
|
|
89
|
+
readonly blobs: Schema.Int;
|
|
90
|
+
}>;
|
|
91
|
+
}>>;
|
|
92
|
+
/** What the runtime's clock and outbox references hold on this runner. */
|
|
93
|
+
type ReferenceOf<T> = T extends Context.Reference<infer S> ? S : never;
|
|
94
|
+
/**
|
|
95
|
+
* Builds the operation that starts an actor from a seed, over the runtime's
|
|
96
|
+
* SQL, crypto, clock, and outbox, and its job registrations.
|
|
97
|
+
*
|
|
98
|
+
* The actor's row, state, and obligations are written in one transaction, so
|
|
99
|
+
* a refused seed leaves nothing behind. It never overwrites: an actor that
|
|
100
|
+
* already has a generation row refuses the seed. Obligations are staged
|
|
101
|
+
* through the turn's own outbox statements under the caller the test runs as,
|
|
102
|
+
* never a caller from the file, so a seed cannot carry authority. A job
|
|
103
|
+
* this runner has no executor for is refused, because it could never run.
|
|
104
|
+
* A seed marking created an actor type that declares no `createdBy` is
|
|
105
|
+
* refused: that marker stays false for such a type, or declaring the policy
|
|
106
|
+
* later would treat the seeded actor as already created.
|
|
107
|
+
*/
|
|
108
|
+
export declare const seedRuntime: (deps: {
|
|
109
|
+
readonly services: Context.Context<SqlClient.SqlClient | Crypto.Crypto>;
|
|
110
|
+
readonly clock: ReferenceOf<typeof FrameworkClock>;
|
|
111
|
+
readonly outbox: ReferenceOf<typeof OutboxRuntime>;
|
|
112
|
+
readonly jobOf: (actorType: string, job: string) => RegisteredJob | undefined;
|
|
113
|
+
/** Whether the actor type declares `createdBy`. */
|
|
114
|
+
readonly createdBy: (actorType: string) => boolean;
|
|
115
|
+
readonly wake: Effect.Effect<void>;
|
|
116
|
+
/** The tenant and adoption writer roles the operator's turns take, as the runtime's own turns do. */
|
|
117
|
+
readonly tenantScope: ReferenceOf<typeof TenantScope>;
|
|
118
|
+
}) => (args_0: {
|
|
119
|
+
readonly ref: ActorRef;
|
|
120
|
+
readonly caller: Caller;
|
|
121
|
+
readonly seed: Seed;
|
|
122
|
+
}) => Effect.Effect<undefined, never, never>;
|
|
123
|
+
export {};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { Effect, Schema } from "effect";
|
|
2
|
+
import { SqlClient, SqlError } from "effect/sql";
|
|
3
|
+
import { Due, emptyOutbox } from "../../handles/intents.js";
|
|
4
|
+
import { ActorRef } from "../../identity/caller.js";
|
|
5
|
+
import { VERSION_KEY } from "../../state/migration.js";
|
|
6
|
+
import { TenantScope, withTenant } from "../database/tenancy.js";
|
|
7
|
+
import { compress, routingKey } from "../storage/codec.js";
|
|
8
|
+
import { recordedPlacement } from "../storage/placements.js";
|
|
9
|
+
import { databaseTime, FrameworkClock } from "../turn/admission.js";
|
|
10
|
+
import { OutboxRuntime, outboxStatements } from "../turn/outbox.js";
|
|
11
|
+
/** The only seed format this build writes and reads. */
|
|
12
|
+
export const SEED_FORMAT = 1;
|
|
13
|
+
const Count = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
|
|
14
|
+
/**
|
|
15
|
+
* One actor's exported state and pending obligations, with nothing that
|
|
16
|
+
* identifies its tenant, caller, or credentials: a seed is replayed under the
|
|
17
|
+
* tenant and caller of the test that reads it. `dueInMs` is measured from the
|
|
18
|
+
* moment of export, so a replay follows the test's own clock. `omitted` counts
|
|
19
|
+
* what the seed does not carry: receipts, events, workflow executions, dead
|
|
20
|
+
* letters, rows of the actor's owned tables, and its blob entries, so a reader
|
|
21
|
+
* can see what a replay starts without.
|
|
22
|
+
*/
|
|
23
|
+
export const Seed = Schema.Struct({
|
|
24
|
+
format: Schema.Literal(SEED_FORMAT),
|
|
25
|
+
actor: Schema.Struct({ type: Schema.NonEmptyString, id: Schema.NonEmptyString }),
|
|
26
|
+
created: Schema.Boolean,
|
|
27
|
+
stateVersion: Count,
|
|
28
|
+
state: Schema.Record(Schema.String, Schema.Json),
|
|
29
|
+
intents: Schema.Array(Schema.Struct({
|
|
30
|
+
target: Schema.Struct({ actor: Schema.NonEmptyString, id: Schema.NonEmptyString }),
|
|
31
|
+
command: Schema.NonEmptyString,
|
|
32
|
+
payload: Schema.Json,
|
|
33
|
+
key: Schema.optional(Schema.NonEmptyString),
|
|
34
|
+
dueInMs: Count,
|
|
35
|
+
})),
|
|
36
|
+
jobs: Schema.Array(Schema.Struct({
|
|
37
|
+
job: Schema.NonEmptyString,
|
|
38
|
+
payload: Schema.Json,
|
|
39
|
+
payloadVersion: Count,
|
|
40
|
+
key: Schema.optional(Schema.NonEmptyString),
|
|
41
|
+
dueInMs: Count,
|
|
42
|
+
})),
|
|
43
|
+
omitted: Schema.Struct({
|
|
44
|
+
receipts: Count,
|
|
45
|
+
events: Count,
|
|
46
|
+
workflows: Count,
|
|
47
|
+
deadLetters: Count,
|
|
48
|
+
tableRows: Count,
|
|
49
|
+
blobs: Count,
|
|
50
|
+
}),
|
|
51
|
+
});
|
|
52
|
+
/** Codec between a `Seed` and the JSON text a seed file holds. */
|
|
53
|
+
export const SeedJson = Schema.fromJsonString(Seed);
|
|
54
|
+
/**
|
|
55
|
+
* Builds the operation that starts an actor from a seed, over the runtime's
|
|
56
|
+
* SQL, crypto, clock, and outbox, and its job registrations.
|
|
57
|
+
*
|
|
58
|
+
* The actor's row, state, and obligations are written in one transaction, so
|
|
59
|
+
* a refused seed leaves nothing behind. It never overwrites: an actor that
|
|
60
|
+
* already has a generation row refuses the seed. Obligations are staged
|
|
61
|
+
* through the turn's own outbox statements under the caller the test runs as,
|
|
62
|
+
* never a caller from the file, so a seed cannot carry authority. A job
|
|
63
|
+
* this runner has no executor for is refused, because it could never run.
|
|
64
|
+
* A seed marking created an actor type that declares no `createdBy` is
|
|
65
|
+
* refused: that marker stays false for such a type, or declaring the policy
|
|
66
|
+
* later would treat the seeded actor as already created.
|
|
67
|
+
*/
|
|
68
|
+
export const seedRuntime = (deps) => Effect.fnUntraced(function* ({ ref, caller, seed, }) {
|
|
69
|
+
if (seed.actor.type !== ref.actor)
|
|
70
|
+
return yield* Effect.die(new Error(`The seed is of ${seed.actor.type}, not ${ref.actor}: refusing to seed it`));
|
|
71
|
+
if (seed.created && !deps.createdBy(ref.actor))
|
|
72
|
+
return yield* Effect.die(new Error(`The seed marks ${ref.actor} created, but ${ref.actor} declares no createdBy: refusing to seed it`));
|
|
73
|
+
for (const { job } of seed.jobs)
|
|
74
|
+
if (deps.jobOf(ref.actor, job) === undefined)
|
|
75
|
+
return yield* Effect.die(new Error(`The seed has job ${job}, which ${ref.actor} does not register`));
|
|
76
|
+
const sql = yield* SqlClient.SqlClient;
|
|
77
|
+
const placement = yield* recordedPlacement(ref.actor);
|
|
78
|
+
if (placement === undefined)
|
|
79
|
+
return yield* Effect.die(new Error(`Actor ${ref.actor} is not registered`));
|
|
80
|
+
const key = routingKey({ ref, placement });
|
|
81
|
+
yield* withTenant(ref.tenant)(sql.withTransaction(Effect.gen(function* () {
|
|
82
|
+
const [inserted] = yield* sql `
|
|
83
|
+
INSERT INTO actor_generations (routing_key, tenant_id, actor_type, actor_id, created)
|
|
84
|
+
VALUES (${key}, ${ref.tenant}, ${ref.actor}, ${ref.id}, ${seed.created})
|
|
85
|
+
ON CONFLICT DO NOTHING
|
|
86
|
+
RETURNING created`;
|
|
87
|
+
if (inserted === undefined)
|
|
88
|
+
return yield* Effect.die(new Error(`${ref.actor}/${ref.id} already exists: a seed starts an actor, never overwrites one`));
|
|
89
|
+
const rows = Object.entries(seed.state).map(([name, value]) => [name, JSON.stringify(value)]);
|
|
90
|
+
if (seed.stateVersion > 0)
|
|
91
|
+
rows.push([VERSION_KEY, String(seed.stateVersion)]);
|
|
92
|
+
for (const [name, value] of rows)
|
|
93
|
+
yield* sql `INSERT INTO actor_state (routing_key, tenant_id, actor_type, actor_id, key, value)
|
|
94
|
+
VALUES (${key}, ${ref.tenant}, ${ref.actor}, ${ref.id}, ${name}, ${compress(value)})`;
|
|
95
|
+
const staged = yield* outboxStatements(key, ref, {
|
|
96
|
+
...emptyOutbox,
|
|
97
|
+
intents: seed.intents.map((intent) => ({
|
|
98
|
+
target: ActorRef.make({
|
|
99
|
+
tenant: ref.tenant,
|
|
100
|
+
actor: intent.target.actor,
|
|
101
|
+
id: intent.target.id,
|
|
102
|
+
}),
|
|
103
|
+
command: intent.command,
|
|
104
|
+
payload: JSON.stringify(intent.payload),
|
|
105
|
+
caller,
|
|
106
|
+
due: Due.cases.After.make({ millis: intent.dueInMs }),
|
|
107
|
+
key: intent.key,
|
|
108
|
+
})),
|
|
109
|
+
jobs: seed.jobs.map((job) => ({
|
|
110
|
+
job: job.job,
|
|
111
|
+
payload: JSON.stringify(job.payload),
|
|
112
|
+
version: job.payloadVersion,
|
|
113
|
+
caller,
|
|
114
|
+
due: Due.cases.After.make({ millis: job.dueInMs }),
|
|
115
|
+
key: job.key,
|
|
116
|
+
capped: deps.jobOf(ref.actor, job.job)?.perActor !== undefined,
|
|
117
|
+
})),
|
|
118
|
+
}, databaseTime);
|
|
119
|
+
for (const statement of staged.statements)
|
|
120
|
+
yield* statement;
|
|
121
|
+
})));
|
|
122
|
+
yield* deps.wake;
|
|
123
|
+
}, (effect) => effect.pipe(Effect.catchIf(SqlError.isSqlError, Effect.die), Effect.provideService(FrameworkClock, deps.clock), Effect.provideService(OutboxRuntime, deps.outbox), Effect.provideService(TenantScope, deps.tenantScope), Effect.provideContext(deps.services)));
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { SqlClient } from "effect/sql";
|
|
3
|
+
import { type PayloadDeclaration } from "../../members/payload.ts";
|
|
4
|
+
/** How long a runtime's writer rows stay live without a refresh, by default. */
|
|
5
|
+
export declare const DEFAULT_WRITER_WINDOW_MS = 120000;
|
|
6
|
+
/** A stored version the deployment could not read, or a removal that would strand one. */
|
|
7
|
+
export interface PayloadProblem {
|
|
8
|
+
readonly actorType: string;
|
|
9
|
+
readonly kind: "event" | "job";
|
|
10
|
+
readonly tag: string;
|
|
11
|
+
/** What would be stranded, e.g. `version 2 recorded above this chain's current version 1`. */
|
|
12
|
+
readonly problem: string;
|
|
13
|
+
}
|
|
14
|
+
/** A one-line operator-facing description of a payload problem. */
|
|
15
|
+
export declare const formatPayloadProblem: (problem: PayloadProblem) => string;
|
|
16
|
+
/**
|
|
17
|
+
* Compares declared chains with the versions the database may hold. A
|
|
18
|
+
* version recorded above a chain's current version is a rollback past a
|
|
19
|
+
* schema change. A chain that starts above version `v` can't read values of
|
|
20
|
+
* `v`: an event version counts as stored until `durable payloads clear` marks
|
|
21
|
+
* it cleared. Every stored event has a recorded version, because a runtime
|
|
22
|
+
* records what it writes before it takes a shard and the migration refused
|
|
23
|
+
* databases that held rows before it. Job versions are read from the
|
|
24
|
+
* outbox and dead letters directly. `writers` names the actor types whose
|
|
25
|
+
* turns this deployment runs: an event tag one of them no longer declares is
|
|
26
|
+
* refused while a subscription still has undelivered events of it.
|
|
27
|
+
*/
|
|
28
|
+
export declare const findPayloadProblems: (declarations: readonly PayloadDeclaration[], writers?: readonly {
|
|
29
|
+
readonly actorType: string;
|
|
30
|
+
readonly events: ReadonlyArray<string>;
|
|
31
|
+
}[] | undefined) => Effect.Effect<PayloadProblem[], import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
32
|
+
/**
|
|
33
|
+
* Records the version each written class is written at, and marks every
|
|
34
|
+
* lower recorded version superseded. Writing a version again clears its
|
|
35
|
+
* `superseded` and `cleared` marks, since values of it are being stored anew.
|
|
36
|
+
*/
|
|
37
|
+
export declare const recordPayloadVersions: (declarations: readonly PayloadDeclaration[]) => Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
38
|
+
/** Upserts this runtime's writer row for each class it writes, stamped now, in one statement. */
|
|
39
|
+
export declare const refreshWriters: (runtimeId: string, windowMs: number, declarations: readonly PayloadDeclaration[]) => Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
40
|
+
/** Drops a stopping runtime's writer rows, so a clear need not wait out its window. */
|
|
41
|
+
export declare const dropWriters: (runtimeId: string) => Effect.Effect<void, import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
42
|
+
/** `durable payloads check`: the startup check for `actors`, read-only. */
|
|
43
|
+
export declare const checkPayloads: (actors: ReadonlyArray<object>) => Effect.Effect<PayloadProblem[], import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
|
|
44
|
+
/** What `durable payloads clear` found for one superseded event version. */
|
|
45
|
+
export interface ClearResult {
|
|
46
|
+
readonly actorType: string;
|
|
47
|
+
readonly tag: string;
|
|
48
|
+
readonly version: number;
|
|
49
|
+
/**
|
|
50
|
+
* `cleared`, or why not: a runtime refreshed a writer row for the version
|
|
51
|
+
* within its window plus the longest command timeout, or an event of the
|
|
52
|
+
* version is still stored.
|
|
53
|
+
*/
|
|
54
|
+
readonly outcome: "cleared" | "writer" | "stored";
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* `durable payloads clear`: marks each superseded event version of `actors`
|
|
58
|
+
* cleared once its retention horizon has passed, no runtime can still write
|
|
59
|
+
* it, and no event of it remains. The version row is locked first, the
|
|
60
|
+
* writer rows are read again after the scan, and each statement of the
|
|
61
|
+
* transaction reads a fresh snapshot, so a writer that registers during the
|
|
62
|
+
* scan fails the clear instead of racing it. A writer counts as live until
|
|
63
|
+
* its window and then the longest command timeout have passed.
|
|
64
|
+
*/
|
|
65
|
+
export declare const clearPayloads: (actors: ReadonlyArray<object>) => Effect.Effect<ClearResult[], import("effect/sql/SqlError").SqlError, SqlClient.SqlClient>;
|