@appport/sdk 1.0.1
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/LICENSE +126 -0
- package/README.md +39 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/node.d.ts +3 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +3 -0
- package/dist/node.js.map +1 -0
- package/node_modules/@appport/authorization/README.md +28 -0
- package/node_modules/@appport/authorization/dist/index.d.ts +94 -0
- package/node_modules/@appport/authorization/dist/index.d.ts.map +1 -0
- package/node_modules/@appport/authorization/dist/index.js +131 -0
- package/node_modules/@appport/authorization/dist/index.js.map +1 -0
- package/node_modules/@appport/authorization/package.json +28 -0
- package/node_modules/@appport/client/README.md +35 -0
- package/node_modules/@appport/client/dist/channel.d.ts +14 -0
- package/node_modules/@appport/client/dist/channel.d.ts.map +1 -0
- package/node_modules/@appport/client/dist/channel.js +58 -0
- package/node_modules/@appport/client/dist/channel.js.map +1 -0
- package/node_modules/@appport/client/dist/client.d.ts +61 -0
- package/node_modules/@appport/client/dist/client.d.ts.map +1 -0
- package/node_modules/@appport/client/dist/client.js +214 -0
- package/node_modules/@appport/client/dist/client.js.map +1 -0
- package/node_modules/@appport/client/dist/contract.d.ts +55 -0
- package/node_modules/@appport/client/dist/contract.d.ts.map +1 -0
- package/node_modules/@appport/client/dist/contract.js +12 -0
- package/node_modules/@appport/client/dist/contract.js.map +1 -0
- package/node_modules/@appport/client/dist/discovery.d.ts +17 -0
- package/node_modules/@appport/client/dist/discovery.d.ts.map +1 -0
- package/node_modules/@appport/client/dist/discovery.js +56 -0
- package/node_modules/@appport/client/dist/discovery.js.map +1 -0
- package/node_modules/@appport/client/dist/duplex.d.ts +25 -0
- package/node_modules/@appport/client/dist/duplex.d.ts.map +1 -0
- package/node_modules/@appport/client/dist/duplex.js +194 -0
- package/node_modules/@appport/client/dist/duplex.js.map +1 -0
- package/node_modules/@appport/client/dist/index.d.ts +13 -0
- package/node_modules/@appport/client/dist/index.d.ts.map +1 -0
- package/node_modules/@appport/client/dist/index.js +13 -0
- package/node_modules/@appport/client/dist/index.js.map +1 -0
- package/node_modules/@appport/client/dist/transport.d.ts +42 -0
- package/node_modules/@appport/client/dist/transport.d.ts.map +1 -0
- package/node_modules/@appport/client/dist/transport.js +2 -0
- package/node_modules/@appport/client/dist/transport.js.map +1 -0
- package/node_modules/@appport/client/package.json +32 -0
- package/node_modules/@appport/core/README.md +91 -0
- package/node_modules/@appport/core/dist/appboundry-contract.d.ts +80 -0
- package/node_modules/@appport/core/dist/appboundry-contract.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/appboundry-contract.js +160 -0
- package/node_modules/@appport/core/dist/appboundry-contract.js.map +1 -0
- package/node_modules/@appport/core/dist/application-implementation.d.ts +125 -0
- package/node_modules/@appport/core/dist/application-implementation.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/application-implementation.js +220 -0
- package/node_modules/@appport/core/dist/application-implementation.js.map +1 -0
- package/node_modules/@appport/core/dist/application-lifecycle.d.ts +150 -0
- package/node_modules/@appport/core/dist/application-lifecycle.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/application-lifecycle.js +70 -0
- package/node_modules/@appport/core/dist/application-lifecycle.js.map +1 -0
- package/node_modules/@appport/core/dist/application-source.d.ts +109 -0
- package/node_modules/@appport/core/dist/application-source.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/application-source.js +186 -0
- package/node_modules/@appport/core/dist/application-source.js.map +1 -0
- package/node_modules/@appport/core/dist/application.d.ts +122 -0
- package/node_modules/@appport/core/dist/application.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/application.js +515 -0
- package/node_modules/@appport/core/dist/application.js.map +1 -0
- package/node_modules/@appport/core/dist/artifact.d.ts +395 -0
- package/node_modules/@appport/core/dist/artifact.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/artifact.js +392 -0
- package/node_modules/@appport/core/dist/artifact.js.map +1 -0
- package/node_modules/@appport/core/dist/assembly.d.ts +237 -0
- package/node_modules/@appport/core/dist/assembly.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/assembly.js +458 -0
- package/node_modules/@appport/core/dist/assembly.js.map +1 -0
- package/node_modules/@appport/core/dist/authority-attestation.d.ts +34 -0
- package/node_modules/@appport/core/dist/authority-attestation.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/authority-attestation.js +72 -0
- package/node_modules/@appport/core/dist/authority-attestation.js.map +1 -0
- package/node_modules/@appport/core/dist/authorization-grant.d.ts +107 -0
- package/node_modules/@appport/core/dist/authorization-grant.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/authorization-grant.js +131 -0
- package/node_modules/@appport/core/dist/authorization-grant.js.map +1 -0
- package/node_modules/@appport/core/dist/binding.d.ts +294 -0
- package/node_modules/@appport/core/dist/binding.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/binding.js +263 -0
- package/node_modules/@appport/core/dist/binding.js.map +1 -0
- package/node_modules/@appport/core/dist/builtins.d.ts +18 -0
- package/node_modules/@appport/core/dist/builtins.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/builtins.js +38 -0
- package/node_modules/@appport/core/dist/builtins.js.map +1 -0
- package/node_modules/@appport/core/dist/capability.d.ts +94 -0
- package/node_modules/@appport/core/dist/capability.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/capability.js +85 -0
- package/node_modules/@appport/core/dist/capability.js.map +1 -0
- package/node_modules/@appport/core/dist/concurrency.d.ts +16 -0
- package/node_modules/@appport/core/dist/concurrency.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/concurrency.js +46 -0
- package/node_modules/@appport/core/dist/concurrency.js.map +1 -0
- package/node_modules/@appport/core/dist/context.d.ts +59 -0
- package/node_modules/@appport/core/dist/context.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/context.js +14 -0
- package/node_modules/@appport/core/dist/context.js.map +1 -0
- package/node_modules/@appport/core/dist/contract-artifact.d.ts +15 -0
- package/node_modules/@appport/core/dist/contract-artifact.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/contract-artifact.js +152 -0
- package/node_modules/@appport/core/dist/contract-artifact.js.map +1 -0
- package/node_modules/@appport/core/dist/contract-attestation.d.ts +68 -0
- package/node_modules/@appport/core/dist/contract-attestation.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/contract-attestation.js +76 -0
- package/node_modules/@appport/core/dist/contract-attestation.js.map +1 -0
- package/node_modules/@appport/core/dist/crash-injection.d.ts +3 -0
- package/node_modules/@appport/core/dist/crash-injection.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/crash-injection.js +8 -0
- package/node_modules/@appport/core/dist/crash-injection.js.map +1 -0
- package/node_modules/@appport/core/dist/events.d.ts +33 -0
- package/node_modules/@appport/core/dist/events.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/events.js +79 -0
- package/node_modules/@appport/core/dist/events.js.map +1 -0
- package/node_modules/@appport/core/dist/execution-barrier.d.ts +13 -0
- package/node_modules/@appport/core/dist/execution-barrier.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/execution-barrier.js +33 -0
- package/node_modules/@appport/core/dist/execution-barrier.js.map +1 -0
- package/node_modules/@appport/core/dist/execution-ledger.d.ts +81 -0
- package/node_modules/@appport/core/dist/execution-ledger.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/execution-ledger.js +173 -0
- package/node_modules/@appport/core/dist/execution-ledger.js.map +1 -0
- package/node_modules/@appport/core/dist/execution.d.ts +387 -0
- package/node_modules/@appport/core/dist/execution.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/execution.js +165 -0
- package/node_modules/@appport/core/dist/execution.js.map +1 -0
- package/node_modules/@appport/core/dist/idempotency.d.ts +36 -0
- package/node_modules/@appport/core/dist/idempotency.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/idempotency.js +36 -0
- package/node_modules/@appport/core/dist/idempotency.js.map +1 -0
- package/node_modules/@appport/core/dist/implementation.d.ts +110 -0
- package/node_modules/@appport/core/dist/implementation.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/implementation.js +65 -0
- package/node_modules/@appport/core/dist/implementation.js.map +1 -0
- package/node_modules/@appport/core/dist/index.d.ts +44 -0
- package/node_modules/@appport/core/dist/index.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/index.js +44 -0
- package/node_modules/@appport/core/dist/index.js.map +1 -0
- package/node_modules/@appport/core/dist/invocation.d.ts +253 -0
- package/node_modules/@appport/core/dist/invocation.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/invocation.js +258 -0
- package/node_modules/@appport/core/dist/invocation.js.map +1 -0
- package/node_modules/@appport/core/dist/manifest.d.ts +157 -0
- package/node_modules/@appport/core/dist/manifest.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/manifest.js +255 -0
- package/node_modules/@appport/core/dist/manifest.js.map +1 -0
- package/node_modules/@appport/core/dist/memory-application-data-store.d.ts +19 -0
- package/node_modules/@appport/core/dist/memory-application-data-store.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/memory-application-data-store.js +161 -0
- package/node_modules/@appport/core/dist/memory-application-data-store.js.map +1 -0
- package/node_modules/@appport/core/dist/operations.d.ts +61 -0
- package/node_modules/@appport/core/dist/operations.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/operations.js +210 -0
- package/node_modules/@appport/core/dist/operations.js.map +1 -0
- package/node_modules/@appport/core/dist/public.d.ts +19 -0
- package/node_modules/@appport/core/dist/public.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/public.js +18 -0
- package/node_modules/@appport/core/dist/public.js.map +1 -0
- package/node_modules/@appport/core/dist/registration.d.ts +165 -0
- package/node_modules/@appport/core/dist/registration.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/registration.js +253 -0
- package/node_modules/@appport/core/dist/registration.js.map +1 -0
- package/node_modules/@appport/core/dist/registry.d.ts +29 -0
- package/node_modules/@appport/core/dist/registry.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/registry.js +148 -0
- package/node_modules/@appport/core/dist/registry.js.map +1 -0
- package/node_modules/@appport/core/dist/repository-connection.d.ts +100 -0
- package/node_modules/@appport/core/dist/repository-connection.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/repository-connection.js +57 -0
- package/node_modules/@appport/core/dist/repository-connection.js.map +1 -0
- package/node_modules/@appport/core/dist/resolver.d.ts +130 -0
- package/node_modules/@appport/core/dist/resolver.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/resolver.js +252 -0
- package/node_modules/@appport/core/dist/resolver.js.map +1 -0
- package/node_modules/@appport/core/dist/runtime-manifest.d.ts +68 -0
- package/node_modules/@appport/core/dist/runtime-manifest.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/runtime-manifest.js +84 -0
- package/node_modules/@appport/core/dist/runtime-manifest.js.map +1 -0
- package/node_modules/@appport/core/dist/sanitize.d.ts +14 -0
- package/node_modules/@appport/core/dist/sanitize.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/sanitize.js +49 -0
- package/node_modules/@appport/core/dist/sanitize.js.map +1 -0
- package/node_modules/@appport/core/dist/server-internal.d.ts +5 -0
- package/node_modules/@appport/core/dist/server-internal.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/server-internal.js +4 -0
- package/node_modules/@appport/core/dist/server-internal.js.map +1 -0
- package/node_modules/@appport/core/dist/sessions.d.ts +29 -0
- package/node_modules/@appport/core/dist/sessions.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/sessions.js +39 -0
- package/node_modules/@appport/core/dist/sessions.js.map +1 -0
- package/node_modules/@appport/core/dist/sha256.d.ts +3 -0
- package/node_modules/@appport/core/dist/sha256.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/sha256.js +46 -0
- package/node_modules/@appport/core/dist/sha256.js.map +1 -0
- package/node_modules/@appport/core/dist/source-verification.d.ts +53 -0
- package/node_modules/@appport/core/dist/source-verification.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/source-verification.js +92 -0
- package/node_modules/@appport/core/dist/source-verification.js.map +1 -0
- package/node_modules/@appport/core/dist/state-context.d.ts +312 -0
- package/node_modules/@appport/core/dist/state-context.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/state-context.js +100 -0
- package/node_modules/@appport/core/dist/state-context.js.map +1 -0
- package/node_modules/@appport/core/dist/state.d.ts +96 -0
- package/node_modules/@appport/core/dist/state.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/state.js +89 -0
- package/node_modules/@appport/core/dist/state.js.map +1 -0
- package/node_modules/@appport/core/dist/streams.d.ts +38 -0
- package/node_modules/@appport/core/dist/streams.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/streams.js +123 -0
- package/node_modules/@appport/core/dist/streams.js.map +1 -0
- package/node_modules/@appport/core/dist/telemetry.d.ts +42 -0
- package/node_modules/@appport/core/dist/telemetry.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/telemetry.js +32 -0
- package/node_modules/@appport/core/dist/telemetry.js.map +1 -0
- package/node_modules/@appport/core/dist/wasm-engine.d.ts +22 -0
- package/node_modules/@appport/core/dist/wasm-engine.d.ts.map +1 -0
- package/node_modules/@appport/core/dist/wasm-engine.js +367 -0
- package/node_modules/@appport/core/dist/wasm-engine.js.map +1 -0
- package/node_modules/@appport/core/package.json +58 -0
- package/node_modules/@appport/mobile/README.md +10 -0
- package/node_modules/@appport/mobile/dist/index.d.ts +66 -0
- package/node_modules/@appport/mobile/dist/index.d.ts.map +1 -0
- package/node_modules/@appport/mobile/dist/index.js +182 -0
- package/node_modules/@appport/mobile/dist/index.js.map +1 -0
- package/node_modules/@appport/mobile/package.json +33 -0
- package/node_modules/@appport/protocol/README.md +41 -0
- package/node_modules/@appport/protocol/dist/blob.d.ts +46 -0
- package/node_modules/@appport/protocol/dist/blob.d.ts.map +1 -0
- package/node_modules/@appport/protocol/dist/blob.js +23 -0
- package/node_modules/@appport/protocol/dist/blob.js.map +1 -0
- package/node_modules/@appport/protocol/dist/compatibility.d.ts +25 -0
- package/node_modules/@appport/protocol/dist/compatibility.d.ts.map +1 -0
- package/node_modules/@appport/protocol/dist/compatibility.js +189 -0
- package/node_modules/@appport/protocol/dist/compatibility.js.map +1 -0
- package/node_modules/@appport/protocol/dist/envelopes.d.ts +175 -0
- package/node_modules/@appport/protocol/dist/envelopes.d.ts.map +1 -0
- package/node_modules/@appport/protocol/dist/envelopes.js +97 -0
- package/node_modules/@appport/protocol/dist/envelopes.js.map +1 -0
- package/node_modules/@appport/protocol/dist/errors.d.ts +74 -0
- package/node_modules/@appport/protocol/dist/errors.d.ts.map +1 -0
- package/node_modules/@appport/protocol/dist/errors.js +91 -0
- package/node_modules/@appport/protocol/dist/errors.js.map +1 -0
- package/node_modules/@appport/protocol/dist/ids.d.ts +12 -0
- package/node_modules/@appport/protocol/dist/ids.d.ts.map +1 -0
- package/node_modules/@appport/protocol/dist/ids.js +50 -0
- package/node_modules/@appport/protocol/dist/ids.js.map +1 -0
- package/node_modules/@appport/protocol/dist/index.d.ts +20 -0
- package/node_modules/@appport/protocol/dist/index.d.ts.map +1 -0
- package/node_modules/@appport/protocol/dist/index.js +20 -0
- package/node_modules/@appport/protocol/dist/index.js.map +1 -0
- package/node_modules/@appport/protocol/dist/jsonschema.d.ts +50 -0
- package/node_modules/@appport/protocol/dist/jsonschema.d.ts.map +1 -0
- package/node_modules/@appport/protocol/dist/jsonschema.js +6 -0
- package/node_modules/@appport/protocol/dist/jsonschema.js.map +1 -0
- package/node_modules/@appport/protocol/dist/manifest.d.ts +131 -0
- package/node_modules/@appport/protocol/dist/manifest.d.ts.map +1 -0
- package/node_modules/@appport/protocol/dist/manifest.js +20 -0
- package/node_modules/@appport/protocol/dist/manifest.js.map +1 -0
- package/node_modules/@appport/protocol/dist/names.d.ts +26 -0
- package/node_modules/@appport/protocol/dist/names.d.ts.map +1 -0
- package/node_modules/@appport/protocol/dist/names.js +85 -0
- package/node_modules/@appport/protocol/dist/names.js.map +1 -0
- package/node_modules/@appport/protocol/dist/operations.d.ts +34 -0
- package/node_modules/@appport/protocol/dist/operations.d.ts.map +1 -0
- package/node_modules/@appport/protocol/dist/operations.js +9 -0
- package/node_modules/@appport/protocol/dist/operations.js.map +1 -0
- package/node_modules/@appport/protocol/dist/session.d.ts +27 -0
- package/node_modules/@appport/protocol/dist/session.d.ts.map +1 -0
- package/node_modules/@appport/protocol/dist/session.js +7 -0
- package/node_modules/@appport/protocol/dist/session.js.map +1 -0
- package/node_modules/@appport/protocol/dist/validate.d.ts +37 -0
- package/node_modules/@appport/protocol/dist/validate.d.ts.map +1 -0
- package/node_modules/@appport/protocol/dist/validate.js +321 -0
- package/node_modules/@appport/protocol/dist/validate.js.map +1 -0
- package/node_modules/@appport/protocol/dist/version.d.ts +27 -0
- package/node_modules/@appport/protocol/dist/version.d.ts.map +1 -0
- package/node_modules/@appport/protocol/dist/version.js +26 -0
- package/node_modules/@appport/protocol/dist/version.js.map +1 -0
- package/node_modules/@appport/protocol/package.json +25 -0
- package/node_modules/@appport/schema/README.md +32 -0
- package/node_modules/@appport/schema/dist/builder.d.ts +85 -0
- package/node_modules/@appport/schema/dist/builder.d.ts.map +1 -0
- package/node_modules/@appport/schema/dist/builder.js +278 -0
- package/node_modules/@appport/schema/dist/builder.js.map +1 -0
- package/node_modules/@appport/schema/dist/from-json-schema.d.ts +12 -0
- package/node_modules/@appport/schema/dist/from-json-schema.d.ts.map +1 -0
- package/node_modules/@appport/schema/dist/from-json-schema.js +186 -0
- package/node_modules/@appport/schema/dist/from-json-schema.js.map +1 -0
- package/node_modules/@appport/schema/dist/index.d.ts +23 -0
- package/node_modules/@appport/schema/dist/index.d.ts.map +1 -0
- package/node_modules/@appport/schema/dist/index.js +22 -0
- package/node_modules/@appport/schema/dist/index.js.map +1 -0
- package/node_modules/@appport/schema/dist/standard.d.ts +46 -0
- package/node_modules/@appport/schema/dist/standard.d.ts.map +1 -0
- package/node_modules/@appport/schema/dist/standard.js +42 -0
- package/node_modules/@appport/schema/dist/standard.js.map +1 -0
- package/node_modules/@appport/schema/dist/types.d.ts +40 -0
- package/node_modules/@appport/schema/dist/types.d.ts.map +1 -0
- package/node_modules/@appport/schema/dist/types.js +19 -0
- package/node_modules/@appport/schema/dist/types.js.map +1 -0
- package/node_modules/@appport/schema/package.json +28 -0
- package/node_modules/@appport/server/README.md +39 -0
- package/node_modules/@appport/server/dist/connection.d.ts +45 -0
- package/node_modules/@appport/server/dist/connection.d.ts.map +1 -0
- package/node_modules/@appport/server/dist/connection.js +217 -0
- package/node_modules/@appport/server/dist/connection.js.map +1 -0
- package/node_modules/@appport/server/dist/fetch.d.ts +10 -0
- package/node_modules/@appport/server/dist/fetch.d.ts.map +1 -0
- package/node_modules/@appport/server/dist/fetch.js +50 -0
- package/node_modules/@appport/server/dist/fetch.js.map +1 -0
- package/node_modules/@appport/server/dist/http.d.ts +80 -0
- package/node_modules/@appport/server/dist/http.d.ts.map +1 -0
- package/node_modules/@appport/server/dist/http.js +306 -0
- package/node_modules/@appport/server/dist/http.js.map +1 -0
- package/node_modules/@appport/server/dist/index.d.ts +11 -0
- package/node_modules/@appport/server/dist/index.d.ts.map +1 -0
- package/node_modules/@appport/server/dist/index.js +11 -0
- package/node_modules/@appport/server/dist/index.js.map +1 -0
- package/node_modules/@appport/server/dist/node-entry.d.ts +4 -0
- package/node_modules/@appport/server/dist/node-entry.d.ts.map +1 -0
- package/node_modules/@appport/server/dist/node-entry.js +4 -0
- package/node_modules/@appport/server/dist/node-entry.js.map +1 -0
- package/node_modules/@appport/server/dist/node.d.ts +45 -0
- package/node_modules/@appport/server/dist/node.d.ts.map +1 -0
- package/node_modules/@appport/server/dist/node.js +190 -0
- package/node_modules/@appport/server/dist/node.js.map +1 -0
- package/node_modules/@appport/server/dist/server.d.ts +83 -0
- package/node_modules/@appport/server/dist/server.d.ts.map +1 -0
- package/node_modules/@appport/server/dist/server.js +114 -0
- package/node_modules/@appport/server/dist/server.js.map +1 -0
- package/node_modules/@appport/server/dist/websocket.d.ts +25 -0
- package/node_modules/@appport/server/dist/websocket.d.ts.map +1 -0
- package/node_modules/@appport/server/dist/websocket.js +221 -0
- package/node_modules/@appport/server/dist/websocket.js.map +1 -0
- package/node_modules/@appport/server/package.json +34 -0
- package/node_modules/@appport/transport-electron/README.md +56 -0
- package/node_modules/@appport/transport-electron/dist/index.d.ts +11 -0
- package/node_modules/@appport/transport-electron/dist/index.d.ts.map +1 -0
- package/node_modules/@appport/transport-electron/dist/index.js +11 -0
- package/node_modules/@appport/transport-electron/dist/index.js.map +1 -0
- package/node_modules/@appport/transport-electron/dist/main.d.ts +31 -0
- package/node_modules/@appport/transport-electron/dist/main.d.ts.map +1 -0
- package/node_modules/@appport/transport-electron/dist/main.js +61 -0
- package/node_modules/@appport/transport-electron/dist/main.js.map +1 -0
- package/node_modules/@appport/transport-electron/dist/preload.d.ts +22 -0
- package/node_modules/@appport/transport-electron/dist/preload.d.ts.map +1 -0
- package/node_modules/@appport/transport-electron/dist/preload.js +29 -0
- package/node_modules/@appport/transport-electron/dist/preload.js.map +1 -0
- package/node_modules/@appport/transport-electron/dist/renderer.d.ts +16 -0
- package/node_modules/@appport/transport-electron/dist/renderer.d.ts.map +1 -0
- package/node_modules/@appport/transport-electron/dist/renderer.js +36 -0
- package/node_modules/@appport/transport-electron/dist/renderer.js.map +1 -0
- package/node_modules/@appport/transport-electron/dist/types.d.ts +49 -0
- package/node_modules/@appport/transport-electron/dist/types.d.ts.map +1 -0
- package/node_modules/@appport/transport-electron/dist/types.js +5 -0
- package/node_modules/@appport/transport-electron/dist/types.js.map +1 -0
- package/node_modules/@appport/transport-electron/package.json +46 -0
- package/node_modules/@appport/transport-http/README.md +24 -0
- package/node_modules/@appport/transport-http/dist/index.d.ts +18 -0
- package/node_modules/@appport/transport-http/dist/index.d.ts.map +1 -0
- package/node_modules/@appport/transport-http/dist/index.js +223 -0
- package/node_modules/@appport/transport-http/dist/index.js.map +1 -0
- package/node_modules/@appport/transport-http/package.json +29 -0
- package/node_modules/@appport/transport-inprocess/README.md +24 -0
- package/node_modules/@appport/transport-inprocess/dist/index.d.ts +16 -0
- package/node_modules/@appport/transport-inprocess/dist/index.d.ts.map +1 -0
- package/node_modules/@appport/transport-inprocess/dist/index.js +30 -0
- package/node_modules/@appport/transport-inprocess/dist/index.js.map +1 -0
- package/node_modules/@appport/transport-inprocess/package.json +30 -0
- package/node_modules/@appport/transport-tauri/README.md +45 -0
- package/node_modules/@appport/transport-tauri/dist/index.d.ts +23 -0
- package/node_modules/@appport/transport-tauri/dist/index.d.ts.map +1 -0
- package/node_modules/@appport/transport-tauri/dist/index.js +44 -0
- package/node_modules/@appport/transport-tauri/dist/index.js.map +1 -0
- package/node_modules/@appport/transport-tauri/package.json +29 -0
- package/node_modules/@appport/transport-websocket/README.md +22 -0
- package/node_modules/@appport/transport-websocket/dist/index.d.ts +26 -0
- package/node_modules/@appport/transport-websocket/dist/index.d.ts.map +1 -0
- package/node_modules/@appport/transport-websocket/dist/index.js +72 -0
- package/node_modules/@appport/transport-websocket/dist/index.js.map +1 -0
- package/node_modules/@appport/transport-websocket/package.json +29 -0
- package/package.json +79 -0
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AppBoundry Application Contract (F6)
|
|
3
|
+
*
|
|
4
|
+
* The singular, AppBoundry-owned description of an application: its identity,
|
|
5
|
+
* its contract revision, its canonical fingerprint, and the capabilities it
|
|
6
|
+
* provides and requires.
|
|
7
|
+
*
|
|
8
|
+
* A repository represents this contract with `appboundry.contract.json`. That
|
|
9
|
+
* document is an *attestation target*: it is a read-only representation of the
|
|
10
|
+
* contract AppBoundry owns. It is NOT an independently authored contract and it
|
|
11
|
+
* is NOT interchangeable with the runtime implementation manifest
|
|
12
|
+
* (see `runtime-manifest.ts`).
|
|
13
|
+
*
|
|
14
|
+
* The document therefore MUST NOT contain authorization grants, bindings,
|
|
15
|
+
* credentials, runtime process state, provider selections, execution state or
|
|
16
|
+
* mutable implementation state. Parsing rejects those fields explicitly.
|
|
17
|
+
*/
|
|
18
|
+
import { fingerprintManifest } from "./manifest.js";
|
|
19
|
+
/** Protocol identifier of the repository contract representation. */
|
|
20
|
+
export const APPBOUNDRY_CONTRACT_PROTOCOL = "AppBoundry/contract/1";
|
|
21
|
+
/** Canonical file name of the repository contract representation. */
|
|
22
|
+
export const APPBOUNDRY_CONTRACT_FILE = "appboundry.contract.json";
|
|
23
|
+
/** Fields a contract document may never carry: they belong to other authorities. */
|
|
24
|
+
const FORBIDDEN_CONTRACT_FIELDS = [
|
|
25
|
+
"authorization",
|
|
26
|
+
"authorizations",
|
|
27
|
+
"grants",
|
|
28
|
+
"bindings",
|
|
29
|
+
"credentials",
|
|
30
|
+
"secrets",
|
|
31
|
+
"artifacts",
|
|
32
|
+
"artifactHash",
|
|
33
|
+
"providers",
|
|
34
|
+
"providerSelection",
|
|
35
|
+
"executions",
|
|
36
|
+
"implementations",
|
|
37
|
+
"runtime"
|
|
38
|
+
];
|
|
39
|
+
/** Explicit contract-document failure; never silently downgraded to a manifest. */
|
|
40
|
+
export class AppBoundryContractError extends Error {
|
|
41
|
+
code;
|
|
42
|
+
constructor(code, message) {
|
|
43
|
+
super(message);
|
|
44
|
+
this.code = code;
|
|
45
|
+
this.name = "AppBoundryContractError";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Project a contract document onto the canonical manifest shape used for
|
|
50
|
+
* fingerprinting. The projection exists so the AppBoundry contract and the
|
|
51
|
+
* authoritative application registration share one fingerprint algorithm
|
|
52
|
+
* without the two schemas becoming interchangeable.
|
|
53
|
+
*/
|
|
54
|
+
export function contractManifestProjection(contract) {
|
|
55
|
+
return {
|
|
56
|
+
protocol: "AppPort/1",
|
|
57
|
+
application: { id: contract.application.id, name: contract.application.name, version: contract.application.version },
|
|
58
|
+
...(contract.metadata !== undefined ? { metadata: contract.metadata } : {}),
|
|
59
|
+
provides: contract.provides,
|
|
60
|
+
requires: contract.requires
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** Canonical fingerprint of a contract document's own content. */
|
|
64
|
+
export function fingerprintAppBoundryContract(contract) {
|
|
65
|
+
return fingerprintManifest(contractManifestProjection(contract));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Derive the repository contract representation from the authoritative manifest.
|
|
69
|
+
*
|
|
70
|
+
* AppBoundry owns the contract; this only renders it for a repository to commit.
|
|
71
|
+
*/
|
|
72
|
+
export function appBoundryContractFromManifest(manifest, contractRevision = 1) {
|
|
73
|
+
if (!Number.isInteger(contractRevision) || contractRevision < 1) {
|
|
74
|
+
throw new AppBoundryContractError("CONTRACT_DOCUMENT_INVALID", "contractRevision must be a positive integer");
|
|
75
|
+
}
|
|
76
|
+
const document = {
|
|
77
|
+
protocol: APPBOUNDRY_CONTRACT_PROTOCOL,
|
|
78
|
+
application: { id: manifest.application.id, name: manifest.application.name, version: manifest.application.version },
|
|
79
|
+
contractRevision,
|
|
80
|
+
contractFingerprint: "",
|
|
81
|
+
...(manifest.metadata !== undefined ? { metadata: manifest.metadata } : {}),
|
|
82
|
+
provides: manifest.provides,
|
|
83
|
+
requires: manifest.requires
|
|
84
|
+
};
|
|
85
|
+
return { ...document, contractFingerprint: fingerprintAppBoundryContract(document) };
|
|
86
|
+
}
|
|
87
|
+
/** Serialize the contract representation for `appboundry.contract.json`. */
|
|
88
|
+
export function serializeAppBoundryContract(contract) {
|
|
89
|
+
return `${JSON.stringify(contract, null, 2)}\n`;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Parse and validate a repository contract representation.
|
|
93
|
+
*
|
|
94
|
+
* Anything that is not an AppBoundry contract — most importantly a runtime
|
|
95
|
+
* implementation manifest — is rejected explicitly rather than coerced.
|
|
96
|
+
*/
|
|
97
|
+
export function parseAppBoundryContract(value) {
|
|
98
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
99
|
+
throw new AppBoundryContractError("CONTRACT_DOCUMENT_INVALID", "The AppBoundry contract must be a JSON object");
|
|
100
|
+
}
|
|
101
|
+
const candidate = value;
|
|
102
|
+
if (candidate.protocol !== APPBOUNDRY_CONTRACT_PROTOCOL) {
|
|
103
|
+
throw new AppBoundryContractError("CONTRACT_DOCUMENT_NOT_A_CONTRACT", `Expected protocol "${APPBOUNDRY_CONTRACT_PROTOCOL}" but found "${String(candidate.protocol)}". A runtime implementation manifest is not an AppBoundry contract.`);
|
|
104
|
+
}
|
|
105
|
+
for (const field of FORBIDDEN_CONTRACT_FIELDS) {
|
|
106
|
+
if (field in candidate) {
|
|
107
|
+
throw new AppBoundryContractError("CONTRACT_DOCUMENT_INVALID", `The AppBoundry contract must not declare "${field}"`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const application = candidate.application;
|
|
111
|
+
for (const field of ["id", "name", "version"]) {
|
|
112
|
+
if (typeof application?.[field] !== "string" || !application[field].length) {
|
|
113
|
+
throw new AppBoundryContractError("CONTRACT_DOCUMENT_INVALID", `application.${field} must be a non-empty string`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (!Number.isInteger(candidate.contractRevision) || candidate.contractRevision < 1) {
|
|
117
|
+
throw new AppBoundryContractError("CONTRACT_DOCUMENT_INVALID", "contractRevision must be a positive integer");
|
|
118
|
+
}
|
|
119
|
+
if (typeof candidate.contractFingerprint !== "string" || !candidate.contractFingerprint.length) {
|
|
120
|
+
throw new AppBoundryContractError("CONTRACT_DOCUMENT_INVALID", "contractFingerprint must be a non-empty string");
|
|
121
|
+
}
|
|
122
|
+
if (!Array.isArray(candidate.provides) || !Array.isArray(candidate.requires)) {
|
|
123
|
+
throw new AppBoundryContractError("CONTRACT_DOCUMENT_INVALID", "provides and requires must be arrays");
|
|
124
|
+
}
|
|
125
|
+
const provided = new Set();
|
|
126
|
+
for (const entry of candidate.provides) {
|
|
127
|
+
if (typeof entry?.name !== "string" || !Number.isInteger(entry?.version)) {
|
|
128
|
+
throw new AppBoundryContractError("CONTRACT_DOCUMENT_INVALID", "every provided capability needs a name and integer version");
|
|
129
|
+
}
|
|
130
|
+
const key = `${entry.name}@${entry.version}`;
|
|
131
|
+
if (provided.has(key))
|
|
132
|
+
throw new AppBoundryContractError("CONTRACT_DOCUMENT_INVALID", `duplicate provided capability ${key}`);
|
|
133
|
+
provided.add(key);
|
|
134
|
+
}
|
|
135
|
+
const required = new Set();
|
|
136
|
+
for (const entry of candidate.requires) {
|
|
137
|
+
if (typeof entry?.name !== "string" || !Number.isInteger(entry?.version) || (entry.versionConstraint !== undefined && typeof entry.versionConstraint !== "string")) {
|
|
138
|
+
throw new AppBoundryContractError("CONTRACT_DOCUMENT_INVALID", "every requirement needs a name, integer version, and optional string versionConstraint");
|
|
139
|
+
}
|
|
140
|
+
const key = `${entry.name}@${entry.versionConstraint ?? entry.version}`;
|
|
141
|
+
if (required.has(key))
|
|
142
|
+
throw new AppBoundryContractError("CONTRACT_DOCUMENT_INVALID", `duplicate requirement ${key}`);
|
|
143
|
+
required.add(key);
|
|
144
|
+
}
|
|
145
|
+
const document = candidate;
|
|
146
|
+
const computed = fingerprintAppBoundryContract(document);
|
|
147
|
+
if (computed !== document.contractFingerprint) {
|
|
148
|
+
throw new AppBoundryContractError("CONTRACT_DOCUMENT_FINGERPRINT_INVALID", `The contract document does not describe its own fingerprint. Declared ${document.contractFingerprint}, canonical ${computed}.`);
|
|
149
|
+
}
|
|
150
|
+
return document;
|
|
151
|
+
}
|
|
152
|
+
/** Canonical key for a capability within a contract or coverage declaration. */
|
|
153
|
+
export function capabilityCoverageKey(capability) {
|
|
154
|
+
return `${capability.name}@${capability.version}`;
|
|
155
|
+
}
|
|
156
|
+
/** Capabilities the contract declares, as canonical coverage keys. */
|
|
157
|
+
export function contractProvidedCoverage(contract) {
|
|
158
|
+
return contract.provides.map(capabilityCoverageKey).sort();
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=appboundry-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appboundry-contract.js","sourceRoot":"","sources":["../src/appboundry-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application Implementations (F6)
|
|
3
|
+
*
|
|
4
|
+
* An implementation is the executable association between an application
|
|
5
|
+
* capability, a verified source connection, and an artifact. It carries no
|
|
6
|
+
* application identity and no authorization of its own.
|
|
7
|
+
*
|
|
8
|
+
* Runtime order is unchanged by F6:
|
|
9
|
+
*
|
|
10
|
+
* discovery → compatibility → authorization → binding
|
|
11
|
+
* → implementation selection → materialization → execution
|
|
12
|
+
*
|
|
13
|
+
* Implementation selection therefore requires an authorized binding, and the
|
|
14
|
+
* selection is revalidated against durable authority before materialization so
|
|
15
|
+
* a serialized binding can never turn eligibility into an in-memory assumption.
|
|
16
|
+
*/
|
|
17
|
+
import type { AuthoritativeApplicationContract } from "./contract-attestation.js";
|
|
18
|
+
import { type ApplicationSourceStore } from "./application-source.js";
|
|
19
|
+
import { type AuthorizedCapabilityBinding } from "./binding.js";
|
|
20
|
+
import type { ExecutableArtifact } from "./artifact.js";
|
|
21
|
+
export type ApplicationImplementationStatus = "verified" | "stale" | "revoked" | "failed";
|
|
22
|
+
/** Durable record of one executable implementation of one capability. */
|
|
23
|
+
export interface ApplicationImplementation {
|
|
24
|
+
readonly id: string;
|
|
25
|
+
readonly applicationId: string;
|
|
26
|
+
readonly sourceConnectionId: string;
|
|
27
|
+
readonly capability: {
|
|
28
|
+
readonly name: string;
|
|
29
|
+
readonly version: number;
|
|
30
|
+
};
|
|
31
|
+
readonly contractFingerprint: string;
|
|
32
|
+
readonly artifactHash: string;
|
|
33
|
+
readonly status: ApplicationImplementationStatus;
|
|
34
|
+
readonly sequence: number;
|
|
35
|
+
readonly createdAt: string;
|
|
36
|
+
readonly verifiedAt?: string;
|
|
37
|
+
}
|
|
38
|
+
export interface ApplicationImplementationStore {
|
|
39
|
+
get(applicationId: string, implementationId: string): Promise<ApplicationImplementation | undefined>;
|
|
40
|
+
put(record: ApplicationImplementation, expectedSequence?: number): Promise<void>;
|
|
41
|
+
list(applicationId?: string): Promise<ApplicationImplementation[]>;
|
|
42
|
+
}
|
|
43
|
+
export declare class ApplicationImplementationConflictError extends Error {
|
|
44
|
+
constructor(id: string);
|
|
45
|
+
}
|
|
46
|
+
export declare class MemoryApplicationImplementationStore implements ApplicationImplementationStore {
|
|
47
|
+
#private;
|
|
48
|
+
get(applicationId: string, implementationId: string): Promise<ApplicationImplementation | undefined>;
|
|
49
|
+
put(record: ApplicationImplementation, expectedSequence?: number): Promise<void>;
|
|
50
|
+
list(applicationId?: string): Promise<ApplicationImplementation[]>;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The implementation chosen for one authorized execution.
|
|
54
|
+
*
|
|
55
|
+
* Structural data only: the durable proof that selected it is module-private,
|
|
56
|
+
* exactly as binding issuance is.
|
|
57
|
+
*/
|
|
58
|
+
export interface SelectedImplementation {
|
|
59
|
+
readonly implementationId: string;
|
|
60
|
+
readonly sourceConnectionId: string;
|
|
61
|
+
readonly applicationId: string;
|
|
62
|
+
readonly capability: {
|
|
63
|
+
readonly name: string;
|
|
64
|
+
readonly version: number;
|
|
65
|
+
};
|
|
66
|
+
readonly contractFingerprint: string;
|
|
67
|
+
readonly artifactHash: string;
|
|
68
|
+
}
|
|
69
|
+
/** Throws unless the selection was issued by ApplicationImplementationOperations. */
|
|
70
|
+
export declare function assertIssuedImplementationSelection(selection: SelectedImplementation): void;
|
|
71
|
+
/** Revalidate the selection against durable source/implementation authority. */
|
|
72
|
+
export declare function assertImplementationSelectionEligible(selection: SelectedImplementation): Promise<void>;
|
|
73
|
+
/** The artifact must be the exact artifact the selected implementation names. */
|
|
74
|
+
export declare function assertArtifactMatchesSelection(selection: SelectedImplementation, artifact: ExecutableArtifact): void;
|
|
75
|
+
/** Registers, revalidates and selects implementations from verified sources. */
|
|
76
|
+
export declare class ApplicationImplementationOperations {
|
|
77
|
+
#private;
|
|
78
|
+
private readonly store;
|
|
79
|
+
private readonly sources;
|
|
80
|
+
private readonly authority;
|
|
81
|
+
private readonly now;
|
|
82
|
+
constructor(store: ApplicationImplementationStore, sources: ApplicationSourceStore, authority: AuthoritativeApplicationContract, now?: () => string);
|
|
83
|
+
/**
|
|
84
|
+
* Register an executable implementation for a verified source.
|
|
85
|
+
*
|
|
86
|
+
* The contract fingerprint is derived from authority, never accepted from the
|
|
87
|
+
* caller, and the capability must be covered by the source connection.
|
|
88
|
+
*/
|
|
89
|
+
register(input: {
|
|
90
|
+
applicationId: string;
|
|
91
|
+
sourceConnectionId: string;
|
|
92
|
+
capability: {
|
|
93
|
+
name: string;
|
|
94
|
+
version: number;
|
|
95
|
+
};
|
|
96
|
+
artifactHash: string;
|
|
97
|
+
}): Promise<ApplicationImplementation>;
|
|
98
|
+
/** Revoke an implementation without touching the application or its history. */
|
|
99
|
+
revoke(applicationId: string, implementationId: string): Promise<ApplicationImplementation>;
|
|
100
|
+
/** Mark implementations of superseded contract revisions stale. */
|
|
101
|
+
refresh(applicationId: string): Promise<ApplicationImplementation[]>;
|
|
102
|
+
/**
|
|
103
|
+
* Implementations that may currently execute a capability, in deterministic
|
|
104
|
+
* order: source identity first, then implementation identity. Selection is
|
|
105
|
+
* never timing-dependent.
|
|
106
|
+
*/
|
|
107
|
+
eligible(applicationId: string, capability: {
|
|
108
|
+
name: string;
|
|
109
|
+
version: number;
|
|
110
|
+
}): Promise<ApplicationImplementation[]>;
|
|
111
|
+
/**
|
|
112
|
+
* Select an implementation for an authorized binding.
|
|
113
|
+
*
|
|
114
|
+
* Provider resolution has already chosen the *application*; this chooses an
|
|
115
|
+
* eligible source/artifact for it. Without an authorized, still-authoritative
|
|
116
|
+
* binding there is no selection and therefore no materialization.
|
|
117
|
+
*/
|
|
118
|
+
selectForBinding(binding: AuthorizedCapabilityBinding, capability: {
|
|
119
|
+
name: string;
|
|
120
|
+
version: number;
|
|
121
|
+
}): Promise<SelectedImplementation>;
|
|
122
|
+
get: (applicationId: string, implementationId: string) => Promise<ApplicationImplementation | undefined>;
|
|
123
|
+
list: (applicationId?: string) => Promise<ApplicationImplementation[]>;
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=application-implementation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application-implementation.d.ts","sourceRoot":"","sources":["../src/application-implementation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Application Implementations (F6)
|
|
3
|
+
*
|
|
4
|
+
* An implementation is the executable association between an application
|
|
5
|
+
* capability, a verified source connection, and an artifact. It carries no
|
|
6
|
+
* application identity and no authorization of its own.
|
|
7
|
+
*
|
|
8
|
+
* Runtime order is unchanged by F6:
|
|
9
|
+
*
|
|
10
|
+
* discovery → compatibility → authorization → binding
|
|
11
|
+
* → implementation selection → materialization → execution
|
|
12
|
+
*
|
|
13
|
+
* Implementation selection therefore requires an authorized binding, and the
|
|
14
|
+
* selection is revalidated against durable authority before materialization so
|
|
15
|
+
* a serialized binding can never turn eligibility into an in-memory assumption.
|
|
16
|
+
*/
|
|
17
|
+
import { randomUUID } from "node:crypto";
|
|
18
|
+
import { capabilityCoverageKey } from "./appboundry-contract.js";
|
|
19
|
+
import { sourceIsEligible } from "./application-source.js";
|
|
20
|
+
import { assertBindingAuthoritative } from "./authority-attestation.js";
|
|
21
|
+
import { assertIssuedAuthorizedBinding } from "./binding.js";
|
|
22
|
+
export class ApplicationImplementationConflictError extends Error {
|
|
23
|
+
constructor(id) {
|
|
24
|
+
super(`Concurrent application implementation update rejected for "${id}"`);
|
|
25
|
+
this.name = "ApplicationImplementationConflictError";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export class MemoryApplicationImplementationStore {
|
|
29
|
+
#records = new Map();
|
|
30
|
+
async get(applicationId, implementationId) {
|
|
31
|
+
const found = this.#records.get(`${applicationId}:${implementationId}`);
|
|
32
|
+
return found && structuredClone(found);
|
|
33
|
+
}
|
|
34
|
+
async put(record, expectedSequence) {
|
|
35
|
+
const key = `${record.applicationId}:${record.id}`;
|
|
36
|
+
if (this.#records.get(key)?.sequence !== expectedSequence)
|
|
37
|
+
throw new ApplicationImplementationConflictError(record.id);
|
|
38
|
+
this.#records.set(key, structuredClone(record));
|
|
39
|
+
}
|
|
40
|
+
async list(applicationId) {
|
|
41
|
+
return [...this.#records.values()]
|
|
42
|
+
.filter((record) => !applicationId || record.applicationId === applicationId)
|
|
43
|
+
.map((record) => structuredClone(record))
|
|
44
|
+
.sort((left, right) => left.id.localeCompare(right.id));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const issuedSelections = new WeakSet();
|
|
48
|
+
const selectionValidators = new WeakMap();
|
|
49
|
+
/** Throws unless the selection was issued by ApplicationImplementationOperations. */
|
|
50
|
+
export function assertIssuedImplementationSelection(selection) {
|
|
51
|
+
if (typeof selection !== "object" || selection === null || !issuedSelections.has(selection)) {
|
|
52
|
+
throw new Error("Implementation selection was not issued by application implementation authority");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** Revalidate the selection against durable source/implementation authority. */
|
|
56
|
+
export async function assertImplementationSelectionEligible(selection) {
|
|
57
|
+
assertIssuedImplementationSelection(selection);
|
|
58
|
+
await selectionValidators.get(selection)?.();
|
|
59
|
+
}
|
|
60
|
+
/** The artifact must be the exact artifact the selected implementation names. */
|
|
61
|
+
export function assertArtifactMatchesSelection(selection, artifact) {
|
|
62
|
+
if (artifact.contentHash !== selection.artifactHash) {
|
|
63
|
+
throw new Error(`Artifact ${artifact.contentHash} is not the selected implementation artifact ${selection.artifactHash}`);
|
|
64
|
+
}
|
|
65
|
+
if (artifact.metadata.contractFingerprint !== selection.contractFingerprint) {
|
|
66
|
+
throw new Error("Artifact contract fingerprint does not match the selected implementation");
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Registers, revalidates and selects implementations from verified sources. */
|
|
70
|
+
export class ApplicationImplementationOperations {
|
|
71
|
+
store;
|
|
72
|
+
sources;
|
|
73
|
+
authority;
|
|
74
|
+
now;
|
|
75
|
+
constructor(store, sources, authority, now = () => new Date().toISOString()) {
|
|
76
|
+
this.store = store;
|
|
77
|
+
this.sources = sources;
|
|
78
|
+
this.authority = authority;
|
|
79
|
+
this.now = now;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Register an executable implementation for a verified source.
|
|
83
|
+
*
|
|
84
|
+
* The contract fingerprint is derived from authority, never accepted from the
|
|
85
|
+
* caller, and the capability must be covered by the source connection.
|
|
86
|
+
*/
|
|
87
|
+
async register(input) {
|
|
88
|
+
const authoritative = await this.#authoritative(input.applicationId);
|
|
89
|
+
const source = await this.sources.get(input.applicationId, input.sourceConnectionId);
|
|
90
|
+
if (!source)
|
|
91
|
+
throw new Error(`Unknown application source "${input.sourceConnectionId}"`);
|
|
92
|
+
if (!sourceIsEligible(source, authoritative.fingerprint)) {
|
|
93
|
+
throw new Error(`Source "${source.id}" is not a verified implementation source (${source.status})`);
|
|
94
|
+
}
|
|
95
|
+
const key = capabilityCoverageKey(input.capability);
|
|
96
|
+
if (!source.coveredCapabilities.includes(key)) {
|
|
97
|
+
throw new Error(`Source "${source.id}" does not cover capability ${key}`);
|
|
98
|
+
}
|
|
99
|
+
if (typeof input.artifactHash !== "string" || !input.artifactHash.length) {
|
|
100
|
+
throw new Error("artifactHash must be a non-empty string");
|
|
101
|
+
}
|
|
102
|
+
const at = this.now();
|
|
103
|
+
const existing = (await this.store.list(input.applicationId)).find((record) => record.sourceConnectionId === source.id &&
|
|
104
|
+
capabilityCoverageKey(record.capability) === key &&
|
|
105
|
+
record.contractFingerprint === authoritative.fingerprint);
|
|
106
|
+
const record = {
|
|
107
|
+
id: existing?.id ?? `impl_${randomUUID()}`,
|
|
108
|
+
applicationId: input.applicationId,
|
|
109
|
+
sourceConnectionId: source.id,
|
|
110
|
+
capability: { name: input.capability.name, version: input.capability.version },
|
|
111
|
+
contractFingerprint: authoritative.fingerprint,
|
|
112
|
+
artifactHash: input.artifactHash,
|
|
113
|
+
status: "verified",
|
|
114
|
+
sequence: (existing?.sequence ?? 0) + 1,
|
|
115
|
+
createdAt: existing?.createdAt ?? at,
|
|
116
|
+
verifiedAt: at
|
|
117
|
+
};
|
|
118
|
+
await this.store.put(record, existing?.sequence);
|
|
119
|
+
return record;
|
|
120
|
+
}
|
|
121
|
+
/** Revoke an implementation without touching the application or its history. */
|
|
122
|
+
async revoke(applicationId, implementationId) {
|
|
123
|
+
const current = await this.store.get(applicationId, implementationId);
|
|
124
|
+
if (!current)
|
|
125
|
+
throw new Error(`Unknown implementation "${implementationId}"`);
|
|
126
|
+
if (current.status === "revoked")
|
|
127
|
+
return current;
|
|
128
|
+
const next = { ...current, status: "revoked", sequence: current.sequence + 1 };
|
|
129
|
+
await this.store.put(next, current.sequence);
|
|
130
|
+
return next;
|
|
131
|
+
}
|
|
132
|
+
/** Mark implementations of superseded contract revisions stale. */
|
|
133
|
+
async refresh(applicationId) {
|
|
134
|
+
const authoritative = await this.#authoritative(applicationId);
|
|
135
|
+
const refreshed = [];
|
|
136
|
+
for (const record of await this.store.list(applicationId)) {
|
|
137
|
+
if (record.status !== "verified" || record.contractFingerprint === authoritative.fingerprint) {
|
|
138
|
+
refreshed.push(record);
|
|
139
|
+
continue;
|
|
140
|
+
}
|
|
141
|
+
const next = { ...record, status: "stale", sequence: record.sequence + 1 };
|
|
142
|
+
await this.store.put(next, record.sequence);
|
|
143
|
+
refreshed.push(next);
|
|
144
|
+
}
|
|
145
|
+
return refreshed;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Implementations that may currently execute a capability, in deterministic
|
|
149
|
+
* order: source identity first, then implementation identity. Selection is
|
|
150
|
+
* never timing-dependent.
|
|
151
|
+
*/
|
|
152
|
+
async eligible(applicationId, capability) {
|
|
153
|
+
const authoritative = await this.#authoritative(applicationId);
|
|
154
|
+
const sources = new Map((await this.sources.list(applicationId)).map((source) => [source.id, source]));
|
|
155
|
+
const key = capabilityCoverageKey(capability);
|
|
156
|
+
return (await this.store.list(applicationId))
|
|
157
|
+
.filter((record) => this.#eligible(record, sources.get(record.sourceConnectionId), authoritative.fingerprint, key))
|
|
158
|
+
.sort((left, right) => this.#order(left, right, sources));
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Select an implementation for an authorized binding.
|
|
162
|
+
*
|
|
163
|
+
* Provider resolution has already chosen the *application*; this chooses an
|
|
164
|
+
* eligible source/artifact for it. Without an authorized, still-authoritative
|
|
165
|
+
* binding there is no selection and therefore no materialization.
|
|
166
|
+
*/
|
|
167
|
+
async selectForBinding(binding, capability) {
|
|
168
|
+
assertIssuedAuthorizedBinding(binding);
|
|
169
|
+
await assertBindingAuthoritative(binding);
|
|
170
|
+
const applicationId = binding.provider.id;
|
|
171
|
+
const candidates = await this.eligible(applicationId, capability);
|
|
172
|
+
const chosen = candidates[0];
|
|
173
|
+
if (!chosen) {
|
|
174
|
+
throw new Error(`No eligible implementation for ${capabilityCoverageKey(capability)} of application "${applicationId}"`);
|
|
175
|
+
}
|
|
176
|
+
const selection = {
|
|
177
|
+
implementationId: chosen.id,
|
|
178
|
+
sourceConnectionId: chosen.sourceConnectionId,
|
|
179
|
+
applicationId,
|
|
180
|
+
capability: { name: capability.name, version: capability.version },
|
|
181
|
+
contractFingerprint: chosen.contractFingerprint,
|
|
182
|
+
artifactHash: chosen.artifactHash
|
|
183
|
+
};
|
|
184
|
+
issuedSelections.add(selection);
|
|
185
|
+
selectionValidators.set(selection, () => this.#assertStillEligible(selection));
|
|
186
|
+
return selection;
|
|
187
|
+
}
|
|
188
|
+
get = (applicationId, implementationId) => this.store.get(applicationId, implementationId);
|
|
189
|
+
list = (applicationId) => this.store.list(applicationId);
|
|
190
|
+
/** Re-read durable authority and confirm the selection is still executable. */
|
|
191
|
+
async #assertStillEligible(selection) {
|
|
192
|
+
const authoritative = await this.#authoritative(selection.applicationId);
|
|
193
|
+
const record = await this.store.get(selection.applicationId, selection.implementationId);
|
|
194
|
+
const source = await this.sources.get(selection.applicationId, selection.sourceConnectionId);
|
|
195
|
+
const key = capabilityCoverageKey(selection.capability);
|
|
196
|
+
if (!record || !this.#eligible(record, source, authoritative.fingerprint, key) || record.artifactHash !== selection.artifactHash) {
|
|
197
|
+
throw new Error(`Implementation "${selection.implementationId}" is no longer an eligible implementation`);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
#eligible(record, source, authoritativeFingerprint, capabilityKey) {
|
|
201
|
+
return (record.status === "verified" &&
|
|
202
|
+
record.contractFingerprint === authoritativeFingerprint &&
|
|
203
|
+
capabilityCoverageKey(record.capability) === capabilityKey &&
|
|
204
|
+
!!source &&
|
|
205
|
+
sourceIsEligible(source, authoritativeFingerprint) &&
|
|
206
|
+
source.coveredCapabilities.includes(capabilityKey));
|
|
207
|
+
}
|
|
208
|
+
#order(left, right, sources) {
|
|
209
|
+
const leftSource = sources.get(left.sourceConnectionId)?.repositoryIdentity ?? left.sourceConnectionId;
|
|
210
|
+
const rightSource = sources.get(right.sourceConnectionId)?.repositoryIdentity ?? right.sourceConnectionId;
|
|
211
|
+
return leftSource.localeCompare(rightSource) || left.artifactHash.localeCompare(right.artifactHash) || left.id.localeCompare(right.id);
|
|
212
|
+
}
|
|
213
|
+
async #authoritative(applicationId) {
|
|
214
|
+
const authoritative = await this.authority.get(applicationId);
|
|
215
|
+
if (!authoritative)
|
|
216
|
+
throw new Error(`Unknown application "${applicationId}"`);
|
|
217
|
+
return authoritative;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=application-implementation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application-implementation.js","sourceRoot":"","sources":["../src/application-implementation.ts"],"names":[],"mappings":"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"}
|