@astrale-os/sdk 0.6.0-beta.4 → 0.6.0-beta.41
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 +197 -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/attempts.d.ts +87 -0
- package/dist/execution/workflows/attempts.js +205 -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 +83 -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 +39 -0
- package/dist/execution/workflows/failure.js +143 -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 +81 -0
- package/dist/execution/workflows/options.js +158 -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 +23 -0
- package/dist/execution/workflows/run.js +365 -0
- package/dist/execution/workflows/steps.d.ts +48 -0
- package/dist/execution/workflows/steps.js +93 -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 +128 -0
- package/dist/testing/durable/engine.js +619 -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 +45 -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 +499 -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 +445 -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,143 @@
|
|
|
1
|
+
import { declaredErrorFactory, declaredErrorOf } from '../../application/error/index.js';
|
|
2
|
+
import { ResponseError } from '../../platform/client/index.js';
|
|
3
|
+
/** Metadata key the Kernel reads a declared failure from (`backend/restate` outcome decoding). */
|
|
4
|
+
const FAILURE = 'astrale.failure';
|
|
5
|
+
/** Failure code of an Execution whose Workflow did not catch a Step that spent its retry budget. */
|
|
6
|
+
export const STEP_EXHAUSTED = 'STEP_EXHAUSTED';
|
|
7
|
+
/** The longest delay a Step attempt may ask for, as the Kernel bounds a `retryAfterMs` hint. */
|
|
8
|
+
const MAXIMUM_RETRY_AFTER_MS = 3_600_000;
|
|
9
|
+
/** How deep a failure's causes are searched for the Kernel refusal behind it. */
|
|
10
|
+
const MAXIMUM_CAUSE_DEPTH = 8;
|
|
11
|
+
const REASON_CODE = /^[A-Z][A-Z0-9_]{0,63}$/u;
|
|
12
|
+
/**
|
|
13
|
+
* The mark a failed attempt's message carries when the Kernel refused it. The engine journals only
|
|
14
|
+
* that message, and gives back the last one when the budget is spent.
|
|
15
|
+
*/
|
|
16
|
+
const REFUSAL_MARK = /\[kernel refusal ([1-9][0-9]{3})(?: ([A-Z][A-Z0-9_]{0,63}))?\] /gu;
|
|
17
|
+
/**
|
|
18
|
+
* A Step that spent its retry budget, or whose attempt the Kernel refused for good. Its message
|
|
19
|
+
* never carries what the last attempt threw; when the Kernel refused that attempt, `refusal` names
|
|
20
|
+
* the refusal by its codes alone.
|
|
21
|
+
*/
|
|
22
|
+
export class StepExhausted extends Error {
|
|
23
|
+
step;
|
|
24
|
+
refusal;
|
|
25
|
+
constructor(step, refusal) {
|
|
26
|
+
super(`Workflow Step ${step} exhausted its retries.`);
|
|
27
|
+
this.name = 'StepExhausted';
|
|
28
|
+
this.step = step;
|
|
29
|
+
if (refusal !== undefined)
|
|
30
|
+
this.refusal = refusal;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/** The Kernel refusal behind `cause`, itself or one of its causes. */
|
|
34
|
+
export function kernelRefusalOf(cause) {
|
|
35
|
+
let current = cause;
|
|
36
|
+
for (let depth = 0; depth < MAXIMUM_CAUSE_DEPTH; depth += 1) {
|
|
37
|
+
if (current instanceof ResponseError) {
|
|
38
|
+
const reason = current.reason?.code;
|
|
39
|
+
return Object.freeze({
|
|
40
|
+
code: current.code,
|
|
41
|
+
...(reason !== undefined && REASON_CODE.test(reason) ? { reason } : {}),
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (current === null || typeof current !== 'object')
|
|
45
|
+
return undefined;
|
|
46
|
+
current = current.cause;
|
|
47
|
+
}
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
/** The message of a failed attempt: what it threw, after the Kernel refusal's codes, if any. */
|
|
51
|
+
export function attemptMessage(cause, refusal = kernelRefusalOf(cause)) {
|
|
52
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
53
|
+
if (refusal === undefined)
|
|
54
|
+
return message;
|
|
55
|
+
const reason = refusal.reason === undefined ? '' : ` ${refusal.reason}`;
|
|
56
|
+
return `[kernel refusal ${refusal.code}${reason}] ${message}`;
|
|
57
|
+
}
|
|
58
|
+
/** The refusal the last attempt's message names, if the Kernel refused it. */
|
|
59
|
+
function refusalIn(message) {
|
|
60
|
+
const marks = [...message.matchAll(REFUSAL_MARK)];
|
|
61
|
+
const last = marks.at(-1);
|
|
62
|
+
if (last === undefined)
|
|
63
|
+
return undefined;
|
|
64
|
+
return Object.freeze({
|
|
65
|
+
code: Number(last[1]),
|
|
66
|
+
...(last[2] === undefined ? {} : { reason: last[2] }),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/** A Step attempt's failure that asks to wait `delayMs` before the next attempt. */
|
|
70
|
+
export class StepRetryAfter extends Error {
|
|
71
|
+
delayMs;
|
|
72
|
+
constructor(delayMs, cause) {
|
|
73
|
+
if (!Number.isSafeInteger(delayMs) || delayMs < 0 || delayMs > MAXIMUM_RETRY_AFTER_MS) {
|
|
74
|
+
throw new TypeError(`A Step retry delay must be an integer between 0 and ${MAXIMUM_RETRY_AFTER_MS} ms.`);
|
|
75
|
+
}
|
|
76
|
+
super(cause instanceof Error ? cause.message : `Workflow Step asked to retry after ${delayMs} ms.`, cause === undefined ? undefined : { cause });
|
|
77
|
+
this.name = 'StepRetryAfter';
|
|
78
|
+
this.delayMs = delayMs;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const STATUS = {
|
|
82
|
+
VALIDATION_ERROR: 422,
|
|
83
|
+
NOT_FOUND: 404,
|
|
84
|
+
CONFLICT: 409,
|
|
85
|
+
UNSUPPORTED: 422,
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Encode a declared business error of `definition`, or a Step that spent its retry budget, as a
|
|
89
|
+
* terminal engine failure, or return undefined for any other error, which the engine retries.
|
|
90
|
+
*/
|
|
91
|
+
export function terminalFailure(engine, cause, definition) {
|
|
92
|
+
if (cause instanceof StepExhausted) {
|
|
93
|
+
return new engine.TerminalError(cause.message, {
|
|
94
|
+
metadata: {
|
|
95
|
+
[FAILURE]: JSON.stringify({
|
|
96
|
+
code: STEP_EXHAUSTED,
|
|
97
|
+
message: cause.message,
|
|
98
|
+
details: {
|
|
99
|
+
step: cause.step,
|
|
100
|
+
...(cause.refusal === undefined ? {} : { refusal: cause.refusal }),
|
|
101
|
+
},
|
|
102
|
+
}),
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
const declared = declaredErrorOf(cause, definition);
|
|
107
|
+
if (declared === undefined)
|
|
108
|
+
return undefined;
|
|
109
|
+
return new engine.TerminalError(declared.message, {
|
|
110
|
+
errorCode: STATUS[declared.family],
|
|
111
|
+
metadata: {
|
|
112
|
+
[FAILURE]: JSON.stringify({
|
|
113
|
+
family: declared.family,
|
|
114
|
+
code: declared.code,
|
|
115
|
+
message: declared.message,
|
|
116
|
+
details: declared.details,
|
|
117
|
+
}),
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* What a journaled Step failed with, as the Workflow sees it: its declared business error, rebuilt
|
|
123
|
+
* through the definition's own factory, or `StepExhausted` once the engine spent its retry budget
|
|
124
|
+
* or the Step threw an exhaustion caught from an earlier Step. A replay throws what the live run
|
|
125
|
+
* threw.
|
|
126
|
+
*/
|
|
127
|
+
export function replayedFailure(engine, cause, definition, step) {
|
|
128
|
+
if (!(cause instanceof engine.TerminalError) || cause instanceof engine.CancelledError) {
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
const encoded = cause.metadata?.[FAILURE];
|
|
132
|
+
// The Step's own code turns every terminal failure into a declared one or a failed attempt; a
|
|
133
|
+
// bare one is an engine's budget.
|
|
134
|
+
if (encoded === undefined)
|
|
135
|
+
return new StepExhausted(step, refusalIn(cause.message));
|
|
136
|
+
const failure = JSON.parse(encoded);
|
|
137
|
+
// Only a declared business error has a family, so a declared code may be STEP_EXHAUSTED too.
|
|
138
|
+
if (failure.family === undefined && failure.code === STEP_EXHAUSTED) {
|
|
139
|
+
const details = failure.details;
|
|
140
|
+
return new StepExhausted(details.step, details.refusal);
|
|
141
|
+
}
|
|
142
|
+
return declaredErrorFactory(definition)(failure.code, failure.details);
|
|
143
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { DurableEngine, EnginePromise, EngineRetryPolicy, EngineCombinators, EngineSharedContext, EngineWorkflowContext, EngineWorkflowDefinition, } from './engine.js';
|
|
2
|
+
export { DURABLE_ENGINE_EXPORTS, durableServing, isDurableEngine, type AdmittedDurableServing, type DurableServing, type DurableServingProvider, } from './options.js';
|
|
3
|
+
export { createDurableReceiver, type DurableReceiver } from './receiver.js';
|
|
4
|
+
export { isDurableRequest, isCanonicalDurableRequest } from './route.js';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { IntegrationAuthentication, IntegrationInvocationOwner } from '../../application/integration/index.js';
|
|
2
|
+
import type { Lifetime } from '../invocation/lifecycle/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* The Integration calls of one Step attempt. Each call takes the Step's next derived key as its
|
|
5
|
+
* call id, so every attempt presents the same ids in the same order, and a keyed operation of
|
|
6
|
+
* source `execution` sends the same idempotency key. A retried Step may run an operation again,
|
|
7
|
+
* so an `unsafe` one is refused before its Provider runs. There is no caller to invoke for.
|
|
8
|
+
*/
|
|
9
|
+
export declare function stepCalls(input: {
|
|
10
|
+
readonly next: () => string;
|
|
11
|
+
readonly lifetime: Lifetime;
|
|
12
|
+
readonly auth: IntegrationAuthentication;
|
|
13
|
+
}): IntegrationInvocationOwner;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { active } from '../invocation/lifecycle/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* The Integration calls of one Step attempt. Each call takes the Step's next derived key as its
|
|
4
|
+
* call id, so every attempt presents the same ids in the same order, and a keyed operation of
|
|
5
|
+
* source `execution` sends the same idempotency key. A retried Step may run an operation again,
|
|
6
|
+
* so an `unsafe` one is refused before its Provider runs. There is no caller to invoke for.
|
|
7
|
+
*/
|
|
8
|
+
export function stepCalls(input) {
|
|
9
|
+
const { next, lifetime, auth } = input;
|
|
10
|
+
return Object.freeze({
|
|
11
|
+
invoke(call) {
|
|
12
|
+
if (call.replay.kind === 'unsafe') {
|
|
13
|
+
throw new TypeError(`Integration operation ${call.integration}.${call.operation} is unsafe, and a retried ` +
|
|
14
|
+
'durable Step would run it again.');
|
|
15
|
+
}
|
|
16
|
+
active(lifetime);
|
|
17
|
+
return call.attempt({
|
|
18
|
+
callId: next(),
|
|
19
|
+
signal: lifetime.signal,
|
|
20
|
+
deadline: lifetime.deadline,
|
|
21
|
+
auth,
|
|
22
|
+
});
|
|
23
|
+
},
|
|
24
|
+
});
|
|
25
|
+
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import type { Fetch } from '@astrale-os/kernel-client';
|
|
2
|
+
import type { DurableStepRetry } from '../../application/workflow/index.js';
|
|
3
|
+
import type { DurableEngine, EngineRetryPolicy } from './engine.js';
|
|
4
|
+
/** Serving configuration of the durable Workflows of one deployment. */
|
|
5
|
+
export interface DurableServing {
|
|
6
|
+
/** The Restate SDK Fetch build of this platform. */
|
|
7
|
+
readonly engine: DurableEngine;
|
|
8
|
+
/** Fetch capability used for HTTPS discovery of a canonical request's Kernel engine. */
|
|
9
|
+
readonly fetch?: Fetch;
|
|
10
|
+
/**
|
|
11
|
+
* How long the engine retains a finished run. At least the Host minimum (one hour or more, one
|
|
12
|
+
* day by default); the Kernel resubmits an unstarted call only within half of it. Seven days by
|
|
13
|
+
* default.
|
|
14
|
+
*/
|
|
15
|
+
readonly retentionMs?: number;
|
|
16
|
+
/**
|
|
17
|
+
* Retry budget of every Step that declares none: 10 attempts from 1 s to 60 s by default, and no
|
|
18
|
+
* duration limit. Only a Step's own failures spend its attempts; it waits out an unavailable Kernel
|
|
19
|
+
* within its `maxDurationMs`. A Step that spends it fails into its Workflow. `maxAttempts` also
|
|
20
|
+
* bounds the attempts of a run that fails outside any Step, an unreachable deployment included,
|
|
21
|
+
* which then pauses for `resume` or `cancel`; 20 when it declares none. The Host caps them.
|
|
22
|
+
*/
|
|
23
|
+
readonly retry?: DurableStepRetry;
|
|
24
|
+
/** Deadline of one Step attempt that declares none, including its Kernel calls. One minute by default. */
|
|
25
|
+
readonly stepTimeoutMs?: number;
|
|
26
|
+
}
|
|
27
|
+
/** Resolve a deployment's engine only when its durable receiver is first requested. */
|
|
28
|
+
export type DurableServingProvider = (request: Request) => DurableServing | undefined | Promise<DurableServing | undefined>;
|
|
29
|
+
export interface AdmittedDurableServing {
|
|
30
|
+
readonly engine: DurableEngine;
|
|
31
|
+
readonly fetch: Fetch;
|
|
32
|
+
readonly retentionMs: number;
|
|
33
|
+
/** Attempts of a run that fails outside any Step, before the engine pauses it. */
|
|
34
|
+
readonly retryPolicy: EngineRetryPolicy;
|
|
35
|
+
/** Retry budget and attempt deadline of a Step that declares none. */
|
|
36
|
+
readonly step: StepServing;
|
|
37
|
+
}
|
|
38
|
+
/** What a Step is held to: its retry budget and its attempt deadline. */
|
|
39
|
+
export interface StepServing {
|
|
40
|
+
readonly retry: StepRetryBudget;
|
|
41
|
+
readonly timeoutMs: number;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The retry budget of one Step, which the Step spends attempt by attempt (see `attempts.ts`). An
|
|
45
|
+
* absent limit does not bound it.
|
|
46
|
+
*/
|
|
47
|
+
export interface StepRetryBudget {
|
|
48
|
+
/** Attempts whose failure is the Step's own, the first one included. */
|
|
49
|
+
readonly maxAttempts?: number;
|
|
50
|
+
/** Time from the start of the Step's first attempt after which a failed attempt is not retried. */
|
|
51
|
+
readonly maxDurationMs?: number;
|
|
52
|
+
readonly initialIntervalMs: number;
|
|
53
|
+
readonly maxIntervalMs: number;
|
|
54
|
+
readonly intervalFactor: number;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* The members of the Restate SDK Fetch entrypoint the durable receiver uses, which a platform's
|
|
58
|
+
* engine module must export.
|
|
59
|
+
*/
|
|
60
|
+
export declare const DURABLE_ENGINE_EXPORTS: readonly ["createEndpointHandler", "workflow", "TerminalError", "CancelledError", "RetryableError", "TimeoutError", "RestatePromise"];
|
|
61
|
+
/**
|
|
62
|
+
* Whether `module` exports the members of the Restate SDK Fetch entrypoint the durable receiver
|
|
63
|
+
* uses: each a function, but `RestatePromise`, the namespace of its combinators.
|
|
64
|
+
*/
|
|
65
|
+
export declare function isDurableEngine(module: unknown): boolean;
|
|
66
|
+
/**
|
|
67
|
+
* How long the engine lets an attempt run without progress before it aborts it, declared on every
|
|
68
|
+
* Workflow service. Restate's own default is ten minutes, which a ten-minute Step would race: the
|
|
69
|
+
* margin lets a Step's own timeout fail the attempt, and report it, before the engine cuts it.
|
|
70
|
+
*/
|
|
71
|
+
export declare const ENGINE_ABORT_TIMEOUT_MS: number;
|
|
72
|
+
/** Capture one durable serving configuration, failing closed on any gap. */
|
|
73
|
+
export declare function durableServing(input: DurableServing): AdmittedDurableServing;
|
|
74
|
+
/**
|
|
75
|
+
* What one Step is held to: the retry budget and timeout it declares, in place of `fallback`'s. A
|
|
76
|
+
* declared limit replaces both limits of the fallback; an undeclared interval keeps the fallback's.
|
|
77
|
+
*/
|
|
78
|
+
export declare function stepServing(declared: {
|
|
79
|
+
readonly retry?: DurableStepRetry | undefined;
|
|
80
|
+
readonly timeoutMs?: number | undefined;
|
|
81
|
+
}, fallback: StepServing): StepServing;
|
|
@@ -0,0 +1,158 @@
|
|
|
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
|
+
/**
|
|
33
|
+
* Attempts a Step's own failures may spend when the deployment declares none. An unavailable Kernel
|
|
34
|
+
* spends none of them, so they bound only failures that sending again may not cure.
|
|
35
|
+
*/
|
|
36
|
+
const DEFAULT_STEP_ATTEMPTS = 10;
|
|
37
|
+
/**
|
|
38
|
+
* Attempts of a run failing outside any Step when the deployment declares none. The engine counts an
|
|
39
|
+
* unreachable deployment as such a failure, which it cannot tell apart from the code's own, so these
|
|
40
|
+
* also span an unavailability of the deployment, about fourteen minutes at the default intervals.
|
|
41
|
+
*/
|
|
42
|
+
const DEFAULT_RUN_ATTEMPTS = 20;
|
|
43
|
+
/** The longest attempt a Step may declare, which the engine's abort timeout leaves to end first. */
|
|
44
|
+
const MAXIMUM_STEP_TIMEOUT_MS = 10 * 60_000;
|
|
45
|
+
/**
|
|
46
|
+
* How long the engine lets an attempt run without progress before it aborts it, declared on every
|
|
47
|
+
* Workflow service. Restate's own default is ten minutes, which a ten-minute Step would race: the
|
|
48
|
+
* margin lets a Step's own timeout fail the attempt, and report it, before the engine cuts it.
|
|
49
|
+
*/
|
|
50
|
+
export const ENGINE_ABORT_TIMEOUT_MS = MAXIMUM_STEP_TIMEOUT_MS + 5 * 60_000;
|
|
51
|
+
const DEFAULT_STEP_RETRY = Object.freeze({
|
|
52
|
+
maxAttempts: DEFAULT_STEP_ATTEMPTS,
|
|
53
|
+
initialIntervalMs: 1_000,
|
|
54
|
+
maxIntervalMs: 60_000,
|
|
55
|
+
intervalFactor: 2,
|
|
56
|
+
});
|
|
57
|
+
/** Capture one durable serving configuration, failing closed on any gap. */
|
|
58
|
+
export function durableServing(input) {
|
|
59
|
+
if (input === null ||
|
|
60
|
+
typeof input !== 'object' ||
|
|
61
|
+
Array.isArray(input) ||
|
|
62
|
+
Reflect.ownKeys(input).some((key) => key !== 'engine' &&
|
|
63
|
+
key !== 'fetch' &&
|
|
64
|
+
key !== 'retentionMs' &&
|
|
65
|
+
key !== 'retry' &&
|
|
66
|
+
key !== 'stepTimeoutMs')) {
|
|
67
|
+
invalid('Durable serving options are invalid.');
|
|
68
|
+
}
|
|
69
|
+
const engine = input.engine;
|
|
70
|
+
if (!isDurableEngine(engine)) {
|
|
71
|
+
invalid('Durable serving requires the Restate SDK Fetch entrypoint of this platform.');
|
|
72
|
+
}
|
|
73
|
+
const fetch = input.fetch ?? globalThis.fetch.bind(globalThis);
|
|
74
|
+
if (typeof fetch !== 'function')
|
|
75
|
+
invalid('Durable serving requires Fetch for engine discovery.');
|
|
76
|
+
const step = stepServing({ retry: input.retry, timeoutMs: input.stepTimeoutMs }, { retry: DEFAULT_STEP_RETRY, timeoutMs: 60_000 });
|
|
77
|
+
return Object.freeze({
|
|
78
|
+
engine: Object.freeze({
|
|
79
|
+
createEndpointHandler: engine.createEndpointHandler.bind(engine),
|
|
80
|
+
workflow: engine.workflow.bind(engine),
|
|
81
|
+
TerminalError: engine.TerminalError,
|
|
82
|
+
CancelledError: engine.CancelledError,
|
|
83
|
+
RetryableError: engine.RetryableError,
|
|
84
|
+
TimeoutError: engine.TimeoutError,
|
|
85
|
+
RestatePromise: Object.freeze({
|
|
86
|
+
allSettled: engine.RestatePromise.allSettled.bind(engine.RestatePromise),
|
|
87
|
+
}),
|
|
88
|
+
}),
|
|
89
|
+
fetch,
|
|
90
|
+
retentionMs: bounded(input.retentionMs, 7 * DAY_MS, HOUR_MS, 365 * DAY_MS, 'retentionMs'),
|
|
91
|
+
retryPolicy: Object.freeze({
|
|
92
|
+
maxAttempts: input.retry?.maxAttempts ?? DEFAULT_RUN_ATTEMPTS,
|
|
93
|
+
onMaxAttempts: 'pause',
|
|
94
|
+
initialInterval: step.retry.initialIntervalMs,
|
|
95
|
+
maxInterval: step.retry.maxIntervalMs,
|
|
96
|
+
exponentiationFactor: step.retry.intervalFactor,
|
|
97
|
+
}),
|
|
98
|
+
step,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* What one Step is held to: the retry budget and timeout it declares, in place of `fallback`'s. A
|
|
103
|
+
* declared limit replaces both limits of the fallback; an undeclared interval keeps the fallback's.
|
|
104
|
+
*/
|
|
105
|
+
export function stepServing(declared, fallback) {
|
|
106
|
+
const retry = declared.retry;
|
|
107
|
+
if (retry === undefined) {
|
|
108
|
+
return Object.freeze({
|
|
109
|
+
retry: fallback.retry,
|
|
110
|
+
timeoutMs: stepTimeout(declared.timeoutMs, fallback.timeoutMs),
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
if (retry === null ||
|
|
114
|
+
typeof retry !== 'object' ||
|
|
115
|
+
Array.isArray(retry) ||
|
|
116
|
+
Reflect.ownKeys(retry).some((key) => key !== 'maxAttempts' &&
|
|
117
|
+
key !== 'maxDurationMs' &&
|
|
118
|
+
key !== 'initialIntervalMs' &&
|
|
119
|
+
key !== 'maxIntervalMs')) {
|
|
120
|
+
invalid('Durable retry options are invalid.');
|
|
121
|
+
}
|
|
122
|
+
const limited = retry.maxAttempts !== undefined || retry.maxDurationMs !== undefined;
|
|
123
|
+
const maxAttempts = limited
|
|
124
|
+
? optionalBounded(retry.maxAttempts, 1, 1_000, 'maxAttempts')
|
|
125
|
+
: fallback.retry.maxAttempts;
|
|
126
|
+
const maxDuration = limited
|
|
127
|
+
? optionalBounded(retry.maxDurationMs, 1, 365 * DAY_MS, 'maxDurationMs')
|
|
128
|
+
: fallback.retry.maxDurationMs;
|
|
129
|
+
const initialInterval = bounded(retry.initialIntervalMs, fallback.retry.initialIntervalMs, 1, HOUR_MS, 'initialIntervalMs');
|
|
130
|
+
const maxInterval = bounded(retry.maxIntervalMs, Math.max(fallback.retry.maxIntervalMs, initialInterval), initialInterval, DAY_MS, 'maxIntervalMs');
|
|
131
|
+
return Object.freeze({
|
|
132
|
+
retry: Object.freeze({
|
|
133
|
+
...(maxAttempts === undefined ? {} : { maxAttempts }),
|
|
134
|
+
...(maxDuration === undefined ? {} : { maxDurationMs: maxDuration }),
|
|
135
|
+
initialIntervalMs: initialInterval,
|
|
136
|
+
maxIntervalMs: maxInterval,
|
|
137
|
+
intervalFactor: fallback.retry.intervalFactor,
|
|
138
|
+
}),
|
|
139
|
+
timeoutMs: stepTimeout(declared.timeoutMs, fallback.timeoutMs),
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
function stepTimeout(input, fallback) {
|
|
143
|
+
return bounded(input, fallback, 1_000, MAXIMUM_STEP_TIMEOUT_MS, 'Step timeout');
|
|
144
|
+
}
|
|
145
|
+
function optionalBounded(input, minimum, maximum, label) {
|
|
146
|
+
return input === undefined ? undefined : bounded(input, minimum, minimum, maximum, label);
|
|
147
|
+
}
|
|
148
|
+
function bounded(input, fallback, minimum, maximum, label) {
|
|
149
|
+
if (input === undefined)
|
|
150
|
+
return fallback;
|
|
151
|
+
if (!Number.isSafeInteger(input) || input < minimum || input > maximum) {
|
|
152
|
+
invalid(`Durable ${label} must be an integer between ${minimum} and ${maximum}.`);
|
|
153
|
+
}
|
|
154
|
+
return input;
|
|
155
|
+
}
|
|
156
|
+
function invalid(message) {
|
|
157
|
+
throw new TypeError(message);
|
|
158
|
+
}
|
|
@@ -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,23 @@
|
|
|
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
|
+
/** The clock that times each Step attempt against its Step's `maxDurationMs`; `Date.now` by default. */
|
|
15
|
+
readonly now?: () => number;
|
|
16
|
+
}
|
|
17
|
+
/** Engine handlers of one durable Workflow: the `run` and the shared `signal`. */
|
|
18
|
+
export declare function durableHandlers(input: DurableRun): Readonly<{
|
|
19
|
+
run: (context: EngineWorkflowContext, raw: unknown) => Promise<import("../../platform/schema/index.js").Value>;
|
|
20
|
+
signal(context: EngineSharedContext, raw: unknown): Promise<{
|
|
21
|
+
accepted: boolean;
|
|
22
|
+
}>;
|
|
23
|
+
}>;
|