@astrale-os/kernel-client 0.6.0-beta.5 → 0.6.0-beta.50
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 +3 -4
- package/dist/auth/auth.js +0 -1
- package/dist/auth/authorization.d.ts +2 -3
- package/dist/auth/authorization.js +0 -1
- package/dist/auth/credential.d.ts +0 -1
- package/dist/auth/credential.js +0 -1
- package/dist/auth/identity.d.ts +6 -9
- package/dist/auth/identity.js +0 -1
- package/dist/auth/index.d.ts +0 -1
- package/dist/auth/index.js +0 -1
- package/dist/auth/provision.d.ts +0 -1
- package/dist/auth/provision.js +0 -1
- package/dist/client/admission.d.ts +0 -1
- package/dist/client/admission.js +0 -1
- 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 +0 -1
- package/dist/client/request.js +0 -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 +146 -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 +120 -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 +1 -2
- package/dist/index.js +1 -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 +0 -1
- package/dist/session/discovery/bundle.js +4 -4
- package/dist/session/discovery/discovery.d.ts +0 -1
- package/dist/session/discovery/discovery.js +0 -1
- package/dist/session/discovery/index.d.ts +0 -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 +14 -5
- package/dist/session/reference.js +28 -8
- package/dist/session/routing/auth.d.ts +0 -1
- package/dist/session/routing/auth.js +0 -1
- package/dist/session/routing/cache.d.ts +26 -6
- package/dist/session/routing/cache.js +215 -16
- package/dist/session/routing/dispatch.d.ts +0 -4
- package/dist/session/routing/dispatch.js +28 -18
- package/dist/session/routing/envelope.d.ts +2 -1
- package/dist/session/routing/envelope.js +14 -10
- package/dist/session/routing/expectation.d.ts +2 -3
- package/dist/session/routing/expectation.js +0 -1
- package/dist/session/routing/index.d.ts +1 -2
- 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 +12 -6
- package/dist/session/session.js +32 -25
- package/dist/session/session.typecheck.d.ts +0 -1
- package/dist/session/session.typecheck.js +23 -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 +24 -13
- package/dist/store/mutation.d.ts +0 -1
- package/dist/store/mutation.js +0 -1
- 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 +3 -2
- package/dist/store/shape.js +3 -2
- package/dist/store/store.d.ts +2 -4
- package/dist/store/store.js +5 -4
- 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 +0 -1
- package/dist/transport/auto/fallback.js +8 -10
- 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 -19
- 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.map +0 -1
- 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.map +0 -1
- 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,5 +1,26 @@
|
|
|
1
1
|
import { Path } from '@astrale-os/kernel-core/path';
|
|
2
|
-
import { Key, patterns,
|
|
2
|
+
import { callableAddress, Key, patterns, } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
3
|
+
export function reference(domain, callable) {
|
|
4
|
+
if ('owner' in callable && callable.inheritance === 'abstract')
|
|
5
|
+
invalid();
|
|
6
|
+
const common = Object.freeze({
|
|
7
|
+
origin: domain.origin,
|
|
8
|
+
revision: domain.revision,
|
|
9
|
+
callable: callable.key,
|
|
10
|
+
outputMode: callable.output.mode,
|
|
11
|
+
});
|
|
12
|
+
if ('owner' in callable && !callable.static) {
|
|
13
|
+
const bind = (receiver) => admitReference({
|
|
14
|
+
...common,
|
|
15
|
+
target: Path.instanceMethod(Path.from(receiver), callable.name),
|
|
16
|
+
});
|
|
17
|
+
return Object.assign(bind, common);
|
|
18
|
+
}
|
|
19
|
+
const target = 'owner' in callable
|
|
20
|
+
? Path.staticMethod(Path.project(callable.owner.ref), callable.name)
|
|
21
|
+
: Path.project(callable.ref);
|
|
22
|
+
return admitReference({ ...common, target });
|
|
23
|
+
}
|
|
3
24
|
export function admitReference(input) {
|
|
4
25
|
if (input === null || typeof input !== 'object')
|
|
5
26
|
invalid();
|
|
@@ -24,11 +45,11 @@ export function admitReference(input) {
|
|
|
24
45
|
});
|
|
25
46
|
}
|
|
26
47
|
function matchesCallable(target, callable) {
|
|
27
|
-
const
|
|
48
|
+
const coordinate = callableAddress(callable);
|
|
28
49
|
const { anchor, steps } = target.ast;
|
|
29
50
|
const last = steps.at(-1);
|
|
30
|
-
if (
|
|
31
|
-
if (last?.kind !== 'method' || last.name !==
|
|
51
|
+
if (coordinate.kind === 'method') {
|
|
52
|
+
if (last?.kind !== 'method' || last.name !== coordinate.name)
|
|
32
53
|
return false;
|
|
33
54
|
if (last.dispatch === 'instance')
|
|
34
55
|
return true;
|
|
@@ -37,8 +58,8 @@ function matchesCallable(target, callable) {
|
|
|
37
58
|
anchor.origin === Key.origin(callable) &&
|
|
38
59
|
steps.length === 2 &&
|
|
39
60
|
owner?.kind === 'projection' &&
|
|
40
|
-
owner.projection.kind ===
|
|
41
|
-
owner.projection.name ===
|
|
61
|
+
owner.projection.kind === 'class' &&
|
|
62
|
+
owner.projection.name === coordinate.owner.name);
|
|
42
63
|
}
|
|
43
64
|
const projection = steps[0];
|
|
44
65
|
return (anchor.kind === 'domain' &&
|
|
@@ -46,9 +67,8 @@ function matchesCallable(target, callable) {
|
|
|
46
67
|
steps.length === 1 &&
|
|
47
68
|
projection?.kind === 'projection' &&
|
|
48
69
|
projection.projection.kind === 'function' &&
|
|
49
|
-
projection.projection.name ===
|
|
70
|
+
projection.projection.name === coordinate.name);
|
|
50
71
|
}
|
|
51
72
|
function invalid() {
|
|
52
73
|
throw new TypeError('Callable reference is invalid.');
|
|
53
74
|
}
|
|
54
|
-
//# sourceMappingURL=reference.js.map
|
|
@@ -16,4 +16,3 @@ export interface EffectiveAuth {
|
|
|
16
16
|
}
|
|
17
17
|
export declare function admitSessionAuth(input: SessionAuth | undefined): SessionAuth | undefined;
|
|
18
18
|
export declare function resolveAuth(resolver: SessionAuth | undefined, call: invocation.Call, operation: SessionOperation): Promise<EffectiveAuth>;
|
|
19
|
-
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { invocation } from '@astrale-os/kernel-protocol';
|
|
2
2
|
import type { EffectiveAuth } from './auth.js';
|
|
3
3
|
import type { SchemaExpectation } from './expectation.js';
|
|
4
4
|
export interface LearnedRoute {
|
|
@@ -6,16 +6,36 @@ export interface LearnedRoute {
|
|
|
6
6
|
readonly credential?: string;
|
|
7
7
|
readonly expiresAt: number;
|
|
8
8
|
}
|
|
9
|
-
|
|
9
|
+
export interface PersistedRoute extends LearnedRoute {
|
|
10
|
+
/** HMAC over this entry and its exact authority partition. */
|
|
11
|
+
readonly integrity: string;
|
|
12
|
+
}
|
|
13
|
+
export interface SessionRouteArtifact {
|
|
14
|
+
readonly version: 1;
|
|
15
|
+
readonly entries: Readonly<Record<string, PersistedRoute>>;
|
|
16
|
+
}
|
|
17
|
+
/** Caller-owned persistence for confidential route artifacts. */
|
|
18
|
+
export interface SessionRouteStore {
|
|
19
|
+
read(): unknown;
|
|
20
|
+
write(artifact: SessionRouteArtifact): void;
|
|
21
|
+
}
|
|
22
|
+
/** Confidential warm routing state owned by exactly one ClientSession. */
|
|
10
23
|
export declare class RouteCache {
|
|
11
24
|
private readonly maximumAgeMs;
|
|
12
25
|
private readonly maximumSize;
|
|
13
26
|
private readonly entries;
|
|
14
|
-
|
|
27
|
+
private readonly keyTokens;
|
|
28
|
+
private readonly store?;
|
|
29
|
+
constructor(maximumAgeMs: number, maximumSize?: number, store?: SessionRouteStore);
|
|
15
30
|
key(source: string, call: invocation.Call, auth: EffectiveAuth, expected?: SchemaExpectation): Promise<string>;
|
|
16
|
-
get(key: string, now?: number): LearnedRoute | undefined
|
|
17
|
-
learn(key: string, route: invocation.Route, credential: string | undefined, now?: number): LearnedRoute
|
|
31
|
+
get(key: string, sourceCredential?: string, now?: number): Promise<LearnedRoute | undefined>;
|
|
32
|
+
learn(key: string, route: invocation.Route, credential: string | undefined, sourceCredential?: string, now?: number): Promise<LearnedRoute>;
|
|
18
33
|
delete(key: string): void;
|
|
34
|
+
/** Clear this Session's memory without deleting caller-owned persistent state. */
|
|
19
35
|
clear(): void;
|
|
36
|
+
private invalidate;
|
|
37
|
+
private reserve;
|
|
38
|
+
private restore;
|
|
39
|
+
private restoreInput;
|
|
40
|
+
private persist;
|
|
20
41
|
}
|
|
21
|
-
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -1,12 +1,18 @@
|
|
|
1
|
+
import { invocation } from '@astrale-os/kernel-protocol';
|
|
1
2
|
import { DEFAULT_MAXIMUM_ROUTES } from '../context/index.js';
|
|
2
|
-
|
|
3
|
+
const DESTINATION_CREDENTIAL_REFRESH_SKEW_MS = 5_000;
|
|
4
|
+
/** Confidential warm routing state owned by exactly one ClientSession. */
|
|
3
5
|
export class RouteCache {
|
|
4
6
|
maximumAgeMs;
|
|
5
7
|
maximumSize;
|
|
6
8
|
entries = new Map();
|
|
7
|
-
|
|
9
|
+
keyTokens = new Map();
|
|
10
|
+
store;
|
|
11
|
+
constructor(maximumAgeMs, maximumSize = DEFAULT_MAXIMUM_ROUTES, store) {
|
|
8
12
|
this.maximumAgeMs = maximumAgeMs;
|
|
9
13
|
this.maximumSize = maximumSize;
|
|
14
|
+
this.store = store === undefined ? undefined : captureSessionRouteStore(store);
|
|
15
|
+
this.restore();
|
|
10
16
|
}
|
|
11
17
|
async key(source, call, auth, expected) {
|
|
12
18
|
const credential = auth.credential === undefined ? 'anonymous' : await digestText(auth.credential);
|
|
@@ -19,21 +25,33 @@ export class RouteCache {
|
|
|
19
25
|
expected === undefined ? null : [expected.origin, expected.revision],
|
|
20
26
|
]);
|
|
21
27
|
}
|
|
22
|
-
get(key, now = Date.now()) {
|
|
23
|
-
const
|
|
24
|
-
if (
|
|
28
|
+
async get(key, sourceCredential, now = Date.now()) {
|
|
29
|
+
const cached = this.entries.get(key);
|
|
30
|
+
if (cached === undefined)
|
|
25
31
|
return undefined;
|
|
26
|
-
|
|
27
|
-
|
|
32
|
+
const token = this.keyTokens.get(key);
|
|
33
|
+
if (cached.learned.expiresAt <= now) {
|
|
34
|
+
this.invalidate(key);
|
|
28
35
|
return undefined;
|
|
29
36
|
}
|
|
37
|
+
if (cached.integrity !== undefined) {
|
|
38
|
+
const matches = sourceCredential !== undefined &&
|
|
39
|
+
(await matchesIntegrity(sourceCredential, key, cached.sealed ?? cached.learned, cached.integrity));
|
|
40
|
+
if (this.keyTokens.get(key) !== token || this.entries.get(key) !== cached) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
if (!matches) {
|
|
44
|
+
this.invalidate(key);
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
30
48
|
this.entries.delete(key);
|
|
31
|
-
this.entries.set(key,
|
|
32
|
-
return
|
|
49
|
+
this.entries.set(key, cached);
|
|
50
|
+
return cached.learned;
|
|
33
51
|
}
|
|
34
|
-
learn(key, route, credential, now = Date.now()) {
|
|
52
|
+
async learn(key, route, credential, sourceCredential, now = Date.now()) {
|
|
35
53
|
const credentialExpiry = credential === undefined ? undefined : jwtExpiry(credential);
|
|
36
|
-
const expiresAt = Math.min(now + this.maximumAgeMs, credentialExpiry
|
|
54
|
+
const expiresAt = Math.min(now + this.maximumAgeMs, refreshBoundary(credentialExpiry));
|
|
37
55
|
const entry = Object.freeze({
|
|
38
56
|
route,
|
|
39
57
|
...(credential === undefined ? {} : { credential }),
|
|
@@ -44,22 +62,203 @@ export class RouteCache {
|
|
|
44
62
|
return entry;
|
|
45
63
|
if (expiresAt <= now)
|
|
46
64
|
return entry;
|
|
65
|
+
const token = this.reserve(key);
|
|
66
|
+
let integrity;
|
|
67
|
+
if (this.store !== undefined && sourceCredential !== undefined) {
|
|
68
|
+
try {
|
|
69
|
+
integrity = await routeIntegrity(sourceCredential, key, entry);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
// Integrity support is a persistence optimization; the learned route remains usable in memory.
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (this.keyTokens.get(key) !== token) {
|
|
76
|
+
return entry;
|
|
77
|
+
}
|
|
47
78
|
this.entries.delete(key);
|
|
48
79
|
while (this.entries.size >= this.maximumSize) {
|
|
49
80
|
const oldest = this.entries.keys().next().value;
|
|
50
81
|
if (oldest === undefined)
|
|
51
82
|
break;
|
|
52
83
|
this.entries.delete(oldest);
|
|
84
|
+
this.keyTokens.delete(oldest);
|
|
53
85
|
}
|
|
54
|
-
this.entries.set(key,
|
|
86
|
+
this.entries.set(key, Object.freeze({
|
|
87
|
+
learned: entry,
|
|
88
|
+
...(integrity === undefined ? {} : { sealed: entry, integrity }),
|
|
89
|
+
}));
|
|
90
|
+
this.persist();
|
|
55
91
|
return entry;
|
|
56
92
|
}
|
|
57
93
|
delete(key) {
|
|
58
|
-
this.
|
|
94
|
+
this.invalidate(key);
|
|
59
95
|
}
|
|
96
|
+
/** Clear this Session's memory without deleting caller-owned persistent state. */
|
|
60
97
|
clear() {
|
|
98
|
+
this.keyTokens.clear();
|
|
61
99
|
this.entries.clear();
|
|
62
100
|
}
|
|
101
|
+
invalidate(key) {
|
|
102
|
+
this.keyTokens.delete(key);
|
|
103
|
+
if (this.entries.delete(key))
|
|
104
|
+
this.persist();
|
|
105
|
+
}
|
|
106
|
+
reserve(key) {
|
|
107
|
+
const token = Object.freeze({});
|
|
108
|
+
this.keyTokens.set(key, token);
|
|
109
|
+
return token;
|
|
110
|
+
}
|
|
111
|
+
restore(now = Date.now()) {
|
|
112
|
+
if (this.store === undefined)
|
|
113
|
+
return;
|
|
114
|
+
try {
|
|
115
|
+
this.restoreInput(this.store.read(), now);
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
this.keyTokens.clear();
|
|
119
|
+
this.entries.clear();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
restoreInput(input, now) {
|
|
123
|
+
if (input === undefined)
|
|
124
|
+
return;
|
|
125
|
+
if (typeof input !== 'object' || input === null || Array.isArray(input))
|
|
126
|
+
return;
|
|
127
|
+
const artifact = input;
|
|
128
|
+
if (artifact.version !== 1 ||
|
|
129
|
+
typeof artifact.entries !== 'object' ||
|
|
130
|
+
artifact.entries === null ||
|
|
131
|
+
Array.isArray(artifact.entries)) {
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
let count = 0;
|
|
135
|
+
for (const key in artifact.entries) {
|
|
136
|
+
if (!Object.hasOwn(artifact.entries, key))
|
|
137
|
+
continue;
|
|
138
|
+
count += 1;
|
|
139
|
+
if (count > this.maximumSize) {
|
|
140
|
+
this.keyTokens.clear();
|
|
141
|
+
this.entries.clear();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const value = Reflect.get(artifact.entries, key);
|
|
145
|
+
const entry = admitStoredEntry(value, now, this.maximumAgeMs);
|
|
146
|
+
if (entry === undefined)
|
|
147
|
+
continue;
|
|
148
|
+
this.reserve(key);
|
|
149
|
+
this.entries.set(key, entry);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
persist() {
|
|
153
|
+
if (this.store === undefined)
|
|
154
|
+
return;
|
|
155
|
+
const entries = Object.fromEntries([...this.entries].flatMap(([key, cached]) => cached.integrity === undefined
|
|
156
|
+
? []
|
|
157
|
+
: [
|
|
158
|
+
[
|
|
159
|
+
key,
|
|
160
|
+
Object.freeze({
|
|
161
|
+
...(cached.sealed ?? cached.learned),
|
|
162
|
+
integrity: cached.integrity,
|
|
163
|
+
}),
|
|
164
|
+
],
|
|
165
|
+
]));
|
|
166
|
+
try {
|
|
167
|
+
this.store.write(Object.freeze({ version: 1, entries: Object.freeze(entries) }));
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// A cache-store outage must not turn a valid invocation into a product failure.
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
function captureSessionRouteStore(input) {
|
|
175
|
+
if (input === null ||
|
|
176
|
+
typeof input !== 'object' ||
|
|
177
|
+
typeof input.read !== 'function' ||
|
|
178
|
+
typeof input.write !== 'function') {
|
|
179
|
+
throw new TypeError('Session route store capability is invalid.');
|
|
180
|
+
}
|
|
181
|
+
const read = input.read;
|
|
182
|
+
const write = input.write;
|
|
183
|
+
return Object.freeze({
|
|
184
|
+
read: () => read.call(input),
|
|
185
|
+
write: (artifact) => write.call(input, artifact),
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
function admitStoredEntry(input, now, maximumAgeMs) {
|
|
189
|
+
try {
|
|
190
|
+
if (typeof input !== 'object' || input === null || Array.isArray(input))
|
|
191
|
+
return undefined;
|
|
192
|
+
const value = input;
|
|
193
|
+
if ((value.credential !== undefined && typeof value.credential !== 'string') ||
|
|
194
|
+
typeof value.expiresAt !== 'number' ||
|
|
195
|
+
!Number.isSafeInteger(value.expiresAt) ||
|
|
196
|
+
typeof value.integrity !== 'string' ||
|
|
197
|
+
!/^[A-Za-z0-9_-]{43}$/u.test(value.integrity)) {
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
const credentialExpiry = value.credential === undefined ? undefined : jwtExpiry(value.credential);
|
|
201
|
+
if (value.credential !== undefined && credentialExpiry === undefined)
|
|
202
|
+
return undefined;
|
|
203
|
+
const sealed = Object.freeze({
|
|
204
|
+
route: invocation.acceptRoute(value.route),
|
|
205
|
+
...(value.credential === undefined ? {} : { credential: value.credential }),
|
|
206
|
+
expiresAt: value.expiresAt,
|
|
207
|
+
});
|
|
208
|
+
const expiresAt = Math.min(value.expiresAt, now + maximumAgeMs, refreshBoundary(credentialExpiry));
|
|
209
|
+
if (expiresAt <= now)
|
|
210
|
+
return undefined;
|
|
211
|
+
return Object.freeze({
|
|
212
|
+
learned: Object.freeze({
|
|
213
|
+
route: sealed.route,
|
|
214
|
+
...(sealed.credential === undefined ? {} : { credential: sealed.credential }),
|
|
215
|
+
expiresAt,
|
|
216
|
+
}),
|
|
217
|
+
sealed,
|
|
218
|
+
integrity: value.integrity,
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
return undefined;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function refreshBoundary(credentialExpiry) {
|
|
226
|
+
return credentialExpiry === undefined
|
|
227
|
+
? Number.POSITIVE_INFINITY
|
|
228
|
+
: credentialExpiry - DESTINATION_CREDENTIAL_REFRESH_SKEW_MS;
|
|
229
|
+
}
|
|
230
|
+
async function routeIntegrity(sourceCredential, key, learned) {
|
|
231
|
+
const webCrypto = typeof crypto === 'undefined' ? undefined : crypto;
|
|
232
|
+
if (webCrypto?.subtle === undefined) {
|
|
233
|
+
throw new TypeError('Persistent Session route integrity requires Web Crypto HMAC support.');
|
|
234
|
+
}
|
|
235
|
+
const algorithm = Object.freeze({ name: 'HMAC', hash: 'SHA-256' });
|
|
236
|
+
const cryptographicKey = await webCrypto.subtle.importKey('raw', new TextEncoder().encode(sourceCredential), algorithm, false, ['sign']);
|
|
237
|
+
const signature = await webCrypto.subtle.sign(algorithm, cryptographicKey, new TextEncoder().encode(integrityMaterial(key, learned)));
|
|
238
|
+
return encodeBase64Url(new Uint8Array(signature));
|
|
239
|
+
}
|
|
240
|
+
async function matchesIntegrity(sourceCredential, key, learned, expected) {
|
|
241
|
+
try {
|
|
242
|
+
return (await routeIntegrity(sourceCredential, key, learned)) === expected;
|
|
243
|
+
}
|
|
244
|
+
catch {
|
|
245
|
+
return false;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function integrityMaterial(key, learned) {
|
|
249
|
+
return JSON.stringify({
|
|
250
|
+
version: 1,
|
|
251
|
+
key,
|
|
252
|
+
route: learned.route,
|
|
253
|
+
...(learned.credential === undefined ? {} : { credential: learned.credential }),
|
|
254
|
+
expiresAt: learned.expiresAt,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
function encodeBase64Url(input) {
|
|
258
|
+
let binary = '';
|
|
259
|
+
for (const byte of input)
|
|
260
|
+
binary += String.fromCharCode(byte);
|
|
261
|
+
return globalThis.btoa(binary).replace(/\+/gu, '-').replace(/\//gu, '_').replace(/=+$/gu, '');
|
|
63
262
|
}
|
|
64
263
|
function canonicalDelegate(input) {
|
|
65
264
|
return JSON.stringify({
|
|
@@ -83,10 +282,11 @@ function canonicalExpr(input) {
|
|
|
83
282
|
return { kind: input.kind, operands: input.operands.map(canonicalExpr) };
|
|
84
283
|
}
|
|
85
284
|
async function digestText(input) {
|
|
86
|
-
|
|
285
|
+
const webCrypto = typeof crypto === 'undefined' ? undefined : crypto;
|
|
286
|
+
if (webCrypto?.subtle === undefined) {
|
|
87
287
|
throw new TypeError('Session route caching requires Web Crypto SHA-256 support.');
|
|
88
288
|
}
|
|
89
|
-
const bytes = await
|
|
289
|
+
const bytes = await webCrypto.subtle.digest('SHA-256', new TextEncoder().encode(input));
|
|
90
290
|
return [...new Uint8Array(bytes)].map((byte) => byte.toString(16).padStart(2, '0')).join('');
|
|
91
291
|
}
|
|
92
292
|
function jwtExpiry(input) {
|
|
@@ -113,4 +313,3 @@ function decodeBase64(input) {
|
|
|
113
313
|
}
|
|
114
314
|
throw new TypeError('Session route caching requires base64 decoding support.');
|
|
115
315
|
}
|
|
116
|
-
//# sourceMappingURL=cache.js.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { IssuerId } from '@astrale-os/kernel-core/auth/issuer';
|
|
2
2
|
import type { Call, Result } from '../../client/index.js';
|
|
3
3
|
import type { SessionOperation, SessionPolicy } from '../context/index.js';
|
|
4
|
-
import type { SessionDiscovery } from '../discovery/index.js';
|
|
5
4
|
import type { SessionAuth } from './auth.js';
|
|
6
5
|
import type { RouteCache } from './cache.js';
|
|
7
6
|
import type { ClientPoolCapability } from './envelope.js';
|
|
@@ -16,7 +15,6 @@ export interface SessionDispatcherOptions {
|
|
|
16
15
|
readonly cache: RouteCache;
|
|
17
16
|
readonly policy: Readonly<SessionPolicy>;
|
|
18
17
|
readonly envelopeTransport: SessionEnvelopeTransport;
|
|
19
|
-
readonly discovery: SessionDiscovery;
|
|
20
18
|
readonly requireOpen: () => void;
|
|
21
19
|
}
|
|
22
20
|
export declare class SessionDispatcher {
|
|
@@ -27,9 +25,7 @@ export declare class SessionDispatcher {
|
|
|
27
25
|
private followSource;
|
|
28
26
|
private dispatchDestinationWithRecovery;
|
|
29
27
|
private dispatchDestination;
|
|
30
|
-
private sourceKernel;
|
|
31
28
|
}
|
|
32
29
|
export declare function requireResultKind<Kind extends 'value' | 'stream' | 'binary'>(expected: Kind, result: Result): Extract<Result, {
|
|
33
30
|
kind: Kind;
|
|
34
31
|
}>;
|
|
35
|
-
//# sourceMappingURL=dispatch.d.ts.map
|
|
@@ -3,7 +3,7 @@ import { acceptCall, dispatchTrace, isAdmittedMissError, isAdmittedStaleRouteErr
|
|
|
3
3
|
import { ClientError, ResponseError } from '../../errors/index.js';
|
|
4
4
|
import { runSessionOperation, sessionTransportOptions, allowEndpoint } from '../context/index.js';
|
|
5
5
|
import { resolveAuth } from './auth.js';
|
|
6
|
-
import { selectEnvelope } from './envelope.js';
|
|
6
|
+
import { selectEnvelope, selectEnvelopeTarget } from './envelope.js';
|
|
7
7
|
export class SessionDispatcher {
|
|
8
8
|
state;
|
|
9
9
|
constructor(state) {
|
|
@@ -15,8 +15,8 @@ export class SessionDispatcher {
|
|
|
15
15
|
// Authority is resolved before warm lookup so changed credentials or delegation cannot reuse a
|
|
16
16
|
// carrier minted for a different caller partition.
|
|
17
17
|
const auth = await resolveAuth(this.state.auth, call, operation);
|
|
18
|
-
const source =
|
|
19
|
-
const cacheKey = await this.state.cache.key(source
|
|
18
|
+
const source = this.state.kernel;
|
|
19
|
+
const cacheKey = await this.state.cache.key(source, call, auth, expected);
|
|
20
20
|
const dispatch = Object.freeze({
|
|
21
21
|
call,
|
|
22
22
|
auth,
|
|
@@ -24,7 +24,16 @@ export class SessionDispatcher {
|
|
|
24
24
|
cacheKey,
|
|
25
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, expected, 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
|
}
|
|
@@ -46,16 +55,16 @@ export class SessionDispatcher {
|
|
|
46
55
|
if (result.kind !== 'redirect')
|
|
47
56
|
return result;
|
|
48
57
|
const redirect = result.redirect;
|
|
49
|
-
if (redirect.route.via.issuer !== state.source
|
|
58
|
+
if (redirect.route.via.issuer !== state.source) {
|
|
50
59
|
throw new ClientError('Redirect issuer differs from the session-pinned source Kernel identity.');
|
|
51
60
|
}
|
|
52
61
|
requireExpectedPublication(redirect.route, state.expected);
|
|
53
|
-
const learned = this.state.cache.learn(state.cacheKey, redirect.route, redirect.credential);
|
|
62
|
+
const learned = await this.state.cache.learn(state.cacheKey, redirect.route, redirect.credential, state.auth.credential);
|
|
54
63
|
return this.dispatchDestinationWithRecovery(learned, state, options, operation, redirect.trace);
|
|
55
64
|
}
|
|
56
65
|
async dispatchDestinationWithRecovery(learned, state, options, operation, trace) {
|
|
57
66
|
try {
|
|
58
|
-
return await this.dispatchDestination(learned, state.call, options, operation, state.expected, trace);
|
|
67
|
+
return await this.dispatchDestination(learned, state.call, options, operation, state.source, state.expected, trace);
|
|
59
68
|
}
|
|
60
69
|
catch (cause) {
|
|
61
70
|
const stale = isAdmittedStaleRouteError(cause);
|
|
@@ -79,8 +88,8 @@ export class SessionDispatcher {
|
|
|
79
88
|
return this.followSource(refreshed, state, options, operation);
|
|
80
89
|
}
|
|
81
90
|
}
|
|
82
|
-
async dispatchDestination(learned, call, options, operation, expected, trace) {
|
|
83
|
-
if (learned.route.via.issuer !==
|
|
91
|
+
async dispatchDestination(learned, call, options, operation, source, expected, trace) {
|
|
92
|
+
if (learned.route.via.issuer !== source) {
|
|
84
93
|
throw new ClientError('Learned route issuer differs from the session-pinned source Kernel.');
|
|
85
94
|
}
|
|
86
95
|
requireExpectedPublication(learned.route, expected);
|
|
@@ -97,13 +106,13 @@ export class SessionDispatcher {
|
|
|
97
106
|
}
|
|
98
107
|
return result;
|
|
99
108
|
}
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
return Object.freeze({ issuer: snapshot.publication.identity.issuer });
|
|
109
|
+
}
|
|
110
|
+
function requireCachedRoute(learned, source, expected, envelopeTransport, websocketAvailable, policy) {
|
|
111
|
+
if (learned.route.via.issuer !== source) {
|
|
112
|
+
throw new ClientError('Learned route issuer differs from the session-pinned source Kernel.');
|
|
106
113
|
}
|
|
114
|
+
requireExpectedPublication(learned.route, expected);
|
|
115
|
+
selectEnvelopeTarget(learned.route.endpoint, envelopeTransport, websocketAvailable, policy);
|
|
107
116
|
}
|
|
108
117
|
function isRouteCompatibilityConflict(input) {
|
|
109
118
|
if (!(input instanceof ResponseError))
|
|
@@ -113,8 +122,7 @@ function isRouteCompatibilityConflict(input) {
|
|
|
113
122
|
message: input.message,
|
|
114
123
|
...(input.data === undefined ? {} : { data: input.data }),
|
|
115
124
|
});
|
|
116
|
-
return (failure?.data.code === invocationProtocol.
|
|
117
|
-
failure?.data.code === invocationProtocol.SCHEMA_REVISION_MISMATCH ||
|
|
125
|
+
return (failure?.data.code === invocationProtocol.SCHEMA_REVISION_MISMATCH ||
|
|
118
126
|
failure?.data.code === invocationProtocol.SERVICE_TRUST_REQUIRED);
|
|
119
127
|
}
|
|
120
128
|
function requireExpectedPublication(route, expected) {
|
|
@@ -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,6 @@
|
|
|
1
|
-
import type { Key,
|
|
1
|
+
import type { Key, Revision } from '@astrale-os/kernel-dsl/v1';
|
|
2
2
|
/** Private static-consumer expectation carried only by ClientSession.invoke. */
|
|
3
3
|
export interface SchemaExpectation {
|
|
4
4
|
readonly origin: Key.Origin;
|
|
5
|
-
readonly revision:
|
|
5
|
+
readonly revision: Revision;
|
|
6
6
|
}
|
|
7
|
-
//# sourceMappingURL=expectation.d.ts.map
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
export { admitSessionAuth, resolveAuth, type Auth, type EffectiveAuth, type SessionAuth, } from './auth.js';
|
|
2
2
|
export type { SchemaExpectation } from './expectation.js';
|
|
3
|
-
export { RouteCache, type LearnedRoute } from './cache.js';
|
|
3
|
+
export { RouteCache, type LearnedRoute, type PersistedRoute, type SessionRouteArtifact, type SessionRouteStore, } from './cache.js';
|
|
4
4
|
export { requireResultKind, SessionDispatcher, type SessionDispatcherOptions } from './dispatch.js';
|
|
5
5
|
export { type ClientPoolCapability, type EnvelopeSelection } from './envelope.js';
|
|
6
6
|
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
|