@astrale-os/kernel-protocol 0.5.0-beta.2 → 0.5.0-beta.21
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 +476 -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 +4 -3
- package/dist/invocation/admission.js +16 -8
- package/dist/invocation/binary.d.ts +4 -2
- package/dist/invocation/binary.js +18 -5
- package/dist/invocation/binding-codecs.d.ts +0 -1
- package/dist/invocation/binding-codecs.js +0 -1
- package/dist/invocation/cancellation.d.ts +1 -2
- package/dist/invocation/cancellation.js +3 -4
- 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 +9 -1
- package/dist/invocation/http/binary.js +49 -3
- 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 +16 -0
- package/dist/invocation/identity.js +55 -0
- package/dist/invocation/index.d.ts +4 -4
- package/dist/invocation/index.js +3 -3
- package/dist/invocation/miss.d.ts +4 -3
- package/dist/invocation/miss.js +10 -7
- package/dist/invocation/redirect.d.ts +19 -12
- package/dist/invocation/redirect.js +30 -17
- package/dist/invocation/request.d.ts +1 -2
- package/dist/invocation/request.js +3 -4
- package/dist/invocation/response.d.ts +9 -7
- package/dist/invocation/response.js +14 -10
- 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 +4 -3
- package/dist/invocation/stale-route.js +7 -7
- package/dist/invocation/stream.d.ts +6 -5
- package/dist/invocation/stream.js +17 -14
- package/dist/invocation/target.d.ts +2 -8
- 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 +4 -3
- 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 +0 -1
- 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 +1 -2
- package/dist/publication/bindings/view.js +2 -3
- 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 +6 -3
- 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 +3 -6
- package/dist/publication/publication.js +11 -68
- package/dist/publication/reference.d.ts +3 -3
- package/dist/publication/reference.js +7 -7
- package/dist/publication/requirements.d.ts +4 -4
- package/dist/publication/requirements.js +34 -34
- 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/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,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { AuthValueError } from '@astrale-os/kernel-core/auth/error';
|
|
2
|
+
import { accept as acceptIssuer } from '@astrale-os/kernel-core/auth/issuer';
|
|
2
3
|
import { fail } from './error.js';
|
|
3
4
|
import { NONCE_MAX_LENGTH, NONCE_MIN_LENGTH } from './limits.js';
|
|
4
5
|
/** Admit the exact request representation accepted by a Delivery transport boundary. */
|
|
@@ -34,10 +35,10 @@ export function acceptRequest(input) {
|
|
|
34
35
|
}
|
|
35
36
|
let kernel;
|
|
36
37
|
try {
|
|
37
|
-
kernel =
|
|
38
|
+
kernel = acceptIssuer(value.kernel);
|
|
38
39
|
}
|
|
39
40
|
catch (cause) {
|
|
40
|
-
if (cause instanceof
|
|
41
|
+
if (cause instanceof AuthValueError) {
|
|
41
42
|
return fail('DELIVERY_REQUEST_INVALID', 'Delivery request issuer is invalid.', cause);
|
|
42
43
|
}
|
|
43
44
|
throw cause;
|
|
@@ -49,4 +50,3 @@ export function acceptRequest(input) {
|
|
|
49
50
|
etag: value.etag,
|
|
50
51
|
});
|
|
51
52
|
}
|
|
52
|
-
//# sourceMappingURL=request.js.map
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { DeliveryDeclaration } from './declaration.js';
|
|
2
|
+
import type { Endpoint } from './delivery-endpoint.js';
|
|
3
|
+
/** Place one provider-neutral Delivery declaration beneath an exact serving issuer. */
|
|
4
|
+
export declare function placeDelivery(input: DeliveryDeclaration, issuer: string, bundleHref: string): Endpoint;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { admitEndpoint } from './delivery-endpoint.js';
|
|
2
|
+
import { fail } from './error.js';
|
|
3
|
+
/** Place one provider-neutral Delivery declaration beneath an exact serving issuer. */
|
|
4
|
+
export function placeDelivery(input, issuer, bundleHref) {
|
|
5
|
+
if (input === null || typeof input !== 'object' || Array.isArray(input)) {
|
|
6
|
+
fail('PUBLICATION_INVALID', 'Delivery declaration is invalid.');
|
|
7
|
+
}
|
|
8
|
+
if (Reflect.ownKeys(input).some((key) => key !== 'path' && key !== 'authentication') ||
|
|
9
|
+
typeof input.path !== 'string' ||
|
|
10
|
+
!input.path.startsWith('/')) {
|
|
11
|
+
fail('PUBLICATION_INVALID', 'Delivery declaration is invalid.');
|
|
12
|
+
}
|
|
13
|
+
let href;
|
|
14
|
+
try {
|
|
15
|
+
const url = new URL(input.path, issuer);
|
|
16
|
+
if (url.origin !== new URL(issuer).origin || url.search !== '' || url.hash !== '') {
|
|
17
|
+
fail('PUBLICATION_INVALID', 'Delivery declaration must be one relative path.');
|
|
18
|
+
}
|
|
19
|
+
href = url.href;
|
|
20
|
+
}
|
|
21
|
+
catch (cause) {
|
|
22
|
+
return fail('PUBLICATION_INVALID', 'Delivery declaration path is invalid.', cause);
|
|
23
|
+
}
|
|
24
|
+
return admitEndpoint({ href, method: 'POST', authentication: input.authentication }, bundleHref);
|
|
25
|
+
}
|
|
@@ -5,4 +5,3 @@ export declare class PublicationError extends Error {
|
|
|
5
5
|
constructor(code: PublicationErrorCode, message: string, options?: ErrorOptions);
|
|
6
6
|
}
|
|
7
7
|
export declare function fail(code: PublicationErrorCode, message: string, cause?: unknown): never;
|
|
8
|
-
//# sourceMappingURL=error.d.ts.map
|
package/dist/publication/etag.js
CHANGED
|
@@ -77,4 +77,3 @@ const ROUND = new Uint32Array([
|
|
|
77
77
|
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
78
78
|
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
|
|
79
79
|
]);
|
|
80
|
-
//# sourceMappingURL=etag.js.map
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
export { MEDIA_TYPE, PATH, url, seal, accept, encode,
|
|
1
|
+
export { MEDIA_TYPE, PATH, url, seal, accept, encode, type Publication } from './publication.js';
|
|
2
|
+
export { acceptBundle, decodeBundle } from './bundle-admission.js';
|
|
2
3
|
export { BUNDLE_MEDIA_TYPE, describeBundle, type BundleDescriptor } from './bundle.js';
|
|
4
|
+
export { verifyBundleBytes } from './bundle-evidence.js';
|
|
3
5
|
export type { Content } from './content.js';
|
|
6
|
+
export type { Declaration, DeliveryDeclaration } from './declaration.js';
|
|
7
|
+
export { placeDelivery } from './delivery-declaration.js';
|
|
4
8
|
export type { Etag, Sha256Digest } from './etag.js';
|
|
5
9
|
export { PublicationError, type PublicationErrorCode } from './error.js';
|
|
6
10
|
export * as delivery from './delivery/index.js';
|
|
@@ -8,7 +12,6 @@ export type { Authentication as DeliveryAuthentication, Endpoint as DeliveryEndp
|
|
|
8
12
|
export type { Manifest } from './manifest.js';
|
|
9
13
|
export { ClassOperationOrder, admitRequirements, validateRequirements, type CapabilityAdminRequirements, type CapabilityRequirements, type ClassCapabilityRequirement, type ClassOperation, type NonEmpty, type PublicationRequirements, } from './requirements.js';
|
|
10
14
|
export { acceptReference, compareReference, compareReferences, matchesReference, reference, type PublicationRef, type PublicationReferenceRelation, } from './reference.js';
|
|
11
|
-
export type { BodyPick, CredentialSource, HttpMethod, HttpRoute, RouteBody, RouteHeaders, SingleCredentialSource, } from './route.js';
|
|
15
|
+
export type { BodyPick, CredentialSource, HttpMethod, HttpRoute, HttpRouteDeclaration, RouteBody, RouteHeaders, SingleCredentialSource, } from './route.js';
|
|
12
16
|
export type { Schema } from './schema.js';
|
|
13
17
|
export { acceptInvocationEndpoints, type CallableBinding, type InvocationEndpoints, type ViewBinding, } from './bindings/index.js';
|
|
14
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
export { MEDIA_TYPE, PATH, url, seal, accept, encode
|
|
1
|
+
export { MEDIA_TYPE, PATH, url, seal, accept, encode } from './publication.js';
|
|
2
|
+
export { acceptBundle, decodeBundle } from './bundle-admission.js';
|
|
2
3
|
export { BUNDLE_MEDIA_TYPE, describeBundle } from './bundle.js';
|
|
4
|
+
export { verifyBundleBytes } from './bundle-evidence.js';
|
|
5
|
+
export { placeDelivery } from './delivery-declaration.js';
|
|
3
6
|
export { PublicationError } from './error.js';
|
|
4
7
|
export * as delivery from './delivery/index.js';
|
|
5
8
|
export { ClassOperationOrder, admitRequirements, validateRequirements, } from './requirements.js';
|
|
6
9
|
export { acceptReference, compareReference, compareReferences, matchesReference, reference, } from './reference.js';
|
|
7
10
|
export { acceptInvocationEndpoints, } from './bindings/index.js';
|
|
8
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { type ViewRef } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
2
|
export interface Manifest {
|
|
3
3
|
readonly logo?: string;
|
|
4
|
-
readonly entrypoint?:
|
|
4
|
+
readonly entrypoint?: ViewRef;
|
|
5
5
|
}
|
|
6
6
|
export declare function admitManifest(input: unknown): Manifest | undefined;
|
|
7
|
-
//# sourceMappingURL=manifest.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { acceptDefinitionRef } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
2
|
import { exact, record } from './content.js';
|
|
3
3
|
import { fail } from './error.js';
|
|
4
4
|
export function admitManifest(input) {
|
|
@@ -11,16 +11,20 @@ export function admitManifest(input) {
|
|
|
11
11
|
}
|
|
12
12
|
let entrypoint;
|
|
13
13
|
if (value.entrypoint !== undefined) {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
let ref;
|
|
15
|
+
try {
|
|
16
|
+
ref = acceptDefinitionRef(value.entrypoint);
|
|
17
|
+
}
|
|
18
|
+
catch (cause) {
|
|
19
|
+
return fail('PUBLICATION_INVALID', 'Manifest entrypoint must be a root View reference.', cause);
|
|
20
|
+
}
|
|
21
|
+
if (ref.kind !== 'view') {
|
|
17
22
|
fail('PUBLICATION_INVALID', 'Manifest entrypoint must be a root View reference.');
|
|
18
23
|
}
|
|
19
|
-
entrypoint =
|
|
24
|
+
entrypoint = ref;
|
|
20
25
|
}
|
|
21
26
|
return Object.freeze({
|
|
22
27
|
...(value.logo === undefined ? {} : { logo: value.logo }),
|
|
23
28
|
...(entrypoint === undefined ? {} : { entrypoint }),
|
|
24
29
|
});
|
|
25
30
|
}
|
|
26
|
-
//# sourceMappingURL=manifest.js.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { Key
|
|
1
|
+
import { type IssuerId } from '@astrale-os/kernel-core/auth/issuer';
|
|
2
|
+
import { Key } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
3
3
|
import type { CallableBinding, ViewBinding } from './bindings/index.js';
|
|
4
4
|
import type { Content } from './content.js';
|
|
5
5
|
import type { Endpoint as DeliveryEndpoint } from './delivery-endpoint.js';
|
|
@@ -17,7 +17,7 @@ export interface Publication {
|
|
|
17
17
|
readonly version: 2;
|
|
18
18
|
readonly origin: Key.Origin;
|
|
19
19
|
readonly identity: {
|
|
20
|
-
readonly issuer:
|
|
20
|
+
readonly issuer: IssuerId;
|
|
21
21
|
readonly subject: string;
|
|
22
22
|
};
|
|
23
23
|
readonly etag: Etag;
|
|
@@ -34,6 +34,3 @@ export interface Publication {
|
|
|
34
34
|
export declare function seal(input: Content): Publication;
|
|
35
35
|
export declare function accept(input: unknown): Publication;
|
|
36
36
|
export declare function encode(input: Publication): Uint8Array;
|
|
37
|
-
export declare function acceptBundle(input: Publication, artifact: unknown): dslBundle.Bundle;
|
|
38
|
-
export declare function decodeBundle(input: Publication, bytes: Uint8Array): dslBundle.Bundle;
|
|
39
|
-
//# sourceMappingURL=publication.d.ts.map
|
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { AuthValueError } from '@astrale-os/kernel-core/auth/error';
|
|
2
|
+
import { accept as acceptIssuerId } from '@astrale-os/kernel-core/auth/issuer';
|
|
3
|
+
import { Key, patterns } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
3
4
|
import * as portable from '@astrale-os/kernel-dsl/value';
|
|
4
5
|
import { admitCallableBinding, admitViewBinding } from './bindings/index.js';
|
|
5
|
-
import { acceptBundleValue, decodeBundleValue, verifyBundleBytes } from './bundle.js';
|
|
6
6
|
import { array, deepFreeze, exact, record, unique } from './content.js';
|
|
7
7
|
import { admitEndpoint as admitDeliveryEndpoint } from './delivery-endpoint.js';
|
|
8
8
|
import { fail } from './error.js';
|
|
9
9
|
import { admitDigest, computeEtag } from './etag.js';
|
|
10
10
|
import { admitManifest } from './manifest.js';
|
|
11
|
-
import { admitRequirements
|
|
11
|
+
import { admitRequirements } from './requirements.js';
|
|
12
12
|
import { admitRoute } from './route.js';
|
|
13
13
|
import { admitSchema } from './schema.js';
|
|
14
14
|
export const PATH = '/.well-known/astrale/domain.json';
|
|
@@ -45,17 +45,6 @@ export function accept(input) {
|
|
|
45
45
|
export function encode(input) {
|
|
46
46
|
return portable.json.encode(input);
|
|
47
47
|
}
|
|
48
|
-
export function acceptBundle(input, artifact) {
|
|
49
|
-
const accepted = acceptBundleValue(artifact);
|
|
50
|
-
verifyBundleBytes(input, dslBundle.encode(accepted));
|
|
51
|
-
validateBundleInventory(input, accepted);
|
|
52
|
-
return accepted;
|
|
53
|
-
}
|
|
54
|
-
export function decodeBundle(input, bytes) {
|
|
55
|
-
const decoded = decodeBundleValue(input, bytes);
|
|
56
|
-
validateBundleInventory(input, decoded);
|
|
57
|
-
return decoded;
|
|
58
|
-
}
|
|
59
48
|
function acceptPublication(input, requireEtag) {
|
|
60
49
|
const value = record(input, 'PUBLICATION_INVALID', 'Expected a Publication object.');
|
|
61
50
|
exact(value, [
|
|
@@ -74,7 +63,7 @@ function acceptPublication(input, requireEtag) {
|
|
|
74
63
|
if (value.format !== 'astrale.domain.publication' || value.version !== 2) {
|
|
75
64
|
fail('PUBLICATION_INVALID', 'Unsupported Publication format or version.');
|
|
76
65
|
}
|
|
77
|
-
if (typeof value.origin !== 'string' || !
|
|
66
|
+
if (typeof value.origin !== 'string' || !patterns.origin.test(value.origin)) {
|
|
78
67
|
fail('PUBLICATION_INVALID', 'Publication origin is invalid.');
|
|
79
68
|
}
|
|
80
69
|
const origin = value.origin;
|
|
@@ -101,7 +90,10 @@ function acceptPublication(input, requireEtag) {
|
|
|
101
90
|
}
|
|
102
91
|
}
|
|
103
92
|
if (manifest?.entrypoint !== undefined) {
|
|
104
|
-
|
|
93
|
+
if (manifest.entrypoint.origin !== origin) {
|
|
94
|
+
fail('PUBLICATION_VIEW_INVALID', 'Manifest entrypoint must belong to the root origin.');
|
|
95
|
+
}
|
|
96
|
+
const key = Key.of(manifest.entrypoint);
|
|
105
97
|
if (!views.some(({ view }) => view === key)) {
|
|
106
98
|
fail('PUBLICATION_VIEW_INVALID', 'Manifest entrypoint must have a published View binding.');
|
|
107
99
|
}
|
|
@@ -124,60 +116,12 @@ function acceptPublication(input, requireEtag) {
|
|
|
124
116
|
...(delivery === undefined ? {} : { delivery }),
|
|
125
117
|
});
|
|
126
118
|
}
|
|
127
|
-
function validateBundleInventory(publication, bundle) {
|
|
128
|
-
const root = bundle.root;
|
|
129
|
-
if (root.origin !== publication.origin ||
|
|
130
|
-
dslSchema.revision(root) !== publication.schema.revision) {
|
|
131
|
-
fail('PUBLICATION_INVALID', 'Bundle root does not match the Publication schema.');
|
|
132
|
-
}
|
|
133
|
-
validateRequirements(root, bundle.closure, publication.requirements);
|
|
134
|
-
const callables = concreteCallables(root);
|
|
135
|
-
const publishedCallables = new Set(publication.bindings.callables.map(({ callable }) => callable));
|
|
136
|
-
if (publishedCallables.size !== callables.size ||
|
|
137
|
-
[...callables].some((key) => !publishedCallables.has(key))) {
|
|
138
|
-
fail('PUBLICATION_BINDING_INVALID', 'Callable bindings must exhaust the root Domain.');
|
|
139
|
-
}
|
|
140
|
-
const views = new Set(Object.keys(root.views).map((name) => Key.of(root.origin, Ref.definition('view', name))));
|
|
141
|
-
const publishedViews = new Set(publication.bindings.views.map(({ view }) => view));
|
|
142
|
-
if (publishedViews.size !== views.size || [...views].some((key) => !publishedViews.has(key))) {
|
|
143
|
-
fail('PUBLICATION_VIEW_INVALID', 'View bindings must exhaust the root Domain.');
|
|
144
|
-
}
|
|
145
|
-
if (publication.manifest?.entrypoint !== undefined &&
|
|
146
|
-
root.views[Ref.member(publication.manifest.entrypoint)] === undefined) {
|
|
147
|
-
fail('PUBLICATION_INVALID', 'Manifest entrypoint does not exist in the root schema.');
|
|
148
|
-
}
|
|
149
|
-
for (const route of publication.routes) {
|
|
150
|
-
if (!callables.has(route.callable)) {
|
|
151
|
-
fail('PUBLICATION_ROUTE_INVALID', `Route ${route.name} names an unknown callable.`);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
function concreteCallables(root) {
|
|
156
|
-
const result = new Set();
|
|
157
|
-
for (const name of Object.keys(root.functions)) {
|
|
158
|
-
result.add(Key.of(root.origin, Ref.definition('function', name)));
|
|
159
|
-
}
|
|
160
|
-
addConcreteMethods(result, root.origin, 'class', root.classes);
|
|
161
|
-
addConcreteMethods(result, root.origin, 'interface', root.interfaces);
|
|
162
|
-
return result;
|
|
163
|
-
}
|
|
164
|
-
function addConcreteMethods(result, origin, kind, definitions) {
|
|
165
|
-
for (const [owner, declaration] of Object.entries(definitions)) {
|
|
166
|
-
if (declaration.family !== 'node')
|
|
167
|
-
continue;
|
|
168
|
-
for (const [name, method] of Object.entries(declaration.methods)) {
|
|
169
|
-
if (method.inheritance === 'abstract')
|
|
170
|
-
continue;
|
|
171
|
-
result.add(Key.of(origin, Ref.method(Ref.definition(kind, owner), name)));
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
119
|
function admitIssuer(input) {
|
|
176
120
|
try {
|
|
177
|
-
return
|
|
121
|
+
return acceptIssuerId(String(input));
|
|
178
122
|
}
|
|
179
123
|
catch (cause) {
|
|
180
|
-
if (cause instanceof
|
|
124
|
+
if (cause instanceof AuthValueError) {
|
|
181
125
|
return fail('PUBLICATION_INVALID', 'Publication issuer is invalid.', cause);
|
|
182
126
|
}
|
|
183
127
|
throw cause;
|
|
@@ -187,4 +131,3 @@ function withoutEtag(input) {
|
|
|
187
131
|
const { etag: _etag, ...content } = input;
|
|
188
132
|
return content;
|
|
189
133
|
}
|
|
190
|
-
//# sourceMappingURL=publication.js.map
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { Revision } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
|
+
import { type Key } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
3
|
import type { Etag } from './etag.js';
|
|
3
4
|
import type { Publication } from './publication.js';
|
|
4
5
|
/** Compact untrusted projection that witnesses one exact Publication. */
|
|
5
6
|
export interface PublicationRef {
|
|
6
7
|
readonly origin: Key.Origin;
|
|
7
8
|
readonly identity: Publication['identity'];
|
|
8
|
-
readonly revision:
|
|
9
|
+
readonly revision: Revision;
|
|
9
10
|
readonly etag: Etag;
|
|
10
11
|
}
|
|
11
12
|
export type PublicationReferenceRelation = 'exact' | 'same-schema' | 'schema-drift' | 'identity-drift' | 'origin-drift';
|
|
@@ -14,4 +15,3 @@ export declare function acceptReference(input: unknown): PublicationRef;
|
|
|
14
15
|
export declare function compareReferences(input: PublicationRef, expected: PublicationRef): PublicationReferenceRelation;
|
|
15
16
|
export declare function compareReference(input: Publication, expected: PublicationRef): PublicationReferenceRelation;
|
|
16
17
|
export declare function matchesReference(input: Publication, expected: PublicationRef): boolean;
|
|
17
|
-
//# sourceMappingURL=reference.d.ts.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { AuthValueError } from '@astrale-os/kernel-core/auth/error';
|
|
2
|
+
import { accept as acceptIssuerId } from '@astrale-os/kernel-core/auth/issuer';
|
|
3
|
+
import { patterns } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
3
4
|
import { deepFreeze, exact, record } from './content.js';
|
|
4
5
|
import { fail } from './error.js';
|
|
5
6
|
import { admitDigest } from './etag.js';
|
|
@@ -14,7 +15,7 @@ export function reference(input) {
|
|
|
14
15
|
export function acceptReference(input) {
|
|
15
16
|
const value = record(input, 'PUBLICATION_INVALID', 'Publication reference is invalid.');
|
|
16
17
|
exact(value, ['origin', 'identity', 'revision', 'etag'], 'PUBLICATION_INVALID');
|
|
17
|
-
if (typeof value.origin !== 'string' || !
|
|
18
|
+
if (typeof value.origin !== 'string' || !patterns.origin.test(value.origin)) {
|
|
18
19
|
fail('PUBLICATION_INVALID', 'Publication reference origin is invalid.');
|
|
19
20
|
}
|
|
20
21
|
const origin = value.origin;
|
|
@@ -24,7 +25,7 @@ export function acceptReference(input) {
|
|
|
24
25
|
if (identity.subject !== origin) {
|
|
25
26
|
fail('PUBLICATION_INVALID', 'Publication reference subject must equal its root origin.');
|
|
26
27
|
}
|
|
27
|
-
if (typeof value.revision !== 'string' || !
|
|
28
|
+
if (typeof value.revision !== 'string' || !patterns.revision.test(value.revision)) {
|
|
28
29
|
fail('PUBLICATION_INVALID', 'Publication reference revision is invalid.');
|
|
29
30
|
}
|
|
30
31
|
return deepFreeze({
|
|
@@ -56,13 +57,12 @@ function acceptIssuer(input) {
|
|
|
56
57
|
fail('PUBLICATION_INVALID', 'Publication reference issuer is invalid.');
|
|
57
58
|
}
|
|
58
59
|
try {
|
|
59
|
-
return
|
|
60
|
+
return acceptIssuerId(input);
|
|
60
61
|
}
|
|
61
62
|
catch (cause) {
|
|
62
|
-
if (cause instanceof
|
|
63
|
+
if (cause instanceof AuthValueError) {
|
|
63
64
|
return fail('PUBLICATION_INVALID', 'Publication reference issuer is invalid.', cause);
|
|
64
65
|
}
|
|
65
66
|
throw cause;
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
|
-
//# sourceMappingURL=reference.js.map
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import type { AuthorityOperation } from '@astrale-os/kernel-core/schema';
|
|
2
|
-
import type {
|
|
1
|
+
import type { AuthorityOperation } from '@astrale-os/kernel-core/schema/authority/operation';
|
|
2
|
+
import type { schema } from '@astrale-os/kernel-dsl/v1';
|
|
3
|
+
import type { ClassRef, Key as SemanticKey } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
3
4
|
export type NonEmpty<Value> = readonly [Value, ...Value[]];
|
|
4
5
|
export declare const ClassOperationOrder: readonly ["create", "read", "traverse", "update", "delete"];
|
|
5
6
|
export type ClassOperation = (typeof ClassOperationOrder)[number];
|
|
6
7
|
export interface ClassCapabilityRequirement {
|
|
7
|
-
readonly class:
|
|
8
|
+
readonly class: ClassRef;
|
|
8
9
|
readonly operations: NonEmpty<ClassOperation>;
|
|
9
10
|
}
|
|
10
11
|
export interface CapabilityAdminRequirements {
|
|
@@ -23,4 +24,3 @@ export interface PublicationRequirements {
|
|
|
23
24
|
export declare function admitRequirements(input: unknown): PublicationRequirements;
|
|
24
25
|
/** Bind explicit capability targets to exact functional dependencies in the bundle closure. */
|
|
25
26
|
export declare function validateRequirements(root: schema.DomainSchema, closure: readonly schema.DomainSchema[], requirements: PublicationRequirements): void;
|
|
26
|
-
//# sourceMappingURL=requirements.d.ts.map
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { AuthorityOperationOrder } from '@astrale-os/kernel-core/schema';
|
|
2
|
-
import {
|
|
1
|
+
import { AuthorityOperationOrder } from '@astrale-os/kernel-core/schema/authority/operation';
|
|
2
|
+
import { acceptDefinitionRef, callableAddress, Key } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
3
|
+
import { revision } from '@astrale-os/kernel-dsl/v1/schema/revision';
|
|
3
4
|
import { array, deepFreeze, exact, record, unique } from './content.js';
|
|
4
5
|
import { fail } from './error.js';
|
|
5
6
|
export const ClassOperationOrder = Object.freeze([
|
|
@@ -46,17 +47,15 @@ export function admitRequirements(input) {
|
|
|
46
47
|
export function validateRequirements(root, closure, requirements) {
|
|
47
48
|
const dependencies = exactDependencyClosure(root, closure);
|
|
48
49
|
for (const callable of requirements.capabilities.functions ?? []) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const reference = Key.ref(callable);
|
|
52
|
-
if (!hasCallable(dependency, reference)) {
|
|
50
|
+
const dependency = capabilityOwner(root, dependencies, callable, 'Function');
|
|
51
|
+
if (!hasCallable(dependency, callable)) {
|
|
53
52
|
fail('PUBLICATION_INVALID', 'Function capability requirement names an unknown dependency callable.');
|
|
54
53
|
}
|
|
55
54
|
}
|
|
56
55
|
for (const requirement of requirements.capabilities.classes ?? []) {
|
|
57
|
-
const key = Key.
|
|
58
|
-
|
|
59
|
-
if (
|
|
56
|
+
const key = Key.of(requirement.class);
|
|
57
|
+
const dependency = capabilityOwner(root, dependencies, key, 'Class');
|
|
58
|
+
if (dependency.classes[requirement.class.name] === undefined) {
|
|
60
59
|
fail('PUBLICATION_INVALID', 'Class capability requirement names an unknown dependency Class.');
|
|
61
60
|
}
|
|
62
61
|
}
|
|
@@ -65,9 +64,9 @@ function exactDependencyClosure(root, closure) {
|
|
|
65
64
|
const supplied = new Map(closure.map((dependency) => [dependency.origin, dependency]));
|
|
66
65
|
const reachable = new Map();
|
|
67
66
|
const visit = (owner) => {
|
|
68
|
-
for (const coordinate of owner.dependencies) {
|
|
67
|
+
for (const coordinate of Object.values(owner.dependencies)) {
|
|
69
68
|
const dependency = supplied.get(coordinate.origin);
|
|
70
|
-
if (dependency === undefined ||
|
|
69
|
+
if (dependency === undefined || revision(dependency) !== coordinate.revision) {
|
|
71
70
|
fail('PUBLICATION_INVALID', 'Publication Bundle omits an exact dependency.');
|
|
72
71
|
}
|
|
73
72
|
if (reachable.has(dependency.origin))
|
|
@@ -83,8 +82,10 @@ function admitCallable(input) {
|
|
|
83
82
|
if (typeof input !== 'string' || !Key.is(input)) {
|
|
84
83
|
return fail('PUBLICATION_INVALID', 'Function capability reference is invalid.');
|
|
85
84
|
}
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
try {
|
|
86
|
+
callableAddress(input);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
88
89
|
return fail('PUBLICATION_INVALID', 'Function capability reference must name a Function or Method.');
|
|
89
90
|
}
|
|
90
91
|
return input;
|
|
@@ -122,16 +123,16 @@ function admitAuthorityOperations(input, kind) {
|
|
|
122
123
|
return Object.freeze(values);
|
|
123
124
|
}
|
|
124
125
|
function admitClassRef(input) {
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
typeof value.name !== 'string' ||
|
|
131
|
-
!dslSchema.patterns.memberName.test(value.name)) {
|
|
126
|
+
let value;
|
|
127
|
+
try {
|
|
128
|
+
value = acceptDefinitionRef(input);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
132
131
|
fail('PUBLICATION_INVALID', 'Class capability reference is invalid.');
|
|
133
132
|
}
|
|
134
|
-
|
|
133
|
+
if (value.kind !== 'class')
|
|
134
|
+
fail('PUBLICATION_INVALID', 'Class capability reference is invalid.');
|
|
135
|
+
return value;
|
|
135
136
|
}
|
|
136
137
|
function nonEmpty(input, label) {
|
|
137
138
|
const values = [...array(input, 'PUBLICATION_INVALID')];
|
|
@@ -157,24 +158,23 @@ function compare(left, right) {
|
|
|
157
158
|
return left < right ? -1 : left > right ? 1 : 0;
|
|
158
159
|
}
|
|
159
160
|
function classKey(input) {
|
|
160
|
-
return String(Key.
|
|
161
|
+
return String(Key.of(input));
|
|
161
162
|
}
|
|
162
|
-
function
|
|
163
|
+
function capabilityOwner(root, dependencies, key, label) {
|
|
163
164
|
const origin = Key.origin(key);
|
|
164
165
|
if (origin === root.origin)
|
|
165
166
|
fail('PUBLICATION_INVALID', `${label} capability target cannot be local.`);
|
|
166
|
-
|
|
167
|
+
const dependency = dependencies.get(origin);
|
|
168
|
+
if (dependency === undefined) {
|
|
167
169
|
fail('PUBLICATION_INVALID', `${label} capability target must belong to the exact dependency closure.`);
|
|
168
170
|
}
|
|
171
|
+
return dependency;
|
|
169
172
|
}
|
|
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;
|
|
173
|
+
function hasCallable(dependency, callable) {
|
|
174
|
+
const coordinate = callableAddress(callable);
|
|
175
|
+
if (coordinate.kind === 'function')
|
|
176
|
+
return dependency.functions[coordinate.name] !== undefined;
|
|
177
|
+
const declaration = dependency.classes[coordinate.owner.name];
|
|
178
|
+
const method = declaration?.kind === 'node' ? declaration.methods[coordinate.name] : undefined;
|
|
179
|
+
return method !== undefined && method.inheritance !== 'abstract';
|
|
179
180
|
}
|
|
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
|