Skip to content

Commit 5841154

Browse files
committed
add create resource stream hook
1 parent 5a61a1a commit 5841154

File tree

4 files changed

+109
-50
lines changed

4 files changed

+109
-50
lines changed

package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,10 @@
8989
"pnpm": {
9090
"onlyBuiltDependencies": [
9191
"esbuild"
92-
]
92+
],
93+
"overrides": {
94+
"@viamrobotics/sdk": "link:../viam-typescript-sdk"
95+
}
9396
},
9497
"packageManager": "[email protected]"
9598
}

pnpm-lock.yaml

Lines changed: 6 additions & 49 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
import {
2+
experimental_streamedQuery as streamedQuery,
3+
type QueryFunction,
4+
} from '@tanstack/svelte-query';
5+
import type { Resource } from '@viamrobotics/sdk';
6+
import { toStore, fromStore } from 'svelte/store';
7+
import { useQueryLogger } from '../query-logger';
8+
9+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
10+
export type ArgumentsType<T> = T extends (...args: infer U) => any ? U : never;
11+
12+
export type ResolvedReturnType<T> = T extends (
13+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
14+
...args: any[]
15+
) => Promise<infer R>
16+
? R
17+
: never;
18+
19+
interface QueryOptions {
20+
// enabled defaults to true if unspecified
21+
enabled?: boolean;
22+
refetchMode?: 'append' | 'reset' | 'replace';
23+
maxChunks?: number;
24+
}
25+
26+
export const createResourceStream = <T extends Resource, K extends keyof T>(
27+
client: { current: T | undefined },
28+
method: K,
29+
...additional:
30+
| [
31+
args?: (() => ArgumentsType<T[K]>) | ArgumentsType<T[K]>,
32+
options?: (() => QueryOptions) | QueryOptions,
33+
]
34+
| [options?: (() => QueryOptions) | QueryOptions]
35+
): QueryFunction<ResolvedReturnType<T[K]>[], typeof queryKey> => {
36+
const debug = useQueryLogger();
37+
38+
let [args, options] = additional;
39+
40+
if (options === undefined && args !== undefined) {
41+
options = args as QueryOptions;
42+
args = undefined;
43+
}
44+
45+
const _options = $derived(
46+
typeof options === 'function' ? options() : options
47+
);
48+
const _args = $derived(typeof args === 'function' ? args() : args);
49+
const name = $derived(client.current?.name);
50+
const methodName = $derived(String(method));
51+
52+
const queryKey = $derived([
53+
'viam-svelte-sdk',
54+
'partID',
55+
(client.current as T & { partID: string })?.partID,
56+
'resource',
57+
name,
58+
methodName,
59+
...(_args ? [_args] : []),
60+
]);
61+
62+
const queryOptions = $derived({
63+
queryKey,
64+
queryFn: async () => {
65+
const clientFunc = client.current?.[method];
66+
67+
if (typeof clientFunc !== 'function') {
68+
throw new TypeError(
69+
`${String(method)} is not a method on the resource client.`
70+
);
71+
}
72+
73+
const logger = debug.createLogger();
74+
logger('REQ', name, methodName, _args);
75+
76+
try {
77+
const response = (await clientFunc?.apply(
78+
client.current,
79+
_args
80+
)) as AsyncIterable<ResolvedReturnType<T[K]>>;
81+
82+
logger('RES', name, methodName, response);
83+
return response;
84+
} catch (error) {
85+
logger('ERR', name, methodName, error);
86+
throw error;
87+
}
88+
},
89+
..._options,
90+
});
91+
92+
const queryOptionsStore = fromStore(toStore(() => queryOptions));
93+
const query = streamedQuery<ResolvedReturnType<T[K]>, typeof queryKey>(
94+
queryOptionsStore.current
95+
);
96+
97+
return query;
98+
};

src/lib/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export { createRobotMutation } from './hooks/create-robot-mutation.svelte';
1616
export { createResourceClient } from './hooks/create-resource-client.svelte';
1717
export { createResourceQuery } from './hooks/create-resource-query.svelte';
1818
export { createResourceMutation } from './hooks/create-resource-mutation.svelte';
19+
export { createResourceStream } from './hooks/create-resource-stream.svelte';
1920
export { createStreamClient } from './hooks/create-stream-client.svelte';
2021

2122
export { useMachineStatus } from './hooks/machine-status.svelte';

0 commit comments

Comments
 (0)