UNPKG

@speechmatics/real-time-client-react

Version:

React hooks for interacting with the Speechmatics Real-Time API

64 lines (61 loc) 1.95 kB
"use strict"; "use client"; import { jsx } from 'react/jsx-runtime'; import { RealtimeClient } from '@speechmatics/real-time-client'; import { useMemo, useEffect, useState, useSyncExternalStore } from 'react'; import { RealtimeContext } from './real-time-context.js'; import { useClientEventListener } from './use-real-time-event-listener.js'; function RealtimeTranscriptionProvider({ children, ...options }) { const client = useMemo(() => { return new RealtimeClient({ url: options.url, appId: options.appId, enableLegacy: options.enableLegacy }); }, [options.url, options.appId, options.enableLegacy]); useEffect(() => { return () => { if (client.socketState && client.socketState !== "closed") { client.stopRecognition(); } }; }, [client]); const socketState = useClientSocketState(client); const [sessionId, setSessionId] = useState(); useClientEventListener(client, "receiveMessage", ({ data }) => { if (data.message === "Error") { console.error(data); } else if (data.message === "RecognitionStarted") { setSessionId(data.id); } }); useClientEventListener(client, "socketStateChange", (e) => { if (client.socketState === "closed") { setSessionId(void 0); } }); const value = useMemo( () => ({ client, socketState, sessionId }), [client, socketState, sessionId] ); return /* @__PURE__ */ jsx(RealtimeContext.Provider, { value, children }); } function useClientSocketState(client) { const subscribe = (onChange) => { client.addEventListener("socketStateChange", onChange); return () => { client.removeEventListener("socketStateChange", onChange); }; }; const getSnapshot = () => client.socketState; return useSyncExternalStore(subscribe, getSnapshot, getSnapshot); } export { RealtimeTranscriptionProvider }; //# sourceMappingURL=real-time-transcription-provider.js.map