@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
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { NodeId } from '@astrale-os/kernel-core/graph/node';
|
|
2
|
+
import { Query, QueryAST } from '@astrale-os/kernel-core/graph/query';
|
|
3
|
+
import { Path } from '@astrale-os/kernel-core/path';
|
|
4
|
+
import { schema } from '@astrale-os/kernel-dsl/v1';
|
|
5
|
+
import { defineSchema, edgeClass, method, nodeClass, property, valueSchema, } from '@astrale-os/kernel-dsl/v1/builder';
|
|
6
|
+
const Resource = nodeClass({
|
|
7
|
+
abstract: true,
|
|
8
|
+
properties: {
|
|
9
|
+
title: property(valueSchema()({ type: 'string' }), { required: true }),
|
|
10
|
+
},
|
|
11
|
+
methods: {
|
|
12
|
+
rename: method({
|
|
13
|
+
auth: 'authenticated',
|
|
14
|
+
input: valueSchema()({
|
|
15
|
+
type: 'object',
|
|
16
|
+
properties: { title: { type: 'string' } },
|
|
17
|
+
required: ['title'],
|
|
18
|
+
additionalProperties: false,
|
|
19
|
+
}),
|
|
20
|
+
output: valueSchema()({ type: 'string' }),
|
|
21
|
+
}),
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
const Document = nodeClass({
|
|
25
|
+
extends: [Resource],
|
|
26
|
+
properties: { body: property(valueSchema()({ type: 'string' })) },
|
|
27
|
+
});
|
|
28
|
+
const MethodlessParent = nodeClass({
|
|
29
|
+
abstract: true,
|
|
30
|
+
properties: {},
|
|
31
|
+
});
|
|
32
|
+
const MethodlessChild = nodeClass({
|
|
33
|
+
extends: [MethodlessParent],
|
|
34
|
+
properties: {},
|
|
35
|
+
});
|
|
36
|
+
const PrototypeMembers = nodeClass({
|
|
37
|
+
properties: {
|
|
38
|
+
toString: property(valueSchema()({ type: 'string' }), { required: true }),
|
|
39
|
+
},
|
|
40
|
+
methods: {
|
|
41
|
+
constructor: method({
|
|
42
|
+
auth: 'authenticated',
|
|
43
|
+
input: valueSchema()({ type: 'string' }),
|
|
44
|
+
output: valueSchema()({ type: 'string' }),
|
|
45
|
+
}),
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
const Work = schema.resolve(defineSchema('client-binding-types.example', {
|
|
49
|
+
classes: {
|
|
50
|
+
Resource,
|
|
51
|
+
Document,
|
|
52
|
+
MethodlessParent,
|
|
53
|
+
MethodlessChild,
|
|
54
|
+
PrototypeMembers,
|
|
55
|
+
Related: edgeClass.directed({
|
|
56
|
+
source: { as: 'source', accepts: [Resource], outgoing: '0..*' },
|
|
57
|
+
target: { as: 'target', accepts: [Resource], incoming: '0..*' },
|
|
58
|
+
}),
|
|
59
|
+
},
|
|
60
|
+
}));
|
|
61
|
+
const source = Query.from({ nodes: [Work.classes.Resource] });
|
|
62
|
+
const query = source.select({ kind: 'nodes', projection: { kind: 'value' } });
|
|
63
|
+
const prototypeSource = Query.from({ nodes: [Work.classes.PrototypeMembers] });
|
|
64
|
+
const prototypeQuery = prototypeSource.select({ kind: 'nodes', projection: { kind: 'value' } });
|
|
65
|
+
const resourceAcceptsDocument = documentProjection;
|
|
66
|
+
void resourceAcceptsDocument;
|
|
67
|
+
const resourceReceiverAcceptsDocument = documentProjection;
|
|
68
|
+
void resourceReceiverAcceptsDocument;
|
|
69
|
+
// @ts-expect-error A projection selected for another unrelated Class is not a Resource projection.
|
|
70
|
+
const resourceRejectsPrototype = prototypeProjection;
|
|
71
|
+
void resourceRejectsPrototype;
|
|
72
|
+
// @ts-expect-error Receiver evidence selected for an unrelated Class is not accepted.
|
|
73
|
+
const resourceReceiverRejectsPrototype = prototypeProjection;
|
|
74
|
+
void resourceReceiverRejectsPrototype;
|
|
75
|
+
const methodlessParentAcceptsChild = methodlessChildProjection;
|
|
76
|
+
void methodlessParentAcceptsChild;
|
|
77
|
+
// @ts-expect-error Selected ancestor provenance cannot be widened into a child projection.
|
|
78
|
+
const documentRejectsResource = resourceProjection;
|
|
79
|
+
void documentRejectsResource;
|
|
80
|
+
async function typeProof() {
|
|
81
|
+
await graph.get(definitionRef);
|
|
82
|
+
await graph.getOrThrow(definitionRef);
|
|
83
|
+
await graph.get(Work.classes.Resource.ref);
|
|
84
|
+
await graph.neighbors(definitionRef, Work.classes.Related.ref, {
|
|
85
|
+
direction: 'outgoing',
|
|
86
|
+
page: { size: 1 },
|
|
87
|
+
});
|
|
88
|
+
const page = await binding.query(query, { page: { size: 10 } });
|
|
89
|
+
const resource = page.nodes[0];
|
|
90
|
+
const title = resource.title;
|
|
91
|
+
const renamed = await resource.rename({ title: 'next' });
|
|
92
|
+
// @ts-expect-error Ancestor projection does not expose child-only Properties.
|
|
93
|
+
resource.body;
|
|
94
|
+
const document = page.refine(resource, Work.classes.Document);
|
|
95
|
+
const body = document?.body;
|
|
96
|
+
const detached = QueryAST.decode(query);
|
|
97
|
+
// @ts-expect-error Decoding destroys the authoring Class provenance required for rich projection.
|
|
98
|
+
await binding.query(detached, { page: { size: 10 } });
|
|
99
|
+
const multipleClasses = Query.from({
|
|
100
|
+
nodes: [Work.classes.Resource, Work.classes.Document],
|
|
101
|
+
}).select({ kind: 'nodes', projection: { kind: 'value' } });
|
|
102
|
+
// @ts-expect-error Multiple Class terms do not establish one rich selected-Class contract.
|
|
103
|
+
await binding.query(multipleClasses, { page: { size: 10 } });
|
|
104
|
+
const mixedSource = Query.from({
|
|
105
|
+
nodes: [NodeId('document'), Work.classes.Resource],
|
|
106
|
+
}).select({ kind: 'nodes', projection: { kind: 'value' } });
|
|
107
|
+
// @ts-expect-error Path and Class terms do not establish one rich selected-Class contract.
|
|
108
|
+
await binding.query(mixedSource, { page: { size: 10 } });
|
|
109
|
+
const detachedRefSource = Query.from({ nodes: [Work.classes.Resource.ref] }).select({
|
|
110
|
+
kind: 'nodes',
|
|
111
|
+
projection: { kind: 'value' },
|
|
112
|
+
});
|
|
113
|
+
// @ts-expect-error A ClassRef has no resolved schema witness for rich projection.
|
|
114
|
+
await binding.query(detachedRefSource, { page: { size: 10 } });
|
|
115
|
+
const detachedKeySource = Query.from({ nodes: [Work.classes.Resource.key] }).select({
|
|
116
|
+
kind: 'nodes',
|
|
117
|
+
projection: { kind: 'value' },
|
|
118
|
+
});
|
|
119
|
+
// @ts-expect-error A ClassKey has no resolved schema witness for rich projection.
|
|
120
|
+
await binding.query(detachedKeySource, { page: { size: 10 } });
|
|
121
|
+
const prototypePage = await binding.query(prototypeQuery, { page: { size: 1 } });
|
|
122
|
+
const prototype = prototypePage.nodes[0];
|
|
123
|
+
const toString = prototype.toString;
|
|
124
|
+
const constructed = await prototype.constructor('input');
|
|
125
|
+
const structural = Path.project(Work.classes.Resource.ref).raw;
|
|
126
|
+
await graph.get(structural);
|
|
127
|
+
await graph.getOrThrow(structural);
|
|
128
|
+
await graph.neighbors(structural, Work.classes.Related, {
|
|
129
|
+
direction: 'outgoing',
|
|
130
|
+
page: { size: 1 },
|
|
131
|
+
});
|
|
132
|
+
const exact = NodeId('document');
|
|
133
|
+
await graph.get(exact);
|
|
134
|
+
await graph.getOrThrow(exact);
|
|
135
|
+
await graph.neighbors(exact, Work.classes.Related, {
|
|
136
|
+
direction: 'outgoing',
|
|
137
|
+
page: { size: 1 },
|
|
138
|
+
});
|
|
139
|
+
// @ts-expect-error Neighbor traversal requires Edge Classes, not Node Classes.
|
|
140
|
+
await graph.neighbors(exact, Work.classes.Resource, {
|
|
141
|
+
direction: 'outgoing',
|
|
142
|
+
page: { size: 1 },
|
|
143
|
+
});
|
|
144
|
+
return { title, renamed, body, toString, constructed };
|
|
145
|
+
}
|
|
146
|
+
void typeProof;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { Edge } from '@astrale-os/kernel-core/graph/edge';
|
|
2
|
+
import type { Node } from '@astrale-os/kernel-core/graph/node';
|
|
3
|
+
import type { DefinitionKey, Key } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
4
|
+
import type { AnyResolvedClass, BoundMethodShortcutsOf, ClassSatisfactionKeysOf, MethodAccessOf, PropertyAccessOf, PropertyShortcutsOf, ResolvedClass } from '@astrale-os/kernel-dsl/v1/language';
|
|
5
|
+
import type { Binary } from '../../client/index.js';
|
|
6
|
+
type NodeReserved = keyof Node | 'property' | 'method';
|
|
7
|
+
type EdgeReserved = keyof Edge | 'property';
|
|
8
|
+
declare const BOUND_CLASS: unique symbol;
|
|
9
|
+
/** Node evidence selected as one exact Class key, without duplicating its rich projection. */
|
|
10
|
+
export type BoundNodeFor<ClassKey extends DefinitionKey<Key.Origin, 'class'> = DefinitionKey<Key.Origin, 'class'>> = Node & {
|
|
11
|
+
readonly [BOUND_CLASS]: Readonly<Record<ClassKey, true>>;
|
|
12
|
+
};
|
|
13
|
+
/** One selected-Class view over an exact admitted Node. */
|
|
14
|
+
export type BoundNode<Class extends ResolvedClass<'node'> = ResolvedClass<'node'>, BinaryValue = Binary> = BoundNodeFor<ClassSatisfactionKeysOf<Class>> & PropertyShortcutsOf<Class, NodeReserved> & BoundMethodShortcutsOf<Class, BinaryValue, NodeReserved> & PropertyAccessOf<Class> & MethodAccessOf<Class, BinaryValue>;
|
|
15
|
+
/** One selected-Class view over an exact admitted Edge. */
|
|
16
|
+
export type BoundEdge<Class extends ResolvedClass<'edge'> = ResolvedClass<'edge'>> = Edge & PropertyShortcutsOf<Class, EdgeReserved> & PropertyAccessOf<Class>;
|
|
17
|
+
export type BoundGraphValue<Class extends AnyResolvedClass> = Class extends ResolvedClass<'node'> ? BoundNode<Class> : Class extends ResolvedClass<'edge'> ? BoundEdge<Class> : never;
|
|
18
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Edge } from '@astrale-os/kernel-core/graph/edge';
|
|
2
|
+
import type { Node } from '@astrale-os/kernel-core/graph/node';
|
|
3
|
+
import type { QueryAST, QueryEdgeGraphResult, QueryEdgeResult, QueryNodeGraphResult, QueryNodeResult, QueryResultFor, QuerySingleSourceClassOf } from '@astrale-os/kernel-core/graph/query';
|
|
4
|
+
import type { AnyResolvedClass, ResolvedClass } from '@astrale-os/kernel-dsl/v1/language';
|
|
5
|
+
import type { QueryResponse } from '../page-contract.js';
|
|
6
|
+
import type { BoundEdge, BoundNode } from './model.js';
|
|
7
|
+
type SourceClass<Query> = Extract<QuerySingleSourceClassOf<Query>, AnyResolvedClass>;
|
|
8
|
+
export interface BoundNodePage<Query extends QueryAST = QueryAST, Class extends ResolvedClass<'node'> = Extract<SourceClass<Query>, ResolvedClass<'node'>>> {
|
|
9
|
+
readonly nodes: readonly BoundNode<Class>[];
|
|
10
|
+
readonly raw: QueryResponse<QueryResultFor<Query>>;
|
|
11
|
+
readonly next?: () => Promise<BoundNodePage<Query, Class>>;
|
|
12
|
+
refine<Target extends ResolvedClass<'node'>>(value: BoundNode<Class>, target: Target): BoundNode<Target> | undefined;
|
|
13
|
+
}
|
|
14
|
+
export interface BoundEdgePage<Query extends QueryAST = QueryAST, Class extends ResolvedClass<'edge'> = Extract<SourceClass<Query>, ResolvedClass<'edge'>>> {
|
|
15
|
+
readonly edges: readonly BoundEdge<Class>[];
|
|
16
|
+
readonly raw: QueryResponse<QueryResultFor<Query>>;
|
|
17
|
+
readonly next?: () => Promise<BoundEdgePage<Query, Class>>;
|
|
18
|
+
refine<Target extends ResolvedClass<'edge'>>(value: BoundEdge<Class>, target: Target): BoundEdge<Target> | undefined;
|
|
19
|
+
}
|
|
20
|
+
export type BoundQueryPage<Query extends QueryAST> = QueryResultFor<Query> extends QueryNodeGraphResult | QueryNodeResult ? BoundNodePage<Query> : QueryResultFor<Query> extends QueryEdgeGraphResult | QueryEdgeResult ? BoundEdgePage<Query> : never;
|
|
21
|
+
export declare function selectedNodes(response: QueryResponse): readonly Node[];
|
|
22
|
+
export declare function selectedEdges(response: QueryResponse): readonly Edge[];
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { edgeKeyOf, equalEdgeKeys } from '@astrale-os/kernel-core/graph/edge';
|
|
2
|
+
export function selectedNodes(response) {
|
|
3
|
+
const result = response.result;
|
|
4
|
+
if (result.kind === 'graph') {
|
|
5
|
+
if (result.selection.kind !== 'node')
|
|
6
|
+
throw new TypeError('Query did not select Nodes.');
|
|
7
|
+
const byId = new Map(result.graph.nodes.map((node) => [node.id, node]));
|
|
8
|
+
return result.selection.ids.map((id) => {
|
|
9
|
+
const node = byId.get(id);
|
|
10
|
+
if (node === undefined)
|
|
11
|
+
throw new TypeError(`Selected Node ${id} is absent.`);
|
|
12
|
+
return node;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
if (result.kind !== 'nodes')
|
|
16
|
+
throw new TypeError('Query did not select Nodes.');
|
|
17
|
+
return result.nodes.map((item) => {
|
|
18
|
+
if (item.kind !== 'value')
|
|
19
|
+
throw new TypeError('Rich Node queries require value projection.');
|
|
20
|
+
return item.value;
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
export function selectedEdges(response) {
|
|
24
|
+
const result = response.result;
|
|
25
|
+
if (result.kind === 'graph') {
|
|
26
|
+
if (result.selection.kind !== 'edge')
|
|
27
|
+
throw new TypeError('Query did not select Edges.');
|
|
28
|
+
return result.selection.keys.map((key) => {
|
|
29
|
+
const edge = result.graph.edges.find((candidate) => equalEdgeKeys(edgeKeyOf(candidate), key));
|
|
30
|
+
if (edge === undefined)
|
|
31
|
+
throw new TypeError('Selected Edge is absent.');
|
|
32
|
+
return edge;
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
if (result.kind !== 'edges')
|
|
36
|
+
throw new TypeError('Query did not select Edges.');
|
|
37
|
+
return result.edges.map((item) => {
|
|
38
|
+
if (item.edge.kind !== 'value')
|
|
39
|
+
throw new TypeError('Rich Edge queries require value projection.');
|
|
40
|
+
return item.edge.value;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Edge } from '@astrale-os/kernel-core/graph/edge';
|
|
2
|
+
import type { Node } from '@astrale-os/kernel-core/graph/node';
|
|
3
|
+
import type { ResolvedClass, ResolvedMethod } from '@astrale-os/kernel-dsl/v1/language';
|
|
4
|
+
import type { BoundEdge, BoundNode } from './model.js';
|
|
5
|
+
import type { QueryProvenance } from './provenance.js';
|
|
6
|
+
export type MethodCall = (node: Node, method: ResolvedMethod, input: unknown) => Promise<unknown>;
|
|
7
|
+
export declare function projectNode<Class extends ResolvedClass<'node'>>(selected: Class, node: Node, provenance: QueryProvenance, call: MethodCall): BoundNode<Class>;
|
|
8
|
+
export declare function projectEdge<Class extends ResolvedClass<'edge'>>(selected: Class, edge: Edge, provenance: QueryProvenance): BoundEdge<Class>;
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { MethodKey, PropertyKey } from '@astrale-os/kernel-dsl/v1/addressing';
|
|
2
|
+
import { retainProjectedProvenance } from './provenance.js';
|
|
3
|
+
export function projectNode(selected, node, provenance, call) {
|
|
4
|
+
const property = propertyAccessor(selected, node.props);
|
|
5
|
+
const method = methodAccessor(selected, node, call);
|
|
6
|
+
const value = {
|
|
7
|
+
id: node.id,
|
|
8
|
+
class: node.class,
|
|
9
|
+
props: node.props,
|
|
10
|
+
property,
|
|
11
|
+
method,
|
|
12
|
+
};
|
|
13
|
+
installPropertyShortcuts(value, selected, node.props, NODE_RESERVED);
|
|
14
|
+
installMethodShortcuts(value, selected, node, call, NODE_RESERVED);
|
|
15
|
+
const projected = Object.freeze(value);
|
|
16
|
+
retainProjectedProvenance(projected, provenance);
|
|
17
|
+
return projected;
|
|
18
|
+
}
|
|
19
|
+
export function projectEdge(selected, edge, provenance) {
|
|
20
|
+
const value = {
|
|
21
|
+
source: edge.source,
|
|
22
|
+
target: edge.target,
|
|
23
|
+
class: edge.class,
|
|
24
|
+
...(edge.slug === undefined ? {} : { slug: edge.slug }),
|
|
25
|
+
props: edge.props,
|
|
26
|
+
property: propertyAccessor(selected, edge.props),
|
|
27
|
+
};
|
|
28
|
+
installPropertyShortcuts(value, selected, edge.props, EDGE_RESERVED);
|
|
29
|
+
const projected = Object.freeze(value);
|
|
30
|
+
retainProjectedProvenance(projected, provenance);
|
|
31
|
+
return projected;
|
|
32
|
+
}
|
|
33
|
+
const NODE_RESERVED = new Set(['id', 'class', 'props', 'property', 'method']);
|
|
34
|
+
const EDGE_RESERVED = new Set(['source', 'target', 'class', 'slug', 'props', 'property']);
|
|
35
|
+
function propertyAccessor(selected, props) {
|
|
36
|
+
return (input) => {
|
|
37
|
+
const property = resolveProperty(selected, input);
|
|
38
|
+
return props[property.key];
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function methodAccessor(selected, node, call) {
|
|
42
|
+
return (input) => {
|
|
43
|
+
const method = resolveMethod(selected, input);
|
|
44
|
+
if (method.inheritance === 'abstract') {
|
|
45
|
+
throw new TypeError(`Abstract Method ${method.key} cannot be invoked.`);
|
|
46
|
+
}
|
|
47
|
+
return (value) => call(node, method, value);
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function resolveProperty(selected, input) {
|
|
51
|
+
if (typeof input !== 'string') {
|
|
52
|
+
const member = selected.properties.get(input.key);
|
|
53
|
+
if (member !== input)
|
|
54
|
+
throw new TypeError('Property does not belong to the selected Class.');
|
|
55
|
+
return member;
|
|
56
|
+
}
|
|
57
|
+
if (PropertyKey.is(input)) {
|
|
58
|
+
const member = selected.properties.get(input);
|
|
59
|
+
if (member === undefined)
|
|
60
|
+
throw new TypeError(`Property ${input} is not effective.`);
|
|
61
|
+
return member;
|
|
62
|
+
}
|
|
63
|
+
const member = named(selected.properties, input);
|
|
64
|
+
if (member === undefined || typeof member !== 'object') {
|
|
65
|
+
throw new TypeError(`Property name ${JSON.stringify(input)} is absent or ambiguous.`);
|
|
66
|
+
}
|
|
67
|
+
return member;
|
|
68
|
+
}
|
|
69
|
+
function resolveMethod(selected, input) {
|
|
70
|
+
if (typeof input !== 'string') {
|
|
71
|
+
const member = selected.methods.get(input.key);
|
|
72
|
+
if (member !== input)
|
|
73
|
+
throw new TypeError('Method does not belong to the selected Class.');
|
|
74
|
+
return member;
|
|
75
|
+
}
|
|
76
|
+
if (MethodKey.is(input)) {
|
|
77
|
+
const member = selected.methods.get(input);
|
|
78
|
+
if (member === undefined)
|
|
79
|
+
throw new TypeError(`Method ${input} is not effective.`);
|
|
80
|
+
return member;
|
|
81
|
+
}
|
|
82
|
+
const member = named(selected.methods, input);
|
|
83
|
+
if (member === undefined || typeof member !== 'object') {
|
|
84
|
+
throw new TypeError(`Method name ${JSON.stringify(input)} is absent or ambiguous.`);
|
|
85
|
+
}
|
|
86
|
+
return member;
|
|
87
|
+
}
|
|
88
|
+
function installPropertyShortcuts(target, selected, props, reserved) {
|
|
89
|
+
for (const property of selected.properties) {
|
|
90
|
+
if (reserved.has(property.name) || hasOwn(target, property.name))
|
|
91
|
+
continue;
|
|
92
|
+
if (named(selected.properties, property.name) !== property)
|
|
93
|
+
continue;
|
|
94
|
+
if (selected.kind === 'node' && named(selected.methods, property.name) !== undefined)
|
|
95
|
+
continue;
|
|
96
|
+
install(target, property.name, props[property.key]);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function installMethodShortcuts(target, selected, node, call, reserved) {
|
|
100
|
+
for (const member of selected.methods) {
|
|
101
|
+
if (member.inheritance === 'abstract' ||
|
|
102
|
+
reserved.has(member.name) ||
|
|
103
|
+
hasOwn(target, member.name))
|
|
104
|
+
continue;
|
|
105
|
+
if (named(selected.methods, member.name) !== member)
|
|
106
|
+
continue;
|
|
107
|
+
if (named(selected.properties, member.name) !== undefined)
|
|
108
|
+
continue;
|
|
109
|
+
install(target, member.name, (input) => call(node, member, input));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
function named(collection, name) {
|
|
113
|
+
return hasOwn(collection, name) ? Reflect.get(collection, name) : undefined;
|
|
114
|
+
}
|
|
115
|
+
function hasOwn(value, name) {
|
|
116
|
+
return Object.prototype.hasOwnProperty.call(value, name);
|
|
117
|
+
}
|
|
118
|
+
function install(target, name, value) {
|
|
119
|
+
Object.defineProperty(target, name, { enumerable: true, value });
|
|
120
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Domain } from '@astrale-os/kernel-dsl/v1/domain';
|
|
2
|
+
import type { QueryProvenance } from '../provenance.js';
|
|
3
|
+
export declare function retainProjectedProvenance(value: object, provenance: QueryProvenance): void;
|
|
4
|
+
export declare function provenanceOfProjectedValue(value: object): QueryProvenance | undefined;
|
|
5
|
+
export declare function sameClosure(left: Domain['closure'], right: Domain['closure']): boolean;
|
|
6
|
+
export type { QueryProvenance };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
const projectedValues = new WeakMap();
|
|
2
|
+
export function retainProjectedProvenance(value, provenance) {
|
|
3
|
+
projectedValues.set(value, provenance);
|
|
4
|
+
}
|
|
5
|
+
export function provenanceOfProjectedValue(value) {
|
|
6
|
+
return projectedValues.get(value);
|
|
7
|
+
}
|
|
8
|
+
export function sameClosure(left, right) {
|
|
9
|
+
return (left.length === right.length &&
|
|
10
|
+
left.every((identity, index) => identity.origin === right[index]?.origin && identity.revision === right[index]?.revision));
|
|
11
|
+
}
|
package/dist/graph/errors.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import type { NodePath,
|
|
1
|
+
import type { NodePath, NodeTarget } from '@astrale-os/kernel-core/path';
|
|
2
2
|
import { ClientError } from '../errors/index.js';
|
|
3
3
|
/** Required point read whose absence and authorization masking are intentionally indistinguishable. */
|
|
4
4
|
export declare class NodeUnavailableError extends ClientError {
|
|
5
5
|
readonly code: 'NODE_UNAVAILABLE';
|
|
6
6
|
readonly path: NodePath;
|
|
7
|
-
constructor(path:
|
|
7
|
+
constructor(path: NodeTarget);
|
|
8
8
|
}
|
|
9
|
-
//# sourceMappingURL=errors.d.ts.map
|
package/dist/graph/errors.js
CHANGED
|
@@ -5,10 +5,9 @@ export class NodeUnavailableError extends ClientError {
|
|
|
5
5
|
code = 'NODE_UNAVAILABLE';
|
|
6
6
|
path;
|
|
7
7
|
constructor(path) {
|
|
8
|
-
const admitted = Path.
|
|
8
|
+
const admitted = Path.target(path).raw;
|
|
9
9
|
super(`Node ${JSON.stringify(admitted)} is unavailable.`);
|
|
10
10
|
this.name = 'NodeUnavailableError';
|
|
11
11
|
this.path = admitted;
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { DomainDependency } from '@astrale-os/kernel-dsl/v1/schema';
|
|
2
|
+
/** Detach one caller-owned expected closure before crossing the Client boundary. */
|
|
3
|
+
export declare function captureExpected(input: readonly DomainDependency[] | undefined): readonly DomainDependency[] | undefined;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/** Detach one caller-owned expected closure before crossing the Client boundary. */
|
|
2
|
+
export function captureExpected(input) {
|
|
3
|
+
if (input === undefined)
|
|
4
|
+
return undefined;
|
|
5
|
+
return Object.freeze(input.map(({ origin, revision }) => Object.freeze({ origin, revision })));
|
|
6
|
+
}
|
package/dist/graph/graph.d.ts
CHANGED
|
@@ -1,25 +1,29 @@
|
|
|
1
1
|
import type { GraphSpec } from '@astrale-os/kernel-core/graph/graph';
|
|
2
2
|
import type { MutationAST as MutationASTValue, MutationBuilder, MutationInput, MutationResult as MutationResultValue } from '@astrale-os/kernel-core/graph/mutate';
|
|
3
3
|
import type { Node } from '@astrale-os/kernel-core/graph/node';
|
|
4
|
-
import type { QueryAST as QueryASTValue,
|
|
5
|
-
import type {
|
|
4
|
+
import type { QueryAST as QueryASTValue, QueryEdgeClassInput, QueryResultFor } from '@astrale-os/kernel-core/graph/query';
|
|
5
|
+
import type { NodeTarget } from '@astrale-os/kernel-core/path';
|
|
6
|
+
import type { DomainDependency } from '@astrale-os/kernel-dsl/v1/schema';
|
|
6
7
|
import type { Call, Input } from '../client/index.js';
|
|
7
8
|
import type { RequestOptions } from '../transport/index.js';
|
|
8
9
|
import type { QueryPageRequest, QueryResponse } from './page-contract.js';
|
|
9
10
|
import type { NeighborsOptions, NodePage } from './page/index.js';
|
|
10
11
|
export type GraphCall = (call: Call, options?: RequestOptions) => Promise<Input>;
|
|
11
12
|
export interface GraphQueryOptions extends RequestOptions {
|
|
13
|
+
readonly expected?: readonly DomainDependency[];
|
|
12
14
|
readonly page: QueryPageRequest;
|
|
13
15
|
}
|
|
16
|
+
export interface GraphMutationOptions extends RequestOptions {
|
|
17
|
+
readonly expected?: readonly DomainDependency[];
|
|
18
|
+
}
|
|
14
19
|
export type MutationAuthor = (mutation: MutationBuilder) => undefined;
|
|
15
20
|
export interface GraphApi {
|
|
16
21
|
query<Query extends QueryASTValue>(ast: Query, options: GraphQueryOptions): Promise<QueryResponse<QueryResultFor<Query>>>;
|
|
17
|
-
mutate(author: MutationAuthor, options?:
|
|
18
|
-
mutate(ast: MutationASTValue | MutationInput | GraphSpec, options?:
|
|
19
|
-
get(target:
|
|
20
|
-
getOrThrow(target:
|
|
21
|
-
neighbors(source:
|
|
22
|
+
mutate(author: MutationAuthor, options?: GraphMutationOptions): Promise<MutationResultValue>;
|
|
23
|
+
mutate(ast: MutationASTValue | MutationInput | GraphSpec, options?: GraphMutationOptions): Promise<MutationResultValue>;
|
|
24
|
+
get(target: NodeTarget, options?: RequestOptions): Promise<Node | null>;
|
|
25
|
+
getOrThrow(target: NodeTarget, options?: RequestOptions): Promise<Node>;
|
|
26
|
+
neighbors(source: NodeTarget, via: QueryEdgeClassInput | readonly [QueryEdgeClassInput, ...QueryEdgeClassInput[]], options: NeighborsOptions): Promise<NodePage>;
|
|
22
27
|
}
|
|
23
28
|
/** Bind Core's canonical graph documents to one caller-scoped value-call capability. */
|
|
24
29
|
export declare function createGraph(call: GraphCall): GraphApi;
|
|
25
|
-
//# sourceMappingURL=graph.d.ts.map
|
package/dist/graph/graph.js
CHANGED
package/dist/graph/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
export { createGraph, type GraphApi, type GraphCall, type GraphQueryOptions, type MutationAuthor, } from './graph.js';
|
|
1
|
+
export { createGraph, type GraphApi, type GraphCall, type GraphMutationOptions, type GraphQueryOptions, type MutationAuthor, } from './graph.js';
|
|
2
2
|
export type { QueryPageRequest, QueryResponse } from './page-contract.js';
|
|
3
|
+
export { type BoundEdge, type BoundEdgePage, type BoundGraphValue, type BoundNode, type BoundNodeFor, type BoundNodePage, type BoundQueryPage, type DomainBinding, type DomainQueryOptions, } from './domain/index.js';
|
|
3
4
|
export { NodeUnavailableError } from './errors.js';
|
|
4
5
|
export type { NeighborsOptions, NodePage } from './page/index.js';
|
|
5
6
|
export { LocalBinding, type GraphSpec } from '@astrale-os/kernel-core/graph/graph';
|
|
6
7
|
export { MutationAST, MutationResult, type MutationBuilder, type MutationInput, } from '@astrale-os/kernel-core/graph/mutate';
|
|
7
8
|
export { Query, QueryAST, QueryResult } from '@astrale-os/kernel-core/graph/query';
|
|
8
|
-
//# sourceMappingURL=index.d.ts.map
|
package/dist/graph/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { createGraph, } from './graph.js';
|
|
2
|
+
export {} from './domain/index.js';
|
|
2
3
|
export { NodeUnavailableError } from './errors.js';
|
|
3
4
|
export { LocalBinding } from '@astrale-os/kernel-core/graph/graph';
|
|
4
5
|
export { MutationAST, MutationResult, } from '@astrale-os/kernel-core/graph/mutate';
|
|
5
6
|
export { Query, QueryAST, QueryResult } from '@astrale-os/kernel-core/graph/query';
|
|
6
|
-
//# sourceMappingURL=index.js.map
|
package/dist/graph/mutation.d.ts
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
import type { GraphSpec } from '@astrale-os/kernel-core/graph/graph';
|
|
2
2
|
import type { MutationAST as MutationASTValue, MutationInput, MutationResult as MutationResultValue } from '@astrale-os/kernel-core/graph/mutate';
|
|
3
|
-
import type {
|
|
4
|
-
|
|
5
|
-
export declare function mutateGraph(call: GraphCall, input: MutationAuthor | MutationASTValue | MutationInput | GraphSpec, options?: RequestOptions): Promise<MutationResultValue>;
|
|
6
|
-
//# sourceMappingURL=mutation.d.ts.map
|
|
3
|
+
import type { GraphCall, GraphMutationOptions, MutationAuthor } from './graph.js';
|
|
4
|
+
export declare function mutateGraph(call: GraphCall, input: MutationAuthor | MutationASTValue | MutationInput | GraphSpec, options?: GraphMutationOptions): Promise<MutationResultValue>;
|
package/dist/graph/mutation.js
CHANGED
|
@@ -2,10 +2,19 @@ import { MutationAST, MutationResult } from '@astrale-os/kernel-core/graph/mutat
|
|
|
2
2
|
import { Path } from '@astrale-os/kernel-core/path';
|
|
3
3
|
import { mutate } from '@astrale-os/kernel-core/schema/kernel/syscalls/references';
|
|
4
4
|
import { call as invocation } from '../client/index.js';
|
|
5
|
+
import { captureExpected } from './expectation.js';
|
|
5
6
|
const KERNEL_MUTATE_PATH = Path.project(mutate).raw;
|
|
6
7
|
export async function mutateGraph(call, input, options) {
|
|
7
8
|
const ast = typeof input === 'function' ? MutationAST.build(input) : admitMutation(input);
|
|
8
|
-
const
|
|
9
|
+
const expected = options?.expected;
|
|
10
|
+
const request = options === undefined
|
|
11
|
+
? undefined
|
|
12
|
+
: (({ expected: _expected, ...rest }) => rest)(options);
|
|
13
|
+
const capturedExpected = captureExpected(expected);
|
|
14
|
+
const output = await call(invocation(KERNEL_MUTATE_PATH, Object.freeze({
|
|
15
|
+
ast,
|
|
16
|
+
...(capturedExpected === undefined ? {} : { expected: capturedExpected }),
|
|
17
|
+
})), request);
|
|
9
18
|
return MutationResult.decode(output);
|
|
10
19
|
}
|
|
11
20
|
function admitMutation(input) {
|
|
@@ -15,4 +24,3 @@ function admitMutation(input) {
|
|
|
15
24
|
? MutationAST.create(input)
|
|
16
25
|
: MutationAST.fromGraph(input);
|
|
17
26
|
}
|
|
18
|
-
//# sourceMappingURL=mutation.js.map
|
package/dist/graph/page/index.js
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import type {
|
|
1
|
+
import type { QueryDirection, QueryEdgeClassInput } from '@astrale-os/kernel-core/graph/query';
|
|
2
|
+
import type { NodeTarget } from '@astrale-os/kernel-core/path';
|
|
3
3
|
import type { NodePage, PageQuery, PageQueryOptions } from './page.js';
|
|
4
4
|
export interface NeighborsOptions extends PageQueryOptions {
|
|
5
5
|
readonly direction: QueryDirection;
|
|
6
6
|
}
|
|
7
|
-
export type NeighborSource =
|
|
8
|
-
export type NeighborVia =
|
|
7
|
+
export type NeighborSource = NodeTarget;
|
|
8
|
+
export type NeighborVia = QueryEdgeClassInput | readonly [QueryEdgeClassInput, ...QueryEdgeClassInput[]];
|
|
9
9
|
export declare function readNeighbors(query: PageQuery, source: NeighborSource, via: NeighborVia, options: NeighborsOptions): Promise<NodePage>;
|
|
10
|
-
//# sourceMappingURL=neighbors.d.ts.map
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
import { Query } from '@astrale-os/kernel-core/graph/query';
|
|
2
|
+
import { queryNodePath } from '../query.js';
|
|
2
3
|
import { createNodePage } from './page.js';
|
|
3
4
|
export async function readNeighbors(query, source, via, options) {
|
|
4
5
|
if (options === null || typeof options !== 'object') {
|
|
5
6
|
throw new TypeError('Neighbor read options are invalid.');
|
|
6
7
|
}
|
|
7
|
-
const
|
|
8
|
-
const [
|
|
9
|
-
if (
|
|
10
|
-
throw new TypeError('Neighbor read requires at least one
|
|
8
|
+
const classes = Array.isArray(via) ? via : [via];
|
|
9
|
+
const [classInput, ...additionalClasses] = classes;
|
|
10
|
+
if (classInput === undefined)
|
|
11
|
+
throw new TypeError('Neighbor read requires at least one Class.');
|
|
11
12
|
const direction = options.direction === 'outgoing'
|
|
12
13
|
? options.direction
|
|
13
14
|
: options.direction === 'incoming'
|
|
@@ -15,8 +16,8 @@ export async function readNeighbors(query, source, via, options) {
|
|
|
15
16
|
: options.direction === 'incident'
|
|
16
17
|
? options.direction
|
|
17
18
|
: invalidDirection(options.direction);
|
|
18
|
-
const ast = Query.from({
|
|
19
|
-
.expand({ via: [
|
|
19
|
+
const ast = Query.from({ nodes: [queryNodePath(source)] })
|
|
20
|
+
.expand({ via: [classInput, ...additionalClasses], direction })
|
|
20
21
|
.select({ kind: 'graph' });
|
|
21
22
|
const { direction: _, page, ...request } = options;
|
|
22
23
|
const { idempotencyKey: ___, ...basis } = request;
|
|
@@ -32,4 +33,3 @@ export async function readNeighbors(query, source, via, options) {
|
|
|
32
33
|
function invalidDirection(input) {
|
|
33
34
|
throw new TypeError(`Unsupported neighbor direction ${JSON.stringify(input)}.`);
|
|
34
35
|
}
|
|
35
|
-
//# sourceMappingURL=neighbors.js.map
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { GraphData } from '@astrale-os/kernel-core/graph/graph';
|
|
2
2
|
import type { Node, NodeCollection } from '@astrale-os/kernel-core/graph/node';
|
|
3
3
|
import type { NodeBinding, QueryAST, QueryGraphSelect, QueryNodeGraphResult, QueryResultFor } from '@astrale-os/kernel-core/graph/query';
|
|
4
|
+
import type { DomainDependency } from '@astrale-os/kernel-dsl/v1/schema';
|
|
4
5
|
import type { RequestOptions } from '../../transport/index.js';
|
|
5
6
|
import type { QueryPageRequest, QueryResponse } from '../page-contract.js';
|
|
6
7
|
export interface NodePage {
|
|
@@ -23,12 +24,14 @@ export interface NodePage {
|
|
|
23
24
|
readonly cursor: string | null;
|
|
24
25
|
}>;
|
|
25
26
|
}
|
|
26
|
-
type PageBasis = Pick<RequestOptions, 'signal' | 'timeoutMs'
|
|
27
|
+
type PageBasis = Pick<RequestOptions, 'signal' | 'timeoutMs'> & {
|
|
28
|
+
readonly expected?: readonly DomainDependency[];
|
|
29
|
+
};
|
|
27
30
|
export interface PageQueryOptions extends RequestOptions {
|
|
31
|
+
readonly expected?: readonly DomainDependency[];
|
|
28
32
|
readonly page: QueryPageRequest;
|
|
29
33
|
}
|
|
30
34
|
export type PageQuery = <Query extends QueryAST>(ast: Query, options: PageQueryOptions) => Promise<QueryResponse<QueryResultFor<Query>>>;
|
|
31
35
|
type NodeGraphQueryAST = QueryAST<QueryGraphSelect<NodeBinding>>;
|
|
32
36
|
export declare function createNodePage(query: PageQuery, ast: NodeGraphQueryAST, response: QueryResponse<QueryNodeGraphResult>, basis: PageBasis, size: number): NodePage;
|
|
33
37
|
export {};
|
|
34
|
-
//# sourceMappingURL=page.d.ts.map
|
package/dist/graph/page/page.js
CHANGED