@astrale-os/kernel-protocol 0.5.0-beta.3 → 0.5.0-beta.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +683 -0
- package/dist/artifact/index.d.ts +0 -1
- package/dist/artifact/index.js +0 -1
- package/dist/artifact/ref.d.ts +0 -1
- package/dist/artifact/ref.js +0 -1
- package/dist/codecs/codec.d.ts +0 -1
- package/dist/codecs/codec.js +0 -1
- package/dist/codecs/index.d.ts +0 -1
- package/dist/codecs/index.js +0 -1
- package/dist/codecs/json.d.ts +0 -1
- package/dist/codecs/json.js +0 -1
- package/dist/codecs/media-types.d.ts +0 -1
- package/dist/codecs/media-types.js +0 -1
- package/dist/codecs/msgpack.d.ts +0 -1
- package/dist/codecs/msgpack.js +1 -5
- package/dist/errors/codes.d.ts +0 -1
- package/dist/errors/codes.js +0 -1
- package/dist/errors/http-status.d.ts +0 -1
- package/dist/errors/http-status.js +0 -1
- package/dist/errors/index.d.ts +0 -1
- package/dist/errors/index.js +0 -1
- package/dist/errors/payload.d.ts +0 -1
- package/dist/errors/payload.js +3 -3
- package/dist/errors/protocol-error.d.ts +0 -1
- package/dist/errors/protocol-error.js +4 -3
- package/dist/errors/reason.d.ts +0 -1
- package/dist/errors/reason.js +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/invocation/admission.d.ts +2 -3
- package/dist/invocation/admission.js +5 -8
- package/dist/invocation/binary.d.ts +1 -1
- package/dist/invocation/binary.js +14 -2
- package/dist/invocation/binding-codecs.d.ts +0 -1
- package/dist/invocation/binding-codecs.js +0 -1
- package/dist/invocation/cancellation.d.ts +0 -1
- package/dist/invocation/cancellation.js +0 -1
- package/dist/invocation/correlation.d.ts +0 -1
- package/dist/invocation/correlation.js +0 -1
- package/dist/invocation/delegate.d.ts +0 -1
- package/dist/invocation/delegate.js +0 -1
- package/dist/invocation/http/binary.d.ts +3 -2
- package/dist/invocation/http/binary.js +4 -2
- package/dist/invocation/http/index.d.ts +1 -2
- package/dist/invocation/http/index.js +1 -2
- package/dist/invocation/http/negotiation.d.ts +0 -1
- package/dist/invocation/http/negotiation.js +0 -1
- package/dist/invocation/http/stream.d.ts +0 -1
- package/dist/invocation/http/stream.js +0 -1
- package/dist/invocation/http/trace.d.ts +0 -1
- package/dist/invocation/http/trace.js +0 -1
- package/dist/invocation/idempotency.d.ts +0 -1
- package/dist/invocation/idempotency.js +0 -1
- package/dist/invocation/identity.d.ts +0 -1
- package/dist/invocation/identity.js +0 -1
- package/dist/invocation/index.d.ts +1 -2
- package/dist/invocation/index.js +1 -2
- package/dist/invocation/miss.d.ts +0 -1
- package/dist/invocation/miss.js +0 -1
- package/dist/invocation/redirect.d.ts +9 -8
- package/dist/invocation/redirect.js +6 -5
- package/dist/invocation/request.d.ts +0 -1
- package/dist/invocation/request.js +0 -1
- package/dist/invocation/response.d.ts +0 -1
- package/dist/invocation/response.js +0 -1
- package/dist/invocation/routing.d.ts +3 -3
- package/dist/invocation/routing.js +4 -4
- package/dist/invocation/schema.d.ts +2 -3
- package/dist/invocation/schema.js +2 -3
- package/dist/invocation/service-reason.d.ts +13 -13
- package/dist/invocation/service-reason.js +14 -14
- package/dist/invocation/stale-route.d.ts +0 -1
- package/dist/invocation/stale-route.js +0 -1
- package/dist/invocation/stream.d.ts +0 -1
- package/dist/invocation/stream.js +0 -1
- package/dist/invocation/target.d.ts +2 -3
- package/dist/invocation/target.js +0 -1
- package/dist/invocation/trace.d.ts +0 -1
- package/dist/invocation/trace.js +0 -1
- package/dist/invocation/version.d.ts +0 -1
- package/dist/invocation/version.js +0 -1
- package/dist/invocation/websocket/binary.d.ts +0 -1
- package/dist/invocation/websocket/binary.js +2 -2
- package/dist/invocation/websocket/index.d.ts +0 -1
- package/dist/invocation/websocket/index.js +0 -1
- package/dist/invocation/websocket/subprotocol.d.ts +0 -1
- package/dist/invocation/websocket/subprotocol.js +0 -1
- package/dist/issuer/configuration.d.ts +1 -2
- package/dist/issuer/configuration.js +0 -1
- package/dist/issuer/error.d.ts +0 -1
- package/dist/issuer/error.js +0 -1
- package/dist/issuer/exchange.d.ts +0 -1
- package/dist/issuer/exchange.js +0 -1
- package/dist/issuer/hosted.d.ts +1 -2
- package/dist/issuer/hosted.js +0 -1
- package/dist/issuer/index.d.ts +0 -1
- package/dist/issuer/index.js +0 -1
- package/dist/issuer/key-set.d.ts +1 -2
- package/dist/issuer/key-set.js +3 -3
- package/dist/issuer/paths.d.ts +0 -1
- package/dist/issuer/paths.js +0 -1
- package/dist/issuer/url.d.ts +1 -2
- package/dist/issuer/url.js +3 -3
- package/dist/publication/bindings/callable.d.ts +1 -2
- package/dist/publication/bindings/callable.js +8 -6
- package/dist/publication/bindings/index.d.ts +1 -2
- package/dist/publication/bindings/index.js +0 -1
- package/dist/publication/bindings/invocation.d.ts +0 -1
- package/dist/publication/bindings/invocation.js +0 -1
- package/dist/publication/bindings/view.d.ts +8 -2
- package/dist/publication/bindings/view.js +112 -4
- package/dist/publication/bundle-admission.d.ts +4 -0
- package/dist/publication/bundle-admission.js +65 -0
- package/dist/publication/bundle-descriptor.d.ts +9 -0
- package/dist/publication/bundle-descriptor.js +19 -0
- package/dist/publication/bundle-evidence.d.ts +3 -0
- package/dist/publication/bundle-evidence.js +13 -0
- package/dist/publication/bundle.d.ts +5 -12
- package/dist/publication/bundle.js +8 -29
- package/dist/publication/content.d.ts +0 -1
- package/dist/publication/content.js +0 -1
- package/dist/publication/declaration.d.ts +11 -0
- package/dist/publication/declaration.js +1 -0
- package/dist/publication/delivery/attestation.d.ts +0 -1
- package/dist/publication/delivery/attestation.js +0 -1
- package/dist/publication/delivery/claims.d.ts +8 -8
- package/dist/publication/delivery/claims.js +6 -7
- package/dist/publication/delivery/delivery.d.ts +1 -2
- package/dist/publication/delivery/delivery.js +1 -2
- package/dist/publication/delivery/error.d.ts +0 -1
- package/dist/publication/delivery/error.js +0 -1
- package/dist/publication/delivery/index.d.ts +0 -1
- package/dist/publication/delivery/index.js +0 -1
- package/dist/publication/delivery/limits.d.ts +0 -1
- package/dist/publication/delivery/limits.js +0 -1
- package/dist/publication/delivery/request.d.ts +3 -4
- package/dist/publication/delivery/request.js +4 -4
- package/dist/publication/delivery-declaration.d.ts +4 -0
- package/dist/publication/delivery-declaration.js +25 -0
- package/dist/publication/delivery-endpoint.d.ts +0 -1
- package/dist/publication/delivery-endpoint.js +0 -1
- package/dist/publication/error.d.ts +0 -1
- package/dist/publication/error.js +0 -1
- package/dist/publication/etag.d.ts +0 -1
- package/dist/publication/etag.js +0 -1
- package/dist/publication/index.d.ts +8 -5
- package/dist/publication/index.js +4 -2
- package/dist/publication/manifest.d.ts +2 -3
- package/dist/publication/manifest.js +10 -6
- package/dist/publication/publication.d.ts +13 -6
- package/dist/publication/publication.js +50 -71
- package/dist/publication/reference.d.ts +3 -3
- package/dist/publication/reference.js +7 -7
- package/dist/publication/requirements.d.ts +15 -7
- package/dist/publication/requirements.js +137 -47
- package/dist/publication/route.d.ts +6 -2
- package/dist/publication/route.js +31 -9
- package/dist/publication/schema.d.ts +3 -4
- package/dist/publication/schema.js +3 -4
- package/dist/routes/admission.d.ts +3 -0
- package/dist/routes/admission.js +89 -0
- package/dist/routes/binding.d.ts +6 -0
- package/dist/routes/binding.js +27 -0
- package/dist/routes/collision.d.ts +2 -0
- package/dist/routes/collision.js +16 -0
- package/dist/routes/compiler.d.ts +8 -0
- package/dist/routes/compiler.js +50 -0
- package/dist/routes/credential.d.ts +7 -8
- package/dist/routes/credential.js +7 -8
- package/dist/routes/decode.d.ts +4 -3
- package/dist/routes/decode.js +42 -42
- package/dist/routes/encode.d.ts +3 -3
- package/dist/routes/encode.js +31 -33
- package/dist/routes/error-response.d.ts +0 -1
- package/dist/routes/error-response.js +0 -1
- package/dist/routes/error.d.ts +0 -1
- package/dist/routes/error.js +0 -1
- package/dist/routes/evidence.d.ts +5 -0
- package/dist/routes/evidence.js +38 -0
- package/dist/routes/index.d.ts +9 -3
- package/dist/routes/index.js +6 -3
- package/dist/routes/mapping.d.ts +1 -2
- package/dist/routes/mapping.js +4 -13
- package/dist/routes/match.d.ts +3 -4
- package/dist/routes/match.js +3 -5
- package/dist/routes/placement.d.ts +5 -0
- package/dist/routes/placement.js +18 -0
- package/dist/routes/plan.d.ts +24 -0
- package/dist/routes/plan.js +1 -0
- package/dist/routes/release-unavailable.d.ts +8 -0
- package/dist/routes/release-unavailable.js +32 -0
- package/dist/routes/request.d.ts +0 -1
- package/dist/routes/request.js +3 -2
- package/dist/routes/reservation.d.ts +3 -4
- package/dist/routes/reservation.js +8 -5
- package/dist/routes/routing.d.ts +0 -1
- package/dist/routes/routing.js +0 -1
- package/dist/routes/scalar.d.ts +4 -4
- package/dist/routes/scalar.js +14 -11
- package/dist/routes/select.d.ts +2 -3
- package/dist/routes/select.js +2 -3
- package/dist/routes/stream.d.ts +0 -1
- package/dist/routes/stream.js +0 -1
- package/dist/routes/table.d.ts +9 -0
- package/dist/routes/table.js +1 -0
- package/dist/routes/target.d.ts +13 -0
- package/dist/routes/target.js +3 -0
- package/dist/routes/template.d.ts +0 -1
- package/dist/routes/template.js +0 -1
- package/dist/runtime/artifact.d.ts +3 -4
- package/dist/runtime/artifact.js +5 -6
- package/dist/runtime/index.d.ts +0 -1
- package/dist/runtime/index.js +0 -1
- package/dist/schema/index.d.ts +0 -1
- package/dist/schema/index.js +0 -1
- package/dist/schema/installation/codec.d.ts +4 -0
- package/dist/schema/installation/codec.js +70 -0
- package/dist/schema/installation/index.d.ts +2 -1
- package/dist/schema/installation/index.js +1 -1
- package/dist/schema/installation/introspection/codec.d.ts +3 -3
- package/dist/schema/installation/introspection/codec.js +144 -204
- package/dist/schema/installation/introspection/index.d.ts +2 -3
- package/dist/schema/installation/introspection/index.js +1 -2
- package/dist/schema/installation/introspection/result.d.ts +18 -23
- package/dist/schema/installation/introspection/result.js +0 -1
- package/dist/schema/installation/result.d.ts +9 -0
- package/dist/schema/installation/result.js +1 -0
- package/package.json +116 -13
- package/dist/artifact/index.d.ts.map +0 -1
- package/dist/artifact/index.js.map +0 -1
- package/dist/artifact/ref.d.ts.map +0 -1
- package/dist/artifact/ref.js.map +0 -1
- package/dist/codecs/codec.d.ts.map +0 -1
- package/dist/codecs/codec.js.map +0 -1
- package/dist/codecs/index.d.ts.map +0 -1
- package/dist/codecs/index.js.map +0 -1
- package/dist/codecs/json.d.ts.map +0 -1
- package/dist/codecs/json.js.map +0 -1
- package/dist/codecs/media-types.d.ts.map +0 -1
- package/dist/codecs/media-types.js.map +0 -1
- package/dist/codecs/msgpack.d.ts.map +0 -1
- package/dist/codecs/msgpack.js.map +0 -1
- package/dist/errors/codes.d.ts.map +0 -1
- package/dist/errors/codes.js.map +0 -1
- package/dist/errors/http-status.d.ts.map +0 -1
- package/dist/errors/http-status.js.map +0 -1
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js.map +0 -1
- package/dist/errors/payload.d.ts.map +0 -1
- package/dist/errors/payload.js.map +0 -1
- package/dist/errors/protocol-error.d.ts.map +0 -1
- package/dist/errors/protocol-error.js.map +0 -1
- package/dist/errors/reason.d.ts.map +0 -1
- package/dist/errors/reason.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/invocation/admission.d.ts.map +0 -1
- package/dist/invocation/admission.js.map +0 -1
- package/dist/invocation/binary.d.ts.map +0 -1
- package/dist/invocation/binary.js.map +0 -1
- package/dist/invocation/binding-codecs.d.ts.map +0 -1
- package/dist/invocation/binding-codecs.js.map +0 -1
- package/dist/invocation/cancellation.d.ts.map +0 -1
- package/dist/invocation/cancellation.js.map +0 -1
- package/dist/invocation/correlation.d.ts.map +0 -1
- package/dist/invocation/correlation.js.map +0 -1
- package/dist/invocation/delegate.d.ts.map +0 -1
- package/dist/invocation/delegate.js.map +0 -1
- package/dist/invocation/http/binary.d.ts.map +0 -1
- package/dist/invocation/http/binary.js.map +0 -1
- package/dist/invocation/http/index.d.ts.map +0 -1
- package/dist/invocation/http/index.js.map +0 -1
- package/dist/invocation/http/negotiation.d.ts.map +0 -1
- package/dist/invocation/http/negotiation.js.map +0 -1
- package/dist/invocation/http/stream.d.ts.map +0 -1
- package/dist/invocation/http/stream.js.map +0 -1
- package/dist/invocation/http/trace.d.ts.map +0 -1
- package/dist/invocation/http/trace.js.map +0 -1
- package/dist/invocation/idempotency.d.ts.map +0 -1
- package/dist/invocation/idempotency.js.map +0 -1
- package/dist/invocation/identity.d.ts.map +0 -1
- package/dist/invocation/identity.js.map +0 -1
- package/dist/invocation/index.d.ts.map +0 -1
- package/dist/invocation/index.js.map +0 -1
- package/dist/invocation/miss.d.ts.map +0 -1
- package/dist/invocation/miss.js.map +0 -1
- package/dist/invocation/redirect.d.ts.map +0 -1
- package/dist/invocation/redirect.js.map +0 -1
- package/dist/invocation/request.d.ts.map +0 -1
- package/dist/invocation/request.js.map +0 -1
- package/dist/invocation/response.d.ts.map +0 -1
- package/dist/invocation/response.js.map +0 -1
- package/dist/invocation/routing.d.ts.map +0 -1
- package/dist/invocation/routing.js.map +0 -1
- package/dist/invocation/schema.d.ts.map +0 -1
- package/dist/invocation/schema.js.map +0 -1
- package/dist/invocation/service-reason.d.ts.map +0 -1
- package/dist/invocation/service-reason.js.map +0 -1
- package/dist/invocation/stale-route.d.ts.map +0 -1
- package/dist/invocation/stale-route.js.map +0 -1
- package/dist/invocation/stream.d.ts.map +0 -1
- package/dist/invocation/stream.js.map +0 -1
- package/dist/invocation/target.d.ts.map +0 -1
- package/dist/invocation/target.js.map +0 -1
- package/dist/invocation/trace.d.ts.map +0 -1
- package/dist/invocation/trace.js.map +0 -1
- package/dist/invocation/version.d.ts.map +0 -1
- package/dist/invocation/version.js.map +0 -1
- package/dist/invocation/websocket/binary.d.ts.map +0 -1
- package/dist/invocation/websocket/binary.js.map +0 -1
- package/dist/invocation/websocket/index.d.ts.map +0 -1
- package/dist/invocation/websocket/index.js.map +0 -1
- package/dist/invocation/websocket/subprotocol.d.ts.map +0 -1
- package/dist/invocation/websocket/subprotocol.js.map +0 -1
- package/dist/issuer/configuration.d.ts.map +0 -1
- package/dist/issuer/configuration.js.map +0 -1
- package/dist/issuer/error.d.ts.map +0 -1
- package/dist/issuer/error.js.map +0 -1
- package/dist/issuer/exchange.d.ts.map +0 -1
- package/dist/issuer/exchange.js.map +0 -1
- package/dist/issuer/hosted.d.ts.map +0 -1
- package/dist/issuer/hosted.js.map +0 -1
- package/dist/issuer/index.d.ts.map +0 -1
- package/dist/issuer/index.js.map +0 -1
- package/dist/issuer/key-set.d.ts.map +0 -1
- package/dist/issuer/key-set.js.map +0 -1
- package/dist/issuer/paths.d.ts.map +0 -1
- package/dist/issuer/paths.js.map +0 -1
- package/dist/issuer/url.d.ts.map +0 -1
- package/dist/issuer/url.js.map +0 -1
- package/dist/publication/bindings/callable.d.ts.map +0 -1
- package/dist/publication/bindings/callable.js.map +0 -1
- package/dist/publication/bindings/index.d.ts.map +0 -1
- package/dist/publication/bindings/index.js.map +0 -1
- package/dist/publication/bindings/invocation.d.ts.map +0 -1
- package/dist/publication/bindings/invocation.js.map +0 -1
- package/dist/publication/bindings/view.d.ts.map +0 -1
- package/dist/publication/bindings/view.js.map +0 -1
- package/dist/publication/bundle.d.ts.map +0 -1
- package/dist/publication/bundle.js.map +0 -1
- package/dist/publication/content.d.ts.map +0 -1
- package/dist/publication/content.js.map +0 -1
- package/dist/publication/delivery/attestation.d.ts.map +0 -1
- package/dist/publication/delivery/attestation.js.map +0 -1
- package/dist/publication/delivery/claims.d.ts.map +0 -1
- package/dist/publication/delivery/claims.js.map +0 -1
- package/dist/publication/delivery/delivery.d.ts.map +0 -1
- package/dist/publication/delivery/delivery.js.map +0 -1
- package/dist/publication/delivery/error.d.ts.map +0 -1
- package/dist/publication/delivery/error.js.map +0 -1
- package/dist/publication/delivery/index.d.ts.map +0 -1
- package/dist/publication/delivery/index.js.map +0 -1
- package/dist/publication/delivery/limits.d.ts.map +0 -1
- package/dist/publication/delivery/limits.js.map +0 -1
- package/dist/publication/delivery/request.d.ts.map +0 -1
- package/dist/publication/delivery/request.js.map +0 -1
- package/dist/publication/delivery-endpoint.d.ts.map +0 -1
- package/dist/publication/delivery-endpoint.js.map +0 -1
- package/dist/publication/error.d.ts.map +0 -1
- package/dist/publication/error.js.map +0 -1
- package/dist/publication/etag.d.ts.map +0 -1
- package/dist/publication/etag.js.map +0 -1
- package/dist/publication/index.d.ts.map +0 -1
- package/dist/publication/index.js.map +0 -1
- package/dist/publication/manifest.d.ts.map +0 -1
- package/dist/publication/manifest.js.map +0 -1
- package/dist/publication/publication.d.ts.map +0 -1
- package/dist/publication/publication.js.map +0 -1
- package/dist/publication/reference.d.ts.map +0 -1
- package/dist/publication/reference.js.map +0 -1
- package/dist/publication/requirements.d.ts.map +0 -1
- package/dist/publication/requirements.js.map +0 -1
- package/dist/publication/route.d.ts.map +0 -1
- package/dist/publication/route.js.map +0 -1
- package/dist/publication/schema.d.ts.map +0 -1
- package/dist/publication/schema.js.map +0 -1
- package/dist/routes/compile.d.ts +0 -5
- package/dist/routes/compile.d.ts.map +0 -1
- package/dist/routes/compile.js +0 -69
- package/dist/routes/compile.js.map +0 -1
- package/dist/routes/credential.d.ts.map +0 -1
- package/dist/routes/credential.js.map +0 -1
- package/dist/routes/decode.d.ts.map +0 -1
- package/dist/routes/decode.js.map +0 -1
- package/dist/routes/encode.d.ts.map +0 -1
- package/dist/routes/encode.js.map +0 -1
- package/dist/routes/error-response.d.ts.map +0 -1
- package/dist/routes/error-response.js.map +0 -1
- package/dist/routes/error.d.ts.map +0 -1
- package/dist/routes/error.js.map +0 -1
- package/dist/routes/index.d.ts.map +0 -1
- package/dist/routes/index.js.map +0 -1
- package/dist/routes/mapping.d.ts.map +0 -1
- package/dist/routes/mapping.js.map +0 -1
- package/dist/routes/match.d.ts.map +0 -1
- package/dist/routes/match.js.map +0 -1
- package/dist/routes/request.d.ts.map +0 -1
- package/dist/routes/request.js.map +0 -1
- package/dist/routes/reservation.d.ts.map +0 -1
- package/dist/routes/reservation.js.map +0 -1
- package/dist/routes/route.d.ts +0 -13
- package/dist/routes/route.d.ts.map +0 -1
- package/dist/routes/route.js +0 -6
- package/dist/routes/route.js.map +0 -1
- package/dist/routes/routing.d.ts.map +0 -1
- package/dist/routes/routing.js.map +0 -1
- package/dist/routes/scalar.d.ts.map +0 -1
- package/dist/routes/scalar.js.map +0 -1
- package/dist/routes/select.d.ts.map +0 -1
- package/dist/routes/select.js.map +0 -1
- package/dist/routes/stream.d.ts.map +0 -1
- package/dist/routes/stream.js.map +0 -1
- package/dist/routes/template.d.ts.map +0 -1
- package/dist/routes/template.js.map +0 -1
- package/dist/runtime/artifact.d.ts.map +0 -1
- package/dist/runtime/artifact.js.map +0 -1
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js.map +0 -1
- package/dist/schema/index.d.ts.map +0 -1
- package/dist/schema/index.js.map +0 -1
- package/dist/schema/installation/index.d.ts.map +0 -1
- package/dist/schema/installation/index.js.map +0 -1
- package/dist/schema/installation/introspection/codec.d.ts.map +0 -1
- package/dist/schema/installation/introspection/codec.js.map +0 -1
- package/dist/schema/installation/introspection/index.d.ts.map +0 -1
- package/dist/schema/installation/introspection/index.js.map +0 -1
- package/dist/schema/installation/introspection/result.d.ts.map +0 -1
- package/dist/schema/installation/introspection/result.js.map +0 -1
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { K } from '@astrale-os/kernel-core/schema';
|
|
2
|
+
import { AuthorityOperationOrder } from '@astrale-os/kernel-core/schema/authority/operation';
|
|
3
|
+
import { schema as schemaApi } from '@astrale-os/kernel-dsl/v1';
|
|
4
|
+
import { acceptDefinitionRef, callableAddress, Key } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
5
|
+
import { revision } from '@astrale-os/kernel-dsl/v1/schema/revision';
|
|
3
6
|
import { array, deepFreeze, exact, record, unique } from './content.js';
|
|
4
7
|
import { fail } from './error.js';
|
|
5
8
|
export const ClassOperationOrder = Object.freeze([
|
|
@@ -14,7 +17,7 @@ export function admitRequirements(input) {
|
|
|
14
17
|
const requirements = record(input, 'PUBLICATION_INVALID', 'Publication requirements are invalid.');
|
|
15
18
|
exact(requirements, ['capabilities'], 'PUBLICATION_INVALID');
|
|
16
19
|
const capabilities = record(requirements.capabilities, 'PUBLICATION_INVALID', 'Publication capability requirements are invalid.');
|
|
17
|
-
exact(capabilities, ['
|
|
20
|
+
exact(capabilities, ['authority', 'classes', 'functions', 'profiles'], 'PUBLICATION_INVALID');
|
|
18
21
|
const functions = capabilities.functions === undefined
|
|
19
22
|
? undefined
|
|
20
23
|
: nonEmpty(capabilities.functions, 'Function capability requirements').map(admitCallable);
|
|
@@ -29,7 +32,16 @@ export function admitRequirements(input) {
|
|
|
29
32
|
unique(classes.map((entry) => classKey(entry.class)), 'PUBLICATION_INVALID', 'Class capability requirement');
|
|
30
33
|
canonical(classes, (left, right) => compare(classKey(left.class), classKey(right.class)), 'Class capability requirements');
|
|
31
34
|
}
|
|
32
|
-
const
|
|
35
|
+
const authority = capabilities.authority === undefined
|
|
36
|
+
? undefined
|
|
37
|
+
: admitAuthorityRequirements(capabilities.authority);
|
|
38
|
+
const profiles = capabilities.profiles === undefined
|
|
39
|
+
? undefined
|
|
40
|
+
: nonEmpty(capabilities.profiles, 'Capability profiles').map(admitCapabilityProfile);
|
|
41
|
+
if (profiles !== undefined) {
|
|
42
|
+
unique(profiles.map(({ subject }) => Key.of(subject)), 'PUBLICATION_INVALID', 'Capability profile subject');
|
|
43
|
+
canonical(profiles, (left, right) => compare(Key.of(left.subject), Key.of(right.subject)), 'Capability profiles');
|
|
44
|
+
}
|
|
33
45
|
return deepFreeze({
|
|
34
46
|
capabilities: {
|
|
35
47
|
...(functions === undefined
|
|
@@ -38,36 +50,100 @@ export function admitRequirements(input) {
|
|
|
38
50
|
...(classes === undefined
|
|
39
51
|
? {}
|
|
40
52
|
: { classes: Object.freeze(classes) }),
|
|
41
|
-
...(
|
|
53
|
+
...(authority === undefined ? {} : { authority }),
|
|
54
|
+
...(profiles === undefined
|
|
55
|
+
? {}
|
|
56
|
+
: { profiles: Object.freeze(profiles) }),
|
|
42
57
|
},
|
|
43
58
|
});
|
|
44
59
|
}
|
|
60
|
+
function admitCapabilityProfile(input) {
|
|
61
|
+
const profile = record(input, 'PUBLICATION_INVALID', 'Capability profile requirement is invalid.');
|
|
62
|
+
exact(profile, ['authority', 'classes', 'functions', 'subject'], 'PUBLICATION_INVALID');
|
|
63
|
+
const subject = admitCoreRef(profile.subject);
|
|
64
|
+
const functions = profile.functions === undefined
|
|
65
|
+
? undefined
|
|
66
|
+
: nonEmpty(profile.functions, 'Capability profile Function requirements').map(admitCallable);
|
|
67
|
+
if (functions !== undefined) {
|
|
68
|
+
unique(functions, 'PUBLICATION_INVALID', 'Capability profile Function requirement');
|
|
69
|
+
canonical(functions, compare, 'Capability profile Function requirements');
|
|
70
|
+
}
|
|
71
|
+
const classes = profile.classes === undefined
|
|
72
|
+
? undefined
|
|
73
|
+
: nonEmpty(profile.classes, 'Capability profile Class requirements').map(admitClassRequirement);
|
|
74
|
+
if (classes !== undefined) {
|
|
75
|
+
unique(classes.map((entry) => classKey(entry.class)), 'PUBLICATION_INVALID', 'Capability profile Class requirement');
|
|
76
|
+
canonical(classes, (left, right) => compare(classKey(left.class), classKey(right.class)), 'Capability profile Class requirements');
|
|
77
|
+
}
|
|
78
|
+
const authority = profile.authority === undefined ? undefined : admitAuthorityRequirements(profile.authority);
|
|
79
|
+
if (functions === undefined && classes === undefined && authority === undefined) {
|
|
80
|
+
fail('PUBLICATION_INVALID', 'Capability profile requirements cannot be empty.');
|
|
81
|
+
}
|
|
82
|
+
return Object.freeze({
|
|
83
|
+
subject,
|
|
84
|
+
...(functions === undefined
|
|
85
|
+
? {}
|
|
86
|
+
: { functions: Object.freeze(functions) }),
|
|
87
|
+
...(classes === undefined
|
|
88
|
+
? {}
|
|
89
|
+
: { classes: Object.freeze(classes) }),
|
|
90
|
+
...(authority === undefined ? {} : { authority }),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
45
93
|
/** Bind explicit capability targets to exact functional dependencies in the bundle closure. */
|
|
46
94
|
export function validateRequirements(root, closure, requirements) {
|
|
47
95
|
const dependencies = exactDependencyClosure(root, closure);
|
|
48
96
|
for (const callable of requirements.capabilities.functions ?? []) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const reference = Key.ref(callable);
|
|
52
|
-
if (!hasCallable(dependency, reference)) {
|
|
97
|
+
const dependency = capabilityOwner(root, dependencies, callable, 'Function');
|
|
98
|
+
if (!hasCallable(dependency, callable)) {
|
|
53
99
|
fail('PUBLICATION_INVALID', 'Function capability requirement names an unknown dependency callable.');
|
|
54
100
|
}
|
|
55
101
|
}
|
|
56
102
|
for (const requirement of requirements.capabilities.classes ?? []) {
|
|
57
|
-
const key = Key.
|
|
58
|
-
|
|
59
|
-
if (
|
|
103
|
+
const key = Key.of(requirement.class);
|
|
104
|
+
const dependency = capabilityOwner(root, dependencies, key, 'Class');
|
|
105
|
+
if (dependency.classes[requirement.class.name] === undefined) {
|
|
60
106
|
fail('PUBLICATION_INVALID', 'Class capability requirement names an unknown dependency Class.');
|
|
61
107
|
}
|
|
62
108
|
}
|
|
109
|
+
const resolvedRoot = requirements.capabilities.profiles === undefined
|
|
110
|
+
? undefined
|
|
111
|
+
: schemaApi.resolve(schemaApi.accept(root, {
|
|
112
|
+
get(origin, expectedRevision) {
|
|
113
|
+
return closure.find((dependency) => dependency.origin === origin && revision(dependency) === expectedRevision);
|
|
114
|
+
},
|
|
115
|
+
}));
|
|
116
|
+
for (const profile of requirements.capabilities.profiles ?? []) {
|
|
117
|
+
const subject = resolvedRoot.core.nodes[profile.subject.name];
|
|
118
|
+
if (profile.subject.origin !== root.origin ||
|
|
119
|
+
subject === undefined ||
|
|
120
|
+
!subject.class.satisfies(K.classes.Identity)) {
|
|
121
|
+
fail('PUBLICATION_INVALID', 'Capability profile subject must name one local Core Identity.');
|
|
122
|
+
}
|
|
123
|
+
for (const callable of profile.functions ?? []) {
|
|
124
|
+
const dependency = capabilityOwner(root, dependencies, callable, 'Function');
|
|
125
|
+
if (!hasCallable(dependency, callable)) {
|
|
126
|
+
fail('PUBLICATION_INVALID', 'Capability profile Function requirement names an unknown dependency callable.');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
for (const requirement of profile.classes ?? []) {
|
|
130
|
+
const key = Key.of(requirement.class);
|
|
131
|
+
const owner = requirement.class.origin === root.origin
|
|
132
|
+
? root
|
|
133
|
+
: capabilityOwner(root, dependencies, key, 'Class');
|
|
134
|
+
if (owner.classes[requirement.class.name] === undefined) {
|
|
135
|
+
fail('PUBLICATION_INVALID', 'Capability profile Class requirement names an unknown dependency Class.');
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
63
139
|
}
|
|
64
140
|
function exactDependencyClosure(root, closure) {
|
|
65
141
|
const supplied = new Map(closure.map((dependency) => [dependency.origin, dependency]));
|
|
66
142
|
const reachable = new Map();
|
|
67
143
|
const visit = (owner) => {
|
|
68
|
-
for (const coordinate of owner.dependencies) {
|
|
144
|
+
for (const coordinate of Object.values(owner.dependencies)) {
|
|
69
145
|
const dependency = supplied.get(coordinate.origin);
|
|
70
|
-
if (dependency === undefined ||
|
|
146
|
+
if (dependency === undefined || revision(dependency) !== coordinate.revision) {
|
|
71
147
|
fail('PUBLICATION_INVALID', 'Publication Bundle omits an exact dependency.');
|
|
72
148
|
}
|
|
73
149
|
if (reachable.has(dependency.origin))
|
|
@@ -83,8 +159,10 @@ function admitCallable(input) {
|
|
|
83
159
|
if (typeof input !== 'string' || !Key.is(input)) {
|
|
84
160
|
return fail('PUBLICATION_INVALID', 'Function capability reference is invalid.');
|
|
85
161
|
}
|
|
86
|
-
|
|
87
|
-
|
|
162
|
+
try {
|
|
163
|
+
callableAddress(input);
|
|
164
|
+
}
|
|
165
|
+
catch {
|
|
88
166
|
return fail('PUBLICATION_INVALID', 'Function capability reference must name a Function or Method.');
|
|
89
167
|
}
|
|
90
168
|
return input;
|
|
@@ -100,14 +178,14 @@ function admitClassRequirement(input) {
|
|
|
100
178
|
operations: Object.freeze(operations),
|
|
101
179
|
});
|
|
102
180
|
}
|
|
103
|
-
function
|
|
104
|
-
const
|
|
105
|
-
exact(
|
|
106
|
-
if (
|
|
107
|
-
fail('PUBLICATION_INVALID', '
|
|
181
|
+
function admitAuthorityRequirements(input) {
|
|
182
|
+
const authority = record(input, 'PUBLICATION_INVALID', 'Authority capability requirements are invalid.');
|
|
183
|
+
exact(authority, ['grant', 'revoke'], 'PUBLICATION_INVALID');
|
|
184
|
+
if (authority.grant === undefined && authority.revoke === undefined) {
|
|
185
|
+
fail('PUBLICATION_INVALID', 'Authority capability requirements cannot be empty.');
|
|
108
186
|
}
|
|
109
|
-
const grant = admitAuthorityOperations(
|
|
110
|
-
const revoke = admitAuthorityOperations(
|
|
187
|
+
const grant = admitAuthorityOperations(authority.grant, 'grant');
|
|
188
|
+
const revoke = admitAuthorityOperations(authority.revoke, 'revoke');
|
|
111
189
|
return Object.freeze({
|
|
112
190
|
...(grant === undefined ? {} : { grant }),
|
|
113
191
|
...(revoke === undefined ? {} : { revoke }),
|
|
@@ -116,22 +194,35 @@ function admitAdminRequirements(input) {
|
|
|
116
194
|
function admitAuthorityOperations(input, kind) {
|
|
117
195
|
if (input === undefined)
|
|
118
196
|
return undefined;
|
|
119
|
-
const values = nonEmpty(input, `
|
|
120
|
-
unique(values, 'PUBLICATION_INVALID', `
|
|
121
|
-
canonical(values, ordered(AuthorityOperationOrder), `
|
|
197
|
+
const values = nonEmpty(input, `Authority ${kind} operations`).map((entry) => admitOperation(entry, AuthorityOperationOrder, `Authority ${kind} operation`));
|
|
198
|
+
unique(values, 'PUBLICATION_INVALID', `authority ${kind} operation`);
|
|
199
|
+
canonical(values, ordered(AuthorityOperationOrder), `Authority ${kind} operations`);
|
|
122
200
|
return Object.freeze(values);
|
|
123
201
|
}
|
|
124
202
|
function admitClassRef(input) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
typeof value.name !== 'string' ||
|
|
131
|
-
!dslSchema.patterns.memberName.test(value.name)) {
|
|
203
|
+
let value;
|
|
204
|
+
try {
|
|
205
|
+
value = acceptDefinitionRef(input);
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
132
208
|
fail('PUBLICATION_INVALID', 'Class capability reference is invalid.');
|
|
133
209
|
}
|
|
134
|
-
|
|
210
|
+
if (value.kind !== 'class')
|
|
211
|
+
fail('PUBLICATION_INVALID', 'Class capability reference is invalid.');
|
|
212
|
+
return value;
|
|
213
|
+
}
|
|
214
|
+
function admitCoreRef(input) {
|
|
215
|
+
let value;
|
|
216
|
+
try {
|
|
217
|
+
value = acceptDefinitionRef(input);
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
fail('PUBLICATION_INVALID', 'Capability profile subject is invalid.');
|
|
221
|
+
}
|
|
222
|
+
if (value.kind !== 'core') {
|
|
223
|
+
fail('PUBLICATION_INVALID', 'Capability profile subject must be one local Core reference.');
|
|
224
|
+
}
|
|
225
|
+
return value;
|
|
135
226
|
}
|
|
136
227
|
function nonEmpty(input, label) {
|
|
137
228
|
const values = [...array(input, 'PUBLICATION_INVALID')];
|
|
@@ -157,24 +248,23 @@ function compare(left, right) {
|
|
|
157
248
|
return left < right ? -1 : left > right ? 1 : 0;
|
|
158
249
|
}
|
|
159
250
|
function classKey(input) {
|
|
160
|
-
return String(Key.
|
|
251
|
+
return String(Key.of(input));
|
|
161
252
|
}
|
|
162
|
-
function
|
|
253
|
+
function capabilityOwner(root, dependencies, key, label) {
|
|
163
254
|
const origin = Key.origin(key);
|
|
164
255
|
if (origin === root.origin)
|
|
165
256
|
fail('PUBLICATION_INVALID', `${label} capability target cannot be local.`);
|
|
166
|
-
|
|
257
|
+
const dependency = dependencies.get(origin);
|
|
258
|
+
if (dependency === undefined) {
|
|
167
259
|
fail('PUBLICATION_INVALID', `${label} capability target must belong to the exact dependency closure.`);
|
|
168
260
|
}
|
|
261
|
+
return dependency;
|
|
169
262
|
}
|
|
170
|
-
function hasCallable(dependency,
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
const
|
|
175
|
-
const
|
|
176
|
-
|
|
177
|
-
const declaration = ownerKind === 'class' ? dependency.classes[owner] : dependency.interfaces[owner];
|
|
178
|
-
return declaration?.family === 'node' && declaration.methods[method] !== undefined;
|
|
263
|
+
function hasCallable(dependency, callable) {
|
|
264
|
+
const coordinate = callableAddress(callable);
|
|
265
|
+
if (coordinate.kind === 'function')
|
|
266
|
+
return dependency.functions[coordinate.name] !== undefined;
|
|
267
|
+
const declaration = dependency.classes[coordinate.owner.name];
|
|
268
|
+
const method = declaration?.kind === 'node' ? declaration.methods[coordinate.name] : undefined;
|
|
269
|
+
return method !== undefined && method.inheritance !== 'abstract';
|
|
179
270
|
}
|
|
180
|
-
//# sourceMappingURL=requirements.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Key } from '@astrale-os/kernel-dsl/v1';
|
|
1
|
+
import { type Key } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
2
|
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | '*';
|
|
3
3
|
export type SingleCredentialSource = {
|
|
4
4
|
readonly in: 'header';
|
|
@@ -29,5 +29,9 @@ export interface HttpRoute {
|
|
|
29
29
|
readonly body?: RouteBody;
|
|
30
30
|
readonly credential?: CredentialSource;
|
|
31
31
|
}
|
|
32
|
+
/** Provider-neutral build input; placement replaces path with the canonical absolute href. */
|
|
33
|
+
export interface HttpRouteDeclaration extends Omit<HttpRoute, 'href'> {
|
|
34
|
+
readonly path: string;
|
|
35
|
+
}
|
|
32
36
|
export declare function admitRoute(input: unknown, origin: string): HttpRoute;
|
|
33
|
-
|
|
37
|
+
export declare function admitRouteDeclaration(input: unknown, origin: string): HttpRouteDeclaration;
|
|
@@ -1,14 +1,39 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { patterns } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
2
|
import { admitCallableKey } from './bindings/callable.js';
|
|
3
3
|
import { absoluteHttpUrl, deepFreeze, exact, record } from './content.js';
|
|
4
4
|
import { fail } from './error.js';
|
|
5
5
|
const ROUTE_NAME = /^[A-Za-z][A-Za-z0-9_-]{0,63}$/u;
|
|
6
6
|
export function admitRoute(input, origin) {
|
|
7
7
|
const value = record(input, 'PUBLICATION_ROUTE_INVALID', 'Published HTTP route is invalid.');
|
|
8
|
+
const common = admitRouteCommon(value, origin, 'href');
|
|
9
|
+
return deepFreeze({
|
|
10
|
+
...common,
|
|
11
|
+
href: absoluteHttpUrl(value.href, false, 'PUBLICATION_ROUTE_INVALID', true),
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
export function admitRouteDeclaration(input, origin) {
|
|
15
|
+
const value = record(input, 'PUBLICATION_ROUTE_INVALID', 'HTTP route declaration is invalid.');
|
|
16
|
+
const common = admitRouteCommon(value, origin, 'path');
|
|
17
|
+
if (typeof value.path !== 'string' || !value.path.startsWith('/')) {
|
|
18
|
+
fail('PUBLICATION_ROUTE_INVALID', 'Route declaration path must be relative to one issuer.');
|
|
19
|
+
}
|
|
20
|
+
let parsed;
|
|
21
|
+
try {
|
|
22
|
+
parsed = new URL(value.path, 'https://placement.invalid');
|
|
23
|
+
}
|
|
24
|
+
catch (cause) {
|
|
25
|
+
return fail('PUBLICATION_ROUTE_INVALID', 'Route declaration path is invalid.', cause);
|
|
26
|
+
}
|
|
27
|
+
if (parsed.origin !== 'https://placement.invalid' || parsed.search !== '' || parsed.hash !== '') {
|
|
28
|
+
fail('PUBLICATION_ROUTE_INVALID', 'Route declaration path cannot select an origin, query, or fragment.');
|
|
29
|
+
}
|
|
30
|
+
return deepFreeze({ ...common, path: value.path });
|
|
31
|
+
}
|
|
32
|
+
function admitRouteCommon(value, origin, location) {
|
|
8
33
|
exact(value, [
|
|
9
34
|
'name',
|
|
10
35
|
'callable',
|
|
11
|
-
|
|
36
|
+
location,
|
|
12
37
|
'method',
|
|
13
38
|
'requestMethod',
|
|
14
39
|
'default',
|
|
@@ -29,22 +54,20 @@ export function admitRoute(input, origin) {
|
|
|
29
54
|
fail('PUBLICATION_ROUTE_INVALID', 'Route default may only be true.');
|
|
30
55
|
}
|
|
31
56
|
if (value.requestMethod !== undefined &&
|
|
32
|
-
(typeof value.requestMethod !== 'string' ||
|
|
33
|
-
!dslSchema.patterns.memberName.test(value.requestMethod))) {
|
|
57
|
+
(typeof value.requestMethod !== 'string' || !patterns.memberName.test(value.requestMethod))) {
|
|
34
58
|
fail('PUBLICATION_ROUTE_INVALID', 'Route request-method mapping is invalid.');
|
|
35
59
|
}
|
|
36
60
|
if (value.receiver !== undefined &&
|
|
37
|
-
(typeof value.receiver !== 'string' || !
|
|
61
|
+
(typeof value.receiver !== 'string' || !patterns.memberName.test(value.receiver))) {
|
|
38
62
|
fail('PUBLICATION_ROUTE_INVALID', 'Route receiver is invalid.');
|
|
39
63
|
}
|
|
40
64
|
const query = stringRecord(value.query);
|
|
41
65
|
const headers = headerRecord(value.headers);
|
|
42
66
|
const body = admitBody(value.body);
|
|
43
67
|
const credential = admitCredential(value.credential);
|
|
44
|
-
return
|
|
68
|
+
return {
|
|
45
69
|
name: value.name,
|
|
46
70
|
callable,
|
|
47
|
-
href: absoluteHttpUrl(value.href, false, 'PUBLICATION_ROUTE_INVALID', true),
|
|
48
71
|
method: value.method,
|
|
49
72
|
...(value.requestMethod === undefined ? {} : { requestMethod: value.requestMethod }),
|
|
50
73
|
...(value.default === true ? { default: true } : {}),
|
|
@@ -53,7 +76,7 @@ export function admitRoute(input, origin) {
|
|
|
53
76
|
...(headers === undefined ? {} : { headers }),
|
|
54
77
|
...(body === undefined ? {} : { body }),
|
|
55
78
|
...(credential === undefined ? {} : { credential }),
|
|
56
|
-
}
|
|
79
|
+
};
|
|
57
80
|
}
|
|
58
81
|
function admitCredential(input) {
|
|
59
82
|
if (input === undefined)
|
|
@@ -129,4 +152,3 @@ function stringRecord(input) {
|
|
|
129
152
|
}
|
|
130
153
|
return Object.freeze(output);
|
|
131
154
|
}
|
|
132
|
-
//# sourceMappingURL=route.js.map
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { BundleDescriptor } from './bundle.js';
|
|
1
|
+
import type { Revision } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
|
+
import type { BundleDescriptor } from './bundle-descriptor.js';
|
|
3
3
|
export interface Schema {
|
|
4
|
-
readonly revision:
|
|
4
|
+
readonly revision: Revision;
|
|
5
5
|
readonly bundle: BundleDescriptor;
|
|
6
6
|
}
|
|
7
7
|
export declare function admitSchema(input: unknown): Schema;
|
|
8
|
-
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { admitBundleDescriptor } from './bundle.js';
|
|
1
|
+
import { patterns } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
|
+
import { admitBundleDescriptor } from './bundle-descriptor.js';
|
|
3
3
|
import { exact, record } from './content.js';
|
|
4
4
|
import { fail } from './error.js';
|
|
5
5
|
export function admitSchema(input) {
|
|
6
6
|
const value = record(input, 'PUBLICATION_INVALID', 'Published schema is invalid.');
|
|
7
7
|
exact(value, ['revision', 'bundle'], 'PUBLICATION_INVALID');
|
|
8
|
-
if (typeof value.revision !== 'string' || !
|
|
8
|
+
if (typeof value.revision !== 'string' || !patterns.revision.test(value.revision)) {
|
|
9
9
|
fail('PUBLICATION_INVALID', 'Published schema revision is invalid.');
|
|
10
10
|
}
|
|
11
11
|
return Object.freeze({
|
|
@@ -13,4 +13,3 @@ export function admitSchema(input) {
|
|
|
13
13
|
bundle: admitBundleDescriptor(value.bundle),
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
|
-
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { accept as acceptPortable } from '@astrale-os/kernel-dsl/value';
|
|
2
|
+
import { acceptReference } from '../publication/reference.js';
|
|
3
|
+
import { admitRoute } from '../publication/route.js';
|
|
4
|
+
import { fail } from './error.js';
|
|
5
|
+
const AUTH = new Set(['anonymous', 'authenticated', 'authorized']);
|
|
6
|
+
const OUTPUT = new Set(['value', 'stream', 'binary']);
|
|
7
|
+
/** Admit one emitted portable Table before Server composition. */
|
|
8
|
+
export function acceptTable(input) {
|
|
9
|
+
const value = object(acceptPortable(input), 'Route Table');
|
|
10
|
+
exact(value, ['publication', 'entries'], 'Route Table');
|
|
11
|
+
const reference = acceptReference(value.publication);
|
|
12
|
+
if (!Array.isArray(value.entries))
|
|
13
|
+
invalid('Route Table entries');
|
|
14
|
+
const entries = value.entries.map((entry) => acceptRoute(entry, reference.origin));
|
|
15
|
+
if (new Set(entries.map(({ name }) => name)).size !== entries.length) {
|
|
16
|
+
fail('NATIVE_ROUTE_BINDING_INVALID', 'Route Table names must be unique.');
|
|
17
|
+
}
|
|
18
|
+
return Object.freeze({ publication: reference, entries: Object.freeze(entries) });
|
|
19
|
+
}
|
|
20
|
+
function acceptRoute(input, origin) {
|
|
21
|
+
const value = object(input, 'Route Table entry');
|
|
22
|
+
exact(value, ['name', 'callable', 'target', 'auth', 'output', 'href', 'method', 'default'], 'Route Table entry', ['requestMethod', 'query', 'headers', 'body', 'credential']);
|
|
23
|
+
if (typeof value.default !== 'boolean')
|
|
24
|
+
invalid('Route Table default');
|
|
25
|
+
if (typeof value.auth !== 'string' || !AUTH.has(value.auth)) {
|
|
26
|
+
invalid('Route Table auth');
|
|
27
|
+
}
|
|
28
|
+
if (typeof value.output !== 'string' || !OUTPUT.has(value.output))
|
|
29
|
+
invalid('Route Table output');
|
|
30
|
+
const wire = admitRoute({
|
|
31
|
+
name: value.name,
|
|
32
|
+
callable: value.callable,
|
|
33
|
+
href: value.href,
|
|
34
|
+
method: value.method,
|
|
35
|
+
...(value.default === true ? { default: true } : {}),
|
|
36
|
+
...(value.requestMethod === undefined ? {} : { requestMethod: value.requestMethod }),
|
|
37
|
+
...(value.query === undefined ? {} : { query: value.query }),
|
|
38
|
+
...(value.headers === undefined ? {} : { headers: value.headers }),
|
|
39
|
+
...(value.body === undefined ? {} : { body: value.body }),
|
|
40
|
+
...(value.credential === undefined ? {} : { credential: value.credential }),
|
|
41
|
+
...receiver(value.target),
|
|
42
|
+
}, origin);
|
|
43
|
+
const { default: _default, receiver: _receiver, ...common } = wire;
|
|
44
|
+
return Object.freeze({
|
|
45
|
+
...common,
|
|
46
|
+
target: target(value.target),
|
|
47
|
+
auth: value.auth,
|
|
48
|
+
output: value.output,
|
|
49
|
+
default: value.default,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function target(input) {
|
|
53
|
+
const value = object(input, 'Route target');
|
|
54
|
+
if (value.kind === 'function') {
|
|
55
|
+
exact(value, ['kind'], 'Route Function target');
|
|
56
|
+
return Object.freeze({ kind: 'function' });
|
|
57
|
+
}
|
|
58
|
+
if (value.kind !== 'method' || (value.dispatch !== 'static' && value.dispatch !== 'instance')) {
|
|
59
|
+
invalid('Route Method target');
|
|
60
|
+
}
|
|
61
|
+
if (value.dispatch === 'static') {
|
|
62
|
+
exact(value, ['kind', 'dispatch'], 'Route static Method target');
|
|
63
|
+
return Object.freeze({ kind: 'method', dispatch: 'static' });
|
|
64
|
+
}
|
|
65
|
+
exact(value, ['kind', 'dispatch', 'receiver'], 'Route instance Method target');
|
|
66
|
+
if (typeof value.receiver !== 'string')
|
|
67
|
+
invalid('Route receiver');
|
|
68
|
+
return Object.freeze({ kind: 'method', dispatch: 'instance', receiver: value.receiver });
|
|
69
|
+
}
|
|
70
|
+
function receiver(input) {
|
|
71
|
+
const admitted = target(input);
|
|
72
|
+
return admitted.kind === 'method' && admitted.dispatch === 'instance'
|
|
73
|
+
? { receiver: admitted.receiver }
|
|
74
|
+
: {};
|
|
75
|
+
}
|
|
76
|
+
function object(input, label) {
|
|
77
|
+
if (input === null || typeof input !== 'object' || Array.isArray(input))
|
|
78
|
+
invalid(label);
|
|
79
|
+
return input;
|
|
80
|
+
}
|
|
81
|
+
function exact(value, required, label, optional = []) {
|
|
82
|
+
const allowed = new Set([...required, ...optional]);
|
|
83
|
+
if (Object.keys(value).some((key) => !allowed.has(key)) ||
|
|
84
|
+
required.some((key) => !Object.hasOwn(value, key)))
|
|
85
|
+
invalid(label);
|
|
86
|
+
}
|
|
87
|
+
function invalid(label) {
|
|
88
|
+
return fail('NATIVE_ROUTE_BINDING_INVALID', `${label} is invalid.`);
|
|
89
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Domain } from '@astrale-os/kernel-dsl/v1';
|
|
2
|
+
import type { Publication } from '../publication/publication.js';
|
|
3
|
+
import type { Plan } from './plan.js';
|
|
4
|
+
import type { Table } from './table.js';
|
|
5
|
+
/** Bind one Plan to an exact placed Publication and matching resolved Domain. */
|
|
6
|
+
export declare function bind(plan: Plan, deployed: Publication, domain: Domain): Table;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { json } from '@astrale-os/kernel-dsl/value';
|
|
2
|
+
import { reference } from '../publication/reference.js';
|
|
3
|
+
import { fail } from './error.js';
|
|
4
|
+
import { place } from './placement.js';
|
|
5
|
+
import { rejectReserved } from './reservation.js';
|
|
6
|
+
/** Bind one Plan to an exact placed Publication and matching resolved Domain. */
|
|
7
|
+
export function bind(plan, deployed, domain) {
|
|
8
|
+
if (plan.origin !== deployed.origin ||
|
|
9
|
+
plan.origin !== domain.origin ||
|
|
10
|
+
plan.revision !== deployed.schema.revision ||
|
|
11
|
+
plan.revision !== domain.revision) {
|
|
12
|
+
fail('NATIVE_ROUTE_BINDING_INVALID', 'Route Plan, Publication, and Domain identity differ.');
|
|
13
|
+
}
|
|
14
|
+
if (json.serialize(place(plan, deployed.identity.issuer)) !==
|
|
15
|
+
json.serialize(deployed.routes)) {
|
|
16
|
+
fail('NATIVE_ROUTE_BINDING_INVALID', 'Publication routes differ from the placed Route Plan.');
|
|
17
|
+
}
|
|
18
|
+
const entries = plan.entries.map((entry, index) => {
|
|
19
|
+
const { path: _path, ...portable } = entry;
|
|
20
|
+
return Object.freeze({ ...portable, href: deployed.routes[index].href });
|
|
21
|
+
});
|
|
22
|
+
rejectReserved(deployed, entries);
|
|
23
|
+
return Object.freeze({
|
|
24
|
+
publication: reference(deployed),
|
|
25
|
+
entries: Object.freeze(entries),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { fail } from './error.js';
|
|
2
|
+
import { templatesOverlap } from './template.js';
|
|
3
|
+
export function rejectCollisions(entries) {
|
|
4
|
+
const accepted = [];
|
|
5
|
+
for (const entry of entries) {
|
|
6
|
+
for (const previous of accepted) {
|
|
7
|
+
if (overlap(entry.method, previous.method) && templatesOverlap(entry.href, previous.href)) {
|
|
8
|
+
fail('NATIVE_ROUTE_COLLISION', `Route ${entry.name} collides with ${previous.name}.`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
accepted.push(entry);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function overlap(left, right) {
|
|
15
|
+
return left === '*' || right === '*' || left === right;
|
|
16
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Domain } from '@astrale-os/kernel-dsl/v1';
|
|
2
|
+
import type * as publication from '../publication/index.js';
|
|
3
|
+
import type { Plan } from './plan.js';
|
|
4
|
+
export interface CompileInput {
|
|
5
|
+
readonly routes: readonly publication.HttpRouteDeclaration[];
|
|
6
|
+
readonly domain: Domain;
|
|
7
|
+
}
|
|
8
|
+
export declare function compile(input: CompileInput): Plan;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { admitRouteDeclaration } from '../publication/route.js';
|
|
2
|
+
import { rejectCollisions } from './collision.js';
|
|
3
|
+
import { fail } from './error.js';
|
|
4
|
+
import { validateCredentialMapping, validateMapping, validateWireMapping } from './mapping.js';
|
|
5
|
+
import { placePath } from './placement.js';
|
|
6
|
+
import { validateTemplate } from './template.js';
|
|
7
|
+
export function compile(input) {
|
|
8
|
+
if (input === null || typeof input !== 'object' || !Array.isArray(input.routes)) {
|
|
9
|
+
throw new TypeError('Route compilation input is invalid.');
|
|
10
|
+
}
|
|
11
|
+
const authored = input.routes.map((entry) => admitRouteDeclaration(entry, input.domain.origin));
|
|
12
|
+
const entries = authored.map((declaration) => {
|
|
13
|
+
const meaning = input.domain.callable(declaration.callable);
|
|
14
|
+
if (meaning === undefined) {
|
|
15
|
+
fail('NATIVE_ROUTE_BINDING_INVALID', `Unknown callable ${declaration.callable}.`);
|
|
16
|
+
}
|
|
17
|
+
const href = placePath(declaration.path, 'https://routes.invalid');
|
|
18
|
+
const route = { ...declaration, href };
|
|
19
|
+
validateTemplate(href);
|
|
20
|
+
validateMapping(route, meaning.inputFields, isMethod(meaning) && !meaning.static);
|
|
21
|
+
validateWireMapping(route);
|
|
22
|
+
validateCredentialMapping(route);
|
|
23
|
+
if (route.method === 'GET' && route.body !== undefined) {
|
|
24
|
+
fail('NATIVE_ROUTE_DECLARATION_INVALID', `GET route ${route.name} cannot declare a body.`);
|
|
25
|
+
}
|
|
26
|
+
const target = !isMethod(meaning)
|
|
27
|
+
? { kind: 'function' }
|
|
28
|
+
: meaning.static
|
|
29
|
+
? { kind: 'method', dispatch: 'static' }
|
|
30
|
+
: { kind: 'method', dispatch: 'instance', receiver: route.receiver };
|
|
31
|
+
const { href: _href, receiver: _receiver, ...portable } = route;
|
|
32
|
+
return Object.freeze({
|
|
33
|
+
...portable,
|
|
34
|
+
target,
|
|
35
|
+
auth: meaning.auth,
|
|
36
|
+
output: meaning.output.mode,
|
|
37
|
+
path: declaration.path,
|
|
38
|
+
default: declaration.default === true,
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
rejectCollisions(entries.map((entry) => ({ ...entry, href: placePath(entry.path, 'https://routes.invalid') })));
|
|
42
|
+
return Object.freeze({
|
|
43
|
+
origin: input.domain.origin,
|
|
44
|
+
revision: input.domain.revision,
|
|
45
|
+
entries: Object.freeze(entries),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function isMethod(meaning) {
|
|
49
|
+
return 'owner' in meaning;
|
|
50
|
+
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import type { HttpRoute, SingleCredentialSource } from '../publication/index.js';
|
|
2
|
-
import type {
|
|
3
|
-
export declare function credentialSources(route: HttpRoute): readonly SingleCredentialSource[];
|
|
4
|
-
export declare function firstCredentialIsAmbient(entry:
|
|
5
|
-
export declare function specificHeaderWires(entry:
|
|
6
|
-
export declare function putCredential(entry:
|
|
7
|
-
export declare function withoutCredentialHeaders(entry:
|
|
8
|
-
export declare function readCredential(entry:
|
|
9
|
-
//# sourceMappingURL=credential.d.ts.map
|
|
2
|
+
import type { Route } from './table.js';
|
|
3
|
+
export declare function credentialSources(route: Pick<HttpRoute, 'credential'>): readonly SingleCredentialSource[];
|
|
4
|
+
export declare function firstCredentialIsAmbient(entry: Route): boolean;
|
|
5
|
+
export declare function specificHeaderWires(entry: Route): ReadonlySet<string>;
|
|
6
|
+
export declare function putCredential(entry: Route, url: URL, headers: Record<string, string>, credential: string): void;
|
|
7
|
+
export declare function withoutCredentialHeaders(entry: Route, input: Readonly<Record<string, string>>): Record<string, string>;
|
|
8
|
+
export declare function readCredential(entry: Route, url: URL, headers: Record<string, string>): string | undefined;
|