@speechmatics/real-time-client-react
Version:
React hooks for interacting with the Speechmatics Real-Time API
64 lines (61 loc) • 1.95 kB
JavaScript
;
"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