{"record":{"id":"8ee62608ad523a0c","repo":"clockworklabs/SpacetimeDB","slug":"could-not-find-spacetimedb-client-did-you-forget-8ee626","errorCode":null,"errorMessage":"Could not find SpacetimeDB client! Did you forget to call `createSpacetimeDBProvider`? `useTable` must be used in a Svelte component tree under a component that called `createSpacetimeDBProvider`.","messagePattern":"Could not find SpacetimeDB client! Did you forget to call `createSpacetimeDBProvider`\\? `useTable` must be used in a Svelte component tree under a component that called `createSpacetimeDBProvider`\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"crates/bindings-typescript/src/svelte/useTable.ts","lineNumber":63,"sourceCode":" *\n * @param query - A query builder expression (table reference or filtered query).\n * @param callbacks - Optional callbacks for row insert, delete, and update events.\n * @returns A tuple of [rows, isReady].\n */\nexport function useTable<TableDef extends UntypedTableDef>(\n  query: Query<TableDef>,\n  callbacks?: UseTableCallbacks<Prettify<RowType<TableDef>>>\n): [Readable<readonly Prettify<RowType<TableDef>>[]>, Readable<boolean>] {\n  type Row = RowType<TableDef>;\n  const accessorName = getQueryAccessorName(query);\n  const whereExpr = getQueryWhereClause(query);\n  const querySql = toSql(query);\n\n  let connectionStore;\n  try {\n    connectionStore = useSpacetimeDB();\n  } catch {\n    throw new Error(\n      'Could not find SpacetimeDB client! Did you forget to call ' +\n        '`createSpacetimeDBProvider`? `useTable` must be used in a Svelte component tree ' +\n        'under a component that called `createSpacetimeDBProvider`.'\n    );\n  }\n\n  const rows = writable<readonly Prettify<Row>[]>([]);\n  const isReady = writable(false);\n\n  let latestTransactionEvent: any = null;\n  let unsubscribeFromTable: (() => void) | null = null;\n  let subscriptionHandle: { unsubscribe: () => void } | null = null;\n\n  const computeFilteredRows = (): readonly Prettify<Row>[] => {\n    const state = get(connectionStore);\n    const connection = state.getConnection();\n    if (!connection) return [];\n","sourceCodeStart":45,"sourceCodeEnd":81,"githubUrl":"https://github.com/clockworklabs/SpacetimeDB/blob/6dee26c6efc2856793e12b148a59742964f5d783/crates/bindings-typescript/src/svelte/useTable.ts#L45-L81","documentation":"useTable in the Svelte bindings wraps useSpacetimeDB() in a try/catch and rethrows this message when the context store is missing. It fires under exactly the same conditions as the base hook: no ancestor called createSpacetimeDBProvider during component initialization, so there is no connection store to subscribe with.","triggerScenarios":"Calling useTable(tables.x) or useTable(tables.x.where(...)) in a Svelte component without an ancestor that called createSpacetimeDBProvider(builder); also when the hook runs outside synchronous component init (module scope, onMount, after an await), where getContext cannot find the key.","commonSituations":"Table-reading components used across routes while the provider exists on only one; refactor moved the provider call deeper into the tree; SvelteKit prerender or HMR paths mounting consumers without the layout that owns the provider.","solutions":["Create the provider once in the root layout component: `const db = createSpacetimeDBProvider(builder)`","Move any component calling useTable under that layout/component in the tree","Ensure no `await` separates component init from the createSpacetimeDBProvider call","For isolated tests, create the provider in the test harness component that wraps the component under test"],"exampleFix":"<!-- before -->\n<script lang=\"ts\">\n  const [rows, isReady] = useTable(tables.player); // throws\n</script>\n\n<!-- after: root +layout.svelte -->\n<script lang=\"ts\">\n  import { createSpacetimeDBProvider } from '@clockworklabs/spacetime-db-svelte';\n  const db = createSpacetimeDBProvider(builder);\n</script>\n<slot />\n\n<!-- any descendant may now call useTable safely -->","handlingStrategy":"validation","validationCode":"import { hasContext } from 'svelte';\nimport { SPACETIMEDB_CONTEXT_KEY } from './connection_state';\n\nexport const canUseTable = () => hasContext(SPACETIMEDB_CONTEXT_KEY);","typeGuard":null,"tryCatchPattern":"// In Svelte 5, wrap risky children in an error boundary snippet; otherwise guard with canUseTable() before calling useTable","preventionTips":["Create the provider once in +layout.svelte covering every route that reads tables","Add a canUseTable() assertion helper used by all table components during development","Keep table-reading components below the layout that owns the provider"],"tags":["svelte","usetable","context","provider","typescript"],"backgroundTag":"missing-context-provider","analyzedSha":"6dee26c6efc2856793e12b148a59742964f5d783","analyzedAt":"2026-08-20T06:08:37.179Z","contentChangedAt":"2026-08-20T06:08:37.179Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}