@ontahi/react 1.0.0-alpha.12 → 1.0.0-alpha.14
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/README.md +90 -5
- package/dist/actions/fetch-operation-bridge-adapter.d.ts.map +1 -1
- package/dist/actions/fetch-operation-bridge-adapter.js +30 -13
- package/dist/actions/fetch-operation-bridge-adapter.js.map +1 -1
- package/dist/actions/operation-bridge.d.ts +2 -0
- package/dist/actions/operation-bridge.d.ts.map +1 -1
- package/dist/actions/operation-bridge.js.map +1 -1
- package/dist/graph/canonical-request-invalidation.d.ts +14 -0
- package/dist/graph/canonical-request-invalidation.d.ts.map +1 -0
- package/dist/graph/canonical-request-invalidation.js +42 -0
- package/dist/graph/canonical-request-invalidation.js.map +1 -0
- package/dist/graph/context.d.ts +9 -2
- package/dist/graph/context.d.ts.map +1 -1
- package/dist/graph/context.js +38 -3
- package/dist/graph/context.js.map +1 -1
- package/dist/graph/executor.d.ts +18 -1
- package/dist/graph/executor.d.ts.map +1 -1
- package/dist/graph/executor.js.map +1 -1
- package/dist/graph/fetch-graph-client.d.ts +2 -1
- package/dist/graph/fetch-graph-client.d.ts.map +1 -1
- package/dist/graph/fetch-graph-client.js.map +1 -1
- package/dist/graph/fetch-graph-runtime.d.ts.map +1 -1
- package/dist/graph/fetch-graph-runtime.js +53 -1
- package/dist/graph/fetch-graph-runtime.js.map +1 -1
- package/dist/graph/fetch-runtime-transport.d.ts.map +1 -1
- package/dist/graph/fetch-runtime-transport.js +1 -0
- package/dist/graph/fetch-runtime-transport.js.map +1 -1
- package/dist/graph/graph-hooks.d.ts +2 -1
- package/dist/graph/graph-hooks.d.ts.map +1 -1
- package/dist/graph/graph-hooks.js +161 -62
- package/dist/graph/graph-hooks.js.map +1 -1
- package/dist/graph/index.d.ts +3 -0
- package/dist/graph/index.d.ts.map +1 -1
- package/dist/graph/index.js +3 -0
- package/dist/graph/index.js.map +1 -1
- package/dist/graph/model-command-hooks.d.ts +2 -0
- package/dist/graph/model-command-hooks.d.ts.map +1 -0
- package/dist/graph/model-command-hooks.js +9 -0
- package/dist/graph/model-command-hooks.js.map +1 -0
- package/dist/graph/operation-hooks.d.ts.map +1 -1
- package/dist/graph/operation-hooks.js +91 -9
- package/dist/graph/operation-hooks.js.map +1 -1
- package/dist/graph/operation-types.d.ts +1 -0
- package/dist/graph/operation-types.d.ts.map +1 -1
- package/dist/graph/operation-types.js.map +1 -1
- package/dist/graph/runtime-graph-client.d.ts +3 -2
- package/dist/graph/runtime-graph-client.d.ts.map +1 -1
- package/dist/graph/runtime-graph-client.js +2 -1
- package/dist/graph/runtime-graph-client.js.map +1 -1
- package/dist/graph/semantic-invalidation.d.ts +27 -0
- package/dist/graph/semantic-invalidation.d.ts.map +1 -0
- package/dist/graph/semantic-invalidation.js +55 -0
- package/dist/graph/semantic-invalidation.js.map +1 -0
- package/dist/graph/websocket-runtime-transport.d.ts +5 -2
- package/dist/graph/websocket-runtime-transport.d.ts.map +1 -1
- package/dist/graph/websocket-runtime-transport.js +160 -46
- package/dist/graph/websocket-runtime-transport.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -46,6 +46,7 @@ const openTodos = TodoItem.all()
|
|
|
46
46
|
</OntahiGraphProvider>;
|
|
47
47
|
|
|
48
48
|
const todos = useGraphQuery(openTodos);
|
|
49
|
+
const liveTodos = useGraphQuery(openTodos, { observation: 'live' });
|
|
49
50
|
const total = useGraphQuery(openTodos.count());
|
|
50
51
|
const first = useGraphQuery(openTodos.first());
|
|
51
52
|
```
|
|
@@ -72,7 +73,18 @@ Classified reads lower to the canonical base Entity before reaching these provid
|
|
|
72
73
|
`useGraphQuery(Chapter.all().many())` (or a runtime-bound variant's `.many()`) and the usual scalar
|
|
73
74
|
intents. Base and sibling variant reads have distinct membership keys under the same base-Entity
|
|
74
75
|
prefix, so host-triggered `invalidateQueries({ queryKey: [ContentNode.name] })` refetches all of them.
|
|
75
|
-
`useGraphQuery`
|
|
76
|
+
`useGraphQuery(query, { observation: 'live' })` explicitly selects the same complete-snapshot
|
|
77
|
+
observation lifecycle as the bound Query's `observe()`. The first snapshot is the initial React
|
|
78
|
+
Query value; the hook does not issue a duplicate one-shot read. Later snapshots replace that value
|
|
79
|
+
and pass through the same Graph Client Cache reconciliation as ordinary reads. Unmounting or
|
|
80
|
+
changing the query identity aborts the observation. Scalar terminal intents remain one-shot.
|
|
81
|
+
|
|
82
|
+
Live observation is opt-in. Ordinary `useGraphQuery(query)` retains one-shot execution plus
|
|
83
|
+
semantic mutation invalidation. An active live Query is not redundantly invalidated after a
|
|
84
|
+
mutation because its runtime observation already receives the committed revision. Contextual
|
|
85
|
+
Selection observation is not supported yet. Live and one-shot evaluations use distinct internal
|
|
86
|
+
React Query keys, including when the application supplies the same custom key, so both lifecycles
|
|
87
|
+
may consume one authored Query simultaneously.
|
|
76
88
|
|
|
77
89
|
With an observation-capable Runtime Transport, `client.graph.bindVariantSelection(Chapter.all())`
|
|
78
90
|
supports `.exec().observe()`. Complete snapshots recalculate membership, ordering and limits;
|
|
@@ -133,6 +145,65 @@ await completeVisible.executeAsync();
|
|
|
133
145
|
The bound invocation always uses the latest render input. Passing the Operation declaration itself
|
|
134
146
|
keeps the lower-level reusable mutation form, where each execution supplies its input.
|
|
135
147
|
|
|
148
|
+
`onSuccess` runs as soon as the invocation succeeds, before semantic query invalidation finishes.
|
|
149
|
+
Use it for UI reactions that should follow the committed result immediately, such as closing a
|
|
150
|
+
confirmation dialog or navigating away:
|
|
151
|
+
|
|
152
|
+
```tsx
|
|
153
|
+
const removeTodo = useOperation(TodoItem.domain.remove, {
|
|
154
|
+
onSuccess: () => navigate('/todos'),
|
|
155
|
+
});
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
By contrast, `executeAsync()` settles after affected reads have been invalidated. Await it when the
|
|
159
|
+
next statement requires refreshed query state. An invalidation delay therefore does not postpone
|
|
160
|
+
`onSuccess`, but it can keep the returned Promise pending.
|
|
161
|
+
|
|
162
|
+
`OntahiGraphProvider` consumes committed semantic metadata from every execution exchange on its
|
|
163
|
+
Runtime Transport. Every cached `useGraphQuery` retains its canonical `GraphReadRequest` in React
|
|
164
|
+
Query metadata; after commit, Ontahí compares those Reads with the bounded
|
|
165
|
+
`CommittedMutationSet` and refetches every possible overlap. A provably disjoint Read remains
|
|
166
|
+
current, while an unsupported shape refreshes conservatively. This applies equally to hooks,
|
|
167
|
+
Devtools Console executions, and other clients using the provider's transport.
|
|
168
|
+
|
|
169
|
+
Entity create, update, and delete use the same path as Relationship and ordered Commands:
|
|
170
|
+
|
|
171
|
+
```ts
|
|
172
|
+
const updateTodo = useEntityMutationCommand(
|
|
173
|
+
({ todo, completed }: { todo: EntityRef; completed: boolean }) =>
|
|
174
|
+
mutateEntity(TodoItemSchema).update(todo, { completed }),
|
|
175
|
+
);
|
|
176
|
+
|
|
177
|
+
await updateTodo.mutateAsync({ todo, completed: true });
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
Applications do not name query keys, forward mutation callbacks, or call `refetch()` after a
|
|
181
|
+
successful semantic mutation.
|
|
182
|
+
`useGraphCommand`, `useEntityMutationCommand`, `useManyToManyRelationshipCommand`,
|
|
183
|
+
`useOrderedRelationshipCommand`, Operation hooks, and terminal durable Operation hooks all consume
|
|
184
|
+
the same metadata. Existing `invalidateQueryKeys`, `bridge.invalidate`, and
|
|
185
|
+
`useCanonicalRequestInvalidation` remain compatibility escape hatches for older receivers that do
|
|
186
|
+
not return committed mutations; they are not required by the normal Runtime Protocol path.
|
|
187
|
+
|
|
188
|
+
Model Commands use the same transport and invalidation path without application wiring:
|
|
189
|
+
|
|
190
|
+
```tsx
|
|
191
|
+
const modelCommand = useModelCommand();
|
|
192
|
+
|
|
193
|
+
const outcome = await modelCommand.submit({ text: 'Complete every item in Inbox' });
|
|
194
|
+
if (outcome.ok && outcome.value.status === 'pending') {
|
|
195
|
+
await modelCommand.respond(outcome.value.run, {
|
|
196
|
+
interactionId: outcome.value.interaction.id,
|
|
197
|
+
optionId: selectedOption,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
`useModelCommand()` observes started Operations and resumes durable interactions. Terminal
|
|
203
|
+
inspection uses the same execution exchange, so its committed effects refresh active reads through
|
|
204
|
+
the provider. The UI owns conversation presentation and input state, not transport orchestration or
|
|
205
|
+
cache invalidation.
|
|
206
|
+
|
|
136
207
|
Durable Operations use the same invocation bridge to start a run, then observe its lifecycle
|
|
137
208
|
through Runtime Transport:
|
|
138
209
|
|
|
@@ -143,6 +214,10 @@ await completeAll.executeAsync();
|
|
|
143
214
|
// completeAll.status/progress/finalValue follow the accepted run.
|
|
144
215
|
```
|
|
145
216
|
|
|
217
|
+
A pending typed Interaction is a distinct `waiting` lifecycle state. The hook exposes
|
|
218
|
+
`isWaiting` separately from `isRunning`, keeps the run observation active, and continues to report
|
|
219
|
+
`isExecuting` until the run completes, fails, or is cancelled.
|
|
220
|
+
|
|
146
221
|
The hook consumes an asynchronous snapshot sequence and does not choose polling or push. The
|
|
147
222
|
conventional Fetch Runtime Transport implements that sequence with versioned
|
|
148
223
|
`durable.operation.inspect` requests and owns the polling cadence:
|
|
@@ -162,9 +237,17 @@ For a WebSocket host, compose the same graph client around the push-capable tran
|
|
|
162
237
|
|
|
163
238
|
```ts
|
|
164
239
|
const runtimeTransport = createWebSocketRuntimeTransport({ url: 'wss://app.example/runtime' });
|
|
165
|
-
const client = createRuntimeGraphClient({
|
|
240
|
+
const client = createRuntimeGraphClient({
|
|
241
|
+
application: clientApplication,
|
|
242
|
+
runtimeTransport,
|
|
243
|
+
});
|
|
166
244
|
```
|
|
167
245
|
|
|
246
|
+
`clientApplication` is emitted by `@ontahi/codegen`. Retaining it on the client lets integrations
|
|
247
|
+
inside `OntahiGraphProvider`, including Devtools, discover the same browser-safe Entity and
|
|
248
|
+
Operation catalog without repeating it in component props. The provider likewise exposes its
|
|
249
|
+
resolved identity, cache, and transport as one client-session context.
|
|
250
|
+
|
|
168
251
|
The transport opens one lazy session, correlates concurrent Runtime Protocol requests, and sends
|
|
169
252
|
one Durable observation control frame per run. Sequenced snapshots are pushed over that socket;
|
|
170
253
|
the browser does not issue repeated `inspect` requests. Aborting the hook sends an unsubscribe and
|
|
@@ -204,8 +287,10 @@ Command. The executor supports policy-bounded Relationship Commands and identity
|
|
|
204
287
|
Mutation Commands; `useGraphExecutorCapability()` lets optional reflective UI discover whether the
|
|
205
288
|
host installed that execution surface without making it mandatory for read-only hosts.
|
|
206
289
|
|
|
207
|
-
`
|
|
290
|
+
`useEntityMutationCommand` executes create, update, and delete Commands and invalidates overlapping
|
|
291
|
+
Graph Reads from their committed semantic metadata. `useOrderedRelationshipCommand` executes
|
|
292
|
+
`move`/`before`/`after`/`prepend`/`append` commands through
|
|
208
293
|
the same Fetch or WebSocket Runtime Transport. Its result includes an exact `moved` delta, while a
|
|
209
294
|
stale exact-neighborhood precondition follows the command's fail-or-skip policy. Optimistic UI may
|
|
210
|
-
project the requested order temporarily
|
|
211
|
-
|
|
295
|
+
project the requested order temporarily; the hook refreshes possibly affected Reads after the
|
|
296
|
+
authority commits the command.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-operation-bridge-adapter.d.ts","sourceRoot":"","sources":["../../src/actions/fetch-operation-bridge-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AAUjC,OAAO,
|
|
1
|
+
{"version":3,"file":"fetch-operation-bridge-adapter.d.ts","sourceRoot":"","sources":["../../src/actions/fetch-operation-bridge-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,yBAAyB,EAC1B,MAAM,yBAAyB,CAAC;AAUjC,OAAO,EAKL,KAAK,gBAAgB,EACtB,MAAM,+BAA+B,CAAC;AAUvC,OAAO,KAAK,KAAK,eAAe,MAAM,uBAAuB,CAAC;AAI9D,MAAM,MAAM,2BAA2B,CAAC,iBAAiB,GAAG,SAAS,IAAI;IACvE,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kGAAkG;IAClG,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,iBAAiB,KAAK,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;IACpF,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IACvD,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;CAC1B,CAAC;AAyKF,eAAO,MAAM,oCAAoC,GAAI,iBAAiB,GAAG,SAAS,EAChF,UAAS,2BAA2B,CAAC,iBAAiB,CAAM,KAC3D,yBAoCF,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAAI,iBAAiB,GAAG,SAAS,EAC7E,UAAS,2BAA2B,CAAC,iBAAiB,CAAM,KAC3D,eAAe,CAAC,yBAyClB,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { normalizeGraphSchemaClientInput, resolveOperationExecutionAffordance, } from '@ontahi/core/data-graph';
|
|
3
3
|
import { isOperationInvocationProtocolResponse, } from '@ontahi/core/runtime/operation-invocation';
|
|
4
|
-
import { createRuntimeProtocolExchange, toOperationProtocolRequest, } from '@ontahi/core/runtime/protocol';
|
|
4
|
+
import { createRuntimeProtocolExchange, createRuntimeProtocolExecutionExchange, toOperationProtocolRequest, } from '@ontahi/core/runtime/protocol';
|
|
5
5
|
import { useMemo } from 'react';
|
|
6
6
|
import { createFetchRuntimeTransport } from '../graph/fetch-runtime-transport.js';
|
|
7
7
|
import { attachOperationBridgeActionRuntime, toOperationInvocationResult, unwrapOperationInvocationValue, } from './operation-bridge.js';
|
|
@@ -35,35 +35,49 @@ const postLegacyBridgeRequest = async (endpoint, request, fetchRequest, requestI
|
|
|
35
35
|
if (!response.ok && !isOperationInvocationProtocolResponse(payload)) {
|
|
36
36
|
throw new Error(`Graph bridge request failed with status ${response.status}.`);
|
|
37
37
|
}
|
|
38
|
-
return payload;
|
|
38
|
+
return { body: payload };
|
|
39
39
|
};
|
|
40
40
|
const createOperationRequest = (options) => {
|
|
41
41
|
const endpoint = operationEndpoint(options);
|
|
42
42
|
if (endpoint) {
|
|
43
43
|
return request => postLegacyBridgeRequest(endpoint, request, options.fetch ?? globalThis.fetch, options.requestInit);
|
|
44
44
|
}
|
|
45
|
+
const transport = options.runtimeTransport ??
|
|
46
|
+
createFetchRuntimeTransport({
|
|
47
|
+
...(options.fetch ? { fetch: options.fetch } : {}),
|
|
48
|
+
...(options.requestInit ? { requestInit: options.requestInit } : {}),
|
|
49
|
+
});
|
|
45
50
|
const exchange = createRuntimeProtocolExchange({
|
|
46
|
-
transport
|
|
47
|
-
createFetchRuntimeTransport({
|
|
48
|
-
...(options.fetch ? { fetch: options.fetch } : {}),
|
|
49
|
-
...(options.requestInit ? { requestInit: options.requestInit } : {}),
|
|
50
|
-
}),
|
|
51
|
+
transport,
|
|
51
52
|
requestId: options.requestId,
|
|
52
53
|
});
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
const executionExchange = createRuntimeProtocolExecutionExchange({
|
|
55
|
+
transport,
|
|
56
|
+
requestId: options.requestId,
|
|
56
57
|
});
|
|
58
|
+
return async (request) => request.kind === 'invoke'
|
|
59
|
+
? executionExchange({
|
|
60
|
+
family: 'operation',
|
|
61
|
+
body: toOperationProtocolRequest(request),
|
|
62
|
+
})
|
|
63
|
+
: {
|
|
64
|
+
body: await exchange({
|
|
65
|
+
family: 'operation',
|
|
66
|
+
body: toOperationProtocolRequest(request),
|
|
67
|
+
}),
|
|
68
|
+
};
|
|
57
69
|
};
|
|
58
70
|
const errorMessage = (error) => error instanceof Error ? error.message : 'Graph bridge request failed.';
|
|
59
71
|
const postBridgeRequest = async (requestOperation, request) => {
|
|
60
|
-
let
|
|
72
|
+
let execution;
|
|
61
73
|
try {
|
|
62
|
-
|
|
74
|
+
execution = await requestOperation(request);
|
|
63
75
|
}
|
|
64
76
|
catch (error) {
|
|
65
77
|
return { serverError: errorMessage(error) };
|
|
66
78
|
}
|
|
79
|
+
const payload = execution.body;
|
|
80
|
+
const executionMetadata = execution.metadata;
|
|
67
81
|
if (!isOperationInvocationProtocolResponse(payload)) {
|
|
68
82
|
return { serverError: 'Graph bridge returned an invalid response.' };
|
|
69
83
|
}
|
|
@@ -71,7 +85,10 @@ const postBridgeRequest = async (requestOperation, request) => {
|
|
|
71
85
|
return { serverError: payload.error.message };
|
|
72
86
|
}
|
|
73
87
|
if (request.kind === 'invoke' && payload.kind === 'invocation-result') {
|
|
74
|
-
return {
|
|
88
|
+
return {
|
|
89
|
+
data: payload.result,
|
|
90
|
+
...(executionMetadata ? { executionMetadata } : {}),
|
|
91
|
+
};
|
|
75
92
|
}
|
|
76
93
|
if (request.kind === 'check-permission' && payload.kind === 'permission-result') {
|
|
77
94
|
return { data: payload.result };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-operation-bridge-adapter.js","sourceRoot":"","sources":["../../src/actions/fetch-operation-bridge-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport type {\n ReflectedOperationInvocation,\n ReflectedOperationInvoker,\n} from '@ontahi/core/data-graph';\nimport {\n normalizeGraphSchemaClientInput,\n resolveOperationExecutionAffordance,\n} from '@ontahi/core/data-graph';\nimport type { OperationInvocationResult } from '@ontahi/core/runtime/contracts';\nimport {\n isOperationInvocationProtocolResponse,\n type OperationInvocationRequest,\n} from '@ontahi/core/runtime/operation-invocation';\nimport {\n createRuntimeProtocolExchange,\n toOperationProtocolRequest,\n type RuntimeTransport,\n} from '@ontahi/core/runtime/protocol';\nimport { useMemo } from 'react';\n\nimport { createFetchRuntimeTransport } from '../graph/fetch-runtime-transport.js';\n\nimport {\n attachOperationBridgeActionRuntime,\n toOperationInvocationResult,\n unwrapOperationInvocationValue,\n} from './operation-bridge.js';\nimport type * as OperationBridge from './operation-bridge.js';\nimport { useServerMutation, useServerQuery } from './react-query.js';\nimport type { ActionResultLike } from './use-action.js';\n\nexport type FetchOperationBridgeOptions<TTransportOptions = undefined> = {\n /** @deprecated Select the legacy Operation route through createFetchGraphClient compatibility. */\n mountPath?: string;\n /** @deprecated Select the legacy Operation route through createFetchGraphClient compatibility. */\n endpoint?: string;\n fetch?: typeof globalThis.fetch;\n requestInit?: (options?: TTransportOptions) => Omit<RequestInit, 'body' | 'method'>;\n runtimeTransport?: RuntimeTransport<TTransportOptions>;\n requestId?: () => string;\n};\n\nconst normalizeMountPath = (value: string) => {\n const path = value.startsWith('/') ? value : `/${value}`;\n let end = path.length;\n while (end > 0 && path.charCodeAt(end - 1) === 47) end -= 1;\n return path.slice(0, end);\n};\n\nconst mountedEndpoint = (mountPath: string, endpoint: string) =>\n `${normalizeMountPath(mountPath)}/${endpoint}`;\n\nconst operationEndpoint = <TTransportOptions>(\n options: FetchOperationBridgeOptions<TTransportOptions>,\n) =>\n options.endpoint ??\n (options.mountPath ? mountedEndpoint(options.mountPath, 'operations') : undefined);\n\nconst attachFetchBridgeRuntime = <TInput, TData>(\n operation: OperationBridge.BridgedOperationLike<TInput, TData>,\n action: OperationBridge.OperationBridgeAction<TInput, TData>,\n) =>\n attachOperationBridgeActionRuntime(operation, action, {\n requiresAuth: operation.authority !== 'server' ? false : operation.exposure !== 'bridge',\n });\n\ntype OperationRequest = (request: OperationInvocationRequest) => Promise<unknown>;\n\nconst postLegacyBridgeRequest = async <TTransportOptions>(\n endpoint: string,\n request: OperationInvocationRequest,\n fetchRequest: typeof globalThis.fetch,\n requestInit: ((options?: TTransportOptions) => Omit<RequestInit, 'body' | 'method'>) | undefined,\n): Promise<unknown> => {\n const init = requestInit?.() ?? {};\n const headers = new Headers(init.headers);\n if (!headers.has('content-type')) headers.set('content-type', 'application/json');\n const response = await fetchRequest(endpoint, {\n ...init,\n method: 'POST',\n headers,\n credentials: init.credentials ?? 'same-origin',\n body: JSON.stringify(request),\n });\n const payload: unknown = await response.json().catch(() => null);\n if (!response.ok && !isOperationInvocationProtocolResponse(payload)) {\n throw new Error(`Graph bridge request failed with status ${response.status}.`);\n }\n return payload;\n};\n\nconst createOperationRequest = <TTransportOptions>(\n options: FetchOperationBridgeOptions<TTransportOptions>,\n): OperationRequest => {\n const endpoint = operationEndpoint(options);\n if (endpoint) {\n return request =>\n postLegacyBridgeRequest(\n endpoint,\n request,\n options.fetch ?? globalThis.fetch,\n options.requestInit,\n );\n }\n\n const exchange = createRuntimeProtocolExchange({\n transport:\n options.runtimeTransport ??\n createFetchRuntimeTransport<TTransportOptions>({\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.requestInit ? { requestInit: options.requestInit } : {}),\n }),\n requestId: options.requestId,\n });\n return request =>\n exchange({\n family: 'operation',\n body: toOperationProtocolRequest(request),\n });\n};\n\nconst errorMessage = (error: unknown) =>\n error instanceof Error ? error.message : 'Graph bridge request failed.';\n\nconst postBridgeRequest = async <TData>(\n requestOperation: OperationRequest,\n request: OperationInvocationRequest,\n): Promise<ActionResultLike & { data?: TData }> => {\n let payload: unknown;\n try {\n payload = await requestOperation(request);\n } catch (error) {\n return { serverError: errorMessage(error) };\n }\n\n if (!isOperationInvocationProtocolResponse(payload)) {\n return { serverError: 'Graph bridge returned an invalid response.' };\n }\n\n if (payload.kind === 'protocol-error') {\n return { serverError: payload.error.message };\n }\n\n if (request.kind === 'invoke' && payload.kind === 'invocation-result') {\n return { data: payload.result as TData };\n }\n\n if (request.kind === 'check-permission' && payload.kind === 'permission-result') {\n return { data: payload.result as TData };\n }\n\n return { serverError: 'Graph bridge returned an invalid response.' };\n};\n\nconst createFetchBridgeAction = <TInput, TData>(\n requestOperation: OperationRequest,\n operation: OperationBridge.BridgedOperationLike<TInput, TData>,\n): OperationBridge.OperationBridgeAction<TInput, TData> =>\n attachFetchBridgeRuntime(operation, (input: TInput) => {\n const portableInput = operation.input\n ? normalizeGraphSchemaClientInput(operation.input, input, {\n bindSelection: selection => selection.toAst(),\n })\n : input;\n return postBridgeRequest<OperationInvocationResult<TData>>(requestOperation, {\n kind: 'invoke',\n operationId: operation.id,\n input: portableInput,\n ...(operation.view ? { view: operation.view } : {}),\n });\n }) as OperationBridge.OperationBridgeAction<TInput, TData>;\n\nconst createFetchPermissionAction =\n <TInput, TData>(\n requestOperation: OperationRequest,\n operation: OperationBridge.BridgedOperationLike<TInput, TData>,\n ): ((\n input: TInput,\n ) => Promise<OperationBridge.OperationBridgeActionResult<OperationBridge.GraphPermission>>) =>\n (input: TInput) =>\n postBridgeRequest<OperationBridge.GraphPermission>(requestOperation, {\n kind: 'check-permission',\n operationId: operation.id,\n input: operation.input\n ? normalizeGraphSchemaClientInput(operation.input, input, {\n bindSelection: selection => selection.toAst(),\n })\n : input,\n });\n\nexport const createFetchReflectedOperationInvoker = <TTransportOptions = undefined>(\n options: FetchOperationBridgeOptions<TTransportOptions> = {},\n): ReflectedOperationInvoker => {\n const requestOperation = createOperationRequest(options);\n const canInvokeOperation: NonNullable<\n ReflectedOperationInvoker['canInvokeOperation']\n > = operation =>\n operation.kind === undefined\n ? operation.exposure === undefined || operation.exposure === 'bridge'\n : operation.kind !== 'graph' && operation.exposure === 'bridge';\n\n return {\n canInvokeOperation,\n getOperationExecutionAffordance: operation =>\n resolveOperationExecutionAffordance(operation, {\n ...(canInvokeOperation(operation)\n ? {\n bridge: {\n authority: operation.authority ?? 'server',\n bridge: 'fetch',\n },\n }\n : {}),\n }),\n invokeOperation: async <TInput = unknown, TData = unknown>({\n input,\n operationId,\n view,\n }: ReflectedOperationInvocation<TInput>) =>\n toOperationInvocationResult<TData>(\n await postBridgeRequest<OperationInvocationResult<TData>>(requestOperation, {\n kind: 'invoke',\n operationId,\n input,\n ...(view ? { view } : {}),\n }),\n ),\n };\n};\n\nexport const createFetchOperationBridgeAdapter = <TTransportOptions = undefined>(\n options: FetchOperationBridgeOptions<TTransportOptions> = {},\n): OperationBridge.AnyOperationBridgeAdapter => {\n const requestOperation = createOperationRequest(options);\n const buildRuntimeAction = <TInput, TData>(\n operation: OperationBridge.BridgedOperationLike<TInput, TData>,\n ) => createFetchBridgeAction(requestOperation, operation);\n\n return {\n name: 'fetch',\n useBridgeAction: operation =>\n useMemo(\n () => buildRuntimeAction(operation) as OperationBridge.OperationBridgeAction<any, any>,\n [operation],\n ) as OperationBridge.OperationBridgeAction<any, any>,\n useBridgeMutation: (operation, options) => {\n const action = useMemo(() => buildRuntimeAction(operation), [operation]);\n\n return useServerMutation(\n action as OperationBridge.OperationBridgeAction<unknown, unknown>,\n options as Parameters<\n typeof useServerMutation<OperationBridge.OperationBridgeAction<unknown, unknown>>\n >[1],\n ) as ReturnType<typeof useServerMutation<OperationBridge.OperationBridgeAction<any, any>>>;\n },\n useBridgeQuery: (operation, args) => {\n const action = useMemo(() => buildRuntimeAction(operation), [operation]);\n\n return useServerQuery({\n action: action as OperationBridge.OperationBridgeAction<unknown, unknown>,\n input: args.input as unknown,\n key: args.key,\n select: unwrapOperationInvocationValue,\n }) as any;\n },\n usePermission: (operation, input, args) =>\n useServerQuery({\n enabled: args?.enabled,\n action: createFetchPermissionAction(requestOperation, operation),\n input,\n key: args?.queryKey ?? ['graph-permission', operation.id, input],\n }),\n };\n};\n"]}
|
|
1
|
+
{"version":3,"file":"fetch-operation-bridge-adapter.js","sourceRoot":"","sources":["../../src/actions/fetch-operation-bridge-adapter.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport type {\n ReflectedOperationInvocation,\n ReflectedOperationInvoker,\n} from '@ontahi/core/data-graph';\nimport {\n normalizeGraphSchemaClientInput,\n resolveOperationExecutionAffordance,\n} from '@ontahi/core/data-graph';\nimport type { OperationInvocationResult } from '@ontahi/core/runtime/contracts';\nimport {\n isOperationInvocationProtocolResponse,\n type OperationInvocationRequest,\n} from '@ontahi/core/runtime/operation-invocation';\nimport {\n createRuntimeProtocolExchange,\n createRuntimeProtocolExecutionExchange,\n toOperationProtocolRequest,\n type RuntimeProtocolExecutionExchangeResult,\n type RuntimeTransport,\n} from '@ontahi/core/runtime/protocol';\nimport { useMemo } from 'react';\n\nimport { createFetchRuntimeTransport } from '../graph/fetch-runtime-transport.js';\n\nimport {\n attachOperationBridgeActionRuntime,\n toOperationInvocationResult,\n unwrapOperationInvocationValue,\n} from './operation-bridge.js';\nimport type * as OperationBridge from './operation-bridge.js';\nimport { useServerMutation, useServerQuery } from './react-query.js';\nimport type { ActionResultLike } from './use-action.js';\n\nexport type FetchOperationBridgeOptions<TTransportOptions = undefined> = {\n /** @deprecated Select the legacy Operation route through createFetchGraphClient compatibility. */\n mountPath?: string;\n /** @deprecated Select the legacy Operation route through createFetchGraphClient compatibility. */\n endpoint?: string;\n fetch?: typeof globalThis.fetch;\n requestInit?: (options?: TTransportOptions) => Omit<RequestInit, 'body' | 'method'>;\n runtimeTransport?: RuntimeTransport<TTransportOptions>;\n requestId?: () => string;\n};\n\nconst normalizeMountPath = (value: string) => {\n const path = value.startsWith('/') ? value : `/${value}`;\n let end = path.length;\n while (end > 0 && path.charCodeAt(end - 1) === 47) end -= 1;\n return path.slice(0, end);\n};\n\nconst mountedEndpoint = (mountPath: string, endpoint: string) =>\n `${normalizeMountPath(mountPath)}/${endpoint}`;\n\nconst operationEndpoint = <TTransportOptions>(\n options: FetchOperationBridgeOptions<TTransportOptions>,\n) =>\n options.endpoint ??\n (options.mountPath ? mountedEndpoint(options.mountPath, 'operations') : undefined);\n\nconst attachFetchBridgeRuntime = <TInput, TData>(\n operation: OperationBridge.BridgedOperationLike<TInput, TData>,\n action: OperationBridge.OperationBridgeAction<TInput, TData>,\n) =>\n attachOperationBridgeActionRuntime(operation, action, {\n requiresAuth: operation.authority !== 'server' ? false : operation.exposure !== 'bridge',\n });\n\ntype OperationRequest = (\n request: OperationInvocationRequest,\n) => Promise<RuntimeProtocolExecutionExchangeResult>;\n\nconst postLegacyBridgeRequest = async <TTransportOptions>(\n endpoint: string,\n request: OperationInvocationRequest,\n fetchRequest: typeof globalThis.fetch,\n requestInit: ((options?: TTransportOptions) => Omit<RequestInit, 'body' | 'method'>) | undefined,\n): Promise<RuntimeProtocolExecutionExchangeResult> => {\n const init = requestInit?.() ?? {};\n const headers = new Headers(init.headers);\n if (!headers.has('content-type')) headers.set('content-type', 'application/json');\n const response = await fetchRequest(endpoint, {\n ...init,\n method: 'POST',\n headers,\n credentials: init.credentials ?? 'same-origin',\n body: JSON.stringify(request),\n });\n const payload: unknown = await response.json().catch(() => null);\n if (!response.ok && !isOperationInvocationProtocolResponse(payload)) {\n throw new Error(`Graph bridge request failed with status ${response.status}.`);\n }\n return { body: payload };\n};\n\nconst createOperationRequest = <TTransportOptions>(\n options: FetchOperationBridgeOptions<TTransportOptions>,\n): OperationRequest => {\n const endpoint = operationEndpoint(options);\n if (endpoint) {\n return request =>\n postLegacyBridgeRequest(\n endpoint,\n request,\n options.fetch ?? globalThis.fetch,\n options.requestInit,\n );\n }\n\n const transport =\n options.runtimeTransport ??\n createFetchRuntimeTransport<TTransportOptions>({\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(options.requestInit ? { requestInit: options.requestInit } : {}),\n });\n const exchange = createRuntimeProtocolExchange({\n transport,\n requestId: options.requestId,\n });\n const executionExchange = createRuntimeProtocolExecutionExchange({\n transport,\n requestId: options.requestId,\n });\n return async request =>\n request.kind === 'invoke'\n ? executionExchange({\n family: 'operation',\n body: toOperationProtocolRequest(request),\n })\n : {\n body: await exchange({\n family: 'operation',\n body: toOperationProtocolRequest(request),\n }),\n };\n};\n\nconst errorMessage = (error: unknown) =>\n error instanceof Error ? error.message : 'Graph bridge request failed.';\n\nconst postBridgeRequest = async <TData>(\n requestOperation: OperationRequest,\n request: OperationInvocationRequest,\n): Promise<ActionResultLike & { data?: TData }> => {\n let execution: RuntimeProtocolExecutionExchangeResult;\n try {\n execution = await requestOperation(request);\n } catch (error) {\n return { serverError: errorMessage(error) };\n }\n const payload = execution.body;\n const executionMetadata = execution.metadata;\n\n if (!isOperationInvocationProtocolResponse(payload)) {\n return { serverError: 'Graph bridge returned an invalid response.' };\n }\n\n if (payload.kind === 'protocol-error') {\n return { serverError: payload.error.message };\n }\n\n if (request.kind === 'invoke' && payload.kind === 'invocation-result') {\n return {\n data: payload.result as TData,\n ...(executionMetadata ? { executionMetadata } : {}),\n };\n }\n\n if (request.kind === 'check-permission' && payload.kind === 'permission-result') {\n return { data: payload.result as TData };\n }\n\n return { serverError: 'Graph bridge returned an invalid response.' };\n};\n\nconst createFetchBridgeAction = <TInput, TData>(\n requestOperation: OperationRequest,\n operation: OperationBridge.BridgedOperationLike<TInput, TData>,\n): OperationBridge.OperationBridgeAction<TInput, TData> =>\n attachFetchBridgeRuntime(operation, (input: TInput) => {\n const portableInput = operation.input\n ? normalizeGraphSchemaClientInput(operation.input, input, {\n bindSelection: selection => selection.toAst(),\n })\n : input;\n return postBridgeRequest<OperationInvocationResult<TData>>(requestOperation, {\n kind: 'invoke',\n operationId: operation.id,\n input: portableInput,\n ...(operation.view ? { view: operation.view } : {}),\n });\n }) as OperationBridge.OperationBridgeAction<TInput, TData>;\n\nconst createFetchPermissionAction =\n <TInput, TData>(\n requestOperation: OperationRequest,\n operation: OperationBridge.BridgedOperationLike<TInput, TData>,\n ): ((\n input: TInput,\n ) => Promise<OperationBridge.OperationBridgeActionResult<OperationBridge.GraphPermission>>) =>\n (input: TInput) =>\n postBridgeRequest<OperationBridge.GraphPermission>(requestOperation, {\n kind: 'check-permission',\n operationId: operation.id,\n input: operation.input\n ? normalizeGraphSchemaClientInput(operation.input, input, {\n bindSelection: selection => selection.toAst(),\n })\n : input,\n });\n\nexport const createFetchReflectedOperationInvoker = <TTransportOptions = undefined>(\n options: FetchOperationBridgeOptions<TTransportOptions> = {},\n): ReflectedOperationInvoker => {\n const requestOperation = createOperationRequest(options);\n const canInvokeOperation: NonNullable<\n ReflectedOperationInvoker['canInvokeOperation']\n > = operation =>\n operation.kind === undefined\n ? operation.exposure === undefined || operation.exposure === 'bridge'\n : operation.kind !== 'graph' && operation.exposure === 'bridge';\n\n return {\n canInvokeOperation,\n getOperationExecutionAffordance: operation =>\n resolveOperationExecutionAffordance(operation, {\n ...(canInvokeOperation(operation)\n ? {\n bridge: {\n authority: operation.authority ?? 'server',\n bridge: 'fetch',\n },\n }\n : {}),\n }),\n invokeOperation: async <TInput = unknown, TData = unknown>({\n input,\n operationId,\n view,\n }: ReflectedOperationInvocation<TInput>) =>\n toOperationInvocationResult<TData>(\n await postBridgeRequest<OperationInvocationResult<TData>>(requestOperation, {\n kind: 'invoke',\n operationId,\n input,\n ...(view ? { view } : {}),\n }),\n ),\n };\n};\n\nexport const createFetchOperationBridgeAdapter = <TTransportOptions = undefined>(\n options: FetchOperationBridgeOptions<TTransportOptions> = {},\n): OperationBridge.AnyOperationBridgeAdapter => {\n const requestOperation = createOperationRequest(options);\n const buildRuntimeAction = <TInput, TData>(\n operation: OperationBridge.BridgedOperationLike<TInput, TData>,\n ) => createFetchBridgeAction(requestOperation, operation);\n\n return {\n name: 'fetch',\n useBridgeAction: operation =>\n useMemo(\n () => buildRuntimeAction(operation) as OperationBridge.OperationBridgeAction<any, any>,\n [operation],\n ) as OperationBridge.OperationBridgeAction<any, any>,\n useBridgeMutation: (operation, options) => {\n const action = useMemo(() => buildRuntimeAction(operation), [operation]);\n\n return useServerMutation(\n action as OperationBridge.OperationBridgeAction<unknown, unknown>,\n options as Parameters<\n typeof useServerMutation<OperationBridge.OperationBridgeAction<unknown, unknown>>\n >[1],\n ) as ReturnType<typeof useServerMutation<OperationBridge.OperationBridgeAction<any, any>>>;\n },\n useBridgeQuery: (operation, args) => {\n const action = useMemo(() => buildRuntimeAction(operation), [operation]);\n\n return useServerQuery({\n action: action as OperationBridge.OperationBridgeAction<unknown, unknown>,\n input: args.input as unknown,\n key: args.key,\n select: unwrapOperationInvocationValue,\n }) as any;\n },\n usePermission: (operation, input, args) =>\n useServerQuery({\n enabled: args?.enabled,\n action: createFetchPermissionAction(requestOperation, operation),\n input,\n key: args?.queryKey ?? ['graph-permission', operation.id, input],\n }),\n };\n};\n"]}
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import type { ClientDomainOperationDeclaration, EntityViewAst } from '@ontahi/core/data-graph';
|
|
2
2
|
import { type ActionQueryKey } from '@ontahi/core/runtime/actions';
|
|
3
3
|
import type { OperationInvocationResult } from '@ontahi/core/runtime/contracts';
|
|
4
|
+
import type { RuntimeProtocolExecutionMetadata } from '@ontahi/core/runtime/protocol';
|
|
4
5
|
import type { QueryKey, UseQueryResult } from '@tanstack/react-query';
|
|
5
6
|
import type { ActionResultLike, UseActionOptions, UseActionResult } from './use-action.js';
|
|
6
7
|
export type { OperationInvocationResult };
|
|
7
8
|
export type OperationBridgeActionResult<TData> = Omit<ActionResultLike, 'data'> & {
|
|
8
9
|
data?: TData;
|
|
10
|
+
executionMetadata?: RuntimeProtocolExecutionMetadata;
|
|
9
11
|
};
|
|
10
12
|
export type OperationBridgeAction<TInput, TData> = (input: TInput) => Promise<OperationBridgeActionResult<OperationInvocationResult<TData>>>;
|
|
11
13
|
export type OperationInvocationFailure<TFailure = unknown> = Exclude<OperationInvocationResult<unknown, TFailure>, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-bridge.d.ts","sourceRoot":"","sources":["../../src/actions/operation-bridge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gCAAgC,EAChC,aAAa,EAEd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"operation-bridge.d.ts","sourceRoot":"","sources":["../../src/actions/operation-bridge.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,gCAAgC,EAChC,aAAa,EAEd,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAIL,KAAK,cAAc,EACpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AAEtF,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE3F,YAAY,EAAE,yBAAyB,EAAE,CAAC;AAE1C,MAAM,MAAM,2BAA2B,CAAC,KAAK,IAAI,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,GAAG;IAChF,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,iBAAiB,CAAC,EAAE,gCAAgC,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAAC,MAAM,EAAE,KAAK,IAAI,CACjD,KAAK,EAAE,MAAM,KACV,OAAO,CAAC,2BAA2B,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAE5E,MAAM,MAAM,0BAA0B,CAAC,QAAQ,GAAG,OAAO,IAAI,OAAO,CAClE,yBAAyB,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC5C;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,CACb,CAAC;AAEF,qBAAa,8BAA8B,CAAC,QAAQ,GAAG,OAAO,CAAE,SAAQ,KAAK;IAI/D,QAAQ,CAAC,MAAM,EAAE,0BAA0B,CAAC,QAAQ,CAAC;IAHjE,QAAQ,CAAC,IAAI,oCAAoC;IACjD,SAAiB,KAAK,CAAC,EAAE,OAAO,CAAC;gBAEZ,MAAM,EAAE,0BAA0B,CAAC,QAAQ,CAAC;IAUjE,MAAM;;;;;;CAQP;AAED,eAAO,MAAM,2BAA2B,GAAI,KAAK,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EAC7E,OAAO,OAAO,KACb,KAAK,IAAI,yBAAyB,CAAC,KAAK,EAAE,QAAQ,CAC+B,CAAC;AAErF,eAAO,MAAM,sBAAsB,GAAI,SAAS,MAAM,KAAG,yBAKvD,CAAC;AAEH,eAAO,MAAM,2BAA2B,GAAI,KAAK,EAC/C,QAAQ,2BAA2B,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,KACpE,yBAAyB,CAAC,KAAK,CAsBjC,CAAC;AAEF,eAAO,MAAM,8BAA8B,GAAI,KAAK,EAClD,QAAQ,yBAAyB,CAAC,KAAK,CAAC,KACvC,KAMF,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAAC,MAAM,EAAE,KAAK,IAAI,gCAAgC,CAChF,MAAM,EACN,KAAK,CACN,GAAG;IACF,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG,CAAC,KAAK,EAAE;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,aAAa,CAAC;CACtB,KAAK,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAEhC,MAAM,MAAM,eAAe,GACvB;IACE,OAAO,EAAE,IAAI,CAAC;CACf,GACD;IACE,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEN,MAAM,MAAM,0CAA0C,GAAG,CAAC,KAAK,EAAE;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,OAAO,CAAC;CAChB,KAAK,OAAO,CAAC,2BAA2B,CAAC,eAAe,CAAC,CAAC,CAAC;AAE5D,MAAM,MAAM,sBAAsB,CAAC,YAAY,SAAS,MAAM,GAAG,MAAM,IAAI;IACzE,IAAI,EAAE,YAAY,CAAC;IACnB,eAAe,EAAE,CAAC,MAAM,EAAE,KAAK,EAC7B,SAAS,EAAE,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,KAC3C,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1C,iBAAiB,EAAE,CAAC,MAAM,EAAE,KAAK,EAC/B,SAAS,EAAE,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,EAC9C,OAAO,CAAC,EAAE,gBAAgB,CAAC,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG;QACjE,mBAAmB,CAAC,EAAE,OAAO,CAAC;KAC/B,KACE,eAAe,CAAC,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3D,cAAc,EAAE,CAAC,MAAM,EAAE,KAAK,EAC5B,SAAS,EAAE,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,EAC9C,IAAI,EAAE;QACJ,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,QAAQ,CAAC;KACf,KACE,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAClC,aAAa,EAAE,CAAC,MAAM,EAAE,KAAK,EAC3B,SAAS,EAAE,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,EAC9C,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;KACrB,KACE,cAAc,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;CAC7C,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAEvE,eAAO,MAAM,+BAA+B,GAAI,MAAM,EAAE,KAAK,EAC3D,WAAW,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,4CACwC,CAAC;AAczF,eAAO,MAAM,8BAA8B,GAAI,MAAM,EAAE,KAAK,EAC1D,WAAW,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,EAC9C,OAAO,MAAM,KACZ,cASF,CAAC;AAEF,eAAO,MAAM,2CAA2C,GAAI,MAAM,EAAE,KAAK,EACvE,WAAW,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,EAC9C,OAAO,MAAM,KACZ,cAAc,EAMhB,CAAC;AAEF,eAAO,MAAM,iCAAiC,GAC3C,MAAM,EAAE,KAAK,EACZ,cAAc,8BAA8B,EAC5C,WAAW,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,KAC7C,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAMwC,CAAC;AAEjF,eAAO,MAAM,kCAAkC,GAAI,MAAM,EAAE,KAAK,EAC9D,WAAW,oBAAoB,CAAC,MAAM,EAAE,KAAK,CAAC,EAC9C,QAAQ,qBAAqB,CAAC,MAAM,EAAE,KAAK,CAAC,EAC5C,SAAS;IACP,YAAY,EAAE,OAAO,CAAC;CACvB;;CAUC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-bridge.js","sourceRoot":"","sources":["../../src/actions/operation-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport type {\n ClientDomainOperationDeclaration,\n EntityViewAst,\n QueryKeySegment,\n} from '@ontahi/core/data-graph';\nimport {\n attachActionRuntime,\n getActionErrorMessage,\n hasActionError,\n type ActionQueryKey,\n} from '@ontahi/core/runtime/actions';\nimport type { OperationInvocationResult } from '@ontahi/core/runtime/contracts';\nimport { isRecord } from '@ontahi/core/value/object';\nimport type { QueryKey, UseQueryResult } from '@tanstack/react-query';\n\nimport type { ActionResultLike, UseActionOptions, UseActionResult } from './use-action.js';\n\nexport type { OperationInvocationResult };\n\nexport type OperationBridgeActionResult<TData> = Omit<ActionResultLike, 'data'> & {\n data?: TData;\n};\n\nexport type OperationBridgeAction<TInput, TData> = (\n input: TInput,\n) => Promise<OperationBridgeActionResult<OperationInvocationResult<TData>>>;\n\nexport type OperationInvocationFailure<TFailure = unknown> = Exclude<\n OperationInvocationResult<unknown, TFailure>,\n { ok: true }\n>;\n\nexport class OperationInvocationResultError<TFailure = unknown> extends Error {\n readonly name = 'OperationInvocationResultError';\n declare readonly cause?: unknown;\n\n constructor(readonly result: OperationInvocationFailure<TFailure>) {\n super(result.message);\n if (result.kind === 'failed') {\n Object.defineProperty(this, 'cause', {\n configurable: true,\n value: result.failure,\n });\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n ...(this.cause === undefined ? {} : { cause: this.cause }),\n result: this.result,\n };\n }\n}\n\nexport const isOperationInvocationResult = <TData = unknown, TFailure = unknown>(\n value: unknown,\n): value is OperationInvocationResult<TData, TFailure> =>\n isRecord(value) && typeof value.ok === 'boolean' && typeof value.kind === 'string';\n\nexport const operationBridgeErrored = (message: string): OperationInvocationResult => ({\n ok: false,\n kind: 'errored',\n executed: 'unknown',\n message,\n});\n\nexport const toOperationInvocationResult = <TData>(\n result: OperationBridgeActionResult<OperationInvocationResult<TData>>,\n): OperationInvocationResult<TData> => {\n if (hasActionError(result)) {\n return operationBridgeErrored(\n getActionErrorMessage(result),\n ) as OperationInvocationResult<TData>;\n }\n\n if (isOperationInvocationResult<TData>(result.data)) {\n return result.data;\n }\n\n if ('data' in result) {\n return {\n ok: true,\n kind: 'success',\n value: result.data as TData,\n };\n }\n\n return operationBridgeErrored(\n 'Graph operation bridge returned an invalid response.',\n ) as OperationInvocationResult<TData>;\n};\n\nexport const unwrapOperationInvocationValue = <TData>(\n result: OperationInvocationResult<TData>,\n): TData => {\n if (result.ok) {\n return result.value;\n }\n\n throw new OperationInvocationResultError(result);\n};\n\nexport type BridgedOperationLike<TInput, TData> = ClientDomainOperationDeclaration<\n TInput,\n TData\n> & {\n id: string;\n entityName: string;\n name: string;\n view?: EntityViewAst;\n};\n\nexport type RunDomainOperationBridgeAction = (input: {\n operationId: string;\n input: unknown;\n view?: EntityViewAst;\n}) => Promise<ActionResultLike>;\n\nexport type GraphPermission =\n | {\n allowed: true;\n }\n | {\n allowed: false;\n reason: string;\n message: string;\n };\n\nexport type CheckDomainOperationPermissionBridgeAction = (input: {\n operationId: string;\n input: unknown;\n}) => Promise<OperationBridgeActionResult<GraphPermission>>;\n\nexport type OperationBridgeAdapter<TAdapterName extends string = string> = {\n name: TAdapterName;\n useBridgeAction: <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n ) => OperationBridgeAction<TInput, TData>;\n useBridgeMutation: <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n options?: UseActionOptions<OperationBridgeAction<TInput, TData>> & {\n invalidateOnSuccess?: boolean;\n },\n ) => UseActionResult<OperationBridgeAction<TInput, TData>>;\n useBridgeQuery: <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n args: {\n input: TInput;\n key: QueryKey;\n },\n ) => UseQueryResult<TData, Error>;\n usePermission: <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n input: TInput,\n options?: {\n enabled?: boolean;\n queryKey?: QueryKey;\n },\n ) => UseQueryResult<GraphPermission, Error>;\n};\n\nexport type AnyOperationBridgeAdapter = OperationBridgeAdapter<string>;\n\nexport const resolveOperationBridgeQuerySpec = <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n) => [operation.entityName, operation.name, ...(operation.bridge?.query ?? [])] as const;\n\nconst resolveOperationBridgeQueryKeySegment = <TInput, TData>(\n segment: QueryKeySegment<TInput>,\n operation: BridgedOperationLike<TInput, TData>,\n input: TInput,\n) =>\n typeof segment === 'function'\n ? segment(input, {\n input,\n operation,\n })\n : segment;\n\nexport const resolveOperationBridgeQueryKey = <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n input: TInput,\n): ActionQueryKey => {\n return [\n operation.entityName,\n operation.name,\n ...(operation.view ? [operation.view] : []),\n ...(operation.bridge?.query?.map(segment =>\n resolveOperationBridgeQueryKeySegment(segment, operation, input),\n ) ?? []),\n ];\n};\n\nexport const resolveOperationBridgeInvalidationQueryKeys = <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n input: TInput,\n): ActionQueryKey[] => {\n return (\n operation.bridge?.invalidate?.map(querySpec =>\n querySpec.map(segment => resolveOperationBridgeQueryKeySegment(segment, operation, input)),\n ) ?? []\n );\n};\n\nexport const createDomainOperationBridgeAction =\n <TInput, TData>(\n bridgeAction: RunDomainOperationBridgeAction,\n operation: BridgedOperationLike<TInput, TData>,\n ): OperationBridgeAction<TInput, TData> =>\n (input: TInput) =>\n bridgeAction({\n operationId: operation.id,\n input,\n ...(operation.view ? { view: operation.view } : {}),\n }) as Promise<OperationBridgeActionResult<OperationInvocationResult<TData>>>;\n\nexport const attachOperationBridgeActionRuntime = <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n action: OperationBridgeAction<TInput, TData>,\n options: {\n requiresAuth: boolean;\n },\n) =>\n attachActionRuntime(action, {\n feature: operation.entityName,\n actionName: operation.name,\n requiresAuth: options.requiresAuth,\n queryKeyPrefix: [operation.entityName, operation.name] as const,\n getQueryKey: input => resolveOperationBridgeQueryKey(operation, input as TInput),\n getAffectedQueryKeys: ({ input }) =>\n resolveOperationBridgeInvalidationQueryKeys(operation, input as TInput),\n });\n"]}
|
|
1
|
+
{"version":3,"file":"operation-bridge.js","sourceRoot":"","sources":["../../src/actions/operation-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport type {\n ClientDomainOperationDeclaration,\n EntityViewAst,\n QueryKeySegment,\n} from '@ontahi/core/data-graph';\nimport {\n attachActionRuntime,\n getActionErrorMessage,\n hasActionError,\n type ActionQueryKey,\n} from '@ontahi/core/runtime/actions';\nimport type { OperationInvocationResult } from '@ontahi/core/runtime/contracts';\nimport type { RuntimeProtocolExecutionMetadata } from '@ontahi/core/runtime/protocol';\nimport { isRecord } from '@ontahi/core/value/object';\nimport type { QueryKey, UseQueryResult } from '@tanstack/react-query';\n\nimport type { ActionResultLike, UseActionOptions, UseActionResult } from './use-action.js';\n\nexport type { OperationInvocationResult };\n\nexport type OperationBridgeActionResult<TData> = Omit<ActionResultLike, 'data'> & {\n data?: TData;\n executionMetadata?: RuntimeProtocolExecutionMetadata;\n};\n\nexport type OperationBridgeAction<TInput, TData> = (\n input: TInput,\n) => Promise<OperationBridgeActionResult<OperationInvocationResult<TData>>>;\n\nexport type OperationInvocationFailure<TFailure = unknown> = Exclude<\n OperationInvocationResult<unknown, TFailure>,\n { ok: true }\n>;\n\nexport class OperationInvocationResultError<TFailure = unknown> extends Error {\n readonly name = 'OperationInvocationResultError';\n declare readonly cause?: unknown;\n\n constructor(readonly result: OperationInvocationFailure<TFailure>) {\n super(result.message);\n if (result.kind === 'failed') {\n Object.defineProperty(this, 'cause', {\n configurable: true,\n value: result.failure,\n });\n }\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n ...(this.cause === undefined ? {} : { cause: this.cause }),\n result: this.result,\n };\n }\n}\n\nexport const isOperationInvocationResult = <TData = unknown, TFailure = unknown>(\n value: unknown,\n): value is OperationInvocationResult<TData, TFailure> =>\n isRecord(value) && typeof value.ok === 'boolean' && typeof value.kind === 'string';\n\nexport const operationBridgeErrored = (message: string): OperationInvocationResult => ({\n ok: false,\n kind: 'errored',\n executed: 'unknown',\n message,\n});\n\nexport const toOperationInvocationResult = <TData>(\n result: OperationBridgeActionResult<OperationInvocationResult<TData>>,\n): OperationInvocationResult<TData> => {\n if (hasActionError(result)) {\n return operationBridgeErrored(\n getActionErrorMessage(result),\n ) as OperationInvocationResult<TData>;\n }\n\n if (isOperationInvocationResult<TData>(result.data)) {\n return result.data;\n }\n\n if ('data' in result) {\n return {\n ok: true,\n kind: 'success',\n value: result.data as TData,\n };\n }\n\n return operationBridgeErrored(\n 'Graph operation bridge returned an invalid response.',\n ) as OperationInvocationResult<TData>;\n};\n\nexport const unwrapOperationInvocationValue = <TData>(\n result: OperationInvocationResult<TData>,\n): TData => {\n if (result.ok) {\n return result.value;\n }\n\n throw new OperationInvocationResultError(result);\n};\n\nexport type BridgedOperationLike<TInput, TData> = ClientDomainOperationDeclaration<\n TInput,\n TData\n> & {\n id: string;\n entityName: string;\n name: string;\n view?: EntityViewAst;\n};\n\nexport type RunDomainOperationBridgeAction = (input: {\n operationId: string;\n input: unknown;\n view?: EntityViewAst;\n}) => Promise<ActionResultLike>;\n\nexport type GraphPermission =\n | {\n allowed: true;\n }\n | {\n allowed: false;\n reason: string;\n message: string;\n };\n\nexport type CheckDomainOperationPermissionBridgeAction = (input: {\n operationId: string;\n input: unknown;\n}) => Promise<OperationBridgeActionResult<GraphPermission>>;\n\nexport type OperationBridgeAdapter<TAdapterName extends string = string> = {\n name: TAdapterName;\n useBridgeAction: <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n ) => OperationBridgeAction<TInput, TData>;\n useBridgeMutation: <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n options?: UseActionOptions<OperationBridgeAction<TInput, TData>> & {\n invalidateOnSuccess?: boolean;\n },\n ) => UseActionResult<OperationBridgeAction<TInput, TData>>;\n useBridgeQuery: <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n args: {\n input: TInput;\n key: QueryKey;\n },\n ) => UseQueryResult<TData, Error>;\n usePermission: <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n input: TInput,\n options?: {\n enabled?: boolean;\n queryKey?: QueryKey;\n },\n ) => UseQueryResult<GraphPermission, Error>;\n};\n\nexport type AnyOperationBridgeAdapter = OperationBridgeAdapter<string>;\n\nexport const resolveOperationBridgeQuerySpec = <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n) => [operation.entityName, operation.name, ...(operation.bridge?.query ?? [])] as const;\n\nconst resolveOperationBridgeQueryKeySegment = <TInput, TData>(\n segment: QueryKeySegment<TInput>,\n operation: BridgedOperationLike<TInput, TData>,\n input: TInput,\n) =>\n typeof segment === 'function'\n ? segment(input, {\n input,\n operation,\n })\n : segment;\n\nexport const resolveOperationBridgeQueryKey = <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n input: TInput,\n): ActionQueryKey => {\n return [\n operation.entityName,\n operation.name,\n ...(operation.view ? [operation.view] : []),\n ...(operation.bridge?.query?.map(segment =>\n resolveOperationBridgeQueryKeySegment(segment, operation, input),\n ) ?? []),\n ];\n};\n\nexport const resolveOperationBridgeInvalidationQueryKeys = <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n input: TInput,\n): ActionQueryKey[] => {\n return (\n operation.bridge?.invalidate?.map(querySpec =>\n querySpec.map(segment => resolveOperationBridgeQueryKeySegment(segment, operation, input)),\n ) ?? []\n );\n};\n\nexport const createDomainOperationBridgeAction =\n <TInput, TData>(\n bridgeAction: RunDomainOperationBridgeAction,\n operation: BridgedOperationLike<TInput, TData>,\n ): OperationBridgeAction<TInput, TData> =>\n (input: TInput) =>\n bridgeAction({\n operationId: operation.id,\n input,\n ...(operation.view ? { view: operation.view } : {}),\n }) as Promise<OperationBridgeActionResult<OperationInvocationResult<TData>>>;\n\nexport const attachOperationBridgeActionRuntime = <TInput, TData>(\n operation: BridgedOperationLike<TInput, TData>,\n action: OperationBridgeAction<TInput, TData>,\n options: {\n requiresAuth: boolean;\n },\n) =>\n attachActionRuntime(action, {\n feature: operation.entityName,\n actionName: operation.name,\n requiresAuth: options.requiresAuth,\n queryKeyPrefix: [operation.entityName, operation.name] as const,\n getQueryKey: input => resolveOperationBridgeQueryKey(operation, input as TInput),\n getAffectedQueryKeys: ({ input }) =>\n resolveOperationBridgeInvalidationQueryKeys(operation, input as TInput),\n });\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { ModelCommandCanonicalRequest } from '@ontahi/core/runtime/protocol';
|
|
2
|
+
import { type QueryClient, type QueryKey } from '@tanstack/react-query';
|
|
3
|
+
import { type BridgedOperationLike } from '../actions/index.js';
|
|
4
|
+
export type CanonicalRequestInvalidation = {
|
|
5
|
+
readonly kind: 'read' | 'graph-command' | 'operation';
|
|
6
|
+
readonly queryKeys: readonly QueryKey[];
|
|
7
|
+
};
|
|
8
|
+
export declare const invalidateCanonicalRequest: (queryClient: QueryClient, request: ModelCommandCanonicalRequest, operations: ReadonlyMap<string, BridgedOperationLike<any, any>>) => Promise<CanonicalRequestInvalidation>;
|
|
9
|
+
/**
|
|
10
|
+
* @deprecated Compatibility fallback for receivers without committed mutation metadata. Prefer
|
|
11
|
+
* semantic mutation hooks or `invalidateSemanticGraphReads` with Runtime Protocol metadata.
|
|
12
|
+
*/
|
|
13
|
+
export declare const useCanonicalRequestInvalidation: (operations: readonly BridgedOperationLike<any, any>[]) => (request: ModelCommandCanonicalRequest) => Promise<CanonicalRequestInvalidation>;
|
|
14
|
+
//# sourceMappingURL=canonical-request-invalidation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-request-invalidation.d.ts","sourceRoot":"","sources":["../../src/graph/canonical-request-invalidation.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,EAAkB,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAGxF,OAAO,EAEL,KAAK,oBAAoB,EAC1B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,WAAW,CAAC;IACtD,QAAQ,CAAC,SAAS,EAAE,SAAS,QAAQ,EAAE,CAAC;CACzC,CAAC;AAYF,eAAO,MAAM,0BAA0B,GACrC,aAAa,WAAW,EACxB,SAAS,4BAA4B,EACrC,YAAY,WAAW,CAAC,MAAM,EAAE,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,KAC9D,OAAO,CAAC,4BAA4B,CAmBtC,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,+BAA+B,GAC1C,YAAY,SAAS,oBAAoB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,eASzC,4BAA4B,0CAIzC,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { normalizeGraphSchemaClientInput } from '@ontahi/core/data-graph';
|
|
3
|
+
import { useQueryClient } from '@tanstack/react-query';
|
|
4
|
+
import { useCallback, useMemo } from 'react';
|
|
5
|
+
import { resolveOperationBridgeInvalidationQueryKeys, } from '../actions/index.js';
|
|
6
|
+
const graphCommandEntityNames = (request) => {
|
|
7
|
+
const command = request.command;
|
|
8
|
+
if (command.kind === 'entity-mutation-command')
|
|
9
|
+
return [command.entityName];
|
|
10
|
+
return [...new Set([command.relation.sourceEntityName, command.relation.targetEntityName])];
|
|
11
|
+
};
|
|
12
|
+
const invalidateQueryKeys = async (queryClient, queryKeys) => {
|
|
13
|
+
await Promise.all(queryKeys.map(queryKey => queryClient.invalidateQueries({ queryKey })));
|
|
14
|
+
};
|
|
15
|
+
export const invalidateCanonicalRequest = async (queryClient, request, operations) => {
|
|
16
|
+
if (request.kind === 'graph-read')
|
|
17
|
+
return { kind: 'read', queryKeys: [] };
|
|
18
|
+
if (request.kind === 'graph-command') {
|
|
19
|
+
const queryKeys = graphCommandEntityNames(request).map(entityName => [entityName]);
|
|
20
|
+
await invalidateQueryKeys(queryClient, queryKeys);
|
|
21
|
+
return { kind: 'graph-command', queryKeys };
|
|
22
|
+
}
|
|
23
|
+
const operation = operations.get(request.operationId);
|
|
24
|
+
if (!operation)
|
|
25
|
+
throw new Error(`No client Operation is registered for "${request.operationId}".`);
|
|
26
|
+
const input = operation.input
|
|
27
|
+
? normalizeGraphSchemaClientInput(operation.input, request.input)
|
|
28
|
+
: request.input;
|
|
29
|
+
const queryKeys = resolveOperationBridgeInvalidationQueryKeys(operation, input);
|
|
30
|
+
await invalidateQueryKeys(queryClient, queryKeys);
|
|
31
|
+
return { kind: 'operation', queryKeys };
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* @deprecated Compatibility fallback for receivers without committed mutation metadata. Prefer
|
|
35
|
+
* semantic mutation hooks or `invalidateSemanticGraphReads` with Runtime Protocol metadata.
|
|
36
|
+
*/
|
|
37
|
+
export const useCanonicalRequestInvalidation = (operations) => {
|
|
38
|
+
const queryClient = useQueryClient();
|
|
39
|
+
const operationMap = useMemo(() => new Map(operations.map(operation => [operation.id, operation])), [operations]);
|
|
40
|
+
return useCallback((request) => invalidateCanonicalRequest(queryClient, request, operationMap), [operationMap, queryClient]);
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=canonical-request-invalidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-request-invalidation.js","sourceRoot":"","sources":["../../src/graph/canonical-request-invalidation.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport { normalizeGraphSchemaClientInput, type GraphCommandRequest } from '@ontahi/core/data-graph';\nimport type { ModelCommandCanonicalRequest } from '@ontahi/core/runtime/protocol';\nimport { useQueryClient, type QueryClient, type QueryKey } from '@tanstack/react-query';\nimport { useCallback, useMemo } from 'react';\n\nimport {\n resolveOperationBridgeInvalidationQueryKeys,\n type BridgedOperationLike,\n} from '../actions/index.js';\n\nexport type CanonicalRequestInvalidation = {\n readonly kind: 'read' | 'graph-command' | 'operation';\n readonly queryKeys: readonly QueryKey[];\n};\n\nconst graphCommandEntityNames = (request: GraphCommandRequest): readonly string[] => {\n const command = request.command;\n if (command.kind === 'entity-mutation-command') return [command.entityName];\n return [...new Set([command.relation.sourceEntityName, command.relation.targetEntityName])];\n};\n\nconst invalidateQueryKeys = async (queryClient: QueryClient, queryKeys: readonly QueryKey[]) => {\n await Promise.all(queryKeys.map(queryKey => queryClient.invalidateQueries({ queryKey })));\n};\n\nexport const invalidateCanonicalRequest = async (\n queryClient: QueryClient,\n request: ModelCommandCanonicalRequest,\n operations: ReadonlyMap<string, BridgedOperationLike<any, any>>,\n): Promise<CanonicalRequestInvalidation> => {\n if (request.kind === 'graph-read') return { kind: 'read', queryKeys: [] };\n\n if (request.kind === 'graph-command') {\n const queryKeys = graphCommandEntityNames(request).map(entityName => [entityName]);\n await invalidateQueryKeys(queryClient, queryKeys);\n return { kind: 'graph-command', queryKeys };\n }\n\n const operation = operations.get(request.operationId);\n if (!operation)\n throw new Error(`No client Operation is registered for \"${request.operationId}\".`);\n\n const input = operation.input\n ? normalizeGraphSchemaClientInput(operation.input, request.input)\n : request.input;\n const queryKeys = resolveOperationBridgeInvalidationQueryKeys(operation, input);\n await invalidateQueryKeys(queryClient, queryKeys);\n return { kind: 'operation', queryKeys };\n};\n\n/**\n * @deprecated Compatibility fallback for receivers without committed mutation metadata. Prefer\n * semantic mutation hooks or `invalidateSemanticGraphReads` with Runtime Protocol metadata.\n */\nexport const useCanonicalRequestInvalidation = (\n operations: readonly BridgedOperationLike<any, any>[],\n) => {\n const queryClient = useQueryClient();\n const operationMap = useMemo(\n () => new Map(operations.map(operation => [operation.id, operation])),\n [operations],\n );\n\n return useCallback(\n (request: ModelCommandCanonicalRequest) =>\n invalidateCanonicalRequest(queryClient, request, operationMap),\n [operationMap, queryClient],\n );\n};\n"]}
|
package/dist/graph/context.d.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
import { type GraphClientCache, type OperationExecutionAffordance, type ReflectedEntityDataReader, type ReflectedRelatedEntityDataReader, type ReflectedOperationDescriptor, type ReflectedOperationInvoker } from '@ontahi/core/data-graph';
|
|
1
|
+
import { type ClientApplication, type GraphClientCache, type OperationExecutionAffordance, type ReflectedEntityDataReader, type ReflectedRelatedEntityDataReader, type ReflectedOperationDescriptor, type ReflectedOperationInvoker } from '@ontahi/core/data-graph';
|
|
2
2
|
import { type ExecutionIdentity } from '@ontahi/core/runtime/identity';
|
|
3
|
-
import type
|
|
3
|
+
import { type RuntimeTransport } from '@ontahi/core/runtime/protocol';
|
|
4
4
|
import { type ReactNode } from 'react';
|
|
5
5
|
import type { AnyOperationBridgeAdapter } from '../actions/index.js';
|
|
6
6
|
import type { ReactGraphExecutor } from './executor.js';
|
|
7
7
|
import { type OntahiGraphClient } from './fetch-graph-client.js';
|
|
8
8
|
import { type ReflectedGraphOperationLike } from './reflected-operation-invoker.js';
|
|
9
|
+
export type OntahiClientContextValue = {
|
|
10
|
+
readonly application?: ClientApplication;
|
|
11
|
+
readonly clientCache: GraphClientCache;
|
|
12
|
+
readonly identity: ExecutionIdentity;
|
|
13
|
+
readonly runtimeTransport?: RuntimeTransport;
|
|
14
|
+
};
|
|
9
15
|
export type OntahiGraphProviderProps<TGraphRuntime = unknown, TReadOptions = unknown, TCommandOptions = TReadOptions> = {
|
|
10
16
|
children: ReactNode;
|
|
11
17
|
runtime: TGraphRuntime;
|
|
@@ -21,6 +27,7 @@ export type OntahiGraphProviderProps<TGraphRuntime = unknown, TReadOptions = unk
|
|
|
21
27
|
identity?: ExecutionIdentity;
|
|
22
28
|
};
|
|
23
29
|
export declare function OntahiGraphProvider<TGraphRuntime = unknown, TReadOptions = unknown, TCommandOptions = TReadOptions>({ children, runtime, graphExecutor, runtimeTransport, client, operationBridgeAdapters, reflectedEntityDataReader, reflectedRelatedEntityDataReader, reflectedOperationInvoker, reflectedGraphOperations, clientCache, identity, }: OntahiGraphProviderProps<TGraphRuntime, TReadOptions, TCommandOptions>): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
export declare const useOntahiClientContext: () => OntahiClientContextValue | undefined;
|
|
24
31
|
export declare const useExecutionIdentity: () => ExecutionIdentity;
|
|
25
32
|
export declare function useGraphRuntime<TGraphRuntime = unknown>(): TGraphRuntime;
|
|
26
33
|
export declare function useGraphExecutor<TReadOptions = unknown, TCommandOptions = TReadOptions>(): ReactGraphExecutor<TReadOptions, TCommandOptions>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/graph/context.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,gCAAgC,EACrC,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC/B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAA8B,KAAK,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AACnG,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/graph/context.tsx"],"names":[],"mappings":"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"}
|
package/dist/graph/context.js
CHANGED
|
@@ -2,9 +2,12 @@
|
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
import { createGraphClientCache, } from '@ontahi/core/data-graph';
|
|
4
4
|
import { anonymousExecutionIdentity } from '@ontahi/core/runtime/identity';
|
|
5
|
-
import {
|
|
5
|
+
import { subscribeRuntimeProtocolExecutions, } from '@ontahi/core/runtime/protocol';
|
|
6
|
+
import { QueryClientContext } from '@tanstack/react-query';
|
|
7
|
+
import { createContext, useCallback, useContext, useEffect, useMemo, useState, useSyncExternalStore, } from 'react';
|
|
6
8
|
import { createFetchGraphClient } from './fetch-graph-client.js';
|
|
7
9
|
import { createReflectedOperationInvoker, } from './reflected-operation-invoker.js';
|
|
10
|
+
import { invalidateSemanticGraphReads } from './semantic-invalidation.js';
|
|
8
11
|
const noReflectedGraphOperations = [];
|
|
9
12
|
const GraphRuntimeContext = createContext(null);
|
|
10
13
|
const ExecutionIdentityContext = createContext(anonymousExecutionIdentity);
|
|
@@ -15,6 +18,7 @@ const OperationBridgeAdaptersContext = createContext(null);
|
|
|
15
18
|
const ReflectedEntityDataReaderContext = createContext(null);
|
|
16
19
|
const ReflectedRelatedEntityDataReaderContext = createContext(null);
|
|
17
20
|
const ReflectedOperationInvokerContext = createContext(null);
|
|
21
|
+
const OntahiClientContext = createContext(undefined);
|
|
18
22
|
export function OntahiGraphProvider({ children, runtime, graphExecutor, runtimeTransport, client, operationBridgeAdapters, reflectedEntityDataReader, reflectedRelatedEntityDataReader, reflectedOperationInvoker, reflectedGraphOperations = noReflectedGraphOperations, clientCache, identity = anonymousExecutionIdentity, }) {
|
|
19
23
|
const [defaultGraphClient] = useState(() => createFetchGraphClient());
|
|
20
24
|
const [defaultClientCache] = useState(() => createGraphClientCache());
|
|
@@ -26,6 +30,13 @@ export function OntahiGraphProvider({ children, runtime, graphExecutor, runtimeT
|
|
|
26
30
|
const resolvedReflectedRelatedEntityDataReader = reflectedRelatedEntityDataReader ?? graphClient?.reflectedRelatedEntityDataReader;
|
|
27
31
|
const configuredReflectedOperationInvoker = reflectedOperationInvoker ?? graphClient?.reflectedOperationInvoker;
|
|
28
32
|
const graphClientCache = clientCache ?? graphClient?.clientCache ?? defaultClientCache;
|
|
33
|
+
const clientContext = useMemo(() => ({
|
|
34
|
+
...(graphClient?.application ? { application: graphClient.application } : {}),
|
|
35
|
+
clientCache: graphClientCache,
|
|
36
|
+
identity,
|
|
37
|
+
...(resolvedRuntimeTransport ? { runtimeTransport: resolvedRuntimeTransport } : {}),
|
|
38
|
+
}), [graphClient?.application, graphClientCache, identity, resolvedRuntimeTransport]);
|
|
39
|
+
const queryClient = useContext(QueryClientContext);
|
|
29
40
|
const bridgeAdapterMap = useMemo(() => new Map(resolvedOperationBridgeAdapters.map(adapter => [adapter.name, adapter])), [resolvedOperationBridgeAdapters]);
|
|
30
41
|
const resolvedReflectedOperationInvoker = useMemo(() => reflectedGraphOperations.length > 0
|
|
31
42
|
? createReflectedOperationInvoker({
|
|
@@ -34,8 +45,32 @@ export function OntahiGraphProvider({ children, runtime, graphExecutor, runtimeT
|
|
|
34
45
|
graphOperations: reflectedGraphOperations,
|
|
35
46
|
})
|
|
36
47
|
: (configuredReflectedOperationInvoker ?? null), [configuredReflectedOperationInvoker, reflectedGraphOperations, resolvedGraphExecutor]);
|
|
37
|
-
|
|
38
|
-
|
|
48
|
+
useEffect(() => {
|
|
49
|
+
if (!resolvedRuntimeTransport || !queryClient)
|
|
50
|
+
return;
|
|
51
|
+
return subscribeRuntimeProtocolExecutions(resolvedRuntimeTransport, async ({ metadata }) => {
|
|
52
|
+
await invalidateSemanticGraphReads(queryClient, metadata.committedMutations, {
|
|
53
|
+
...(metadata.mutationCommitId
|
|
54
|
+
? {
|
|
55
|
+
causedBy: {
|
|
56
|
+
kind: 'committed-mutations',
|
|
57
|
+
commitIds: [metadata.mutationCommitId],
|
|
58
|
+
overflow: false,
|
|
59
|
+
},
|
|
60
|
+
}
|
|
61
|
+
: {}),
|
|
62
|
+
...(resolvedRuntimeTransport.causality
|
|
63
|
+
? {
|
|
64
|
+
associateRefreshes: resolvedRuntimeTransport.causality.associateGraphReadRefreshes,
|
|
65
|
+
}
|
|
66
|
+
: {}),
|
|
67
|
+
});
|
|
68
|
+
return true;
|
|
69
|
+
});
|
|
70
|
+
}, [queryClient, resolvedRuntimeTransport]);
|
|
71
|
+
return (_jsx(OntahiClientContext.Provider, { value: clientContext, children: _jsx(ExecutionIdentityContext.Provider, { value: identity, children: _jsx(ReflectedOperationInvokerContext.Provider, { value: resolvedReflectedOperationInvoker, children: _jsx(ReflectedRelatedEntityDataReaderContext.Provider, { value: resolvedReflectedRelatedEntityDataReader ?? null, children: _jsx(ReflectedEntityDataReaderContext.Provider, { value: resolvedReflectedEntityDataReader ?? null, children: _jsx(OperationBridgeAdaptersContext.Provider, { value: bridgeAdapterMap, children: _jsx(RuntimeTransportContext.Provider, { value: resolvedRuntimeTransport ?? null, children: _jsx(GraphClientCacheContext.Provider, { value: graphClientCache, children: _jsx(GraphExecutorContext.Provider, { value: resolvedGraphExecutor ?? null, children: _jsx(GraphRuntimeContext.Provider, { value: runtime, children: children }) }) }) }) }) }) }) }) }) }));
|
|
72
|
+
}
|
|
73
|
+
export const useOntahiClientContext = () => useContext(OntahiClientContext);
|
|
39
74
|
export const useExecutionIdentity = () => useContext(ExecutionIdentityContext);
|
|
40
75
|
export function useGraphRuntime() {
|
|
41
76
|
const runtime = useContext(GraphRuntimeContext);
|