@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,9 +1,17 @@
|
|
|
1
|
-
import { Key } from '@astrale-os/kernel-dsl/v1';
|
|
1
|
+
import { Key } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
2
|
import { absoluteHttpUrl, exact, record } from '../content.js';
|
|
3
3
|
import { fail } from '../error.js';
|
|
4
|
+
const TOKEN = /^[a-z][a-z0-9-]*$/u;
|
|
4
5
|
export function admitViewBinding(input, origin) {
|
|
6
|
+
return readViewBinding(input, origin, false);
|
|
7
|
+
}
|
|
8
|
+
/** Authoring-only normalization used before a Publication receives its canonical ETag. */
|
|
9
|
+
export function canonicalizeViewBinding(input, origin) {
|
|
10
|
+
return readViewBinding(input, origin, true);
|
|
11
|
+
}
|
|
12
|
+
function readViewBinding(input, origin, canonicalize) {
|
|
5
13
|
const value = record(input, 'PUBLICATION_VIEW_INVALID', 'Published View binding is invalid.');
|
|
6
|
-
exact(value, ['view', 'href', 'handshake'], 'PUBLICATION_VIEW_INVALID');
|
|
14
|
+
exact(value, ['view', 'href', 'handshake', 'iframe'], 'PUBLICATION_VIEW_INVALID');
|
|
7
15
|
let view;
|
|
8
16
|
try {
|
|
9
17
|
view = Key(String(value.view));
|
|
@@ -14,16 +22,116 @@ export function admitViewBinding(input, origin) {
|
|
|
14
22
|
}
|
|
15
23
|
throw cause;
|
|
16
24
|
}
|
|
17
|
-
if (Key.origin(view) !== origin || !
|
|
25
|
+
if (Key.origin(view) !== origin || !view.slice(view.indexOf(':') + 1).startsWith('view.')) {
|
|
18
26
|
fail('PUBLICATION_VIEW_INVALID', 'View binding must name a root View.');
|
|
19
27
|
}
|
|
20
28
|
if (value.handshake !== 'shell' && value.handshake !== 'none') {
|
|
21
29
|
fail('PUBLICATION_VIEW_INVALID', 'View handshake is invalid.');
|
|
22
30
|
}
|
|
31
|
+
const iframe = admitIframeRequirements(dataValue(value, 'iframe'), value.handshake, canonicalize);
|
|
23
32
|
return Object.freeze({
|
|
24
33
|
view,
|
|
25
34
|
href: absoluteHttpUrl(value.href, true, 'PUBLICATION_VIEW_INVALID'),
|
|
26
35
|
handshake: value.handshake,
|
|
36
|
+
...(iframe === undefined ? {} : { iframe }),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
function admitIframeRequirements(input, handshake, canonicalize) {
|
|
40
|
+
if (input === undefined)
|
|
41
|
+
return undefined;
|
|
42
|
+
const value = plainRecord(input);
|
|
43
|
+
exactOwnKeys(value, ['sandbox', 'allow']);
|
|
44
|
+
if (!canonicalize && (!Object.hasOwn(value, 'sandbox') || !Object.hasOwn(value, 'allow'))) {
|
|
45
|
+
invalid();
|
|
46
|
+
}
|
|
47
|
+
const sandbox = tokens(dataValue(value, 'sandbox'), canonicalize);
|
|
48
|
+
const allow = tokens(dataValue(value, 'allow'), canonicalize);
|
|
49
|
+
assertRelationships(sandbox);
|
|
50
|
+
const baselineSandbox = handshake === 'shell' ? ['allow-same-origin', 'allow-scripts'] : ['allow-scripts'];
|
|
51
|
+
const baselineAllow = handshake === 'shell' ? ['clipboard-write'] : [];
|
|
52
|
+
if (!canonicalize &&
|
|
53
|
+
(sandbox.some((token) => baselineSandbox.includes(token)) ||
|
|
54
|
+
allow.some((feature) => baselineAllow.includes(feature)))) {
|
|
55
|
+
invalid();
|
|
56
|
+
}
|
|
57
|
+
const canonicalSandbox = canonicalize
|
|
58
|
+
? sandbox.filter((token) => !baselineSandbox.includes(token))
|
|
59
|
+
: sandbox;
|
|
60
|
+
const canonicalAllow = canonicalize
|
|
61
|
+
? allow.filter((feature) => !baselineAllow.includes(feature))
|
|
62
|
+
: allow;
|
|
63
|
+
if (!canonicalize && canonicalSandbox.length === 0 && canonicalAllow.length === 0)
|
|
64
|
+
invalid();
|
|
65
|
+
if (canonicalSandbox.length === 0 && canonicalAllow.length === 0)
|
|
66
|
+
return undefined;
|
|
67
|
+
return Object.freeze({
|
|
68
|
+
sandbox: Object.freeze(canonicalSandbox),
|
|
69
|
+
allow: Object.freeze(canonicalAllow),
|
|
27
70
|
});
|
|
28
71
|
}
|
|
29
|
-
|
|
72
|
+
function plainRecord(input) {
|
|
73
|
+
if (input === null || typeof input !== 'object' || Array.isArray(input))
|
|
74
|
+
invalid();
|
|
75
|
+
const prototype = Object.getPrototypeOf(input);
|
|
76
|
+
if (prototype !== Object.prototype && prototype !== null)
|
|
77
|
+
invalid();
|
|
78
|
+
return input;
|
|
79
|
+
}
|
|
80
|
+
function exactOwnKeys(input, allowed) {
|
|
81
|
+
const keys = new Set(allowed);
|
|
82
|
+
if (Reflect.ownKeys(input).some((key) => typeof key !== 'string' || !keys.has(key)))
|
|
83
|
+
invalid();
|
|
84
|
+
}
|
|
85
|
+
function dataValue(input, key) {
|
|
86
|
+
const descriptor = Object.getOwnPropertyDescriptor(input, key);
|
|
87
|
+
if (descriptor === undefined)
|
|
88
|
+
return undefined;
|
|
89
|
+
if (!('value' in descriptor))
|
|
90
|
+
invalid();
|
|
91
|
+
return descriptor.value;
|
|
92
|
+
}
|
|
93
|
+
function tokens(input, canonicalize) {
|
|
94
|
+
if (input === undefined)
|
|
95
|
+
return [];
|
|
96
|
+
if (!Array.isArray(input))
|
|
97
|
+
invalid();
|
|
98
|
+
const descriptors = Object.getOwnPropertyDescriptors(input);
|
|
99
|
+
const values = [];
|
|
100
|
+
for (let index = 0; index < input.length; index += 1) {
|
|
101
|
+
const descriptor = descriptors[String(index)];
|
|
102
|
+
if (descriptor === undefined || !('value' in descriptor))
|
|
103
|
+
invalid();
|
|
104
|
+
if (typeof descriptor.value !== 'string' || !TOKEN.test(descriptor.value))
|
|
105
|
+
invalid();
|
|
106
|
+
values.push(descriptor.value);
|
|
107
|
+
}
|
|
108
|
+
for (const key of Reflect.ownKeys(descriptors)) {
|
|
109
|
+
if (key === 'length')
|
|
110
|
+
continue;
|
|
111
|
+
if (typeof key !== 'string' || !/^(0|[1-9][0-9]*)$/u.test(key) || Number(key) >= input.length) {
|
|
112
|
+
invalid();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (canonicalize)
|
|
116
|
+
return [...new Set(values)].sort();
|
|
117
|
+
for (let index = 1; index < values.length; index += 1) {
|
|
118
|
+
if (values[index - 1] >= values[index])
|
|
119
|
+
invalid();
|
|
120
|
+
}
|
|
121
|
+
return values;
|
|
122
|
+
}
|
|
123
|
+
function assertRelationships(sandbox) {
|
|
124
|
+
const tokens = new Set(sandbox);
|
|
125
|
+
if (tokens.has('allow-popups-to-escape-sandbox') && !tokens.has('allow-popups'))
|
|
126
|
+
invalid();
|
|
127
|
+
if (tokens.has('allow-top-navigation') && tokens.has('allow-top-navigation-by-user-activation')) {
|
|
128
|
+
invalid();
|
|
129
|
+
}
|
|
130
|
+
if (tokens.has('allow-top-navigation-to-custom-protocols') &&
|
|
131
|
+
(tokens.has('allow-top-navigation') || tokens.has('allow-popups'))) {
|
|
132
|
+
invalid();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
function invalid() {
|
|
136
|
+
return fail('PUBLICATION_VIEW_INVALID', 'View iframe requirements are invalid.');
|
|
137
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import * as dslBundle from '@astrale-os/kernel-dsl/v1/bundle';
|
|
2
|
+
import type { Publication } from './publication.js';
|
|
3
|
+
export declare function acceptBundle(input: Publication, artifact: unknown): dslBundle.Bundle;
|
|
4
|
+
export declare function decodeBundle(input: Publication, bytes: Uint8Array): dslBundle.Bundle;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Key, MethodKey } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
|
+
import * as dslBundle from '@astrale-os/kernel-dsl/v1/bundle';
|
|
3
|
+
import { revision } from '@astrale-os/kernel-dsl/v1/schema/revision';
|
|
4
|
+
import { acceptBundleValue, decodeBundleValue, verifyBundleBytes } from './bundle.js';
|
|
5
|
+
import { fail } from './error.js';
|
|
6
|
+
import { validateRequirements } from './requirements.js';
|
|
7
|
+
export function acceptBundle(input, artifact) {
|
|
8
|
+
const accepted = acceptBundleValue(artifact);
|
|
9
|
+
verifyBundleBytes(input, dslBundle.encode(accepted));
|
|
10
|
+
validateInventory(input, accepted);
|
|
11
|
+
return accepted;
|
|
12
|
+
}
|
|
13
|
+
export function decodeBundle(input, bytes) {
|
|
14
|
+
const decoded = decodeBundleValue(input, bytes);
|
|
15
|
+
validateInventory(input, decoded);
|
|
16
|
+
return decoded;
|
|
17
|
+
}
|
|
18
|
+
function validateInventory(publication, bundle) {
|
|
19
|
+
const root = bundle.root;
|
|
20
|
+
if (root.origin !== publication.origin || revision(root) !== publication.schema.revision) {
|
|
21
|
+
fail('PUBLICATION_INVALID', 'Bundle root does not match the Publication schema.');
|
|
22
|
+
}
|
|
23
|
+
validateRequirements(root, bundle.closure, publication.requirements);
|
|
24
|
+
const callables = concreteCallables(root);
|
|
25
|
+
const publishedCallables = new Set(publication.bindings.callables.map(({ callable }) => callable));
|
|
26
|
+
if (publishedCallables.size !== callables.size ||
|
|
27
|
+
[...callables].some((key) => !publishedCallables.has(key))) {
|
|
28
|
+
fail('PUBLICATION_BINDING_INVALID', 'Callable bindings must exhaust the root Domain.');
|
|
29
|
+
}
|
|
30
|
+
const views = new Set(Object.keys(root.views).map((name) => Key.of({ origin: root.origin, kind: 'view', name })));
|
|
31
|
+
const publishedViews = new Set(publication.bindings.views.map(({ view }) => view));
|
|
32
|
+
if (publishedViews.size !== views.size || [...views].some((key) => !publishedViews.has(key))) {
|
|
33
|
+
fail('PUBLICATION_VIEW_INVALID', 'View bindings must exhaust the root Domain.');
|
|
34
|
+
}
|
|
35
|
+
if (publication.manifest?.entrypoint !== undefined &&
|
|
36
|
+
(publication.manifest.entrypoint.origin !== root.origin ||
|
|
37
|
+
publication.manifest.entrypoint.kind !== 'view' ||
|
|
38
|
+
root.views[publication.manifest.entrypoint.name] === undefined)) {
|
|
39
|
+
fail('PUBLICATION_INVALID', 'Manifest entrypoint does not exist in the root schema.');
|
|
40
|
+
}
|
|
41
|
+
for (const route of publication.routes) {
|
|
42
|
+
if (!callables.has(route.callable)) {
|
|
43
|
+
fail('PUBLICATION_ROUTE_INVALID', `Route ${route.name} names an unknown callable.`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
function concreteCallables(root) {
|
|
48
|
+
const result = new Set();
|
|
49
|
+
for (const name of Object.keys(root.functions)) {
|
|
50
|
+
result.add(Key.of({ origin: root.origin, kind: 'function', name }));
|
|
51
|
+
}
|
|
52
|
+
addClassMethods(result, root.origin, root.classes);
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
function addClassMethods(result, origin, definitions) {
|
|
56
|
+
for (const [owner, declaration] of Object.entries(definitions)) {
|
|
57
|
+
if (declaration.kind !== 'node')
|
|
58
|
+
continue;
|
|
59
|
+
for (const [name, method] of Object.entries(declaration.methods)) {
|
|
60
|
+
if (method.inheritance === 'abstract')
|
|
61
|
+
continue;
|
|
62
|
+
result.add(MethodKey.of({ origin, kind: 'class', name: owner }, name));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as artifact from '../artifact/index.js';
|
|
2
|
+
export declare const BUNDLE_MEDIA_TYPE: 'application/vnd.astrale.domain-bundle+json;v=1';
|
|
3
|
+
export interface BundleDescriptor {
|
|
4
|
+
readonly href: string;
|
|
5
|
+
readonly ref: artifact.Ref & {
|
|
6
|
+
readonly mediaType: typeof BUNDLE_MEDIA_TYPE;
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export declare function admitBundleDescriptor(input: unknown): BundleDescriptor;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as artifact from '../artifact/index.js';
|
|
2
|
+
import { absoluteHttpUrl, exact, record } from './content.js';
|
|
3
|
+
import { fail } from './error.js';
|
|
4
|
+
export const BUNDLE_MEDIA_TYPE = 'application/vnd.astrale.domain-bundle+json;v=1';
|
|
5
|
+
export function admitBundleDescriptor(input) {
|
|
6
|
+
const value = record(input, 'PUBLICATION_INVALID', 'Bundle descriptor is invalid.');
|
|
7
|
+
exact(value, ['href', 'ref'], 'PUBLICATION_INVALID');
|
|
8
|
+
const ref = artifact.accept(value.ref);
|
|
9
|
+
if (ref.mediaType !== BUNDLE_MEDIA_TYPE) {
|
|
10
|
+
fail('PUBLICATION_INVALID', 'Bundle media type is unsupported.');
|
|
11
|
+
}
|
|
12
|
+
if (ref.size < 1) {
|
|
13
|
+
fail('PUBLICATION_INVALID', 'Bundle size is invalid.');
|
|
14
|
+
}
|
|
15
|
+
return Object.freeze({
|
|
16
|
+
href: absoluteHttpUrl(value.href, true, 'PUBLICATION_INVALID'),
|
|
17
|
+
ref: Object.freeze({ ...ref, mediaType: BUNDLE_MEDIA_TYPE }),
|
|
18
|
+
});
|
|
19
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { fail } from './error.js';
|
|
2
|
+
import { sha256Hex } from './etag.js';
|
|
3
|
+
/** Verify exact artifact bytes without decoding an authored Schema Bundle. */
|
|
4
|
+
export function verifyBundleBytes(publication, bytes) {
|
|
5
|
+
if (!(bytes instanceof Uint8Array)) {
|
|
6
|
+
fail('PUBLICATION_INVALID', 'Bundle artifact bytes are invalid.');
|
|
7
|
+
}
|
|
8
|
+
const descriptor = publication.schema.bundle;
|
|
9
|
+
if (bytes.byteLength !== descriptor.ref.size ||
|
|
10
|
+
`sha256:${sha256Hex(bytes)}` !== descriptor.ref.digest) {
|
|
11
|
+
fail('PUBLICATION_INVALID', 'Bundle artifact does not match its descriptor.');
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -1,16 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as bundle from '@astrale-os/kernel-dsl/v1/bundle/transport';
|
|
2
|
+
import type { BundleDescriptor } from './bundle-descriptor.js';
|
|
2
3
|
import type { Publication } from './publication.js';
|
|
3
|
-
import
|
|
4
|
-
export declare const BUNDLE_MEDIA_TYPE: 'application/vnd.astrale.domain-bundle+json;v=1';
|
|
5
|
-
export interface BundleDescriptor {
|
|
6
|
-
readonly href: string;
|
|
7
|
-
readonly ref: artifact.Ref & {
|
|
8
|
-
readonly mediaType: typeof BUNDLE_MEDIA_TYPE;
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
export declare function admitBundleDescriptor(input: unknown): BundleDescriptor;
|
|
4
|
+
import { verifyBundleBytes } from './bundle-evidence.js';
|
|
12
5
|
export declare function describeBundle(input: bundle.Bundle, href: string): BundleDescriptor;
|
|
13
6
|
export declare function acceptBundleValue(input: unknown): bundle.Bundle;
|
|
14
|
-
export declare function verifyBundleBytes(publication: Publication, bytes: Uint8Array): void;
|
|
15
7
|
export declare function decodeBundleValue(publication: Publication, bytes: Uint8Array): bundle.Bundle;
|
|
16
|
-
|
|
8
|
+
export { verifyBundleBytes };
|
|
9
|
+
export { admitBundleDescriptor, BUNDLE_MEDIA_TYPE, type BundleDescriptor, } from './bundle-descriptor.js';
|
|
@@ -1,24 +1,9 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as bundle from '@astrale-os/kernel-dsl/v1/bundle/transport';
|
|
2
2
|
import * as artifact from '../artifact/index.js';
|
|
3
|
-
import {
|
|
3
|
+
import { BUNDLE_MEDIA_TYPE } from './bundle-descriptor.js';
|
|
4
|
+
import { verifyBundleBytes } from './bundle-evidence.js';
|
|
5
|
+
import { absoluteHttpUrl } from './content.js';
|
|
4
6
|
import { fail } from './error.js';
|
|
5
|
-
import { sha256Hex } from './etag.js';
|
|
6
|
-
export const BUNDLE_MEDIA_TYPE = 'application/vnd.astrale.domain-bundle+json;v=1';
|
|
7
|
-
export function admitBundleDescriptor(input) {
|
|
8
|
-
const value = record(input, 'PUBLICATION_INVALID', 'Bundle descriptor is invalid.');
|
|
9
|
-
exact(value, ['href', 'ref'], 'PUBLICATION_INVALID');
|
|
10
|
-
const ref = artifact.accept(value.ref);
|
|
11
|
-
if (ref.mediaType !== BUNDLE_MEDIA_TYPE) {
|
|
12
|
-
fail('PUBLICATION_INVALID', 'Bundle media type is unsupported.');
|
|
13
|
-
}
|
|
14
|
-
if (ref.size < 1) {
|
|
15
|
-
fail('PUBLICATION_INVALID', 'Bundle size is invalid.');
|
|
16
|
-
}
|
|
17
|
-
return Object.freeze({
|
|
18
|
-
href: absoluteHttpUrl(value.href, true, 'PUBLICATION_INVALID'),
|
|
19
|
-
ref: Object.freeze({ ...ref, mediaType: BUNDLE_MEDIA_TYPE }),
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
7
|
export function describeBundle(input, href) {
|
|
23
8
|
const bytes = bundle.encode(input);
|
|
24
9
|
return Object.freeze({
|
|
@@ -34,19 +19,12 @@ export function acceptBundleValue(input) {
|
|
|
34
19
|
return bundle.accept(input);
|
|
35
20
|
}
|
|
36
21
|
catch (cause) {
|
|
37
|
-
if (cause instanceof
|
|
22
|
+
if (cause instanceof bundle.Error) {
|
|
38
23
|
return fail('PUBLICATION_INVALID', 'Publication bundle is invalid.', cause);
|
|
39
24
|
}
|
|
40
25
|
throw cause;
|
|
41
26
|
}
|
|
42
27
|
}
|
|
43
|
-
export function verifyBundleBytes(publication, bytes) {
|
|
44
|
-
const descriptor = publication.schema.bundle;
|
|
45
|
-
if (bytes.byteLength !== descriptor.ref.size ||
|
|
46
|
-
`sha256:${sha256Hex(bytes)}` !== descriptor.ref.digest) {
|
|
47
|
-
fail('PUBLICATION_INVALID', 'Bundle artifact does not match its descriptor.');
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
28
|
export function decodeBundleValue(publication, bytes) {
|
|
51
29
|
if (!(bytes instanceof Uint8Array)) {
|
|
52
30
|
fail('PUBLICATION_INVALID', 'Bundle artifact bytes are invalid.');
|
|
@@ -56,10 +34,11 @@ export function decodeBundleValue(publication, bytes) {
|
|
|
56
34
|
return bundle.decode(bytes);
|
|
57
35
|
}
|
|
58
36
|
catch (cause) {
|
|
59
|
-
if (cause instanceof
|
|
37
|
+
if (cause instanceof bundle.Error) {
|
|
60
38
|
return fail('PUBLICATION_INVALID', 'Bundle artifact cannot be decoded.', cause);
|
|
61
39
|
}
|
|
62
40
|
throw cause;
|
|
63
41
|
}
|
|
64
42
|
}
|
|
65
|
-
|
|
43
|
+
export { verifyBundleBytes };
|
|
44
|
+
export { admitBundleDescriptor, BUNDLE_MEDIA_TYPE, } from './bundle-descriptor.js';
|
|
@@ -8,4 +8,3 @@ export declare function unique(values: readonly string[], code: PublicationError
|
|
|
8
8
|
export declare function deepFreeze<T>(value: T): T;
|
|
9
9
|
export declare function absoluteHttpUrl(input: unknown, allowSearch: boolean, code: PublicationErrorCode, allowTemplate?: boolean): string;
|
|
10
10
|
export declare function absoluteUrl(input: unknown, protocols: readonly string[], allowSearch: boolean, code: PublicationErrorCode, allowTemplate?: boolean): string;
|
|
11
|
-
//# sourceMappingURL=content.d.ts.map
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { Authentication as DeliveryAuthentication } from './delivery-endpoint.js';
|
|
2
|
+
import type { HttpRouteDeclaration } from './route.js';
|
|
3
|
+
export interface DeliveryDeclaration {
|
|
4
|
+
readonly path: string;
|
|
5
|
+
readonly authentication: DeliveryAuthentication;
|
|
6
|
+
}
|
|
7
|
+
/** Provider-neutral deployment input selected independently from Domain and Adapter. */
|
|
8
|
+
export interface Declaration {
|
|
9
|
+
readonly routes: readonly HttpRouteDeclaration[];
|
|
10
|
+
readonly delivery?: DeliveryDeclaration;
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import type
|
|
1
|
+
import type { Subject } from '@astrale-os/kernel-core/auth/identity';
|
|
2
|
+
import type { Revision } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
3
|
+
import { type IssuerId } from '@astrale-os/kernel-core/auth/issuer';
|
|
4
|
+
import type { Etag } from '../etag.js';
|
|
4
5
|
import { PURPOSE } from './limits.js';
|
|
5
6
|
export interface Claims {
|
|
6
7
|
readonly purpose: typeof PURPOSE;
|
|
7
|
-
readonly iss:
|
|
8
|
-
readonly sub:
|
|
9
|
-
readonly aud:
|
|
8
|
+
readonly iss: IssuerId;
|
|
9
|
+
readonly sub: Subject;
|
|
10
|
+
readonly aud: IssuerId;
|
|
10
11
|
readonly nonce: string;
|
|
11
12
|
readonly etag: Etag;
|
|
12
|
-
readonly schemaRevision:
|
|
13
|
+
readonly schemaRevision: Revision;
|
|
13
14
|
readonly exp: number;
|
|
14
15
|
}
|
|
15
16
|
export declare function acceptClaims(input: unknown): Claims;
|
|
16
|
-
//# sourceMappingURL=claims.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 { fail } from './error.js';
|
|
4
5
|
import { NONCE_MAX_LENGTH, NONCE_MIN_LENGTH, PURPOSE } from './limits.js';
|
|
5
6
|
export function acceptClaims(input) {
|
|
@@ -26,8 +27,7 @@ export function acceptClaims(input) {
|
|
|
26
27
|
if (typeof value.etag !== 'string' || !/^sha256:[0-9a-f]{64}$/u.test(value.etag)) {
|
|
27
28
|
fail('DELIVERY_CLAIMS_INVALID', 'Delivery claims ETag is invalid.');
|
|
28
29
|
}
|
|
29
|
-
if (typeof value.schemaRevision !== 'string' ||
|
|
30
|
-
!dslSchema.patterns.revision.test(value.schemaRevision)) {
|
|
30
|
+
if (typeof value.schemaRevision !== 'string' || !patterns.revision.test(value.schemaRevision)) {
|
|
31
31
|
fail('DELIVERY_CLAIMS_INVALID', 'Schema revision is invalid.');
|
|
32
32
|
}
|
|
33
33
|
return deepFreeze({
|
|
@@ -43,10 +43,10 @@ export function acceptClaims(input) {
|
|
|
43
43
|
}
|
|
44
44
|
function acceptIssuer(input) {
|
|
45
45
|
try {
|
|
46
|
-
return
|
|
46
|
+
return acceptIssuerId(String(input));
|
|
47
47
|
}
|
|
48
48
|
catch (cause) {
|
|
49
|
-
if (cause instanceof
|
|
49
|
+
if (cause instanceof AuthValueError) {
|
|
50
50
|
return fail('DELIVERY_CLAIMS_INVALID', 'Delivery claims issuer is invalid.', cause);
|
|
51
51
|
}
|
|
52
52
|
throw cause;
|
|
@@ -59,4 +59,3 @@ function deepFreeze(value) {
|
|
|
59
59
|
deepFreeze(nested);
|
|
60
60
|
return Object.freeze(value);
|
|
61
61
|
}
|
|
62
|
-
//# sourceMappingURL=claims.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Publication } from '../
|
|
1
|
+
import type { Publication } from '../publication.js';
|
|
2
2
|
import type { Attestation } from './attestation.js';
|
|
3
3
|
export interface Delivery {
|
|
4
4
|
readonly format: 'astrale.domain.delivery';
|
|
@@ -7,4 +7,3 @@ export interface Delivery {
|
|
|
7
7
|
readonly attestation: Attestation;
|
|
8
8
|
}
|
|
9
9
|
export declare function accept(input: unknown): Delivery;
|
|
10
|
-
//# sourceMappingURL=delivery.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { accept as acceptPublication } from '../
|
|
1
|
+
import { accept as acceptPublication } from '../publication.js';
|
|
2
2
|
import { acceptAttestation } from './attestation.js';
|
|
3
3
|
import { fail } from './error.js';
|
|
4
4
|
export function accept(input) {
|
|
@@ -27,4 +27,3 @@ function deepFreeze(value) {
|
|
|
27
27
|
deepFreeze(nested);
|
|
28
28
|
return Object.freeze(value);
|
|
29
29
|
}
|
|
30
|
-
//# sourceMappingURL=delivery.js.map
|
|
@@ -4,4 +4,3 @@ export { DeliveryError as Error, type DeliveryErrorCode as ErrorCode } from './e
|
|
|
4
4
|
export { accept, type Delivery } from './delivery.js';
|
|
5
5
|
export { ATTESTATION_MAX_BYTES, NONCE_MAX_LENGTH, NONCE_MIN_LENGTH, PURPOSE } from './limits.js';
|
|
6
6
|
export { acceptRequest, type Token, type Request } from './request.js';
|
|
7
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -4,4 +4,3 @@ export { DeliveryError as Error } from './error.js';
|
|
|
4
4
|
export { accept } from './delivery.js';
|
|
5
5
|
export { ATTESTATION_MAX_BYTES, NONCE_MAX_LENGTH, NONCE_MIN_LENGTH, PURPOSE } from './limits.js';
|
|
6
6
|
export { acceptRequest } from './request.js';
|
|
7
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import type { Etag } from '../
|
|
1
|
+
import { type IssuerId } from '@astrale-os/kernel-core/auth/issuer';
|
|
2
|
+
import type { Etag } from '../etag.js';
|
|
3
3
|
export interface Request {
|
|
4
4
|
readonly version: 1;
|
|
5
|
-
readonly kernel:
|
|
5
|
+
readonly kernel: IssuerId;
|
|
6
6
|
readonly nonce: string;
|
|
7
7
|
readonly etag: Etag;
|
|
8
8
|
}
|
|
@@ -13,4 +13,3 @@ export interface Token {
|
|
|
13
13
|
}
|
|
14
14
|
/** Admit the exact request representation accepted by a Delivery transport boundary. */
|
|
15
15
|
export declare function acceptRequest(input: unknown): Request;
|
|
16
|
-
//# sourceMappingURL=request.d.ts.map
|
|
@@ -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
|