@speechmatics/flow-client-react
Version:
React hooks for interacting with the Speechmatics Flow API
1 lines • 7.66 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../src/flow-context.ts","../src/use-flow.ts","../src/use-flow-event-listener.ts","../src/flow-provider.tsx"],"sourcesContent":["'use client';\nimport type { FlowClient } from '@speechmatics/flow-client';\nimport { createContext } from 'react';\n\nexport type IFlowClientContext = {\n client: FlowClient;\n socketState: FlowClient['socketState'];\n sessionId?: string;\n};\nexport const FlowContext = createContext<IFlowClientContext | null>(null);\n","import type { StartConversationMessage } from '@speechmatics/flow-client';\nimport { useCallback, useContext, useMemo } from 'react';\nimport { FlowContext } from './flow-context';\n\nexport function useFlow() {\n const context = useContext(FlowContext);\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 startConversation = useCallback(\n (\n jwt: string,\n {\n config,\n audioFormat,\n }: {\n config: StartConversationMessage['conversation_config'];\n audioFormat?: StartConversationMessage['audio_format'];\n },\n ) => client.startConversation(jwt, { config, audioFormat }),\n [client],\n );\n\n const endConversation = useCallback(() => client.endConversation(), [client]);\n\n const sendAudio = useCallback(\n (pcm16Data: ArrayBufferLike) => client.sendAudio(pcm16Data),\n [client],\n );\n\n return useMemo(\n () => ({\n startConversation,\n endConversation,\n sendAudio,\n socketState,\n sessionId,\n }),\n [startConversation, endConversation, sendAudio, socketState, sessionId],\n );\n}\n","'use client';\nimport type { FlowClient, FlowClientEventMap } from '@speechmatics/flow-client';\nimport { useContext, useEffect } from 'react';\nimport type { TypedEventListenerOrEventListenerObject } from 'typescript-event-target';\nimport { FlowContext } from './flow-context';\n\nexport function useFlowEventListener<E extends keyof FlowClientEventMap>(\n message: E,\n cb: TypedEventListenerOrEventListenerObject<FlowClientEventMap, E>,\n) {\n const context = useContext(FlowContext);\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 FlowClientEventMap>(\n client: FlowClient,\n eventType: K,\n cb: TypedEventListenerOrEventListenerObject<FlowClientEventMap, 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 { FlowClient, type FlowClientOptions } from '@speechmatics/flow-client';\nimport { useMemo, useState, useSyncExternalStore } from 'react';\nimport { FlowContext } from './flow-context';\nimport { useClientEventListener } from './use-flow-event-listener';\n\nexport function FlowProvider({\n server,\n children,\n ...options\n}: React.PropsWithChildren<\n {\n server?: string;\n } & FlowClientOptions\n>) {\n const [client] = useState(() => {\n return new FlowClient(server ?? 'wss://flow.api.speechmatics.com', options);\n });\n\n const socketState = useClientSocketState(client);\n const [sessionId, setSessionId] = useState<string>();\n\n useClientEventListener(client, 'message', ({ data }) => {\n if (data.message === 'Error') {\n console.error(data);\n } else if (data.message === 'ConversationStarted') {\n setSessionId(data.asr_session_id);\n }\n });\n\n useClientEventListener(client, 'socketClose', () => {\n setSessionId(undefined);\n });\n\n const value = useMemo(\n () => ({\n client,\n socketState,\n sessionId,\n }),\n [client, socketState, sessionId],\n );\n\n return <FlowContext.Provider value={value}>{children}</FlowContext.Provider>;\n}\n\nconst SOCKET_EVENTS = [\n 'socketInitialized',\n 'socketOpen',\n 'socketClosing',\n 'socketClose',\n 'socketError',\n] as const;\n\nfunction useClientSocketState(client: FlowClient) {\n const subscribe = (onChange: () => void) => {\n for (const e of SOCKET_EVENTS) {\n client.addEventListener(e, onChange);\n }\n return () => {\n for (const e of SOCKET_EVENTS) {\n client.removeEventListener(e, onChange);\n }\n };\n };\n\n const getSnapshot = () => client.socketState;\n return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n}\n"],"names":["createContext","useContext","useCallback","useMemo","useEffect","useState","FlowClient","jsx","useSyncExternalStore"],"mappings":"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"}