{"record":{"id":"5bb19a349821e6f3","repo":"sveltejs/kit","slug":"live-query-completed-before-yielding-a-value","errorCode":null,"errorMessage":"Live query completed before yielding a value","messagePattern":"Live query completed before yielding a value","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"packages/kit/src/runtime/client/remote-functions/query-live/instance.svelte.js","lineNumber":148,"sourceCode":"\n\t\t\tthis.#interrupt = () => {\n\t\t\t\tcontroller.abort();\n\t\t\t\treturn stopped;\n\t\t\t};\n\n\t\t\tconst generator = create_live_iterator(this.#id, this.#payload, controller, () => {\n\t\t\t\tthis.#connected = true;\n\t\t\t\tthis.#attempt = 0;\n\t\t\t\tconnected = true;\n\t\t\t\ton_connect();\n\t\t\t});\n\n\t\t\ttry {\n\t\t\t\tconst { done, value } = await generator.next();\n\n\t\t\t\tif (done) {\n\t\t\t\t\tif (!this.#ready) {\n\t\t\t\t\t\tthrow new Error('Live query completed before yielding a value');\n\t\t\t\t\t}\n\t\t\t\t\t// stream completed without yielding (e.g. the generator returned\n\t\t\t\t\t// immediately on reconnect) — keep the last good value\n\t\t\t\t\tthis.#done = true;\n\t\t\t\t\tthis.#fan_out.done();\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tthis.set(value);\n\n\t\t\t\tfor await (const value of generator) {\n\t\t\t\t\tthis.set(value);\n\t\t\t\t}\n\n\t\t\t\tthis.#done = true;\n\t\t\t\tthis.#fan_out.done();\n\t\t\t} catch (error) {\n\t\t\t\tif (controller.signal.aborted) break;","sourceCodeStart":130,"sourceCodeEnd":166,"githubUrl":"https://github.com/sveltejs/kit/blob/03f1687fe612ce3d2d9131139b5b188d9cf90c64/packages/kit/src/runtime/client/remote-functions/query-live/instance.svelte.js#L130-L166","documentation":"A query.live generator must yield at least one value before completing. If the server-side async generator returns (done: true) before the client has received its first value and the query was never ready, SvelteKit throws because there is no value to expose to consumers.","triggerScenarios":"A live query's server generator returns immediately (e.g. an early return, an unhandled condition, or a reconnect handler that returns without yielding) so the client's generator.next() resolves done while #ready is still false.","commonSituations":"Server generator whose first statement is a conditional return; generator that only yields after an event that never fires; reconnect logic that returns early when no data has changed yet; abrupt completion due to an error swallowed upstream.","solutions":["Ensure the server generator always yields an initial value before any early return","Check the generator body for early returns/throws before the first yield","Wrap generator logic so reconnects still yield the current value","Log server-side to confirm the generator body actually runs"],"exampleFix":"// before\nexport async function *live() {\n  if (!ready) return; // completes without yielding\n  yield getData();\n}\n// after\nexport async function *live() {\n  yield getData(); // always yield at least once\n  while (ready) {\n    await changes.next();\n    yield getData();\n  }\n}","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  await liveQuery.current;\n} catch (e) {\n  if (e.message === 'Live query completed before yielding a value') {\n    // fall back to a regular query or show empty state\n  } else throw e;\n}","preventionTips":["Always yield an initial value in live query generators","Avoid early returns before the first yield","Test reconnect paths to ensure a value is yielded"],"tags":["query-live","streaming","async-generator","client"],"backgroundTag":"live-query-completed-without-value","analyzedSha":"03f1687fe612ce3d2d9131139b5b188d9cf90c64","analyzedAt":"2026-09-02T02:01:50.504Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-09T06:17:21.866Z"}