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
70 lines (68 loc) • 1.78 kB
JavaScript
"use client"
import {
useStream
} from "./chunk-5WBUZJKJ.mjs";
// src/hooks/use-json-stream.tsx
import { useCallback, useRef, useState } from "react";
import ZodStream from "zod-stream";
function useJsonStream({
onReceive,
onEnd,
schema,
onBeforeStart,
onStop,
defaultData = {}
}) {
const streamClient = useRef(new ZodStream({}));
const stubbedValue = streamClient.current.getSchemaStub({ schema, defaultData });
const [json, setJson] = useState(stubbedValue);
const [loading, setLoading] = useState(false);
const { startStream: startStreamBase, stopStream: stopStreamBase } = useStream({
onBeforeStart,
onStop
});
const stopStream = useCallback(() => {
setLoading(false);
stopStreamBase();
}, [stopStreamBase]);
const startStream = useCallback(
async (streamProps) => {
setLoading(true);
try {
const extractionStream = await streamClient.current.create({
completionPromise: async () => await startStreamBase(streamProps),
response_model: { schema }
});
let final = {};
for await (const data of extractionStream) {
final = data;
onReceive && onReceive(data);
setJson(data);
}
setLoading(false);
onEnd && onEnd(final);
} catch (err) {
setLoading(false);
if (err?.name === "AbortError") {
console.warn("useJsonStream: aborted", err);
return null;
}
stopStream();
throw err;
} finally {
setLoading(false);
}
},
[onEnd, onReceive, schema, startStreamBase, stopStream]
);
return {
startStream,
stopStream,
loading,
data: json
};
}
export {
useJsonStream
};
//# sourceMappingURL=chunk-RU5LUW2Q.mjs.map