From 584115405cb2af1923312379db3dfabcfa56cb1e Mon Sep 17 00:00:00 2001 From: Devin C Date: Thu, 28 Aug 2025 14:27:13 -0400 Subject: [PATCH 1/6] add create resource stream hook --- package.json | 5 +- pnpm-lock.yaml | 55 ++--------- .../hooks/create-resource-stream.svelte.ts | 98 +++++++++++++++++++ src/lib/index.ts | 1 + 4 files changed, 109 insertions(+), 50 deletions(-) create mode 100644 src/lib/hooks/create-resource-stream.svelte.ts diff --git a/package.json b/package.json index 1035bc03..785722cc 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,10 @@ "pnpm": { "onlyBuiltDependencies": [ "esbuild" - ] + ], + "overrides": { + "@viamrobotics/sdk": "link:../viam-typescript-sdk" + } }, "packageManager": "pnpm@10.14.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c80f2b3..c2aaf087 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,10 +4,16 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@viamrobotics/sdk': link:../viam-typescript-sdk + importers: .: dependencies: + '@viamrobotics/sdk': + specifier: link:../viam-typescript-sdk + version: link:../viam-typescript-sdk runed: specifier: ^0.29.1 version: 0.29.2(svelte@5.25.10) @@ -57,9 +63,6 @@ importers: '@viamrobotics/prettier-config-svelte': specifier: ^1.1.0 version: 1.1.0(prettier@3.6.2)(svelte@5.25.10)(tailwindcss@4.1.11) - '@viamrobotics/sdk': - specifier: ^0.45.0 - version: 0.45.0 '@viamrobotics/typescript-config': specifier: ^0.1.1 version: 0.1.1(typescript@5.9.2) @@ -136,9 +139,6 @@ packages: resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} engines: {node: '>=6.9.0'} - '@bufbuild/protobuf@1.10.1': - resolution: {integrity: sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==} - '@changesets/apply-release-plan@7.0.12': resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} @@ -194,17 +194,6 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@connectrpc/connect-web@1.6.1': - resolution: {integrity: sha512-GVfxQOmt3TtgTaKeXLS/EA2IHa3nHxwe2BCHT7X0Q/0hohM+nP5DDnIItGEjGrGdt3LTTqWqE4s70N4h+qIMlQ==} - peerDependencies: - '@bufbuild/protobuf': ^1.10.0 - '@connectrpc/connect': 1.6.1 - - '@connectrpc/connect@1.6.1': - resolution: {integrity: sha512-KchMDNtU4CDTdkyf0qG7ugJ6qHTOR/aI7XebYn3OTCNagaDYWiZUVKgRgwH79yeMkpNgvEUaXSK7wKjaBK9b/Q==} - peerDependencies: - '@bufbuild/protobuf': ^1.10.0 - '@csstools/color-helpers@5.0.2': resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} engines: {node: '>=18'} @@ -939,9 +928,6 @@ packages: peerDependencies: prettier: '>=3 <4' - '@viamrobotics/sdk@0.45.0': - resolution: {integrity: sha512-zl272isirvqI26abFCj/CboIgdrnrlj91KiWzCrSLng6lEo6xDX4ydECm56fVScVQOKLjmddscYjlA5FwJsATw==} - '@viamrobotics/typescript-config@0.1.1': resolution: {integrity: sha512-cIbEOlldP4r+F3/nESoXz3zXtYGnJNhRwPWtDjLRwswDJkz2i+moKO1DE2pRib/Z3+B1Qo+TzLYkkzEZJxevcw==} peerDependencies: @@ -1069,9 +1055,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bsonfy@1.0.2: - resolution: {integrity: sha512-/kLM6B2x/CWXdkTu2kAv65trB4YruwahBpFDxYkkSunve6Rvx7KSoSHHe1f4jsPXPgXvDG393IjkQ3Us645Eag==} - builtin-modules@5.0.0: resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} engines: {node: '>=18.20'} @@ -1336,9 +1319,6 @@ packages: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} - exponential-backoff@3.1.2: - resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} - extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -2495,8 +2475,6 @@ snapshots: '@babel/runtime@7.28.2': {} - '@bufbuild/protobuf@1.10.1': {} - '@changesets/apply-release-plan@7.0.12': dependencies: '@changesets/config': 3.1.1 @@ -2639,15 +2617,6 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 - '@connectrpc/connect-web@1.6.1(@bufbuild/protobuf@1.10.1)(@connectrpc/connect@1.6.1(@bufbuild/protobuf@1.10.1))': - dependencies: - '@bufbuild/protobuf': 1.10.1 - '@connectrpc/connect': 1.6.1(@bufbuild/protobuf@1.10.1) - - '@connectrpc/connect@1.6.1(@bufbuild/protobuf@1.10.1)': - dependencies: - '@bufbuild/protobuf': 1.10.1 - '@csstools/color-helpers@5.0.2': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -3346,14 +3315,6 @@ snapshots: dependencies: prettier: 3.6.2 - '@viamrobotics/sdk@0.45.0': - dependencies: - '@bufbuild/protobuf': 1.10.1 - '@connectrpc/connect': 1.6.1(@bufbuild/protobuf@1.10.1) - '@connectrpc/connect-web': 1.6.1(@bufbuild/protobuf@1.10.1)(@connectrpc/connect@1.6.1(@bufbuild/protobuf@1.10.1)) - bsonfy: 1.0.2 - exponential-backoff: 3.1.2 - '@viamrobotics/typescript-config@0.1.1(typescript@5.9.2)': dependencies: typescript: 5.9.2 @@ -3477,8 +3438,6 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.2) - bsonfy@1.0.2: {} - builtin-modules@5.0.0: {} cac@6.7.14: {} @@ -3765,8 +3724,6 @@ snapshots: expect-type@1.2.2: {} - exponential-backoff@3.1.2: {} - extendable-error@0.1.7: {} external-editor@3.1.0: diff --git a/src/lib/hooks/create-resource-stream.svelte.ts b/src/lib/hooks/create-resource-stream.svelte.ts new file mode 100644 index 00000000..73e09fc8 --- /dev/null +++ b/src/lib/hooks/create-resource-stream.svelte.ts @@ -0,0 +1,98 @@ +import { + experimental_streamedQuery as streamedQuery, + type QueryFunction, +} from '@tanstack/svelte-query'; +import type { Resource } from '@viamrobotics/sdk'; +import { toStore, fromStore } from 'svelte/store'; +import { useQueryLogger } from '../query-logger'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +export type ArgumentsType = T extends (...args: infer U) => any ? U : never; + +export type ResolvedReturnType = T extends ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ...args: any[] +) => Promise + ? R + : never; + +interface QueryOptions { + // enabled defaults to true if unspecified + enabled?: boolean; + refetchMode?: 'append' | 'reset' | 'replace'; + maxChunks?: number; +} + +export const createResourceStream = ( + client: { current: T | undefined }, + method: K, + ...additional: + | [ + args?: (() => ArgumentsType) | ArgumentsType, + options?: (() => QueryOptions) | QueryOptions, + ] + | [options?: (() => QueryOptions) | QueryOptions] +): QueryFunction[], typeof queryKey> => { + const debug = useQueryLogger(); + + let [args, options] = additional; + + if (options === undefined && args !== undefined) { + options = args as QueryOptions; + args = undefined; + } + + const _options = $derived( + typeof options === 'function' ? options() : options + ); + const _args = $derived(typeof args === 'function' ? args() : args); + const name = $derived(client.current?.name); + const methodName = $derived(String(method)); + + const queryKey = $derived([ + 'viam-svelte-sdk', + 'partID', + (client.current as T & { partID: string })?.partID, + 'resource', + name, + methodName, + ...(_args ? [_args] : []), + ]); + + const queryOptions = $derived({ + queryKey, + queryFn: async () => { + const clientFunc = client.current?.[method]; + + if (typeof clientFunc !== 'function') { + throw new TypeError( + `${String(method)} is not a method on the resource client.` + ); + } + + const logger = debug.createLogger(); + logger('REQ', name, methodName, _args); + + try { + const response = (await clientFunc?.apply( + client.current, + _args + )) as AsyncIterable>; + + logger('RES', name, methodName, response); + return response; + } catch (error) { + logger('ERR', name, methodName, error); + throw error; + } + }, + ..._options, + }); + + const queryOptionsStore = fromStore(toStore(() => queryOptions)); + const query = streamedQuery, typeof queryKey>( + queryOptionsStore.current + ); + + return query; +}; diff --git a/src/lib/index.ts b/src/lib/index.ts index fa87efe6..5eadd489 100644 --- a/src/lib/index.ts +++ b/src/lib/index.ts @@ -16,6 +16,7 @@ export { createRobotMutation } from './hooks/create-robot-mutation.svelte'; export { createResourceClient } from './hooks/create-resource-client.svelte'; export { createResourceQuery } from './hooks/create-resource-query.svelte'; export { createResourceMutation } from './hooks/create-resource-mutation.svelte'; +export { createResourceStream } from './hooks/create-resource-stream.svelte'; export { createStreamClient } from './hooks/create-stream-client.svelte'; export { useMachineStatus } from './hooks/machine-status.svelte'; From 9c782ba121ee0ac9f6e0985c9f4573bec3ede6d0 Mon Sep 17 00:00:00 2001 From: Devin C Date: Thu, 28 Aug 2025 14:28:28 -0400 Subject: [PATCH 2/6] remove link --- package.json | 5 +---- pnpm-lock.yaml | 55 ++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 785722cc..1035bc03 100644 --- a/package.json +++ b/package.json @@ -89,10 +89,7 @@ "pnpm": { "onlyBuiltDependencies": [ "esbuild" - ], - "overrides": { - "@viamrobotics/sdk": "link:../viam-typescript-sdk" - } + ] }, "packageManager": "pnpm@10.14.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2aaf087..1c80f2b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,16 +4,10 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - '@viamrobotics/sdk': link:../viam-typescript-sdk - importers: .: dependencies: - '@viamrobotics/sdk': - specifier: link:../viam-typescript-sdk - version: link:../viam-typescript-sdk runed: specifier: ^0.29.1 version: 0.29.2(svelte@5.25.10) @@ -63,6 +57,9 @@ importers: '@viamrobotics/prettier-config-svelte': specifier: ^1.1.0 version: 1.1.0(prettier@3.6.2)(svelte@5.25.10)(tailwindcss@4.1.11) + '@viamrobotics/sdk': + specifier: ^0.45.0 + version: 0.45.0 '@viamrobotics/typescript-config': specifier: ^0.1.1 version: 0.1.1(typescript@5.9.2) @@ -139,6 +136,9 @@ packages: resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} engines: {node: '>=6.9.0'} + '@bufbuild/protobuf@1.10.1': + resolution: {integrity: sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==} + '@changesets/apply-release-plan@7.0.12': resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} @@ -194,6 +194,17 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@connectrpc/connect-web@1.6.1': + resolution: {integrity: sha512-GVfxQOmt3TtgTaKeXLS/EA2IHa3nHxwe2BCHT7X0Q/0hohM+nP5DDnIItGEjGrGdt3LTTqWqE4s70N4h+qIMlQ==} + peerDependencies: + '@bufbuild/protobuf': ^1.10.0 + '@connectrpc/connect': 1.6.1 + + '@connectrpc/connect@1.6.1': + resolution: {integrity: sha512-KchMDNtU4CDTdkyf0qG7ugJ6qHTOR/aI7XebYn3OTCNagaDYWiZUVKgRgwH79yeMkpNgvEUaXSK7wKjaBK9b/Q==} + peerDependencies: + '@bufbuild/protobuf': ^1.10.0 + '@csstools/color-helpers@5.0.2': resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} engines: {node: '>=18'} @@ -928,6 +939,9 @@ packages: peerDependencies: prettier: '>=3 <4' + '@viamrobotics/sdk@0.45.0': + resolution: {integrity: sha512-zl272isirvqI26abFCj/CboIgdrnrlj91KiWzCrSLng6lEo6xDX4ydECm56fVScVQOKLjmddscYjlA5FwJsATw==} + '@viamrobotics/typescript-config@0.1.1': resolution: {integrity: sha512-cIbEOlldP4r+F3/nESoXz3zXtYGnJNhRwPWtDjLRwswDJkz2i+moKO1DE2pRib/Z3+B1Qo+TzLYkkzEZJxevcw==} peerDependencies: @@ -1055,6 +1069,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bsonfy@1.0.2: + resolution: {integrity: sha512-/kLM6B2x/CWXdkTu2kAv65trB4YruwahBpFDxYkkSunve6Rvx7KSoSHHe1f4jsPXPgXvDG393IjkQ3Us645Eag==} + builtin-modules@5.0.0: resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} engines: {node: '>=18.20'} @@ -1319,6 +1336,9 @@ packages: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} + exponential-backoff@3.1.2: + resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -2475,6 +2495,8 @@ snapshots: '@babel/runtime@7.28.2': {} + '@bufbuild/protobuf@1.10.1': {} + '@changesets/apply-release-plan@7.0.12': dependencies: '@changesets/config': 3.1.1 @@ -2617,6 +2639,15 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 + '@connectrpc/connect-web@1.6.1(@bufbuild/protobuf@1.10.1)(@connectrpc/connect@1.6.1(@bufbuild/protobuf@1.10.1))': + dependencies: + '@bufbuild/protobuf': 1.10.1 + '@connectrpc/connect': 1.6.1(@bufbuild/protobuf@1.10.1) + + '@connectrpc/connect@1.6.1(@bufbuild/protobuf@1.10.1)': + dependencies: + '@bufbuild/protobuf': 1.10.1 + '@csstools/color-helpers@5.0.2': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -3315,6 +3346,14 @@ snapshots: dependencies: prettier: 3.6.2 + '@viamrobotics/sdk@0.45.0': + dependencies: + '@bufbuild/protobuf': 1.10.1 + '@connectrpc/connect': 1.6.1(@bufbuild/protobuf@1.10.1) + '@connectrpc/connect-web': 1.6.1(@bufbuild/protobuf@1.10.1)(@connectrpc/connect@1.6.1(@bufbuild/protobuf@1.10.1)) + bsonfy: 1.0.2 + exponential-backoff: 3.1.2 + '@viamrobotics/typescript-config@0.1.1(typescript@5.9.2)': dependencies: typescript: 5.9.2 @@ -3438,6 +3477,8 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.2) + bsonfy@1.0.2: {} + builtin-modules@5.0.0: {} cac@6.7.14: {} @@ -3724,6 +3765,8 @@ snapshots: expect-type@1.2.2: {} + exponential-backoff@3.1.2: {} + extendable-error@0.1.7: {} external-editor@3.1.0: From fad0eb83a23f3c0afb23f0d97843b6fb85327229 Mon Sep 17 00:00:00 2001 From: Devin C Date: Thu, 28 Aug 2025 16:52:02 -0400 Subject: [PATCH 3/6] some updates, still don't think types are right --- package.json | 5 +- pnpm-lock.yaml | 55 +--------- .../hooks/create-resource-stream.svelte.ts | 103 ++++++++++-------- 3 files changed, 69 insertions(+), 94 deletions(-) diff --git a/package.json b/package.json index 1035bc03..785722cc 100644 --- a/package.json +++ b/package.json @@ -89,7 +89,10 @@ "pnpm": { "onlyBuiltDependencies": [ "esbuild" - ] + ], + "overrides": { + "@viamrobotics/sdk": "link:../viam-typescript-sdk" + } }, "packageManager": "pnpm@10.14.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c80f2b3..c2aaf087 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,10 +4,16 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + '@viamrobotics/sdk': link:../viam-typescript-sdk + importers: .: dependencies: + '@viamrobotics/sdk': + specifier: link:../viam-typescript-sdk + version: link:../viam-typescript-sdk runed: specifier: ^0.29.1 version: 0.29.2(svelte@5.25.10) @@ -57,9 +63,6 @@ importers: '@viamrobotics/prettier-config-svelte': specifier: ^1.1.0 version: 1.1.0(prettier@3.6.2)(svelte@5.25.10)(tailwindcss@4.1.11) - '@viamrobotics/sdk': - specifier: ^0.45.0 - version: 0.45.0 '@viamrobotics/typescript-config': specifier: ^0.1.1 version: 0.1.1(typescript@5.9.2) @@ -136,9 +139,6 @@ packages: resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} engines: {node: '>=6.9.0'} - '@bufbuild/protobuf@1.10.1': - resolution: {integrity: sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==} - '@changesets/apply-release-plan@7.0.12': resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} @@ -194,17 +194,6 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} - '@connectrpc/connect-web@1.6.1': - resolution: {integrity: sha512-GVfxQOmt3TtgTaKeXLS/EA2IHa3nHxwe2BCHT7X0Q/0hohM+nP5DDnIItGEjGrGdt3LTTqWqE4s70N4h+qIMlQ==} - peerDependencies: - '@bufbuild/protobuf': ^1.10.0 - '@connectrpc/connect': 1.6.1 - - '@connectrpc/connect@1.6.1': - resolution: {integrity: sha512-KchMDNtU4CDTdkyf0qG7ugJ6qHTOR/aI7XebYn3OTCNagaDYWiZUVKgRgwH79yeMkpNgvEUaXSK7wKjaBK9b/Q==} - peerDependencies: - '@bufbuild/protobuf': ^1.10.0 - '@csstools/color-helpers@5.0.2': resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} engines: {node: '>=18'} @@ -939,9 +928,6 @@ packages: peerDependencies: prettier: '>=3 <4' - '@viamrobotics/sdk@0.45.0': - resolution: {integrity: sha512-zl272isirvqI26abFCj/CboIgdrnrlj91KiWzCrSLng6lEo6xDX4ydECm56fVScVQOKLjmddscYjlA5FwJsATw==} - '@viamrobotics/typescript-config@0.1.1': resolution: {integrity: sha512-cIbEOlldP4r+F3/nESoXz3zXtYGnJNhRwPWtDjLRwswDJkz2i+moKO1DE2pRib/Z3+B1Qo+TzLYkkzEZJxevcw==} peerDependencies: @@ -1069,9 +1055,6 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true - bsonfy@1.0.2: - resolution: {integrity: sha512-/kLM6B2x/CWXdkTu2kAv65trB4YruwahBpFDxYkkSunve6Rvx7KSoSHHe1f4jsPXPgXvDG393IjkQ3Us645Eag==} - builtin-modules@5.0.0: resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} engines: {node: '>=18.20'} @@ -1336,9 +1319,6 @@ packages: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} - exponential-backoff@3.1.2: - resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} - extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -2495,8 +2475,6 @@ snapshots: '@babel/runtime@7.28.2': {} - '@bufbuild/protobuf@1.10.1': {} - '@changesets/apply-release-plan@7.0.12': dependencies: '@changesets/config': 3.1.1 @@ -2639,15 +2617,6 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 - '@connectrpc/connect-web@1.6.1(@bufbuild/protobuf@1.10.1)(@connectrpc/connect@1.6.1(@bufbuild/protobuf@1.10.1))': - dependencies: - '@bufbuild/protobuf': 1.10.1 - '@connectrpc/connect': 1.6.1(@bufbuild/protobuf@1.10.1) - - '@connectrpc/connect@1.6.1(@bufbuild/protobuf@1.10.1)': - dependencies: - '@bufbuild/protobuf': 1.10.1 - '@csstools/color-helpers@5.0.2': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -3346,14 +3315,6 @@ snapshots: dependencies: prettier: 3.6.2 - '@viamrobotics/sdk@0.45.0': - dependencies: - '@bufbuild/protobuf': 1.10.1 - '@connectrpc/connect': 1.6.1(@bufbuild/protobuf@1.10.1) - '@connectrpc/connect-web': 1.6.1(@bufbuild/protobuf@1.10.1)(@connectrpc/connect@1.6.1(@bufbuild/protobuf@1.10.1)) - bsonfy: 1.0.2 - exponential-backoff: 3.1.2 - '@viamrobotics/typescript-config@0.1.1(typescript@5.9.2)': dependencies: typescript: 5.9.2 @@ -3477,8 +3438,6 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.2) - bsonfy@1.0.2: {} - builtin-modules@5.0.0: {} cac@6.7.14: {} @@ -3765,8 +3724,6 @@ snapshots: expect-type@1.2.2: {} - exponential-backoff@3.1.2: {} - extendable-error@0.1.7: {} external-editor@3.1.0: diff --git a/src/lib/hooks/create-resource-stream.svelte.ts b/src/lib/hooks/create-resource-stream.svelte.ts index 73e09fc8..995b4f88 100644 --- a/src/lib/hooks/create-resource-stream.svelte.ts +++ b/src/lib/hooks/create-resource-stream.svelte.ts @@ -1,6 +1,8 @@ import { experimental_streamedQuery as streamedQuery, - type QueryFunction, + createQuery, + type QueryObserverResult, + queryOptions as createQueryOptions, } from '@tanstack/svelte-query'; import type { Resource } from '@viamrobotics/sdk'; import { toStore, fromStore } from 'svelte/store'; @@ -9,13 +11,6 @@ import { useQueryLogger } from '../query-logger'; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type ArgumentsType = T extends (...args: infer U) => any ? U : never; -export type ResolvedReturnType = T extends ( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ...args: any[] -) => Promise - ? R - : never; - interface QueryOptions { // enabled defaults to true if unspecified enabled?: boolean; @@ -23,6 +18,18 @@ interface QueryOptions { maxChunks?: number; } +export type ResolvedReturnType = T extends ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ...args: any[] +) => infer R + ? R + : never; + +type QueryResult = QueryObserverResult< + ResolvedReturnType[], + Error +>; + export const createResourceStream = ( client: { current: T | undefined }, method: K, @@ -32,7 +39,7 @@ export const createResourceStream = ( options?: (() => QueryOptions) | QueryOptions, ] | [options?: (() => QueryOptions) | QueryOptions] -): QueryFunction[], typeof queryKey> => { +): { current: QueryResult } => { const debug = useQueryLogger(); let [args, options] = additional; @@ -45,10 +52,10 @@ export const createResourceStream = ( const _options = $derived( typeof options === 'function' ? options() : options ); + const _args = $derived(typeof args === 'function' ? args() : args); const name = $derived(client.current?.name); const methodName = $derived(String(method)); - const queryKey = $derived([ 'viam-svelte-sdk', 'partID', @@ -59,40 +66,48 @@ export const createResourceStream = ( ...(_args ? [_args] : []), ]); - const queryOptions = $derived({ - queryKey, - queryFn: async () => { - const clientFunc = client.current?.[method]; - - if (typeof clientFunc !== 'function') { - throw new TypeError( - `${String(method)} is not a method on the resource client.` - ); - } - - const logger = debug.createLogger(); - logger('REQ', name, methodName, _args); - - try { - const response = (await clientFunc?.apply( - client.current, - _args - )) as AsyncIterable>; - - logger('RES', name, methodName, response); - return response; - } catch (error) { - logger('ERR', name, methodName, error); - throw error; - } - }, - ..._options, - }); - - const queryOptionsStore = fromStore(toStore(() => queryOptions)); - const query = streamedQuery, typeof queryKey>( - queryOptionsStore.current + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type, @typescript-eslint/no-explicit-any + function processStream() { + const clientFunc = client.current?.[method]; + + if (typeof clientFunc !== 'function') { + throw new TypeError( + `${String(method)} is not a method on the resource client.` + ); + } + + const logger = debug.createLogger(); + logger('REQ', name, methodName, _args); + + try { + const response = clientFunc?.apply( + client.current, + _args + ) as AsyncGenerator>; + console.log('response', typeof response); + + logger('RES', name, methodName, response); + return { + async *[Symbol.asyncIterator]() { + yield* response; + }, + }; + } catch (error) { + logger('ERR', name, methodName, error); + throw error; + } + } + + const queryOptions = $derived( + createQueryOptions({ + queryKey, + enabled: client.current !== undefined && _options?.enabled !== false, + queryFn: streamedQuery>({ + queryFn: processStream, + ..._options, + }), + }) ); - return query; + return fromStore(createQuery(toStore(() => queryOptions))); }; From cfd8fae92924b96efc30c2a1855506acdb8a5e9a Mon Sep 17 00:00:00 2001 From: Devin C Date: Wed, 3 Sep 2025 14:33:51 -0400 Subject: [PATCH 4/6] fix typing and stream handling --- .../hooks/create-resource-stream.svelte.ts | 33 ++++++++----------- src/routes/+layout.svelte | 5 +-- 2 files changed, 14 insertions(+), 24 deletions(-) diff --git a/src/lib/hooks/create-resource-stream.svelte.ts b/src/lib/hooks/create-resource-stream.svelte.ts index 995b4f88..894ed486 100644 --- a/src/lib/hooks/create-resource-stream.svelte.ts +++ b/src/lib/hooks/create-resource-stream.svelte.ts @@ -11,6 +11,14 @@ import { useQueryLogger } from '../query-logger'; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type ArgumentsType = T extends (...args: infer U) => any ? U : never; +export type StreamItemType = T extends ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + ...args: any[] + // eslint-disable-next-line @typescript-eslint/no-explicit-any +) => AsyncGenerator + ? R + : never; + interface QueryOptions { // enabled defaults to true if unspecified enabled?: boolean; @@ -18,17 +26,7 @@ interface QueryOptions { maxChunks?: number; } -export type ResolvedReturnType = T extends ( - // eslint-disable-next-line @typescript-eslint/no-explicit-any - ...args: any[] -) => infer R - ? R - : never; - -type QueryResult = QueryObserverResult< - ResolvedReturnType[], - Error ->; +type QueryResult = QueryObserverResult; export const createResourceStream = ( client: { current: T | undefined }, @@ -39,7 +37,7 @@ export const createResourceStream = ( options?: (() => QueryOptions) | QueryOptions, ] | [options?: (() => QueryOptions) | QueryOptions] -): { current: QueryResult } => { +): { current: QueryResult> } => { const debug = useQueryLogger(); let [args, options] = additional; @@ -66,7 +64,6 @@ export const createResourceStream = ( ...(_args ? [_args] : []), ]); - // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type, @typescript-eslint/no-explicit-any function processStream() { const clientFunc = client.current?.[method]; @@ -83,15 +80,11 @@ export const createResourceStream = ( const response = clientFunc?.apply( client.current, _args - ) as AsyncGenerator>; + ) as AsyncGenerator>; console.log('response', typeof response); logger('RES', name, methodName, response); - return { - async *[Symbol.asyncIterator]() { - yield* response; - }, - }; + return response; } catch (error) { logger('ERR', name, methodName, error); throw error; @@ -102,7 +95,7 @@ export const createResourceStream = ( createQueryOptions({ queryKey, enabled: client.current !== undefined && _options?.enabled !== false, - queryFn: streamedQuery>({ + queryFn: streamedQuery>({ queryFn: processStream, ..._options, }), diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte index 1287e79a..97d2bcdd 100644 --- a/src/routes/+layout.svelte +++ b/src/routes/+layout.svelte @@ -43,10 +43,7 @@ let { children }: Props = $props(); {/each} - + {@render children()} From e4a8e838f203cb6117ed0628a5b9f5f5357d3260 Mon Sep 17 00:00:00 2001 From: Devin C Date: Wed, 3 Sep 2025 14:34:37 -0400 Subject: [PATCH 5/6] changeset --- .changeset/cuddly-kids-love.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/cuddly-kids-love.md diff --git a/.changeset/cuddly-kids-love.md b/.changeset/cuddly-kids-love.md new file mode 100644 index 00000000..c694891d --- /dev/null +++ b/.changeset/cuddly-kids-love.md @@ -0,0 +1,5 @@ +--- +'@viamrobotics/svelte-sdk': minor +--- + +Add createResourceStream hook From 6724887310ea84d0701c05761fae5d35efeea4bc Mon Sep 17 00:00:00 2001 From: Devin C Date: Wed, 3 Sep 2025 14:38:22 -0400 Subject: [PATCH 6/6] remove sdk override --- package.json | 7 ++----- pnpm-lock.yaml | 55 ++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 51 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 785722cc..31e4eb74 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "@testing-library/svelte": "^5.2.8", "@viamrobotics/eslint-config": "^1.1.0", "@viamrobotics/prettier-config-svelte": "^1.1.0", - "@viamrobotics/sdk": "^0.45.0", + "@viamrobotics/sdk": "^0.49.1", "@viamrobotics/typescript-config": "^0.1.1", "eslint": "^9.30.0", "eslint-config-prettier": "^10.1.5", @@ -89,10 +89,7 @@ "pnpm": { "onlyBuiltDependencies": [ "esbuild" - ], - "overrides": { - "@viamrobotics/sdk": "link:../viam-typescript-sdk" - } + ] }, "packageManager": "pnpm@10.14.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c2aaf087..5eb79cd4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,16 +4,10 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - '@viamrobotics/sdk': link:../viam-typescript-sdk - importers: .: dependencies: - '@viamrobotics/sdk': - specifier: link:../viam-typescript-sdk - version: link:../viam-typescript-sdk runed: specifier: ^0.29.1 version: 0.29.2(svelte@5.25.10) @@ -63,6 +57,9 @@ importers: '@viamrobotics/prettier-config-svelte': specifier: ^1.1.0 version: 1.1.0(prettier@3.6.2)(svelte@5.25.10)(tailwindcss@4.1.11) + '@viamrobotics/sdk': + specifier: ^0.49.1 + version: 0.49.1 '@viamrobotics/typescript-config': specifier: ^0.1.1 version: 0.1.1(typescript@5.9.2) @@ -139,6 +136,9 @@ packages: resolution: {integrity: sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==} engines: {node: '>=6.9.0'} + '@bufbuild/protobuf@1.10.1': + resolution: {integrity: sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==} + '@changesets/apply-release-plan@7.0.12': resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} @@ -194,6 +194,17 @@ packages: '@changesets/write@0.4.0': resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} + '@connectrpc/connect-web@1.6.1': + resolution: {integrity: sha512-GVfxQOmt3TtgTaKeXLS/EA2IHa3nHxwe2BCHT7X0Q/0hohM+nP5DDnIItGEjGrGdt3LTTqWqE4s70N4h+qIMlQ==} + peerDependencies: + '@bufbuild/protobuf': ^1.10.0 + '@connectrpc/connect': 1.6.1 + + '@connectrpc/connect@1.6.1': + resolution: {integrity: sha512-KchMDNtU4CDTdkyf0qG7ugJ6qHTOR/aI7XebYn3OTCNagaDYWiZUVKgRgwH79yeMkpNgvEUaXSK7wKjaBK9b/Q==} + peerDependencies: + '@bufbuild/protobuf': ^1.10.0 + '@csstools/color-helpers@5.0.2': resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} engines: {node: '>=18'} @@ -928,6 +939,9 @@ packages: peerDependencies: prettier: '>=3 <4' + '@viamrobotics/sdk@0.49.1': + resolution: {integrity: sha512-0nkBLmqCVrYBCboO1VvHCkf5w10yGyE2kRPpBN70l3l3kl2UUvChwyQSau93AaAHvJ8HWrpIzgVFBj50N/6Gzg==} + '@viamrobotics/typescript-config@0.1.1': resolution: {integrity: sha512-cIbEOlldP4r+F3/nESoXz3zXtYGnJNhRwPWtDjLRwswDJkz2i+moKO1DE2pRib/Z3+B1Qo+TzLYkkzEZJxevcw==} peerDependencies: @@ -1055,6 +1069,9 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true + bsonfy@1.0.2: + resolution: {integrity: sha512-/kLM6B2x/CWXdkTu2kAv65trB4YruwahBpFDxYkkSunve6Rvx7KSoSHHe1f4jsPXPgXvDG393IjkQ3Us645Eag==} + builtin-modules@5.0.0: resolution: {integrity: sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==} engines: {node: '>=18.20'} @@ -1319,6 +1336,9 @@ packages: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} + exponential-backoff@3.1.2: + resolution: {integrity: sha512-8QxYTVXUkuy7fIIoitQkPwGonB8F3Zj8eEO8Sqg9Zv/bkI7RJAzowee4gr81Hak/dUTpA2Z7VfQgoijjPNlUZA==} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -2475,6 +2495,8 @@ snapshots: '@babel/runtime@7.28.2': {} + '@bufbuild/protobuf@1.10.1': {} + '@changesets/apply-release-plan@7.0.12': dependencies: '@changesets/config': 3.1.1 @@ -2617,6 +2639,15 @@ snapshots: human-id: 4.1.1 prettier: 2.8.8 + '@connectrpc/connect-web@1.6.1(@bufbuild/protobuf@1.10.1)(@connectrpc/connect@1.6.1(@bufbuild/protobuf@1.10.1))': + dependencies: + '@bufbuild/protobuf': 1.10.1 + '@connectrpc/connect': 1.6.1(@bufbuild/protobuf@1.10.1) + + '@connectrpc/connect@1.6.1(@bufbuild/protobuf@1.10.1)': + dependencies: + '@bufbuild/protobuf': 1.10.1 + '@csstools/color-helpers@5.0.2': {} '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': @@ -3315,6 +3346,14 @@ snapshots: dependencies: prettier: 3.6.2 + '@viamrobotics/sdk@0.49.1': + dependencies: + '@bufbuild/protobuf': 1.10.1 + '@connectrpc/connect': 1.6.1(@bufbuild/protobuf@1.10.1) + '@connectrpc/connect-web': 1.6.1(@bufbuild/protobuf@1.10.1)(@connectrpc/connect@1.6.1(@bufbuild/protobuf@1.10.1)) + bsonfy: 1.0.2 + exponential-backoff: 3.1.2 + '@viamrobotics/typescript-config@0.1.1(typescript@5.9.2)': dependencies: typescript: 5.9.2 @@ -3438,6 +3477,8 @@ snapshots: node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.2) + bsonfy@1.0.2: {} + builtin-modules@5.0.0: {} cac@6.7.14: {} @@ -3724,6 +3765,8 @@ snapshots: expect-type@1.2.2: {} + exponential-backoff@3.1.2: {} + extendable-error@0.1.7: {} external-editor@3.1.0: