@astrale-os/kernel-client 0.6.0-beta.6 → 0.6.0-beta.60
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/dist/auth/auth.d.ts +7 -6
- package/dist/auth/auth.js +2 -3
- package/dist/auth/authorization.d.ts +2 -3
- package/dist/auth/authorization.js +0 -1
- package/dist/auth/credential.d.ts +5 -1
- package/dist/auth/credential.js +6 -3
- package/dist/auth/identity.d.ts +6 -9
- package/dist/auth/identity.js +0 -1
- package/dist/auth/index.d.ts +3 -4
- package/dist/auth/index.js +2 -3
- package/dist/auth/register.d.ts +24 -0
- package/dist/auth/register.js +10 -0
- package/dist/client/admission.d.ts +4 -2
- package/dist/client/admission.js +8 -2
- package/dist/client/client.d.ts +0 -1
- package/dist/client/client.js +0 -1
- package/dist/client/credential.d.ts +0 -1
- package/dist/client/credential.js +0 -1
- package/dist/client/index.d.ts +0 -1
- package/dist/client/index.js +0 -1
- package/dist/client/request.d.ts +3 -3
- package/dist/client/request.js +3 -1
- package/dist/client/result.d.ts +3 -4
- package/dist/client/result.js +3 -1
- package/dist/client/routing-control.d.ts +0 -1
- package/dist/client/routing-control.js +0 -1
- package/dist/errors/client-error.d.ts +0 -1
- package/dist/errors/client-error.js +2 -1
- package/dist/errors/index.d.ts +7 -7
- package/dist/errors/index.js +7 -7
- package/dist/errors/miss-error.d.ts +0 -1
- package/dist/errors/miss-error.js +0 -1
- package/dist/errors/protocol-error.d.ts +0 -1
- package/dist/errors/protocol-error.js +0 -1
- package/dist/errors/response-error.d.ts +0 -1
- package/dist/errors/response-error.js +0 -1
- package/dist/errors/session-error.d.ts +9 -0
- package/dist/errors/session-error.js +9 -0
- package/dist/errors/stale-route-error.d.ts +0 -1
- package/dist/errors/stale-route-error.js +0 -1
- package/dist/errors/transport-error.d.ts +18 -6
- package/dist/errors/transport-error.js +11 -7
- package/dist/graph/domain/binding.d.ts +22 -0
- package/dist/graph/domain/binding.js +123 -0
- package/dist/graph/domain/domain.typecheck.d.ts +1 -0
- package/dist/graph/domain/domain.typecheck.js +147 -0
- package/dist/graph/domain/index.d.ts +3 -0
- package/dist/graph/domain/index.js +1 -0
- package/dist/graph/domain/model.d.ts +18 -0
- package/dist/graph/domain/model.js +1 -0
- package/dist/graph/domain/page.d.ts +23 -0
- package/dist/graph/domain/page.js +42 -0
- package/dist/graph/domain/project.d.ts +8 -0
- package/dist/graph/domain/project.js +124 -0
- package/dist/graph/domain/provenance.d.ts +6 -0
- package/dist/graph/domain/provenance.js +11 -0
- package/dist/graph/errors.d.ts +2 -3
- package/dist/graph/errors.js +1 -2
- package/dist/graph/expectation.d.ts +3 -0
- package/dist/graph/expectation.js +6 -0
- package/dist/graph/graph.d.ts +12 -8
- package/dist/graph/graph.js +0 -1
- package/dist/graph/index.d.ts +2 -2
- package/dist/graph/index.js +1 -1
- package/dist/graph/mutation.d.ts +2 -4
- package/dist/graph/mutation.js +10 -2
- package/dist/graph/page/index.d.ts +0 -1
- package/dist/graph/page/index.js +0 -1
- package/dist/graph/page/neighbors.d.ts +4 -5
- package/dist/graph/page/neighbors.js +7 -7
- package/dist/graph/page/page.d.ts +5 -2
- package/dist/graph/page/page.js +0 -1
- package/dist/graph/page-contract.d.ts +1 -2
- package/dist/graph/page-contract.js +0 -1
- package/dist/graph/provenance.d.ts +14 -0
- package/dist/graph/provenance.js +42 -0
- package/dist/graph/query.d.ts +3 -1
- package/dist/graph/query.js +33 -13
- package/dist/graph/read.d.ts +3 -4
- package/dist/graph/read.js +6 -5
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/pacer/batcher/batcher.d.ts +0 -1
- package/dist/pacer/batcher/batcher.js +0 -1
- package/dist/pacer/batcher/defaults.d.ts +0 -1
- package/dist/pacer/batcher/defaults.js +0 -1
- package/dist/pacer/batcher/index.d.ts +0 -1
- package/dist/pacer/batcher/index.js +0 -1
- package/dist/pacer/index.d.ts +0 -1
- package/dist/pacer/index.js +0 -1
- package/dist/pacer/limiter/defaults.d.ts +0 -1
- package/dist/pacer/limiter/defaults.js +0 -1
- package/dist/pacer/limiter/index.d.ts +0 -1
- package/dist/pacer/limiter/index.js +0 -1
- package/dist/pacer/limiter/limiter.d.ts +0 -1
- package/dist/pacer/limiter/limiter.js +0 -1
- package/dist/pacer/queue/defaults.d.ts +0 -1
- package/dist/pacer/queue/defaults.js +0 -1
- package/dist/pacer/queue/index.d.ts +0 -1
- package/dist/pacer/queue/index.js +0 -1
- package/dist/pacer/queue/queue.d.ts +0 -1
- package/dist/pacer/queue/queue.js +0 -1
- package/dist/pacer/retry/defaults.d.ts +0 -1
- package/dist/pacer/retry/defaults.js +0 -1
- package/dist/pacer/retry/index.d.ts +0 -1
- package/dist/pacer/retry/index.js +0 -1
- package/dist/pacer/retry/retry.d.ts +0 -1
- package/dist/pacer/retry/retry.js +0 -1
- package/dist/pool/index.d.ts +0 -1
- package/dist/pool/index.js +0 -1
- package/dist/pool/pool.d.ts +0 -1
- package/dist/pool/pool.js +0 -1
- package/dist/pool/target.d.ts +0 -1
- package/dist/pool/target.js +0 -1
- package/dist/schema/admission.d.ts +1 -2
- package/dist/schema/admission.js +0 -1
- package/dist/schema/contracts.d.ts +6 -16
- package/dist/schema/contracts.js +0 -1
- package/dist/schema/index.d.ts +2 -3
- package/dist/schema/index.js +1 -2
- package/dist/schema/introspection.d.ts +1 -2
- package/dist/schema/introspection.js +5 -2
- package/dist/schema/operation.d.ts +0 -1
- package/dist/schema/operation.js +2 -3
- package/dist/schema/schema.d.ts +11 -10
- package/dist/schema/schema.js +80 -11
- package/dist/session/bound.d.ts +45 -0
- package/dist/session/bound.js +89 -0
- package/dist/session/context/control.d.ts +0 -1
- package/dist/session/context/control.js +0 -1
- package/dist/session/context/index.d.ts +0 -1
- package/dist/session/context/index.js +0 -1
- package/dist/session/context/limits.d.ts +0 -1
- package/dist/session/context/limits.js +0 -1
- package/dist/session/context/operation.d.ts +0 -1
- package/dist/session/context/operation.js +19 -17
- package/dist/session/context/policy.d.ts +0 -1
- package/dist/session/context/policy.js +0 -1
- package/dist/session/discovery/bundle.d.ts +5 -2
- package/dist/session/discovery/bundle.js +33 -15
- package/dist/session/discovery/discovery.d.ts +4 -2
- package/dist/session/discovery/discovery.js +34 -6
- package/dist/session/discovery/index.d.ts +2 -1
- package/dist/session/discovery/index.js +0 -1
- package/dist/session/discovery/publication.d.ts +0 -1
- package/dist/session/discovery/publication.js +4 -4
- package/dist/session/discovery/snapshot.d.ts +0 -1
- package/dist/session/discovery/snapshot.js +0 -1
- package/dist/session/discovery/transport.d.ts +6 -0
- package/dist/session/discovery/transport.js +13 -0
- package/dist/session/index.d.ts +4 -3
- package/dist/session/index.js +2 -1
- package/dist/session/reference.d.ts +18 -10
- package/dist/session/reference.js +31 -9
- package/dist/session/routing/auth.d.ts +0 -1
- package/dist/session/routing/auth.js +0 -1
- package/dist/session/routing/cache.d.ts +27 -8
- package/dist/session/routing/cache.js +218 -25
- package/dist/session/routing/dispatch.d.ts +3 -7
- package/dist/session/routing/dispatch.js +36 -26
- package/dist/session/routing/envelope.d.ts +2 -1
- package/dist/session/routing/envelope.js +14 -10
- package/dist/session/routing/index.d.ts +1 -3
- package/dist/session/routing/index.js +1 -2
- package/dist/session/routing/request.d.ts +0 -1
- package/dist/session/routing/request.js +0 -1
- package/dist/session/session.d.ts +16 -7
- package/dist/session/session.js +49 -30
- package/dist/session/session.typecheck.d.ts +0 -1
- package/dist/session/session.typecheck.js +87 -3
- package/dist/session/views/catalog.d.ts +0 -1
- package/dist/session/views/catalog.js +13 -5
- package/dist/session/views/index.d.ts +0 -1
- package/dist/session/views/index.js +0 -1
- package/dist/session/views/resolve.d.ts +0 -1
- package/dist/session/views/resolve.js +0 -1
- package/dist/store/entity-index.d.ts +0 -1
- package/dist/store/entity-index.js +0 -1
- package/dist/store/index.d.ts +0 -1
- package/dist/store/index.js +0 -1
- package/dist/store/memory.d.ts +2 -2
- package/dist/store/memory.js +38 -15
- package/dist/store/mutation.d.ts +1 -2
- package/dist/store/mutation.js +6 -4
- package/dist/store/observe.d.ts +0 -1
- package/dist/store/observe.js +0 -1
- package/dist/store/optimistic.d.ts +0 -1
- package/dist/store/optimistic.js +0 -1
- package/dist/store/query-key.d.ts +2 -2
- package/dist/store/query-key.js +7 -3
- package/dist/store/shape.d.ts +4 -2
- package/dist/store/shape.js +4 -2
- package/dist/store/store.d.ts +2 -4
- package/dist/store/store.js +6 -5
- package/dist/store/store.typecheck.d.ts +0 -1
- package/dist/store/store.typecheck.js +3 -9
- package/dist/transport/auto/decision.d.ts +0 -1
- package/dist/transport/auto/decision.js +0 -1
- package/dist/transport/auto/fallback.d.ts +2 -2
- package/dist/transport/auto/fallback.js +10 -11
- package/dist/transport/auto/index.d.ts +0 -1
- package/dist/transport/auto/index.js +0 -1
- package/dist/transport/auto/transport.d.ts +0 -1
- package/dist/transport/auto/transport.js +5 -6
- package/dist/transport/auto/warning.d.ts +0 -1
- package/dist/transport/auto/warning.js +5 -3
- package/dist/transport/deadline.d.ts +0 -1
- package/dist/transport/deadline.js +0 -1
- package/dist/transport/failure.d.ts +7 -0
- package/dist/transport/failure.js +9 -0
- package/dist/transport/http/byte-stream.d.ts +17 -0
- package/dist/transport/http/byte-stream.js +86 -0
- package/dist/transport/http/index.d.ts +0 -1
- package/dist/transport/http/index.js +0 -1
- package/dist/transport/http/response.d.ts +0 -1
- package/dist/transport/http/response.js +0 -1
- package/dist/transport/http/stream.d.ts +0 -1
- package/dist/transport/http/stream.js +7 -7
- package/dist/transport/http/transport.d.ts +0 -1
- package/dist/transport/http/transport.js +43 -20
- package/dist/transport/index.d.ts +0 -1
- package/dist/transport/index.js +0 -1
- package/dist/transport/transport.d.ts +0 -1
- package/dist/transport/transport.js +0 -1
- package/dist/transport/websocket/connection.d.ts +0 -1
- package/dist/transport/websocket/connection.js +16 -26
- package/dist/transport/websocket/exchange.d.ts +0 -1
- package/dist/transport/websocket/exchange.js +5 -9
- package/dist/transport/websocket/index.d.ts +0 -1
- package/dist/transport/websocket/index.js +0 -1
- package/dist/transport/websocket/transport.d.ts +0 -1
- package/dist/transport/websocket/transport.js +7 -20
- package/package.json +12 -14
- package/dist/auth/auth.d.ts.map +0 -1
- package/dist/auth/auth.js.map +0 -1
- package/dist/auth/authorization.d.ts.map +0 -1
- package/dist/auth/authorization.js.map +0 -1
- package/dist/auth/credential.d.ts.map +0 -1
- package/dist/auth/credential.js.map +0 -1
- package/dist/auth/identity.d.ts.map +0 -1
- package/dist/auth/identity.js.map +0 -1
- package/dist/auth/index.d.ts.map +0 -1
- package/dist/auth/index.js.map +0 -1
- package/dist/auth/provision.d.ts +0 -9
- package/dist/auth/provision.d.ts.map +0 -1
- package/dist/auth/provision.js +0 -11
- package/dist/auth/provision.js.map +0 -1
- package/dist/client/admission.d.ts.map +0 -1
- package/dist/client/admission.js.map +0 -1
- package/dist/client/client.d.ts.map +0 -1
- package/dist/client/client.js.map +0 -1
- package/dist/client/credential.d.ts.map +0 -1
- package/dist/client/credential.js.map +0 -1
- package/dist/client/index.d.ts.map +0 -1
- package/dist/client/index.js.map +0 -1
- package/dist/client/request.d.ts.map +0 -1
- package/dist/client/request.js.map +0 -1
- package/dist/client/result.d.ts.map +0 -1
- package/dist/client/result.js.map +0 -1
- package/dist/client/routing-control.d.ts.map +0 -1
- package/dist/client/routing-control.js.map +0 -1
- package/dist/errors/client-error.d.ts.map +0 -1
- package/dist/errors/client-error.js.map +0 -1
- package/dist/errors/index.d.ts.map +0 -1
- package/dist/errors/index.js.map +0 -1
- package/dist/errors/miss-error.d.ts.map +0 -1
- package/dist/errors/miss-error.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/response-error.d.ts.map +0 -1
- package/dist/errors/response-error.js.map +0 -1
- package/dist/errors/stale-route-error.d.ts.map +0 -1
- package/dist/errors/stale-route-error.js.map +0 -1
- package/dist/errors/transport-error.d.ts.map +0 -1
- package/dist/errors/transport-error.js.map +0 -1
- package/dist/graph/errors.d.ts.map +0 -1
- package/dist/graph/errors.js.map +0 -1
- package/dist/graph/graph.d.ts.map +0 -1
- package/dist/graph/graph.js.map +0 -1
- package/dist/graph/index.d.ts.map +0 -1
- package/dist/graph/index.js.map +0 -1
- package/dist/graph/mutation.d.ts.map +0 -1
- package/dist/graph/mutation.js.map +0 -1
- package/dist/graph/page/index.d.ts.map +0 -1
- package/dist/graph/page/index.js.map +0 -1
- package/dist/graph/page/neighbors.d.ts.map +0 -1
- package/dist/graph/page/neighbors.js.map +0 -1
- package/dist/graph/page/page.d.ts.map +0 -1
- package/dist/graph/page/page.js.map +0 -1
- package/dist/graph/page-contract.d.ts.map +0 -1
- package/dist/graph/page-contract.js.map +0 -1
- package/dist/graph/query.d.ts.map +0 -1
- package/dist/graph/query.js.map +0 -1
- package/dist/graph/read.d.ts.map +0 -1
- package/dist/graph/read.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/pacer/batcher/batcher.d.ts.map +0 -1
- package/dist/pacer/batcher/batcher.js.map +0 -1
- package/dist/pacer/batcher/defaults.d.ts.map +0 -1
- package/dist/pacer/batcher/defaults.js.map +0 -1
- package/dist/pacer/batcher/index.d.ts.map +0 -1
- package/dist/pacer/batcher/index.js.map +0 -1
- package/dist/pacer/index.d.ts.map +0 -1
- package/dist/pacer/index.js.map +0 -1
- package/dist/pacer/limiter/defaults.d.ts.map +0 -1
- package/dist/pacer/limiter/defaults.js.map +0 -1
- package/dist/pacer/limiter/index.d.ts.map +0 -1
- package/dist/pacer/limiter/index.js.map +0 -1
- package/dist/pacer/limiter/limiter.d.ts.map +0 -1
- package/dist/pacer/limiter/limiter.js.map +0 -1
- package/dist/pacer/queue/defaults.d.ts.map +0 -1
- package/dist/pacer/queue/defaults.js.map +0 -1
- package/dist/pacer/queue/index.d.ts.map +0 -1
- package/dist/pacer/queue/index.js.map +0 -1
- package/dist/pacer/queue/queue.d.ts.map +0 -1
- package/dist/pacer/queue/queue.js.map +0 -1
- package/dist/pacer/retry/defaults.d.ts.map +0 -1
- package/dist/pacer/retry/defaults.js.map +0 -1
- package/dist/pacer/retry/index.d.ts.map +0 -1
- package/dist/pacer/retry/index.js.map +0 -1
- package/dist/pacer/retry/retry.d.ts.map +0 -1
- package/dist/pacer/retry/retry.js.map +0 -1
- package/dist/pool/index.d.ts.map +0 -1
- package/dist/pool/index.js.map +0 -1
- package/dist/pool/pool.d.ts.map +0 -1
- package/dist/pool/pool.js.map +0 -1
- package/dist/pool/target.d.ts.map +0 -1
- package/dist/pool/target.js.map +0 -1
- package/dist/schema/admission.d.ts.map +0 -1
- package/dist/schema/admission.js.map +0 -1
- package/dist/schema/contracts.d.ts.map +0 -1
- package/dist/schema/contracts.js.map +0 -1
- package/dist/schema/index.d.ts.map +0 -1
- package/dist/schema/index.js.map +0 -1
- package/dist/schema/introspection.d.ts.map +0 -1
- package/dist/schema/introspection.js.map +0 -1
- package/dist/schema/operation.d.ts.map +0 -1
- package/dist/schema/operation.js.map +0 -1
- package/dist/schema/schema.d.ts.map +0 -1
- package/dist/schema/schema.js.map +0 -1
- package/dist/session/context/control.d.ts.map +0 -1
- package/dist/session/context/control.js.map +0 -1
- package/dist/session/context/index.d.ts.map +0 -1
- package/dist/session/context/index.js.map +0 -1
- package/dist/session/context/limits.d.ts.map +0 -1
- package/dist/session/context/limits.js.map +0 -1
- package/dist/session/context/operation.d.ts.map +0 -1
- package/dist/session/context/operation.js.map +0 -1
- package/dist/session/context/policy.d.ts.map +0 -1
- package/dist/session/context/policy.js.map +0 -1
- package/dist/session/discovery/bundle.d.ts.map +0 -1
- package/dist/session/discovery/bundle.js.map +0 -1
- package/dist/session/discovery/discovery.d.ts.map +0 -1
- package/dist/session/discovery/discovery.js.map +0 -1
- package/dist/session/discovery/index.d.ts.map +0 -1
- package/dist/session/discovery/index.js.map +0 -1
- package/dist/session/discovery/publication.d.ts.map +0 -1
- package/dist/session/discovery/publication.js.map +0 -1
- package/dist/session/discovery/snapshot.d.ts.map +0 -1
- package/dist/session/discovery/snapshot.js.map +0 -1
- package/dist/session/index.d.ts.map +0 -1
- package/dist/session/index.js.map +0 -1
- package/dist/session/reference.d.ts.map +0 -1
- package/dist/session/reference.js.map +0 -1
- package/dist/session/routing/auth.d.ts.map +0 -1
- package/dist/session/routing/auth.js.map +0 -1
- package/dist/session/routing/cache.d.ts.map +0 -1
- package/dist/session/routing/cache.js.map +0 -1
- package/dist/session/routing/dispatch.d.ts.map +0 -1
- package/dist/session/routing/dispatch.js.map +0 -1
- package/dist/session/routing/envelope.d.ts.map +0 -1
- package/dist/session/routing/envelope.js.map +0 -1
- package/dist/session/routing/expectation.d.ts +0 -7
- package/dist/session/routing/expectation.d.ts.map +0 -1
- package/dist/session/routing/expectation.js +0 -2
- package/dist/session/routing/expectation.js.map +0 -1
- package/dist/session/routing/index.d.ts.map +0 -1
- package/dist/session/routing/index.js.map +0 -1
- package/dist/session/routing/request.d.ts.map +0 -1
- package/dist/session/routing/request.js.map +0 -1
- package/dist/session/session.d.ts.map +0 -1
- package/dist/session/session.js.map +0 -1
- package/dist/session/session.typecheck.d.ts.map +0 -1
- package/dist/session/session.typecheck.js.map +0 -1
- package/dist/session/views/catalog.d.ts.map +0 -1
- package/dist/session/views/catalog.js.map +0 -1
- package/dist/session/views/index.d.ts.map +0 -1
- package/dist/session/views/index.js.map +0 -1
- package/dist/session/views/resolve.d.ts.map +0 -1
- package/dist/session/views/resolve.js.map +0 -1
- package/dist/store/entity-index.d.ts.map +0 -1
- package/dist/store/entity-index.js.map +0 -1
- package/dist/store/index.d.ts.map +0 -1
- package/dist/store/index.js.map +0 -1
- package/dist/store/memory.d.ts.map +0 -1
- package/dist/store/memory.js.map +0 -1
- package/dist/store/mutation.d.ts.map +0 -1
- package/dist/store/mutation.js.map +0 -1
- package/dist/store/observe.d.ts.map +0 -1
- package/dist/store/observe.js.map +0 -1
- package/dist/store/optimistic.d.ts.map +0 -1
- package/dist/store/optimistic.js.map +0 -1
- package/dist/store/query-key.d.ts.map +0 -1
- package/dist/store/query-key.js.map +0 -1
- package/dist/store/shape.d.ts.map +0 -1
- package/dist/store/shape.js.map +0 -1
- package/dist/store/store.d.ts.map +0 -1
- package/dist/store/store.js.map +0 -1
- package/dist/store/store.typecheck.d.ts.map +0 -1
- package/dist/store/store.typecheck.js.map +0 -1
- package/dist/transport/auto/decision.d.ts.map +0 -1
- package/dist/transport/auto/decision.js.map +0 -1
- package/dist/transport/auto/fallback.d.ts.map +0 -1
- package/dist/transport/auto/fallback.js.map +0 -1
- package/dist/transport/auto/index.d.ts.map +0 -1
- package/dist/transport/auto/index.js.map +0 -1
- package/dist/transport/auto/transport.d.ts.map +0 -1
- package/dist/transport/auto/transport.js.map +0 -1
- package/dist/transport/auto/warning.d.ts.map +0 -1
- package/dist/transport/auto/warning.js.map +0 -1
- package/dist/transport/deadline.d.ts.map +0 -1
- package/dist/transport/deadline.js.map +0 -1
- package/dist/transport/http/index.d.ts.map +0 -1
- package/dist/transport/http/index.js.map +0 -1
- package/dist/transport/http/response.d.ts.map +0 -1
- package/dist/transport/http/response.js.map +0 -1
- package/dist/transport/http/stream.d.ts.map +0 -1
- package/dist/transport/http/stream.js.map +0 -1
- package/dist/transport/http/transport.d.ts.map +0 -1
- package/dist/transport/http/transport.js.map +0 -1
- package/dist/transport/index.d.ts.map +0 -1
- package/dist/transport/index.js.map +0 -1
- package/dist/transport/transport.d.ts.map +0 -1
- package/dist/transport/transport.js.map +0 -1
- package/dist/transport/websocket/connection.d.ts.map +0 -1
- package/dist/transport/websocket/connection.js.map +0 -1
- package/dist/transport/websocket/exchange.d.ts.map +0 -1
- package/dist/transport/websocket/exchange.js.map +0 -1
- package/dist/transport/websocket/index.d.ts.map +0 -1
- package/dist/transport/websocket/index.js.map +0 -1
- package/dist/transport/websocket/transport.d.ts.map +0 -1
- package/dist/transport/websocket/transport.js.map +0 -1
|
@@ -1,30 +1,39 @@
|
|
|
1
|
+
import { Key } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
1
2
|
import * as invocationProtocol from '@astrale-os/kernel-protocol/invocation';
|
|
2
3
|
import { acceptCall, dispatchTrace, isAdmittedMissError, isAdmittedStaleRouteError, } from '../../client/index.js';
|
|
3
4
|
import { ClientError, ResponseError } from '../../errors/index.js';
|
|
4
5
|
import { runSessionOperation, sessionTransportOptions, allowEndpoint } from '../context/index.js';
|
|
5
6
|
import { resolveAuth } from './auth.js';
|
|
6
|
-
import { selectEnvelope } from './envelope.js';
|
|
7
|
+
import { selectEnvelope, selectEnvelopeTarget } from './envelope.js';
|
|
7
8
|
export class SessionDispatcher {
|
|
8
9
|
state;
|
|
9
10
|
constructor(state) {
|
|
10
11
|
this.state = state;
|
|
11
12
|
}
|
|
12
|
-
async dispatch(input, options, operation
|
|
13
|
+
async dispatch(input, options, operation) {
|
|
13
14
|
this.state.requireOpen();
|
|
14
15
|
const call = acceptCall(input);
|
|
15
16
|
// Authority is resolved before warm lookup so changed credentials or delegation cannot reuse a
|
|
16
17
|
// carrier minted for a different caller partition.
|
|
17
18
|
const auth = await resolveAuth(this.state.auth, call, operation);
|
|
18
|
-
const source =
|
|
19
|
-
const cacheKey = await this.state.cache.key(source
|
|
19
|
+
const source = this.state.kernel;
|
|
20
|
+
const cacheKey = await this.state.cache.key(source, call, auth);
|
|
20
21
|
const dispatch = Object.freeze({
|
|
21
22
|
call,
|
|
22
23
|
auth,
|
|
23
24
|
source,
|
|
24
25
|
cacheKey,
|
|
25
|
-
...(expected === undefined ? {} : { expected }),
|
|
26
26
|
});
|
|
27
|
-
|
|
27
|
+
let learned = await this.state.cache.get(cacheKey, auth.credential);
|
|
28
|
+
if (learned !== undefined) {
|
|
29
|
+
try {
|
|
30
|
+
requireCachedRoute(learned, source, call.target, this.state.envelopeTransport, this.state.websocketAvailable, this.state.policy);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
this.state.cache.delete(cacheKey);
|
|
34
|
+
learned = undefined;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
28
37
|
if (learned !== undefined) {
|
|
29
38
|
return this.dispatchDestinationWithRecovery(learned, dispatch, options, operation);
|
|
30
39
|
}
|
|
@@ -39,23 +48,22 @@ export class SessionDispatcher {
|
|
|
39
48
|
...sessionTransportOptions(operation, options.idempotencyKey),
|
|
40
49
|
...(state.auth.delegate === undefined ? {} : { delegate: state.auth.delegate }),
|
|
41
50
|
...(routing === undefined ? {} : { routing }),
|
|
42
|
-
...(state.expected === undefined ? {} : { schema: { revision: state.expected.revision } }),
|
|
43
51
|
}));
|
|
44
52
|
}
|
|
45
53
|
async followSource(result, state, options, operation) {
|
|
46
54
|
if (result.kind !== 'redirect')
|
|
47
55
|
return result;
|
|
48
56
|
const redirect = result.redirect;
|
|
49
|
-
if (redirect.route.via.issuer !== state.source
|
|
57
|
+
if (redirect.route.via.issuer !== state.source) {
|
|
50
58
|
throw new ClientError('Redirect issuer differs from the session-pinned source Kernel identity.');
|
|
51
59
|
}
|
|
52
|
-
|
|
53
|
-
const learned = this.state.cache.learn(state.cacheKey, redirect.route, redirect.credential);
|
|
60
|
+
requireTargetPublication(redirect.route, state.call.target);
|
|
61
|
+
const learned = await this.state.cache.learn(state.cacheKey, redirect.route, redirect.credential, state.auth.credential);
|
|
54
62
|
return this.dispatchDestinationWithRecovery(learned, state, options, operation, redirect.trace);
|
|
55
63
|
}
|
|
56
64
|
async dispatchDestinationWithRecovery(learned, state, options, operation, trace) {
|
|
57
65
|
try {
|
|
58
|
-
return await this.dispatchDestination(learned, state.call, options, operation, state.
|
|
66
|
+
return await this.dispatchDestination(learned, state.call, options, operation, state.source, trace);
|
|
59
67
|
}
|
|
60
68
|
catch (cause) {
|
|
61
69
|
const stale = isAdmittedStaleRouteError(cause);
|
|
@@ -79,11 +87,11 @@ export class SessionDispatcher {
|
|
|
79
87
|
return this.followSource(refreshed, state, options, operation);
|
|
80
88
|
}
|
|
81
89
|
}
|
|
82
|
-
async dispatchDestination(learned, call, options, operation,
|
|
83
|
-
if (learned.route.via.issuer !==
|
|
90
|
+
async dispatchDestination(learned, call, options, operation, source, trace) {
|
|
91
|
+
if (learned.route.via.issuer !== source) {
|
|
84
92
|
throw new ClientError('Learned route issuer differs from the session-pinned source Kernel.');
|
|
85
93
|
}
|
|
86
|
-
|
|
94
|
+
requireTargetPublication(learned.route, call.target);
|
|
87
95
|
const envelope = selectEnvelope(learned.route.endpoint, this.state.envelopeTransport, this.state.websocketAvailable, this.state.pool, this.state.policy);
|
|
88
96
|
const requestOptions = {
|
|
89
97
|
...sessionTransportOptions(operation, options.idempotencyKey),
|
|
@@ -97,13 +105,13 @@ export class SessionDispatcher {
|
|
|
97
105
|
}
|
|
98
106
|
return result;
|
|
99
107
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
return Object.freeze({ issuer: snapshot.publication.identity.issuer });
|
|
108
|
+
}
|
|
109
|
+
function requireCachedRoute(learned, source, target, envelopeTransport, websocketAvailable, policy) {
|
|
110
|
+
if (learned.route.via.issuer !== source) {
|
|
111
|
+
throw new ClientError('Learned route issuer differs from the session-pinned source Kernel.');
|
|
106
112
|
}
|
|
113
|
+
requireTargetPublication(learned.route, target);
|
|
114
|
+
selectEnvelopeTarget(learned.route.endpoint, envelopeTransport, websocketAvailable, policy);
|
|
107
115
|
}
|
|
108
116
|
function isRouteCompatibilityConflict(input) {
|
|
109
117
|
if (!(input instanceof ResponseError))
|
|
@@ -113,15 +121,15 @@ function isRouteCompatibilityConflict(input) {
|
|
|
113
121
|
message: input.message,
|
|
114
122
|
...(input.data === undefined ? {} : { data: input.data }),
|
|
115
123
|
});
|
|
116
|
-
return (failure?.data.code === invocationProtocol.
|
|
117
|
-
failure?.data.code === invocationProtocol.SCHEMA_REVISION_MISMATCH ||
|
|
124
|
+
return (failure?.data.code === invocationProtocol.SCHEMA_REVISION_MISMATCH ||
|
|
118
125
|
failure?.data.code === invocationProtocol.SERVICE_TRUST_REQUIRED);
|
|
119
126
|
}
|
|
120
|
-
function
|
|
121
|
-
if (
|
|
127
|
+
function requireTargetPublication(route, target) {
|
|
128
|
+
if (typeof target === 'string')
|
|
122
129
|
return;
|
|
123
130
|
const actual = route.via.publication;
|
|
124
|
-
if (actual.origin !==
|
|
131
|
+
if (actual.origin !== Key.origin(target.callable) ||
|
|
132
|
+
(target.revision !== undefined && actual.revision !== target.revision)) {
|
|
125
133
|
throw new ClientError('Resolved route does not match the expected Schema revision.');
|
|
126
134
|
}
|
|
127
135
|
}
|
|
@@ -130,9 +138,11 @@ export function requireResultKind(expected, result) {
|
|
|
130
138
|
return result;
|
|
131
139
|
if (result.kind === 'stream')
|
|
132
140
|
void result.stream.cancel(`Expected ${expected} result.`);
|
|
141
|
+
if (result.kind === 'binary' && !(result.value.body instanceof Uint8Array)) {
|
|
142
|
+
void result.value.body[Symbol.asyncIterator]().return?.();
|
|
143
|
+
}
|
|
133
144
|
throw new ClientError(`Function returned ${result.kind}; ${expected} was required.`);
|
|
134
145
|
}
|
|
135
146
|
function authenticated(client, credential) {
|
|
136
147
|
return credential === undefined ? client : client.as(credential);
|
|
137
148
|
}
|
|
138
|
-
//# sourceMappingURL=dispatch.js.map
|
|
@@ -11,4 +11,5 @@ export interface EnvelopeSelection {
|
|
|
11
11
|
readonly destination: ClientTarget;
|
|
12
12
|
}
|
|
13
13
|
export declare function selectEnvelope(endpoints: publication.InvocationEndpoints, preference: SessionEnvelopeTransport, websocketAvailable: boolean, pool: ClientPoolCapability, policy: Readonly<SessionPolicy>): EnvelopeSelection;
|
|
14
|
-
|
|
14
|
+
/** Resolve and admit one route endpoint without acquiring a transport Client. */
|
|
15
|
+
export declare function selectEnvelopeTarget(endpoints: publication.InvocationEndpoints, preference: SessionEnvelopeTransport, websocketAvailable: boolean, policy: Readonly<SessionPolicy>): ClientTarget;
|
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import { ClientError } from '../../errors/index.js';
|
|
2
2
|
import { allowEndpoint } from '../context/index.js';
|
|
3
3
|
export function selectEnvelope(endpoints, preference, websocketAvailable, pool, policy) {
|
|
4
|
+
const destination = selectEnvelopeTarget(endpoints, preference, websocketAvailable, policy);
|
|
5
|
+
const client = pool.clientFor(destination);
|
|
6
|
+
if (client === null ||
|
|
7
|
+
typeof client !== 'object' ||
|
|
8
|
+
typeof client.dispatch !== 'function' ||
|
|
9
|
+
typeof client.as !== 'function' ||
|
|
10
|
+
typeof client.close !== 'function') {
|
|
11
|
+
throw new TypeError('Session client pool capability returned an invalid Client.');
|
|
12
|
+
}
|
|
13
|
+
return Object.freeze({ client, destination });
|
|
14
|
+
}
|
|
15
|
+
/** Resolve and admit one route endpoint without acquiring a transport Client. */
|
|
16
|
+
export function selectEnvelopeTarget(endpoints, preference, websocketAvailable, policy) {
|
|
4
17
|
let destination;
|
|
5
18
|
if (preference === 'websocket') {
|
|
6
19
|
if (endpoints.websocket === undefined) {
|
|
@@ -23,14 +36,5 @@ export function selectEnvelope(endpoints, preference, websocketAvailable, pool,
|
|
|
23
36
|
allowEndpoint(endpoints.http, policy);
|
|
24
37
|
destination = Object.freeze({ transport: 'http', url: endpoints.http });
|
|
25
38
|
}
|
|
26
|
-
|
|
27
|
-
if (client === null ||
|
|
28
|
-
typeof client !== 'object' ||
|
|
29
|
-
typeof client.dispatch !== 'function' ||
|
|
30
|
-
typeof client.as !== 'function' ||
|
|
31
|
-
typeof client.close !== 'function') {
|
|
32
|
-
throw new TypeError('Session client pool capability returned an invalid Client.');
|
|
33
|
-
}
|
|
34
|
-
return Object.freeze({ client, destination });
|
|
39
|
+
return destination;
|
|
35
40
|
}
|
|
36
|
-
//# sourceMappingURL=envelope.js.map
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
export { admitSessionAuth, resolveAuth, type Auth, type EffectiveAuth, type SessionAuth, } from './auth.js';
|
|
2
|
-
export type
|
|
3
|
-
export { RouteCache, type LearnedRoute } from './cache.js';
|
|
2
|
+
export { RouteCache, type LearnedRoute, type PersistedRoute, type SessionRouteArtifact, type SessionRouteStore, } from './cache.js';
|
|
4
3
|
export { requireResultKind, SessionDispatcher, type SessionDispatcherOptions } from './dispatch.js';
|
|
5
4
|
export { type ClientPoolCapability, type EnvelopeSelection } from './envelope.js';
|
|
6
5
|
export { admitEnvelopeTransport, admitRequestOptions, type SessionEnvelopeTransport, type SessionRequestOptions, } from './request.js';
|
|
7
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export { admitSessionAuth, resolveAuth, } from './auth.js';
|
|
2
|
-
export { RouteCache } from './cache.js';
|
|
2
|
+
export { RouteCache, } from './cache.js';
|
|
3
3
|
export { requireResultKind, SessionDispatcher } from './dispatch.js';
|
|
4
4
|
export {} from './envelope.js';
|
|
5
5
|
export { admitEnvelopeTransport, admitRequestOptions, } from './request.js';
|
|
6
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -6,4 +6,3 @@ export interface SessionRequestOptions extends SessionControlOptions {
|
|
|
6
6
|
}
|
|
7
7
|
export declare function admitRequestOptions(input?: SessionRequestOptions): Readonly<SessionRequestOptions>;
|
|
8
8
|
export declare function admitEnvelopeTransport(input: SessionEnvelopeTransport): SessionEnvelopeTransport;
|
|
9
|
-
//# sourceMappingURL=request.d.ts.map
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import type { IssuerId } from '@astrale-os/kernel-core/auth/issuer';
|
|
2
2
|
import type { PathLike } from '@astrale-os/kernel-core/path';
|
|
3
|
-
import type {
|
|
3
|
+
import type { Domain } from '@astrale-os/kernel-dsl/v1/domain';
|
|
4
|
+
import type { publication } from '@astrale-os/kernel-protocol';
|
|
4
5
|
import type { Call, Input, Result } from '../client/index.js';
|
|
6
|
+
import type { DomainBinding, GraphApi } from '../graph/index.js';
|
|
5
7
|
import type { ClientFactory, ClientPool as ClientPoolType } from '../pool/index.js';
|
|
6
|
-
import type {
|
|
8
|
+
import type { SchemaApi } from '../schema/index.js';
|
|
7
9
|
import type { ClientWarning } from '../transport/auto/index.js';
|
|
8
10
|
import type { Fetch } from '../transport/http/index.js';
|
|
9
11
|
import type { WebSocketConstructor } from '../transport/websocket/index.js';
|
|
10
12
|
import type { SessionControlOptions, SessionPolicy } from './context/index.js';
|
|
11
13
|
import type { SessionSnapshot } from './discovery/index.js';
|
|
12
14
|
import type { CallableReference, InputOfReference, OutputOfReference } from './reference.js';
|
|
13
|
-
import type { SessionAuth, SessionEnvelopeTransport, SessionRequestOptions } from './routing/index.js';
|
|
15
|
+
import type { SessionRouteStore, SessionAuth, SessionEnvelopeTransport, SessionRequestOptions } from './routing/index.js';
|
|
14
16
|
import type { ViewCatalog } from './views/index.js';
|
|
15
17
|
export interface ClientSessionOptions {
|
|
16
18
|
/** Exact canonical source Kernel identity; its invocation and discovery endpoints are derived. */
|
|
@@ -20,6 +22,8 @@ export interface ClientSessionOptions {
|
|
|
20
22
|
readonly pool?: Pick<ClientPoolType, 'clientFor'>;
|
|
21
23
|
readonly websocket?: WebSocketConstructor;
|
|
22
24
|
readonly auth?: SessionAuth;
|
|
25
|
+
/** Optional caller-owned persistence for bounded confidential route artifacts. */
|
|
26
|
+
readonly routeStore?: SessionRouteStore;
|
|
23
27
|
readonly policy: SessionPolicy;
|
|
24
28
|
readonly envelopeTransport?: SessionEnvelopeTransport;
|
|
25
29
|
readonly onWarning?: (warning: ClientWarning) => void;
|
|
@@ -27,6 +31,7 @@ export interface ClientSessionOptions {
|
|
|
27
31
|
readonly maximumBundleBytes?: number;
|
|
28
32
|
readonly maximumResponseBytes?: number;
|
|
29
33
|
readonly timeoutMs?: number;
|
|
34
|
+
readonly schemaLifecycleTimeoutMs?: number;
|
|
30
35
|
}
|
|
31
36
|
export type ConnectOptions = Omit<ClientSessionOptions, 'kernel' | 'policy'> & {
|
|
32
37
|
readonly url: string;
|
|
@@ -36,6 +41,7 @@ export type ConnectOptions = Omit<ClientSessionOptions, 'kernel' | 'policy'> & {
|
|
|
36
41
|
export declare class ClientSession {
|
|
37
42
|
readonly kernel: IssuerId;
|
|
38
43
|
readonly schema: SchemaApi;
|
|
44
|
+
readonly graph: GraphApi;
|
|
39
45
|
private readonly ownedPool?;
|
|
40
46
|
private readonly discovery;
|
|
41
47
|
private readonly dispatcher;
|
|
@@ -45,18 +51,21 @@ export declare class ClientSession {
|
|
|
45
51
|
private readonly admitTargetViews;
|
|
46
52
|
private closed;
|
|
47
53
|
constructor(options: ClientSessionOptions);
|
|
54
|
+
/** Bind one admitted DSL Domain to authenticated graph projection and Method dispatch. */
|
|
55
|
+
bind<const DomainValue extends Domain>(domain: DomainValue): DomainBinding<DomainValue>;
|
|
56
|
+
/** Revalidate the intrinsic Publication without acquiring its bundle or Views. */
|
|
57
|
+
publication(options?: SessionControlOptions): Promise<publication.Publication>;
|
|
48
58
|
snapshot(options?: SessionControlOptions): Promise<SessionSnapshot>;
|
|
49
59
|
viewsFor(target: PathLike, options?: SessionControlOptions): Promise<ViewCatalog>;
|
|
50
|
-
installation(origin: Key.Origin, options?: SessionControlOptions): Promise<ReadyInstallation>;
|
|
51
60
|
dispatch(call: Call, options?: SessionRequestOptions): Promise<Result>;
|
|
52
61
|
call(call: Call, options?: SessionRequestOptions): Promise<Input>;
|
|
53
|
-
invoke<const Reference extends CallableReference
|
|
62
|
+
invoke<const Reference extends CallableReference<unknown>>(reference: Reference, input: InputOfReference<Reference>, options?: SessionRequestOptions): Promise<OutputOfReference<Reference>>;
|
|
54
63
|
stream(call: Call, options?: SessionRequestOptions): Promise<import("../client/result.js").Stream>;
|
|
55
|
-
binary(call: Call, options?: SessionRequestOptions): Promise<import("@astrale-os/kernel-core/
|
|
64
|
+
binary(call: Call, options?: SessionRequestOptions): Promise<import("@astrale-os/kernel-core/callable").BinaryOutput>;
|
|
56
65
|
close(): void;
|
|
57
66
|
private requireOpen;
|
|
67
|
+
private invokeDomainMethod;
|
|
58
68
|
private operation;
|
|
59
69
|
}
|
|
60
70
|
/** Open one caller-owned conversation with a Kernel using secure defaults. */
|
|
61
71
|
export declare function connect(options: ConnectOptions): ClientSession;
|
|
62
|
-
//# sourceMappingURL=session.d.ts.map
|
package/dist/session/session.js
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { Path } from '@astrale-os/kernel-core/path';
|
|
1
2
|
import { Client } from '../client/index.js';
|
|
2
|
-
import {
|
|
3
|
+
import { SessionError } from '../errors/index.js';
|
|
4
|
+
import { createDomainBinding } from '../graph/domain/binding.js';
|
|
5
|
+
import { createGraph } from '../graph/index.js';
|
|
3
6
|
import { ClientPool } from '../pool/index.js';
|
|
4
|
-
import { createSchema } from '../schema/index.js';
|
|
7
|
+
import { createSchema, DEFAULT_SCHEMA_LIFECYCLE_TIMEOUT_MS } from '../schema/index.js';
|
|
5
8
|
import { AutoTransport } from '../transport/auto/index.js';
|
|
6
9
|
import { HttpTransport } from '../transport/http/index.js';
|
|
7
10
|
import { WebSocketTransport } from '../transport/websocket/index.js';
|
|
@@ -15,6 +18,7 @@ const DEFAULT_SESSION_POLICY = Object.freeze({ maximumRouteAgeMs: 60_000 });
|
|
|
15
18
|
export class ClientSession {
|
|
16
19
|
kernel;
|
|
17
20
|
schema;
|
|
21
|
+
graph;
|
|
18
22
|
ownedPool;
|
|
19
23
|
discovery;
|
|
20
24
|
dispatcher;
|
|
@@ -42,11 +46,12 @@ export class ClientSession {
|
|
|
42
46
|
const maximumBundleBytes = positive(options.maximumBundleBytes ?? DEFAULT_MAXIMUM_BUNDLE_BYTES, 'maximumBundleBytes');
|
|
43
47
|
const maximumResponseBytes = positive(options.maximumResponseBytes ?? DEFAULT_MAXIMUM_RESPONSE_BYTES, 'maximumResponseBytes');
|
|
44
48
|
const timeoutMs = platformDuration(options.timeoutMs ?? DEFAULT_TIMEOUT_MS, 'timeoutMs');
|
|
49
|
+
const schemaLifecycleTimeoutMs = platformDuration(options.schemaLifecycleTimeoutMs ?? DEFAULT_SCHEMA_LIFECYCLE_TIMEOUT_MS, 'schemaLifecycleTimeoutMs');
|
|
45
50
|
this.timeoutMs = timeoutMs;
|
|
46
51
|
const websocketAvailable = options.client !== undefined ||
|
|
47
52
|
options.pool !== undefined ||
|
|
48
53
|
options.websocket !== undefined ||
|
|
49
|
-
typeof
|
|
54
|
+
typeof WebSocket === 'function';
|
|
50
55
|
const client = options.client ??
|
|
51
56
|
defaultClientFactory({
|
|
52
57
|
fetch: fetchImpl,
|
|
@@ -73,7 +78,7 @@ export class ClientSession {
|
|
|
73
78
|
requireOpen: () => this.requireOpen(),
|
|
74
79
|
acquisitionOperation: () => this.operation(undefined),
|
|
75
80
|
});
|
|
76
|
-
this.routes = new RouteCache(policy.maximumRouteAgeMs);
|
|
81
|
+
this.routes = new RouteCache(policy.maximumRouteAgeMs, undefined, options.routeStore);
|
|
77
82
|
this.dispatcher = new SessionDispatcher({
|
|
78
83
|
kernel: this.kernel,
|
|
79
84
|
sourceEndpoint,
|
|
@@ -83,13 +88,22 @@ export class ClientSession {
|
|
|
83
88
|
cache: this.routes,
|
|
84
89
|
policy,
|
|
85
90
|
envelopeTransport: admitEnvelopeTransport(options.envelopeTransport ?? 'http'),
|
|
86
|
-
discovery: this.discovery,
|
|
87
91
|
requireOpen: () => this.requireOpen(),
|
|
88
92
|
});
|
|
89
93
|
this.schema = createSchema((request, options) => this.dispatch(request, options), {
|
|
90
94
|
maximumPublicationBytes,
|
|
91
95
|
maximumBundleBytes,
|
|
96
|
+
lifecycleTimeoutMs: schemaLifecycleTimeoutMs,
|
|
92
97
|
});
|
|
98
|
+
this.graph = createGraph((call, options) => this.call(call, options));
|
|
99
|
+
}
|
|
100
|
+
/** Bind one admitted DSL Domain to authenticated graph projection and Method dispatch. */
|
|
101
|
+
bind(domain) {
|
|
102
|
+
return createDomainBinding(domain, this.graph, (node, method, input) => this.invokeDomainMethod(domain, node, method, input));
|
|
103
|
+
}
|
|
104
|
+
/** Revalidate the intrinsic Publication without acquiring its bundle or Views. */
|
|
105
|
+
publication(options) {
|
|
106
|
+
return this.discovery.publication(this.operation(admitControlOptions(options)));
|
|
93
107
|
}
|
|
94
108
|
snapshot(options) {
|
|
95
109
|
return this.discovery.snapshot(this.operation(admitControlOptions(options)));
|
|
@@ -98,23 +112,6 @@ export class ClientSession {
|
|
|
98
112
|
this.requireOpen();
|
|
99
113
|
return resolveViewsFor(async (call, operation) => requireResultKind('value', await this.dispatcher.dispatch(call, {}, operation)).value, this.admitTargetViews, target, this.operation(admitControlOptions(options)));
|
|
100
114
|
}
|
|
101
|
-
async installation(origin, options) {
|
|
102
|
-
const result = await this.schema.introspect({
|
|
103
|
-
from: { kind: 'installation', origin },
|
|
104
|
-
select: {
|
|
105
|
-
state: true,
|
|
106
|
-
target: true,
|
|
107
|
-
source: true,
|
|
108
|
-
bundle: true,
|
|
109
|
-
readiness: true,
|
|
110
|
-
capabilities: true,
|
|
111
|
-
},
|
|
112
|
-
}, options);
|
|
113
|
-
if (result?.state !== 'ready' || result.readiness === null) {
|
|
114
|
-
throw new ClientError(`Domain ${origin} is not ready on this Kernel.`);
|
|
115
|
-
}
|
|
116
|
-
return result;
|
|
117
|
-
}
|
|
118
115
|
dispatch(call, options) {
|
|
119
116
|
const admitted = admitRequestOptions(options);
|
|
120
117
|
return this.dispatcher.dispatch(call, admitted, this.operation(admitted));
|
|
@@ -126,11 +123,19 @@ export class ClientSession {
|
|
|
126
123
|
async invoke(reference, input, options) {
|
|
127
124
|
const admittedReference = admitReference(reference);
|
|
128
125
|
const admittedOptions = admitRequestOptions(options);
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
126
|
+
const { anchor, steps } = admittedReference.target.ast;
|
|
127
|
+
const last = steps.at(-1);
|
|
128
|
+
const instance = last?.kind === 'method' && last.dispatch === 'instance'
|
|
129
|
+
? Path.fromAST({ anchor, steps: steps.slice(0, -1) }).raw
|
|
130
|
+
: undefined;
|
|
131
|
+
const result = await this.dispatcher.dispatch({
|
|
132
|
+
target: Object.freeze({
|
|
133
|
+
callable: admittedReference.callable,
|
|
134
|
+
revision: admittedReference.revision,
|
|
135
|
+
...(instance === undefined ? {} : { instance }),
|
|
136
|
+
}),
|
|
137
|
+
input,
|
|
138
|
+
}, admittedOptions, this.operation(admittedOptions));
|
|
134
139
|
const narrowed = requireResultKind(admittedReference.outputMode, result);
|
|
135
140
|
return (narrowed.kind === 'value'
|
|
136
141
|
? narrowed.value
|
|
@@ -150,14 +155,29 @@ export class ClientSession {
|
|
|
150
155
|
if (this.closed)
|
|
151
156
|
return;
|
|
152
157
|
this.closed = true;
|
|
153
|
-
this.lifecycle.abort(new
|
|
158
|
+
this.lifecycle.abort(new SessionError('ClientSession is closed.', { failure: 'closed' }));
|
|
154
159
|
this.ownedPool?.close();
|
|
155
160
|
this.routes.clear();
|
|
156
161
|
this.discovery.clear();
|
|
157
162
|
}
|
|
158
163
|
requireOpen() {
|
|
159
164
|
if (this.closed)
|
|
160
|
-
throw new
|
|
165
|
+
throw new SessionError('ClientSession is closed.', { failure: 'closed' });
|
|
166
|
+
}
|
|
167
|
+
invokeDomainMethod(domain, node, method, input) {
|
|
168
|
+
const diagnostics = method.validateInput(input);
|
|
169
|
+
if (diagnostics.length > 0)
|
|
170
|
+
throw new TypeError(`Method ${method.key} input is invalid.`);
|
|
171
|
+
const owner = domain.closure.find(({ origin }) => origin === method.owner.ref.origin);
|
|
172
|
+
if (owner === undefined)
|
|
173
|
+
throw new TypeError(`Method owner ${method.owner.ref.origin} is absent.`);
|
|
174
|
+
return this.invoke({
|
|
175
|
+
origin: owner.origin,
|
|
176
|
+
revision: owner.revision,
|
|
177
|
+
callable: method.key,
|
|
178
|
+
target: Path.instanceMethod(Path.id(node.id), method.key),
|
|
179
|
+
outputMode: method.output.mode,
|
|
180
|
+
}, input);
|
|
161
181
|
}
|
|
162
182
|
operation(options) {
|
|
163
183
|
this.requireOpen();
|
|
@@ -231,4 +251,3 @@ function defaultClientFactory(options) {
|
|
|
231
251
|
}
|
|
232
252
|
};
|
|
233
253
|
}
|
|
234
|
-
//# sourceMappingURL=session.js.map
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { NodeId } from '@astrale-os/kernel-core/graph/node';
|
|
2
|
+
import { Path } from '@astrale-os/kernel-core/path';
|
|
3
|
+
import { K, KernelSchema } from '@astrale-os/kernel-core/schema';
|
|
4
|
+
import { defineSchema, func, method, nodeClass, schema, valueSchema, } from '@astrale-os/kernel-dsl/v1';
|
|
5
|
+
import { ClientSession, reference } from './index.js';
|
|
2
6
|
void new ClientSession(options);
|
|
3
7
|
void auth;
|
|
4
8
|
void control;
|
|
@@ -6,5 +10,85 @@ void envelope;
|
|
|
6
10
|
void policy;
|
|
7
11
|
void request;
|
|
8
12
|
void snapshot;
|
|
9
|
-
|
|
10
|
-
|
|
13
|
+
const observedPublication = session.publication(control);
|
|
14
|
+
void observedPublication;
|
|
15
|
+
const dynamicReference = reference(dynamicDomain, dynamicMethod)(Path.id(NodeId('dynamic-node')));
|
|
16
|
+
void session.invoke(dynamicReference, dynamicInput);
|
|
17
|
+
const dynamicInputIsClientInput = true;
|
|
18
|
+
const dynamicOutputIsUnknown = true;
|
|
19
|
+
void dynamicInputIsClientInput;
|
|
20
|
+
void dynamicOutputIsUnknown;
|
|
21
|
+
const renameInput = valueSchema()({
|
|
22
|
+
type: 'object',
|
|
23
|
+
properties: { name: { type: 'string' } },
|
|
24
|
+
required: ['name'],
|
|
25
|
+
additionalProperties: false,
|
|
26
|
+
});
|
|
27
|
+
const registrationInput = valueSchema()(K.functions.register.input);
|
|
28
|
+
const booleanOutput = valueSchema()({ type: 'boolean' });
|
|
29
|
+
const typedDomain = schema.resolve(defineSchema('client.input-witness.typecheck', {
|
|
30
|
+
dependencies: { kernel: KernelSchema },
|
|
31
|
+
functions: {
|
|
32
|
+
registerIdentity: func({
|
|
33
|
+
auth: 'authenticated',
|
|
34
|
+
input: registrationInput,
|
|
35
|
+
output: booleanOutput,
|
|
36
|
+
}),
|
|
37
|
+
},
|
|
38
|
+
classes: {
|
|
39
|
+
Person: nodeClass({
|
|
40
|
+
methods: {
|
|
41
|
+
rename: method({ auth: 'authenticated', input: renameInput, output: booleanOutput }),
|
|
42
|
+
registerIdentity: method({
|
|
43
|
+
static: true,
|
|
44
|
+
auth: 'authenticated',
|
|
45
|
+
input: registrationInput,
|
|
46
|
+
output: booleanOutput,
|
|
47
|
+
}),
|
|
48
|
+
},
|
|
49
|
+
}),
|
|
50
|
+
},
|
|
51
|
+
}));
|
|
52
|
+
const registerReference = reference(typedDomain, typedDomain.functions.registerIdentity);
|
|
53
|
+
const staticRegisterReference = reference(typedDomain, typedDomain.classes.Person.static.methods.registerIdentity);
|
|
54
|
+
const renameReference = reference(typedDomain, typedDomain.classes.Person.methods.rename)(Path.id(NodeId('person')));
|
|
55
|
+
void session.invoke(registerReference, registration);
|
|
56
|
+
void boundSession.invoke(staticRegisterReference, registration);
|
|
57
|
+
void session.invoke(renameReference, renameRequest);
|
|
58
|
+
const registerInputIsRequest = true;
|
|
59
|
+
const renameInputIsInterface = true;
|
|
60
|
+
const renameOutputIsBoolean = true;
|
|
61
|
+
void registerInputIsRequest;
|
|
62
|
+
void renameInputIsInterface;
|
|
63
|
+
void renameOutputIsBoolean;
|
|
64
|
+
// @ts-expect-error The exact Schema's required input fields are retained.
|
|
65
|
+
void session.invoke(renameReference, {});
|
|
66
|
+
// @ts-expect-error A Date is not the Schema's declared string input.
|
|
67
|
+
void session.invoke(renameReference, { name: new Date() });
|
|
68
|
+
// @ts-expect-error A function is not the Schema's declared string input.
|
|
69
|
+
void session.invoke(renameReference, { name: () => 'Ada' });
|
|
70
|
+
// @ts-expect-error RegisterRequest retains its nonempty identities tuple.
|
|
71
|
+
void session.invoke(registerReference, { idempotencyKey: 'key', identities: [] });
|
|
72
|
+
// @ts-expect-error An unknown-schema reference still accepts only portable Client Input.
|
|
73
|
+
void session.invoke(dynamicReference, new Date());
|
|
74
|
+
const abstractMethod = method({
|
|
75
|
+
auth: 'authenticated',
|
|
76
|
+
input: { type: 'null' },
|
|
77
|
+
output: { type: 'null' },
|
|
78
|
+
abstract: true,
|
|
79
|
+
});
|
|
80
|
+
const abstractDomain = schema.resolve(defineSchema('client.reference.typecheck', {
|
|
81
|
+
classes: {
|
|
82
|
+
AbstractItem: nodeClass({ abstract: true, methods: { abstractMethod } }),
|
|
83
|
+
},
|
|
84
|
+
}));
|
|
85
|
+
// @ts-expect-error Abstract Methods are declarations and cannot become Client references.
|
|
86
|
+
reference(abstractDomain, abstractDomain.classes.AbstractItem.methods.abstractMethod);
|
|
87
|
+
// @ts-expect-error Exact identity is derived internally, never supplied as a Session option.
|
|
88
|
+
void session.invoke(dynamicReference, dynamicInput, { expect: undefined });
|
|
89
|
+
// @ts-expect-error Raw Client options do not select a declaration.
|
|
90
|
+
const unsupportedClientOptions = { expect: undefined };
|
|
91
|
+
void unsupportedClientOptions;
|
|
92
|
+
// @ts-expect-error Internal metadata dispatch is absent from the public package facade.
|
|
93
|
+
import { dispatchTrace } from '../index.js';
|
|
94
|
+
void dispatchTrace;
|
|
@@ -13,4 +13,3 @@ export declare function rootViewCatalog(publication: publication.Publication, ar
|
|
|
13
13
|
export declare function catalogFromKeys(root: ViewCatalog, keys: readonly Key.View[]): ViewCatalog;
|
|
14
14
|
/** Re-admit one Runtime-resolved heterogeneous View catalog at the Client trust boundary. */
|
|
15
15
|
export declare function targetViewCatalog(input: unknown, policy: Readonly<SessionPolicy>): ViewCatalog;
|
|
16
|
-
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -1,20 +1,22 @@
|
|
|
1
1
|
import { acceptViewResolution, } from '@astrale-os/kernel-core/schema/kernel/syscalls/view-resolution';
|
|
2
|
-
import { Key as ViewKey
|
|
2
|
+
import { Key as ViewKey } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
3
3
|
import { ClientError } from '../../errors/index.js';
|
|
4
4
|
import { allowEndpoint } from '../context/index.js';
|
|
5
5
|
export function rootViewCatalog(publication, artifact, policy) {
|
|
6
6
|
const views = publication.bindings.views
|
|
7
7
|
.map((binding) => {
|
|
8
8
|
allowEndpoint(binding.href, policy);
|
|
9
|
-
const declaration = artifact.root.views[
|
|
9
|
+
const declaration = artifact.root.views[viewName(binding.view)];
|
|
10
10
|
if (declaration === undefined) {
|
|
11
11
|
throw new ClientError('Published View has no verified root declaration.');
|
|
12
12
|
}
|
|
13
|
+
const { ref: _ref, ...viewDeclaration } = declaration;
|
|
13
14
|
return Object.freeze({
|
|
14
15
|
key: binding.view,
|
|
15
|
-
declaration,
|
|
16
|
+
declaration: Object.freeze(viewDeclaration),
|
|
16
17
|
href: binding.href,
|
|
17
18
|
handshake: binding.handshake,
|
|
19
|
+
...(binding.iframe === undefined ? {} : { iframe: binding.iframe }),
|
|
18
20
|
issuer: publication.identity.issuer,
|
|
19
21
|
etag: publication.etag,
|
|
20
22
|
revision: publication.schema.revision,
|
|
@@ -25,7 +27,7 @@ export function rootViewCatalog(publication, artifact, policy) {
|
|
|
25
27
|
const entrypointRef = publication.manifest?.entrypoint;
|
|
26
28
|
const entrypoint = entrypointRef === undefined
|
|
27
29
|
? undefined
|
|
28
|
-
: catalogViews.find(({ key }) => key === ViewKey.of(
|
|
30
|
+
: catalogViews.find(({ key }) => key === ViewKey.of(entrypointRef));
|
|
29
31
|
if (entrypointRef !== undefined && entrypoint === undefined) {
|
|
30
32
|
throw new ClientError('Published View entrypoint has no verified Publication binding.');
|
|
31
33
|
}
|
|
@@ -60,4 +62,10 @@ export function targetViewCatalog(input, policy) {
|
|
|
60
62
|
function compareKeys(left, right) {
|
|
61
63
|
return left < right ? -1 : left > right ? 1 : 0;
|
|
62
64
|
}
|
|
63
|
-
|
|
65
|
+
function viewName(input) {
|
|
66
|
+
const coordinate = input.slice(input.indexOf(':') + 1);
|
|
67
|
+
const match = /^view\.([A-Za-z][A-Za-z0-9_]*)$/u.exec(coordinate);
|
|
68
|
+
if (match === null)
|
|
69
|
+
throw new ClientError('Published View key is invalid.');
|
|
70
|
+
return match[1];
|
|
71
|
+
}
|
|
@@ -9,4 +9,3 @@ export type ViewCatalogAdmission = (input: unknown) => ViewCatalog;
|
|
|
9
9
|
* its heterogeneous installed-Publication projection.
|
|
10
10
|
*/
|
|
11
11
|
export declare function resolveViewsFor(invoke: ViewInvoker, admitCatalog: ViewCatalogAdmission, target: PathLike, operation: SessionOperation): Promise<ViewCatalog>;
|
|
12
|
-
//# sourceMappingURL=resolve.d.ts.map
|
|
@@ -11,4 +11,3 @@ export async function resolveViewsFor(invoke, admitCatalog, target, operation) {
|
|
|
11
11
|
const targetView = Path.staticMethod(owner, view.resolve.name);
|
|
12
12
|
return admitCatalog(await invoke(call(targetView, { target: path }), operation));
|
|
13
13
|
}
|
|
14
|
-
//# sourceMappingURL=resolve.js.map
|
package/dist/store/index.d.ts
CHANGED
package/dist/store/index.js
CHANGED