@speechmatics/real-time-client-react
Version:
React hooks for interacting with the Speechmatics Real-Time API
1 lines • 8.25 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/real-time-context.ts","../src/use-real-time-transcription.ts","../src/use-real-time-event-listener.ts","../src/real-time-transcription-provider.tsx"],"sourcesContent":["'use client';\nimport type { RealtimeClient } from '@speechmatics/real-time-client';\nimport { createContext } from 'react';\n\nexport type IRealtimeClientContext = {\n client: RealtimeClient;\n socketState: RealtimeClient['socketState'];\n sessionId?: string;\n};\nexport const RealtimeContext = createContext<IRealtimeClientContext | null>(\n null,\n);\n","import { useCallback, useContext, useMemo } from 'react';\nimport { RealtimeContext } from './real-time-context';\nimport type { RealtimeClient } from '@speechmatics/real-time-client';\n\nexport function useRealtimeTranscription() {\n const context = useContext(RealtimeContext);\n\n if (context === null) {\n throw new Error('Flow client uninitialized in context');\n }\n\n const { client, sessionId, socketState } = context;\n\n const startTranscription = useCallback<RealtimeClient['start']>(\n (jwt, config) => {\n return client.start(jwt, config);\n },\n [client],\n );\n\n const stopTranscription = useCallback<\n RealtimeClient['stopRecognition']\n >(() => {\n return client.stopRecognition();\n }, [client]);\n\n const sendAudio = useCallback<RealtimeClient['sendAudio']>(\n (audio: ArrayBuffer) => {\n client.sendAudio(audio);\n },\n [client],\n );\n\n return useMemo(\n () => ({\n sessionId,\n socketState,\n startTranscription,\n stopTranscription,\n sendAudio,\n }),\n [sessionId, socketState, startTranscription, stopTranscription, sendAudio],\n );\n}\n","'use client';\nimport type {\n RealtimeClient,\n RealtimeClientEventMap,\n} from '@speechmatics/real-time-client';\nimport { useContext, useEffect } from 'react';\nimport type { TypedEventListenerOrEventListenerObject } from 'typescript-event-target';\nimport { RealtimeContext } from './real-time-context';\n\nexport function useRealtimeEventListener<\n E extends keyof RealtimeClientEventMap,\n>(\n message: E,\n cb: TypedEventListenerOrEventListenerObject<RealtimeClientEventMap, E>,\n) {\n const context = useContext(RealtimeContext);\n if (context === null) {\n throw new Error('Flow client uninitialized in context');\n }\n\n return useClientEventListener(context.client, message, cb);\n}\n\nexport function useClientEventListener<K extends keyof RealtimeClientEventMap>(\n client: RealtimeClient,\n eventType: K,\n cb: TypedEventListenerOrEventListenerObject<RealtimeClientEventMap, K>,\n) {\n return useEffect(() => {\n client.addEventListener(eventType, cb);\n return () => client?.removeEventListener(eventType, cb);\n }, [client, eventType, cb]);\n}\n","'use client';\n\nimport { RealtimeClient } from '@speechmatics/real-time-client';\nimport { useEffect, useMemo, useState, useSyncExternalStore } from 'react';\nimport { RealtimeContext } from './real-time-context';\nimport { useClientEventListener } from './use-real-time-event-listener';\n\nexport function RealtimeTranscriptionProvider({\n children,\n ...options\n}: React.PropsWithChildren<ConstructorParameters<typeof RealtimeClient>[0]>) {\n const client = useMemo(() => {\n return new RealtimeClient({\n url: options.url,\n appId: options.appId,\n enableLegacy: options.enableLegacy,\n });\n }, [options.url, options.appId, options.enableLegacy]);\n\n // Clean up on unmount (or if the client somehow changes)\n useEffect(() => {\n return () => {\n if (client.socketState && client.socketState !== 'closed') {\n client.stopRecognition();\n }\n };\n }, [client]);\n\n const socketState = useClientSocketState(client);\n const [sessionId, setSessionId] = useState<string>();\n\n useClientEventListener(client, 'receiveMessage', ({ data }) => {\n if (data.message === 'Error') {\n console.error(data);\n } else if (data.message === 'RecognitionStarted') {\n setSessionId(data.id);\n }\n });\n\n useClientEventListener(client, 'socketStateChange', (e) => {\n if (client.socketState === 'closed') {\n setSessionId(undefined);\n }\n });\n\n const value = useMemo(\n () => ({\n client,\n socketState,\n sessionId,\n }),\n [client, socketState, sessionId],\n );\n\n return (\n <RealtimeContext.Provider value={value}>\n {children}\n </RealtimeContext.Provider>\n );\n}\n\nfunction useClientSocketState(client: RealtimeClient) {\n const subscribe = (onChange: () => void) => {\n client.addEventListener('socketStateChange', onChange);\n return () => {\n client.removeEventListener('socketStateChange', onChange);\n };\n };\n\n const getSnapshot = () => client.socketState;\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n"],"names":["createContext","useContext","useCallback","useMemo","useEffect","RealtimeClient","useState","jsx","useSyncExternalStore"],"mappings":"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"}