@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,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { admitBundleDescriptor } from './bundle.js';
|
|
1
|
+
import { patterns } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
|
+
import { admitBundleDescriptor } from './bundle-descriptor.js';
|
|
3
3
|
import { exact, record } from './content.js';
|
|
4
4
|
import { fail } from './error.js';
|
|
5
5
|
export function admitSchema(input) {
|
|
6
6
|
const value = record(input, 'PUBLICATION_INVALID', 'Published schema is invalid.');
|
|
7
7
|
exact(value, ['revision', 'bundle'], 'PUBLICATION_INVALID');
|
|
8
|
-
if (typeof value.revision !== 'string' || !
|
|
8
|
+
if (typeof value.revision !== 'string' || !patterns.revision.test(value.revision)) {
|
|
9
9
|
fail('PUBLICATION_INVALID', 'Published schema revision is invalid.');
|
|
10
10
|
}
|
|
11
11
|
return Object.freeze({
|
|
@@ -13,4 +13,3 @@ export function admitSchema(input) {
|
|
|
13
13
|
bundle: admitBundleDescriptor(value.bundle),
|
|
14
14
|
});
|
|
15
15
|
}
|
|
16
|
-
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { accept as acceptPortable } from '@astrale-os/kernel-dsl/value';
|
|
2
|
+
import { acceptReference } from '../publication/reference.js';
|
|
3
|
+
import { admitRoute } from '../publication/route.js';
|
|
4
|
+
import { fail } from './error.js';
|
|
5
|
+
const AUTH = new Set(['anonymous', 'authenticated', 'authorized']);
|
|
6
|
+
const OUTPUT = new Set(['value', 'stream', 'binary']);
|
|
7
|
+
/** Admit one emitted portable Table before Server composition. */
|
|
8
|
+
export function acceptTable(input) {
|
|
9
|
+
const value = object(acceptPortable(input), 'Route Table');
|
|
10
|
+
exact(value, ['publication', 'entries'], 'Route Table');
|
|
11
|
+
const reference = acceptReference(value.publication);
|
|
12
|
+
if (!Array.isArray(value.entries))
|
|
13
|
+
invalid('Route Table entries');
|
|
14
|
+
const entries = value.entries.map((entry) => acceptRoute(entry, reference.origin));
|
|
15
|
+
if (new Set(entries.map(({ name }) => name)).size !== entries.length) {
|
|
16
|
+
fail('NATIVE_ROUTE_BINDING_INVALID', 'Route Table names must be unique.');
|
|
17
|
+
}
|
|
18
|
+
return Object.freeze({ publication: reference, entries: Object.freeze(entries) });
|
|
19
|
+
}
|
|
20
|
+
function acceptRoute(input, origin) {
|
|
21
|
+
const value = object(input, 'Route Table entry');
|
|
22
|
+
exact(value, ['name', 'callable', 'target', 'auth', 'output', 'href', 'method', 'default'], 'Route Table entry', ['requestMethod', 'query', 'headers', 'body', 'credential']);
|
|
23
|
+
if (typeof value.default !== 'boolean')
|
|
24
|
+
invalid('Route Table default');
|
|
25
|
+
if (typeof value.auth !== 'string' || !AUTH.has(value.auth)) {
|
|
26
|
+
invalid('Route Table auth');
|
|
27
|
+
}
|
|
28
|
+
if (typeof value.output !== 'string' || !OUTPUT.has(value.output))
|
|
29
|
+
invalid('Route Table output');
|
|
30
|
+
const wire = admitRoute({
|
|
31
|
+
name: value.name,
|
|
32
|
+
callable: value.callable,
|
|
33
|
+
href: value.href,
|
|
34
|
+
method: value.method,
|
|
35
|
+
...(value.default === true ? { default: true } : {}),
|
|
36
|
+
...(value.requestMethod === undefined ? {} : { requestMethod: value.requestMethod }),
|
|
37
|
+
...(value.query === undefined ? {} : { query: value.query }),
|
|
38
|
+
...(value.headers === undefined ? {} : { headers: value.headers }),
|
|
39
|
+
...(value.body === undefined ? {} : { body: value.body }),
|
|
40
|
+
...(value.credential === undefined ? {} : { credential: value.credential }),
|
|
41
|
+
...receiver(value.target),
|
|
42
|
+
}, origin);
|
|
43
|
+
const { default: _default, receiver: _receiver, ...common } = wire;
|
|
44
|
+
return Object.freeze({
|
|
45
|
+
...common,
|
|
46
|
+
target: target(value.target),
|
|
47
|
+
auth: value.auth,
|
|
48
|
+
output: value.output,
|
|
49
|
+
default: value.default,
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
function target(input) {
|
|
53
|
+
const value = object(input, 'Route target');
|
|
54
|
+
if (value.kind === 'function') {
|
|
55
|
+
exact(value, ['kind'], 'Route Function target');
|
|
56
|
+
return Object.freeze({ kind: 'function' });
|
|
57
|
+
}
|
|
58
|
+
if (value.kind !== 'method' || (value.dispatch !== 'static' && value.dispatch !== 'instance')) {
|
|
59
|
+
invalid('Route Method target');
|
|
60
|
+
}
|
|
61
|
+
if (value.dispatch === 'static') {
|
|
62
|
+
exact(value, ['kind', 'dispatch'], 'Route static Method target');
|
|
63
|
+
return Object.freeze({ kind: 'method', dispatch: 'static' });
|
|
64
|
+
}
|
|
65
|
+
exact(value, ['kind', 'dispatch', 'receiver'], 'Route instance Method target');
|
|
66
|
+
if (typeof value.receiver !== 'string')
|
|
67
|
+
invalid('Route receiver');
|
|
68
|
+
return Object.freeze({ kind: 'method', dispatch: 'instance', receiver: value.receiver });
|
|
69
|
+
}
|
|
70
|
+
function receiver(input) {
|
|
71
|
+
const admitted = target(input);
|
|
72
|
+
return admitted.kind === 'method' && admitted.dispatch === 'instance'
|
|
73
|
+
? { receiver: admitted.receiver }
|
|
74
|
+
: {};
|
|
75
|
+
}
|
|
76
|
+
function object(input, label) {
|
|
77
|
+
if (input === null || typeof input !== 'object' || Array.isArray(input))
|
|
78
|
+
invalid(label);
|
|
79
|
+
return input;
|
|
80
|
+
}
|
|
81
|
+
function exact(value, required, label, optional = []) {
|
|
82
|
+
const allowed = new Set([...required, ...optional]);
|
|
83
|
+
if (Object.keys(value).some((key) => !allowed.has(key)) ||
|
|
84
|
+
required.some((key) => !Object.hasOwn(value, key)))
|
|
85
|
+
invalid(label);
|
|
86
|
+
}
|
|
87
|
+
function invalid(label) {
|
|
88
|
+
return fail('NATIVE_ROUTE_BINDING_INVALID', `${label} is invalid.`);
|
|
89
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Domain } from '@astrale-os/kernel-dsl/v1';
|
|
2
|
+
import type { Publication } from '../publication/publication.js';
|
|
3
|
+
import type { Plan } from './plan.js';
|
|
4
|
+
import type { Table } from './table.js';
|
|
5
|
+
/** Bind one Plan to an exact placed Publication and matching resolved Domain. */
|
|
6
|
+
export declare function bind(plan: Plan, deployed: Publication, domain: Domain): Table;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { json } from '@astrale-os/kernel-dsl/value';
|
|
2
|
+
import { reference } from '../publication/reference.js';
|
|
3
|
+
import { fail } from './error.js';
|
|
4
|
+
import { place } from './placement.js';
|
|
5
|
+
import { rejectReserved } from './reservation.js';
|
|
6
|
+
/** Bind one Plan to an exact placed Publication and matching resolved Domain. */
|
|
7
|
+
export function bind(plan, deployed, domain) {
|
|
8
|
+
if (plan.origin !== deployed.origin ||
|
|
9
|
+
plan.origin !== domain.origin ||
|
|
10
|
+
plan.revision !== deployed.schema.revision ||
|
|
11
|
+
plan.revision !== domain.revision) {
|
|
12
|
+
fail('NATIVE_ROUTE_BINDING_INVALID', 'Route Plan, Publication, and Domain identity differ.');
|
|
13
|
+
}
|
|
14
|
+
if (json.serialize(place(plan, deployed.identity.issuer)) !==
|
|
15
|
+
json.serialize(deployed.routes)) {
|
|
16
|
+
fail('NATIVE_ROUTE_BINDING_INVALID', 'Publication routes differ from the placed Route Plan.');
|
|
17
|
+
}
|
|
18
|
+
const entries = plan.entries.map((entry, index) => {
|
|
19
|
+
const { path: _path, ...portable } = entry;
|
|
20
|
+
return Object.freeze({ ...portable, href: deployed.routes[index].href });
|
|
21
|
+
});
|
|
22
|
+
rejectReserved(deployed, entries);
|
|
23
|
+
return Object.freeze({
|
|
24
|
+
publication: reference(deployed),
|
|
25
|
+
entries: Object.freeze(entries),
|
|
26
|
+
});
|
|
27
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { fail } from './error.js';
|
|
2
|
+
import { templatesOverlap } from './template.js';
|
|
3
|
+
export function rejectCollisions(entries) {
|
|
4
|
+
const accepted = [];
|
|
5
|
+
for (const entry of entries) {
|
|
6
|
+
for (const previous of accepted) {
|
|
7
|
+
if (overlap(entry.method, previous.method) && templatesOverlap(entry.href, previous.href)) {
|
|
8
|
+
fail('NATIVE_ROUTE_COLLISION', `Route ${entry.name} collides with ${previous.name}.`);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
accepted.push(entry);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
function overlap(left, right) {
|
|
15
|
+
return left === '*' || right === '*' || left === right;
|
|
16
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Domain } from '@astrale-os/kernel-dsl/v1';
|
|
2
|
+
import type * as publication from '../publication/index.js';
|
|
3
|
+
import type { Plan } from './plan.js';
|
|
4
|
+
export interface CompileInput {
|
|
5
|
+
readonly routes: readonly publication.HttpRouteDeclaration[];
|
|
6
|
+
readonly domain: Domain;
|
|
7
|
+
}
|
|
8
|
+
export declare function compile(input: CompileInput): Plan;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { admitRouteDeclaration } from '../publication/route.js';
|
|
2
|
+
import { rejectCollisions } from './collision.js';
|
|
3
|
+
import { fail } from './error.js';
|
|
4
|
+
import { validateCredentialMapping, validateMapping, validateWireMapping } from './mapping.js';
|
|
5
|
+
import { placePath } from './placement.js';
|
|
6
|
+
import { validateTemplate } from './template.js';
|
|
7
|
+
export function compile(input) {
|
|
8
|
+
if (input === null || typeof input !== 'object' || !Array.isArray(input.routes)) {
|
|
9
|
+
throw new TypeError('Route compilation input is invalid.');
|
|
10
|
+
}
|
|
11
|
+
const authored = input.routes.map((entry) => admitRouteDeclaration(entry, input.domain.origin));
|
|
12
|
+
const entries = authored.map((declaration) => {
|
|
13
|
+
const meaning = input.domain.callable(declaration.callable);
|
|
14
|
+
if (meaning === undefined) {
|
|
15
|
+
fail('NATIVE_ROUTE_BINDING_INVALID', `Unknown callable ${declaration.callable}.`);
|
|
16
|
+
}
|
|
17
|
+
const href = placePath(declaration.path, 'https://routes.invalid');
|
|
18
|
+
const route = { ...declaration, href };
|
|
19
|
+
validateTemplate(href);
|
|
20
|
+
validateMapping(route, meaning.inputFields, isMethod(meaning) && !meaning.static);
|
|
21
|
+
validateWireMapping(route);
|
|
22
|
+
validateCredentialMapping(route);
|
|
23
|
+
if (route.method === 'GET' && route.body !== undefined) {
|
|
24
|
+
fail('NATIVE_ROUTE_DECLARATION_INVALID', `GET route ${route.name} cannot declare a body.`);
|
|
25
|
+
}
|
|
26
|
+
const target = !isMethod(meaning)
|
|
27
|
+
? { kind: 'function' }
|
|
28
|
+
: meaning.static
|
|
29
|
+
? { kind: 'method', dispatch: 'static' }
|
|
30
|
+
: { kind: 'method', dispatch: 'instance', receiver: route.receiver };
|
|
31
|
+
const { href: _href, receiver: _receiver, ...portable } = route;
|
|
32
|
+
return Object.freeze({
|
|
33
|
+
...portable,
|
|
34
|
+
target,
|
|
35
|
+
auth: meaning.auth,
|
|
36
|
+
output: meaning.output.mode,
|
|
37
|
+
path: declaration.path,
|
|
38
|
+
default: declaration.default === true,
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
rejectCollisions(entries.map((entry) => ({ ...entry, href: placePath(entry.path, 'https://routes.invalid') })));
|
|
42
|
+
return Object.freeze({
|
|
43
|
+
origin: input.domain.origin,
|
|
44
|
+
revision: input.domain.revision,
|
|
45
|
+
entries: Object.freeze(entries),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
function isMethod(meaning) {
|
|
49
|
+
return 'owner' in meaning;
|
|
50
|
+
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import type { HttpRoute, SingleCredentialSource } from '../publication/index.js';
|
|
2
|
-
import type {
|
|
3
|
-
export declare function credentialSources(route: HttpRoute): readonly SingleCredentialSource[];
|
|
4
|
-
export declare function firstCredentialIsAmbient(entry:
|
|
5
|
-
export declare function specificHeaderWires(entry:
|
|
6
|
-
export declare function putCredential(entry:
|
|
7
|
-
export declare function withoutCredentialHeaders(entry:
|
|
8
|
-
export declare function readCredential(entry:
|
|
9
|
-
//# sourceMappingURL=credential.d.ts.map
|
|
2
|
+
import type { Route } from './table.js';
|
|
3
|
+
export declare function credentialSources(route: Pick<HttpRoute, 'credential'>): readonly SingleCredentialSource[];
|
|
4
|
+
export declare function firstCredentialIsAmbient(entry: Route): boolean;
|
|
5
|
+
export declare function specificHeaderWires(entry: Route): ReadonlySet<string>;
|
|
6
|
+
export declare function putCredential(entry: Route, url: URL, headers: Record<string, string>, credential: string): void;
|
|
7
|
+
export declare function withoutCredentialHeaders(entry: Route, input: Readonly<Record<string, string>>): Record<string, string>;
|
|
8
|
+
export declare function readCredential(entry: Route, url: URL, headers: Record<string, string>): string | undefined;
|
|
@@ -4,19 +4,19 @@ export function credentialSources(route) {
|
|
|
4
4
|
return Array.isArray(source) ? source : [source];
|
|
5
5
|
}
|
|
6
6
|
export function firstCredentialIsAmbient(entry) {
|
|
7
|
-
return credentialSources(entry
|
|
7
|
+
return credentialSources(entry)[0].in === 'cookie';
|
|
8
8
|
}
|
|
9
9
|
export function specificHeaderWires(entry) {
|
|
10
|
-
return new Set(Object.values(entry.
|
|
10
|
+
return new Set(Object.values(entry.headers ?? {})
|
|
11
11
|
.filter((wire) => wire !== '*')
|
|
12
12
|
.map((wire) => wire.toLowerCase()));
|
|
13
13
|
}
|
|
14
14
|
export function putCredential(entry, url, headers, credential) {
|
|
15
|
-
if (entry.
|
|
15
|
+
if (entry.credential === undefined) {
|
|
16
16
|
headers.authorization = `Bearer ${credential}`;
|
|
17
17
|
return;
|
|
18
18
|
}
|
|
19
|
-
const source = credentialSources(entry
|
|
19
|
+
const source = credentialSources(entry)[0];
|
|
20
20
|
if (source.in === 'header') {
|
|
21
21
|
headers[(source.name ?? 'authorization').toLowerCase()] = credential;
|
|
22
22
|
}
|
|
@@ -36,7 +36,7 @@ export function withoutCredentialHeaders(entry, input) {
|
|
|
36
36
|
}
|
|
37
37
|
output[canonical] = value;
|
|
38
38
|
}
|
|
39
|
-
for (const source of credentialSources(entry
|
|
39
|
+
for (const source of credentialSources(entry)) {
|
|
40
40
|
if (source.in === 'header') {
|
|
41
41
|
delete output[(source.name ?? 'authorization').toLowerCase()];
|
|
42
42
|
continue;
|
|
@@ -53,7 +53,7 @@ export function withoutCredentialHeaders(entry, input) {
|
|
|
53
53
|
}
|
|
54
54
|
export function readCredential(entry, url, headers) {
|
|
55
55
|
const found = [];
|
|
56
|
-
if (entry.
|
|
56
|
+
if (entry.credential === undefined) {
|
|
57
57
|
const authorization = headers.authorization;
|
|
58
58
|
if (authorization === undefined)
|
|
59
59
|
return undefined;
|
|
@@ -62,7 +62,7 @@ export function readCredential(entry, url, headers) {
|
|
|
62
62
|
invalidRequest('Authorization must contain one Bearer credential.');
|
|
63
63
|
return matched[1];
|
|
64
64
|
}
|
|
65
|
-
for (const source of credentialSources(entry
|
|
65
|
+
for (const source of credentialSources(entry)) {
|
|
66
66
|
let value;
|
|
67
67
|
if (source.in === 'header') {
|
|
68
68
|
value = headers[(source.name ?? 'authorization').toLowerCase()];
|
|
@@ -116,4 +116,3 @@ function withoutCookie(header, name) {
|
|
|
116
116
|
.join('; ');
|
|
117
117
|
return value.length === 0 ? undefined : value;
|
|
118
118
|
}
|
|
119
|
-
//# sourceMappingURL=credential.js.map
|
package/dist/routes/decode.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
+
import type { Domain } from '@astrale-os/kernel-dsl/v1';
|
|
2
|
+
import type { PublicationRef } from '../publication/index.js';
|
|
1
3
|
import type { HttpRequest, Invocation } from './request.js';
|
|
2
|
-
import type {
|
|
3
|
-
export declare function decode(entry:
|
|
4
|
-
//# sourceMappingURL=decode.d.ts.map
|
|
4
|
+
import type { Route } from './table.js';
|
|
5
|
+
export declare function decode(entry: Route, request: HttpRequest, domain: Domain, served: PublicationRef): Invocation;
|
package/dist/routes/decode.js
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
import { NodePath, Path } from '@astrale-os/kernel-core/path';
|
|
2
|
-
import {
|
|
2
|
+
import { callableAddress } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
3
3
|
import * as portable from '@astrale-os/kernel-dsl/value';
|
|
4
4
|
import { readCredential, specificHeaderWires, withoutCredentialHeaders } from './credential.js';
|
|
5
5
|
import { fail, invalidRequest } from './error.js';
|
|
6
6
|
import { isReservedHeader } from './mapping.js';
|
|
7
7
|
import { methodMatches } from './match.js';
|
|
8
8
|
import { bodyText, normalizeHeaders, parseJsonObject } from './request.js';
|
|
9
|
-
import { requiresReceiver } from './route.js';
|
|
10
9
|
import { decodeRouting } from './routing.js';
|
|
11
|
-
import {
|
|
10
|
+
import { decodeScalar } from './scalar.js';
|
|
11
|
+
import { requiresReceiver } from './target.js';
|
|
12
12
|
import { matchTemplate, PLACEHOLDER } from './template.js';
|
|
13
|
-
export function decode(entry, request) {
|
|
13
|
+
export function decode(entry, request, domain, served) {
|
|
14
14
|
if (!methodMatches(entry, request.method))
|
|
15
15
|
invalidRequest('HTTP method does not match the route.');
|
|
16
|
-
const matched = matchTemplate(entry.
|
|
16
|
+
const matched = matchTemplate(entry.href, request.url);
|
|
17
17
|
if (matched === undefined)
|
|
18
18
|
invalidRequest('URL does not match the route template.');
|
|
19
19
|
const values = {};
|
|
20
20
|
for (const [name, value] of Object.entries(matched)) {
|
|
21
|
-
values[name] = decodeScalar(entry, name, value);
|
|
21
|
+
values[name] = decodeScalar(entry, name, value, domain);
|
|
22
22
|
}
|
|
23
|
-
if (entry.
|
|
24
|
-
values[entry.
|
|
23
|
+
if (entry.requestMethod !== undefined) {
|
|
24
|
+
values[entry.requestMethod] = decodeScalar(entry, entry.requestMethod, request.method.toUpperCase(), domain);
|
|
25
25
|
}
|
|
26
26
|
let url;
|
|
27
27
|
try {
|
|
@@ -35,32 +35,32 @@ export function decode(entry, request) {
|
|
|
35
35
|
}
|
|
36
36
|
const headers = normalizeHeaders(request.headers);
|
|
37
37
|
const credential = readCredential(entry, url, headers);
|
|
38
|
-
const routing = decodeRouting(request,
|
|
38
|
+
const routing = decodeRouting(request, served);
|
|
39
39
|
const applicationHeaders = withoutCredentialHeaders(entry, headers);
|
|
40
|
-
for (const [name, wire] of Object.entries(entry.
|
|
40
|
+
for (const [name, wire] of Object.entries(entry.query ?? {})) {
|
|
41
41
|
const found = url.searchParams.getAll(wire);
|
|
42
42
|
if (found.length !== 1)
|
|
43
43
|
invalidRequest(`Query parameter ${wire} must occur exactly once.`);
|
|
44
|
-
values[name] = decodeScalar(entry, name, found[0]);
|
|
44
|
+
values[name] = decodeScalar(entry, name, found[0], domain);
|
|
45
45
|
}
|
|
46
|
-
for (const [name, pick] of Object.entries(entry.
|
|
46
|
+
for (const [name, pick] of Object.entries(entry.headers ?? {})) {
|
|
47
47
|
if (pick === '*') {
|
|
48
48
|
const explicit = specificHeaderWires(entry);
|
|
49
49
|
values[name] = Object.fromEntries(Object.entries(applicationHeaders).filter(([header]) => !explicit.has(header) &&
|
|
50
50
|
header !== 'accept' &&
|
|
51
51
|
!isReservedHeader(header) &&
|
|
52
|
-
(entry.
|
|
52
|
+
(entry.body === undefined || header !== 'content-type')));
|
|
53
53
|
}
|
|
54
54
|
else {
|
|
55
55
|
const value = headers[pick.toLowerCase()];
|
|
56
56
|
if (value === undefined)
|
|
57
57
|
invalidRequest(`Missing header ${pick}.`);
|
|
58
|
-
values[name] = decodeScalar(entry, name, value);
|
|
58
|
+
values[name] = decodeScalar(entry, name, value, domain);
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
-
if (entry.
|
|
61
|
+
if (entry.body === '*') {
|
|
62
62
|
const body = parseJsonObject(request.body);
|
|
63
|
-
const allowed = remainderFields(entry);
|
|
63
|
+
const allowed = remainderFields(entry, domain);
|
|
64
64
|
for (const name of Object.keys(body)) {
|
|
65
65
|
if (!allowed.has(name)) {
|
|
66
66
|
invalidRequest(`JSON body field ${name} is not owned by the route remainder mapping.`);
|
|
@@ -68,10 +68,10 @@ export function decode(entry, request) {
|
|
|
68
68
|
}
|
|
69
69
|
Object.assign(values, body);
|
|
70
70
|
}
|
|
71
|
-
else if (entry.
|
|
72
|
-
const needsText = Object.values(entry.
|
|
71
|
+
else if (entry.body !== undefined) {
|
|
72
|
+
const needsText = Object.values(entry.body).some((pick) => typeof pick !== 'string');
|
|
73
73
|
const body = needsText ? bodyText(request.body) : parseJsonObject(request.body);
|
|
74
|
-
for (const [name, pick] of Object.entries(entry.
|
|
74
|
+
for (const [name, pick] of Object.entries(entry.body)) {
|
|
75
75
|
if (typeof pick !== 'string') {
|
|
76
76
|
values[name] = body;
|
|
77
77
|
}
|
|
@@ -85,7 +85,10 @@ export function decode(entry, request) {
|
|
|
85
85
|
}
|
|
86
86
|
let receiver;
|
|
87
87
|
if (requiresReceiver(entry)) {
|
|
88
|
-
const
|
|
88
|
+
const receiverName = entry.target.kind === 'method' && entry.target.dispatch === 'instance'
|
|
89
|
+
? entry.target.receiver
|
|
90
|
+
: undefined;
|
|
91
|
+
const encodedReceiver = receiverName === undefined ? undefined : values[receiverName];
|
|
89
92
|
if (typeof encodedReceiver !== 'string')
|
|
90
93
|
invalidRequest('Instance route receiver is missing.');
|
|
91
94
|
try {
|
|
@@ -97,7 +100,7 @@ export function decode(entry, request) {
|
|
|
97
100
|
}
|
|
98
101
|
throw cause;
|
|
99
102
|
}
|
|
100
|
-
delete values[
|
|
103
|
+
delete values[receiverName];
|
|
101
104
|
}
|
|
102
105
|
let input;
|
|
103
106
|
try {
|
|
@@ -109,19 +112,15 @@ export function decode(entry, request) {
|
|
|
109
112
|
}
|
|
110
113
|
throw cause;
|
|
111
114
|
}
|
|
112
|
-
const
|
|
113
|
-
const target =
|
|
115
|
+
const coordinate = callableAddress(entry.callable);
|
|
116
|
+
const target = coordinate.kind === 'method'
|
|
114
117
|
? receiver === undefined
|
|
115
|
-
? Path.staticMethod(Path.project(
|
|
116
|
-
|
|
117
|
-
kind: Ref.namespace(ref),
|
|
118
|
-
name: Ref.member(ref),
|
|
119
|
-
}), Ref.child(ref)).raw
|
|
120
|
-
: Path.instanceMethod(Path.from(receiver), Ref.child(ref)).raw
|
|
118
|
+
? Path.staticMethod(Path.project(coordinate.owner), coordinate.name).raw
|
|
119
|
+
: Path.instanceMethod(Path.from(receiver), coordinate.name).raw
|
|
121
120
|
: Path.project({
|
|
122
|
-
origin:
|
|
121
|
+
origin: coordinate.origin,
|
|
123
122
|
kind: 'function',
|
|
124
|
-
name:
|
|
123
|
+
name: coordinate.name,
|
|
125
124
|
}).raw;
|
|
126
125
|
return Object.freeze({
|
|
127
126
|
call: Object.freeze({ target, input }),
|
|
@@ -129,19 +128,20 @@ export function decode(entry, request) {
|
|
|
129
128
|
...(routing === undefined ? {} : { routing }),
|
|
130
129
|
});
|
|
131
130
|
}
|
|
132
|
-
function remainderFields(entry) {
|
|
131
|
+
function remainderFields(entry, domain) {
|
|
133
132
|
const claimed = new Set([
|
|
134
|
-
...[...entry.
|
|
135
|
-
...(entry.
|
|
136
|
-
...Object.keys(entry.
|
|
137
|
-
...Object.keys(entry.
|
|
133
|
+
...[...entry.href.matchAll(PLACEHOLDER)].map((item) => item[1]),
|
|
134
|
+
...(entry.requestMethod === undefined ? [] : [entry.requestMethod]),
|
|
135
|
+
...Object.keys(entry.query ?? {}),
|
|
136
|
+
...Object.keys(entry.headers ?? {}),
|
|
138
137
|
]);
|
|
139
|
-
const
|
|
140
|
-
const
|
|
141
|
-
const
|
|
142
|
-
|
|
143
|
-
|
|
138
|
+
const fields = domain.callable(entry.callable)?.inputFields ?? [];
|
|
139
|
+
const allowed = new Set(fields.filter((name) => !claimed.has(name)));
|
|
140
|
+
const receiver = entry.target.kind === 'method' && entry.target.dispatch === 'instance'
|
|
141
|
+
? entry.target.receiver
|
|
142
|
+
: undefined;
|
|
143
|
+
if (receiver !== undefined && !claimed.has(receiver)) {
|
|
144
|
+
allowed.add(receiver);
|
|
144
145
|
}
|
|
145
146
|
return allowed;
|
|
146
147
|
}
|
|
147
|
-
//# sourceMappingURL=decode.js.map
|
package/dist/routes/encode.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
+
import type { Domain } from '@astrale-os/kernel-dsl/v1';
|
|
1
2
|
import type { Invocation, Request } from './request.js';
|
|
2
|
-
import type {
|
|
3
|
-
export declare function encode(entry:
|
|
4
|
-
//# sourceMappingURL=encode.d.ts.map
|
|
3
|
+
import type { Route } from './table.js';
|
|
4
|
+
export declare function encode(entry: Route, invocation: Invocation, domain: Domain): Request;
|
package/dist/routes/encode.js
CHANGED
|
@@ -1,50 +1,49 @@
|
|
|
1
1
|
import { Path } from '@astrale-os/kernel-core/path';
|
|
2
|
-
import {
|
|
2
|
+
import { callableAddress } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
3
3
|
import * as portable from '@astrale-os/kernel-dsl/value';
|
|
4
4
|
import { firstCredentialIsAmbient, putCredential, specificHeaderWires, withoutCredentialHeaders, } from './credential.js';
|
|
5
5
|
import { fail, invalidRequest } from './error.js';
|
|
6
6
|
import { isReservedHeader } from './mapping.js';
|
|
7
|
-
import { requiresReceiver } from './route.js';
|
|
8
7
|
import { encodeStrongEtag, HTTP_ROUTE_ISSUER, HTTP_ROUTE_PUBLICATION } from './routing.js';
|
|
9
8
|
import { asObject, encodeScalar, scalar } from './scalar.js';
|
|
9
|
+
import { requiresReceiver } from './target.js';
|
|
10
10
|
import { authorityEnd, encodeTemplate, PLACEHOLDER } from './template.js';
|
|
11
|
-
export function encode(entry, invocation) {
|
|
11
|
+
export function encode(entry, invocation, domain) {
|
|
12
12
|
const input = asObject(invocation.call.input);
|
|
13
13
|
const target = Path.from(invocation.call.target);
|
|
14
14
|
const needsReceiver = requiresReceiver(entry);
|
|
15
|
-
const
|
|
16
|
-
const methodName =
|
|
15
|
+
const coordinate = callableAddress(entry.callable);
|
|
16
|
+
const methodName = coordinate.kind === 'method' ? coordinate.name : undefined;
|
|
17
17
|
const receiver = needsReceiver ? instanceSource(target, methodName) : undefined;
|
|
18
18
|
const source = receiver?.raw;
|
|
19
19
|
const expected = needsReceiver
|
|
20
20
|
? Path.instanceMethod(receiver, methodName).raw
|
|
21
|
-
:
|
|
22
|
-
? Path.staticMethod(Path.project(
|
|
23
|
-
origin: Key.origin(entry.callable),
|
|
24
|
-
kind: Ref.namespace(ref),
|
|
25
|
-
name: Ref.member(ref),
|
|
26
|
-
}), methodName).raw
|
|
21
|
+
: coordinate.kind === 'method'
|
|
22
|
+
? Path.staticMethod(Path.project(coordinate.owner), methodName).raw
|
|
27
23
|
: Path.project({
|
|
28
|
-
origin:
|
|
24
|
+
origin: coordinate.origin,
|
|
29
25
|
kind: 'function',
|
|
30
|
-
name:
|
|
26
|
+
name: coordinate.name,
|
|
31
27
|
}).raw;
|
|
32
28
|
if (target.raw !== expected)
|
|
33
29
|
invalidRequest('Invocation Path does not match the selected route.');
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
30
|
+
const receiverName = entry.target.kind === 'method' && entry.target.dispatch === 'instance'
|
|
31
|
+
? entry.target.receiver
|
|
32
|
+
: undefined;
|
|
33
|
+
const field = (name) => (name === receiverName ? source : input[name]);
|
|
34
|
+
const wireField = (name) => encodeScalar(entry, name, field(name), domain);
|
|
35
|
+
const hostEnd = authorityEnd(entry.href);
|
|
36
|
+
let url = entry.href.replaceAll(PLACEHOLDER, (_whole, name, catchall, offset) => encodeTemplate(wireField(name), catchall, offset < hostEnd));
|
|
38
37
|
const parsed = new URL(url);
|
|
39
|
-
for (const [name, wire] of Object.entries(entry.
|
|
38
|
+
for (const [name, wire] of Object.entries(entry.query ?? {})) {
|
|
40
39
|
parsed.searchParams.append(wire, wireField(name));
|
|
41
40
|
}
|
|
42
41
|
let headers = {};
|
|
43
|
-
for (const [name, pick] of Object.entries(entry.
|
|
42
|
+
for (const [name, pick] of Object.entries(entry.headers ?? {})) {
|
|
44
43
|
if (pick !== '*')
|
|
45
44
|
headers[pick] = wireField(name);
|
|
46
45
|
}
|
|
47
|
-
const headerRemainder = Object.entries(entry.
|
|
46
|
+
const headerRemainder = Object.entries(entry.headers ?? {}).find(([, pick]) => pick === '*');
|
|
48
47
|
if (headerRemainder !== undefined) {
|
|
49
48
|
const explicit = specificHeaderWires(entry);
|
|
50
49
|
for (const [header, headerValue] of Object.entries(asObject(field(headerRemainder[0])))) {
|
|
@@ -56,27 +55,27 @@ export function encode(entry, invocation) {
|
|
|
56
55
|
}
|
|
57
56
|
}
|
|
58
57
|
let body;
|
|
59
|
-
if (entry.
|
|
58
|
+
if (entry.body === '*') {
|
|
60
59
|
const claimed = new Set([
|
|
61
|
-
...[...entry.
|
|
62
|
-
...(entry.
|
|
63
|
-
...Object.keys(entry.
|
|
64
|
-
...Object.keys(entry.
|
|
60
|
+
...[...entry.href.matchAll(PLACEHOLDER)].map((item) => item[1]),
|
|
61
|
+
...(entry.requestMethod === undefined ? [] : [entry.requestMethod]),
|
|
62
|
+
...Object.keys(entry.query ?? {}),
|
|
63
|
+
...Object.keys(entry.headers ?? {}),
|
|
65
64
|
]);
|
|
66
65
|
const output = {};
|
|
67
66
|
for (const [name, value] of Object.entries(input)) {
|
|
68
67
|
if (!claimed.has(name))
|
|
69
68
|
output[name] = value;
|
|
70
69
|
}
|
|
71
|
-
if (
|
|
72
|
-
output[
|
|
70
|
+
if (receiverName !== undefined && !claimed.has(receiverName)) {
|
|
71
|
+
output[receiverName] = source;
|
|
73
72
|
}
|
|
74
73
|
body = portable.json.serialize(output);
|
|
75
74
|
headers['content-type'] = 'application/json';
|
|
76
75
|
}
|
|
77
|
-
else if (entry.
|
|
76
|
+
else if (entry.body !== undefined) {
|
|
78
77
|
const output = {};
|
|
79
|
-
for (const [name, pick] of Object.entries(entry.
|
|
78
|
+
for (const [name, pick] of Object.entries(entry.body)) {
|
|
80
79
|
if (typeof pick !== 'string')
|
|
81
80
|
body = scalar(field(name));
|
|
82
81
|
else
|
|
@@ -108,16 +107,16 @@ export function encode(entry, invocation) {
|
|
|
108
107
|
headers[HTTP_ROUTE_ISSUER] = invocation.routing.issuer;
|
|
109
108
|
}
|
|
110
109
|
url = parsed.toString();
|
|
111
|
-
const mappedMethod = entry.
|
|
110
|
+
const mappedMethod = entry.requestMethod === undefined
|
|
112
111
|
? undefined
|
|
113
|
-
: encodeScalar(entry, entry.
|
|
112
|
+
: encodeScalar(entry, entry.requestMethod, input[entry.requestMethod], domain).toUpperCase();
|
|
114
113
|
const requestedMethod = invocation.method?.toUpperCase();
|
|
115
114
|
if (mappedMethod !== undefined &&
|
|
116
115
|
requestedMethod !== undefined &&
|
|
117
116
|
mappedMethod !== requestedMethod) {
|
|
118
117
|
invalidRequest('Native route request method differs from its mapped input field.');
|
|
119
118
|
}
|
|
120
|
-
const methodCandidate = entry.
|
|
119
|
+
const methodCandidate = entry.method === '*' ? (requestedMethod ?? mappedMethod) : entry.method;
|
|
121
120
|
if (methodCandidate === undefined) {
|
|
122
121
|
fail('NATIVE_ROUTE_REQUEST_INVALID', 'Wildcard route invocation requires an HTTP method.');
|
|
123
122
|
}
|
|
@@ -144,4 +143,3 @@ function instanceSource(target, name) {
|
|
|
144
143
|
}
|
|
145
144
|
return Path.fromAST({ anchor: target.ast.anchor, steps: steps.slice(0, -1) });
|
|
146
145
|
}
|
|
147
|
-
//# sourceMappingURL=encode.js.map
|
package/dist/routes/error.d.ts
CHANGED