{"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('Realtime 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  const setRecognitionConfig = useCallback<\n    RealtimeClient['setRecognitionConfig']\n  >(\n    (config) => {\n      client.setRecognitionConfig(config);\n    },\n    [client],\n  );\n\n  const getSpeakers = useCallback<RealtimeClient['getSpeakers']>(\n    (options?: { final?: boolean; timeout?: number }) => {\n      return client.getSpeakers(options);\n    },\n    [client],\n  );\n\n  return useMemo(\n    () => ({\n      sessionId,\n      socketState,\n      startTranscription,\n      stopTranscription,\n      sendAudio,\n      setRecognitionConfig,\n      getSpeakers,\n    }),\n    [\n      sessionId,\n      socketState,\n      startTranscription,\n      stopTranscription,\n      sendAudio,\n      setRecognitionConfig,\n      getSpeakers,\n    ],\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('Realtime 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\ntype Options = ConstructorParameters<typeof RealtimeClient>[0];\n\nexport function RealtimeTranscriptionProvider({\n  children,\n  ...options\n}: React.PropsWithChildren<Options>) {\n  const client = useMemo(() => {\n    return new RealtimeClient({\n      url: options.url,\n      appId: options.appId,\n      enableLegacy: options.enableLegacy,\n      connectionTimeout: options.connectionTimeout,\n    });\n  }, [\n    options.url,\n    options.appId,\n    options.enableLegacy,\n    options.connectionTimeout,\n  ]);\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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"}