stream-hooks
Version:
<div align="center"> <a aria-label="NPM version" href="https://twitter.com/dimitrikennedy"> <img alt="stream-hooks" src="https://img.shields.io/twitter/follow/dimitrikennedy?style=social&labelColor=000000"> </a> <a aria-label="GH Issues" href="h
1 lines • 4.5 kB
Source Map (JSON)
{"version":3,"sources":["../src/hooks/use-json-stream.tsx"],"sourcesContent":["import { useCallback, useRef, useState } from \"react\"\nimport type { StartStream, StartStreamArgs, StopStream, UseJsonStreamProps } from \"@/types\"\nimport z from \"zod\"\nimport ZodStream from \"zod-stream\"\n\nimport { useStream } from \"./use-stream\"\n\n/**\n * `useJsonStream` is a custom React hook that extends the `useStream` hook to add JSON parsing functionality.\n * It uses the `SchemaStream` to parse the incoming stream into JSON.\n *\n * @param {UseJsonStreamProps} props - The props for the hook include optional callback\n * functions that will be invoked at different stages of the stream lifecycle, and a schema for the JSON data.\n *\n * @returns {\n * startStream: StartStream,\n * stopStream: StopStream,\n * data: Partial<z.infer<T>>,\n * loading: boolean\n * }\n *\n * @example\n * ```\n * const {\n * loading,\n * startStream,\n * stopStream,\n * } = useJsonStream({ onBeforeStart: ..., onReceive: ..., onStop: ..., schema: ... });\n * ```\n */\n\nexport function useJsonStream<T extends z.AnyZodObject>({\n onReceive,\n onEnd,\n schema,\n onBeforeStart,\n onStop,\n defaultData = {}\n}: UseJsonStreamProps<T>): {\n startStream: StartStream\n stopStream: StopStream\n data: Partial<z.infer<T>>\n loading: boolean\n} {\n const streamClient = useRef(new ZodStream({}))\n const stubbedValue = streamClient.current.getSchemaStub({ schema, defaultData })\n\n const [json, setJson] = useState<Partial<z.infer<T>>>(stubbedValue)\n const [loading, setLoading] = useState(false)\n const { startStream: startStreamBase, stopStream: stopStreamBase } = useStream({\n onBeforeStart,\n onStop\n })\n\n /**\n * @function stopStream\n * Stops the stream by aborting the fetch request.\n *\n * @example\n * ```\n * stopStream();\n * ```\n */\n const stopStream = useCallback(() => {\n setLoading(false)\n stopStreamBase()\n }, [stopStreamBase])\n\n /**\n * @function startStream\n * Starts a stream with the provided arguments and parses the incoming stream into JSON.\n *\n * @param {StartStreamArgs} args - The arguments for starting the stream, including the URL and optional body.\n *\n * @example\n * ```\n * startStream();\n * ```\n */\n const startStream = useCallback(\n async (streamProps: StartStreamArgs) => {\n setLoading(true)\n\n try {\n const extractionStream = await streamClient.current.create({\n completionPromise: async () => await startStreamBase(streamProps),\n response_model: { schema }\n })\n\n let final: z.infer<T> = {}\n for await (const data of extractionStream) {\n final = data\n onReceive && onReceive(data)\n setJson(data)\n }\n\n setLoading(false)\n onEnd && onEnd(final)\n } catch (err: any) {\n setLoading(false)\n\n if (err?.name === \"AbortError\") {\n console.warn(\"useJsonStream: aborted\", err)\n\n return null\n }\n\n stopStream()\n throw err\n } finally {\n setLoading(false)\n }\n },\n [onEnd, onReceive, schema, startStreamBase, stopStream]\n )\n\n return {\n startStream,\n stopStream,\n loading,\n data: json\n }\n}\n"],"mappings":";;;;;;AAAA,SAAS,aAAa,QAAQ,gBAAgB;AAG9C,OAAO,eAAe;AA4Bf,SAAS,cAAwC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,cAAc,CAAC;AACjB,GAKE;AACA,QAAM,eAAe,OAAO,IAAI,UAAU,CAAC,CAAC,CAAC;AAC7C,QAAM,eAAe,aAAa,QAAQ,cAAc,EAAE,QAAQ,YAAY,CAAC;AAE/E,QAAM,CAAC,MAAM,OAAO,IAAI,SAA8B,YAAY;AAClE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C,QAAM,EAAE,aAAa,iBAAiB,YAAY,eAAe,IAAI,UAAU;AAAA,IAC7E;AAAA,IACA;AAAA,EACF,CAAC;AAWD,QAAM,aAAa,YAAY,MAAM;AACnC,eAAW,KAAK;AAChB,mBAAe;AAAA,EACjB,GAAG,CAAC,cAAc,CAAC;AAanB,QAAM,cAAc;AAAA,IAClB,OAAO,gBAAiC;AACtC,iBAAW,IAAI;AAEf,UAAI;AACF,cAAM,mBAAmB,MAAM,aAAa,QAAQ,OAAO;AAAA,UACzD,mBAAmB,YAAY,MAAM,gBAAgB,WAAW;AAAA,UAChE,gBAAgB,EAAE,OAAO;AAAA,QAC3B,CAAC;AAED,YAAI,QAAoB,CAAC;AACzB,yBAAiB,QAAQ,kBAAkB;AACzC,kBAAQ;AACR,uBAAa,UAAU,IAAI;AAC3B,kBAAQ,IAAI;AAAA,QACd;AAEA,mBAAW,KAAK;AAChB,iBAAS,MAAM,KAAK;AAAA,MACtB,SAAS,KAAU;AACjB,mBAAW,KAAK;AAEhB,YAAI,KAAK,SAAS,cAAc;AAC9B,kBAAQ,KAAK,0BAA0B,GAAG;AAE1C,iBAAO;AAAA,QACT;AAEA,mBAAW;AACX,cAAM;AAAA,MACR,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,OAAO,WAAW,QAAQ,iBAAiB,UAAU;AAAA,EACxD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,EACR;AACF;","names":[]}