@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,105 @@
|
|
|
1
|
+
import { Context, Option, Schema } from "effect";
|
|
2
|
+
/** The authenticated identity a request acts as: the `subject` its credentials name. */
|
|
3
|
+
export declare const Principal: Schema.Struct<{
|
|
4
|
+
readonly subject: Schema.NonEmptyString;
|
|
5
|
+
}>;
|
|
6
|
+
/** The identity a request acts as. */
|
|
7
|
+
export type Principal = typeof Principal.Type;
|
|
8
|
+
/** Names one actor: the `tenant` that owns it, its definition name as `actor`, and its `id`. */
|
|
9
|
+
export declare const ActorRef: Schema.Struct<{
|
|
10
|
+
readonly tenant: Schema.NonEmptyString;
|
|
11
|
+
readonly actor: Schema.NonEmptyString;
|
|
12
|
+
readonly id: Schema.NonEmptyString;
|
|
13
|
+
}>;
|
|
14
|
+
/** The identity of one actor. */
|
|
15
|
+
export type ActorRef = typeof ActorRef.Type;
|
|
16
|
+
/** A caller authenticated as the principal `subject`. */
|
|
17
|
+
export declare const User: Schema.TaggedStruct<"User", {
|
|
18
|
+
readonly subject: Schema.NonEmptyString;
|
|
19
|
+
}>;
|
|
20
|
+
/** A caller that presented no credentials, as `Actor.auth.none` resolves every served request. */
|
|
21
|
+
export declare const Anonymous: Schema.TaggedStruct<"Anonymous", {}>;
|
|
22
|
+
/** Where a minted actor id came from: the minting command and its position in that turn. */
|
|
23
|
+
export declare const MintProof: Schema.Struct<{
|
|
24
|
+
readonly commandId: Schema.String;
|
|
25
|
+
readonly ordinal: Schema.Int;
|
|
26
|
+
}>;
|
|
27
|
+
/** Proof that a minted actor id was derived by a parent's turn. */
|
|
28
|
+
export type MintProof = typeof MintProof.Type;
|
|
29
|
+
/**
|
|
30
|
+
* A caller the framework creates for its own deliveries, and the caller of
|
|
31
|
+
* code that runs in the application's own process. `source` names the
|
|
32
|
+
* mechanism (the process itself, an actor's intent, a timer, cron, a workflow,
|
|
33
|
+
* a job route, or a subscription), `ref` the actor that sent it, and
|
|
34
|
+
* `onBehalfOf` the principal of the turn that caused it. `mint` is set only on
|
|
35
|
+
* a minted child's creating intent, and proves the child's id was derived by
|
|
36
|
+
* its parent.
|
|
37
|
+
*/
|
|
38
|
+
export declare const System: Schema.TaggedStruct<"System", {
|
|
39
|
+
readonly source: Schema.Literals<readonly ["process", "actor", "timer", "cron", "workflow", "job", "subscription"]>;
|
|
40
|
+
readonly ref: Schema.optional<Schema.Struct<{
|
|
41
|
+
readonly tenant: Schema.NonEmptyString;
|
|
42
|
+
readonly actor: Schema.NonEmptyString;
|
|
43
|
+
readonly id: Schema.NonEmptyString;
|
|
44
|
+
}>>;
|
|
45
|
+
readonly onBehalfOf: Schema.optional<Schema.Struct<{
|
|
46
|
+
readonly subject: Schema.NonEmptyString;
|
|
47
|
+
}>>;
|
|
48
|
+
readonly mint: Schema.optional<Schema.Struct<{
|
|
49
|
+
readonly commandId: Schema.String;
|
|
50
|
+
readonly ordinal: Schema.Int;
|
|
51
|
+
}>>;
|
|
52
|
+
}>;
|
|
53
|
+
/** Who is calling: a `User`, `Anonymous`, or `System`. Tagged on `_tag`; `Caller.match` is exhaustive. */
|
|
54
|
+
export declare const Caller: Schema.toTaggedUnion<"_tag", readonly [Schema.TaggedStruct<"User", {
|
|
55
|
+
readonly subject: Schema.NonEmptyString;
|
|
56
|
+
}>, Schema.TaggedStruct<"Anonymous", {}>, Schema.TaggedStruct<"System", {
|
|
57
|
+
readonly source: Schema.Literals<readonly ["process", "actor", "timer", "cron", "workflow", "job", "subscription"]>;
|
|
58
|
+
readonly ref: Schema.optional<Schema.Struct<{
|
|
59
|
+
readonly tenant: Schema.NonEmptyString;
|
|
60
|
+
readonly actor: Schema.NonEmptyString;
|
|
61
|
+
readonly id: Schema.NonEmptyString;
|
|
62
|
+
}>>;
|
|
63
|
+
readonly onBehalfOf: Schema.optional<Schema.Struct<{
|
|
64
|
+
readonly subject: Schema.NonEmptyString;
|
|
65
|
+
}>>;
|
|
66
|
+
readonly mint: Schema.optional<Schema.Struct<{
|
|
67
|
+
readonly commandId: Schema.String;
|
|
68
|
+
readonly ordinal: Schema.Int;
|
|
69
|
+
}>>;
|
|
70
|
+
}>]>;
|
|
71
|
+
/** A `User`, `Anonymous`, or `System` caller. */
|
|
72
|
+
export type Caller = typeof Caller.Type;
|
|
73
|
+
/**
|
|
74
|
+
* The ambient caller. Code running in the application's own process, outside
|
|
75
|
+
* any turn and not through `Actor.serve`, is the trusted `System` caller with
|
|
76
|
+
* source `"process"`; the transport sets it for a served request, and
|
|
77
|
+
* `Actor.as(caller)` scopes another around an Effect.
|
|
78
|
+
*/
|
|
79
|
+
export declare const CurrentCaller: Context.Reference<{
|
|
80
|
+
readonly _tag: "Anonymous";
|
|
81
|
+
} | {
|
|
82
|
+
readonly _tag: "System";
|
|
83
|
+
readonly source: "actor" | "cron" | "job" | "process" | "subscription" | "timer" | "workflow";
|
|
84
|
+
readonly ref?: {
|
|
85
|
+
readonly tenant: string;
|
|
86
|
+
readonly actor: string;
|
|
87
|
+
readonly id: string;
|
|
88
|
+
} | undefined;
|
|
89
|
+
readonly onBehalfOf?: {
|
|
90
|
+
readonly subject: string;
|
|
91
|
+
} | undefined;
|
|
92
|
+
readonly mint?: {
|
|
93
|
+
readonly commandId: string;
|
|
94
|
+
readonly ordinal: number;
|
|
95
|
+
} | undefined;
|
|
96
|
+
} | {
|
|
97
|
+
readonly _tag: "User";
|
|
98
|
+
readonly subject: string;
|
|
99
|
+
}>;
|
|
100
|
+
/** The ambient tenant, `"default"` unless the transport sets one for a served request or `Actor.tenant(tenant)` scopes another around an Effect. */
|
|
101
|
+
export declare const Tenant: Context.Reference<string>;
|
|
102
|
+
/** The principal a caller acts as: a user's own, or the one a system caller acts on behalf of; none otherwise. */
|
|
103
|
+
export declare const principal: (caller: Caller) => Option.Option<Principal>;
|
|
104
|
+
/** A string that is equal for two callers exactly when they are the same caller, mint proof included. */
|
|
105
|
+
export declare const callerKey: (caller: Caller) => string;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { Context, Option, Schema } from "effect";
|
|
2
|
+
/** The authenticated identity a request acts as: the `subject` its credentials name. */
|
|
3
|
+
export const Principal = Schema.Struct({ subject: Schema.NonEmptyString });
|
|
4
|
+
/** Names one actor: the `tenant` that owns it, its definition name as `actor`, and its `id`. */
|
|
5
|
+
export const ActorRef = Schema.Struct({
|
|
6
|
+
tenant: Schema.NonEmptyString,
|
|
7
|
+
actor: Schema.NonEmptyString,
|
|
8
|
+
id: Schema.NonEmptyString,
|
|
9
|
+
});
|
|
10
|
+
/** A caller authenticated as the principal `subject`. */
|
|
11
|
+
export const User = Schema.TaggedStruct("User", { subject: Schema.NonEmptyString });
|
|
12
|
+
/** A caller that presented no credentials, as `Actor.auth.none` resolves every served request. */
|
|
13
|
+
export const Anonymous = Schema.TaggedStruct("Anonymous", {});
|
|
14
|
+
/** Where a minted actor id came from: the minting command and its position in that turn. */
|
|
15
|
+
export const MintProof = Schema.Struct({
|
|
16
|
+
commandId: Schema.String,
|
|
17
|
+
ordinal: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),
|
|
18
|
+
});
|
|
19
|
+
/**
|
|
20
|
+
* A caller the framework creates for its own deliveries, and the caller of
|
|
21
|
+
* code that runs in the application's own process. `source` names the
|
|
22
|
+
* mechanism (the process itself, an actor's intent, a timer, cron, a workflow,
|
|
23
|
+
* a job route, or a subscription), `ref` the actor that sent it, and
|
|
24
|
+
* `onBehalfOf` the principal of the turn that caused it. `mint` is set only on
|
|
25
|
+
* a minted child's creating intent, and proves the child's id was derived by
|
|
26
|
+
* its parent.
|
|
27
|
+
*/
|
|
28
|
+
export const System = Schema.TaggedStruct("System", {
|
|
29
|
+
source: Schema.Literals(["process", "actor", "timer", "cron", "workflow", "job", "subscription"]),
|
|
30
|
+
ref: Schema.optional(ActorRef),
|
|
31
|
+
onBehalfOf: Schema.optional(Principal),
|
|
32
|
+
mint: Schema.optional(MintProof),
|
|
33
|
+
});
|
|
34
|
+
/** Who is calling: a `User`, `Anonymous`, or `System`. Tagged on `_tag`; `Caller.match` is exhaustive. */
|
|
35
|
+
export const Caller = Schema.Union([User, Anonymous, System]).pipe(Schema.toTaggedUnion("_tag"));
|
|
36
|
+
/**
|
|
37
|
+
* The ambient caller. Code running in the application's own process, outside
|
|
38
|
+
* any turn and not through `Actor.serve`, is the trusted `System` caller with
|
|
39
|
+
* source `"process"`; the transport sets it for a served request, and
|
|
40
|
+
* `Actor.as(caller)` scopes another around an Effect.
|
|
41
|
+
*/
|
|
42
|
+
export const CurrentCaller = Context.Reference("akter/CurrentCaller", {
|
|
43
|
+
defaultValue: () => System.make({ source: "process" }),
|
|
44
|
+
});
|
|
45
|
+
/** The ambient tenant, `"default"` unless the transport sets one for a served request or `Actor.tenant(tenant)` scopes another around an Effect. */
|
|
46
|
+
export const Tenant = Context.Reference("akter/Tenant", {
|
|
47
|
+
defaultValue: () => "default",
|
|
48
|
+
});
|
|
49
|
+
/** The principal a caller acts as: a user's own, or the one a system caller acts on behalf of; none otherwise. */
|
|
50
|
+
export const principal = (caller) => Caller.match(caller, {
|
|
51
|
+
User: ({ subject }) => Option.some(Principal.make({ subject })),
|
|
52
|
+
Anonymous: () => Option.none(),
|
|
53
|
+
System: ({ onBehalfOf }) => Option.fromUndefinedOr(onBehalfOf),
|
|
54
|
+
});
|
|
55
|
+
/** A string that is equal for two callers exactly when they are the same caller, mint proof included. */
|
|
56
|
+
export const callerKey = (caller) => JSON.stringify(Caller.match(caller, {
|
|
57
|
+
User: ({ subject }) => ["User", subject],
|
|
58
|
+
Anonymous: () => ["Anonymous"],
|
|
59
|
+
System: ({ source, ref, onBehalfOf, mint }) => {
|
|
60
|
+
const key = [
|
|
61
|
+
"System",
|
|
62
|
+
source,
|
|
63
|
+
ref === undefined ? null : [ref.tenant, ref.actor, ref.id],
|
|
64
|
+
onBehalfOf?.subject ?? null,
|
|
65
|
+
];
|
|
66
|
+
return mint === undefined ? key : [...key, [mint.commandId, mint.ordinal]];
|
|
67
|
+
},
|
|
68
|
+
}));
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The id of a parent-placed actor: `c1.<byte length of parent>.<parent>.<local>`.
|
|
3
|
+
* The length prefix keeps the form unambiguous when the parent id contains
|
|
4
|
+
* `.` or is itself a child id, so routing never needs a lookup.
|
|
5
|
+
*/
|
|
6
|
+
export declare const childId: ({ parent, local }: {
|
|
7
|
+
readonly parent: string;
|
|
8
|
+
readonly local: string;
|
|
9
|
+
}) => string;
|
|
10
|
+
/**
|
|
11
|
+
* Splits a child id into its parent and local parts, or `undefined` when it is
|
|
12
|
+
* not one. The parent must end on a character boundary and be followed by
|
|
13
|
+
* `.`, and only the canonical `childId` form of its parts is accepted.
|
|
14
|
+
*/
|
|
15
|
+
export declare const parseChildId: (id: string) => {
|
|
16
|
+
readonly parent: string;
|
|
17
|
+
readonly local: string;
|
|
18
|
+
} | undefined;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
const utf8 = new TextEncoder();
|
|
2
|
+
const strict = new TextDecoder("utf-8", { fatal: true });
|
|
3
|
+
const PREFIX = "c1.";
|
|
4
|
+
/**
|
|
5
|
+
* A decimal byte count with no leading zero, then `.`. Every `childId` output
|
|
6
|
+
* parses, including one with an empty part: the parent's and child's key
|
|
7
|
+
* schemas decide whether a part is valid.
|
|
8
|
+
*/
|
|
9
|
+
const LENGTH = /^(?:0|[1-9][0-9]{0,9})\./;
|
|
10
|
+
/**
|
|
11
|
+
* The id of a parent-placed actor: `c1.<byte length of parent>.<parent>.<local>`.
|
|
12
|
+
* The length prefix keeps the form unambiguous when the parent id contains
|
|
13
|
+
* `.` or is itself a child id, so routing never needs a lookup.
|
|
14
|
+
*/
|
|
15
|
+
export const childId = ({ parent, local }) => `${PREFIX}${utf8.encode(parent).byteLength}.${parent}.${local}`;
|
|
16
|
+
/**
|
|
17
|
+
* Splits a child id into its parent and local parts, or `undefined` when it is
|
|
18
|
+
* not one. The parent must end on a character boundary and be followed by
|
|
19
|
+
* `.`, and only the canonical `childId` form of its parts is accepted.
|
|
20
|
+
*/
|
|
21
|
+
export const parseChildId = (id) => {
|
|
22
|
+
if (!id.startsWith(PREFIX))
|
|
23
|
+
return undefined;
|
|
24
|
+
const length = LENGTH.exec(id.slice(PREFIX.length))?.[0];
|
|
25
|
+
if (length === undefined)
|
|
26
|
+
return undefined;
|
|
27
|
+
const bytes = utf8.encode(id.slice(PREFIX.length + length.length));
|
|
28
|
+
const size = Number(length.slice(0, -1));
|
|
29
|
+
if (bytes.byteLength < size + 1 || bytes[size] !== 0x2e)
|
|
30
|
+
return undefined;
|
|
31
|
+
try {
|
|
32
|
+
const parent = strict.decode(bytes.subarray(0, size));
|
|
33
|
+
const local = strict.decode(bytes.subarray(size + 1));
|
|
34
|
+
return childId({ parent, local }) === id ? { parent, local } : undefined;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return undefined;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { Context, Schema } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* A client-issued command id: `v1.<issuedAt>.<expiresAt>.<uuid v4>`, with both
|
|
4
|
+
* times in epoch milliseconds on the database clock.
|
|
5
|
+
*/
|
|
6
|
+
export declare const CommandId: Schema.String;
|
|
7
|
+
/** The explicit command id for the command calls it is provided to, set by `Actor.commandId(id)`; undefined lets each call mint its own. */
|
|
8
|
+
export declare const CurrentCommandId: Context.Reference<string | undefined>;
|
|
9
|
+
/**
|
|
10
|
+
* Every id a receipt may carry: an external id, or a framework delivery id
|
|
11
|
+
* derived from the durable record it delivers, whose version-8 digest no
|
|
12
|
+
* caller can present because external admission accepts only version 4.
|
|
13
|
+
*/
|
|
14
|
+
export declare const InternalCommandId: Schema.String;
|
|
15
|
+
/** The issue and expiry times, in epoch milliseconds, encoded in a command id. */
|
|
16
|
+
export declare const commandTimes: (id: string) => {
|
|
17
|
+
issuedAt: number;
|
|
18
|
+
expiresAt: number;
|
|
19
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Context, Schema } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* A client-issued command id: `v1.<issuedAt>.<expiresAt>.<uuid v4>`, with both
|
|
4
|
+
* times in epoch milliseconds on the database clock.
|
|
5
|
+
*/
|
|
6
|
+
export const CommandId = Schema.String.check(Schema.isPattern(/^v1\.[1-9]\d{0,14}\.[1-9]\d{0,14}\.[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/));
|
|
7
|
+
/** The explicit command id for the command calls it is provided to, set by `Actor.commandId(id)`; undefined lets each call mint its own. */
|
|
8
|
+
export const CurrentCommandId = Context.Reference("akter/CurrentCommandId", {
|
|
9
|
+
defaultValue: () => undefined,
|
|
10
|
+
});
|
|
11
|
+
/**
|
|
12
|
+
* Every id a receipt may carry: an external id, or a framework delivery id
|
|
13
|
+
* derived from the durable record it delivers, whose version-8 digest no
|
|
14
|
+
* caller can present because external admission accepts only version 4.
|
|
15
|
+
*/
|
|
16
|
+
export const InternalCommandId = Schema.String.check(Schema.isPattern(/^v1\.[1-9]\d{0,14}\.[1-9]\d{0,14}\.[0-9a-f]{8}-[0-9a-f]{4}-[48][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/));
|
|
17
|
+
/** The issue and expiry times, in epoch milliseconds, encoded in a command id. */
|
|
18
|
+
export const commandTimes = (id) => {
|
|
19
|
+
const parts = InternalCommandId.make(id).split(".");
|
|
20
|
+
return { issuedAt: Number(parts[1]), expiresAt: Number(parts[2]) };
|
|
21
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { Context, Effect } from "effect";
|
|
2
|
+
export interface ConnectionCommands {
|
|
3
|
+
/** Hex of 32 random bytes the holder minted at open; never stored or shown to handlers. */
|
|
4
|
+
readonly secret: string;
|
|
5
|
+
readonly seq: number;
|
|
6
|
+
readonly issuedAt: number;
|
|
7
|
+
readonly expiresAt: number;
|
|
8
|
+
}
|
|
9
|
+
/** Mints the id of one call from a connection handler, given its target actor key and command tag. */
|
|
10
|
+
export declare const CurrentConnectionCommands: Context.Reference<((target: string, command: string) => Effect.Effect<string>) | undefined>;
|
|
11
|
+
/**
|
|
12
|
+
* The id of the `index`th call a connection handler makes while handling frame
|
|
13
|
+
* `seq`: HMAC-SHA256 of the call under the connection's secret, shaped as a
|
|
14
|
+
* version-4 UUID so it matches every other command id. The call's parts are
|
|
15
|
+
* length-prefixed before hashing, so no two calls encode to the same message.
|
|
16
|
+
*/
|
|
17
|
+
export declare const connectionCommandId: ({ commands, index, target, command, }: {
|
|
18
|
+
readonly commands: ConnectionCommands;
|
|
19
|
+
readonly index: number;
|
|
20
|
+
readonly target: string;
|
|
21
|
+
readonly command: string;
|
|
22
|
+
}) => Effect.Effect<string, never, never>;
|
|
23
|
+
/** Hex-encodes the random bytes a holder mints as a connection's `ConnectionCommands.secret`. */
|
|
24
|
+
export declare const connectionSecret: (bytes: Uint8Array) => string;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Context, Effect } from "effect";
|
|
2
|
+
/** Mints the id of one call from a connection handler, given its target actor key and command tag. */
|
|
3
|
+
export const CurrentConnectionCommands = Context.Reference("akter/CurrentConnectionCommands", { defaultValue: () => undefined });
|
|
4
|
+
const hex = (bytes) => Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
5
|
+
const fromHex = (value) => Uint8Array.from(value.match(/../g) ?? [], (pair) => Number.parseInt(pair, 16));
|
|
6
|
+
/**
|
|
7
|
+
* The id of the `index`th call a connection handler makes while handling frame
|
|
8
|
+
* `seq`: HMAC-SHA256 of the call under the connection's secret, shaped as a
|
|
9
|
+
* version-4 UUID so it matches every other command id. The call's parts are
|
|
10
|
+
* length-prefixed before hashing, so no two calls encode to the same message.
|
|
11
|
+
*/
|
|
12
|
+
export const connectionCommandId = ({ commands, index, target, command, }) => Effect.gen(function* () {
|
|
13
|
+
const subtle = globalThis.crypto.subtle;
|
|
14
|
+
const key = yield* Effect.promise(() => subtle.importKey("raw", fromHex(commands.secret), { name: "HMAC", hash: "SHA-256" }, false, [
|
|
15
|
+
"sign",
|
|
16
|
+
]));
|
|
17
|
+
const message = new TextEncoder().encode([String(commands.seq), String(index), target, command]
|
|
18
|
+
.map((part) => `${part.length}:${part}`)
|
|
19
|
+
.join(""));
|
|
20
|
+
const digest = new Uint8Array(yield* Effect.promise(() => subtle.sign("HMAC", key, message)));
|
|
21
|
+
const bytes = digest.slice(0, 16);
|
|
22
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x40;
|
|
23
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
24
|
+
const raw = hex(bytes);
|
|
25
|
+
const uuid = `${raw.slice(0, 8)}-${raw.slice(8, 12)}-${raw.slice(12, 16)}-${raw.slice(16, 20)}-${raw.slice(20)}`;
|
|
26
|
+
return `v1.${commands.issuedAt}.${commands.expiresAt}.${uuid}`;
|
|
27
|
+
});
|
|
28
|
+
/** Hex-encodes the random bytes a holder mints as a connection's `ConnectionCommands.secret`. */
|
|
29
|
+
export const connectionSecret = (bytes) => hex(bytes);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
/**
|
|
3
|
+
* A reference to uploaded content. `grant` is the capability: it is bound to
|
|
4
|
+
* the tenant, the hash, and the size, and expires. Knowing only the hash grants nothing.
|
|
5
|
+
*/
|
|
6
|
+
export declare const ContentRef: Schema.Struct<{
|
|
7
|
+
readonly hash: Schema.String;
|
|
8
|
+
readonly size: Schema.Int;
|
|
9
|
+
readonly grant: Schema.String;
|
|
10
|
+
}>;
|
|
11
|
+
/** An uploaded content's hash, size, and grant. */
|
|
12
|
+
export type ContentRef = typeof ContentRef.Type;
|
|
13
|
+
/** One reference an actor holds under a content blob. */
|
|
14
|
+
export interface ContentEntry {
|
|
15
|
+
readonly name: string;
|
|
16
|
+
readonly hash: string;
|
|
17
|
+
readonly size: number;
|
|
18
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Schema } from "effect";
|
|
2
|
+
/** Hex SHA-256 of a content's bytes, computed by the server, never supplied by a client. */
|
|
3
|
+
const ContentHash = Schema.String.check(Schema.isPattern(/^[0-9a-f]{64}$/u));
|
|
4
|
+
/**
|
|
5
|
+
* A reference to uploaded content. `grant` is the capability: it is bound to
|
|
6
|
+
* the tenant, the hash, and the size, and expires. Knowing only the hash grants nothing.
|
|
7
|
+
*/
|
|
8
|
+
export const ContentRef = Schema.Struct({
|
|
9
|
+
hash: ContentHash,
|
|
10
|
+
size: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),
|
|
11
|
+
grant: Schema.String,
|
|
12
|
+
});
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** A browser-safe SHA-256 accumulator, with Bun's native implementation when available. */
|
|
2
|
+
export declare const sha256Hasher: () => Bun.CryptoHasher | import("@noble/hashes/sha2.js")._SHA256;
|
|
3
|
+
/** Stable SHA-256 bytes shared by runtime, content references and fleet definitions. */
|
|
4
|
+
export declare const sha256Bytes: (bytes: Uint8Array) => Buffer<ArrayBufferLike> | (Uint8Array<ArrayBufferLike> & Uint8Array<ArrayBuffer>);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { sha256 } from "@noble/hashes/sha2.js";
|
|
2
|
+
/** A browser-safe SHA-256 accumulator, with Bun's native implementation when available. */
|
|
3
|
+
export const sha256Hasher = () => globalThis.Bun === undefined ? sha256.create() : new globalThis.Bun.CryptoHasher("sha256");
|
|
4
|
+
/** Stable SHA-256 bytes shared by runtime, content references and fleet definitions. */
|
|
5
|
+
export const sha256Bytes = (bytes) => sha256Hasher().update(bytes).digest();
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Effect } from "effect";
|
|
2
|
+
import { InvalidExecutionId, InvalidExecutionKey } from "../errors/workflow.ts";
|
|
3
|
+
/** Everything an execution id names: its owner, its workflow member, and its key. */
|
|
4
|
+
interface Execution {
|
|
5
|
+
readonly tenant: string;
|
|
6
|
+
readonly actor: string;
|
|
7
|
+
readonly id: string;
|
|
8
|
+
readonly workflow: string;
|
|
9
|
+
readonly key: string;
|
|
10
|
+
}
|
|
11
|
+
/** Fails `InvalidExecutionKey` unless `key` is 1 to `MAX_KEY_BYTES` UTF-8 bytes. */
|
|
12
|
+
export declare const checkExecutionKey: (key: string) => Effect.Effect<void, never, never> | Effect.Effect<never, InvalidExecutionKey, never>;
|
|
13
|
+
/**
|
|
14
|
+
* The stable id of one execution: every part that identifies it, so an id
|
|
15
|
+
* routes to its owner without a lookup. The deployment is the database, so
|
|
16
|
+
* it is not encoded. Every other part is bounded by its own schema, so only a
|
|
17
|
+
* key that overflows `MAX_EXECUTION_ID_BYTES` fails `InvalidExecutionKey`.
|
|
18
|
+
*/
|
|
19
|
+
export declare const encodeExecutionId: (execution: Execution) => Effect.Effect<string, InvalidExecutionKey, never>;
|
|
20
|
+
/**
|
|
21
|
+
* Decodes an execution id; a malformed or non-`w1.` id fails
|
|
22
|
+
* `InvalidExecutionId`. Only the canonical encoding is an id, so two strings
|
|
23
|
+
* never name one execution.
|
|
24
|
+
*/
|
|
25
|
+
export declare const decodeExecutionId: (executionId: string) => Effect.Effect<{
|
|
26
|
+
tenant: string;
|
|
27
|
+
actor: string;
|
|
28
|
+
id: string;
|
|
29
|
+
workflow: string;
|
|
30
|
+
key: string;
|
|
31
|
+
}, InvalidExecutionId, never>;
|
|
32
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { Effect, Result, Schema } from "effect";
|
|
2
|
+
import { Base64Url } from "effect/encoding";
|
|
3
|
+
import { InvalidExecutionId, InvalidExecutionKey } from "../errors/workflow.js";
|
|
4
|
+
/** Longest workflow key, in UTF-8 bytes. */
|
|
5
|
+
const MAX_KEY_BYTES = 256;
|
|
6
|
+
/** Longest execution id, in bytes. */
|
|
7
|
+
const MAX_EXECUTION_ID_BYTES = 1024;
|
|
8
|
+
const utf8 = new TextEncoder();
|
|
9
|
+
const Parts = Schema.Tuple([
|
|
10
|
+
Schema.NonEmptyString,
|
|
11
|
+
Schema.NonEmptyString,
|
|
12
|
+
Schema.NonEmptyString,
|
|
13
|
+
Schema.NonEmptyString,
|
|
14
|
+
Schema.NonEmptyString,
|
|
15
|
+
]);
|
|
16
|
+
const PartsJson = Schema.fromJsonString(Parts);
|
|
17
|
+
const decodeParts = Schema.decodeResult(PartsJson);
|
|
18
|
+
const encodeParts = (parts) => JSON.stringify(parts);
|
|
19
|
+
/** Fails `InvalidExecutionKey` unless `key` is 1 to `MAX_KEY_BYTES` UTF-8 bytes. */
|
|
20
|
+
export const checkExecutionKey = (key) => {
|
|
21
|
+
const bytes = utf8.encode(key).byteLength;
|
|
22
|
+
return bytes === 0 || bytes > MAX_KEY_BYTES
|
|
23
|
+
? Effect.fail(InvalidExecutionKey.make({ bytes }))
|
|
24
|
+
: Effect.void;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* The stable id of one execution: every part that identifies it, so an id
|
|
28
|
+
* routes to its owner without a lookup. The deployment is the database, so
|
|
29
|
+
* it is not encoded. Every other part is bounded by its own schema, so only a
|
|
30
|
+
* key that overflows `MAX_EXECUTION_ID_BYTES` fails `InvalidExecutionKey`.
|
|
31
|
+
*/
|
|
32
|
+
export const encodeExecutionId = (execution) => Effect.gen(function* () {
|
|
33
|
+
yield* checkExecutionKey(execution.key);
|
|
34
|
+
const { tenant, actor, id, workflow, key } = execution;
|
|
35
|
+
const executionId = `w1.${Base64Url.encode(encodeParts([tenant, actor, id, workflow, key]))}`;
|
|
36
|
+
if (utf8.encode(executionId).byteLength > MAX_EXECUTION_ID_BYTES)
|
|
37
|
+
return yield* InvalidExecutionKey.make({ bytes: utf8.encode(key).byteLength });
|
|
38
|
+
return executionId;
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* Decodes an execution id; a malformed or non-`w1.` id fails
|
|
42
|
+
* `InvalidExecutionId`. Only the canonical encoding is an id, so two strings
|
|
43
|
+
* never name one execution.
|
|
44
|
+
*/
|
|
45
|
+
export const decodeExecutionId = (executionId) => Effect.gen(function* () {
|
|
46
|
+
const invalid = InvalidExecutionId.make({ executionId });
|
|
47
|
+
if (!executionId.startsWith("w1.") ||
|
|
48
|
+
utf8.encode(executionId).byteLength > MAX_EXECUTION_ID_BYTES)
|
|
49
|
+
return yield* invalid;
|
|
50
|
+
const json = Base64Url.decodeString(executionId.slice(3));
|
|
51
|
+
if (Result.isFailure(json))
|
|
52
|
+
return yield* invalid;
|
|
53
|
+
const parts = decodeParts(json.success);
|
|
54
|
+
if (Result.isFailure(parts))
|
|
55
|
+
return yield* invalid;
|
|
56
|
+
const [tenant, actor, id, workflow, key] = parts.success;
|
|
57
|
+
if (utf8.encode(key).byteLength > MAX_KEY_BYTES)
|
|
58
|
+
return yield* invalid;
|
|
59
|
+
const canonical = `w1.${Base64Url.encode(encodeParts(parts.success))}`;
|
|
60
|
+
if (canonical !== executionId)
|
|
61
|
+
return yield* invalid;
|
|
62
|
+
return { tenant, actor, id, workflow, key };
|
|
63
|
+
});
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Crypto, Effect } from "effect";
|
|
2
|
+
import { type ActorRef } from "./caller.ts";
|
|
3
|
+
/** What a minted id is derived from: the minting parent, the command and position in its turn, and the child's actor type. */
|
|
4
|
+
export interface MintInput {
|
|
5
|
+
/** The minting parent; a singleton parent's id is the empty string. */
|
|
6
|
+
readonly parent: ActorRef;
|
|
7
|
+
readonly commandId: string;
|
|
8
|
+
/** How many mints the turn made before this one. */
|
|
9
|
+
readonly ordinal: number;
|
|
10
|
+
/** The child's actor type. */
|
|
11
|
+
readonly child: string;
|
|
12
|
+
}
|
|
13
|
+
/** True for the lowercase UUIDv8 form `turn.mint` produces. */
|
|
14
|
+
export declare const isMintedId: (id: string) => boolean;
|
|
15
|
+
/** Length-prefixed UTF-8 fields the minted id digests, in order. */
|
|
16
|
+
export declare const mintPreimage: ({ parent, commandId, ordinal, child }: MintInput) => Uint8Array<ArrayBuffer>;
|
|
17
|
+
/** The UUIDv8 a parent turn mints for `child` at `ordinal`: the first 16 SHA-256 bytes of its preimage. */
|
|
18
|
+
export declare const deriveMintId: (input: MintInput) => Effect.Effect<string, never, Crypto.Crypto>;
|
|
19
|
+
/**
|
|
20
|
+
* True when `caller` is the framework's creating intent for the minted actor
|
|
21
|
+
* `target`. A parent-placed target, whose parent type is `parent`, is minted
|
|
22
|
+
* only by the parent its id names, and only its local part is derived. A
|
|
23
|
+
* singleton parent digests an empty id, and its ref alone cannot tell it from
|
|
24
|
+
* a keyed parent whose id is `singleton`, so both digests are accepted; one
|
|
25
|
+
* actor type is never both.
|
|
26
|
+
*/
|
|
27
|
+
export declare const provesMint: (caller: {
|
|
28
|
+
readonly _tag: "Anonymous";
|
|
29
|
+
} | {
|
|
30
|
+
readonly _tag: "System";
|
|
31
|
+
readonly source: "actor" | "cron" | "job" | "process" | "subscription" | "timer" | "workflow";
|
|
32
|
+
readonly ref?: {
|
|
33
|
+
readonly tenant: string;
|
|
34
|
+
readonly actor: string;
|
|
35
|
+
readonly id: string;
|
|
36
|
+
} | undefined;
|
|
37
|
+
readonly onBehalfOf?: {
|
|
38
|
+
readonly subject: string;
|
|
39
|
+
} | undefined;
|
|
40
|
+
readonly mint?: {
|
|
41
|
+
readonly commandId: string;
|
|
42
|
+
readonly ordinal: number;
|
|
43
|
+
} | undefined;
|
|
44
|
+
} | {
|
|
45
|
+
readonly _tag: "User";
|
|
46
|
+
readonly subject: string;
|
|
47
|
+
}, target: {
|
|
48
|
+
readonly tenant: string;
|
|
49
|
+
readonly actor: string;
|
|
50
|
+
readonly id: string;
|
|
51
|
+
}, parent?: string | undefined) => Effect.Effect<boolean, never, Crypto.Crypto>;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { Crypto, Effect, Schema } from "effect";
|
|
2
|
+
import { System } from "./caller.js";
|
|
3
|
+
import { parseChildId } from "./child.js";
|
|
4
|
+
/**
|
|
5
|
+
* The digest's domain string. It predates the Akter name and stays as it is,
|
|
6
|
+
* because every minted id already stored was derived with it.
|
|
7
|
+
*/
|
|
8
|
+
const DOMAIN = "durable-actors/mint/v1";
|
|
9
|
+
const SINGLETON_ID = "singleton";
|
|
10
|
+
const utf8 = new TextEncoder();
|
|
11
|
+
const MINTED = /^[0-9a-f]{8}-[0-9a-f]{4}-8[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/;
|
|
12
|
+
/** True for the lowercase UUIDv8 form `turn.mint` produces. */
|
|
13
|
+
export const isMintedId = (id) => MINTED.test(id);
|
|
14
|
+
/** Length-prefixed UTF-8 fields the minted id digests, in order. */
|
|
15
|
+
export const mintPreimage = ({ parent, commandId, ordinal, child }) => {
|
|
16
|
+
const fields = [
|
|
17
|
+
DOMAIN,
|
|
18
|
+
parent.tenant,
|
|
19
|
+
parent.actor,
|
|
20
|
+
parent.id,
|
|
21
|
+
commandId,
|
|
22
|
+
String(ordinal),
|
|
23
|
+
child,
|
|
24
|
+
].map((field) => utf8.encode(field));
|
|
25
|
+
const bytes = new Uint8Array(fields.reduce((size, field) => size + 4 + field.byteLength, 0));
|
|
26
|
+
const view = new DataView(bytes.buffer);
|
|
27
|
+
let offset = 0;
|
|
28
|
+
for (const field of fields) {
|
|
29
|
+
view.setUint32(offset, field.byteLength);
|
|
30
|
+
bytes.set(field, offset + 4);
|
|
31
|
+
offset += 4 + field.byteLength;
|
|
32
|
+
}
|
|
33
|
+
return bytes;
|
|
34
|
+
};
|
|
35
|
+
/** The UUIDv8 a parent turn mints for `child` at `ordinal`: the first 16 SHA-256 bytes of its preimage. */
|
|
36
|
+
export const deriveMintId = Effect.fnUntraced(function* (input) {
|
|
37
|
+
const digest = yield* (yield* Crypto.Crypto)
|
|
38
|
+
.digest("SHA-256", mintPreimage(input))
|
|
39
|
+
.pipe(Effect.orDie);
|
|
40
|
+
const bytes = digest.slice(0, 16);
|
|
41
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x80;
|
|
42
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
43
|
+
const hex = Array.from(bytes, (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
44
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
45
|
+
});
|
|
46
|
+
/**
|
|
47
|
+
* True when `caller` is the framework's creating intent for the minted actor
|
|
48
|
+
* `target`. A parent-placed target, whose parent type is `parent`, is minted
|
|
49
|
+
* only by the parent its id names, and only its local part is derived. A
|
|
50
|
+
* singleton parent digests an empty id, and its ref alone cannot tell it from
|
|
51
|
+
* a keyed parent whose id is `singleton`, so both digests are accepted; one
|
|
52
|
+
* actor type is never both.
|
|
53
|
+
*/
|
|
54
|
+
export const provesMint = Effect.fnUntraced(function* (caller, target, parent) {
|
|
55
|
+
if (!Schema.is(System)(caller) ||
|
|
56
|
+
caller.source === "cron" ||
|
|
57
|
+
caller.source === "workflow" ||
|
|
58
|
+
caller.source === "job")
|
|
59
|
+
return false;
|
|
60
|
+
const { ref, mint } = caller;
|
|
61
|
+
if (ref === undefined || mint === undefined || ref.tenant !== target.tenant)
|
|
62
|
+
return false;
|
|
63
|
+
const parts = parent === undefined ? undefined : parseChildId(target.id);
|
|
64
|
+
if (parent !== undefined && (parts?.parent !== ref.id || ref.actor !== parent))
|
|
65
|
+
return false;
|
|
66
|
+
const id = parts?.local ?? target.id;
|
|
67
|
+
const derives = (minter) => deriveMintId({
|
|
68
|
+
parent: minter,
|
|
69
|
+
commandId: mint.commandId,
|
|
70
|
+
ordinal: mint.ordinal,
|
|
71
|
+
child: target.actor,
|
|
72
|
+
});
|
|
73
|
+
if ((yield* derives(ref)) === id)
|
|
74
|
+
return true;
|
|
75
|
+
return ref.id === SINGLETON_ID && (yield* derives({ ...ref, id: "" })) === id;
|
|
76
|
+
});
|