@astrale-os/sdk 0.6.0-beta.4 → 0.6.0-beta.40
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/README.md +191 -58
- package/dist/application/action/action.d.ts +6 -0
- package/dist/application/action/authoring.d.ts +1 -1
- package/dist/application/action/context.d.ts +47 -31
- package/dist/application/action/define.d.ts +3 -3
- package/dist/application/action/index.d.ts +1 -1
- package/dist/application/define.d.ts +8 -6
- package/dist/application/define.js +28 -14
- package/dist/application/dependency/index.d.ts +1 -1
- package/dist/application/dependency/invoker.d.ts +21 -10
- package/dist/application/domain.d.ts +30 -0
- package/dist/application/index.d.ts +4 -4
- package/dist/application/index.js +1 -1
- package/dist/application/integration/define.d.ts +8 -1
- package/dist/application/integration/index.d.ts +2 -2
- package/dist/application/integration/integration.d.ts +13 -1
- package/dist/application/integration/operation.d.ts +16 -3
- package/dist/application/mutation/authoring/properties.d.ts +5 -3
- package/dist/application/mutation/authoring/properties.js +35 -2
- package/dist/application/mutation/authoring/transition.js +4 -1
- package/dist/application/mutation/execution/execute.js +1 -1
- package/dist/application/mutation/failure.d.ts +6 -0
- package/dist/application/mutation/failure.js +24 -18
- package/dist/application/mutation/index.d.ts +1 -1
- package/dist/application/query/collection/union.js +11 -4
- package/dist/application/query/composite/plan.d.ts +0 -4
- package/dist/application/query/composite/plan.js +0 -2
- package/dist/application/query/conformance.d.ts +15 -0
- package/dist/application/query/conformance.js +46 -0
- package/dist/application/query/define.js +4 -3
- package/dist/application/query/execution/execute.d.ts +0 -1
- package/dist/application/query/execution/execute.js +7 -1
- package/dist/application/query/failure.d.ts +8 -0
- package/dist/application/query/failure.js +8 -0
- package/dist/application/query/index.d.ts +1 -1
- package/dist/application/query/index.js +1 -1
- package/dist/application/routes/admission.d.ts +2 -2
- package/dist/application/routes/admission.js +1 -1
- package/dist/application/routes/route.d.ts +2 -2
- package/dist/application/runtime/actions.js +3 -0
- package/dist/application/runtime/workflows.d.ts +3 -1
- package/dist/application/runtime/workflows.js +3 -4
- package/dist/application/view/define.js +4 -6
- package/dist/application/view/frontend.d.ts +2 -2
- package/dist/application/view/index.d.ts +1 -1
- package/dist/application/view/route.d.ts +0 -14
- package/dist/application/view/route.js +1 -64
- package/dist/application/workflow/authoring.d.ts +3 -2
- package/dist/application/workflow/context.d.ts +8 -2
- package/dist/application/workflow/define.d.ts +4 -4
- package/dist/application/workflow/define.js +14 -9
- package/dist/application/workflow/durable.d.ts +185 -0
- package/dist/application/workflow/index.d.ts +3 -2
- package/dist/application/workflow/runner/inline.js +3 -4
- package/dist/application/workflow/runner/runner.d.ts +2 -2
- package/dist/application/workflow/step/output.d.ts +2 -0
- package/dist/application/workflow/step/output.js +73 -0
- package/dist/application/workflow/workflow.d.ts +5 -3
- package/dist/deployment/adapter/adapter.d.ts +55 -13
- package/dist/deployment/adapter/bundle/bundle.d.ts +36 -0
- package/dist/deployment/adapter/bundle/file.d.ts +10 -0
- package/dist/deployment/adapter/bundle/index.d.ts +2 -0
- package/dist/deployment/adapter/define.d.ts +4 -3
- package/dist/deployment/adapter/define.js +107 -23
- package/dist/deployment/adapter/index.d.ts +4 -3
- package/dist/deployment/adapter/index.js +1 -0
- package/dist/deployment/adapter/release/command.d.ts +33 -0
- package/dist/deployment/adapter/release/context.d.ts +94 -0
- package/dist/deployment/adapter/release/index.d.ts +4 -0
- package/dist/deployment/adapter/release/index.js +1 -0
- package/dist/deployment/adapter/release/list.d.ts +53 -0
- package/dist/deployment/adapter/release/list.js +1 -0
- package/dist/deployment/adapter/release/refusal.d.ts +10 -0
- package/dist/deployment/adapter/release/refusal.js +14 -0
- package/dist/deployment/adapter/release/result.d.ts +56 -0
- package/dist/deployment/adapter/release/result.js +1 -0
- package/dist/deployment/address/configuration.d.ts +96 -0
- package/dist/deployment/address/configuration.js +274 -0
- package/dist/deployment/address/fingerprint.d.ts +5 -0
- package/dist/deployment/address/fingerprint.js +27 -0
- package/dist/deployment/address/index.d.ts +5 -0
- package/dist/deployment/address/index.js +4 -0
- package/dist/deployment/address/label.d.ts +42 -0
- package/dist/deployment/address/label.js +80 -0
- package/dist/deployment/address/line.d.ts +29 -0
- package/dist/deployment/address/line.js +53 -0
- package/dist/deployment/address/record.d.ts +73 -0
- package/dist/deployment/address/record.js +138 -0
- package/dist/deployment/address/summary.d.ts +30 -0
- package/dist/deployment/address/summary.js +1 -0
- package/dist/deployment/address/vectors.d.ts +60 -0
- package/dist/deployment/address/vectors.js +517 -0
- package/dist/deployment/authoring.d.ts +0 -2
- package/dist/deployment/authoring.js +0 -1
- package/dist/deployment/build/build.d.ts +8 -2
- package/dist/deployment/build/compile.d.ts +4 -4
- package/dist/deployment/build/compile.js +19 -17
- package/dist/deployment/build/frontend/compilation.d.ts +2 -4
- package/dist/deployment/build/frontend/compilation.js +0 -5
- package/dist/deployment/build/frontend/digest.js +1 -5
- package/dist/deployment/build/index.d.ts +1 -0
- package/dist/deployment/build/index.js +1 -0
- package/dist/deployment/build/manifest.d.ts +59 -0
- package/dist/deployment/build/manifest.js +118 -0
- package/dist/deployment/build/material.d.ts +2 -2
- package/dist/deployment/build/material.js +28 -13
- package/dist/deployment/build/schema.d.ts +2 -2
- package/dist/deployment/deployment.d.ts +3 -2
- package/dist/deployment/environment.d.ts +6 -0
- package/dist/deployment/environment.js +6 -0
- package/dist/deployment/index.d.ts +4 -6
- package/dist/deployment/index.js +1 -2
- package/dist/deployment/release/addressing.d.ts +6 -5
- package/dist/deployment/release/addressing.js +2 -3
- package/dist/deployment/release/assemble.d.ts +6 -3
- package/dist/deployment/release/assemble.js +12 -10
- package/dist/deployment/release/release.d.ts +16 -5
- package/dist/deployment/release/seal.d.ts +14 -0
- package/dist/deployment/release/seal.js +22 -0
- package/dist/deployment/release/{publication → served}/callables.d.ts +2 -2
- package/dist/deployment/release/{publication → served}/callables.js +2 -2
- package/dist/deployment/release/served/index.d.ts +11 -0
- package/dist/deployment/release/served/index.js +26 -0
- package/dist/deployment/release/{publication → served}/views.d.ts +2 -2
- package/dist/deployment/release/{publication → served}/views.js +0 -1
- package/dist/deployment/runtime/admission.d.ts +2 -2
- package/dist/deployment/runtime/admission.js +5 -5
- package/dist/deployment/verify/index.d.ts +3 -4
- package/dist/deployment/verify/index.js +2 -3
- package/dist/deployment/verify/preflight/bundle.d.ts +18 -0
- package/dist/deployment/verify/preflight/bundle.js +71 -0
- package/dist/deployment/verify/preflight/index.d.ts +1 -12
- package/dist/deployment/verify/preflight/index.js +1 -12
- package/dist/deployment/verify/readiness/fetch.d.ts +13 -0
- package/dist/deployment/verify/readiness/fetch.js +26 -0
- package/dist/deployment/verify/readiness/identity.d.ts +3 -6
- package/dist/deployment/verify/readiness/identity.js +3 -3
- package/dist/deployment/verify/readiness/index.d.ts +15 -8
- package/dist/deployment/verify/readiness/index.js +25 -6
- package/dist/deployment/verify/readiness/release.d.ts +8 -0
- package/dist/deployment/verify/readiness/release.js +22 -0
- package/dist/deployment/worker/address.d.ts +26 -0
- package/dist/deployment/worker/address.js +43 -0
- package/dist/deployment/worker/build.d.ts +60 -0
- package/dist/deployment/worker/build.js +172 -0
- package/dist/deployment/worker/configuration.d.ts +73 -0
- package/dist/deployment/worker/configuration.js +165 -0
- package/dist/deployment/worker/content.d.ts +38 -0
- package/dist/deployment/worker/content.js +169 -0
- package/dist/deployment/worker/index.d.ts +29 -0
- package/dist/deployment/worker/index.js +29 -0
- package/dist/deployment/worker/limits.d.ts +30 -0
- package/dist/deployment/worker/limits.js +30 -0
- package/dist/deployment/worker/record.d.ts +29 -0
- package/dist/deployment/worker/record.js +69 -0
- package/dist/deployment/worker/request.d.ts +118 -0
- package/dist/deployment/worker/request.js +280 -0
- package/dist/deployment/worker/response.d.ts +101 -0
- package/dist/deployment/worker/response.js +207 -0
- package/dist/execution/cache/cache.d.ts +17 -0
- package/dist/execution/cache/cache.js +11 -0
- package/dist/execution/cache/index.d.ts +2 -0
- package/dist/execution/cache/index.js +2 -0
- package/dist/execution/cache/memory.d.ts +13 -0
- package/dist/execution/cache/memory.js +48 -0
- package/dist/execution/identity/authentication.d.ts +33 -3
- package/dist/execution/identity/authentication.js +90 -36
- package/dist/execution/identity/callback.d.ts +20 -20
- package/dist/execution/identity/callback.js +34 -26
- package/dist/execution/identity/delivery.d.ts +6 -4
- package/dist/execution/identity/delivery.js +25 -20
- package/dist/execution/identity/identity.d.ts +17 -3
- package/dist/execution/identity/identity.js +12 -4
- package/dist/execution/identity/jwks.d.ts +5 -0
- package/dist/execution/identity/jwks.js +92 -102
- package/dist/execution/index.d.ts +6 -4
- package/dist/execution/index.js +4 -2
- package/dist/execution/invocation/admission/age.d.ts +57 -0
- package/dist/execution/invocation/admission/age.js +208 -0
- package/dist/execution/invocation/admission/authentication.d.ts +13 -13
- package/dist/execution/invocation/admission/authentication.js +52 -44
- package/dist/execution/invocation/admission/authority.d.ts +28 -6
- package/dist/execution/invocation/admission/authority.js +9 -2
- package/dist/execution/invocation/admission/index.d.ts +4 -3
- package/dist/execution/invocation/admission/index.js +3 -2
- package/dist/execution/invocation/admission/input.d.ts +2 -2
- package/dist/execution/invocation/admission/input.js +16 -2
- package/dist/execution/invocation/admission/target.d.ts +11 -0
- package/dist/execution/invocation/admission/target.js +22 -3
- package/dist/execution/invocation/capabilities/bind.d.ts +11 -0
- package/dist/execution/invocation/capabilities/bind.js +25 -0
- package/dist/execution/invocation/capabilities/index.d.ts +1 -0
- package/dist/execution/invocation/capabilities/index.js +1 -0
- package/dist/execution/invocation/dependency/bind.d.ts +3 -1
- package/dist/execution/invocation/dependency/bind.js +36 -16
- package/dist/execution/invocation/dispatch/context.d.ts +7 -6
- package/dist/execution/invocation/dispatch/context.js +11 -44
- package/dist/execution/invocation/dispatch/workflow.js +0 -4
- package/dist/execution/invocation/handler.js +8 -2
- package/dist/execution/invocation/index.d.ts +2 -2
- package/dist/execution/invocation/index.js +1 -1
- package/dist/execution/invocation/integration/authentication.d.ts +3 -3
- package/dist/execution/invocation/integration/authentication.js +7 -7
- package/dist/execution/invocation/integration/call.d.ts +2 -1
- package/dist/execution/invocation/integration/call.js +3 -3
- package/dist/execution/invocation/integration/clients.d.ts +1 -1
- package/dist/execution/invocation/integration/index.d.ts +1 -0
- package/dist/execution/invocation/integration/index.js +1 -0
- package/dist/execution/invocation/invocation.d.ts +6 -0
- package/dist/execution/invocation/invocation.js +129 -21
- package/dist/execution/invocation/lifecycle/active.d.ts +8 -2
- package/dist/execution/invocation/lifecycle/active.js +3 -3
- package/dist/execution/invocation/lifecycle/index.d.ts +1 -1
- package/dist/execution/invocation/result/errors.d.ts +0 -10
- package/dist/execution/invocation/result/errors.js +0 -17
- package/dist/execution/invocation/result/index.d.ts +2 -2
- package/dist/execution/invocation/result/index.js +1 -1
- package/dist/execution/invocation/result/project.js +41 -1
- package/dist/execution/node/serve.d.ts +2 -2
- package/dist/execution/node/serve.js +1 -1
- package/dist/execution/runtime/index.d.ts +1 -0
- package/dist/execution/runtime/index.js +1 -0
- package/dist/execution/runtime/load.d.ts +3 -3
- package/dist/execution/runtime/load.js +3 -2
- package/dist/execution/runtime/release.d.ts +17 -0
- package/dist/execution/runtime/release.js +7 -0
- package/dist/execution/serve.d.ts +18 -4
- package/dist/execution/serve.js +10 -0
- package/dist/execution/service/create.js +43 -7
- package/dist/execution/service/initialization.d.ts +4 -4
- package/dist/execution/service/initialization.js +23 -14
- package/dist/execution/service/release.d.ts +2 -2
- package/dist/execution/service/release.js +3 -2
- package/dist/execution/service/service.d.ts +20 -5
- package/dist/execution/service/serving/delivery.d.ts +5 -0
- package/dist/execution/service/{publication → serving}/delivery.js +4 -1
- package/dist/execution/service/{publication → serving}/index.d.ts +1 -1
- package/dist/execution/service/serving/installation.d.ts +4 -0
- package/dist/execution/service/serving/installation.js +9 -0
- package/dist/execution/service/serving/source.d.ts +11 -0
- package/dist/execution/service/serving/source.js +15 -0
- package/dist/execution/workflows/discovery.d.ts +14 -0
- package/dist/execution/workflows/discovery.js +151 -0
- package/dist/execution/workflows/engine.d.ts +89 -0
- package/dist/execution/workflows/engine.js +1 -0
- package/dist/execution/workflows/envelope.d.ts +12 -0
- package/dist/execution/workflows/envelope.js +46 -0
- package/dist/execution/workflows/failure.d.ts +46 -0
- package/dist/execution/workflows/failure.js +160 -0
- package/dist/execution/workflows/index.d.ts +4 -0
- package/dist/execution/workflows/index.js +3 -0
- package/dist/execution/workflows/integrations.d.ts +13 -0
- package/dist/execution/workflows/integrations.js +25 -0
- package/dist/execution/workflows/options.d.ts +66 -0
- package/dist/execution/workflows/options.js +148 -0
- package/dist/execution/workflows/receiver.d.ts +24 -0
- package/dist/execution/workflows/receiver.js +99 -0
- package/dist/execution/workflows/route.d.ts +12 -0
- package/dist/execution/workflows/route.js +35 -0
- package/dist/execution/workflows/run.d.ts +21 -0
- package/dist/execution/workflows/run.js +321 -0
- package/dist/execution/workflows/steps.d.ts +42 -0
- package/dist/execution/workflows/steps.js +67 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.js +2 -2
- package/dist/platform/graph/alias.d.ts +1 -5
- package/dist/platform/graph/alias.js +1 -5
- package/dist/platform/graph/document/index.d.ts +1 -1
- package/dist/platform/graph/document/index.js +1 -1
- package/dist/platform/graph/index.d.ts +1 -1
- package/dist/platform/graph/index.js +1 -1
- package/dist/platform/release/index.d.ts +2 -0
- package/dist/platform/release/index.js +2 -0
- package/dist/platform/schema/callable-authoring.d.ts +21 -0
- package/dist/platform/schema/callable-authoring.js +27 -0
- package/dist/platform/schema/class-authoring.d.ts +61 -11
- package/dist/platform/schema/class-authoring.js +37 -4
- package/dist/platform/schema/class-icon-svg.d.ts +9 -0
- package/dist/platform/schema/class-icon-svg.js +29 -0
- package/dist/platform/schema/class-icon.d.ts +3 -8
- package/dist/platform/schema/class-icon.js +2 -29
- package/dist/platform/schema/index.d.ts +6 -4
- package/dist/platform/schema/index.js +2 -1
- package/dist/platform/schema/property.d.ts +5 -0
- package/dist/platform/schema/schema-authoring.d.ts +14 -7
- package/dist/platform/schema/schema-authoring.js +5 -1
- package/dist/platform/versioning/dependents.d.ts +18 -0
- package/dist/platform/versioning/dependents.js +15 -0
- package/dist/platform/versioning/index.d.ts +5 -0
- package/dist/platform/versioning/index.js +5 -0
- package/dist/platform/versioning/name.d.ts +38 -0
- package/dist/platform/versioning/name.js +58 -0
- package/dist/platform/versioning/reference.d.ts +48 -0
- package/dist/platform/versioning/reference.js +95 -0
- package/dist/platform/versioning/version.d.ts +72 -0
- package/dist/platform/versioning/version.js +98 -0
- package/dist/project/admit.js +1 -5
- package/dist/project/define.d.ts +4 -4
- package/dist/project/define.js +55 -35
- package/dist/project/index.d.ts +1 -1
- package/dist/project/install-command.d.ts +6 -0
- package/dist/project/install-command.js +9 -0
- package/dist/project/project.d.ts +10 -8
- package/dist/testing/dataset/define.d.ts +1 -1
- package/dist/testing/durable/engine.d.ts +121 -0
- package/dist/testing/durable/engine.js +614 -0
- package/dist/testing/durable/index.d.ts +3 -0
- package/dist/testing/durable/index.js +1 -0
- package/dist/testing/durable/steps.d.ts +30 -0
- package/dist/testing/durable/steps.js +40 -0
- package/dist/testing/index.d.ts +6 -1
- package/dist/testing/index.js +5 -1
- package/dist/testing/load.js +1 -1
- package/dist/tooling/cli/adapter-command.d.ts +35 -0
- package/dist/tooling/cli/adapter-command.js +66 -0
- package/dist/tooling/cli/arguments.d.ts +17 -6
- package/dist/tooling/cli/arguments.js +175 -52
- package/dist/tooling/cli/build.d.ts +55 -0
- package/dist/tooling/cli/build.js +77 -0
- package/dist/tooling/cli/bun.d.ts +0 -1
- package/dist/tooling/cli/bun.js +0 -7
- package/dist/tooling/cli/commit.d.ts +35 -0
- package/dist/tooling/cli/commit.js +235 -0
- package/dist/tooling/cli/deploy-mode.d.ts +26 -0
- package/dist/tooling/cli/deploy-mode.js +59 -0
- package/dist/tooling/cli/deploy-result.d.ts +80 -0
- package/dist/tooling/cli/deploy-result.js +64 -0
- package/dist/tooling/cli/diff/declared.d.ts +7 -0
- package/dist/tooling/cli/diff/declared.js +27 -0
- package/dist/tooling/cli/diff/index.d.ts +30 -0
- package/dist/tooling/cli/diff/index.js +58 -0
- package/dist/tooling/cli/diff/render.d.ts +15 -0
- package/dist/tooling/cli/diff/render.js +131 -0
- package/dist/tooling/cli/diff/report.d.ts +88 -0
- package/dist/tooling/cli/diff/report.js +154 -0
- package/dist/tooling/cli/dotenv.d.ts +5 -5
- package/dist/tooling/cli/dotenv.js +6 -36
- package/dist/tooling/cli/help.js +173 -60
- package/dist/tooling/cli/immutable-deployment.d.ts +83 -0
- package/dist/tooling/cli/immutable-deployment.js +135 -0
- package/dist/tooling/cli/index.d.ts +12 -4
- package/dist/tooling/cli/index.js +6 -3
- package/dist/tooling/cli/installed-on.d.ts +83 -0
- package/dist/tooling/cli/installed-on.js +156 -0
- package/dist/tooling/cli/list.d.ts +152 -0
- package/dist/tooling/cli/list.js +331 -0
- package/dist/tooling/cli/log.d.ts +5 -2
- package/dist/tooling/cli/log.js +9 -2
- package/dist/tooling/cli/orchestrate.d.ts +0 -6
- package/dist/tooling/cli/orchestrate.js +246 -90
- package/dist/tooling/cli/project.d.ts +3 -3
- package/dist/tooling/cli/publish/index.d.ts +81 -0
- package/dist/tooling/cli/publish/index.js +383 -0
- package/dist/tooling/cli/publish/report.d.ts +49 -0
- package/dist/tooling/cli/publish/report.js +15 -0
- package/dist/tooling/cli/registry/client.d.ts +121 -0
- package/dist/tooling/cli/registry/client.js +354 -0
- package/dist/tooling/cli/registry/error.d.ts +11 -0
- package/dist/tooling/cli/registry/error.js +17 -0
- package/dist/tooling/cli/registry/executable.d.ts +35 -0
- package/dist/tooling/cli/registry/executable.js +96 -0
- package/dist/tooling/cli/registry/index.d.ts +9 -0
- package/dist/tooling/cli/registry/index.js +8 -0
- package/dist/tooling/cli/registry/installations.d.ts +67 -0
- package/dist/tooling/cli/registry/installations.js +108 -0
- package/dist/tooling/cli/registry/process.d.ts +36 -0
- package/dist/tooling/cli/registry/process.js +119 -0
- package/dist/tooling/cli/secrets.d.ts +9 -0
- package/dist/tooling/cli/secrets.js +19 -0
- package/dist/tooling/cli/yank.d.ts +34 -0
- package/dist/tooling/cli/yank.js +32 -0
- package/dist/tooling/linter/adapters/typescript/imports.d.ts +0 -1
- package/dist/tooling/linter/adapters/typescript/imports.js +1 -5
- package/dist/tooling/linter/adapters/typescript/index.d.ts +1 -1
- package/dist/tooling/linter/adapters/typescript/index.js +1 -1
- package/dist/tooling/linter/adapters/typescript/syntax.d.ts +3 -3
- package/dist/tooling/linter/adapters/typescript/syntax.js +13 -25
- package/dist/tooling/linter/implementations/source/callable-requirements.d.ts +1 -2
- package/dist/tooling/linter/implementations/source/callable-requirements.js +11 -16
- package/dist/tooling/linter/implementations/source/dependencies.js +13 -72
- package/dist/tooling/linter/implementations/source/global.js +1 -2
- package/dist/tooling/linter/implementations/source/mutations.js +18 -29
- package/dist/tooling/linter/implementations/source/providers.js +5 -5
- package/dist/tooling/linter/implementations/source/queries.js +1 -17
- package/dist/tooling/linter/implementations/source/shared.d.ts +12 -4
- package/dist/tooling/linter/implementations/source/shared.js +101 -46
- package/dist/tooling/linter/implementations/source/verifiers.js +0 -2
- package/dist/tooling/linter/implementations/source/views.js +2 -2
- package/dist/tooling/linter/implementations/source/workflows.js +500 -17
- package/dist/tooling/linter/policy/generated.js +14 -63
- package/dist/tooling/linter/requirements/registry.js +6 -8
- package/dist/tooling/packaging/declarations/ownership.js +1 -1
- package/dist/tooling/packaging/finalize.d.ts +1 -1
- package/dist/tooling/packaging/finalize.js +1 -1
- package/docs/admission-age.md +88 -0
- package/docs/auth-api-migration.md +55 -0
- package/docs/business-errors.md +42 -0
- package/docs/domain-definition-migration.md +44 -0
- package/docs/domain-schema-migration.md +36 -0
- package/docs/durable-workflows.md +418 -0
- package/docs/handler-dependencies.md +213 -0
- package/docs/release.md +155 -0
- package/docs/schema-cost.md +124 -0
- package/package.json +45 -16
- package/dist/application/application.d.ts +0 -28
- package/dist/application/query/execution/projection.d.ts +0 -3
- package/dist/application/query/execution/projection.js +0 -3
- package/dist/deployment/adapter/deploy/context.d.ts +0 -15
- package/dist/deployment/adapter/deploy/index.d.ts +0 -2
- package/dist/deployment/adapter/deploy/result.d.ts +0 -50
- package/dist/deployment/adapter/prepare/artifact.d.ts +0 -33
- package/dist/deployment/adapter/prepare/context.d.ts +0 -23
- package/dist/deployment/adapter/prepare/index.d.ts +0 -2
- package/dist/deployment/deploy.d.ts +0 -20
- package/dist/deployment/deploy.js +0 -31
- package/dist/deployment/release/publication/index.d.ts +0 -6
- package/dist/deployment/release/publication/index.js +0 -6
- package/dist/deployment/release/publication/manifest.d.ts +0 -3
- package/dist/deployment/release/publication/manifest.js +0 -5
- package/dist/deployment/release/publication/requirements.d.ts +0 -3
- package/dist/deployment/release/publication/requirements.js +0 -3
- package/dist/deployment/release/publication/seal.d.ts +0 -10
- package/dist/deployment/release/publication/seal.js +0 -39
- package/dist/deployment/verify/preflight/artifact.d.ts +0 -6
- package/dist/deployment/verify/preflight/artifact.js +0 -122
- package/dist/deployment/verify/preflight/publication.d.ts +0 -4
- package/dist/deployment/verify/preflight/publication.js +0 -14
- package/dist/deployment/verify/readiness/deployment.d.ts +0 -3
- package/dist/deployment/verify/readiness/deployment.js +0 -151
- package/dist/deployment/verify/readiness/publication.d.ts +0 -11
- package/dist/deployment/verify/readiness/publication.js +0 -41
- package/dist/execution/service/errors.d.ts +0 -3
- package/dist/execution/service/errors.js +0 -3
- package/dist/execution/service/publication/delivery.d.ts +0 -2
- package/dist/execution/service/publication/installation.d.ts +0 -3
- package/dist/execution/service/publication/installation.js +0 -8
- package/dist/execution/service/publication/source.d.ts +0 -3
- package/dist/execution/service/publication/source.js +0 -11
- package/dist/platform/publication/index.d.ts +0 -2
- package/dist/platform/publication/index.js +0 -2
- package/dist/tooling/cli/astrale/authority.d.ts +0 -5
- package/dist/tooling/cli/astrale/authority.js +0 -11
- package/dist/tooling/cli/astrale/executable.d.ts +0 -2
- package/dist/tooling/cli/astrale/executable.js +0 -47
- package/dist/tooling/cli/astrale/failure.d.ts +0 -6
- package/dist/tooling/cli/astrale/failure.js +0 -48
- package/dist/tooling/cli/astrale/instance.d.ts +0 -11
- package/dist/tooling/cli/astrale/instance.js +0 -52
- package/dist/tooling/cli/astrale/process.d.ts +0 -13
- package/dist/tooling/cli/astrale/process.js +0 -94
- package/dist/tooling/cli/astrale/version.d.ts +0 -18
- package/dist/tooling/cli/astrale/version.js +0 -55
- package/dist/tooling/cli/credential.d.ts +0 -2
- package/dist/tooling/cli/credential.js +0 -57
- package/dist/tooling/cli/deprecations.d.ts +0 -9
- package/dist/tooling/cli/deprecations.js +0 -15
- package/dist/tooling/cli/development/candidate.d.ts +0 -25
- package/dist/tooling/cli/development/candidate.js +0 -176
- package/dist/tooling/cli/development/deployment.d.ts +0 -16
- package/dist/tooling/cli/development/deployment.js +0 -39
- package/dist/tooling/cli/development/develop.d.ts +0 -11
- package/dist/tooling/cli/development/develop.js +0 -243
- package/dist/tooling/cli/development/lease.d.ts +0 -18
- package/dist/tooling/cli/development/lease.js +0 -163
- package/dist/tooling/cli/development/lifecycle.d.ts +0 -9
- package/dist/tooling/cli/development/lifecycle.js +0 -43
- package/dist/tooling/cli/development/project-imports.d.ts +0 -22
- package/dist/tooling/cli/development/project-imports.js +0 -39
- package/dist/tooling/cli/development/project-lock.d.ts +0 -16
- package/dist/tooling/cli/development/project-lock.js +0 -41
- package/dist/tooling/cli/development/rebuild.d.ts +0 -13
- package/dist/tooling/cli/development/rebuild.js +0 -58
- package/dist/tooling/cli/development/release-evidence.d.ts +0 -4
- package/dist/tooling/cli/development/release-evidence.js +0 -10
- package/dist/tooling/cli/development/report.d.ts +0 -6
- package/dist/tooling/cli/development/report.js +0 -14
- package/dist/tooling/cli/development/session-file.d.ts +0 -53
- package/dist/tooling/cli/development/session-file.js +0 -337
- package/dist/tooling/cli/development/source-watch.d.ts +0 -14
- package/dist/tooling/cli/development/source-watch.js +0 -140
- package/dist/tooling/cli/development/sources.d.ts +0 -7
- package/dist/tooling/cli/development/sources.js +0 -48
- package/dist/tooling/cli/development/target-lock.d.ts +0 -16
- package/dist/tooling/cli/development/target-lock.js +0 -68
- package/dist/tooling/cli/development/view.d.ts +0 -28
- package/dist/tooling/cli/development/view.js +0 -151
- package/dist/tooling/cli/environment-release.d.ts +0 -21
- package/dist/tooling/cli/environment-release.js +0 -46
- package/dist/tooling/cli/evidence.d.ts +0 -11
- package/dist/tooling/cli/evidence.js +0 -53
- package/dist/tooling/cli/installation/index.d.ts +0 -2
- package/dist/tooling/cli/installation/index.js +0 -1
- package/dist/tooling/cli/installation/observation.d.ts +0 -10
- package/dist/tooling/cli/installation/observation.js +0 -44
- package/dist/tooling/cli/installation/reconcile.d.ts +0 -32
- package/dist/tooling/cli/installation/reconcile.js +0 -122
- package/dist/tooling/linter/implementations/source/migrations.d.ts +0 -2
- package/dist/tooling/linter/implementations/source/migrations.js +0 -113
- package/dist/tooling/linter/qualification/index.d.ts +0 -10
- package/dist/tooling/linter/qualification/index.js +0 -2
- package/dist/tooling/linter/qualification/query-fixtures.d.ts +0 -2
- package/dist/tooling/linter/qualification/query-fixtures.js +0 -68
- package/dist/tooling/linter/qualification/runner.d.ts +0 -3
- package/dist/tooling/linter/qualification/runner.js +0 -6
- /package/dist/application/{application.js → domain.js} +0 -0
- /package/dist/{deployment/adapter/deploy/context.js → application/workflow/durable.js} +0 -0
- /package/dist/deployment/adapter/{deploy/index.js → bundle/bundle.js} +0 -0
- /package/dist/deployment/adapter/{deploy/result.js → bundle/file.js} +0 -0
- /package/dist/deployment/adapter/{prepare → bundle}/index.js +0 -0
- /package/dist/deployment/adapter/{prepare/artifact.js → release/command.js} +0 -0
- /package/dist/deployment/adapter/{prepare → release}/context.js +0 -0
- /package/dist/deployment/release/{publication → served}/routes.d.ts +0 -0
- /package/dist/deployment/release/{publication → served}/routes.js +0 -0
- /package/dist/execution/service/{publication → serving}/index.js +0 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The members of the Restate SDK Fetch entrypoint the durable receiver uses, which a platform's
|
|
3
|
+
* engine module must export.
|
|
4
|
+
*/
|
|
5
|
+
export const DURABLE_ENGINE_EXPORTS = Object.freeze([
|
|
6
|
+
'createEndpointHandler',
|
|
7
|
+
'workflow',
|
|
8
|
+
'TerminalError',
|
|
9
|
+
'CancelledError',
|
|
10
|
+
'RetryableError',
|
|
11
|
+
'TimeoutError',
|
|
12
|
+
'RestatePromise',
|
|
13
|
+
]);
|
|
14
|
+
/**
|
|
15
|
+
* Whether `module` exports the members of the Restate SDK Fetch entrypoint the durable receiver
|
|
16
|
+
* uses: each a function, but `RestatePromise`, the namespace of its combinators.
|
|
17
|
+
*/
|
|
18
|
+
export function isDurableEngine(module) {
|
|
19
|
+
if (module === null || typeof module !== 'object')
|
|
20
|
+
return false;
|
|
21
|
+
return DURABLE_ENGINE_EXPORTS.every((member) => {
|
|
22
|
+
const value = Reflect.get(module, member);
|
|
23
|
+
if (member !== 'RestatePromise')
|
|
24
|
+
return typeof value === 'function';
|
|
25
|
+
return (typeof value === 'object' &&
|
|
26
|
+
value !== null &&
|
|
27
|
+
typeof Reflect.get(value, 'allSettled') === 'function');
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
const HOUR_MS = 60 * 60_000;
|
|
31
|
+
const DAY_MS = 24 * HOUR_MS;
|
|
32
|
+
const DEFAULT_ATTEMPTS = 20;
|
|
33
|
+
/** The longest attempt a Step may declare, which the engine's abort timeout leaves to end first. */
|
|
34
|
+
const MAXIMUM_STEP_TIMEOUT_MS = 10 * 60_000;
|
|
35
|
+
/**
|
|
36
|
+
* How long the engine lets an attempt run without progress before it aborts it, declared on every
|
|
37
|
+
* Workflow service. Restate's own default is ten minutes, which a ten-minute Step would race: the
|
|
38
|
+
* margin lets a Step's own timeout fail the attempt, and report it, before the engine cuts it.
|
|
39
|
+
*/
|
|
40
|
+
export const ENGINE_ABORT_TIMEOUT_MS = MAXIMUM_STEP_TIMEOUT_MS + 5 * 60_000;
|
|
41
|
+
const DEFAULT_STEP_RETRY = Object.freeze({
|
|
42
|
+
maxRetryAttempts: DEFAULT_ATTEMPTS,
|
|
43
|
+
initialRetryInterval: 1_000,
|
|
44
|
+
maxRetryInterval: 60_000,
|
|
45
|
+
retryIntervalFactor: 2,
|
|
46
|
+
});
|
|
47
|
+
/** Capture one durable serving configuration, failing closed on any gap. */
|
|
48
|
+
export function durableServing(input) {
|
|
49
|
+
if (input === null ||
|
|
50
|
+
typeof input !== 'object' ||
|
|
51
|
+
Array.isArray(input) ||
|
|
52
|
+
Reflect.ownKeys(input).some((key) => key !== 'engine' &&
|
|
53
|
+
key !== 'fetch' &&
|
|
54
|
+
key !== 'retentionMs' &&
|
|
55
|
+
key !== 'retry' &&
|
|
56
|
+
key !== 'stepTimeoutMs')) {
|
|
57
|
+
invalid('Durable serving options are invalid.');
|
|
58
|
+
}
|
|
59
|
+
const engine = input.engine;
|
|
60
|
+
if (!isDurableEngine(engine)) {
|
|
61
|
+
invalid('Durable serving requires the Restate SDK Fetch entrypoint of this platform.');
|
|
62
|
+
}
|
|
63
|
+
const fetch = input.fetch ?? globalThis.fetch.bind(globalThis);
|
|
64
|
+
if (typeof fetch !== 'function')
|
|
65
|
+
invalid('Durable serving requires Fetch for engine discovery.');
|
|
66
|
+
const step = stepServing({ retry: input.retry, timeoutMs: input.stepTimeoutMs }, { retry: DEFAULT_STEP_RETRY, timeoutMs: 60_000 });
|
|
67
|
+
return Object.freeze({
|
|
68
|
+
engine: Object.freeze({
|
|
69
|
+
createEndpointHandler: engine.createEndpointHandler.bind(engine),
|
|
70
|
+
workflow: engine.workflow.bind(engine),
|
|
71
|
+
TerminalError: engine.TerminalError,
|
|
72
|
+
CancelledError: engine.CancelledError,
|
|
73
|
+
RetryableError: engine.RetryableError,
|
|
74
|
+
TimeoutError: engine.TimeoutError,
|
|
75
|
+
RestatePromise: Object.freeze({
|
|
76
|
+
allSettled: engine.RestatePromise.allSettled.bind(engine.RestatePromise),
|
|
77
|
+
}),
|
|
78
|
+
}),
|
|
79
|
+
fetch,
|
|
80
|
+
retentionMs: bounded(input.retentionMs, 7 * DAY_MS, HOUR_MS, 365 * DAY_MS, 'retentionMs'),
|
|
81
|
+
retryPolicy: Object.freeze({
|
|
82
|
+
maxAttempts: input.retry?.maxAttempts ?? DEFAULT_ATTEMPTS,
|
|
83
|
+
onMaxAttempts: 'pause',
|
|
84
|
+
initialInterval: step.retry.initialRetryInterval,
|
|
85
|
+
maxInterval: step.retry.maxRetryInterval,
|
|
86
|
+
exponentiationFactor: step.retry.retryIntervalFactor,
|
|
87
|
+
}),
|
|
88
|
+
step,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* What one Step is held to: the retry budget and timeout it declares, in place of `fallback`'s. A
|
|
93
|
+
* declared limit replaces both limits of the fallback; an undeclared interval keeps the fallback's.
|
|
94
|
+
*/
|
|
95
|
+
export function stepServing(declared, fallback) {
|
|
96
|
+
const retry = declared.retry;
|
|
97
|
+
if (retry === undefined) {
|
|
98
|
+
return Object.freeze({
|
|
99
|
+
retry: fallback.retry,
|
|
100
|
+
timeoutMs: stepTimeout(declared.timeoutMs, fallback.timeoutMs),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (retry === null ||
|
|
104
|
+
typeof retry !== 'object' ||
|
|
105
|
+
Array.isArray(retry) ||
|
|
106
|
+
Reflect.ownKeys(retry).some((key) => key !== 'maxAttempts' &&
|
|
107
|
+
key !== 'maxDurationMs' &&
|
|
108
|
+
key !== 'initialIntervalMs' &&
|
|
109
|
+
key !== 'maxIntervalMs')) {
|
|
110
|
+
invalid('Durable retry options are invalid.');
|
|
111
|
+
}
|
|
112
|
+
const limited = retry.maxAttempts !== undefined || retry.maxDurationMs !== undefined;
|
|
113
|
+
const maxAttempts = limited
|
|
114
|
+
? optionalBounded(retry.maxAttempts, 1, 1_000, 'maxAttempts')
|
|
115
|
+
: fallback.retry.maxRetryAttempts;
|
|
116
|
+
const maxDuration = limited
|
|
117
|
+
? optionalBounded(retry.maxDurationMs, 1, 365 * DAY_MS, 'maxDurationMs')
|
|
118
|
+
: fallback.retry.maxRetryDuration;
|
|
119
|
+
const initialInterval = bounded(retry.initialIntervalMs, fallback.retry.initialRetryInterval, 1, HOUR_MS, 'initialIntervalMs');
|
|
120
|
+
const maxInterval = bounded(retry.maxIntervalMs, Math.max(fallback.retry.maxRetryInterval, initialInterval), initialInterval, DAY_MS, 'maxIntervalMs');
|
|
121
|
+
return Object.freeze({
|
|
122
|
+
retry: Object.freeze({
|
|
123
|
+
...(maxAttempts === undefined ? {} : { maxRetryAttempts: maxAttempts }),
|
|
124
|
+
...(maxDuration === undefined ? {} : { maxRetryDuration: maxDuration }),
|
|
125
|
+
initialRetryInterval: initialInterval,
|
|
126
|
+
maxRetryInterval: maxInterval,
|
|
127
|
+
retryIntervalFactor: fallback.retry.retryIntervalFactor,
|
|
128
|
+
}),
|
|
129
|
+
timeoutMs: stepTimeout(declared.timeoutMs, fallback.timeoutMs),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
function stepTimeout(input, fallback) {
|
|
133
|
+
return bounded(input, fallback, 1_000, MAXIMUM_STEP_TIMEOUT_MS, 'Step timeout');
|
|
134
|
+
}
|
|
135
|
+
function optionalBounded(input, minimum, maximum, label) {
|
|
136
|
+
return input === undefined ? undefined : bounded(input, minimum, minimum, maximum, label);
|
|
137
|
+
}
|
|
138
|
+
function bounded(input, fallback, minimum, maximum, label) {
|
|
139
|
+
if (input === undefined)
|
|
140
|
+
return fallback;
|
|
141
|
+
if (!Number.isSafeInteger(input) || input < minimum || input > maximum) {
|
|
142
|
+
invalid(`Durable ${label} must be an integer between ${minimum} and ${maximum}.`);
|
|
143
|
+
}
|
|
144
|
+
return input;
|
|
145
|
+
}
|
|
146
|
+
function invalid(message) {
|
|
147
|
+
throw new TypeError(message);
|
|
148
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { IntegrationClientFactory, Integrations } from '../../application/integration/index.js';
|
|
2
|
+
import type { RuntimeWorkflow } from '../../application/runtime/workflows.js';
|
|
3
|
+
import type { Domain } from '../../platform/schema/index.js';
|
|
4
|
+
import type { Identity } from '../identity/index.js';
|
|
5
|
+
import type { AdmittedDurableServing } from './options.js';
|
|
6
|
+
/** Serves the engine's discovery and invocations of this deployment's durable Workflows. */
|
|
7
|
+
export interface DurableReceiver {
|
|
8
|
+
fetch(request: Request): Promise<Response>;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Route `…/invoke/restate/<Kernel issuer>/<declaration key>/<service>/{discover,invoke/…}` to one
|
|
12
|
+
* engine endpoint. Routes discover
|
|
13
|
+
* their signing authority at the named Kernel; that issuer also binds the run envelope. Each
|
|
14
|
+
* endpoint serves exactly that service with the declared Workflow. A declaration this Release does not
|
|
15
|
+
* serve durably is refused, so an endpoint never runs code it does not declare.
|
|
16
|
+
*/
|
|
17
|
+
export declare function createDurableReceiver(input: {
|
|
18
|
+
readonly workflows: readonly RuntimeWorkflow[];
|
|
19
|
+
readonly domain: Domain;
|
|
20
|
+
readonly identity: Identity;
|
|
21
|
+
readonly serving: AdmittedDurableServing;
|
|
22
|
+
/** Integration clients of the initialized Runtime, which every Step holds. */
|
|
23
|
+
readonly integrations: IntegrationClientFactory<Integrations>;
|
|
24
|
+
}): DurableReceiver;
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { workflowEngineDiscovery, WorkflowEngineUnavailable } from './discovery.js';
|
|
2
|
+
import { ENGINE_ABORT_TIMEOUT_MS } from './options.js';
|
|
3
|
+
import { durableRoute } from './route.js';
|
|
4
|
+
import { durableHandlers } from './run.js';
|
|
5
|
+
import { sessionSteps } from './steps.js';
|
|
6
|
+
const MAXIMUM_ENDPOINTS = 256;
|
|
7
|
+
/**
|
|
8
|
+
* Route `…/invoke/restate/<Kernel issuer>/<declaration key>/<service>/{discover,invoke/…}` to one
|
|
9
|
+
* engine endpoint. Routes discover
|
|
10
|
+
* their signing authority at the named Kernel; that issuer also binds the run envelope. Each
|
|
11
|
+
* endpoint serves exactly that service with the declared Workflow. A declaration this Release does not
|
|
12
|
+
* serve durably is refused, so an endpoint never runs code it does not declare.
|
|
13
|
+
*/
|
|
14
|
+
export function createDurableReceiver(input) {
|
|
15
|
+
const executor = input.identity.executor;
|
|
16
|
+
if (executor === undefined) {
|
|
17
|
+
throw new TypeError('Durable Workflows require an execution Identity that can act as the Domain.');
|
|
18
|
+
}
|
|
19
|
+
const steps = sessionSteps({
|
|
20
|
+
executor: executor.bind(input.identity),
|
|
21
|
+
domain: input.domain,
|
|
22
|
+
integrations: input.integrations,
|
|
23
|
+
});
|
|
24
|
+
const declared = new Map(input.workflows
|
|
25
|
+
.filter((workflow) => workflow.durable)
|
|
26
|
+
.map((workflow) => [workflow.callable.key, workflow]));
|
|
27
|
+
const endpoints = new Map();
|
|
28
|
+
const { engine } = input.serving;
|
|
29
|
+
const discovery = workflowEngineDiscovery(input.serving.fetch);
|
|
30
|
+
return Object.freeze({
|
|
31
|
+
async fetch(request) {
|
|
32
|
+
const route = durableRoute(request);
|
|
33
|
+
if (route === undefined)
|
|
34
|
+
return refused();
|
|
35
|
+
const { kernel, declaration, service } = route;
|
|
36
|
+
const workflow = declared.get(declaration);
|
|
37
|
+
if (workflow === undefined)
|
|
38
|
+
return refused();
|
|
39
|
+
let identityKeys;
|
|
40
|
+
try {
|
|
41
|
+
identityKeys = (await discovery.resolve(kernel)).identity_keys;
|
|
42
|
+
}
|
|
43
|
+
catch (cause) {
|
|
44
|
+
if (!(cause instanceof WorkflowEngineUnavailable))
|
|
45
|
+
throw cause;
|
|
46
|
+
return unavailable();
|
|
47
|
+
}
|
|
48
|
+
request.signal.throwIfAborted();
|
|
49
|
+
const cacheKey = JSON.stringify([kernel, declaration, service, identityKeys]);
|
|
50
|
+
let endpoint = endpoints.get(cacheKey);
|
|
51
|
+
if (endpoint === undefined) {
|
|
52
|
+
const definition = engine.workflow({
|
|
53
|
+
name: service,
|
|
54
|
+
handlers: durableHandlers({
|
|
55
|
+
workflow,
|
|
56
|
+
domain: input.domain,
|
|
57
|
+
serving: input.serving,
|
|
58
|
+
steps,
|
|
59
|
+
kernel,
|
|
60
|
+
}),
|
|
61
|
+
options: {
|
|
62
|
+
workflowRetention: input.serving.retentionMs,
|
|
63
|
+
retryPolicy: input.serving.retryPolicy,
|
|
64
|
+
abortTimeout: ENGINE_ABORT_TIMEOUT_MS,
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
try {
|
|
68
|
+
endpoint = engine.createEndpointHandler({
|
|
69
|
+
identityKeys: [...identityKeys],
|
|
70
|
+
services: [definition],
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
discovery.forget(kernel, identityKeys);
|
|
75
|
+
return unavailable();
|
|
76
|
+
}
|
|
77
|
+
if (endpoints.size >= MAXIMUM_ENDPOINTS)
|
|
78
|
+
endpoints.delete(endpoints.keys().next().value);
|
|
79
|
+
endpoints.set(cacheKey, endpoint);
|
|
80
|
+
}
|
|
81
|
+
const response = await endpoint(request);
|
|
82
|
+
if (response.status === 401)
|
|
83
|
+
discovery.invalidate(kernel, identityKeys);
|
|
84
|
+
return response;
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
function refused() {
|
|
89
|
+
return new Response('{"error":"Unknown durable declaration."}', {
|
|
90
|
+
status: 404,
|
|
91
|
+
headers: { 'content-type': 'application/json', 'cache-control': 'no-store' },
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
function unavailable() {
|
|
95
|
+
return new Response('{"error":"Workflow engine authority is unavailable."}', {
|
|
96
|
+
status: 503,
|
|
97
|
+
headers: { 'content-type': 'application/json', 'cache-control': 'no-store' },
|
|
98
|
+
});
|
|
99
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IssuerId } from '../../platform/auth/index.js';
|
|
2
|
+
export interface DurableRoute {
|
|
3
|
+
readonly kernel: IssuerId;
|
|
4
|
+
readonly declaration: string;
|
|
5
|
+
readonly service: string;
|
|
6
|
+
}
|
|
7
|
+
/** Whether the request is owned by the durable receiver, including malformed paths. */
|
|
8
|
+
export declare function isDurableRequest(request: Request): boolean;
|
|
9
|
+
/** Canonical requests discover authority at the HTTPS Kernel named by this admitted route. */
|
|
10
|
+
export declare function isCanonicalDurableRequest(request: Request): boolean;
|
|
11
|
+
/** One wire decoder shared by the receiver and platform lazy-load eligibility. */
|
|
12
|
+
export declare function durableRoute(request: Request): DurableRoute | undefined;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { Key } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
|
+
import { invocationPath } from '../../deployment/release/invocation.js';
|
|
3
|
+
import { AuthValueError } from '../../platform/auth/index.js';
|
|
4
|
+
import { httpIssuer } from '../identity/errors.js';
|
|
5
|
+
const PREFIX = `${invocationPath()}/restate/`;
|
|
6
|
+
const SERVICE = /^[A-Za-z_][A-Za-z0-9_]{0,127}$/u;
|
|
7
|
+
/** Whether the request is owned by the durable receiver, including malformed paths. */
|
|
8
|
+
export function isDurableRequest(request) {
|
|
9
|
+
return new URL(request.url).pathname.startsWith(PREFIX);
|
|
10
|
+
}
|
|
11
|
+
/** Canonical requests discover authority at the HTTPS Kernel named by this admitted route. */
|
|
12
|
+
export function isCanonicalDurableRequest(request) {
|
|
13
|
+
return durableRoute(request)?.kernel !== undefined;
|
|
14
|
+
}
|
|
15
|
+
/** One wire decoder shared by the receiver and platform lazy-load eligibility. */
|
|
16
|
+
export function durableRoute(request) {
|
|
17
|
+
const pathname = new URL(request.url).pathname;
|
|
18
|
+
if (!pathname.startsWith(PREFIX))
|
|
19
|
+
return undefined;
|
|
20
|
+
const parts = pathname.slice(PREFIX.length).split('/');
|
|
21
|
+
try {
|
|
22
|
+
const first = decodeURIComponent(parts[0] ?? '');
|
|
23
|
+
const kernel = httpIssuer(first, false);
|
|
24
|
+
const declaration = decodeURIComponent(parts[1] ?? '');
|
|
25
|
+
const service = parts[2] ?? '';
|
|
26
|
+
if (!Key.is(declaration) || !SERVICE.test(service))
|
|
27
|
+
return undefined;
|
|
28
|
+
return Object.freeze({ kernel, declaration, service });
|
|
29
|
+
}
|
|
30
|
+
catch (cause) {
|
|
31
|
+
if (cause instanceof URIError || cause instanceof AuthValueError || cause instanceof TypeError)
|
|
32
|
+
return undefined;
|
|
33
|
+
throw cause;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { RuntimeWorkflow } from '../../application/runtime/workflows.js';
|
|
2
|
+
import type { IssuerId } from '../../platform/auth/index.js';
|
|
3
|
+
import type { Domain } from '../../platform/schema/index.js';
|
|
4
|
+
import type { EngineSharedContext, EngineWorkflowContext } from './engine.js';
|
|
5
|
+
import type { AdmittedDurableServing } from './options.js';
|
|
6
|
+
import type { StepAuthorities } from './steps.js';
|
|
7
|
+
export interface DurableRun {
|
|
8
|
+
readonly kernel: IssuerId;
|
|
9
|
+
readonly workflow: RuntimeWorkflow;
|
|
10
|
+
readonly domain: Domain;
|
|
11
|
+
readonly serving: AdmittedDurableServing;
|
|
12
|
+
/** What each Step attempt holds. */
|
|
13
|
+
readonly steps: StepAuthorities;
|
|
14
|
+
}
|
|
15
|
+
/** Engine handlers of one durable Workflow: the `run` and the shared `signal`. */
|
|
16
|
+
export declare function durableHandlers(input: DurableRun): Readonly<{
|
|
17
|
+
run: (context: EngineWorkflowContext, raw: unknown) => Promise<import("../../platform/schema/index.js").Value>;
|
|
18
|
+
signal(context: EngineSharedContext, raw: unknown): Promise<{
|
|
19
|
+
accepted: boolean;
|
|
20
|
+
}>;
|
|
21
|
+
}>;
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import { declaredErrorFactory } from '../../application/error/index.js';
|
|
2
|
+
import { acceptStepId } from '../../application/workflow/step/index.js';
|
|
3
|
+
import { acceptStepOutput } from '../../application/workflow/step/output.js';
|
|
4
|
+
import { ResponseError } from '../../platform/client/index.js';
|
|
5
|
+
import { validateOutput } from '../invocation/result/index.js';
|
|
6
|
+
import { decodeEnvelope } from './envelope.js';
|
|
7
|
+
import { delayedRetry, replayedFailure, StepExhausted, StepRetryAfter, attemptFailure, terminalFailure, } from './failure.js';
|
|
8
|
+
import { stepServing } from './options.js';
|
|
9
|
+
import { keySequence } from './steps.js';
|
|
10
|
+
const MAXIMUM_SLEEP_MS = 365 * 24 * 60 * 60_000;
|
|
11
|
+
const MAXIMUM_SIGNAL_NAME = 128;
|
|
12
|
+
/** Bounds of one `result` wait and of the durable pause between two of them. */
|
|
13
|
+
const AWAIT_WAIT_MS = 10_000;
|
|
14
|
+
const AWAIT_MAXIMUM_PAUSE_MS = 5 * 60_000;
|
|
15
|
+
/** Engine handlers of one durable Workflow: the `run` and the shared `signal`. */
|
|
16
|
+
export function durableHandlers(input) {
|
|
17
|
+
const { engine } = input.serving;
|
|
18
|
+
return Object.freeze({
|
|
19
|
+
run: (context, raw) => run(input, context, raw),
|
|
20
|
+
async signal(context, raw) {
|
|
21
|
+
const request = signalRequest(raw);
|
|
22
|
+
try {
|
|
23
|
+
await context.promise(request.name).resolve(request.value);
|
|
24
|
+
return { accepted: true };
|
|
25
|
+
}
|
|
26
|
+
catch (cause) {
|
|
27
|
+
// The engine refuses to resolve a promise twice with a terminal failure.
|
|
28
|
+
if (cause instanceof engine.TerminalError)
|
|
29
|
+
return { accepted: false };
|
|
30
|
+
throw cause;
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
async function run(input, context, raw) {
|
|
36
|
+
const { workflow, serving } = input;
|
|
37
|
+
const { engine } = serving;
|
|
38
|
+
const definition = workflow.definition;
|
|
39
|
+
// A run replays the code of the release that started it, each release at its own URL. Code
|
|
40
|
+
// served in place of it replays the journal: the engine refuses a journal whose Steps no longer
|
|
41
|
+
// match, and code that cannot read what the Kernel recorded fails every attempt; both pause.
|
|
42
|
+
const envelope = admitted(workflow, raw, input.kernel);
|
|
43
|
+
const durable = durableContext(input, context, envelope);
|
|
44
|
+
let output;
|
|
45
|
+
try {
|
|
46
|
+
output = await definition.run(durable);
|
|
47
|
+
}
|
|
48
|
+
catch (cause) {
|
|
49
|
+
throw terminalFailure(engine, cause, definition) ?? cause;
|
|
50
|
+
}
|
|
51
|
+
return validateOutput(workflow.callable, output);
|
|
52
|
+
}
|
|
53
|
+
function admitted(workflow, raw, kernel) {
|
|
54
|
+
const envelope = decodeEnvelope(raw);
|
|
55
|
+
if (envelope.execution.kernel !== kernel) {
|
|
56
|
+
throw new TypeError('Durable envelope Kernel differs from its authenticated endpoint.');
|
|
57
|
+
}
|
|
58
|
+
const diagnostics = workflow.callable.validateInput(envelope.input);
|
|
59
|
+
if (diagnostics.length > 0) {
|
|
60
|
+
throw new TypeError(`Workflow ${workflow.address} cannot read the recorded input.`);
|
|
61
|
+
}
|
|
62
|
+
const instance = 'static' in workflow.callable && workflow.callable.static === false;
|
|
63
|
+
if (instance !== (envelope.execution.receiver !== undefined)) {
|
|
64
|
+
throw new TypeError(`Workflow ${workflow.address} cannot use the recorded receiver.`);
|
|
65
|
+
}
|
|
66
|
+
return envelope;
|
|
67
|
+
}
|
|
68
|
+
function durableContext(input, context, envelope) {
|
|
69
|
+
const { serving, domain, workflow } = input;
|
|
70
|
+
const { engine } = serving;
|
|
71
|
+
const definition = workflow.definition;
|
|
72
|
+
const execution = envelope.execution;
|
|
73
|
+
const signal = context.request().attemptCompletedSignal;
|
|
74
|
+
const steps = new Set();
|
|
75
|
+
let running;
|
|
76
|
+
/**
|
|
77
|
+
* Starts one durable operation, a Step or a wait, once the previous one has settled. The engine
|
|
78
|
+
* follows one awaited operation at a time: operations awaited together through `Promise` combinators
|
|
79
|
+
* make it lose track of the run, which then pauses.
|
|
80
|
+
*/
|
|
81
|
+
const sequenced = (operation, start) => {
|
|
82
|
+
if (running !== undefined) {
|
|
83
|
+
return Promise.reject(new TypeError(`Workflow ${operation} started while ${running} runs: durable Steps and waits run one after another.`));
|
|
84
|
+
}
|
|
85
|
+
running = operation;
|
|
86
|
+
let started;
|
|
87
|
+
try {
|
|
88
|
+
started = start();
|
|
89
|
+
}
|
|
90
|
+
catch (cause) {
|
|
91
|
+
running = undefined;
|
|
92
|
+
return Promise.reject(cause);
|
|
93
|
+
}
|
|
94
|
+
return started.finally(() => {
|
|
95
|
+
running = undefined;
|
|
96
|
+
});
|
|
97
|
+
};
|
|
98
|
+
/**
|
|
99
|
+
* One journaled unit of work holding the capabilities of an Action as the Domain alone. Its
|
|
100
|
+
* Mutations, durable calls and Integration calls share one key sequence derived from its name.
|
|
101
|
+
* With a `retry` budget, the engine retries a failed attempt within it, after its backoff or the
|
|
102
|
+
* delay the failure prescribes, and the Step throws `StepExhausted` once it is spent; without
|
|
103
|
+
* one, a failed attempt fails the run's attempt, which the engine retries until it pauses.
|
|
104
|
+
*
|
|
105
|
+
* The engine promise is returned unawaited: awaiting it is what tells the engine the run waits on
|
|
106
|
+
* it, so parallel Steps hand theirs to the engine's own combinator instead.
|
|
107
|
+
*/
|
|
108
|
+
const journaled = (id, name, timeoutMs, retry, execute) => context.run(name, async () => {
|
|
109
|
+
const expiry = new AbortController();
|
|
110
|
+
const timer = setTimeout(() => expiry.abort(new Error(`Workflow Step ${id} exceeded its ${timeoutMs} ms timeout.`)), timeoutMs);
|
|
111
|
+
let step;
|
|
112
|
+
try {
|
|
113
|
+
const lifetime = {
|
|
114
|
+
deadline: Date.now() + timeoutMs,
|
|
115
|
+
signal: AbortSignal.any([signal, expiry.signal]),
|
|
116
|
+
};
|
|
117
|
+
const next = await keySequence(execution.id, name);
|
|
118
|
+
const { authority } = (step = input.steps({ name, execution, next, lifetime }));
|
|
119
|
+
const output = await Promise.race([
|
|
120
|
+
Promise.resolve().then(() => execute(authority)),
|
|
121
|
+
expired(expiry.signal),
|
|
122
|
+
]);
|
|
123
|
+
try {
|
|
124
|
+
return acceptStepOutput(output);
|
|
125
|
+
}
|
|
126
|
+
catch (cause) {
|
|
127
|
+
throw new TypeError(`Workflow ${name} output must be portable.`, { cause });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
catch (cause) {
|
|
131
|
+
throw (terminalFailure(engine, cause, definition) ??
|
|
132
|
+
delayedRetry(engine, cause) ??
|
|
133
|
+
attemptFailure(cause));
|
|
134
|
+
}
|
|
135
|
+
finally {
|
|
136
|
+
clearTimeout(timer);
|
|
137
|
+
step?.close();
|
|
138
|
+
}
|
|
139
|
+
}, retry);
|
|
140
|
+
/** One Step, awaited alone; its failure reaches the Workflow as `replayedFailure` reads it. */
|
|
141
|
+
const journal = (id, name, timeoutMs, retry, execute) => Promise.resolve(journaled(id, name, timeoutMs, retry, execute)).catch((cause) => {
|
|
142
|
+
throw replayedFailure(engine, cause, definition, id) ?? cause;
|
|
143
|
+
});
|
|
144
|
+
const step = (declared, execute) => {
|
|
145
|
+
let accepted;
|
|
146
|
+
try {
|
|
147
|
+
accepted = stepDeclaration(declared, serving.step);
|
|
148
|
+
if (steps.has(accepted.id))
|
|
149
|
+
throw new TypeError(`Workflow Step ${accepted.id} occurs more than once.`);
|
|
150
|
+
}
|
|
151
|
+
catch (cause) {
|
|
152
|
+
return Promise.reject(cause);
|
|
153
|
+
}
|
|
154
|
+
steps.add(accepted.id);
|
|
155
|
+
const { held } = accepted;
|
|
156
|
+
return sequenced(`Step ${accepted.id}`, () => journal(accepted.id, `step:${accepted.id}`, held.timeoutMs, held.retry, execute));
|
|
157
|
+
};
|
|
158
|
+
/**
|
|
159
|
+
* The Steps `declare` declares, started together and awaited through the engine's combinator as
|
|
160
|
+
* one operation. Once all have settled, their outputs in declaration order, or the failure of the
|
|
161
|
+
* first failed one in that order, as that Step alone fails.
|
|
162
|
+
*/
|
|
163
|
+
const parallel = (declare) => {
|
|
164
|
+
const declared = new Map();
|
|
165
|
+
const declaration = (id, execute) => {
|
|
166
|
+
const accepted = stepDeclaration(id, serving.step);
|
|
167
|
+
const token = Object.freeze({});
|
|
168
|
+
declared.set(token, { ...accepted, execute });
|
|
169
|
+
return token;
|
|
170
|
+
};
|
|
171
|
+
let group;
|
|
172
|
+
try {
|
|
173
|
+
if (typeof declare !== 'function') {
|
|
174
|
+
throw new TypeError('step.parallel takes a function declaring its Steps.');
|
|
175
|
+
}
|
|
176
|
+
const returned = declare(Object.freeze({
|
|
177
|
+
run: (id, execute) => declaration(id, execute),
|
|
178
|
+
query: (id, query, value) => declaration(id, (authority) => authority.query(query, value)),
|
|
179
|
+
mutate: (id, mutation, value) => declaration(id, (authority) => authority.mutate(mutation, value)),
|
|
180
|
+
}));
|
|
181
|
+
if (!Array.isArray(returned) ||
|
|
182
|
+
returned.length !== declared.size ||
|
|
183
|
+
new Set(returned).size !== returned.length ||
|
|
184
|
+
returned.some((entry) => !declared.has(entry))) {
|
|
185
|
+
throw new TypeError('step.parallel takes exactly the Steps its function declares, each once, as an array.');
|
|
186
|
+
}
|
|
187
|
+
group = returned.map((entry) => declared.get(entry));
|
|
188
|
+
const ids = new Set();
|
|
189
|
+
for (const { id } of group) {
|
|
190
|
+
if (steps.has(id) || ids.has(id)) {
|
|
191
|
+
throw new TypeError(`Workflow Step ${id} occurs more than once.`);
|
|
192
|
+
}
|
|
193
|
+
ids.add(id);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
catch (cause) {
|
|
197
|
+
return Promise.reject(cause);
|
|
198
|
+
}
|
|
199
|
+
if (group.length === 0)
|
|
200
|
+
return Promise.resolve([]);
|
|
201
|
+
for (const { id } of group)
|
|
202
|
+
steps.add(id);
|
|
203
|
+
return sequenced(`parallel Steps ${group.map(({ id }) => id).join(', ')}`, async () => {
|
|
204
|
+
const started = group.map(({ id, held, execute }) => journaled(id, `step:${id}`, held.timeoutMs, held.retry, execute));
|
|
205
|
+
const settled = await engine.RestatePromise.allSettled(started);
|
|
206
|
+
const failed = settled.findIndex(({ status }) => status === 'rejected');
|
|
207
|
+
if (failed === -1) {
|
|
208
|
+
return settled.map((result) => result.value);
|
|
209
|
+
}
|
|
210
|
+
const cause = settled[failed].reason;
|
|
211
|
+
throw replayedFailure(engine, cause, definition, group[failed].id) ?? cause;
|
|
212
|
+
});
|
|
213
|
+
};
|
|
214
|
+
return Object.freeze({
|
|
215
|
+
domain,
|
|
216
|
+
input: envelope.input,
|
|
217
|
+
execution,
|
|
218
|
+
error: declaredErrorFactory(definition),
|
|
219
|
+
step: Object.freeze({
|
|
220
|
+
run: step,
|
|
221
|
+
query: (id, query, value) => step(id, (authority) => authority.query(query, value)),
|
|
222
|
+
mutate: (id, mutation, value) => step(id, (authority) => authority.mutate(mutation, value)),
|
|
223
|
+
parallel,
|
|
224
|
+
}),
|
|
225
|
+
async sleep(durationMs) {
|
|
226
|
+
if (!Number.isSafeInteger(durationMs) || durationMs < 0 || durationMs > MAXIMUM_SLEEP_MS) {
|
|
227
|
+
throw new TypeError(`Durable sleep must be an integer between 0 and ${MAXIMUM_SLEEP_MS} ms.`);
|
|
228
|
+
}
|
|
229
|
+
await sequenced('sleep', () => Promise.resolve(context.sleep(durationMs)));
|
|
230
|
+
},
|
|
231
|
+
async awaitSignal(name, options) {
|
|
232
|
+
if (typeof name !== 'string' || name.length === 0 || name.length > MAXIMUM_SIGNAL_NAME) {
|
|
233
|
+
throw new TypeError('Durable signal name must have 1 to 128 characters.');
|
|
234
|
+
}
|
|
235
|
+
if (options === undefined) {
|
|
236
|
+
return (await sequenced(`wait for signal ${name}`, () => Promise.resolve(context.promise(name).get())));
|
|
237
|
+
}
|
|
238
|
+
const timeoutMs = options?.timeoutMs;
|
|
239
|
+
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 0 || timeoutMs > MAXIMUM_SLEEP_MS) {
|
|
240
|
+
throw new TypeError(`Durable signal timeout must be an integer between 0 and ${MAXIMUM_SLEEP_MS} ms.`);
|
|
241
|
+
}
|
|
242
|
+
// The engine journals the race between the signal and the timer: a replay settles it alike.
|
|
243
|
+
try {
|
|
244
|
+
const value = await sequenced(`wait for signal ${name}`, () => Promise.resolve(context.promise(name).get().orTimeout(timeoutMs)));
|
|
245
|
+
return Object.freeze({ kind: 'signal', value });
|
|
246
|
+
}
|
|
247
|
+
catch (cause) {
|
|
248
|
+
if (cause instanceof engine.TimeoutError)
|
|
249
|
+
return Object.freeze({ kind: 'timeout' });
|
|
250
|
+
throw cause;
|
|
251
|
+
}
|
|
252
|
+
},
|
|
253
|
+
cancelled: (error) => error instanceof engine.CancelledError,
|
|
254
|
+
exhausted: (error) => error instanceof StepExhausted,
|
|
255
|
+
retryAfter: (delayMs, cause) => new StepRetryAfter(delayMs, cause),
|
|
256
|
+
awaitExecution: (target) => sequenced(`wait for Execution ${target.id}`, async () => {
|
|
257
|
+
for (let poll = 1;; poll++) {
|
|
258
|
+
// A poll is no Step of the author's: it has no budget, so an outage pauses the run instead.
|
|
259
|
+
const name = `await:${target.id}:${poll}`;
|
|
260
|
+
const polled = await journal(name, name, serving.step.timeoutMs, undefined, async ({ kernel }) => {
|
|
261
|
+
try {
|
|
262
|
+
const outcome = await kernel.execution.result(target, {
|
|
263
|
+
waitMs: Math.min(AWAIT_WAIT_MS, Math.floor(serving.step.timeoutMs / 2)),
|
|
264
|
+
});
|
|
265
|
+
return { ended: true, outcome };
|
|
266
|
+
}
|
|
267
|
+
catch (cause) {
|
|
268
|
+
if (cause instanceof ResponseError && cause.reason?.code === 'EXECUTION_PENDING') {
|
|
269
|
+
return { ended: false };
|
|
270
|
+
}
|
|
271
|
+
throw cause;
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
if (polled.ended)
|
|
275
|
+
return polled.outcome;
|
|
276
|
+
await context.sleep(Math.min(AWAIT_MAXIMUM_PAUSE_MS, 1_000 * 2 ** Math.min(poll, 16)));
|
|
277
|
+
}
|
|
278
|
+
}),
|
|
279
|
+
...(execution.receiver === undefined ? {} : { self: execution.receiver }),
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
/** Admit a Step's id, and its declared retry budget and timeout over the deployment's. */
|
|
283
|
+
function stepDeclaration(declared, fallback) {
|
|
284
|
+
if (typeof declared === 'string')
|
|
285
|
+
return { id: acceptStepId(declared), held: fallback };
|
|
286
|
+
if (declared === null ||
|
|
287
|
+
typeof declared !== 'object' ||
|
|
288
|
+
Array.isArray(declared) ||
|
|
289
|
+
Reflect.ownKeys(declared).some((key) => key !== 'id' && key !== 'retry' && key !== 'timeoutMs')) {
|
|
290
|
+
throw new TypeError('A Workflow Step declaration takes only id, retry and timeoutMs.');
|
|
291
|
+
}
|
|
292
|
+
return {
|
|
293
|
+
id: acceptStepId(declared.id),
|
|
294
|
+
held: stepServing({ retry: declared.retry, timeoutMs: declared.timeoutMs }, fallback),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Rejects with the abort reason once `signal` aborts, at once if it already has: a timeout may fire
|
|
299
|
+
* while the attempt derives its keys. Never settles otherwise.
|
|
300
|
+
*/
|
|
301
|
+
function expired(signal) {
|
|
302
|
+
return new Promise((_, reject) => {
|
|
303
|
+
if (signal.aborted)
|
|
304
|
+
reject(signal.reason);
|
|
305
|
+
else
|
|
306
|
+
signal.addEventListener('abort', () => reject(signal.reason), { once: true });
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
function signalRequest(input) {
|
|
310
|
+
if (input === null ||
|
|
311
|
+
typeof input !== 'object' ||
|
|
312
|
+
Array.isArray(input) ||
|
|
313
|
+
typeof input.name !== 'string') {
|
|
314
|
+
throw new TypeError('Durable signal request is invalid.');
|
|
315
|
+
}
|
|
316
|
+
const { name, value } = input;
|
|
317
|
+
if (name.length === 0 || name.length > MAXIMUM_SIGNAL_NAME) {
|
|
318
|
+
throw new TypeError('Durable signal name must have 1 to 128 characters.');
|
|
319
|
+
}
|
|
320
|
+
return { name, value: value ?? null };
|
|
321
|
+
}
|