@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,10 +1,12 @@
|
|
|
1
1
|
import type { IssuerId } from '@astrale-os/kernel-core/auth/issuer';
|
|
2
|
+
import type { publication } from '@astrale-os/kernel-protocol';
|
|
2
3
|
import type { Fetch } from '../../transport/http/index.js';
|
|
3
4
|
import type { SessionOperation, SessionPolicy } from '../context/index.js';
|
|
4
5
|
import type { SessionSnapshot } from './snapshot.js';
|
|
5
6
|
export type { SessionSnapshot } from './snapshot.js';
|
|
6
7
|
export interface SessionDiscovery {
|
|
7
8
|
readonly kernel: IssuerId;
|
|
9
|
+
publication(operation: SessionOperation): Promise<publication.Publication>;
|
|
8
10
|
snapshot(operation: SessionOperation): Promise<SessionSnapshot>;
|
|
9
11
|
clear(): void;
|
|
10
12
|
}
|
|
@@ -18,4 +20,3 @@ export interface SessionDiscoveryOptions {
|
|
|
18
20
|
readonly acquisitionOperation: () => SessionOperation;
|
|
19
21
|
}
|
|
20
22
|
export declare function createSessionDiscovery(options: SessionDiscoveryOptions): SessionDiscovery;
|
|
21
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -21,4 +21,3 @@ export declare class PublicationDiscovery {
|
|
|
21
21
|
}
|
|
22
22
|
export declare function boundedResponse(response: Response, maximum: number, signal: AbortSignal): Promise<Uint8Array>;
|
|
23
23
|
export declare function requireExactResponse(response: Response, expected: string, label: string): void;
|
|
24
|
-
//# sourceMappingURL=publication.d.ts.map
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import * as codecs from '@astrale-os/kernel-protocol/codecs';
|
|
2
2
|
import * as publicationCodec from '@astrale-os/kernel-protocol/publication/publication';
|
|
3
3
|
import { ClientError } from '../../errors/index.js';
|
|
4
|
-
import { allowEndpoint
|
|
4
|
+
import { allowEndpoint } from '../context/index.js';
|
|
5
|
+
import { runAcquisition } from './transport.js';
|
|
5
6
|
export class PublicationDiscovery {
|
|
6
7
|
options;
|
|
7
8
|
publication;
|
|
@@ -29,7 +30,7 @@ export class PublicationDiscovery {
|
|
|
29
30
|
async fetch(operation, previous) {
|
|
30
31
|
const url = publicationCodec.url(this.options.kernel);
|
|
31
32
|
allowEndpoint(url, this.options.policy);
|
|
32
|
-
const response = await
|
|
33
|
+
const response = await runAcquisition(operation, 'publication', 'unknown', 'Kernel Publication could not be retrieved.', (signal) => this.options.fetch(url, {
|
|
33
34
|
headers: {
|
|
34
35
|
accept: 'application/json',
|
|
35
36
|
...(previous === undefined ? {} : { 'if-none-match': `"${previous.etag}"` }),
|
|
@@ -51,7 +52,7 @@ export class PublicationDiscovery {
|
|
|
51
52
|
if (!response.ok) {
|
|
52
53
|
throw new ClientError(`Publication discovery returned HTTP ${response.status}.`);
|
|
53
54
|
}
|
|
54
|
-
const body = await
|
|
55
|
+
const body = await runAcquisition(operation, 'publication', 'receive', 'Kernel Publication response could not be read.', (signal) => boundedResponse(response, this.options.maximumBytes, signal));
|
|
55
56
|
const admitted = publicationCodec.accept(codecs.json.decode(body));
|
|
56
57
|
if (admitted.identity.issuer !== this.options.kernel) {
|
|
57
58
|
throw new ClientError('Publication issuer differs from the requested Kernel issuer.');
|
|
@@ -120,4 +121,3 @@ function join(parts, length) {
|
|
|
120
121
|
}
|
|
121
122
|
return output;
|
|
122
123
|
}
|
|
123
|
-
//# sourceMappingURL=publication.js.map
|
|
@@ -10,4 +10,3 @@ export interface SessionSnapshot {
|
|
|
10
10
|
readonly views: ViewCatalog;
|
|
11
11
|
}
|
|
12
12
|
export declare function createSessionSnapshot(kernel: IssuerId, publication: publication.Publication, artifact: bundle.Bundle, views: ViewCatalog): SessionSnapshot;
|
|
13
|
-
//# sourceMappingURL=snapshot.d.ts.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { TransportPhase } from '../../errors/index.js';
|
|
2
|
+
import type { SessionOperation } from '../context/index.js';
|
|
3
|
+
type AcquisitionResource = 'publication' | 'bundle';
|
|
4
|
+
/** Normalize only unknown failures from one injected acquisition capability. */
|
|
5
|
+
export declare function runAcquisition<Result>(operation: SessionOperation, resource: AcquisitionResource, phase: Extract<TransportPhase, 'receive' | 'unknown'>, message: string, task: (signal: AbortSignal) => Result | PromiseLike<Result>): Promise<Result>;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ClientError, TransportError } from '../../errors/index.js';
|
|
2
|
+
import { runSessionOperation } from '../context/index.js';
|
|
3
|
+
/** Normalize only unknown failures from one injected acquisition capability. */
|
|
4
|
+
export async function runAcquisition(operation, resource, phase, message, task) {
|
|
5
|
+
try {
|
|
6
|
+
return await runSessionOperation(operation, task);
|
|
7
|
+
}
|
|
8
|
+
catch (cause) {
|
|
9
|
+
if (cause instanceof ClientError)
|
|
10
|
+
throw cause;
|
|
11
|
+
throw TransportError.acquisition(message, { cause, phase, resource });
|
|
12
|
+
}
|
|
13
|
+
}
|
package/dist/session/index.d.ts
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
export type { SessionControlOptions, SessionPolicy } from './context/index.js';
|
|
2
|
-
export type
|
|
2
|
+
export { bindSession, type BoundClientSession, type BoundSessionControls, type BoundSessionSource, } from './bound.js';
|
|
3
3
|
export type { SessionSnapshot } from './discovery/index.js';
|
|
4
|
-
export type { Auth, SessionAuth, SessionEnvelopeTransport, SessionRequestOptions, } from './routing/index.js';
|
|
4
|
+
export type { Auth, PersistedRoute, SessionRouteArtifact, SessionRouteStore, SessionAuth, SessionEnvelopeTransport, SessionRequestOptions, } from './routing/index.js';
|
|
5
5
|
export { ClientSession, connect, type ClientSessionOptions, type ConnectOptions, } from './session.js';
|
|
6
6
|
export type { CallableReference, InputOfReference, InstanceCallableReference, OutputOfReference, } from './reference.js';
|
|
7
|
+
export { reference } from './reference.js';
|
|
7
8
|
export type { ResolvedView, ViewCatalog } from './views/index.js';
|
|
8
|
-
|
|
9
|
+
export type { DomainBinding } from '../graph/domain/index.js';
|
package/dist/session/index.js
CHANGED
|
@@ -1,27 +1,35 @@
|
|
|
1
1
|
import type { Path as PathValue, PathLike } from '@astrale-os/kernel-core/path';
|
|
2
|
-
import type {
|
|
2
|
+
import type { CallableInputOf, CallableOutputOf, CallableResultOf, Domain, ResolvedFunction, ExecutableMethod } from '@astrale-os/kernel-dsl/v1';
|
|
3
|
+
import type { Revision } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
3
4
|
import { type Key as KeyType } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
4
|
-
import type {
|
|
5
|
+
import type { Binary, Input } from '../client/index.js';
|
|
5
6
|
declare const REFERENCE_INPUT: unique symbol;
|
|
6
7
|
declare const REFERENCE_OUTPUT: unique symbol;
|
|
7
|
-
export interface CallableReference<InputValue
|
|
8
|
+
export interface CallableReference<InputValue = Input, Output = unknown> {
|
|
8
9
|
readonly origin: KeyType.Origin;
|
|
9
10
|
readonly revision: Revision;
|
|
10
11
|
readonly callable: KeyType.Callable;
|
|
11
12
|
readonly target: PathValue;
|
|
12
|
-
readonly outputMode:
|
|
13
|
+
readonly outputMode: 'value' | 'stream' | 'binary';
|
|
13
14
|
readonly [REFERENCE_INPUT]?: InputValue;
|
|
14
15
|
readonly [REFERENCE_OUTPUT]?: Output;
|
|
15
16
|
}
|
|
16
|
-
export interface InstanceCallableReference<InputValue
|
|
17
|
+
export interface InstanceCallableReference<InputValue = Input, Output = unknown> {
|
|
17
18
|
(receiver: PathLike): CallableReference<InputValue, Output>;
|
|
18
19
|
readonly origin: KeyType.Origin;
|
|
19
20
|
readonly revision: Revision;
|
|
20
21
|
readonly callable: KeyType.Callable;
|
|
21
|
-
readonly outputMode:
|
|
22
|
+
readonly outputMode: 'value' | 'stream' | 'binary';
|
|
22
23
|
}
|
|
23
|
-
export type InputOfReference<Reference extends CallableReference
|
|
24
|
-
export type OutputOfReference<Reference extends CallableReference
|
|
25
|
-
|
|
24
|
+
export type InputOfReference<Reference extends CallableReference<unknown>> = Reference extends CallableReference<infer InputValue, unknown> ? InputValue : never;
|
|
25
|
+
export type OutputOfReference<Reference extends CallableReference<unknown>> = Reference extends CallableReference<infer _Input, infer Output> ? Output : never;
|
|
26
|
+
type ReferenceInput<Callable> = unknown extends CallableInputOf<Callable> ? Input : CallableInputOf<Callable>;
|
|
27
|
+
type ReferenceOutput<Callable> = unknown extends CallableOutputOf<Callable> ? unknown : CallableResultOf<Callable, Binary>;
|
|
28
|
+
type ExecutableStaticMethod = ExecutableMethod<unknown, unknown, true>;
|
|
29
|
+
type ExecutableInstanceMethod = ExecutableMethod<unknown, unknown, false>;
|
|
30
|
+
/** Project one exact resolved Function or static Method into a typed Client reference. */
|
|
31
|
+
export declare function reference<const Callable extends ResolvedFunction | ExecutableStaticMethod>(domain: Pick<Domain, 'origin' | 'revision'>, callable: Callable): CallableReference<ReferenceInput<Callable>, ReferenceOutput<Callable>>;
|
|
32
|
+
/** Project one exact resolved instance Method into a receiver-bound typed Client reference. */
|
|
33
|
+
export declare function reference<const Callable extends ExecutableInstanceMethod>(domain: Pick<Domain, 'origin' | 'revision'>, callable: Callable): InstanceCallableReference<ReferenceInput<Callable>, ReferenceOutput<Callable>>;
|
|
34
|
+
export declare function admitReference(input: CallableReference<unknown>): CallableReference<unknown>;
|
|
26
35
|
export {};
|
|
27
|
-
//# sourceMappingURL=reference.d.ts.map
|
|
@@ -1,5 +1,28 @@
|
|
|
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 (Key.origin(callable.key) !== domain.origin)
|
|
5
|
+
invalid();
|
|
6
|
+
if ('owner' in callable && !callable.executable)
|
|
7
|
+
invalid();
|
|
8
|
+
const common = Object.freeze({
|
|
9
|
+
origin: domain.origin,
|
|
10
|
+
revision: domain.revision,
|
|
11
|
+
callable: callable.key,
|
|
12
|
+
outputMode: callable.output.mode,
|
|
13
|
+
});
|
|
14
|
+
if ('owner' in callable && !callable.static) {
|
|
15
|
+
const bind = (receiver) => admitReference({
|
|
16
|
+
...common,
|
|
17
|
+
target: Path.instanceMethod(Path.from(receiver), callable.key),
|
|
18
|
+
});
|
|
19
|
+
return Object.assign(bind, common);
|
|
20
|
+
}
|
|
21
|
+
const target = 'owner' in callable
|
|
22
|
+
? Path.staticMethod(Path.project(callable.owner.ref), callable.name)
|
|
23
|
+
: Path.project(callable.ref);
|
|
24
|
+
return admitReference({ ...common, target });
|
|
25
|
+
}
|
|
3
26
|
export function admitReference(input) {
|
|
4
27
|
if (input === null || typeof input !== 'object')
|
|
5
28
|
invalid();
|
|
@@ -24,21 +47,21 @@ export function admitReference(input) {
|
|
|
24
47
|
});
|
|
25
48
|
}
|
|
26
49
|
function matchesCallable(target, callable) {
|
|
27
|
-
const
|
|
50
|
+
const coordinate = callableAddress(callable);
|
|
28
51
|
const { anchor, steps } = target.ast;
|
|
29
52
|
const last = steps.at(-1);
|
|
30
|
-
if (
|
|
31
|
-
if (last?.kind !== 'method' || last.name !==
|
|
53
|
+
if (coordinate.kind === 'method') {
|
|
54
|
+
if (last?.kind !== 'method' || last.name !== coordinate.name)
|
|
32
55
|
return false;
|
|
33
56
|
if (last.dispatch === 'instance')
|
|
34
|
-
return
|
|
57
|
+
return last.class === Key.of(coordinate.owner);
|
|
35
58
|
const owner = steps.at(-2);
|
|
36
59
|
return (anchor.kind === 'domain' &&
|
|
37
60
|
anchor.origin === Key.origin(callable) &&
|
|
38
61
|
steps.length === 2 &&
|
|
39
62
|
owner?.kind === 'projection' &&
|
|
40
|
-
owner.projection.kind ===
|
|
41
|
-
owner.projection.name ===
|
|
63
|
+
owner.projection.kind === 'class' &&
|
|
64
|
+
owner.projection.name === coordinate.owner.name);
|
|
42
65
|
}
|
|
43
66
|
const projection = steps[0];
|
|
44
67
|
return (anchor.kind === 'domain' &&
|
|
@@ -46,9 +69,8 @@ function matchesCallable(target, callable) {
|
|
|
46
69
|
steps.length === 1 &&
|
|
47
70
|
projection?.kind === 'projection' &&
|
|
48
71
|
projection.projection.kind === 'function' &&
|
|
49
|
-
projection.projection.name ===
|
|
72
|
+
projection.projection.name === coordinate.name);
|
|
50
73
|
}
|
|
51
74
|
function invalid() {
|
|
52
75
|
throw new TypeError('Callable reference is invalid.');
|
|
53
76
|
}
|
|
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,21 +1,40 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { invocation } from '@astrale-os/kernel-protocol';
|
|
2
2
|
import type { EffectiveAuth } from './auth.js';
|
|
3
|
-
import type { SchemaExpectation } from './expectation.js';
|
|
4
3
|
export interface LearnedRoute {
|
|
5
4
|
readonly route: invocation.Route;
|
|
6
5
|
readonly credential?: string;
|
|
7
6
|
readonly expiresAt: number;
|
|
8
7
|
}
|
|
9
|
-
|
|
8
|
+
export interface PersistedRoute extends LearnedRoute {
|
|
9
|
+
/** HMAC over this entry and its exact authority partition. */
|
|
10
|
+
readonly integrity: string;
|
|
11
|
+
}
|
|
12
|
+
export interface SessionRouteArtifact {
|
|
13
|
+
readonly version: 1;
|
|
14
|
+
readonly entries: Readonly<Record<string, PersistedRoute>>;
|
|
15
|
+
}
|
|
16
|
+
/** Caller-owned persistence for confidential route artifacts. */
|
|
17
|
+
export interface SessionRouteStore {
|
|
18
|
+
read(): unknown;
|
|
19
|
+
write(artifact: SessionRouteArtifact): void;
|
|
20
|
+
}
|
|
21
|
+
/** Confidential warm routing state owned by exactly one ClientSession. */
|
|
10
22
|
export declare class RouteCache {
|
|
11
23
|
private readonly maximumAgeMs;
|
|
12
24
|
private readonly maximumSize;
|
|
13
25
|
private readonly entries;
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
26
|
+
private readonly keyTokens;
|
|
27
|
+
private readonly store?;
|
|
28
|
+
constructor(maximumAgeMs: number, maximumSize?: number, store?: SessionRouteStore);
|
|
29
|
+
key(source: string, call: invocation.Call, auth: EffectiveAuth): Promise<string>;
|
|
30
|
+
get(key: string, sourceCredential?: string, now?: number): Promise<LearnedRoute | undefined>;
|
|
31
|
+
learn(key: string, route: invocation.Route, credential: string | undefined, sourceCredential?: string, now?: number): Promise<LearnedRoute>;
|
|
18
32
|
delete(key: string): void;
|
|
33
|
+
/** Clear this Session's memory without deleting caller-owned persistent state. */
|
|
19
34
|
clear(): void;
|
|
35
|
+
private invalidate;
|
|
36
|
+
private reserve;
|
|
37
|
+
private restore;
|
|
38
|
+
private restoreInput;
|
|
39
|
+
private persist;
|
|
20
40
|
}
|
|
21
|
-
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -1,39 +1,51 @@
|
|
|
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
|
-
async key(source, call, auth
|
|
17
|
+
async key(source, call, auth) {
|
|
12
18
|
const credential = auth.credential === undefined ? 'anonymous' : await digestText(auth.credential);
|
|
13
19
|
const delegate = auth.delegate === undefined ? 'anonymous' : await digestText(canonicalDelegate(auth.delegate));
|
|
14
|
-
return JSON.stringify([
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
expected === undefined ? null : [expected.origin, expected.revision],
|
|
20
|
-
]);
|
|
21
|
-
}
|
|
22
|
-
get(key, now = Date.now()) {
|
|
23
|
-
const entry = this.entries.get(key);
|
|
24
|
-
if (entry === undefined)
|
|
20
|
+
return JSON.stringify([source, call.target, credential, delegate]);
|
|
21
|
+
}
|
|
22
|
+
async get(key, sourceCredential, now = Date.now()) {
|
|
23
|
+
const cached = this.entries.get(key);
|
|
24
|
+
if (cached === undefined)
|
|
25
25
|
return undefined;
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
const token = this.keyTokens.get(key);
|
|
27
|
+
if (cached.learned.expiresAt <= now) {
|
|
28
|
+
this.invalidate(key);
|
|
28
29
|
return undefined;
|
|
29
30
|
}
|
|
31
|
+
if (cached.integrity !== undefined) {
|
|
32
|
+
const matches = sourceCredential !== undefined &&
|
|
33
|
+
(await matchesIntegrity(sourceCredential, key, cached.sealed ?? cached.learned, cached.integrity));
|
|
34
|
+
if (this.keyTokens.get(key) !== token || this.entries.get(key) !== cached) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
if (!matches) {
|
|
38
|
+
this.invalidate(key);
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
30
42
|
this.entries.delete(key);
|
|
31
|
-
this.entries.set(key,
|
|
32
|
-
return
|
|
43
|
+
this.entries.set(key, cached);
|
|
44
|
+
return cached.learned;
|
|
33
45
|
}
|
|
34
|
-
learn(key, route, credential, now = Date.now()) {
|
|
46
|
+
async learn(key, route, credential, sourceCredential, now = Date.now()) {
|
|
35
47
|
const credentialExpiry = credential === undefined ? undefined : jwtExpiry(credential);
|
|
36
|
-
const expiresAt = Math.min(now + this.maximumAgeMs, credentialExpiry
|
|
48
|
+
const expiresAt = Math.min(now + this.maximumAgeMs, refreshBoundary(credentialExpiry));
|
|
37
49
|
const entry = Object.freeze({
|
|
38
50
|
route,
|
|
39
51
|
...(credential === undefined ? {} : { credential }),
|
|
@@ -44,22 +56,203 @@ export class RouteCache {
|
|
|
44
56
|
return entry;
|
|
45
57
|
if (expiresAt <= now)
|
|
46
58
|
return entry;
|
|
59
|
+
const token = this.reserve(key);
|
|
60
|
+
let integrity;
|
|
61
|
+
if (this.store !== undefined && sourceCredential !== undefined) {
|
|
62
|
+
try {
|
|
63
|
+
integrity = await routeIntegrity(sourceCredential, key, entry);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
// Integrity support is a persistence optimization; the learned route remains usable in memory.
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (this.keyTokens.get(key) !== token) {
|
|
70
|
+
return entry;
|
|
71
|
+
}
|
|
47
72
|
this.entries.delete(key);
|
|
48
73
|
while (this.entries.size >= this.maximumSize) {
|
|
49
74
|
const oldest = this.entries.keys().next().value;
|
|
50
75
|
if (oldest === undefined)
|
|
51
76
|
break;
|
|
52
77
|
this.entries.delete(oldest);
|
|
78
|
+
this.keyTokens.delete(oldest);
|
|
53
79
|
}
|
|
54
|
-
this.entries.set(key,
|
|
80
|
+
this.entries.set(key, Object.freeze({
|
|
81
|
+
learned: entry,
|
|
82
|
+
...(integrity === undefined ? {} : { sealed: entry, integrity }),
|
|
83
|
+
}));
|
|
84
|
+
this.persist();
|
|
55
85
|
return entry;
|
|
56
86
|
}
|
|
57
87
|
delete(key) {
|
|
58
|
-
this.
|
|
88
|
+
this.invalidate(key);
|
|
59
89
|
}
|
|
90
|
+
/** Clear this Session's memory without deleting caller-owned persistent state. */
|
|
60
91
|
clear() {
|
|
92
|
+
this.keyTokens.clear();
|
|
61
93
|
this.entries.clear();
|
|
62
94
|
}
|
|
95
|
+
invalidate(key) {
|
|
96
|
+
this.keyTokens.delete(key);
|
|
97
|
+
if (this.entries.delete(key))
|
|
98
|
+
this.persist();
|
|
99
|
+
}
|
|
100
|
+
reserve(key) {
|
|
101
|
+
const token = Object.freeze({});
|
|
102
|
+
this.keyTokens.set(key, token);
|
|
103
|
+
return token;
|
|
104
|
+
}
|
|
105
|
+
restore(now = Date.now()) {
|
|
106
|
+
if (this.store === undefined)
|
|
107
|
+
return;
|
|
108
|
+
try {
|
|
109
|
+
this.restoreInput(this.store.read(), now);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
this.keyTokens.clear();
|
|
113
|
+
this.entries.clear();
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
restoreInput(input, now) {
|
|
117
|
+
if (input === undefined)
|
|
118
|
+
return;
|
|
119
|
+
if (typeof input !== 'object' || input === null || Array.isArray(input))
|
|
120
|
+
return;
|
|
121
|
+
const artifact = input;
|
|
122
|
+
if (artifact.version !== 1 ||
|
|
123
|
+
typeof artifact.entries !== 'object' ||
|
|
124
|
+
artifact.entries === null ||
|
|
125
|
+
Array.isArray(artifact.entries)) {
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
let count = 0;
|
|
129
|
+
for (const key in artifact.entries) {
|
|
130
|
+
if (!Object.hasOwn(artifact.entries, key))
|
|
131
|
+
continue;
|
|
132
|
+
count += 1;
|
|
133
|
+
if (count > this.maximumSize) {
|
|
134
|
+
this.keyTokens.clear();
|
|
135
|
+
this.entries.clear();
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const value = Reflect.get(artifact.entries, key);
|
|
139
|
+
const entry = admitStoredEntry(value, now, this.maximumAgeMs);
|
|
140
|
+
if (entry === undefined)
|
|
141
|
+
continue;
|
|
142
|
+
this.reserve(key);
|
|
143
|
+
this.entries.set(key, entry);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
persist() {
|
|
147
|
+
if (this.store === undefined)
|
|
148
|
+
return;
|
|
149
|
+
const entries = Object.fromEntries([...this.entries].flatMap(([key, cached]) => cached.integrity === undefined
|
|
150
|
+
? []
|
|
151
|
+
: [
|
|
152
|
+
[
|
|
153
|
+
key,
|
|
154
|
+
Object.freeze({
|
|
155
|
+
...(cached.sealed ?? cached.learned),
|
|
156
|
+
integrity: cached.integrity,
|
|
157
|
+
}),
|
|
158
|
+
],
|
|
159
|
+
]));
|
|
160
|
+
try {
|
|
161
|
+
this.store.write(Object.freeze({ version: 1, entries: Object.freeze(entries) }));
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// A cache-store outage must not turn a valid invocation into a product failure.
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
function captureSessionRouteStore(input) {
|
|
169
|
+
if (input === null ||
|
|
170
|
+
typeof input !== 'object' ||
|
|
171
|
+
typeof input.read !== 'function' ||
|
|
172
|
+
typeof input.write !== 'function') {
|
|
173
|
+
throw new TypeError('Session route store capability is invalid.');
|
|
174
|
+
}
|
|
175
|
+
const read = input.read;
|
|
176
|
+
const write = input.write;
|
|
177
|
+
return Object.freeze({
|
|
178
|
+
read: () => read.call(input),
|
|
179
|
+
write: (artifact) => write.call(input, artifact),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
function admitStoredEntry(input, now, maximumAgeMs) {
|
|
183
|
+
try {
|
|
184
|
+
if (typeof input !== 'object' || input === null || Array.isArray(input))
|
|
185
|
+
return undefined;
|
|
186
|
+
const value = input;
|
|
187
|
+
if ((value.credential !== undefined && typeof value.credential !== 'string') ||
|
|
188
|
+
typeof value.expiresAt !== 'number' ||
|
|
189
|
+
!Number.isSafeInteger(value.expiresAt) ||
|
|
190
|
+
typeof value.integrity !== 'string' ||
|
|
191
|
+
!/^[A-Za-z0-9_-]{43}$/u.test(value.integrity)) {
|
|
192
|
+
return undefined;
|
|
193
|
+
}
|
|
194
|
+
const credentialExpiry = value.credential === undefined ? undefined : jwtExpiry(value.credential);
|
|
195
|
+
if (value.credential !== undefined && credentialExpiry === undefined)
|
|
196
|
+
return undefined;
|
|
197
|
+
const sealed = Object.freeze({
|
|
198
|
+
route: invocation.acceptRoute(value.route),
|
|
199
|
+
...(value.credential === undefined ? {} : { credential: value.credential }),
|
|
200
|
+
expiresAt: value.expiresAt,
|
|
201
|
+
});
|
|
202
|
+
const expiresAt = Math.min(value.expiresAt, now + maximumAgeMs, refreshBoundary(credentialExpiry));
|
|
203
|
+
if (expiresAt <= now)
|
|
204
|
+
return undefined;
|
|
205
|
+
return Object.freeze({
|
|
206
|
+
learned: Object.freeze({
|
|
207
|
+
route: sealed.route,
|
|
208
|
+
...(sealed.credential === undefined ? {} : { credential: sealed.credential }),
|
|
209
|
+
expiresAt,
|
|
210
|
+
}),
|
|
211
|
+
sealed,
|
|
212
|
+
integrity: value.integrity,
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
catch {
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
function refreshBoundary(credentialExpiry) {
|
|
220
|
+
return credentialExpiry === undefined
|
|
221
|
+
? Number.POSITIVE_INFINITY
|
|
222
|
+
: credentialExpiry - DESTINATION_CREDENTIAL_REFRESH_SKEW_MS;
|
|
223
|
+
}
|
|
224
|
+
async function routeIntegrity(sourceCredential, key, learned) {
|
|
225
|
+
const webCrypto = typeof crypto === 'undefined' ? undefined : crypto;
|
|
226
|
+
if (webCrypto?.subtle === undefined) {
|
|
227
|
+
throw new TypeError('Persistent Session route integrity requires Web Crypto HMAC support.');
|
|
228
|
+
}
|
|
229
|
+
const algorithm = Object.freeze({ name: 'HMAC', hash: 'SHA-256' });
|
|
230
|
+
const cryptographicKey = await webCrypto.subtle.importKey('raw', new TextEncoder().encode(sourceCredential), algorithm, false, ['sign']);
|
|
231
|
+
const signature = await webCrypto.subtle.sign(algorithm, cryptographicKey, new TextEncoder().encode(integrityMaterial(key, learned)));
|
|
232
|
+
return encodeBase64Url(new Uint8Array(signature));
|
|
233
|
+
}
|
|
234
|
+
async function matchesIntegrity(sourceCredential, key, learned, expected) {
|
|
235
|
+
try {
|
|
236
|
+
return (await routeIntegrity(sourceCredential, key, learned)) === expected;
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return false;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function integrityMaterial(key, learned) {
|
|
243
|
+
return JSON.stringify({
|
|
244
|
+
version: 1,
|
|
245
|
+
key,
|
|
246
|
+
route: learned.route,
|
|
247
|
+
...(learned.credential === undefined ? {} : { credential: learned.credential }),
|
|
248
|
+
expiresAt: learned.expiresAt,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
function encodeBase64Url(input) {
|
|
252
|
+
let binary = '';
|
|
253
|
+
for (const byte of input)
|
|
254
|
+
binary += String.fromCharCode(byte);
|
|
255
|
+
return globalThis.btoa(binary).replace(/\+/gu, '-').replace(/\//gu, '_').replace(/=+$/gu, '');
|
|
63
256
|
}
|
|
64
257
|
function canonicalDelegate(input) {
|
|
65
258
|
return JSON.stringify({
|
|
@@ -83,10 +276,11 @@ function canonicalExpr(input) {
|
|
|
83
276
|
return { kind: input.kind, operands: input.operands.map(canonicalExpr) };
|
|
84
277
|
}
|
|
85
278
|
async function digestText(input) {
|
|
86
|
-
|
|
279
|
+
const webCrypto = typeof crypto === 'undefined' ? undefined : crypto;
|
|
280
|
+
if (webCrypto?.subtle === undefined) {
|
|
87
281
|
throw new TypeError('Session route caching requires Web Crypto SHA-256 support.');
|
|
88
282
|
}
|
|
89
|
-
const bytes = await
|
|
283
|
+
const bytes = await webCrypto.subtle.digest('SHA-256', new TextEncoder().encode(input));
|
|
90
284
|
return [...new Uint8Array(bytes)].map((byte) => byte.toString(16).padStart(2, '0')).join('');
|
|
91
285
|
}
|
|
92
286
|
function jwtExpiry(input) {
|
|
@@ -113,4 +307,3 @@ function decodeBase64(input) {
|
|
|
113
307
|
}
|
|
114
308
|
throw new TypeError('Session route caching requires base64 decoding support.');
|
|
115
309
|
}
|
|
116
|
-
//# sourceMappingURL=cache.js.map
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import type { IssuerId } from '@astrale-os/kernel-core/auth/issuer';
|
|
2
|
-
import type {
|
|
2
|
+
import type { 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';
|
|
8
|
-
import type { SchemaExpectation } from './expectation.js';
|
|
9
7
|
import type { SessionEnvelopeTransport, SessionRequestOptions } from './request.js';
|
|
8
|
+
import { acceptCall } from '../../client/index.js';
|
|
10
9
|
export interface SessionDispatcherOptions {
|
|
11
10
|
readonly kernel: IssuerId;
|
|
12
11
|
readonly sourceEndpoint: string;
|
|
@@ -16,20 +15,17 @@ 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 {
|
|
23
21
|
private readonly state;
|
|
24
22
|
constructor(state: SessionDispatcherOptions);
|
|
25
|
-
dispatch(input:
|
|
23
|
+
dispatch(input: Parameters<typeof acceptCall>[0], options: SessionRequestOptions, operation: SessionOperation): Promise<Result>;
|
|
26
24
|
private dispatchSource;
|
|
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
|