@ontahi/react 1.0.0-alpha.8 → 1.0.0-alpha.9
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 +35 -6
- package/dist/actions/fetch-operation-bridge-adapter.d.ts +0 -1
- package/dist/actions/fetch-operation-bridge-adapter.d.ts.map +1 -1
- package/dist/actions/fetch-operation-bridge-adapter.js +15 -19
- package/dist/actions/fetch-operation-bridge-adapter.js.map +1 -1
- package/dist/actions/operation-bridge-adapter.d.ts +0 -2
- package/dist/actions/operation-bridge-adapter.d.ts.map +1 -1
- package/dist/actions/operation-bridge-adapter.js +0 -1
- package/dist/actions/operation-bridge-adapter.js.map +1 -1
- package/dist/actions/operation-bridge.d.ts +1 -2
- package/dist/actions/operation-bridge.d.ts.map +1 -1
- package/dist/actions/operation-bridge.js.map +1 -1
- package/dist/graph/context.d.ts +8 -3
- package/dist/graph/context.d.ts.map +1 -1
- package/dist/graph/context.js +20 -2
- package/dist/graph/context.js.map +1 -1
- package/dist/graph/executor.d.ts +2 -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 +9 -1
- package/dist/graph/fetch-graph-client.d.ts.map +1 -1
- package/dist/graph/fetch-graph-client.js +27 -15
- package/dist/graph/fetch-graph-client.js.map +1 -1
- package/dist/graph/fetch-graph-runtime.d.ts +3 -2
- package/dist/graph/fetch-graph-runtime.d.ts.map +1 -1
- package/dist/graph/fetch-graph-runtime.js +1 -0
- package/dist/graph/fetch-graph-runtime.js.map +1 -1
- package/dist/graph/fetch-runtime-transport.d.ts +15 -0
- package/dist/graph/fetch-runtime-transport.d.ts.map +1 -0
- package/dist/graph/fetch-runtime-transport.js +89 -0
- package/dist/graph/fetch-runtime-transport.js.map +1 -0
- package/dist/graph/index.d.ts +1 -0
- package/dist/graph/index.d.ts.map +1 -1
- package/dist/graph/index.js +1 -0
- package/dist/graph/index.js.map +1 -1
- package/dist/graph/operation-hooks.d.ts.map +1 -1
- package/dist/graph/operation-hooks.js +41 -21
- package/dist/graph/operation-hooks.js.map +1 -1
- package/dist/graph/operation-types.d.ts +1 -3
- package/dist/graph/operation-types.d.ts.map +1 -1
- package/dist/graph/operation-types.js.map +1 -1
- package/dist/graph/reflected-operation-invoker.d.ts.map +1 -1
- package/dist/graph/reflected-operation-invoker.js +41 -3
- package/dist/graph/reflected-operation-invoker.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/graph/executor.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n GraphCommandSpec,\n GraphOperationDeclaration,\n GraphReadExpression,\n GraphReadIntent,\n GraphSchemaLike,\n InferGraphSchemaClientInput,\n QueryOrView,\n QuerySpec,\n ManyToManyRelationshipCommand,\n RelationshipCommand,\n RelationshipCommandResult,\n} from '@ontahi/core/data-graph';\nimport type { QueryKey, UseMutationOptions, UseQueryOptions } from '@tanstack/react-query';\n\nexport interface ReactGraphExecutor<TReadOptions = unknown, TCommandOptions = TReadOptions> {\n get<TParams, TResult>(\n read: QueryOrView<TParams, TResult>,\n params: TParams,\n options?: TReadOptions,\n ): Promise<TResult | null>;\n run<TParams, TResult>(\n read: QueryOrView<TParams, TResult>,\n params: TParams,\n options?: TReadOptions,\n ): Promise<TResult[]>;\n count<TParams, TResult>(\n read: QueryOrView<TParams, TResult>,\n params: TParams,\n options?: TReadOptions,\n ): Promise<number>;\n runCommand<TResult = void>(\n command: GraphCommandSpec<any, any, TResult>,\n options?: TCommandOptions,\n ): Promise<TResult>;\n runRelationshipCommand?(\n command: RelationshipCommand,\n options?: TCommandOptions,\n ): Promise<RelationshipCommandResult>;\n runManyToManyRelationshipCommand?(\n command: ManyToManyRelationshipCommand,\n options?: TCommandOptions,\n ): Promise<RelationshipCommandResult>;\n}\n\nexport type BuildableRead<TResult> = {\n build: () => QuerySpec<any, TResult>;\n};\n\ntype PlainGraphReadSource<TResult> = QueryOrView<any, TResult> | BuildableRead<TResult>;\n\nexport type GraphReadSource<TResult = unknown> =\n | PlainGraphReadSource<TResult>\n | GraphReadExpression<PlainGraphReadSource<TResult>, GraphReadIntent, TResult>;\n\nexport type ReadParams<TRead> =\n TRead extends GraphReadExpression<infer TSource, any, any>\n ? ReadParams<TSource>\n : TRead extends QueryOrView<infer TParams, any>\n ? TParams\n : undefined;\n\nexport type ReadResult<TRead> =\n TRead extends GraphReadExpression<any, any, infer TResult>\n ? TResult\n : TRead extends QueryOrView<any, infer TResult>\n ? TResult\n : TRead extends BuildableRead<infer TResult>\n ? TResult\n : never;\n\nexport type GraphQueryMode = 'get' | 'run' | 'count' | 'exists';\n\ntype GraphReadIntentData<TRead, TIntent extends GraphReadIntent> = TIntent extends 'count'\n ? number\n : TIntent extends 'exists'\n ? boolean\n : TIntent extends 'one'\n ? ReadResult<TRead>\n : ReadResult<TRead> | null;\n\nexport type GraphQueryData<TRead, TMode extends GraphQueryMode = 'run'> =\n TRead extends GraphReadExpression<any, infer TIntent, any>\n ? GraphReadIntentData<TRead, TIntent>\n : TMode extends 'get'\n ? ReadResult<TRead> | null\n : TMode extends 'run'\n ? ReadResult<TRead>[]\n : TMode extends 'count'\n ? number\n : boolean;\n\nexport type GraphQueryOptions<\n TRead,\n TMode extends GraphQueryMode = 'run',\n TReadOptions = unknown,\n> = Omit<\n UseQueryOptions<GraphQueryData<TRead, TMode>, Error, GraphQueryData<TRead, TMode>, QueryKey>,\n 'queryKey' | 'queryFn'\n> & {\n mode?: TRead extends GraphReadExpression<any, any, any> ? never : TMode;\n params?: ReadParams<TRead>;\n queryKey?: QueryKey;\n runtimeOptions?: TReadOptions;\n};\n\nexport type CommandLike<TResult> =\n | GraphCommandSpec<any, any, TResult>\n | {\n build: () => GraphCommandSpec<any, any, TResult>;\n };\n\nexport type GraphCommandBuilder<TVariables, TResult> = (\n variables: TVariables,\n) => CommandLike<TResult>;\n\nexport type GraphOperationLike<TVariables, TResult> = GraphOperationDeclaration<\n TVariables,\n CommandLike<TResult>\n> & {\n id: string;\n};\n\nexport type GraphOperationClientInput<TOperation> = TOperation extends {\n input: infer TSchema extends GraphSchemaLike;\n}\n ? InferGraphSchemaClientInput<TSchema>\n : TOperation extends GraphOperationDeclaration<infer TInput, any>\n ? TInput\n : never;\n\nexport type GraphOperationResult<TOperation> = TOperation extends {\n run: (...args: any[]) => CommandLike<infer TResult>;\n}\n ? TResult\n : never;\n\nexport type GraphCommandHookOptions<\n TResult,\n TVariables,\n TContext,\n TCommandOptions = unknown,\n> = Omit<UseMutationOptions<TResult, Error, TVariables, TContext>, 'mutationFn'> & {\n mutationKey?: QueryKey;\n runtimeOptions?: TCommandOptions;\n invalidateQueryKeys?: QueryKey[];\n};\n"]}
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../src/graph/executor.ts"],"names":[],"mappings":"","sourcesContent":["import type {\n GraphCommandSpec,\n GraphOperationDeclaration,\n GraphReadExpression,\n GraphReadIntent,\n GraphSchemaLike,\n InferGraphSchemaClientInput,\n QueryOrView,\n QuerySpec,\n ManyToManyRelationshipCommand,\n RelationshipCommand,\n RelationshipCommandResult,\n EntityMutationCommand,\n EntityMutationDelta,\n} from '@ontahi/core/data-graph';\nimport type { QueryKey, UseMutationOptions, UseQueryOptions } from '@tanstack/react-query';\n\nexport interface ReactGraphExecutor<TReadOptions = unknown, TCommandOptions = TReadOptions> {\n get<TParams, TResult>(\n read: QueryOrView<TParams, TResult>,\n params: TParams,\n options?: TReadOptions,\n ): Promise<TResult | null>;\n run<TParams, TResult>(\n read: QueryOrView<TParams, TResult>,\n params: TParams,\n options?: TReadOptions,\n ): Promise<TResult[]>;\n count<TParams, TResult>(\n read: QueryOrView<TParams, TResult>,\n params: TParams,\n options?: TReadOptions,\n ): Promise<number>;\n runCommand<TResult = void>(\n command: GraphCommandSpec<any, any, TResult>,\n options?: TCommandOptions,\n ): Promise<TResult>;\n runRelationshipCommand?(\n command: RelationshipCommand,\n options?: TCommandOptions,\n ): Promise<RelationshipCommandResult>;\n runManyToManyRelationshipCommand?(\n command: ManyToManyRelationshipCommand,\n options?: TCommandOptions,\n ): Promise<RelationshipCommandResult>;\n runEntityMutationCommand?(\n command: EntityMutationCommand,\n options?: TCommandOptions,\n ): Promise<EntityMutationDelta>;\n}\n\nexport type BuildableRead<TResult> = {\n build: () => QuerySpec<any, TResult>;\n};\n\ntype PlainGraphReadSource<TResult> = QueryOrView<any, TResult> | BuildableRead<TResult>;\n\nexport type GraphReadSource<TResult = unknown> =\n | PlainGraphReadSource<TResult>\n | GraphReadExpression<PlainGraphReadSource<TResult>, GraphReadIntent, TResult>;\n\nexport type ReadParams<TRead> =\n TRead extends GraphReadExpression<infer TSource, any, any>\n ? ReadParams<TSource>\n : TRead extends QueryOrView<infer TParams, any>\n ? TParams\n : undefined;\n\nexport type ReadResult<TRead> =\n TRead extends GraphReadExpression<any, any, infer TResult>\n ? TResult\n : TRead extends QueryOrView<any, infer TResult>\n ? TResult\n : TRead extends BuildableRead<infer TResult>\n ? TResult\n : never;\n\nexport type GraphQueryMode = 'get' | 'run' | 'count' | 'exists';\n\ntype GraphReadIntentData<TRead, TIntent extends GraphReadIntent> = TIntent extends 'count'\n ? number\n : TIntent extends 'exists'\n ? boolean\n : TIntent extends 'one'\n ? ReadResult<TRead>\n : ReadResult<TRead> | null;\n\nexport type GraphQueryData<TRead, TMode extends GraphQueryMode = 'run'> =\n TRead extends GraphReadExpression<any, infer TIntent, any>\n ? GraphReadIntentData<TRead, TIntent>\n : TMode extends 'get'\n ? ReadResult<TRead> | null\n : TMode extends 'run'\n ? ReadResult<TRead>[]\n : TMode extends 'count'\n ? number\n : boolean;\n\nexport type GraphQueryOptions<\n TRead,\n TMode extends GraphQueryMode = 'run',\n TReadOptions = unknown,\n> = Omit<\n UseQueryOptions<GraphQueryData<TRead, TMode>, Error, GraphQueryData<TRead, TMode>, QueryKey>,\n 'queryKey' | 'queryFn'\n> & {\n mode?: TRead extends GraphReadExpression<any, any, any> ? never : TMode;\n params?: ReadParams<TRead>;\n queryKey?: QueryKey;\n runtimeOptions?: TReadOptions;\n};\n\nexport type CommandLike<TResult> =\n | GraphCommandSpec<any, any, TResult>\n | {\n build: () => GraphCommandSpec<any, any, TResult>;\n };\n\nexport type GraphCommandBuilder<TVariables, TResult> = (\n variables: TVariables,\n) => CommandLike<TResult>;\n\nexport type GraphOperationLike<TVariables, TResult> = GraphOperationDeclaration<\n TVariables,\n CommandLike<TResult>\n> & {\n id: string;\n};\n\nexport type GraphOperationClientInput<TOperation> = TOperation extends {\n input: infer TSchema extends GraphSchemaLike;\n}\n ? InferGraphSchemaClientInput<TSchema>\n : TOperation extends GraphOperationDeclaration<infer TInput, any>\n ? TInput\n : never;\n\nexport type GraphOperationResult<TOperation> = TOperation extends {\n run: (...args: any[]) => CommandLike<infer TResult>;\n}\n ? TResult\n : never;\n\nexport type GraphCommandHookOptions<\n TResult,\n TVariables,\n TContext,\n TCommandOptions = unknown,\n> = Omit<UseMutationOptions<TResult, Error, TVariables, TContext>, 'mutationFn'> & {\n mutationKey?: QueryKey;\n runtimeOptions?: TCommandOptions;\n invalidateQueryKeys?: QueryKey[];\n};\n"]}
|
|
@@ -1,16 +1,21 @@
|
|
|
1
|
-
import type { ReflectedEntityDataReader, ReflectedOperationInvoker, RemoteDataGraphError, RuntimeBoundDataGraphApi } from '@ontahi/core/data-graph';
|
|
1
|
+
import type { ReflectedEntityDataReader, ReflectedRelatedEntityDataReader, ReflectedOperationInvoker, RemoteDataGraphError, RuntimeBoundDataGraphApi } from '@ontahi/core/data-graph';
|
|
2
|
+
import type { RuntimeTransport } from '@ontahi/core/runtime/protocol';
|
|
2
3
|
import { type AnyOperationBridgeAdapter, type FetchOperationBridgeOptions } from '../actions/index.js';
|
|
3
4
|
import type { ReactGraphExecutor } from './executor.js';
|
|
4
5
|
import type { FetchGraphReadExecutorOptions } from './fetch-graph-read-executor.js';
|
|
6
|
+
import { type FetchRuntimeTransportOptions } from './fetch-runtime-transport.js';
|
|
5
7
|
export type FetchReflectedEntityDataReaderOptions = {
|
|
6
8
|
endpoint?: string;
|
|
7
9
|
fetch?: typeof globalThis.fetch;
|
|
8
10
|
};
|
|
11
|
+
export type FetchReflectedRelatedEntityDataReaderOptions = FetchReflectedEntityDataReaderOptions;
|
|
9
12
|
export type OntahiGraphClient<TReadOptions = unknown, TCommandOptions = TReadOptions> = {
|
|
10
13
|
graph?: RuntimeBoundDataGraphApi<RemoteDataGraphError, TReadOptions, TCommandOptions, RemoteDataGraphError>;
|
|
11
14
|
graphExecutor?: ReactGraphExecutor<TReadOptions, TCommandOptions>;
|
|
15
|
+
runtimeTransport?: RuntimeTransport;
|
|
12
16
|
operationBridgeAdapters?: AnyOperationBridgeAdapter[];
|
|
13
17
|
reflectedEntityDataReader?: ReflectedEntityDataReader;
|
|
18
|
+
reflectedRelatedEntityDataReader?: ReflectedRelatedEntityDataReader;
|
|
14
19
|
reflectedOperationInvoker?: ReflectedOperationInvoker;
|
|
15
20
|
};
|
|
16
21
|
export type FetchGraphClient<TOptions = undefined> = OntahiGraphClient<TOptions, TOptions> & {
|
|
@@ -20,9 +25,12 @@ export type FetchGraphClient<TOptions = undefined> = OntahiGraphClient<TOptions,
|
|
|
20
25
|
export type FetchGraphClientOptions<TOptions = undefined> = {
|
|
21
26
|
graphRead?: false | FetchGraphReadExecutorOptions<TOptions>;
|
|
22
27
|
operations?: false | FetchOperationBridgeOptions;
|
|
28
|
+
runtimeTransport?: false | FetchRuntimeTransportOptions;
|
|
23
29
|
reflectedEntityData?: false | FetchReflectedEntityDataReaderOptions;
|
|
30
|
+
reflectedRelatedEntityData?: false | FetchReflectedRelatedEntityDataReaderOptions;
|
|
24
31
|
};
|
|
25
32
|
export declare const createFetchReflectedEntityDataReader: ({ endpoint, fetch: fetchRequest, }?: FetchReflectedEntityDataReaderOptions) => ReflectedEntityDataReader;
|
|
33
|
+
export declare const createFetchReflectedRelatedEntityDataReader: ({ endpoint, fetch: fetchRequest, }?: FetchReflectedRelatedEntityDataReaderOptions) => ReflectedRelatedEntityDataReader;
|
|
26
34
|
export declare function createFetchGraphClient<TOptions = undefined>(): FetchGraphClient<TOptions>;
|
|
27
35
|
export declare function createFetchGraphClient<TOptions = undefined>(options: FetchGraphClientOptions<TOptions> & {
|
|
28
36
|
graphRead: false;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-graph-client.d.ts","sourceRoot":"","sources":["../../src/graph/fetch-graph-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,yBAAyB,EAEzB,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"fetch-graph-client.d.ts","sourceRoot":"","sources":["../../src/graph/fetch-graph-client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,yBAAyB,EAEzB,gCAAgC,EAEhC,yBAAyB,EACzB,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,OAAO,EAGL,KAAK,yBAAyB,EAC9B,KAAK,2BAA2B,EACjC,MAAM,qBAAqB,CAAC;AAE7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AAEpF,OAAO,EAEL,KAAK,4BAA4B,EAClC,MAAM,8BAA8B,CAAC;AAEtC,MAAM,MAAM,qCAAqC,GAAG;IAClD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,4CAA4C,GAAG,qCAAqC,CAAC;AAEjG,MAAM,MAAM,iBAAiB,CAAC,YAAY,GAAG,OAAO,EAAE,eAAe,GAAG,YAAY,IAAI;IACtF,KAAK,CAAC,EAAE,wBAAwB,CAC9B,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,oBAAoB,CACrB,CAAC;IACF,aAAa,CAAC,EAAE,kBAAkB,CAAC,YAAY,EAAE,eAAe,CAAC,CAAC;IAClE,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,uBAAuB,CAAC,EAAE,yBAAyB,EAAE,CAAC;IACtD,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;IACtD,gCAAgC,CAAC,EAAE,gCAAgC,CAAC;IACpE,yBAAyB,CAAC,EAAE,yBAAyB,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,gBAAgB,CAAC,QAAQ,GAAG,SAAS,IAAI,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,GAAG;IAC3F,KAAK,EAAE,wBAAwB,CAAC,oBAAoB,EAAE,QAAQ,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAChG,aAAa,EAAE,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;CACvD,CAAC;AAEF,MAAM,MAAM,uBAAuB,CAAC,QAAQ,GAAG,SAAS,IAAI;IAC1D,SAAS,CAAC,EAAE,KAAK,GAAG,6BAA6B,CAAC,QAAQ,CAAC,CAAC;IAC5D,UAAU,CAAC,EAAE,KAAK,GAAG,2BAA2B,CAAC;IACjD,gBAAgB,CAAC,EAAE,KAAK,GAAG,4BAA4B,CAAC;IACxD,mBAAmB,CAAC,EAAE,KAAK,GAAG,qCAAqC,CAAC;IACpE,0BAA0B,CAAC,EAAE,KAAK,GAAG,4CAA4C,CAAC;CACnF,CAAC;AAqCF,eAAO,MAAM,oCAAoC,GAAI,qCAGlD,qCAA0C,KAAG,yBAE9C,CAAC;AAEH,eAAO,MAAM,2CAA2C,GAAI,qCAGzD,4CAAiD,KAAG,gCAErD,CAAC;AAEH,wBAAgB,sBAAsB,CAAC,QAAQ,GAAG,SAAS,KAAK,gBAAgB,CAAC,QAAQ,CAAC,CAAC;AAC3F,wBAAgB,sBAAsB,CAAC,QAAQ,GAAG,SAAS,EACzD,OAAO,EAAE,uBAAuB,CAAC,QAAQ,CAAC,GAAG;IAAE,SAAS,EAAE,KAAK,CAAA;CAAE,GAChE,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACzC,wBAAgB,sBAAsB,CAAC,QAAQ,GAAG,SAAS,EACzD,OAAO,EAAE,uBAAuB,CAAC,QAAQ,CAAC,GAAG;IAC3C,SAAS,CAAC,EAAE,6BAA6B,CAAC,QAAQ,CAAC,CAAC;CACrD,GACA,gBAAgB,CAAC,QAAQ,CAAC,CAAC"}
|
|
@@ -2,31 +2,35 @@
|
|
|
2
2
|
import { createRuntimeBoundDataGraphApi } from '@ontahi/core/data-graph';
|
|
3
3
|
import { createFetchOperationBridgeAdapter, createFetchReflectedOperationInvoker, } from '../actions/index.js';
|
|
4
4
|
import { createFetchGraphReadCapability } from './fetch-graph-runtime.js';
|
|
5
|
+
import { createFetchRuntimeTransport, } from './fetch-runtime-transport.js';
|
|
5
6
|
const DEFAULT_OPERATIONS_ENDPOINT = '/operations';
|
|
6
|
-
const DEFAULT_TASKS_ENDPOINT = '/operations/tasks';
|
|
7
7
|
const DEFAULT_REFLECTED_ENTITY_DATA_ENDPOINT = '/explorer/entities';
|
|
8
|
+
const DEFAULT_REFLECTED_RELATED_ENTITY_DATA_ENDPOINT = '/explorer/related-entities';
|
|
9
|
+
const postReflectedEntityDataQuery = async (endpoint, query, fetchRequest) => {
|
|
10
|
+
const response = await fetchRequest(endpoint, {
|
|
11
|
+
method: 'POST',
|
|
12
|
+
headers: { 'content-type': 'application/json' },
|
|
13
|
+
credentials: 'same-origin',
|
|
14
|
+
body: JSON.stringify(query),
|
|
15
|
+
});
|
|
16
|
+
if (!response.ok) {
|
|
17
|
+
throw new Error(`Reflected entity data request failed with status ${response.status}.`);
|
|
18
|
+
}
|
|
19
|
+
return response.json();
|
|
20
|
+
};
|
|
8
21
|
const conventionalOperationOptions = (options) => options.mountPath === undefined
|
|
9
22
|
? {
|
|
10
23
|
endpoint: DEFAULT_OPERATIONS_ENDPOINT,
|
|
11
|
-
taskEndpoint: DEFAULT_TASKS_ENDPOINT,
|
|
12
24
|
...options,
|
|
13
25
|
}
|
|
14
26
|
: options;
|
|
15
27
|
export const createFetchReflectedEntityDataReader = ({ endpoint = DEFAULT_REFLECTED_ENTITY_DATA_ENDPOINT, fetch: fetchRequest = globalThis.fetch, } = {}) => ({
|
|
16
|
-
readEntityData:
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
credentials: 'same-origin',
|
|
21
|
-
body: JSON.stringify(query),
|
|
22
|
-
});
|
|
23
|
-
if (!response.ok) {
|
|
24
|
-
throw new Error(`Reflected entity data request failed with status ${response.status}.`);
|
|
25
|
-
}
|
|
26
|
-
return response.json();
|
|
27
|
-
},
|
|
28
|
+
readEntityData: query => postReflectedEntityDataQuery(endpoint, query, fetchRequest),
|
|
29
|
+
});
|
|
30
|
+
export const createFetchReflectedRelatedEntityDataReader = ({ endpoint = DEFAULT_REFLECTED_RELATED_ENTITY_DATA_ENDPOINT, fetch: fetchRequest = globalThis.fetch, } = {}) => ({
|
|
31
|
+
readRelatedEntityData: query => postReflectedEntityDataQuery(endpoint, query, fetchRequest),
|
|
28
32
|
});
|
|
29
|
-
export function createFetchGraphClient({ graphRead = {}, operations = {}, reflectedEntityData = {}, } = {}) {
|
|
33
|
+
export function createFetchGraphClient({ graphRead = {}, operations = {}, runtimeTransport = {}, reflectedEntityData = {}, reflectedRelatedEntityData = {}, } = {}) {
|
|
30
34
|
const operationOptions = operations === false ? undefined : conventionalOperationOptions(operations);
|
|
31
35
|
const graphReadCapability = graphRead === false ? undefined : createFetchGraphReadCapability(graphRead);
|
|
32
36
|
return {
|
|
@@ -36,6 +40,9 @@ export function createFetchGraphClient({ graphRead = {}, operations = {}, reflec
|
|
|
36
40
|
graphExecutor: graphReadCapability.graphExecutor,
|
|
37
41
|
}
|
|
38
42
|
: {}),
|
|
43
|
+
...(runtimeTransport === false
|
|
44
|
+
? {}
|
|
45
|
+
: { runtimeTransport: createFetchRuntimeTransport(runtimeTransport) }),
|
|
39
46
|
...(operationOptions
|
|
40
47
|
? {
|
|
41
48
|
operationBridgeAdapters: [createFetchOperationBridgeAdapter(operationOptions)],
|
|
@@ -45,6 +52,11 @@ export function createFetchGraphClient({ graphRead = {}, operations = {}, reflec
|
|
|
45
52
|
...(reflectedEntityData === false
|
|
46
53
|
? {}
|
|
47
54
|
: { reflectedEntityDataReader: createFetchReflectedEntityDataReader(reflectedEntityData) }),
|
|
55
|
+
...(reflectedRelatedEntityData === false
|
|
56
|
+
? {}
|
|
57
|
+
: {
|
|
58
|
+
reflectedRelatedEntityDataReader: createFetchReflectedRelatedEntityDataReader(reflectedRelatedEntityData),
|
|
59
|
+
}),
|
|
48
60
|
};
|
|
49
61
|
}
|
|
50
62
|
//# sourceMappingURL=fetch-graph-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-graph-client.js","sourceRoot":"","sources":["../../src/graph/fetch-graph-client.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"fetch-graph-client.js","sourceRoot":"","sources":["../../src/graph/fetch-graph-client.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport type {\n ReflectedEntityDataReader,\n ReflectedEntityDataResult,\n ReflectedRelatedEntityDataReader,\n ReflectedRelatedEntityDataQuery,\n ReflectedOperationInvoker,\n RemoteDataGraphError,\n RuntimeBoundDataGraphApi,\n} from '@ontahi/core/data-graph';\nimport { createRuntimeBoundDataGraphApi } from '@ontahi/core/data-graph';\nimport type { RuntimeTransport } from '@ontahi/core/runtime/protocol';\n\nimport {\n createFetchOperationBridgeAdapter,\n createFetchReflectedOperationInvoker,\n type AnyOperationBridgeAdapter,\n type FetchOperationBridgeOptions,\n} from '../actions/index.js';\n\nimport type { ReactGraphExecutor } from './executor.js';\nimport type { FetchGraphReadExecutorOptions } from './fetch-graph-read-executor.js';\nimport { createFetchGraphReadCapability } from './fetch-graph-runtime.js';\nimport {\n createFetchRuntimeTransport,\n type FetchRuntimeTransportOptions,\n} from './fetch-runtime-transport.js';\n\nexport type FetchReflectedEntityDataReaderOptions = {\n endpoint?: string;\n fetch?: typeof globalThis.fetch;\n};\n\nexport type FetchReflectedRelatedEntityDataReaderOptions = FetchReflectedEntityDataReaderOptions;\n\nexport type OntahiGraphClient<TReadOptions = unknown, TCommandOptions = TReadOptions> = {\n graph?: RuntimeBoundDataGraphApi<\n RemoteDataGraphError,\n TReadOptions,\n TCommandOptions,\n RemoteDataGraphError\n >;\n graphExecutor?: ReactGraphExecutor<TReadOptions, TCommandOptions>;\n runtimeTransport?: RuntimeTransport;\n operationBridgeAdapters?: AnyOperationBridgeAdapter[];\n reflectedEntityDataReader?: ReflectedEntityDataReader;\n reflectedRelatedEntityDataReader?: ReflectedRelatedEntityDataReader;\n reflectedOperationInvoker?: ReflectedOperationInvoker;\n};\n\nexport type FetchGraphClient<TOptions = undefined> = OntahiGraphClient<TOptions, TOptions> & {\n graph: RuntimeBoundDataGraphApi<RemoteDataGraphError, TOptions, TOptions, RemoteDataGraphError>;\n graphExecutor: ReactGraphExecutor<TOptions, TOptions>;\n};\n\nexport type FetchGraphClientOptions<TOptions = undefined> = {\n graphRead?: false | FetchGraphReadExecutorOptions<TOptions>;\n operations?: false | FetchOperationBridgeOptions;\n runtimeTransport?: false | FetchRuntimeTransportOptions;\n reflectedEntityData?: false | FetchReflectedEntityDataReaderOptions;\n reflectedRelatedEntityData?: false | FetchReflectedRelatedEntityDataReaderOptions;\n};\n\nconst DEFAULT_OPERATIONS_ENDPOINT = '/operations';\nconst DEFAULT_REFLECTED_ENTITY_DATA_ENDPOINT = '/explorer/entities';\nconst DEFAULT_REFLECTED_RELATED_ENTITY_DATA_ENDPOINT = '/explorer/related-entities';\n\nconst postReflectedEntityDataQuery = async (\n endpoint: string,\n query:\n | ReflectedRelatedEntityDataQuery\n | Parameters<ReflectedEntityDataReader['readEntityData']>[0],\n fetchRequest: typeof globalThis.fetch,\n) => {\n const response = await fetchRequest(endpoint, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n credentials: 'same-origin',\n body: JSON.stringify(query),\n });\n\n if (!response.ok) {\n throw new Error(`Reflected entity data request failed with status ${response.status}.`);\n }\n\n return response.json() as Promise<ReflectedEntityDataResult>;\n};\n\nconst conventionalOperationOptions = (\n options: FetchOperationBridgeOptions,\n): FetchOperationBridgeOptions =>\n options.mountPath === undefined\n ? {\n endpoint: DEFAULT_OPERATIONS_ENDPOINT,\n ...options,\n }\n : options;\n\nexport const createFetchReflectedEntityDataReader = ({\n endpoint = DEFAULT_REFLECTED_ENTITY_DATA_ENDPOINT,\n fetch: fetchRequest = globalThis.fetch,\n}: FetchReflectedEntityDataReaderOptions = {}): ReflectedEntityDataReader => ({\n readEntityData: query => postReflectedEntityDataQuery(endpoint, query, fetchRequest),\n});\n\nexport const createFetchReflectedRelatedEntityDataReader = ({\n endpoint = DEFAULT_REFLECTED_RELATED_ENTITY_DATA_ENDPOINT,\n fetch: fetchRequest = globalThis.fetch,\n}: FetchReflectedRelatedEntityDataReaderOptions = {}): ReflectedRelatedEntityDataReader => ({\n readRelatedEntityData: query => postReflectedEntityDataQuery(endpoint, query, fetchRequest),\n});\n\nexport function createFetchGraphClient<TOptions = undefined>(): FetchGraphClient<TOptions>;\nexport function createFetchGraphClient<TOptions = undefined>(\n options: FetchGraphClientOptions<TOptions> & { graphRead: false },\n): OntahiGraphClient<TOptions, TOptions>;\nexport function createFetchGraphClient<TOptions = undefined>(\n options: FetchGraphClientOptions<TOptions> & {\n graphRead?: FetchGraphReadExecutorOptions<TOptions>;\n },\n): FetchGraphClient<TOptions>;\nexport function createFetchGraphClient<TOptions = undefined>({\n graphRead = {},\n operations = {},\n runtimeTransport = {},\n reflectedEntityData = {},\n reflectedRelatedEntityData = {},\n}: FetchGraphClientOptions<TOptions> = {}): OntahiGraphClient<TOptions, TOptions> {\n const operationOptions =\n operations === false ? undefined : conventionalOperationOptions(operations);\n const graphReadCapability =\n graphRead === false ? undefined : createFetchGraphReadCapability(graphRead);\n\n return {\n ...(graphReadCapability\n ? {\n graph: createRuntimeBoundDataGraphApi(() => graphReadCapability.runtime),\n graphExecutor: graphReadCapability.graphExecutor,\n }\n : {}),\n ...(runtimeTransport === false\n ? {}\n : { runtimeTransport: createFetchRuntimeTransport(runtimeTransport) }),\n ...(operationOptions\n ? {\n operationBridgeAdapters: [createFetchOperationBridgeAdapter(operationOptions)],\n reflectedOperationInvoker: createFetchReflectedOperationInvoker(operationOptions),\n }\n : {}),\n ...(reflectedEntityData === false\n ? {}\n : { reflectedEntityDataReader: createFetchReflectedEntityDataReader(reflectedEntityData) }),\n ...(reflectedRelatedEntityData === false\n ? {}\n : {\n reflectedRelatedEntityDataReader: createFetchReflectedRelatedEntityDataReader(\n reflectedRelatedEntityData,\n ),\n }),\n };\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type DataGraphExecutionRuntime, type RemoteDataGraphError, type ManyToManyRelationshipCommandExecutionRuntime, type RelationshipCommandExecutionRuntime } from '@ontahi/core/data-graph';
|
|
1
|
+
import { type DataGraphExecutionRuntime, type EntityMutationCommandExecutionRuntime, type RemoteDataGraphError, type ManyToManyRelationshipCommandExecutionRuntime, type RelationshipCommandExecutionRuntime } from '@ontahi/core/data-graph';
|
|
2
2
|
import type { ReactGraphExecutor } from './executor.js';
|
|
3
3
|
export type FetchGraphReadExecutorOptions<TOptions = undefined> = {
|
|
4
4
|
endpoint?: string;
|
|
@@ -8,8 +8,9 @@ export type FetchGraphReadExecutorOptions<TOptions = undefined> = {
|
|
|
8
8
|
};
|
|
9
9
|
export type FetchGraphRuntime<TOptions = undefined> = DataGraphExecutionRuntime<RemoteDataGraphError, TOptions, TOptions, RemoteDataGraphError>;
|
|
10
10
|
export type FetchRelationshipRuntime<TOptions = undefined> = RelationshipCommandExecutionRuntime<RemoteDataGraphError, TOptions> & ManyToManyRelationshipCommandExecutionRuntime<RemoteDataGraphError, TOptions>;
|
|
11
|
+
export type FetchEntityMutationRuntime<TOptions = undefined> = EntityMutationCommandExecutionRuntime<RemoteDataGraphError, TOptions>;
|
|
11
12
|
export type FetchGraphReadCapability<TOptions = undefined> = {
|
|
12
|
-
runtime: FetchGraphRuntime<TOptions> & FetchRelationshipRuntime<TOptions>;
|
|
13
|
+
runtime: FetchGraphRuntime<TOptions> & FetchRelationshipRuntime<TOptions> & FetchEntityMutationRuntime<TOptions>;
|
|
13
14
|
graphExecutor: ReactGraphExecutor<TOptions, TOptions>;
|
|
14
15
|
};
|
|
15
16
|
export declare const createFetchGraphReadCapability: <TOptions = undefined>({ endpoint, commandEndpoint, fetch: fetchRequest, requestInit, }?: FetchGraphReadExecutorOptions<TOptions>) => FetchGraphReadCapability<TOptions>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-graph-runtime.d.ts","sourceRoot":"","sources":["../../src/graph/fetch-graph-runtime.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EAGzB,KAAK,6CAA6C,EAClD,KAAK,mCAAmC,EACzC,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,MAAM,MAAM,6BAA6B,CAAC,QAAQ,GAAG,SAAS,IAAI;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;CAC5E,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,QAAQ,GAAG,SAAS,IAAI,yBAAyB,CAC7E,oBAAoB,EACpB,QAAQ,EACR,QAAQ,EACR,oBAAoB,CACrB,CAAC;AACF,MAAM,MAAM,wBAAwB,CAAC,QAAQ,GAAG,SAAS,IAAI,mCAAmC,CAC9F,oBAAoB,EACpB,QAAQ,CACT,GACC,6CAA6C,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"fetch-graph-runtime.d.ts","sourceRoot":"","sources":["../../src/graph/fetch-graph-runtime.ts"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,yBAAyB,EAC9B,KAAK,qCAAqC,EAC1C,KAAK,oBAAoB,EAGzB,KAAK,6CAA6C,EAClD,KAAK,mCAAmC,EACzC,MAAM,yBAAyB,CAAC;AAGjC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAExD,MAAM,MAAM,6BAA6B,CAAC,QAAQ,GAAG,SAAS,IAAI;IAChE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,WAAW,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,KAAK,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAAC,CAAC;CAC5E,CAAC;AAEF,MAAM,MAAM,iBAAiB,CAAC,QAAQ,GAAG,SAAS,IAAI,yBAAyB,CAC7E,oBAAoB,EACpB,QAAQ,EACR,QAAQ,EACR,oBAAoB,CACrB,CAAC;AACF,MAAM,MAAM,wBAAwB,CAAC,QAAQ,GAAG,SAAS,IAAI,mCAAmC,CAC9F,oBAAoB,EACpB,QAAQ,CACT,GACC,6CAA6C,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;AAChF,MAAM,MAAM,0BAA0B,CAAC,QAAQ,GAAG,SAAS,IACzD,qCAAqC,CAAC,oBAAoB,EAAE,QAAQ,CAAC,CAAC;AAExE,MAAM,MAAM,wBAAwB,CAAC,QAAQ,GAAG,SAAS,IAAI;IAC3D,OAAO,EAAE,iBAAiB,CAAC,QAAQ,CAAC,GAClC,wBAAwB,CAAC,QAAQ,CAAC,GAClC,0BAA0B,CAAC,QAAQ,CAAC,CAAC;IACvC,aAAa,EAAE,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;CACvD,CAAC;AAKF,eAAO,MAAM,8BAA8B,GAAI,QAAQ,GAAG,SAAS,EAAE,mEAKlE,6BAA6B,CAAC,QAAQ,CAAM,KAAG,wBAAwB,CAAC,QAAQ,CA8DlF,CAAC"}
|
|
@@ -57,6 +57,7 @@ export const createFetchGraphReadCapability = ({ endpoint = DEFAULT_GRAPH_READ_E
|
|
|
57
57
|
runCommand: (command, options) => runBrowserEffect(runtime.runCommand(command, options)),
|
|
58
58
|
runRelationshipCommand: (command, options) => runBrowserEffect(runtime.runRelationshipCommand(command, options)),
|
|
59
59
|
runManyToManyRelationshipCommand: (command, options) => runBrowserEffect(runtime.runManyToManyRelationshipCommand(command, options)),
|
|
60
|
+
runEntityMutationCommand: (command, options) => runBrowserEffect(runtime.runEntityMutationCommand(command, options)),
|
|
60
61
|
},
|
|
61
62
|
};
|
|
62
63
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetch-graph-runtime.js","sourceRoot":"","sources":["../../src/graph/fetch-graph-runtime.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,EACL,4BAA4B,EAC5B,uBAAuB,EACvB,2BAA2B,EAC3B,wBAAwB,
|
|
1
|
+
{"version":3,"file":"fetch-graph-runtime.js","sourceRoot":"","sources":["../../src/graph/fetch-graph-runtime.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport {\n createRemoteDataGraphRuntime,\n isGraphCommandRejection,\n isGraphCommandProtocolError,\n isGraphReadProtocolError,\n type DataGraphExecutionRuntime,\n type EntityMutationCommandExecutionRuntime,\n type RemoteDataGraphError,\n type RemoteGraphCommandTransport,\n type RemoteGraphReadTransport,\n type ManyToManyRelationshipCommandExecutionRuntime,\n type RelationshipCommandExecutionRuntime,\n} from '@ontahi/core/data-graph';\nimport { runBrowserEffect } from '@ontahi/core/runtime/browser';\n\nimport type { ReactGraphExecutor } from './executor.js';\n\nexport type FetchGraphReadExecutorOptions<TOptions = undefined> = {\n endpoint?: string;\n commandEndpoint?: string;\n fetch?: typeof globalThis.fetch;\n requestInit?: (options?: TOptions) => Omit<RequestInit, 'body' | 'method'>;\n};\n\nexport type FetchGraphRuntime<TOptions = undefined> = DataGraphExecutionRuntime<\n RemoteDataGraphError,\n TOptions,\n TOptions,\n RemoteDataGraphError\n>;\nexport type FetchRelationshipRuntime<TOptions = undefined> = RelationshipCommandExecutionRuntime<\n RemoteDataGraphError,\n TOptions\n> &\n ManyToManyRelationshipCommandExecutionRuntime<RemoteDataGraphError, TOptions>;\nexport type FetchEntityMutationRuntime<TOptions = undefined> =\n EntityMutationCommandExecutionRuntime<RemoteDataGraphError, TOptions>;\n\nexport type FetchGraphReadCapability<TOptions = undefined> = {\n runtime: FetchGraphRuntime<TOptions> &\n FetchRelationshipRuntime<TOptions> &\n FetchEntityMutationRuntime<TOptions>;\n graphExecutor: ReactGraphExecutor<TOptions, TOptions>;\n};\n\nconst DEFAULT_GRAPH_READ_ENDPOINT = '/graph/reads';\nconst DEFAULT_GRAPH_COMMAND_ENDPOINT = '/graph/commands';\n\nexport const createFetchGraphReadCapability = <TOptions = undefined>({\n endpoint = DEFAULT_GRAPH_READ_ENDPOINT,\n commandEndpoint = DEFAULT_GRAPH_COMMAND_ENDPOINT,\n fetch: fetchRequest = globalThis.fetch,\n requestInit,\n}: FetchGraphReadExecutorOptions<TOptions> = {}): FetchGraphReadCapability<TOptions> => {\n const transport: RemoteGraphReadTransport<TOptions> = async (request, options) => {\n const init = requestInit?.(options) ?? {};\n const headers = new Headers(init.headers);\n if (!headers.has('content-type')) headers.set('content-type', 'application/json');\n\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\n try {\n const payload: unknown = await response.json();\n if (!response.ok && !isGraphReadProtocolError(payload)) {\n throw new Error(`Graph read request failed with status ${response.status}.`);\n }\n return payload;\n } catch {\n throw new Error(`Graph read request failed with status ${response.status}.`);\n }\n };\n const commandTransport: RemoteGraphCommandTransport<TOptions> = async (request, options) => {\n const init = requestInit?.(options) ?? {};\n const headers = new Headers(init.headers);\n if (!headers.has('content-type')) headers.set('content-type', 'application/json');\n const response = await fetchRequest(commandEndpoint, {\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();\n if (\n !response.ok &&\n !isGraphCommandProtocolError(payload) &&\n !isGraphCommandRejection(payload)\n ) {\n throw new Error(`Graph Command request failed with status ${response.status}.`);\n }\n return payload;\n };\n const runtime = createRemoteDataGraphRuntime({ transport, commandTransport });\n\n return {\n runtime,\n graphExecutor: {\n get: (read, params, options) => runBrowserEffect(runtime.get(read, params, options)),\n run: (read, params, options) => runBrowserEffect(runtime.run(read, params, options)),\n count: (read, params, options) => runBrowserEffect(runtime.count(read, params, options)),\n runCommand: (command, options) => runBrowserEffect(runtime.runCommand(command, options)),\n runRelationshipCommand: (command, options) =>\n runBrowserEffect(runtime.runRelationshipCommand(command, options)),\n runManyToManyRelationshipCommand: (command, options) =>\n runBrowserEffect(runtime.runManyToManyRelationshipCommand(command, options)),\n runEntityMutationCommand: (command, options) =>\n runBrowserEffect(runtime.runEntityMutationCommand(command, options)),\n },\n };\n};\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { type DurableOperationObservationCapability, type RuntimeTransport } from '@ontahi/core/runtime/protocol';
|
|
2
|
+
export type FetchRuntimeTransportOptions = {
|
|
3
|
+
endpoint?: string;
|
|
4
|
+
fetch?: typeof globalThis.fetch;
|
|
5
|
+
requestId?: () => string;
|
|
6
|
+
requestInit?: () => Omit<RequestInit, 'body' | 'method' | 'signal'>;
|
|
7
|
+
durableOperation?: {
|
|
8
|
+
pollIntervalMs?: number;
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
export type FetchRuntimeTransport = RuntimeTransport & {
|
|
12
|
+
readonly durableOperation: DurableOperationObservationCapability;
|
|
13
|
+
};
|
|
14
|
+
export declare const createFetchRuntimeTransport: ({ endpoint, fetch: fetchRequest, requestId, requestInit, durableOperation, }?: FetchRuntimeTransportOptions) => FetchRuntimeTransport;
|
|
15
|
+
//# sourceMappingURL=fetch-runtime-transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-runtime-transport.d.ts","sourceRoot":"","sources":["../../src/graph/fetch-runtime-transport.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,qCAAqC,EAE1C,KAAK,gBAAgB,EAEtB,MAAM,+BAA+B,CAAC;AAEvC,MAAM,MAAM,4BAA4B,GAAG;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC,CAAC;IACpE,gBAAgB,CAAC,EAAE;QACjB,cAAc,CAAC,EAAE,MAAM,CAAC;KACzB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,gBAAgB,GAAG;IACrD,QAAQ,CAAC,gBAAgB,EAAE,qCAAqC,CAAC;CAClE,CAAC;AAiCF,eAAO,MAAM,2BAA2B,GAAI,+EAMzC,4BAAiC,KAAG,qBAiEtC,CAAC"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { createRuntimeProtocolRequest, isRuntimeProtocolError, parseDurableOperationProtocolResponse, parseRuntimeProtocolResponse, toDurableOperationProtocolRequest, } from '@ontahi/core/runtime/protocol';
|
|
3
|
+
const DEFAULT_RUNTIME_ENDPOINT = '/runtime';
|
|
4
|
+
const DEFAULT_POLL_INTERVAL_MS = 500;
|
|
5
|
+
const terminalTaskStatuses = new Set(['completed', 'failed', 'cancelled']);
|
|
6
|
+
let fallbackRequestSequence = 0;
|
|
7
|
+
const defaultRequestId = () => globalThis.crypto?.randomUUID?.() ??
|
|
8
|
+
`ontahi-runtime-${Date.now()}-${(fallbackRequestSequence += 1)}`;
|
|
9
|
+
const waitForNextInspection = (intervalMs, signal) => {
|
|
10
|
+
if (signal?.aborted)
|
|
11
|
+
return Promise.resolve(false);
|
|
12
|
+
if (intervalMs === 0)
|
|
13
|
+
return Promise.resolve(true);
|
|
14
|
+
return new Promise(resolve => {
|
|
15
|
+
let settled = false;
|
|
16
|
+
const finish = (shouldContinue) => {
|
|
17
|
+
if (settled)
|
|
18
|
+
return;
|
|
19
|
+
settled = true;
|
|
20
|
+
clearTimeout(timeout);
|
|
21
|
+
signal?.removeEventListener('abort', abort);
|
|
22
|
+
resolve(shouldContinue);
|
|
23
|
+
};
|
|
24
|
+
const abort = () => finish(false);
|
|
25
|
+
const timeout = setTimeout(() => finish(true), intervalMs);
|
|
26
|
+
signal?.addEventListener('abort', abort, { once: true });
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
export const createFetchRuntimeTransport = ({ endpoint = DEFAULT_RUNTIME_ENDPOINT, fetch: fetchRequest = globalThis.fetch, requestId = defaultRequestId, requestInit, durableOperation = {}, } = {}) => {
|
|
30
|
+
const pollIntervalMs = durableOperation.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
31
|
+
if (!Number.isFinite(pollIntervalMs) || pollIntervalMs < 0) {
|
|
32
|
+
throw new TypeError('Durable Operation poll interval must be a non-negative finite number.');
|
|
33
|
+
}
|
|
34
|
+
const request = async (runtimeRequest, options) => {
|
|
35
|
+
const init = requestInit?.() ?? {};
|
|
36
|
+
const headers = new Headers(init.headers);
|
|
37
|
+
if (!headers.has('content-type'))
|
|
38
|
+
headers.set('content-type', 'application/json');
|
|
39
|
+
const response = await fetchRequest(endpoint, {
|
|
40
|
+
...init,
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers,
|
|
43
|
+
credentials: init.credentials ?? 'same-origin',
|
|
44
|
+
body: JSON.stringify(runtimeRequest),
|
|
45
|
+
...(options?.signal ? { signal: options.signal } : {}),
|
|
46
|
+
});
|
|
47
|
+
const payload = await response.json().catch(() => null);
|
|
48
|
+
const parsed = parseRuntimeProtocolResponse(payload, runtimeRequest);
|
|
49
|
+
if (!parsed.success)
|
|
50
|
+
throw new Error(parsed.error.error.message);
|
|
51
|
+
if (!response.ok && !isRuntimeProtocolError(parsed.response)) {
|
|
52
|
+
throw new Error(`Runtime Protocol request failed with status ${response.status}.`);
|
|
53
|
+
}
|
|
54
|
+
return parsed.response;
|
|
55
|
+
};
|
|
56
|
+
const observe = async function* (run, options) {
|
|
57
|
+
while (!options?.signal?.aborted) {
|
|
58
|
+
const runtimeRequest = createRuntimeProtocolRequest({
|
|
59
|
+
id: requestId(),
|
|
60
|
+
family: 'durable.operation',
|
|
61
|
+
body: toDurableOperationProtocolRequest(run),
|
|
62
|
+
});
|
|
63
|
+
const runtimeResponse = await request(runtimeRequest, options);
|
|
64
|
+
if (isRuntimeProtocolError(runtimeResponse)) {
|
|
65
|
+
throw new Error(runtimeResponse.error.message);
|
|
66
|
+
}
|
|
67
|
+
const parsed = parseDurableOperationProtocolResponse(runtimeResponse.body);
|
|
68
|
+
if (!parsed.success)
|
|
69
|
+
throw new Error(parsed.error.error.message);
|
|
70
|
+
if (parsed.response.kind === 'protocol-error') {
|
|
71
|
+
throw new Error(parsed.response.error.message);
|
|
72
|
+
}
|
|
73
|
+
const snapshot = parsed.response.snapshot;
|
|
74
|
+
if (snapshot.taskId !== run.taskId || snapshot.runId !== run.runId) {
|
|
75
|
+
throw new Error('Durable Operation snapshot identity does not match the observed run.');
|
|
76
|
+
}
|
|
77
|
+
yield snapshot;
|
|
78
|
+
if (terminalTaskStatuses.has(snapshot.status))
|
|
79
|
+
return;
|
|
80
|
+
if (!(await waitForNextInspection(pollIntervalMs, options?.signal)))
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
return {
|
|
85
|
+
request,
|
|
86
|
+
durableOperation: { observe },
|
|
87
|
+
};
|
|
88
|
+
};
|
|
89
|
+
//# sourceMappingURL=fetch-runtime-transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-runtime-transport.js","sourceRoot":"","sources":["../../src/graph/fetch-runtime-transport.ts"],"names":[],"mappings":"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","sourcesContent":["'use client';\n\nimport type { TaskRunIdentity, TaskSnapshot } from '@ontahi/core/runtime/contracts';\nimport {\n createRuntimeProtocolRequest,\n isRuntimeProtocolError,\n parseDurableOperationProtocolResponse,\n parseRuntimeProtocolResponse,\n toDurableOperationProtocolRequest,\n type DurableOperationObservationCapability,\n type RuntimeProtocolRequestEnvelope,\n type RuntimeTransport,\n type RuntimeTransportRequestOptions,\n} from '@ontahi/core/runtime/protocol';\n\nexport type FetchRuntimeTransportOptions = {\n endpoint?: string;\n fetch?: typeof globalThis.fetch;\n requestId?: () => string;\n requestInit?: () => Omit<RequestInit, 'body' | 'method' | 'signal'>;\n durableOperation?: {\n pollIntervalMs?: number;\n };\n};\n\nexport type FetchRuntimeTransport = RuntimeTransport & {\n readonly durableOperation: DurableOperationObservationCapability;\n};\n\nconst DEFAULT_RUNTIME_ENDPOINT = '/runtime';\nconst DEFAULT_POLL_INTERVAL_MS = 500;\nconst terminalTaskStatuses = new Set(['completed', 'failed', 'cancelled']);\nlet fallbackRequestSequence = 0;\n\nconst defaultRequestId = () =>\n globalThis.crypto?.randomUUID?.() ??\n `ontahi-runtime-${Date.now()}-${(fallbackRequestSequence += 1)}`;\n\nconst waitForNextInspection = (\n intervalMs: number,\n signal: AbortSignal | undefined,\n): Promise<boolean> => {\n if (signal?.aborted) return Promise.resolve(false);\n if (intervalMs === 0) return Promise.resolve(true);\n\n return new Promise(resolve => {\n let settled = false;\n const finish = (shouldContinue: boolean) => {\n if (settled) return;\n settled = true;\n clearTimeout(timeout);\n signal?.removeEventListener('abort', abort);\n resolve(shouldContinue);\n };\n const abort = () => finish(false);\n const timeout = setTimeout(() => finish(true), intervalMs);\n signal?.addEventListener('abort', abort, { once: true });\n });\n};\n\nexport const createFetchRuntimeTransport = ({\n endpoint = DEFAULT_RUNTIME_ENDPOINT,\n fetch: fetchRequest = globalThis.fetch,\n requestId = defaultRequestId,\n requestInit,\n durableOperation = {},\n}: FetchRuntimeTransportOptions = {}): FetchRuntimeTransport => {\n const pollIntervalMs = durableOperation.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;\n if (!Number.isFinite(pollIntervalMs) || pollIntervalMs < 0) {\n throw new TypeError('Durable Operation poll interval must be a non-negative finite number.');\n }\n\n const request = async (\n runtimeRequest: RuntimeProtocolRequestEnvelope,\n options?: RuntimeTransportRequestOptions,\n ) => {\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(runtimeRequest),\n ...(options?.signal ? { signal: options.signal } : {}),\n });\n const payload: unknown = await response.json().catch(() => null);\n const parsed = parseRuntimeProtocolResponse(payload, runtimeRequest);\n if (!parsed.success) throw new Error(parsed.error.error.message);\n if (!response.ok && !isRuntimeProtocolError(parsed.response)) {\n throw new Error(`Runtime Protocol request failed with status ${response.status}.`);\n }\n return parsed.response;\n };\n\n const observe: DurableOperationObservationCapability['observe'] = async function* <TResult>(\n run: TaskRunIdentity,\n options?: RuntimeTransportRequestOptions,\n ): AsyncIterable<TaskSnapshot<TResult>> {\n while (!options?.signal?.aborted) {\n const runtimeRequest = createRuntimeProtocolRequest({\n id: requestId(),\n family: 'durable.operation',\n body: toDurableOperationProtocolRequest(run),\n });\n const runtimeResponse = await request(runtimeRequest, options);\n if (isRuntimeProtocolError(runtimeResponse)) {\n throw new Error(runtimeResponse.error.message);\n }\n\n const parsed = parseDurableOperationProtocolResponse(runtimeResponse.body);\n if (!parsed.success) throw new Error(parsed.error.error.message);\n if (parsed.response.kind === 'protocol-error') {\n throw new Error(parsed.response.error.message);\n }\n\n const snapshot = parsed.response.snapshot as TaskSnapshot<TResult>;\n if (snapshot.taskId !== run.taskId || snapshot.runId !== run.runId) {\n throw new Error('Durable Operation snapshot identity does not match the observed run.');\n }\n yield snapshot;\n if (terminalTaskStatuses.has(snapshot.status)) return;\n if (!(await waitForNextInspection(pollIntervalMs, options?.signal))) return;\n }\n };\n\n return {\n request,\n durableOperation: { observe },\n };\n};\n"]}
|
package/dist/graph/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from './context.js';
|
|
2
2
|
export * from './executor.js';
|
|
3
3
|
export * from './fetch-graph-read-executor.js';
|
|
4
|
+
export * from './fetch-runtime-transport.js';
|
|
4
5
|
export * from './fetch-graph-client.js';
|
|
5
6
|
export * from './graph-hooks.js';
|
|
6
7
|
export * from './operation-cache.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/graph/index.tsx"],"names":[],"mappings":"AAEA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/graph/index.tsx"],"names":[],"mappings":"AAEA,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC"}
|
package/dist/graph/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
export * from './context.js';
|
|
3
3
|
export * from './executor.js';
|
|
4
4
|
export * from './fetch-graph-read-executor.js';
|
|
5
|
+
export * from './fetch-runtime-transport.js';
|
|
5
6
|
export * from './fetch-graph-client.js';
|
|
6
7
|
export * from './graph-hooks.js';
|
|
7
8
|
export * from './operation-cache.js';
|
package/dist/graph/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/graph/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC","sourcesContent":["'use client';\n\nexport * from './context.js';\nexport * from './executor.js';\nexport * from './fetch-graph-read-executor.js';\nexport * from './fetch-graph-client.js';\nexport * from './graph-hooks.js';\nexport * from './operation-cache.js';\nexport * from './operation-hooks.js';\nexport * from './operation-types.js';\nexport * from './reflected-entity-data-hooks.js';\nexport * from './reflected-operation-invoker.js';\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/graph/index.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,cAAc,cAAc,CAAC;AAC7B,cAAc,eAAe,CAAC;AAC9B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yBAAyB,CAAC;AACxC,cAAc,kBAAkB,CAAC;AACjC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC","sourcesContent":["'use client';\n\nexport * from './context.js';\nexport * from './executor.js';\nexport * from './fetch-graph-read-executor.js';\nexport * from './fetch-runtime-transport.js';\nexport * from './fetch-graph-client.js';\nexport * from './graph-hooks.js';\nexport * from './operation-cache.js';\nexport * from './operation-hooks.js';\nexport * from './operation-types.js';\nexport * from './reflected-entity-data-hooks.js';\nexport * from './reflected-operation-invoker.js';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"operation-hooks.d.ts","sourceRoot":"","sources":["../../src/graph/operation-hooks.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,yBAAyB,IAAI,mBAAmB,EAIjD,MAAM,yBAAyB,CAAC;AAKjC,OAAO,EAIL,KAAK,YAAY,EACjB,KAAK,QAAQ,EAEb,KAAK,cAAc,EACpB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"operation-hooks.d.ts","sourceRoot":"","sources":["../../src/graph/operation-hooks.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { hasOwn, isRecord } from '@ontahi/core/value/object';
|
|
|
5
5
|
import { useInfiniteQuery, useQuery, useQueryClient, } from '@tanstack/react-query';
|
|
6
6
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
7
7
|
import { operationBridgeErrored, resolveOperationBridgeInvalidationQueryKeys, resolveOperationBridgeQueryKey, toOperationInvocationResult, unwrapOperationInvocationValue, useAction, } from '../actions/index.js';
|
|
8
|
-
import { useDefaultOperationBridgeAdapter, useGraphClientCache, useGraphClientCacheVersion, useReflectedOperationInvoker, } from './context.js';
|
|
8
|
+
import { useDefaultOperationBridgeAdapter, useGraphClientCache, useGraphClientCacheVersion, useReflectedOperationInvoker, useRuntimeTransportCapability, } from './context.js';
|
|
9
9
|
import { getOperationClientCacheKey, invalidateOperationCacheRefs, invalidateReactQueryCachesContainingRefs, readInitialOperationCacheValueFromCache, reconcileOperationOutput, } from './operation-cache.js';
|
|
10
10
|
const operationHookOptionKeys = new Set([
|
|
11
11
|
'onExecute',
|
|
@@ -225,28 +225,45 @@ export function useOperation(operationOrInvocation, initialInputOrOptions, manag
|
|
|
225
225
|
: baseResult);
|
|
226
226
|
}
|
|
227
227
|
export function useDurableOperation(operation, options) {
|
|
228
|
-
const
|
|
228
|
+
const runtimeTransport = useRuntimeTransportCapability();
|
|
229
|
+
const observer = runtimeTransport?.durableOperation;
|
|
229
230
|
const queryClient = useQueryClient();
|
|
230
231
|
const mutation = useOperation(operation, { ...options, invalidateOnSuccess: false });
|
|
231
232
|
const runRef = mutation.value;
|
|
232
|
-
const
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
if (!runRef || !adapter.getTaskSnapshot) {
|
|
237
|
-
throw new Error('The operation bridge does not provide task snapshot transport.');
|
|
238
|
-
}
|
|
239
|
-
return adapter.getTaskSnapshot({ taskId: runRef.taskId, runId: runRef.runId });
|
|
240
|
-
},
|
|
241
|
-
refetchInterval: query => {
|
|
242
|
-
const status = query.state.data?.status;
|
|
243
|
-
return status === 'completed' || status === 'failed' || status === 'cancelled'
|
|
244
|
-
? false
|
|
245
|
-
: (options?.pollIntervalMs ?? 500);
|
|
246
|
-
},
|
|
247
|
-
});
|
|
248
|
-
const snapshot = snapshotQuery.data;
|
|
233
|
+
const runKey = runRef ? `${runRef.taskId}:${runRef.runId}` : undefined;
|
|
234
|
+
const [observation, setObservation] = useState({ runKey: undefined, snapshot: undefined, active: false });
|
|
235
|
+
const currentObservation = observation.runKey === runKey ? observation : undefined;
|
|
236
|
+
const snapshot = currentObservation?.snapshot;
|
|
249
237
|
const invalidatedRunRef = useRef(undefined);
|
|
238
|
+
useEffect(() => {
|
|
239
|
+
if (!runRef || !runKey || !observer)
|
|
240
|
+
return;
|
|
241
|
+
const controller = new AbortController();
|
|
242
|
+
let active = true;
|
|
243
|
+
setObservation({ runKey, snapshot: undefined, active: true });
|
|
244
|
+
void (async () => {
|
|
245
|
+
try {
|
|
246
|
+
for await (const nextSnapshot of observer.observe({ taskId: runRef.taskId, runId: runRef.runId }, { signal: controller.signal })) {
|
|
247
|
+
if (!active)
|
|
248
|
+
return;
|
|
249
|
+
setObservation({ runKey, snapshot: nextSnapshot, active: true });
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
catch {
|
|
253
|
+
if (!controller.signal.aborted && active) {
|
|
254
|
+
setObservation(current => current.runKey === runKey ? { ...current, active: false } : current);
|
|
255
|
+
}
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
if (active) {
|
|
259
|
+
setObservation(current => current.runKey === runKey ? { ...current, active: false } : current);
|
|
260
|
+
}
|
|
261
|
+
})();
|
|
262
|
+
return () => {
|
|
263
|
+
active = false;
|
|
264
|
+
controller.abort();
|
|
265
|
+
};
|
|
266
|
+
}, [observer, runKey, runRef]);
|
|
250
267
|
useEffect(() => {
|
|
251
268
|
if (!snapshot ||
|
|
252
269
|
(snapshot.status !== 'completed' &&
|
|
@@ -267,6 +284,7 @@ export function useDurableOperation(operation, options) {
|
|
|
267
284
|
}, [mutation.input, operation, options?.invalidateOnSuccess, queryClient, snapshot]);
|
|
268
285
|
const reset = useCallback(() => {
|
|
269
286
|
mutation.reset();
|
|
287
|
+
setObservation({ runKey: undefined, snapshot: undefined, active: false });
|
|
270
288
|
invalidatedRunRef.current = undefined;
|
|
271
289
|
}, [mutation]);
|
|
272
290
|
const runStatus = snapshot?.status ?? runRef?.status;
|
|
@@ -283,9 +301,11 @@ export function useDurableOperation(operation, options) {
|
|
|
283
301
|
isCompleted: runStatus === 'completed',
|
|
284
302
|
isFailed: runStatus === 'failed',
|
|
285
303
|
isCancelled: runStatus === 'cancelled',
|
|
286
|
-
isRefreshingRun:
|
|
304
|
+
isRefreshingRun: currentObservation?.active ?? false,
|
|
287
305
|
isExecuting: mutation.isExecuting ||
|
|
288
|
-
(Boolean(
|
|
306
|
+
(Boolean(observer) &&
|
|
307
|
+
currentObservation?.active !== false &&
|
|
308
|
+
(runStatus === 'queued' || runStatus === 'running')),
|
|
289
309
|
};
|
|
290
310
|
}
|
|
291
311
|
export function useOperationQuery(operation, inputOrOptions, providedOptions) {
|