{"version":3,"file":"hooks-CA4A5LBF.mjs","sources":["../src/hooks/internal/useResizeObserver.ts","../src/hooks/internal/useObservableState.ts","../src/hooks/internal/useMediaQuery.ts","../src/hooks/useAudioPlayback.ts","../src/hooks/useClearPinButton.ts","../src/hooks/useConnectionQualityIndicator.ts","../src/hooks/useConnectionStatus.ts","../src/hooks/useDataChannel.ts","../src/hooks/useDisconnectButton.ts","../src/hooks/useFacingMode.ts","../src/hooks/useFocusToggle.ts","../src/hooks/useGridLayout.ts","../src/hooks/useIsMuted.ts","../src/hooks/useIsSpeaking.ts","../src/hooks/useLocalParticipant.ts","../src/hooks/useLocalParticipantPermissions.ts","../src/hooks/useMediaDeviceSelect.ts","../src/hooks/useMediaDevices.ts","../src/hooks/useVisualStableUpdate.ts","../src/hooks/usePagination.ts","../src/hooks/useParticipantInfo.ts","../src/hooks/useParticipantPermissions.ts","../src/hooks/useParticipantTile.ts","../src/hooks/useRemoteParticipants.ts","../src/hooks/useParticipants.ts","../src/hooks/usePinnedTracks.ts","../src/hooks/useRemoteParticipant.ts","../src/hooks/useRoomInfo.ts","../src/hooks/useSpeakingParticipants.ts","../src/hooks/useSortedParticipants.ts","../src/hooks/useStartAudio.ts","../src/hooks/useStartVideo.ts","../src/hooks/useSwipe.ts","../src/hooks/useChatToggle.ts","../src/hooks/useToken.ts","../src/hooks/useTrackMutedIndicator.ts","../src/hooks/useTrackToggle.ts","../src/hooks/useTracks.ts","../src/hooks/useTrackRefBySourceOrName.ts","../src/hooks/useTrackByName.ts","../src/hooks/useChat.ts","../src/hooks/usePersistentUserChoices.ts","../src/hooks/useIsEncrypted.ts","../src/hooks/useTrackVolume.ts","../src/hooks/useParticipantTracks.ts","../src/hooks/useTrackSyncTime.ts","../src/hooks/useTrackTranscription.ts","../src/hooks/useParticipantAttributes.ts","../src/hooks/useVoiceAssistant.ts","../src/hooks/useIsRecording.ts","../src/hooks/useTextStream.ts","../src/hooks/useTranscriptions.ts","../src/hooks/useSequentialRoomConnectDisconnect.ts","../../../node_modules/.pnpm/events@3.3.0/node_modules/events/events.js","../src/hooks/useAgent.ts","../src/hooks/useSession.ts","../src/hooks/useEvents.ts","../src/hooks/useSessionMessages.ts","../src/hooks/useRpc.ts"],"sourcesContent":["/* eslint-disable no-return-assign */\n/* eslint-disable no-underscore-dangle */\nimport * as React from 'react';\n\nconst useLatest = <T>(current: T) => {\n  const storedValue = React.useRef(current);\n  React.useEffect(() => {\n    storedValue.current = current;\n  });\n  return storedValue;\n};\n\n/**\n * A React hook that fires a callback whenever ResizeObserver detects a change to its size\n * code extracted from https://github.com/jaredLunde/react-hook/blob/master/packages/resize-observer/src/index.tsx in order to not include the polyfill for resize-observer\n *\n * @internal\n */\nexport function useResizeObserver<T extends HTMLElement>(\n  target: React.RefObject<T>,\n  callback: UseResizeObserverCallback,\n) {\n  const resizeObserver = getResizeObserver();\n  const storedCallback = useLatest(callback);\n\n  React.useLayoutEffect(() => {\n    let didUnsubscribe = false;\n\n    const targetEl = target.current;\n    if (!targetEl) return;\n\n    function cb(entry: ResizeObserverEntry, observer: ResizeObserver) {\n      if (didUnsubscribe) return;\n      storedCallback.current(entry, observer);\n    }\n\n    resizeObserver?.subscribe(targetEl as HTMLElement, cb);\n\n    return () => {\n      didUnsubscribe = true;\n      resizeObserver?.unsubscribe(targetEl as HTMLElement, cb);\n    };\n  }, [target.current, resizeObserver, storedCallback]);\n\n  return resizeObserver?.observer;\n}\n\nfunction createResizeObserver() {\n  let ticking = false;\n  let allEntries: ResizeObserverEntry[] = [];\n\n  const callbacks: Map<unknown, Array<UseResizeObserverCallback>> = new Map();\n\n  if (typeof window === 'undefined') {\n    return;\n  }\n\n  const observer = new ResizeObserver((entries: ResizeObserverEntry[], obs: ResizeObserver) => {\n    allEntries = allEntries.concat(entries);\n    if (!ticking) {\n      window.requestAnimationFrame(() => {\n        const triggered = new Set<Element>();\n        for (let i = 0; i < allEntries.length; i++) {\n          if (triggered.has(allEntries[i].target)) continue;\n          triggered.add(allEntries[i].target);\n          const cbs = callbacks.get(allEntries[i].target);\n          cbs?.forEach((cb) => cb(allEntries[i], obs));\n        }\n        allEntries = [];\n        ticking = false;\n      });\n    }\n    ticking = true;\n  });\n\n  return {\n    observer,\n    subscribe(target: HTMLElement, callback: UseResizeObserverCallback) {\n      observer.observe(target);\n      const cbs = callbacks.get(target) ?? [];\n      cbs.push(callback);\n      callbacks.set(target, cbs);\n    },\n    unsubscribe(target: HTMLElement, callback: UseResizeObserverCallback) {\n      const cbs = callbacks.get(target) ?? [];\n      if (cbs.length === 1) {\n        observer.unobserve(target);\n        callbacks.delete(target);\n        return;\n      }\n      const cbIndex = cbs.indexOf(callback);\n      if (cbIndex !== -1) cbs.splice(cbIndex, 1);\n      callbacks.set(target, cbs);\n    },\n  };\n}\n\nlet _resizeObserver: ReturnType<typeof createResizeObserver>;\n\nconst getResizeObserver = () =>\n  !_resizeObserver ? (_resizeObserver = createResizeObserver()) : _resizeObserver;\n\nexport type UseResizeObserverCallback = (\n  entry: ResizeObserverEntry,\n  observer: ResizeObserver,\n) => unknown;\n\nexport const useSize = (target: React.RefObject<HTMLDivElement>) => {\n  const [size, setSize] = React.useState({ width: 0, height: 0 });\n  React.useLayoutEffect(() => {\n    if (target.current) {\n      const { width, height } = target.current.getBoundingClientRect();\n      setSize({ width, height });\n    }\n  }, [target.current]);\n\n  const resizeCallback = React.useCallback(\n    (entry: ResizeObserverEntry) => setSize(entry.contentRect),\n    [],\n  );\n  // Where the magic happens\n  useResizeObserver(target, resizeCallback);\n  return size;\n};\n","import * as React from 'react';\n// @ts-ignore\nimport type { Observable } from 'rxjs';\n\n/**\n * @internal\n */\nexport function useObservableState<T>(\n  observable: Observable<T> | undefined,\n  startWith: T,\n  resetWhenObservableChanges = true,\n) {\n  const [state, setState] = React.useState<T>(startWith);\n  React.useEffect(() => {\n    if (resetWhenObservableChanges) {\n      setState(startWith);\n    }\n    // observable state doesn't run in SSR\n    if (typeof window === 'undefined' || !observable) return;\n    const subscription = observable.subscribe(setState);\n    return () => subscription.unsubscribe();\n  }, [observable, resetWhenObservableChanges]);\n  return state;\n}\n","import * as React from 'react';\n/**\n * Implementation used from https://github.com/juliencrn/usehooks-ts\n *\n * @internal\n */\nexport function useMediaQuery(query: string): boolean {\n  const getMatches = (query: string): boolean => {\n    // Prevents SSR issues\n    if (typeof window !== 'undefined') {\n      return window.matchMedia(query).matches;\n    }\n    return false;\n  };\n\n  const [matches, setMatches] = React.useState<boolean>(getMatches(query));\n\n  function handleChange() {\n    setMatches(getMatches(query));\n  }\n\n  React.useEffect(() => {\n    const matchMedia = window.matchMedia(query);\n\n    // Triggered at the first client-side load and if query changes\n    handleChange();\n\n    // Listen matchMedia\n    if (matchMedia.addListener) {\n      matchMedia.addListener(handleChange);\n    } else {\n      matchMedia.addEventListener('change', handleChange);\n    }\n\n    return () => {\n      if (matchMedia.removeListener) {\n        matchMedia.removeListener(handleChange);\n      } else {\n        matchMedia.removeEventListener('change', handleChange);\n      }\n    };\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [query]);\n\n  return matches;\n}\n","import type { Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useObservableState } from './internal';\nimport { roomAudioPlaybackAllowedObservable } from '@livekit/components-core';\nimport { useEnsureRoom } from '../context';\n\n/**\n * In many browsers to start audio playback, the user must perform a user-initiated event such as clicking a button.\n * The `useAudioPlayback` hook returns an object with a boolean `canPlayAudio` flag that indicates whether audio\n * playback is allowed in the current context, as well as a `startAudio` function that can be called in a button\n * `onClick` callback to start audio playback in the current context.\n *\n * @see Autoplay policy on MDN web docs for more info: {@link https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Best_practices#autoplay_policy}\n * @alpha\n */\nexport function useAudioPlayback(room?: Room): {\n  canPlayAudio: boolean;\n  startAudio: () => Promise<void>;\n} {\n  const roomEnsured = useEnsureRoom(room);\n  const startAudio = React.useCallback(async () => {\n    await roomEnsured.startAudio();\n  }, [roomEnsured]);\n\n  const observable = React.useMemo(\n    () => roomAudioPlaybackAllowedObservable(roomEnsured),\n    [roomEnsured],\n  );\n  const { canPlayAudio } = useObservableState(observable, {\n    canPlayAudio: roomEnsured.canPlaybackAudio,\n  });\n\n  return { canPlayAudio, startAudio };\n}\n","import { setupClearPinButton } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport type { ClearPinButtonProps } from '../components';\n\n/**\n * The `useClearPinButton` hook provides props for the {@link ClearPinButton}\n * or your custom implementation of it component. It adds the `onClick` handler\n * to signal the `LayoutContext` that the tile in focus should be cleared.\n * @public\n */\nexport function useClearPinButton(props: ClearPinButtonProps) {\n  const { state, dispatch } = useLayoutContext().pin;\n\n  const buttonProps = React.useMemo(() => {\n    const { className } = setupClearPinButton();\n    const mergedProps = mergeProps(props, {\n      className,\n      disabled: !state?.length,\n      onClick: () => {\n        if (dispatch) dispatch({ msg: 'clear_pin' });\n      },\n    });\n    return mergedProps;\n  }, [props, dispatch, state]);\n\n  return { buttonProps };\n}\n","import { setupConnectionQualityIndicator } from '@livekit/components-core';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureParticipant } from '../context';\nimport { useObservableState } from './internal';\n\n/** @public */\nexport interface ConnectionQualityIndicatorOptions {\n  participant?: Participant;\n}\n\n/**\n * The `useConnectionQualityIndicator` hook provides props for the `ConnectionQualityIndicator` or your custom implementation of it component.\n * @example\n * ```tsx\n * const { quality } = useConnectionQualityIndicator();\n * // or\n * const { quality } = useConnectionQualityIndicator({ participant });\n * ```\n * @public\n */\nexport function useConnectionQualityIndicator(options: ConnectionQualityIndicatorOptions = {}) {\n  const p = useEnsureParticipant(options.participant);\n\n  const { className, connectionQualityObserver } = React.useMemo(\n    () => setupConnectionQualityIndicator(p),\n    [p],\n  );\n\n  const quality = useObservableState(connectionQualityObserver, p.connectionQuality);\n\n  return { className, quality };\n}\n","import { connectionStateObserver } from '@livekit/components-core';\nimport type { Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useConnectionState` hook allows you to simply implement your own `ConnectionState` component.\n *\n * @example\n * ```tsx\n * const connectionState = useConnectionState(room);\n * ```\n * @public\n */\nexport function useConnectionState(room?: Room) {\n  // passed room takes precedence, if not supplied get current room context\n  const r = useEnsureRoom(room);\n  const observable = React.useMemo(() => connectionStateObserver(r), [r]);\n  const connectionState = useObservableState(observable, r.state);\n  return connectionState;\n}\n","import type { ReceivedDataMessage } from '@livekit/components-core';\nimport { setupDataMessageHandler } from '@livekit/components-core';\nimport * as React from 'react';\nimport type { DataPublishOptions } from 'livekit-client';\nimport { useRoomContext } from '../context';\nimport { useObservableState } from './internal';\n\ntype UseDataChannelReturnType<T extends string | undefined = undefined> = {\n  isSending: boolean;\n  send: (payload: Uint8Array, options: DataPublishOptions) => Promise<void>;\n  message: ReceivedDataMessage<T> | undefined;\n};\n\n/**\n * The `useDataChannel` hook returns the ability to send and receive messages.\n * Pass an optional `topic` to narrow down which messages are returned in the messages array.\n *\n * @remarks\n * There is only one data channel. Passing a `topic` does not open a new data channel.\n * It is only used to filter out messages with no or a different `topic`.\n *\n * @example\n * ```tsx\n * // Send messages to all participants via the 'chat' topic.\n * const { message: latestMessage, send } = useDataChannel('chat', (msg) => console.log(\"message received\", msg));\n * ```\n *\n * @example\n * ```tsx\n * // Receive all messages (no topic filtering)\n * const { message: latestMessage, send } = useDataChannel((msg) => console.log(\"message received\", msg));\n * ```\n *\n * @public\n */\nexport function useDataChannel<T extends string>(\n  topic: T,\n  onMessage?: (msg: ReceivedDataMessage<T>) => void,\n): UseDataChannelReturnType<T>;\n\n/**\n * Overload for `useDataChannel` without a topic. See {@link (useDataChannel:1)} for information and usage examples.\n *\n * @public\n */\nexport function useDataChannel(\n  onMessage?: (msg: ReceivedDataMessage) => void,\n): UseDataChannelReturnType;\n/**\n * @internal\n */\nexport function useDataChannel<T extends string>(\n  topicOrCallback?: T | ((msg: ReceivedDataMessage) => void),\n  callback?: (msg: ReceivedDataMessage<T>) => void,\n) {\n  const onMessage = typeof topicOrCallback === 'function' ? topicOrCallback : callback;\n\n  const topic = typeof topicOrCallback === 'string' ? topicOrCallback : undefined;\n  const room = useRoomContext();\n  const { send, messageObservable, isSendingObservable } = React.useMemo(\n    () => setupDataMessageHandler(room, topic, onMessage),\n    [room, topic, onMessage],\n  );\n\n  const message = useObservableState(messageObservable, undefined);\n  const isSending = useObservableState(isSendingObservable, false);\n\n  return {\n    message,\n    send,\n    isSending,\n  };\n}\n","import { setupDisconnectButton } from '@livekit/components-core';\nimport { ConnectionState } from 'livekit-client';\nimport * as React from 'react';\nimport type { DisconnectButtonProps } from '../components';\nimport { useRoomContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useConnectionState } from './useConnectionStatus';\n\n/**\n * The `useDisconnectButton` hook is used to implement the `DisconnectButton` or your\n * custom implementation of it. It adds onClick handler to the button to disconnect\n * from the room.\n *\n * @example\n * ```tsx\n * const { buttonProps } = useDisconnectButton(buttonProps);\n * return <button {...buttonProps}>Disconnect</button>;\n * ```\n * @public\n */\nexport function useDisconnectButton(props: DisconnectButtonProps) {\n  const room = useRoomContext();\n  const connectionState = useConnectionState(room);\n\n  const buttonProps = React.useMemo(() => {\n    const { className, disconnect } = setupDisconnectButton(room);\n    const mergedProps = mergeProps(props, {\n      className,\n      onClick: () => disconnect(props.stopTracks ?? true),\n      disabled: connectionState === ConnectionState.Disconnected,\n    });\n    return mergedProps;\n  }, [room, props, connectionState]);\n\n  return { buttonProps };\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { LocalTrackPublication, facingModeFromLocalTrack } from 'livekit-client';\n\n/**\n * Try to determine the `facingMode` of a local participant video track.\n * @remarks\n * Works only on local video tracks.\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaTrackConstraints/facingMode | MDN docs on facingMode}\n * @alpha\n */\nexport function useFacingMode(\n  trackReference: TrackReferenceOrPlaceholder,\n): 'user' | 'environment' | 'left' | 'right' | 'undefined' {\n  if (trackReference.publication instanceof LocalTrackPublication) {\n    const localTrack = trackReference.publication.track;\n    if (localTrack) {\n      const { facingMode } = facingModeFromLocalTrack(localTrack);\n      return facingMode;\n    }\n  }\n  return 'undefined';\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { setupFocusToggle, isTrackReferencePinned } from '@livekit/components-core';\nimport { useEnsureTrackRef, useMaybeLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport * as React from 'react';\n\n/** @public */\nexport interface UseFocusToggleProps {\n  trackRef?: TrackReferenceOrPlaceholder;\n  props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * The `useFocusToggle` hook is used to implement the `FocusToggle` or your custom implementation of it.\n * The `TrackReferenceOrPlaceholder` is used to register a onClick handler and to identify the track to focus on.\n *\n * @example\n * ```tsx\n * const { mergedProps, inFocus } = useFocusToggle({ trackRef, props: yourButtonProps });\n * return <button {...mergedProps}>{inFocus ? 'Unfocus' : 'Focus'}</button>;\n * ```\n * @public\n */\nexport function useFocusToggle({ trackRef, props }: UseFocusToggleProps) {\n  const trackReference = useEnsureTrackRef(trackRef);\n\n  const layoutContext = useMaybeLayoutContext();\n  const { className } = React.useMemo(() => setupFocusToggle(), []);\n\n  const inFocus: boolean = React.useMemo(() => {\n    return isTrackReferencePinned(trackReference, layoutContext?.pin.state);\n  }, [trackReference, layoutContext?.pin.state]);\n\n  const mergedProps = React.useMemo(\n    () =>\n      mergeProps(props, {\n        className,\n        onClick: (event: React.MouseEvent<HTMLButtonElement, MouseEvent>) => {\n          // Call user defined on click callbacks.\n          props.onClick?.(event);\n\n          // Set or clear focus based on current focus state.\n          if (inFocus) {\n            layoutContext?.pin.dispatch?.({\n              msg: 'clear_pin',\n            });\n          } else {\n            layoutContext?.pin.dispatch?.({\n              msg: 'set_pin',\n              trackReference,\n            });\n          }\n        },\n      }),\n    [props, className, trackReference, inFocus, layoutContext?.pin],\n  );\n\n  return { mergedProps, inFocus };\n}\n","import { GRID_LAYOUTS, selectGridLayout } from '@livekit/components-core';\nimport type { GridLayoutDefinition, GridLayoutInfo } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useSize } from './internal';\n\n/**\n * The `useGridLayout` hook tries to select the best layout to fit all tiles.\n * If the available screen space is not enough, it will reduce the number of maximum visible\n * tiles and select a layout that still works visually within the given limitations.\n * As the order of tiles changes over time, the hook tries to keep visual updates to a minimum\n * while trying to display important tiles such as speaking participants or screen shares.\n *\n * @example\n * ```tsx\n * const { layout } = useGridLayout(gridElement, trackCount);\n * ```\n * @public\n */\nexport function useGridLayout(\n  /** HTML element that contains the grid. */\n  gridElement: React.RefObject<HTMLDivElement>,\n  /** Count of tracks that should get layed out */\n  trackCount: number,\n  options: {\n    gridLayouts?: GridLayoutDefinition[];\n  } = {},\n): { layout: GridLayoutInfo; containerWidth: number; containerHeight: number } {\n  const gridLayouts = options.gridLayouts ?? GRID_LAYOUTS;\n  const { width, height } = useSize(gridElement);\n  const layout = selectGridLayout(gridLayouts, trackCount, width, height);\n\n  React.useEffect(() => {\n    if (gridElement.current && layout) {\n      gridElement.current.style.setProperty('--lk-col-count', layout?.columns.toString());\n      gridElement.current.style.setProperty('--lk-row-count', layout?.rows.toString());\n    }\n  }, [gridElement, layout]);\n\n  return {\n    layout,\n    containerWidth: width,\n    containerHeight: height,\n  };\n}\n","import {\n  type TrackReferenceOrPlaceholder,\n  getTrackReferenceId,\n  mutedObserver,\n} from '@livekit/components-core';\nimport type { Participant, Track } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureParticipant } from '../context';\n\n/** @public */\nexport interface UseIsMutedOptions {\n  participant?: Participant;\n}\n\n/**\n * The `useIsMuted` hook is used to implement the `TrackMutedIndicator` or your custom implementation of it.\n * It returns a `boolean` that indicates if the track is muted or not.\n *\n * @example With a track reference\n * ```tsx\n * const isMuted = useIsMuted(track);\n * ```\n *\n * @param trackRef - A `TrackReference` indicating the track to monitor.\n * @returns boolean indicating if the track is muted\n *\n * @public\n */\nexport function useIsMuted(trackRef: TrackReferenceOrPlaceholder): boolean;\nexport function useIsMuted(\n  sourceOrTrackRef: TrackReferenceOrPlaceholder | Track.Source,\n  options: UseIsMutedOptions = {},\n) {\n  const passedParticipant =\n    typeof sourceOrTrackRef === 'string' ? options.participant : sourceOrTrackRef.participant;\n  const p = useEnsureParticipant(passedParticipant);\n  const ref =\n    typeof sourceOrTrackRef === 'string'\n      ? { participant: p, source: sourceOrTrackRef }\n      : sourceOrTrackRef;\n  const [isMuted, setIsMuted] = React.useState(\n    !!(ref.publication?.isMuted || p.getTrackPublication(ref.source)?.isMuted),\n  );\n\n  React.useEffect(() => {\n    const listener = mutedObserver(ref).subscribe(setIsMuted);\n    return () => listener.unsubscribe();\n  }, [getTrackReferenceId(ref)]);\n\n  return isMuted;\n}\n","import { createIsSpeakingObserver } from '@livekit/components-core';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureParticipant } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useIsSpeaking` hook returns a `boolean` that indicates if the participant is speaking or not.\n * @example\n * ```tsx\n * const isSpeaking = useIsSpeaking(participant);\n * ```\n * @public\n */\nexport function useIsSpeaking(participant?: Participant) {\n  const p = useEnsureParticipant(participant);\n  const observable = React.useMemo(() => createIsSpeakingObserver(p), [p]);\n  const isSpeaking = useObservableState(observable, p.isSpeaking);\n\n  return isSpeaking;\n}\n","import type { ParticipantMedia } from '@livekit/components-core';\nimport { observeParticipantMedia } from '@livekit/components-core';\nimport type { TrackPublication, LocalParticipant, Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\n\n/** @public */\nexport interface UseLocalParticipantOptions {\n  /**\n   * The room to use. If not provided, the hook will use the room from the context.\n   */\n  room?: Room;\n}\n\n/**\n * The `useLocalParticipant` hook returns the local participant and the associated state\n * around the participant.\n *\n * @example\n * ```tsx\n * const { localParticipant } = useLocalParticipant();\n * ```\n * @public\n */\nexport function useLocalParticipant(options: UseLocalParticipantOptions = {}) {\n  const room = useEnsureRoom(options.room);\n  const [localParticipant, setLocalParticipant] = React.useState(room.localParticipant);\n\n  const [isMicrophoneEnabled, setIsMicrophoneEnabled] = React.useState(\n    localParticipant.isMicrophoneEnabled,\n  );\n  const [isCameraEnabled, setIsCameraEnabled] = React.useState(localParticipant.isCameraEnabled);\n  const [isScreenShareEnabled, setIsScreenShareEnabled] = React.useState(\n    localParticipant.isScreenShareEnabled,\n  );\n\n  const [lastMicrophoneError, setLastMicrophoneError] = React.useState(\n    localParticipant.lastMicrophoneError,\n  );\n  const [lastCameraError, setLastCameraError] = React.useState(localParticipant.lastCameraError);\n\n  const [microphoneTrack, setMicrophoneTrack] = React.useState<TrackPublication | undefined>(\n    undefined,\n  );\n  const [cameraTrack, setCameraTrack] = React.useState<TrackPublication | undefined>(undefined);\n\n  const handleUpdate = (media: ParticipantMedia<LocalParticipant>) => {\n    setIsCameraEnabled(media.isCameraEnabled);\n    setIsMicrophoneEnabled(media.isMicrophoneEnabled);\n    setIsScreenShareEnabled(media.isScreenShareEnabled);\n    setCameraTrack(media.cameraTrack);\n    setMicrophoneTrack(media.microphoneTrack);\n    setLastMicrophoneError(media.participant.lastMicrophoneError);\n    setLastCameraError(media.participant.lastCameraError);\n    setLocalParticipant(media.participant);\n  };\n  React.useEffect(() => {\n    const listener = observeParticipantMedia(room.localParticipant).subscribe(handleUpdate);\n    // TODO also listen to permission and metadata etc. events\n    return () => listener.unsubscribe();\n  }, [room]);\n\n  return {\n    isMicrophoneEnabled,\n    isScreenShareEnabled,\n    isCameraEnabled,\n    microphoneTrack,\n    cameraTrack,\n    lastMicrophoneError,\n    lastCameraError,\n    localParticipant,\n  };\n}\n","import { participantPermissionObserver } from '@livekit/components-core';\nimport type { ParticipantPermission } from '@livekit/protocol';\nimport * as React from 'react';\nimport { useRoomContext } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useLocalParticipantPermissions` hook returns the local participant's permissions.\n *\n * @example\n * ```tsx\n * const { canPublish, canPublishData } = useLocalParticipantPermissions();\n * ```\n * @public\n */\nexport function useLocalParticipantPermissions(): ParticipantPermission | undefined {\n  const room = useRoomContext();\n  const permissionObserver = React.useMemo(\n    () => participantPermissionObserver(room.localParticipant),\n    [room],\n  );\n  const permissions = useObservableState(permissionObserver, room.localParticipant.permissions);\n  return permissions;\n}\n","import { createMediaDeviceObserver, setupDeviceSelector, log } from '@livekit/components-core';\nimport { Room, type LocalAudioTrack, type LocalVideoTrack } from 'livekit-client';\nimport * as React from 'react';\nimport { useMaybeRoomContext } from '../context';\nimport { useObservableState } from './internal';\n\n/** @public */\nexport interface UseMediaDeviceSelectProps {\n  kind: MediaDeviceKind;\n  room?: Room;\n  track?: LocalAudioTrack | LocalVideoTrack;\n  /**\n   * this will call getUserMedia if the permissions are not yet given to enumerate the devices with device labels.\n   * in some browsers multiple calls to getUserMedia result in multiple permission prompts.\n   * It's generally advised only flip this to true, once a (preview) track has been acquired successfully with the\n   * appropriate permissions.\n   *\n   * @see {@link MediaDeviceMenu}\n   * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices | MDN enumerateDevices}\n   */\n  requestPermissions?: boolean;\n  /**\n   * this callback gets called if an error is thrown when failing to select a device and also if a user\n   * denied permissions, eventhough the `requestPermissions` option is set to `true`.\n   * Most commonly this will emit a MediaDeviceError\n   */\n  onError?: (e: Error) => void;\n}\n\n/**\n * The `useMediaDeviceSelect` hook is used to implement the `MediaDeviceSelect` component and\n * returns o.a. the list of devices of a given kind (audioinput or videoinput), the currently active device\n * and a function to set the the active device.\n *\n * @example\n * ```tsx\n * const { devices, activeDeviceId, setActiveMediaDevice } = useMediaDeviceSelect({kind: 'audioinput'});\n * ```\n * @public\n */\nexport function useMediaDeviceSelect({\n  kind,\n  room,\n  track,\n  requestPermissions,\n  onError,\n}: UseMediaDeviceSelectProps) {\n  const roomContext = useMaybeRoomContext();\n\n  const roomFallback = React.useMemo(() => room ?? roomContext ?? new Room(), [room, roomContext]);\n\n  // List of all devices.\n  const deviceObserver = React.useMemo(\n    () => createMediaDeviceObserver(kind, onError, requestPermissions),\n    [kind, requestPermissions, onError],\n  );\n  const devices = useObservableState(deviceObserver, [] as MediaDeviceInfo[]);\n  // Active device management.\n  const [currentDeviceId, setCurrentDeviceId] = React.useState<string>(\n    roomFallback?.getActiveDevice(kind) ?? 'default',\n  );\n  const { className, activeDeviceObservable, setActiveMediaDevice } = React.useMemo(\n    () => setupDeviceSelector(kind, roomFallback),\n    [kind, roomFallback, track],\n  );\n\n  React.useEffect(() => {\n    const listener = activeDeviceObservable.subscribe((deviceId) => {\n      if (!deviceId) {\n        return;\n      }\n      log.info('setCurrentDeviceId', deviceId);\n      setCurrentDeviceId(deviceId);\n    });\n    return () => {\n      listener?.unsubscribe();\n    };\n  }, [activeDeviceObservable]);\n\n  return { devices, className, activeDeviceId: currentDeviceId, setActiveMediaDevice };\n}\n","import * as React from 'react';\nimport { useObservableState } from './internal';\nimport { createMediaDeviceObserver } from '@livekit/components-core';\n\n/**\n * The `useMediaDevices` hook returns the list of media devices of a given kind.\n *\n * @example\n * ```tsx\n * const videoDevices = useMediaDevices({ kind: 'videoinput' });\n * const audioDevices = useMediaDevices({ kind: 'audioinput' });\n * ```\n * @public\n */\nexport function useMediaDevices({\n  kind,\n  onError,\n}: {\n  kind: MediaDeviceKind;\n  onError?: (e: Error) => void;\n}) {\n  const deviceObserver = React.useMemo(\n    () => createMediaDeviceObserver(kind, onError),\n    [kind, onError],\n  );\n  const devices = useObservableState(deviceObserver, [] as MediaDeviceInfo[]);\n  return devices;\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { log, sortTrackReferences, updatePages } from '@livekit/components-core';\nimport * as React from 'react';\n\n/** @public */\nexport interface UseVisualStableUpdateOptions {\n  /** Overwrites the default sort function. */\n  customSortFunction?: (\n    trackReferences: TrackReferenceOrPlaceholder[],\n  ) => TrackReferenceOrPlaceholder[];\n}\n\n/**\n * The `useVisualStableUpdate` hook is used to prevent visually jarring jumps and shifts of elements\n * in an array. The algorithm only starts to update when there are more items than visually fit\n * on a page. If this is the case, it will make sure that speaking participants move to the first\n * page and are always visible.\n * @remarks\n * Updating the array can occur because attendees leave or join a room, or because they mute/unmute\n * or start speaking.\n * The hook is used for the `GridLayout` and `CarouselLayout` components.\n *\n * @example\n * ```tsx\n * const trackRefs = useTracks();\n * const updatedTrackRefs = useVisualStableUpdate(trackRefs, itemPerPage);\n * ```\n * @public\n */\nexport function useVisualStableUpdate(\n  /** `TrackReference`s to display in the grid.  */\n  trackReferences: TrackReferenceOrPlaceholder[],\n  maxItemsOnPage: number,\n  options: UseVisualStableUpdateOptions = {},\n): TrackReferenceOrPlaceholder[] {\n  const lastTrackRefs = React.useRef<TrackReferenceOrPlaceholder[]>([]);\n  const lastMaxItemsOnPage = React.useRef<number>(-1);\n  const layoutChanged = maxItemsOnPage !== lastMaxItemsOnPage.current;\n\n  const sortedTrackRefs =\n    typeof options.customSortFunction === 'function'\n      ? options.customSortFunction(trackReferences)\n      : sortTrackReferences(trackReferences);\n\n  let updatedTrackRefs: TrackReferenceOrPlaceholder[] = [...sortedTrackRefs];\n  if (layoutChanged === false) {\n    try {\n      updatedTrackRefs = updatePages(lastTrackRefs.current, sortedTrackRefs, maxItemsOnPage);\n    } catch (error) {\n      log.error('Error while running updatePages(): ', error);\n    }\n  }\n\n  // Save info for to compare against in the next update cycle.\n  if (layoutChanged) {\n    lastTrackRefs.current = sortedTrackRefs;\n  } else {\n    lastTrackRefs.current = updatedTrackRefs;\n  }\n  lastMaxItemsOnPage.current = maxItemsOnPage;\n\n  return updatedTrackRefs;\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useVisualStableUpdate } from './useVisualStableUpdate';\n\n/**\n * The `usePagination` hook implements simple pagination logic for use with arrays.\n * @example\n * ```tsx\n * const tracks = useTracks();\n * const pagination = usePagination(4, tracks);\n *\n * <TrackLoop tracks={pagination.tracks} />\n * ```\n * @alpha\n */\nexport function usePagination(itemPerPage: number, trackReferences: TrackReferenceOrPlaceholder[]) {\n  const [currentPage, setCurrentPage] = React.useState(1);\n  const totalPageCount = Math.max(Math.ceil(trackReferences.length / itemPerPage), 1);\n  if (currentPage > totalPageCount) {\n    setCurrentPage(totalPageCount);\n  }\n  const lastItemIndex = currentPage * itemPerPage;\n  const firstItemIndex = lastItemIndex - itemPerPage;\n\n  const changePage = (direction: 'next' | 'previous') => {\n    setCurrentPage((state) => {\n      if (direction === 'next') {\n        if (state === totalPageCount) {\n          return state;\n        }\n        return state + 1;\n      } else {\n        if (state === 1) {\n          return state;\n        }\n        return state - 1;\n      }\n    });\n  };\n\n  const goToPage = (num: number) => {\n    if (num > totalPageCount) {\n      setCurrentPage(totalPageCount);\n    } else if (num < 1) {\n      setCurrentPage(1);\n    } else {\n      setCurrentPage(num);\n    }\n  };\n\n  const updatedTrackReferences = useVisualStableUpdate(trackReferences, itemPerPage);\n\n  const tracksOnPage = updatedTrackReferences.slice(firstItemIndex, lastItemIndex);\n\n  return {\n    totalPageCount,\n    nextPage: () => changePage('next'),\n    prevPage: () => changePage('previous'),\n    setPage: goToPage,\n    firstItemIndex,\n    lastItemIndex,\n    tracks: tracksOnPage,\n    currentPage,\n  };\n}\n\nexport default usePagination;\n","import { participantInfoObserver } from '@livekit/components-core';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useMaybeParticipantContext } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useParticipantInfo` hook returns the identity, name, and metadata of a given participant.\n * It requires a `Participant` object passed as property or via the `ParticipantContext`.\n *\n * @example\n * ```tsx\n * const { identity, name, metadata } = useParticipantInfo({ participant });\n * ```\n * @public\n */\nexport interface UseParticipantInfoOptions {\n  participant?: Participant;\n}\n\n/** @public */\nexport function useParticipantInfo(props: UseParticipantInfoOptions = {}) {\n  let p = useMaybeParticipantContext();\n  if (props.participant) {\n    p = props.participant;\n  }\n  const infoObserver = React.useMemo(() => participantInfoObserver(p), [p]);\n  const { identity, name, metadata } = useObservableState(infoObserver, {\n    name: p?.name,\n    identity: p?.identity,\n    metadata: p?.metadata,\n  });\n\n  return { identity, name, metadata };\n}\n","import { participantPermissionObserver } from '@livekit/components-core';\nimport type { ParticipantPermission } from '@livekit/protocol';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureParticipant } from '../context';\nimport { useObservableState } from './internal/useObservableState';\n\n/**\n * The `useParticipantPermissions` hook returns the permissions of a given participant.\n *\n * @example\n * ```tsx\n * const permissions = useParticipantPermissions({ participant });\n * ```\n * @public\n */\nexport interface UseParticipantPermissionsOptions {\n  participant?: Participant;\n}\n\n/** @public */\nexport function useParticipantPermissions(\n  options: UseParticipantPermissionsOptions = {},\n): ParticipantPermission | undefined {\n  const p = useEnsureParticipant(options.participant);\n  const permissionObserver = React.useMemo(() => participantPermissionObserver(p), [p]);\n  const permissions = useObservableState(permissionObserver, p.permissions);\n  return permissions;\n}\n","import type { ParticipantClickEvent, TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { setupParticipantTile } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useEnsureTrackRef } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useFacingMode } from './useFacingMode';\nimport { useIsMuted } from './useIsMuted';\nimport { useIsSpeaking } from './useIsSpeaking';\nimport { Track } from 'livekit-client';\n\n/** @public */\nexport interface UseParticipantTileProps<T extends HTMLElement> extends React.HTMLAttributes<T> {\n  /** The track reference to display. */\n  trackRef?: TrackReferenceOrPlaceholder;\n  disableSpeakingIndicator?: boolean;\n  onParticipantClick?: (event: ParticipantClickEvent) => void;\n  htmlProps: React.HTMLAttributes<T>;\n}\n\n/**\n * The `useParticipantTile` hook is used to implement the `ParticipantTile` and returns the props needed to render the tile.\n * @remarks\n * The returned props include many data attributes that are useful for CSS styling purposes because they\n * indicate the state of the participant and the track.\n * For example: `data-lk-audio-muted`, `data-lk-video-muted`, `data-lk-speaking`, `data-lk-local-participant`, `data-lk-source`, `data-lk-facing-mode`.\n * @public\n */\nexport function useParticipantTile<T extends HTMLElement>({\n  trackRef,\n  onParticipantClick,\n  disableSpeakingIndicator,\n  htmlProps,\n}: UseParticipantTileProps<T>) {\n  const trackReference = useEnsureTrackRef(trackRef);\n\n  const mergedProps = React.useMemo(() => {\n    const { className } = setupParticipantTile();\n    return mergeProps(htmlProps, {\n      className,\n      onClick: (event: React.MouseEvent<T, MouseEvent>) => {\n        htmlProps.onClick?.(event);\n        if (typeof onParticipantClick === 'function') {\n          const track =\n            trackReference.publication ??\n            trackReference.participant.getTrackPublication(trackReference.source);\n          onParticipantClick({ participant: trackReference.participant, track });\n        }\n      },\n    });\n  }, [\n    htmlProps,\n    onParticipantClick,\n    trackReference.publication,\n    trackReference.source,\n    trackReference.participant,\n  ]);\n\n  const micTrack = trackReference.participant.getTrackPublication(Track.Source.Microphone);\n  const micRef = React.useMemo(() => {\n    return {\n      participant: trackReference.participant,\n      source: Track.Source.Microphone,\n      publication: micTrack,\n    };\n  }, [micTrack, trackReference.participant]);\n  const isVideoMuted = useIsMuted(trackReference);\n  const isAudioMuted = useIsMuted(micRef);\n  const isSpeaking = useIsSpeaking(trackReference.participant);\n  const facingMode = useFacingMode(trackReference);\n  return {\n    elementProps: {\n      'data-lk-audio-muted': isAudioMuted,\n      'data-lk-video-muted': isVideoMuted,\n      'data-lk-speaking': disableSpeakingIndicator === true ? false : isSpeaking,\n      'data-lk-local-participant': trackReference.participant.isLocal,\n      'data-lk-source': trackReference.source,\n      'data-lk-facing-mode': facingMode,\n      ...mergedProps,\n    } as React.HTMLAttributes<T>,\n  };\n}\n","import { connectedParticipantsObserver } from '@livekit/components-core';\nimport type { RoomEvent, RemoteParticipant, Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\n\n/** @public */\nexport interface UseRemoteParticipantsOptions {\n  /**\n   * To optimize performance, you can use the `updateOnlyOn` property to decide on what RoomEvents the hook updates.\n   * By default it updates on all relevant RoomEvents to keep the returned participants array up to date.\n   * The minimal set of non-overwriteable `RoomEvents` is: `[RoomEvent.ParticipantConnected, RoomEvent.ParticipantDisconnected, RoomEvent.ConnectionStateChanged]`\n   */\n  updateOnlyOn?: RoomEvent[];\n  /**\n   * The room to use. If not provided, the hook will use the room from the context.\n   */\n  room?: Room;\n}\n\n/**\n * The `useRemoteParticipants` hook returns all remote participants (without the local) of the current room.\n * @remarks\n * To optimize performance, you can use the `updateOnlyOn` property to decide on what `RoomEvents` the hook updates.\n *\n * @example\n * ```tsx\n * const participants = useRemoteParticipants();\n * <ParticipantLoop participants={participants}>\n *  <ParticipantName />\n * </ParticipantLoop>\n * ```\n * @public\n */\nexport function useRemoteParticipants(options: UseRemoteParticipantsOptions = {}) {\n  const room = useEnsureRoom(options.room);\n  const [participants, setParticipants] = React.useState<RemoteParticipant[]>([]);\n\n  React.useEffect(() => {\n    const listener = connectedParticipantsObserver(room, {\n      additionalRoomEvents: options.updateOnlyOn,\n    }).subscribe(setParticipants);\n    return () => listener.unsubscribe();\n  }, [room, JSON.stringify(options.updateOnlyOn)]);\n  return participants;\n}\n","import type { Room, RoomEvent } from 'livekit-client';\nimport { useLocalParticipant } from './useLocalParticipant';\nimport { useRemoteParticipants } from './useRemoteParticipants';\nimport * as React from 'react';\n\n/** @public */\nexport interface UseParticipantsOptions {\n  /**\n   * To optimize performance, you can use the `updateOnlyOn` property to decide on what RoomEvents the hook updates.\n   * By default it updates on all relevant RoomEvents to keep the returned participants array up to date.\n   * The minimal set of non-overwriteable `RoomEvents` is: `[RoomEvent.ParticipantConnected, RoomEvent.ParticipantDisconnected, RoomEvent.ConnectionStateChanged]`\n   */\n  updateOnlyOn?: RoomEvent[];\n  /**\n   * The room to use. If not provided, the hook will use the room from the context.\n   */\n  room?: Room;\n}\n\n/**\n * The `useParticipants` hook returns all participants (local and remote) of the current room.\n * @remarks\n * To optimize performance, you can use the `updateOnlyOn` property to decide on what `RoomEvents` the hook updates.\n *\n * @example\n * ```tsx\n * const participants = useParticipants();\n * <ParticipantLoop participants={participants}>\n *  <ParticipantName />\n * </ParticipantLoop>\n * ```\n * @public\n */\nexport function useParticipants(options: UseParticipantsOptions = {}) {\n  const remoteParticipants = useRemoteParticipants(options);\n  const { localParticipant } = useLocalParticipant(options);\n\n  return React.useMemo(\n    () => [localParticipant, ...remoteParticipants],\n    [localParticipant, remoteParticipants],\n  );\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport * as React from 'react';\nimport type { LayoutContextType } from '../context';\nimport { useEnsureLayoutContext } from '../context';\n\n/**\n * The `usePinnedTracks` hook returns a array of the pinned tracks of the current room.\n * @remarks\n * To function properly, this hook must be called within a `LayoutContext`.\n * @example\n * ```tsx\n * const pinnedTracks = usePinnedTracks();\n * ```\n * @public\n */\nexport function usePinnedTracks(layoutContext?: LayoutContextType): TrackReferenceOrPlaceholder[] {\n  layoutContext = useEnsureLayoutContext(layoutContext);\n  return React.useMemo(() => {\n    if (layoutContext?.pin.state !== undefined && layoutContext.pin.state.length >= 1) {\n      return layoutContext.pin.state;\n    }\n    return [];\n  }, [layoutContext.pin.state]);\n}\n","import {\n  type ParticipantIdentifier,\n  connectedParticipantObserver,\n  participantByIdentifierObserver,\n} from '@livekit/components-core';\nimport type { ParticipantEvent, RemoteParticipant } from 'livekit-client';\nimport * as React from 'react';\nimport { useRoomContext } from '../context';\n\n/** @public */\nexport interface UseRemoteParticipantOptions {\n  /**\n   * To optimize performance, you can use the `updateOnlyOn` property to decide on what `ParticipantEvents` the hook updates.\n   * By default it updates on all relevant ParticipantEvents to keep the returned participant up to date.\n   */\n  updateOnlyOn?: ParticipantEvent[];\n}\n\n/**\n * The `useRemoteParticipant` hook returns the first RemoteParticipant by either identity and/or based on the participant kind.\n * @remarks\n * To optimize performance, you can use the `updateOnlyOn` property to decide on what `ParticipantEvents` the hook updates.\n *\n * @example\n * ```tsx\n * const participant = useRemoteParticipant({kind: ParticipantKind.Agent, identity: 'myAgent'});\n * ```\n * @public\n */\nexport function useRemoteParticipant(\n  identifier: ParticipantIdentifier,\n  options?: UseRemoteParticipantOptions,\n): RemoteParticipant | undefined;\n/**\n * The `useRemoteParticipant` hook returns the first RemoteParticipant by either identity or based on the participant kind.\n * @remarks\n * To optimize performance, you can use the `updateOnlyOn` property to decide on what `ParticipantEvents` the hook updates.\n *\n * @example\n * ```tsx\n * const participant = useRemoteParticipant('Russ');\n * ```\n * @public\n */\nexport function useRemoteParticipant(\n  identity: string,\n  options?: UseRemoteParticipantOptions,\n): RemoteParticipant | undefined;\nexport function useRemoteParticipant(\n  identityOrIdentifier: string | ParticipantIdentifier,\n  options: UseRemoteParticipantOptions = {},\n): RemoteParticipant | undefined {\n  const room = useRoomContext();\n  const [updateOnlyOn] = React.useState(options.updateOnlyOn);\n\n  const observable = React.useMemo(() => {\n    if (typeof identityOrIdentifier === 'string') {\n      return connectedParticipantObserver(room, identityOrIdentifier, {\n        additionalEvents: updateOnlyOn,\n      });\n    } else {\n      return participantByIdentifierObserver(room, identityOrIdentifier, {\n        additionalEvents: updateOnlyOn,\n      });\n    }\n  }, [room, JSON.stringify(identityOrIdentifier), updateOnlyOn]);\n\n  // Using `wrapperParticipant` to ensure a new object reference,\n  // triggering a re-render when the participant events fire.\n  const [participantWrapper, setParticipantWrapper] = React.useState({\n    p: undefined as RemoteParticipant | undefined,\n  });\n  React.useEffect(() => {\n    const listener = observable.subscribe((p) => setParticipantWrapper({ p }));\n    return () => listener.unsubscribe();\n  }, [observable]);\n\n  return participantWrapper.p;\n}\n","import { roomInfoObserver } from '@livekit/components-core';\nimport type { Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useRoomInfo` hook returns the name and metadata of the given `Room`.\n * @remarks\n * Needs to be called inside a `RoomContext` or by passing a `Room` instance.\n *\n * @example\n * ```tsx\n * const { name, metadata } = useRoomInfo();\n * ```\n * @public\n */\nexport interface UseRoomInfoOptions {\n  room?: Room;\n}\n\n/** @public */\nexport function useRoomInfo(options: UseRoomInfoOptions = {}) {\n  const room = useEnsureRoom(options.room);\n  const infoObserver = React.useMemo(() => roomInfoObserver(room), [room]);\n  const { name, metadata } = useObservableState(infoObserver, {\n    name: room.name,\n    metadata: room.metadata,\n  });\n\n  return { name, metadata };\n}\n","import { activeSpeakerObserver } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { useObservableState } from './internal';\nimport { Room } from 'livekit-client';\n\n/** @public */\nexport type UseSpeakingParticipantsOptions = {\n  room?: Room;\n};\n\n/**\n * The `useSpeakingParticipants` hook returns only the active speakers of all participants.\n *\n * @example\n * ```tsx\n * const activeSpeakers = useSpeakingParticipants();\n * ```\n * @public\n */\nexport function useSpeakingParticipants(options?: UseSpeakingParticipantsOptions) {\n  const ensuredRoom = useEnsureRoom(options?.room);\n\n  const speakerObserver = React.useMemo(() => activeSpeakerObserver(ensuredRoom), [ensuredRoom]);\n  const activeSpeakers = useObservableState(speakerObserver, ensuredRoom.activeSpeakers);\n  return activeSpeakers;\n}\n","import { sortParticipants } from '@livekit/components-core';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useSpeakingParticipants } from './useSpeakingParticipants';\n\n/**\n * The `useSortedParticipants` hook returns the participants sorted by importance.\n * @public\n */\nexport function useSortedParticipants(participants: Array<Participant>) {\n  const [sortedParticipants, setSortedParticipants] = React.useState(\n    sortParticipants(participants),\n  );\n  const activeSpeakers = useSpeakingParticipants();\n\n  React.useEffect(() => {\n    setSortedParticipants(sortParticipants(participants));\n  }, [activeSpeakers, participants]);\n  return sortedParticipants;\n}\n","import { setupStartAudio } from '@livekit/components-core';\nimport type { Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useObservableState } from './internal';\n\n/** @alpha */\nexport interface UseStartAudioProps {\n  room?: Room;\n  props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * In many browsers to start audio playback, the user must perform a user-initiated event such as clicking a button.\n * The `useStatAudio` hook returns an object with a boolean `canPlayAudio` flag\n * that indicates whether audio playback is allowed in the current context,\n * as well as a `startAudio` function that can be called in a button `onClick` callback to start audio playback in the current context.\n *\n * @see Autoplay policy on MDN web docs for more info: {@link https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Best_practices#autoplay_policy}\n * @alpha\n */\nexport function useStartAudio({ room, props }: UseStartAudioProps) {\n  const roomEnsured = useEnsureRoom(room);\n  const { className, roomAudioPlaybackAllowedObservable, handleStartAudioPlayback } = React.useMemo(\n    () => setupStartAudio(),\n    [],\n  );\n  const observable = React.useMemo(\n    () => roomAudioPlaybackAllowedObservable(roomEnsured),\n    [roomEnsured, roomAudioPlaybackAllowedObservable],\n  );\n  const { canPlayAudio } = useObservableState(observable, {\n    canPlayAudio: roomEnsured.canPlaybackAudio,\n  });\n\n  const mergedProps = React.useMemo(\n    () =>\n      mergeProps(props, {\n        className,\n        onClick: () => {\n          handleStartAudioPlayback(roomEnsured);\n        },\n        style: { display: canPlayAudio ? 'none' : 'block' },\n      }),\n    [props, className, canPlayAudio, handleStartAudioPlayback, roomEnsured],\n  );\n\n  return { mergedProps, canPlayAudio };\n}\n","import { setupStartVideo } from '@livekit/components-core';\nimport type { Room } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useObservableState } from './internal';\n\n/** @alpha */\nexport interface UseStartVideoProps {\n  room?: Room;\n  props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * In some browsers to start video playback in low power mode, the user must perform a user-initiated event such as clicking a button.\n * The `useStartVideo` hook returns an object with a boolean `canPlayVideo` flag\n * that indicates whether video playback is allowed in the current context,\n * as well as a `startVideo` function that can be called in a button `onClick` callback to start video playback in the current context.\n *\n * @alpha\n */\nexport function useStartVideo({ room, props }: UseStartVideoProps) {\n  const roomEnsured = useEnsureRoom(room);\n  const { className, roomVideoPlaybackAllowedObservable, handleStartVideoPlayback } = React.useMemo(\n    () => setupStartVideo(),\n    [],\n  );\n  const observable = React.useMemo(\n    () => roomVideoPlaybackAllowedObservable(roomEnsured),\n    [roomEnsured, roomVideoPlaybackAllowedObservable],\n  );\n  const { canPlayVideo } = useObservableState(observable, {\n    canPlayVideo: roomEnsured.canPlaybackVideo,\n  });\n\n  const mergedProps = React.useMemo(\n    () =>\n      mergeProps(props, {\n        className,\n        onClick: () => {\n          handleStartVideoPlayback(roomEnsured);\n        },\n        style: { display: canPlayVideo ? 'none' : 'block' },\n      }),\n    [props, className, canPlayVideo, handleStartVideoPlayback, roomEnsured],\n  );\n\n  return { mergedProps, canPlayVideo };\n}\n","import * as React from 'react';\n\n/**\n * @alpha\n */\nexport type UseSwipeOptions = {\n  minSwipeDistance?: number;\n  onLeftSwipe?: () => void;\n  onRightSwipe?: () => void;\n};\n\n/**\n * Simple implementation to detect horizontal swipe actions.\n * Accepts callbacks for on right and left swipes.\n * @example\n * ```tsx\n *  <div\n      onTouchStart={onTouchStart}\n      onTouchMove={onTouchMove}\n      onTouchEnd={onTouchEnd}\n    >\n * ```\n * @alpha\n */\nexport function useSwipe(element: React.RefObject<HTMLElement>, options: UseSwipeOptions = {}) {\n  const touchStart = React.useRef<number | null>(null);\n  const touchEnd = React.useRef<number | null>(null);\n\n  // The required distance between touchStart and touchEnd to be detected as a swipe.\n  const minSwipeDistance = options.minSwipeDistance ?? 50;\n\n  const onTouchStart = (event: TouchEvent) => {\n    touchEnd.current = null; // Otherwise the swipe is fired even with usual touch events.\n    touchStart.current = event.targetTouches[0].clientX;\n  };\n\n  const onTouchMove = (event: TouchEvent) => {\n    touchEnd.current = event.targetTouches[0].clientX;\n  };\n\n  const onTouchEnd = React.useCallback(() => {\n    if (!touchStart.current || !touchEnd.current) {\n      return;\n    }\n    const distance = touchStart.current - touchEnd.current;\n    const isLeftSwipe = distance > minSwipeDistance;\n    const isRightSwipe = distance < -minSwipeDistance;\n\n    if (isLeftSwipe && options.onLeftSwipe) options.onLeftSwipe();\n    if (isRightSwipe && options.onRightSwipe) options.onRightSwipe();\n  }, [minSwipeDistance, options]);\n\n  React.useEffect(() => {\n    const elementCopy = element.current;\n    if (elementCopy) {\n      elementCopy.addEventListener('touchstart', onTouchStart, { passive: true });\n      elementCopy.addEventListener('touchmove', onTouchMove, { passive: true });\n      elementCopy.addEventListener('touchend', onTouchEnd, { passive: true });\n    }\n    return () => {\n      if (elementCopy) {\n        elementCopy.removeEventListener('touchstart', onTouchStart);\n        elementCopy.removeEventListener('touchmove', onTouchMove);\n        elementCopy.removeEventListener('touchend', onTouchEnd);\n      }\n    };\n  }, [element, onTouchEnd]);\n}\n","import { setupChatToggle } from '@livekit/components-core';\nimport { useLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport * as React from 'react';\n\n/** @public */\nexport interface UseChatToggleProps {\n  props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * The `useChatToggle` hook provides state and functions for toggling the chat window.\n * @remarks\n * Depends on the `LayoutContext` to work properly.\n * @see {@link ChatToggle}, {@link Chat}\n * @public\n */\nexport function useChatToggle({ props }: UseChatToggleProps) {\n  const { dispatch, state } = useLayoutContext().widget;\n  const { className } = React.useMemo(() => setupChatToggle(), []);\n\n  const mergedProps = React.useMemo(() => {\n    return mergeProps(props, {\n      className,\n      onClick: () => {\n        if (dispatch) dispatch({ msg: 'toggle_chat' });\n      },\n      'aria-pressed': state?.showChat ? 'true' : 'false',\n      'data-lk-unread-msgs': state\n        ? state.unreadMessages < 10\n          ? state.unreadMessages.toFixed(0)\n          : '9+'\n        : '0',\n    });\n  }, [props, className, dispatch, state]);\n\n  return { mergedProps };\n}\n","import { log } from '@livekit/components-core';\nimport * as React from 'react';\n\n/** @public */\nexport interface UserInfo {\n  identity?: string;\n  name?: string;\n  metadata?: string;\n}\n\n/** @public */\nexport interface UseTokenOptions {\n  userInfo?: UserInfo;\n}\n\n/**\n * The `useToken` hook fetches a token from the given token endpoint with the given user info.\n *\n * @example\n * ```tsx\n * const token = useToken(<token-endpoint>, roomName, { userInfo: { identity, name }});\n * ```\n * @public */\nexport function useToken(\n  tokenEndpoint: string | undefined,\n  roomName: string,\n  options: UseTokenOptions = {},\n) {\n  const [token, setToken] = React.useState<string | undefined>(undefined);\n\n  React.useEffect(() => {\n    if (tokenEndpoint === undefined) {\n      throw Error('token endpoint needs to be defined');\n    }\n    if (options.userInfo?.identity === undefined) {\n      return;\n    }\n    const tokenFetcher = async () => {\n      log.debug('fetching token');\n      const params = new URLSearchParams({ ...options.userInfo, roomName });\n      const res = await fetch(`${tokenEndpoint}?${params.toString()}`);\n      if (!res.ok) {\n        log.error(\n          `Could not fetch token. Server responded with status ${res.status}: ${res.statusText}`,\n        );\n        return;\n      }\n      const { accessToken } = await res.json();\n      setToken(accessToken);\n    };\n    tokenFetcher();\n  }, [tokenEndpoint, roomName, JSON.stringify(options)]);\n  return token;\n}\n","import {\n  type TrackReferenceOrPlaceholder,\n  setupTrackMutedIndicator,\n  getTrackReferenceId,\n} from '@livekit/components-core';\nimport * as React from 'react';\nimport { useEnsureTrackRef } from '../context';\nimport { useObservableState } from './internal';\n\ninterface TrackMutedIndicatorReturnType {\n  isMuted: boolean;\n  className: string;\n}\n\n/**\n * The `useTrackMutedIndicator` hook is used to implement the `TrackMutedIndicator` component\n * and returns the muted state of the given track.\n *\n * @example\n * ```tsx\n * const { isMuted } = useTrackMutedIndicator(trackRef);\n * ```\n * @public\n */\nexport function useTrackMutedIndicator(\n  trackRef?: TrackReferenceOrPlaceholder,\n): TrackMutedIndicatorReturnType {\n  const trackReference = useEnsureTrackRef(trackRef);\n\n  const { className, mediaMutedObserver } = React.useMemo(\n    () => setupTrackMutedIndicator(trackReference),\n    [getTrackReferenceId(trackReference)],\n  );\n\n  const isMuted = useObservableState(\n    mediaMutedObserver,\n    !!(\n      trackReference.publication?.isMuted ||\n      trackReference.participant.getTrackPublication(trackReference.source)?.isMuted\n    ),\n  );\n\n  return { isMuted, className };\n}\n","import type { ToggleSource } from '@livekit/components-core';\nimport { setupMediaToggle, setupManualToggle, log } from '@livekit/components-core';\nimport * as React from 'react';\nimport { type Room } from 'livekit-client';\nimport type { TrackToggleProps } from '../components';\nimport { useMaybeRoomContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport { useObservableState } from './internal';\n\n/** @public */\nexport interface UseTrackToggleProps<T extends ToggleSource> extends Omit<\n  TrackToggleProps<T>,\n  'showIcon'\n> {\n  room?: Room;\n}\n\n/**\n * The `useTrackToggle` hook is used to implement the `TrackToggle` component and returns state\n * and functionality of the given track.\n *\n * @example\n * ```tsx\n * const { buttonProps, enabled } = useTrackToggle(trackRef);\n * return <button {...buttonProps}>{enabled ? 'disable' : 'enable'}</button>;\n * ```\n * @public\n */\nexport function useTrackToggle<T extends ToggleSource>({\n  source,\n  onChange,\n  initialState,\n  captureOptions,\n  publishOptions,\n  onDeviceError,\n  room,\n  ...rest\n}: UseTrackToggleProps<T>) {\n  const roomFromContext = useMaybeRoomContext();\n  const roomFallback = React.useMemo(() => room ?? roomFromContext, [room, roomFromContext]);\n  const track = roomFallback?.localParticipant?.getTrackPublication(source);\n  /** `true` if a user interaction such as a click on the TrackToggle button has occurred. */\n  const userInteractionRef = React.useRef(false);\n\n  const { toggle, className, pendingObserver, enabledObserver } = React.useMemo(\n    () =>\n      roomFallback\n        ? setupMediaToggle<T>(source, roomFallback, captureOptions, publishOptions, onDeviceError)\n        : setupManualToggle(),\n    [roomFallback, source, JSON.stringify(captureOptions), publishOptions],\n  );\n\n  const pending = useObservableState(pendingObserver, false);\n  const enabled = useObservableState(enabledObserver, initialState ?? !!track?.isEnabled);\n\n  React.useEffect(() => {\n    onChange?.(enabled, userInteractionRef.current);\n    userInteractionRef.current = false;\n  }, [enabled, onChange]);\n\n  React.useEffect(() => {\n    if (initialState !== undefined) {\n      log.debug('forcing initial toggle state', source, initialState);\n      toggle(initialState);\n    }\n    // only execute once at the beginning\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  const newProps = React.useMemo(() => mergeProps(rest, { className }), [rest, className]);\n\n  const clickHandler: React.MouseEventHandler<HTMLButtonElement> = React.useCallback(\n    (evt) => {\n      userInteractionRef.current = true;\n      toggle().catch(() => (userInteractionRef.current = false));\n      rest.onClick?.(evt);\n    },\n    [rest, toggle],\n  );\n\n  return {\n    toggle,\n    enabled,\n    pending,\n    track,\n    buttonProps: {\n      ...newProps,\n      'aria-pressed': enabled,\n      'data-lk-source': source,\n      'data-lk-enabled': enabled,\n      disabled: pending,\n      onClick: clickHandler,\n    } as React.ButtonHTMLAttributes<HTMLButtonElement>,\n  };\n}\n","import type {\n  SourcesArray,\n  TrackReference,\n  TrackReferenceOrPlaceholder,\n  TrackSourceWithOptions,\n  TrackReferencePlaceholder,\n} from '@livekit/components-core';\nimport {\n  isSourcesWithOptions,\n  isSourceWitOptions,\n  log,\n  trackReferencesObservable,\n} from '@livekit/components-core';\nimport type { Participant, Room, RoomEvent } from 'livekit-client';\nimport { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\n\n/** @public */\nexport type UseTracksOptions = {\n  updateOnlyOn?: RoomEvent[];\n  onlySubscribed?: boolean;\n  room?: Room;\n};\n\n/** @public */\nexport type UseTracksHookReturnType<T> = T extends Track.Source[]\n  ? TrackReference[]\n  : T extends TrackSourceWithOptions[]\n    ? TrackReferenceOrPlaceholder[]\n    : never;\n\n/**\n * The `useTracks` hook returns an array of `TrackReference` or `TrackReferenceOrPlaceholder` depending on the provided `sources` property.\n * If only subscribed tracks are desired, set the `onlySubscribed` property to `true`.\n * @example\n * ```ts\n * // Return all camera track publications.\n * const trackReferences: TrackReference[] = useTracks([Track.Source.Camera])\n * ```\n * @example\n * ```ts\n * // Return all subscribed camera tracks as well as placeholders for\n * // participants without a camera subscription.\n * const trackReferencesWithPlaceholders: TrackReferenceOrPlaceholder[] = useTracks([{source: Track.Source.Camera, withPlaceholder: true}])\n * ```\n * @public\n */\nexport function useTracks<T extends SourcesArray = Track.Source[]>(\n  sources: T = [\n    Track.Source.Camera,\n    Track.Source.Microphone,\n    Track.Source.ScreenShare,\n    Track.Source.ScreenShareAudio,\n    Track.Source.Unknown,\n  ] as T,\n  options: UseTracksOptions = {},\n): UseTracksHookReturnType<T> {\n  const room = useEnsureRoom(options.room);\n  const [trackReferences, setTrackReferences] = React.useState<TrackReference[]>([]);\n  const [participants, setParticipants] = React.useState<Participant[]>([]);\n\n  const sources_ = React.useMemo(() => {\n    return sources.map((s) => (isSourceWitOptions(s) ? s.source : s));\n  }, [JSON.stringify(sources)]);\n\n  React.useEffect(() => {\n    const subscription = trackReferencesObservable(room, sources_, {\n      additionalRoomEvents: options.updateOnlyOn,\n      onlySubscribed: options.onlySubscribed,\n    }).subscribe(({ trackReferences, participants }) => {\n      log.debug('setting track bundles', trackReferences, participants);\n      setTrackReferences(trackReferences);\n      setParticipants(participants);\n    });\n    return () => subscription.unsubscribe();\n  }, [\n    room,\n    JSON.stringify(options.onlySubscribed),\n    JSON.stringify(options.updateOnlyOn),\n    JSON.stringify(sources),\n  ]);\n\n  const maybeTrackReferences = React.useMemo(() => {\n    if (isSourcesWithOptions(sources)) {\n      const requirePlaceholder = requiredPlaceholders(sources, participants);\n      const trackReferencesWithPlaceholders: TrackReferenceOrPlaceholder[] =\n        Array.from(trackReferences);\n      participants.forEach((participant) => {\n        if (requirePlaceholder.has(participant.identity)) {\n          const sourcesToAddPlaceholder = requirePlaceholder.get(participant.identity) ?? [];\n          sourcesToAddPlaceholder.forEach((placeholderSource) => {\n            if (\n              trackReferences.find(\n                ({ participant: p, publication }) =>\n                  participant.identity === p.identity && publication.source === placeholderSource,\n              )\n            ) {\n              return;\n            }\n            log.debug(\n              `Add ${placeholderSource} placeholder for participant ${participant.identity}.`,\n            );\n            const placeholder: TrackReferencePlaceholder = {\n              participant,\n              source: placeholderSource,\n            };\n            trackReferencesWithPlaceholders.push(placeholder);\n          });\n        }\n      });\n      return trackReferencesWithPlaceholders;\n    } else {\n      return trackReferences;\n    }\n  }, [trackReferences, participants, sources]);\n\n  return maybeTrackReferences as UseTracksHookReturnType<T>;\n}\n\nfunction difference<T>(setA: Set<T>, setB: Set<T>): Set<T> {\n  const _difference = new Set(setA);\n  for (const elem of setB) {\n    _difference.delete(elem);\n  }\n  return _difference;\n}\n\nexport function requiredPlaceholders<T extends SourcesArray>(\n  sources: T,\n  participants: Participant[],\n): Map<Participant['identity'], Track.Source[]> {\n  const placeholderMap = new Map<Participant['identity'], Track.Source[]>();\n  if (isSourcesWithOptions(sources)) {\n    const sourcesThatNeedPlaceholder = sources\n      .filter((sourceWithOption) => sourceWithOption.withPlaceholder)\n      .map((sourceWithOption) => sourceWithOption.source);\n\n    participants.forEach((participant) => {\n      const sourcesOfSubscribedTracks = participant\n        .getTrackPublications()\n        .map((pub) => pub.track?.source)\n        .filter((trackSource): trackSource is Track.Source => trackSource !== undefined);\n      const placeholderNeededForThisParticipant = Array.from(\n        difference(new Set(sourcesThatNeedPlaceholder), new Set(sourcesOfSubscribedTracks)),\n      );\n      // If the participant needs placeholder add it to the placeholder map.\n      if (placeholderNeededForThisParticipant.length > 0) {\n        placeholderMap.set(participant.identity, placeholderNeededForThisParticipant);\n      }\n    });\n  }\n  return placeholderMap;\n}\n","import type { TrackReferenceOrPlaceholder, TrackSource } from '@livekit/components-core';\nimport { setupMediaTrack, getTrackByIdentifier } from '@livekit/components-core';\nimport * as React from 'react';\nimport { Track } from 'livekit-client';\n\n/**\n * @internal\n */\nexport function useTrackRefBySourceOrName(\n  source: TrackSource<Track.Source>,\n): TrackReferenceOrPlaceholder {\n  const [publication, setPublication] = React.useState(getTrackByIdentifier(source));\n\n  const { trackObserver } = React.useMemo(() => {\n    return setupMediaTrack(source);\n  }, [source.participant.sid ?? source.participant.identity, source.source]);\n\n  React.useEffect(() => {\n    const subscription = trackObserver.subscribe((publication) => {\n      setPublication(publication);\n    });\n    return () => subscription?.unsubscribe();\n  }, [trackObserver]);\n\n  return {\n    participant: source.participant,\n    source: source.source ?? Track.Source.Unknown,\n    publication,\n  };\n}\n","import type { Participant } from 'livekit-client';\nimport { useEnsureParticipant } from '../context';\nimport { useTrackRefBySourceOrName } from './useTrackRefBySourceOrName';\n\n/**\n * This function `useTrackByName` allows you to access a track by referencing its track name.\n * Inside the function, it ensures that the a valid `participant` reference is available by checking\n * for both a passed participant argument and, if not available, a valid participant context.\n *\n * @public\n */\nexport function useTrackByName(name: string, participant?: Participant) {\n  const p = useEnsureParticipant(participant);\n  return useTrackRefBySourceOrName({ name, participant: p });\n}\n","import * as React from 'react';\nimport type { ChatOptions, ReceivedChatMessage } from '@livekit/components-core';\nimport { setupChat } from '@livekit/components-core';\nimport { ConnectionState, Room } from 'livekit-client';\nimport { useEnsureRoom } from '../context';\nimport { useObservableState } from './internal/useObservableState';\nimport { useConnectionState } from './useConnectionStatus';\n\n/**\n * The `useChat` hook provides chat functionality for a LiveKit room.\n *\n * @remarks\n * Message history is not persisted and will be lost if the component is refreshed.\n * You may want to persist message history in the browser, a cache or a database.\n *\n * @returns An object containing:\n * - `chatMessages` - Array of received chat messages\n * - `send` - Function to send a new message\n * - `isSending` - Boolean indicating if a message is currently being sent\n *\n * @example\n * ```tsx\n * function ChatComponent() {\n *   const { chatMessages, send, isSending } = useChat();\n *\n *   return (\n *     <div>\n *       {chatMessages.map((msg) => (\n *         <div key={msg.timestamp}>\n *           {msg.from?.identity}: {msg.message}\n *         </div>\n *       ))}\n *       <button disabled={isSending} onClick={() => send(\"Hello!\")}>\n *         Send Message\n *       </button>\n *     </div>\n *   );\n * }\n * ```\n * @public\n */\nexport function useChat(options?: ChatOptions & { room?: Room }) {\n  const room = useEnsureRoom(options?.room);\n  const connectionState = useConnectionState(room);\n  const isDisconnected = React.useMemo(\n    () => connectionState === ConnectionState.Disconnected,\n    [connectionState],\n  ); // used to reset the messages on room disconnect\n  const setup = React.useMemo<ReturnType<typeof setupChat>>(\n    () => setupChat(room, options),\n    [room, options, isDisconnected],\n  );\n  const isSending = useObservableState(setup.isSendingObservable, false);\n  const chatMessages = useObservableState<ReceivedChatMessage[]>(setup.messageObservable, []);\n\n  return { send: setup.send, chatMessages, isSending };\n}\n","import type { LocalUserChoices } from '@livekit/components-core';\nimport { loadUserChoices, saveUserChoices } from '@livekit/components-core';\nimport * as React from 'react';\n\n/**\n * Options for the `usePersistentDeviceSettings` hook.\n * @alpha\n */\nexport interface UsePersistentUserChoicesOptions {\n  /**\n   * The default value to use if reading from local storage returns no results or fails.\n   */\n  defaults?: Partial<LocalUserChoices>;\n  /**\n   * Whether to prevent saving to persistent storage.\n   * @defaultValue false\n   */\n  preventSave?: boolean;\n  /**\n   * Whether to prevent loading user choices from persistent storage and use `defaults` instead.\n   * @defaultValue false\n   */\n  preventLoad?: boolean;\n}\n\n/**\n * A hook that provides access to user choices stored in local storage, such as\n * selected media devices and their current state (on or off), as well as the user name.\n * @alpha\n */\nexport function usePersistentUserChoices(options: UsePersistentUserChoicesOptions = {}) {\n  const [userChoices, setSettings] = React.useState<LocalUserChoices>(\n    loadUserChoices(options.defaults, options.preventLoad ?? false),\n  );\n\n  const saveAudioInputEnabled = React.useCallback((isEnabled: boolean) => {\n    setSettings((prev) => ({ ...prev, audioEnabled: isEnabled }));\n  }, []);\n  const saveVideoInputEnabled = React.useCallback((isEnabled: boolean) => {\n    setSettings((prev) => ({ ...prev, videoEnabled: isEnabled }));\n  }, []);\n  const saveAudioInputDeviceId = React.useCallback((deviceId: string) => {\n    setSettings((prev) => ({ ...prev, audioDeviceId: deviceId }));\n  }, []);\n  const saveVideoInputDeviceId = React.useCallback((deviceId: string) => {\n    setSettings((prev) => ({ ...prev, videoDeviceId: deviceId }));\n  }, []);\n  const saveUsername = React.useCallback((username: string) => {\n    setSettings((prev) => ({ ...prev, username: username }));\n  }, []);\n\n  React.useEffect(() => {\n    saveUserChoices(userChoices, options.preventSave ?? false);\n  }, [userChoices, options.preventSave]);\n\n  return {\n    userChoices,\n    saveAudioInputEnabled,\n    saveVideoInputEnabled,\n    saveAudioInputDeviceId,\n    saveVideoInputDeviceId,\n    saveUsername,\n  };\n}\n","import * as React from 'react';\nimport { LocalParticipant } from 'livekit-client';\nimport type { Participant, Room } from 'livekit-client';\nimport { encryptionStatusObservable } from '@livekit/components-core';\nimport { useEnsureParticipant, useEnsureRoom } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * @alpha\n */\nexport interface UseIsEncryptedOptions {\n  room?: Room;\n}\n\n/**\n * @alpha\n */\nexport function useIsEncrypted(participant?: Participant, options: UseIsEncryptedOptions = {}) {\n  const p = useEnsureParticipant(participant);\n\n  const room = useEnsureRoom(options.room);\n\n  const observer = React.useMemo(() => encryptionStatusObservable(room, p), [room, p]);\n  const isEncrypted = useObservableState(\n    observer,\n    p.isLocal ? (p as LocalParticipant).isE2EEEnabled : !!p?.isEncrypted,\n  );\n  return isEncrypted;\n}\n","import * as React from 'react';\nimport type { LocalAudioTrack, RemoteAudioTrack, AudioAnalyserOptions } from 'livekit-client';\nimport { Track, createAudioAnalyser } from 'livekit-client';\nimport {\n  type TrackReference,\n  isTrackReference,\n  type TrackReferenceOrPlaceholder,\n} from '@livekit/components-core';\n\n/**\n * @alpha\n * Hook for tracking the volume of an audio track using the Web Audio API.\n */\nexport function useTrackVolume(\n  trackOrTrackReference?: LocalAudioTrack | RemoteAudioTrack | TrackReference,\n  options: AudioAnalyserOptions = { fftSize: 32, smoothingTimeConstant: 0 },\n) {\n  const track = isTrackReference(trackOrTrackReference)\n    ? <LocalAudioTrack | RemoteAudioTrack | undefined>trackOrTrackReference.publication.track\n    : trackOrTrackReference;\n  const [volume, setVolume] = React.useState(0);\n  React.useEffect(() => {\n    if (!track || !track.mediaStream) {\n      return;\n    }\n\n    const { cleanup, analyser } = createAudioAnalyser(track, options);\n\n    const bufferLength = analyser.frequencyBinCount;\n    const dataArray = new Uint8Array(bufferLength);\n\n    const updateVolume = () => {\n      analyser.getByteFrequencyData(dataArray);\n      let sum = 0;\n      for (let i = 0; i < dataArray.length; i++) {\n        const a = dataArray[i];\n        sum += a * a;\n      }\n      setVolume(Math.sqrt(sum / dataArray.length) / 255);\n    };\n\n    const interval = setInterval(updateVolume, 1000 / 30);\n\n    return () => {\n      cleanup();\n      clearInterval(interval);\n    };\n  }, [track, track?.mediaStream, JSON.stringify(options)]);\n\n  return volume;\n}\n\nconst normalizeFrequencies = (frequencies: Float32Array) => {\n  const normalizeDb = (value: number) => {\n    const minDb = -100;\n    const maxDb = -10;\n    let db = 1 - (Math.max(minDb, Math.min(maxDb, value)) * -1) / 100;\n    db = Math.sqrt(db);\n\n    return db;\n  };\n\n  // Normalize all frequency values\n  return frequencies.map((value) => {\n    if (value === -Infinity) {\n      return 0;\n    }\n    return normalizeDb(value);\n  });\n};\n\n/**\n * Interface for configuring options for the useMultibandTrackVolume hook.\n * @alpha\n */\nexport interface MultiBandTrackVolumeOptions {\n  bands?: number;\n  /**\n   * cut off of frequency bins on the lower end\n   * Note: this is not a frequency measure, but in relation to analyserOptions.fftSize,\n   */\n  loPass?: number;\n  /**\n   * cut off of frequency bins on the higher end\n   * Note: this is not a frequency measure, but in relation to analyserOptions.fftSize,\n   */\n  hiPass?: number;\n  /**\n   * update should run every x ms\n   */\n  updateInterval?: number;\n  analyserOptions?: AnalyserOptions;\n}\n\nconst multibandDefaults = {\n  bands: 5,\n  loPass: 100,\n  hiPass: 600,\n  updateInterval: 32,\n  analyserOptions: { fftSize: 2048 },\n} as const satisfies MultiBandTrackVolumeOptions;\n\n/**\n * Hook for tracking the volume of an audio track across multiple frequency bands using the Web Audio API.\n * @alpha\n */\nexport function useMultibandTrackVolume(\n  trackOrTrackReference?: LocalAudioTrack | RemoteAudioTrack | TrackReferenceOrPlaceholder,\n  options: MultiBandTrackVolumeOptions = {},\n) {\n  const track =\n    trackOrTrackReference instanceof Track\n      ? trackOrTrackReference\n      : <LocalAudioTrack | RemoteAudioTrack | undefined>trackOrTrackReference?.publication?.track;\n  const opts = { ...multibandDefaults, ...options };\n  const [frequencyBands, setFrequencyBands] = React.useState<Array<number>>(\n    new Array(opts.bands).fill(0),\n  );\n\n  React.useEffect(() => {\n    if (!track || !track?.mediaStream) {\n      setFrequencyBands((val) => val.slice().fill(0));\n      return;\n    }\n    const { analyser, cleanup } = createAudioAnalyser(track, opts.analyserOptions);\n\n    const bufferLength = analyser.frequencyBinCount;\n    const dataArray = new Float32Array(bufferLength);\n\n    const updateVolume = () => {\n      analyser.getFloatFrequencyData(dataArray);\n      let frequencies: Float32Array = new Float32Array(dataArray.length);\n      for (let i = 0; i < dataArray.length; i++) {\n        frequencies[i] = dataArray[i];\n      }\n      frequencies = frequencies.slice(opts.loPass, opts.hiPass);\n\n      const normalizedFrequencies = normalizeFrequencies(frequencies); // is this needed ?\n      const totalBins = normalizedFrequencies.length;\n      const chunks: Array<number> = [];\n      for (let i = 0; i < opts.bands; i++) {\n        // Use proportional distribution to evenly divide bins across bands\n        const startIndex = Math.floor((i * totalBins) / opts.bands);\n        const endIndex = Math.floor(((i + 1) * totalBins) / opts.bands);\n        const chunk = normalizedFrequencies.slice(startIndex, endIndex);\n        const chunkLength = chunk.length;\n        if (chunkLength === 0) {\n          chunks.push(0);\n        } else {\n          const summedVolumes = chunk.reduce((acc, val) => (acc += val), 0);\n          chunks.push(summedVolumes / chunkLength);\n        }\n      }\n\n      setFrequencyBands(chunks);\n    };\n\n    const interval = setInterval(updateVolume, opts.updateInterval);\n\n    return () => {\n      cleanup();\n      clearInterval(interval);\n    };\n  }, [track, track?.mediaStream, JSON.stringify(options)]);\n\n  return frequencyBands;\n}\n\n/**\n * @alpha\n */\nexport interface AudioWaveformOptions {\n  barCount?: number;\n  volMultiplier?: number;\n  updateInterval?: number;\n}\n\nconst waveformDefaults = {\n  barCount: 120,\n  volMultiplier: 5,\n  updateInterval: 20,\n} as const satisfies AudioWaveformOptions;\n\n/**\n * @alpha\n */\nexport function useAudioWaveform(\n  trackOrTrackReference?: LocalAudioTrack | RemoteAudioTrack | TrackReferenceOrPlaceholder,\n  options: AudioWaveformOptions = {},\n) {\n  const track =\n    trackOrTrackReference instanceof Track\n      ? trackOrTrackReference\n      : <LocalAudioTrack | RemoteAudioTrack | undefined>trackOrTrackReference?.publication?.track;\n  const opts = { ...waveformDefaults, ...options };\n\n  const aggregateWave = React.useRef(new Float32Array());\n  const timeRef = React.useRef(performance.now());\n  const updates = React.useRef(0);\n  const [bars, setBars] = React.useState<number[]>([]);\n\n  const onUpdate = React.useCallback((wave: Float32Array) => {\n    setBars(\n      Array.from(\n        filterData(wave, opts.barCount).map((v) => Math.sqrt(v) * opts.volMultiplier),\n        // wave.slice(0, opts.barCount).map((v) => sigmoid(v * opts.volMultiplier, 0.08, 0.2)),\n      ),\n    );\n  }, []);\n\n  React.useEffect(() => {\n    if (!track || !track?.mediaStream) {\n      return;\n    }\n    const { analyser, cleanup } = createAudioAnalyser(track, {\n      fftSize: getFFTSizeValue(opts.barCount),\n    });\n\n    const bufferLength = getFFTSizeValue(opts.barCount);\n    const dataArray = new Float32Array(bufferLength);\n\n    const update = () => {\n      updateWaveform = requestAnimationFrame(update);\n      analyser.getFloatTimeDomainData(dataArray);\n      aggregateWave.current.map((v, i) => v + dataArray[i]);\n      updates.current += 1;\n\n      if (performance.now() - timeRef.current >= opts.updateInterval) {\n        const newData = dataArray.map((v) => v / updates.current);\n        onUpdate(newData);\n        timeRef.current = performance.now();\n        updates.current = 0;\n      }\n    };\n\n    let updateWaveform = requestAnimationFrame(update);\n\n    return () => {\n      cleanup();\n      cancelAnimationFrame(updateWaveform);\n    };\n  }, [track, track?.mediaStream, JSON.stringify(options), onUpdate]);\n\n  return {\n    bars,\n  };\n}\n\nfunction getFFTSizeValue(x: number) {\n  if (x < 32) return 32;\n  else return pow2ceil(x);\n}\n\n// function sigmoid(x: number, k = 2, s = 0) {\n//   return 1 / (1 + Math.exp(-(x - s) / k));\n// }\n\nfunction pow2ceil(v: number) {\n  let p = 2;\n  while ((v >>= 1)) {\n    p <<= 1;\n  }\n  return p;\n}\n\nfunction filterData(audioData: Float32Array, numSamples: number) {\n  const blockSize = Math.floor(audioData.length / numSamples); // the number of samples in each subdivision\n  const filteredData = new Float32Array(numSamples);\n  for (let i = 0; i < numSamples; i++) {\n    const blockStart = blockSize * i; // the location of the first sample in the block\n    let sum = 0;\n    for (let j = 0; j < blockSize; j++) {\n      sum = sum + Math.abs(audioData[blockStart + j]); // find the sum of all the samples in the block\n    }\n    filteredData[i] = sum / blockSize; // divide the sum by the block size to get the average\n  }\n  return filteredData;\n}\n\n// function normalizeData(audioData: Float32Array) {\n//   const multiplier = Math.pow(Math.max(...audioData), -1);\n//   return audioData.map((n) => n * multiplier);\n// }\n","import * as React from 'react';\nimport type { TrackReference } from '@livekit/components-core';\nimport { participantTracksObservable } from '@livekit/components-core';\nimport { useObservableState } from './internal';\nimport type { Room, Track } from 'livekit-client';\nimport { useMaybeParticipantContext } from '../context';\nimport { useParticipants } from './useParticipants';\n\ntype UseParticipantTracksOptions = {\n  participantIdentity?: string;\n  room?: Room;\n};\n\n/**\n * `useParticipantTracks` is a custom React that allows you to get tracks of a specific participant only, by specifiying the participant's identity.\n * If the participant identity is not passed the hook will try to get the participant from a participant context.\n * @public\n */\nexport function useParticipantTracks<TrackSource extends Track.Source>(\n  sources: Array<TrackSource>,\n  optionsOrParticipantIdentity:\n    | UseParticipantTracksOptions\n    | UseParticipantTracksOptions['participantIdentity'] = {},\n): Array<TrackReference> {\n  let participantIdentity: UseParticipantTracksOptions['participantIdentity'];\n  let room: UseParticipantTracksOptions['room'];\n  if (typeof optionsOrParticipantIdentity === 'string') {\n    participantIdentity = optionsOrParticipantIdentity;\n  } else {\n    participantIdentity = optionsOrParticipantIdentity?.participantIdentity;\n    room = optionsOrParticipantIdentity?.room;\n  }\n\n  const participantContext = useMaybeParticipantContext();\n  const participants = useParticipants({ room, updateOnlyOn: [] });\n\n  const p = React.useMemo(() => {\n    if (participantIdentity) {\n      return participants.find((p) => p.identity === participantIdentity);\n    }\n    return participantContext;\n  }, [participantIdentity, participants, participantContext]);\n\n  const observable = React.useMemo(() => {\n    if (!p) {\n      return undefined;\n    }\n    return participantTracksObservable(p, { sources });\n  }, [p, JSON.stringify(sources)]);\n\n  const trackRefs = useObservableState(observable, [] as Array<TrackReference>);\n\n  return trackRefs;\n}\n","import * as React from 'react';\nimport { type TrackReferenceOrPlaceholder, trackSyncTimeObserver } from '@livekit/components-core';\nimport { useObservableState } from './internal';\n\n/**\n * @internal\n * @deprecated this is an internal hook that's only used by deprecated APIs\n */\nexport function useTrackSyncTime(ref: TrackReferenceOrPlaceholder | undefined) {\n  const observable = React.useMemo(\n    () => (ref?.publication?.track ? trackSyncTimeObserver(ref?.publication.track) : undefined),\n    [ref?.publication?.track],\n  );\n  return useObservableState(observable, {\n    timestamp: Date.now(),\n    rtpTimestamp: ref?.publication?.track?.rtpTimestamp,\n  });\n}\n","import {\n  type ReceivedTranscriptionSegment,\n  addMediaTimestampToTranscription as addTimestampsToTranscription,\n  dedupeSegments,\n  // getActiveTranscriptionSegments,\n  getTrackReferenceId,\n  trackTranscriptionObserver,\n  type TrackReferenceOrPlaceholder,\n  // didActiveSegmentsChange,\n} from '@livekit/components-core';\nimport type { TranscriptionSegment } from 'livekit-client';\nimport * as React from 'react';\nimport { useTrackSyncTime } from './useTrackSyncTime';\n\n/**\n * @alpha\n * @deprecated Use useTranscription instead\n */\nexport interface TrackTranscriptionOptions {\n  /**\n   * how many transcription segments should be buffered in state\n   * @defaultValue 100\n   */\n  bufferSize?: number;\n  /**\n   * optional callback for retrieving newly incoming transcriptions only\n   */\n  onTranscription?: (newSegments: TranscriptionSegment[]) => void;\n  /** amount of time (in ms) that the segment is considered `active` past its original segment duration, defaults to 2_000 */\n  // maxAge?: number;\n}\n\nconst TRACK_TRANSCRIPTION_DEFAULTS = {\n  bufferSize: 100,\n  // maxAge: 2_000,\n} as const satisfies TrackTranscriptionOptions;\n\n/**\n * @returns An object consisting of `segments` with maximum length of opts.bufferSize\n * @alpha\n * @deprecated Use useTranscription instead\n */\nexport function useTrackTranscription(\n  trackRef: TrackReferenceOrPlaceholder | undefined,\n  options?: TrackTranscriptionOptions,\n) {\n  const opts = { ...TRACK_TRANSCRIPTION_DEFAULTS, ...options };\n  const [segments, setSegments] = React.useState<Array<ReceivedTranscriptionSegment>>([]);\n\n  const syncTimestamps = useTrackSyncTime(trackRef);\n  const handleSegmentMessage = (newSegments: TranscriptionSegment[]) => {\n    opts.onTranscription?.(newSegments);\n    setSegments((prevSegments) =>\n      dedupeSegments(\n        prevSegments,\n        // when first receiving a segment, add the current media timestamp to it\n        newSegments.map((s) => addTimestampsToTranscription(s, syncTimestamps)),\n        opts.bufferSize,\n      ),\n    );\n  };\n  React.useEffect(() => {\n    if (!trackRef?.publication) {\n      return;\n    }\n    const subscription = trackTranscriptionObserver(trackRef.publication).subscribe((evt) => {\n      handleSegmentMessage(...evt);\n    });\n    return () => {\n      subscription.unsubscribe();\n    };\n  }, [trackRef && getTrackReferenceId(trackRef), handleSegmentMessage]);\n\n  return { segments };\n}\n","import { participantAttributesObserver } from '@livekit/components-core';\nimport type { Participant } from 'livekit-client';\nimport * as React from 'react';\nimport { useEnsureParticipant, useMaybeParticipantContext } from '../context';\nimport { useObservableState } from './internal';\n\n/**\n * The `useParticipantAttributes` hook returns the attributes of a given participant and allows to set them.\n * It requires a `Participant` object passed as property or via the `ParticipantContext`.\n *\n * @example\n * ```tsx\n * const { attributes } = useParticipantAttributes({ participant });\n * ```\n * @public\n */\nexport interface UseParticipantAttributesOptions {\n  participant?: Participant;\n}\n\n/** @public */\nexport function useParticipantAttributes(props: UseParticipantAttributesOptions = {}) {\n  const participantContext = useMaybeParticipantContext();\n  const p = props.participant ?? participantContext;\n  const attributeObserver = React.useMemo(\n    // weird typescript constraint\n    () => (p ? participantAttributesObserver(p) : participantAttributesObserver(p)),\n    [p],\n  );\n  const attributeState = useObservableState(attributeObserver, {\n    attributes: p?.attributes,\n  });\n\n  return attributeState;\n}\n\n/**\n * The `useParticipantAttribute` hook returns the latest value of a given attribute key of a participant.\n * It requires a `Participant` object passed as property in the `UseParticipantAttributesOptions` or via the `ParticipantContext`.\n *\n * @example\n * ```tsx\n * const myAttributeValue = useParticipantAttribute('targetAttributeName');\n * ```\n * @public\n */\nexport function useParticipantAttribute(\n  attributeKey: string,\n  options: UseParticipantAttributesOptions = {},\n) {\n  const p = useEnsureParticipant(options.participant);\n  const [attribute, setAttribute] = React.useState(p.attributes[attributeKey]);\n\n  React.useEffect(() => {\n    if (!p) {\n      return;\n    }\n    const subscription = participantAttributesObserver(p).subscribe((val) => {\n      if (val.changed[attributeKey] !== undefined) {\n        setAttribute(val.attributes[attributeKey]);\n      }\n    });\n    return () => {\n      subscription.unsubscribe();\n    };\n  }, [p, attributeKey]);\n\n  return attribute;\n}\n","import * as React from 'react';\nimport { ConnectionState, ParticipantKind, Track } from 'livekit-client';\nimport type { RemoteParticipant } from 'livekit-client';\nimport {\n  ParticipantAgentAttributes,\n  type ReceivedTranscriptionSegment,\n  type TrackReference,\n} from '@livekit/components-core';\nimport { useRemoteParticipants } from './useRemoteParticipants';\nimport { useParticipantTracks } from './useParticipantTracks';\nimport { useTrackTranscription } from './useTrackTranscription';\nimport { useConnectionState } from './useConnectionStatus';\nimport { useParticipantAttributes } from './useParticipantAttributes';\nimport { AgentState } from './useAgent';\n\n/**\n * @beta\n */\nexport interface VoiceAssistant {\n  /**\n   * The agent participant.\n   */\n  agent: RemoteParticipant | undefined;\n  /**\n   * The current state of the agent.\n   */\n  state: AgentState;\n  /**\n   * The microphone track published by the agent or associated avatar worker (if any).\n   */\n  audioTrack: TrackReference | undefined;\n  /**\n   * The camera track published by the agent or associated avatar worker (if any).\n   */\n  videoTrack: TrackReference | undefined;\n  /**\n   * The transcriptions of the agent's microphone track (if any).\n   */\n  agentTranscriptions: ReceivedTranscriptionSegment[];\n  /**\n   * The agent's participant attributes.\n   */\n  agentAttributes: RemoteParticipant['attributes'] | undefined;\n}\n\nconst state_attribute = ParticipantAgentAttributes.AgentState;\n\n/**\n * This hook looks for the first agent-participant in the room.\n * @remarks This hook requires an agent running with livekit-agents \\>= 0.9.0\n * @example\n * ```tsx\n * const { state, audioTrack, agentTranscriptions, agentAttributes } = useVoiceAssistant();\n * ```\n * @beta\n */\nexport function useVoiceAssistant(): VoiceAssistant {\n  const remoteParticipants = useRemoteParticipants();\n  const agent = remoteParticipants.find(\n    (p) =>\n      p.kind === ParticipantKind.AGENT &&\n      !(ParticipantAgentAttributes.PublishOnBehalf in p.attributes),\n  );\n  const worker = remoteParticipants.find(\n    (p) =>\n      p.kind === ParticipantKind.AGENT &&\n      p.attributes[ParticipantAgentAttributes.PublishOnBehalf] === agent?.identity,\n  );\n  const agentTracks = useParticipantTracks(\n    [Track.Source.Microphone, Track.Source.Camera],\n    agent?.identity,\n  );\n  const workerTracks = useParticipantTracks(\n    [Track.Source.Microphone, Track.Source.Camera],\n    worker?.identity,\n  );\n  const audioTrack =\n    agentTracks.find((t) => t.source === Track.Source.Microphone) ??\n    workerTracks.find((t) => t.source === Track.Source.Microphone);\n  const videoTrack =\n    agentTracks.find((t) => t.source === Track.Source.Camera) ??\n    workerTracks.find((t) => t.source === Track.Source.Camera);\n  const { segments: agentTranscriptions } = useTrackTranscription(audioTrack);\n  const connectionState = useConnectionState();\n  const { attributes } = useParticipantAttributes({ participant: agent });\n\n  const state: AgentState = React.useMemo(() => {\n    if (connectionState === ConnectionState.Disconnected) {\n      return 'disconnected';\n    } else if (\n      connectionState === ConnectionState.Connecting ||\n      !agent ||\n      !attributes?.[state_attribute]\n    ) {\n      return 'connecting';\n    } else {\n      return attributes[state_attribute] as AgentState;\n    }\n  }, [attributes, agent, connectionState]);\n\n  return {\n    agent,\n    state,\n    audioTrack,\n    videoTrack,\n    agentTranscriptions,\n    agentAttributes: attributes,\n  };\n}\n","import { recordingStatusObservable } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useEnsureRoom } from '../context';\nimport { useObservableState } from './internal';\nimport { useConnectionState } from './useConnectionStatus';\nimport type { Room } from 'livekit-client';\n\n/**\n * The `useIsRecording` hook returns a `boolean` that indicates if the room is currently being recorded.\n * @example\n * ```tsx\n * const isRecording = useIsRecording();\n * ```\n * @public\n */\nexport function useIsRecording(room?: Room) {\n  const r = useEnsureRoom(room);\n  const connectionState = useConnectionState(r);\n  const observable = React.useMemo(() => recordingStatusObservable(r), [r, connectionState]);\n  const isRecording = useObservableState(observable, r.isRecording);\n\n  return isRecording;\n}\n","import * as React from 'react';\nimport { ConnectionState, Room } from 'livekit-client';\nimport { setupTextStream, type TextStreamData } from '@livekit/components-core';\nimport { useEnsureRoom } from '../context';\nimport { useConnectionState } from './useConnectionStatus';\nimport { useObservableState } from './internal';\n\n/** @beta */\nexport type UseTextStreamOptions = {\n  room?: Room;\n};\n\n/**\n * @beta\n * @param topic - the topic to listen to\n * @returns an array of TextStreamData that holds the text, participantInfo, and streamInfo\n * @example\n * ```tsx\n * const { textStreams } = useTextStream('my-topic');\n * return <div>{textStreams.map((textStream) => textStream.text)}</div>;\n * ```\n */\nexport function useTextStream(topic: string, options?: UseTextStreamOptions) {\n  const room = useEnsureRoom(options?.room);\n\n  const connectionState = useConnectionState(room);\n  const isDisconnected = connectionState === ConnectionState.Disconnected;\n\n  const textStreamData = React.useMemo(() => setupTextStream(room, topic), [room, topic]);\n  const textStreamObservable = isDisconnected ? undefined : textStreamData;\n\n  const textStreams = useObservableState<TextStreamData[]>(textStreamObservable, []);\n\n  return { textStreams };\n}\n","import * as React from 'react';\nimport { useTextStream } from './useTextStream';\nimport { DataTopic, ParticipantAgentAttributes } from '@livekit/components-core';\nimport { Room } from 'livekit-client';\n\n/**\n * @beta\n */\nexport interface UseTranscriptionsOptions {\n  room?: Room;\n  participantIdentities?: string[];\n  trackSids?: string[];\n}\n\n/**\n * @beta\n * useTranscriptions is a hook that returns the transcriptions for the given participant identities and track sids,\n * if no options are provided, it will return all transcriptions\n * @example\n * ```tsx\n * const transcriptions = useTranscriptions();\n * return <div>{transcriptions.map((transcription) => transcription.text)}</div>;\n * ```\n */\nexport function useTranscriptions(opts?: UseTranscriptionsOptions) {\n  const { participantIdentities, trackSids } = opts ?? {};\n  const { textStreams } = useTextStream(DataTopic.TRANSCRIPTION, { room: opts?.room });\n\n  const filteredMessages = React.useMemo(\n    () =>\n      textStreams\n        .filter((stream) =>\n          participantIdentities\n            ? participantIdentities.includes(stream.participantInfo.identity)\n            : true,\n        )\n        .filter((stream) =>\n          trackSids\n            ? trackSids.includes(\n                stream.streamInfo.attributes?.[ParticipantAgentAttributes.TranscribedTrackId] ?? '',\n              )\n            : true,\n        ),\n    [textStreams, participantIdentities, trackSids],\n  );\n\n  return filteredMessages;\n}\n","import { Mutex, type Room } from 'livekit-client';\nimport { useCallback, useEffect, useMemo, useRef } from 'react';\nimport { log } from '@livekit/components-core';\n\nconst CONNECT_DISCONNECT_WARNING_THRESHOLD_QUANTITY = 2;\nconst CONNECT_DISCONNECT_WARNING_THRESHOLD_MS = 400;\n\nconst ROOM_CHANGE_WARNING_THRESHOLD_QUANTITY = 3;\nconst ROOM_CHANGE_WARNING_THRESHOLD_MS = 1000;\n\n/** @public */\nexport type UseSequentialRoomConnectDisconnectResults<R extends Room | undefined> = {\n  connect: typeof Room.prototype.connect & (R extends undefined ? null : unknown);\n  disconnect: typeof Room.prototype.disconnect & (R extends undefined ? null : unknown);\n};\n\n/**\n * When calling room.disconnect() as part of a React useEffect cleanup function, it is possible for\n * a room.connect(...) in the effect body to start running while the room.disconnect() is still\n * running. This hook sequentializes these two operations, so they always happen in order and\n * never overlap.\n *\n * @example\n * ```ts\n * const { connect, disconnect } = useSequentialRoomConnectDisconnect(room);\n *\n * // Connecting to a room:\n * useEffect(() => {\n *   connect();\n *   return () => disconnect();\n * }, [connect, disconnect]);\n * ```\n *\n * @public\n */\nexport function useSequentialRoomConnectDisconnect<R extends Room | undefined>(\n  room: R,\n): UseSequentialRoomConnectDisconnectResults<R> {\n  const connectDisconnectQueueRef = useRef<\n    Array<\n      | {\n          type: 'connect';\n          room: Room;\n          args: Parameters<typeof Room.prototype.connect>;\n          resolve: (value: Awaited<ReturnType<typeof Room.prototype.connect>>) => void;\n          reject: (err: Error) => void;\n        }\n      | {\n          type: 'disconnect';\n          room: Room;\n          args: Parameters<typeof Room.prototype.disconnect>;\n          resolve: (value: Awaited<ReturnType<typeof Room.prototype.disconnect>>) => void;\n          reject: (err: Error) => void;\n        }\n    >\n  >([]);\n\n  // Process room connection / disconnection events and execute them in series\n  // The main queue is a ref, so one invocation of this function can continue to process newly added\n  // events\n  const processConnectsAndDisconnectsLock = useMemo(() => new Mutex(), []);\n  const processConnectsAndDisconnects = useCallback(async () => {\n    return processConnectsAndDisconnectsLock.lock().then(async (unlock) => {\n      while (true) {\n        const message = connectDisconnectQueueRef.current.pop();\n        if (!message) {\n          unlock();\n          break;\n        }\n\n        switch (message.type) {\n          case 'connect':\n            await message.room\n              .connect(...message.args)\n              .then(message.resolve)\n              .catch(message.reject);\n            break;\n          case 'disconnect':\n            await message.room\n              .disconnect(...message.args)\n              .then(message.resolve)\n              .catch(message.reject);\n            break;\n        }\n      }\n    });\n  }, []);\n\n  const roomChangedTimesRef = useRef<Array<Date>>([]);\n  const checkRoomThreshold = useCallback((now: Date) => {\n    let roomChangesInThreshold = 0;\n    roomChangedTimesRef.current = roomChangedTimesRef.current.filter((i) => {\n      const isWithinThreshold = now.getTime() - i.getTime() < ROOM_CHANGE_WARNING_THRESHOLD_MS;\n      if (isWithinThreshold) {\n        roomChangesInThreshold += 1;\n      }\n      return isWithinThreshold;\n    });\n\n    if (roomChangesInThreshold > ROOM_CHANGE_WARNING_THRESHOLD_QUANTITY) {\n      log.warn(\n        `useSequentialRoomConnectDisconnect: room changed reference rapidly (over ${ROOM_CHANGE_WARNING_THRESHOLD_QUANTITY}x in ${ROOM_CHANGE_WARNING_THRESHOLD_MS}ms). This is not recommended.`,\n      );\n    }\n  }, []);\n\n  // When the room changes, clear any pending connect / disconnect calls and log when it happened\n  useEffect(() => {\n    connectDisconnectQueueRef.current = [];\n\n    const now = new Date();\n    roomChangedTimesRef.current.push(now);\n    checkRoomThreshold(now);\n  }, [room, checkRoomThreshold]);\n\n  const connectDisconnectEnqueueTimes = useRef<Array<Date>>([]);\n  const checkConnectDisconnectThreshold = useCallback((now: Date) => {\n    let connectDisconnectsInThreshold = 0;\n    connectDisconnectEnqueueTimes.current = connectDisconnectEnqueueTimes.current.filter((i) => {\n      const isWithinThreshold =\n        now.getTime() - i.getTime() < CONNECT_DISCONNECT_WARNING_THRESHOLD_MS;\n      if (isWithinThreshold) {\n        connectDisconnectsInThreshold += 1;\n      }\n      return isWithinThreshold;\n    });\n\n    if (connectDisconnectsInThreshold > CONNECT_DISCONNECT_WARNING_THRESHOLD_QUANTITY) {\n      log.warn(\n        `useSequentialRoomConnectDisconnect: room connect / disconnect occurring in rapid sequence (over ${CONNECT_DISCONNECT_WARNING_THRESHOLD_QUANTITY}x in ${CONNECT_DISCONNECT_WARNING_THRESHOLD_MS}ms). This is not recommended and may be the sign of a bug like a useEffect dependency changing every render.`,\n      );\n    }\n  }, []);\n\n  const connect = useCallback(\n    async (...args: Parameters<typeof Room.prototype.connect>) => {\n      return new Promise((resolve, reject) => {\n        if (!room) {\n          throw new Error('Called connect(), but room was unset');\n        }\n        const now = new Date();\n        checkConnectDisconnectThreshold(now);\n        connectDisconnectQueueRef.current.push({ type: 'connect', room, args, resolve, reject });\n        connectDisconnectEnqueueTimes.current.push(now);\n        processConnectsAndDisconnects();\n      });\n    },\n    [room, checkConnectDisconnectThreshold, processConnectsAndDisconnects],\n  );\n\n  const disconnect = useCallback(\n    async (...args: Parameters<typeof Room.prototype.disconnect>) => {\n      return new Promise((resolve, reject) => {\n        if (!room) {\n          throw new Error('Called discconnect(), but room was unset');\n        }\n        const now = new Date();\n        checkConnectDisconnectThreshold(now);\n        connectDisconnectQueueRef.current.push({ type: 'disconnect', room, args, resolve, reject });\n        connectDisconnectEnqueueTimes.current.push(now);\n        processConnectsAndDisconnects();\n      });\n    },\n    [room, checkConnectDisconnectThreshold, processConnectsAndDisconnects],\n  );\n\n  return {\n    connect: room ? connect : null,\n    disconnect: room ? disconnect : null,\n  } as UseSequentialRoomConnectDisconnectResults<R>;\n}\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n  ? R.apply\n  : function ReflectApply(target, receiver, args) {\n    return Function.prototype.apply.call(target, receiver, args);\n  }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n  ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target)\n      .concat(Object.getOwnPropertySymbols(target));\n  };\n} else {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target);\n  };\n}\n\nfunction ProcessEmitWarning(warning) {\n  if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n  return value !== value;\n}\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n  enumerable: true,\n  get: function() {\n    return defaultMaxListeners;\n  },\n  set: function(arg) {\n    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n      throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n    }\n    defaultMaxListeners = arg;\n  }\n});\n\nEventEmitter.init = function() {\n\n  if (this._events === undefined ||\n      this._events === Object.getPrototypeOf(this)._events) {\n    this._events = Object.create(null);\n    this._eventsCount = 0;\n  }\n\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n    throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n  }\n  this._maxListeners = n;\n  return this;\n};\n\nfunction _getMaxListeners(that) {\n  if (that._maxListeners === undefined)\n    return EventEmitter.defaultMaxListeners;\n  return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n  return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n  var args = [];\n  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n  var doError = (type === 'error');\n\n  var events = this._events;\n  if (events !== undefined)\n    doError = (doError && events.error === undefined);\n  else if (!doError)\n    return false;\n\n  // If there is no 'error' event listener then throw.\n  if (doError) {\n    var er;\n    if (args.length > 0)\n      er = args[0];\n    if (er instanceof Error) {\n      // Note: The comments on the `throw` lines are intentional, they show\n      // up in Node's output if this results in an unhandled exception.\n      throw er; // Unhandled 'error' event\n    }\n    // At least give some kind of context to the user\n    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n    err.context = er;\n    throw err; // Unhandled 'error' event\n  }\n\n  var handler = events[type];\n\n  if (handler === undefined)\n    return false;\n\n  if (typeof handler === 'function') {\n    ReflectApply(handler, this, args);\n  } else {\n    var len = handler.length;\n    var listeners = arrayClone(handler, len);\n    for (var i = 0; i < len; ++i)\n      ReflectApply(listeners[i], this, args);\n  }\n\n  return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n  var m;\n  var events;\n  var existing;\n\n  checkListener(listener);\n\n  events = target._events;\n  if (events === undefined) {\n    events = target._events = Object.create(null);\n    target._eventsCount = 0;\n  } else {\n    // To avoid recursion in the case that type === \"newListener\"! Before\n    // adding it to the listeners, first emit \"newListener\".\n    if (events.newListener !== undefined) {\n      target.emit('newListener', type,\n                  listener.listener ? listener.listener : listener);\n\n      // Re-assign `events` because a newListener handler could have caused the\n      // this._events to be assigned to a new object\n      events = target._events;\n    }\n    existing = events[type];\n  }\n\n  if (existing === undefined) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    existing = events[type] = listener;\n    ++target._eventsCount;\n  } else {\n    if (typeof existing === 'function') {\n      // Adding the second element, need to change to array.\n      existing = events[type] =\n        prepend ? [listener, existing] : [existing, listener];\n      // If we've already got an array, just append.\n    } else if (prepend) {\n      existing.unshift(listener);\n    } else {\n      existing.push(listener);\n    }\n\n    // Check for listener leak\n    m = _getMaxListeners(target);\n    if (m > 0 && existing.length > m && !existing.warned) {\n      existing.warned = true;\n      // No error code for this since it is a Warning\n      // eslint-disable-next-line no-restricted-syntax\n      var w = new Error('Possible EventEmitter memory leak detected. ' +\n                          existing.length + ' ' + String(type) + ' listeners ' +\n                          'added. Use emitter.setMaxListeners() to ' +\n                          'increase limit');\n      w.name = 'MaxListenersExceededWarning';\n      w.emitter = target;\n      w.type = type;\n      w.count = existing.length;\n      ProcessEmitWarning(w);\n    }\n  }\n\n  return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n  return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n    function prependListener(type, listener) {\n      return _addListener(this, type, listener, true);\n    };\n\nfunction onceWrapper() {\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    if (arguments.length === 0)\n      return this.listener.call(this.target);\n    return this.listener.apply(this.target, arguments);\n  }\n}\n\nfunction _onceWrap(target, type, listener) {\n  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n  var wrapped = onceWrapper.bind(state);\n  wrapped.listener = listener;\n  state.wrapFn = wrapped;\n  return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n  checkListener(listener);\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      checkListener(listener);\n      this.prependListener(type, _onceWrap(this, type, listener));\n      return this;\n    };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n    function removeListener(type, listener) {\n      var list, events, position, i, originalListener;\n\n      checkListener(listener);\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      list = events[type];\n      if (list === undefined)\n        return this;\n\n      if (list === listener || list.listener === listener) {\n        if (--this._eventsCount === 0)\n          this._events = Object.create(null);\n        else {\n          delete events[type];\n          if (events.removeListener)\n            this.emit('removeListener', type, list.listener || listener);\n        }\n      } else if (typeof list !== 'function') {\n        position = -1;\n\n        for (i = list.length - 1; i >= 0; i--) {\n          if (list[i] === listener || list[i].listener === listener) {\n            originalListener = list[i].listener;\n            position = i;\n            break;\n          }\n        }\n\n        if (position < 0)\n          return this;\n\n        if (position === 0)\n          list.shift();\n        else {\n          spliceOne(list, position);\n        }\n\n        if (list.length === 1)\n          events[type] = list[0];\n\n        if (events.removeListener !== undefined)\n          this.emit('removeListener', type, originalListener || listener);\n      }\n\n      return this;\n    };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n    function removeAllListeners(type) {\n      var listeners, events, i;\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      // not listening for removeListener, no need to emit\n      if (events.removeListener === undefined) {\n        if (arguments.length === 0) {\n          this._events = Object.create(null);\n          this._eventsCount = 0;\n        } else if (events[type] !== undefined) {\n          if (--this._eventsCount === 0)\n            this._events = Object.create(null);\n          else\n            delete events[type];\n        }\n        return this;\n      }\n\n      // emit removeListener for all listeners on all events\n      if (arguments.length === 0) {\n        var keys = Object.keys(events);\n        var key;\n        for (i = 0; i < keys.length; ++i) {\n          key = keys[i];\n          if (key === 'removeListener') continue;\n          this.removeAllListeners(key);\n        }\n        this.removeAllListeners('removeListener');\n        this._events = Object.create(null);\n        this._eventsCount = 0;\n        return this;\n      }\n\n      listeners = events[type];\n\n      if (typeof listeners === 'function') {\n        this.removeListener(type, listeners);\n      } else if (listeners !== undefined) {\n        // LIFO order\n        for (i = listeners.length - 1; i >= 0; i--) {\n          this.removeListener(type, listeners[i]);\n        }\n      }\n\n      return this;\n    };\n\nfunction _listeners(target, type, unwrap) {\n  var events = target._events;\n\n  if (events === undefined)\n    return [];\n\n  var evlistener = events[type];\n  if (evlistener === undefined)\n    return [];\n\n  if (typeof evlistener === 'function')\n    return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n  return unwrap ?\n    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n  return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n  return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  if (typeof emitter.listenerCount === 'function') {\n    return emitter.listenerCount(type);\n  } else {\n    return listenerCount.call(emitter, type);\n  }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n  var events = this._events;\n\n  if (events !== undefined) {\n    var evlistener = events[type];\n\n    if (typeof evlistener === 'function') {\n      return 1;\n    } else if (evlistener !== undefined) {\n      return evlistener.length;\n    }\n  }\n\n  return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n  var copy = new Array(n);\n  for (var i = 0; i < n; ++i)\n    copy[i] = arr[i];\n  return copy;\n}\n\nfunction spliceOne(list, index) {\n  for (; index + 1 < list.length; index++)\n    list[index] = list[index + 1];\n  list.pop();\n}\n\nfunction unwrapListeners(arr) {\n  var ret = new Array(arr.length);\n  for (var i = 0; i < ret.length; ++i) {\n    ret[i] = arr[i].listener || arr[i];\n  }\n  return ret;\n}\n\nfunction once(emitter, name) {\n  return new Promise(function (resolve, reject) {\n    function errorListener(err) {\n      emitter.removeListener(name, resolver);\n      reject(err);\n    }\n\n    function resolver() {\n      if (typeof emitter.removeListener === 'function') {\n        emitter.removeListener('error', errorListener);\n      }\n      resolve([].slice.call(arguments));\n    };\n\n    eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n    if (name !== 'error') {\n      addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n    }\n  });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n  if (typeof emitter.on === 'function') {\n    eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n  }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n  if (typeof emitter.on === 'function') {\n    if (flags.once) {\n      emitter.once(name, listener);\n    } else {\n      emitter.on(name, listener);\n    }\n  } else if (typeof emitter.addEventListener === 'function') {\n    // EventTarget does not have `error` event semantics like Node\n    // EventEmitters, we do not listen for `error` events here.\n    emitter.addEventListener(name, function wrapListener(arg) {\n      // IE does not have builtin `{ once: true }` support so we\n      // have to do it manually.\n      if (flags.once) {\n        emitter.removeEventListener(name, wrapListener);\n      }\n      listener(arg);\n    });\n  } else {\n    throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n  }\n}\n","import { ParticipantAgentAttributes, TrackReference } from '@livekit/components-core';\nimport { EventEmitter } from 'events';\nimport {\n  ConnectionState,\n  LocalTrackPublication,\n  Participant,\n  ParticipantEvent,\n  ParticipantKind,\n  RemoteParticipant,\n  RoomEvent,\n  Track,\n} from 'livekit-client';\nimport * as React from 'react';\nimport type TypedEventEmitter from 'typed-emitter';\n\nimport { useMaybeSessionContext } from '../context';\nimport { useParticipantInfo } from './useParticipantInfo';\nimport { useParticipantTracks } from './useParticipantTracks';\nimport { useRemoteParticipants } from './useRemoteParticipants';\nimport { UseSessionReturn } from './useSession';\n\n// FIXME: make this 10 seconds once room dispatch booting info is discoverable\nconst DEFAULT_AGENT_CONNECT_TIMEOUT_MILLISECONDS = 20_000;\n\n/** @see https://github.com/livekit/agents/blob/65170238db197f62f479eb7aaef1c0e18bfad6e7/livekit-agents/livekit/agents/voice/events.py#L97 */\ntype AgentSdkStates = 'initializing' | 'idle' | 'listening' | 'thinking' | 'speaking';\n\n/**\n * State representing the current status of the agent, whether it is ready for speach, etc\n *\n * For most agents (which have the preconnect audio buffer feature enabled), this is the lifecycle:\n *   connecting ➡️ pre-connect-buffering ➡️ initializing/listening/thinking/speaking\n *\n * For agents without the preconnect audio feature enabled:\n *   connecting ➡️ initializing ➡️ idle/listening/thinking/speaking\n *\n * If an agent fails to connect:\n *   connecting ➡️ pre-connect-buffering/initializing ➡️ failed\n *\n * Legacy useVoiceAssistant hook:\n *   disconnected ➡️ connecting ➡️ initializing ➡️ listening/thinking/speaking\n *\n * @beta\n * */\nexport type AgentState =\n  | 'disconnected'\n  | 'connecting'\n  | 'pre-connect-buffering'\n  | 'failed'\n  | AgentSdkStates;\n\n/** @beta */\nexport enum AgentEvent {\n  CameraChanged = 'cameraChanged',\n  MicrophoneChanged = 'microphoneChanged',\n  StateChanged = 'stateChanged',\n}\n\n/** @beta */\nexport type AgentCallbacks = {\n  [AgentEvent.CameraChanged]: (newTrack: TrackReference | undefined) => void;\n  [AgentEvent.MicrophoneChanged]: (newTrack: TrackReference | undefined) => void;\n  [AgentEvent.StateChanged]: (newAgentState: AgentState) => void;\n};\n\ntype AgentStateCommon = {\n  // FIXME: maybe add some sort of schema to this?\n  attributes: Participant['attributes'];\n\n  internal: {\n    emitter: TypedEventEmitter<AgentCallbacks>;\n\n    agentParticipant: RemoteParticipant | null;\n    workerParticipant: RemoteParticipant | null;\n  };\n};\n\ntype AgentStateAvailable = AgentStateCommon & {\n  state: 'listening' | 'thinking' | 'speaking';\n  failureReasons: null;\n\n  /** The agent's assigned identity, coming from the JWT token. */\n  identity: Participant['identity'];\n  name: Participant['name'];\n  metadata: Participant['metadata'];\n\n  /** Is the agent connected to the client? */\n  isConnected: true;\n\n  /**\n   * Could the client be listening for user speech?\n   *\n   * Note that this may not mean that the agent is actually connected - the audio pre-connect\n   * buffer could be active and recording user input before the agent actually connects.\n   * */\n  canListen: true;\n\n  /** Has the client disconnected from the agent either for an expected or unexpected reason? */\n  isFinished: false;\n\n  /** Is the agent currently connecting or setting itself up? */\n  isPending: false;\n\n  cameraTrack?: TrackReference;\n  microphoneTrack?: TrackReference;\n};\n\ntype AgentStatePreConnectBuffering = AgentStateCommon & {\n  state: 'pre-connect-buffering';\n  failureReasons: null;\n\n  /** The client's assigned identity, coming from the JWT token. */\n  identity: Participant['identity'];\n  name: Participant['name'];\n  metadata: Participant['metadata'];\n\n  /** Is the agent connected to the client? */\n  isConnected: false;\n\n  /**\n   * Could the client be listening for user speech?\n   *\n   * Note that this may not mean that the agent is actually connected - the audio pre-connect\n   * buffer could be active and recording user input before the agent actually connects.\n   * */\n  canListen: true;\n\n  /** Has the client disconnected from the agent either for an expected or unexpected reason? */\n  isFinished: false;\n\n  /** Is the agent currently connecting or setting itself up? */\n  isPending: false;\n\n  cameraTrack?: TrackReference;\n  microphoneTrack?: TrackReference;\n};\n\ntype AgentStateUnAvailable = AgentStateCommon & {\n  state: 'initializing' | 'idle';\n  failureReasons: null;\n\n  /** The client's assigned identity, coming from the JWT token. */\n  identity: Participant['identity'];\n  name: Participant['name'];\n  metadata: Participant['metadata'];\n\n  /** Is the agent connected to the client? */\n  isConnected: false;\n\n  /**\n   * Could the client be listening for user speech?\n   *\n   * Note that this may not mean that the agent is actually connected - the audio pre-connect\n   * buffer could be active and recording user input before the agent actually connects.\n   * */\n  canListen: false;\n\n  /** Has the client disconnected from the agent either for an expected or unexpected reason? */\n  isFinished: false;\n\n  /** Is the agent currently connecting or setting itself up? */\n  isPending: true;\n\n  cameraTrack?: TrackReference;\n  microphoneTrack?: TrackReference;\n};\n\ntype AgentStateConnecting = AgentStateCommon & {\n  state: 'connecting';\n  failureReasons: null;\n\n  /** The client's assigned identity, coming from the JWT token. */\n  identity: undefined;\n  name: undefined;\n  metadata: undefined;\n\n  /** Is the agent connected to the client? */\n  isConnected: false;\n\n  /**\n   * Could the client be listening for user speech?\n   *\n   * Note that this may not mean that the agent is actually connected - the audio pre-connect\n   * buffer could be active and recording user input before the agent actually connects.\n   * */\n  canListen: false;\n\n  /** Has the client disconnected from the agent either for an expected or unexpected reason? */\n  isFinished: false;\n\n  /** Is the agent currently connecting or setting itself up? */\n  isPending: true;\n\n  cameraTrack: undefined;\n  microphoneTrack: undefined;\n};\n\ntype AgentStateDisconnected = AgentStateCommon & {\n  state: 'disconnected';\n  failureReasons: null;\n\n  /** The client's assigned identity, coming from the JWT token. */\n  identity: undefined;\n  name: undefined;\n  metadata: undefined;\n\n  /** Is the agent connected to the client? */\n  isConnected: false;\n\n  /**\n   * Could the client be listening for user speech?\n   *\n   * Note that this may not mean that the agent is actually connected - the audio pre-connect\n   * buffer could be active and recording user input before the agent actually connects.\n   * */\n  canListen: false;\n\n  /** Has the client disconnected from the agent either for an expected or unexpected reason? */\n  isFinished: true;\n\n  /** Is the agent currently connecting or setting itself up? */\n  isPending: false;\n\n  cameraTrack: undefined;\n  microphoneTrack: undefined;\n};\n\ntype AgentStateFailed = AgentStateCommon & {\n  state: 'failed';\n  failureReasons: Array<string>;\n\n  /** The client's assigned identity, coming from the JWT token. */\n  identity: undefined;\n  name: undefined;\n  metadata: undefined;\n\n  /** Is the agent connected to the client? */\n  isConnected: false;\n\n  /**\n   * Could the client be listening for user speech?\n   *\n   * Note that this may not mean that the agent is actually connected - the audio pre-connect\n   * buffer could be active and recording user input before the agent actually connects.\n   * */\n  canListen: false;\n\n  /** Has the client disconnected from the agent either for an expected or unexpected reason? */\n  isFinished: true;\n\n  /** Is the agent currently connecting or setting itself up? */\n  isPending: false;\n\n  cameraTrack: undefined;\n  microphoneTrack: undefined;\n};\n\ntype AgentActions = {\n  /** Returns a promise that resolves once the agent is connected and available for user input */\n  waitUntilConnected: (signal?: AbortSignal) => Promise<void>;\n\n  /**\n   * Returns a promise that resolves once the client could be listening for user speech (`canListen` is true)\n   *\n   * Note that this may not mean that the agent is actually connected - the audio pre-connect\n   * buffer could be active and recording user input before the agent actually connects.\n   * */\n  waitUntilCouldBeListening: (signal?: AbortSignal) => Promise<void>;\n\n  /** Returns a promise that resolves once the client has disconnected from the agent either for an expected or unexpected reason. */\n  waitUntilFinished: (signal?: AbortSignal) => Promise<void>;\n\n  /** Returns a promise that resolves once the agent has published a camera track */\n  waitUntilCamera: (signal?: AbortSignal) => Promise<TrackReference>;\n\n  /** Returns a promise that resolves once the agent has published a microphone track */\n  waitUntilMicrophone: (signal?: AbortSignal) => Promise<TrackReference>;\n};\n\ntype AgentStateCases =\n  | AgentStateConnecting\n  | AgentStateDisconnected\n  | AgentStateAvailable\n  | AgentStatePreConnectBuffering\n  | AgentStateUnAvailable\n  | AgentStateFailed;\n\n/** @beta */\nexport type UseAgentReturn = AgentStateCases & AgentActions;\n\nconst generateDerivedStateValues = <State extends AgentState>(state: State) =>\n  ({\n    isConnected: state === 'listening' || state === 'thinking' || state === 'speaking',\n    canListen:\n      state === 'pre-connect-buffering' ||\n      state === 'listening' ||\n      state === 'thinking' ||\n      state === 'speaking',\n    isFinished: state === 'disconnected' || state === 'failed',\n    isPending: state === 'connecting' || state === 'initializing' || state === 'idle',\n  }) as {\n    isConnected: State extends 'listening' | 'thinking' | 'speaking' ? true : false;\n    canListen: State extends 'pre-connect-buffering' | 'listening' | 'thinking' | 'speaking'\n      ? true\n      : false;\n    isFinished: State extends 'disconnected' | 'failed' ? true : false;\n    isPending: State extends 'connecting' | 'initializing' | 'idle' ? true : false;\n  };\n\n/** Internal hook used by useSession to store global agent state */\nexport const useAgentTimeoutIdStore = (): {\n  agentTimeoutFailureReason: string | null;\n  startAgentTimeout: (agentConnectTimeoutMilliseconds?: number) => void;\n  clearAgentTimeout: () => void;\n  clearAgentTimeoutFailureReason: () => void;\n  updateAgentTimeoutState: (agentState: AgentState) => void;\n  updateAgentTimeoutParticipantExists: (agentParticipantExists: boolean) => void;\n} => {\n  const [agentTimeoutFailureReason, setAgentTimeoutFailureReason] = React.useState<string | null>(\n    null,\n  );\n  const [agentTimeoutId, setAgentTimeoutId] = React.useState<ReturnType<typeof setTimeout> | null>(\n    null,\n  );\n\n  const agentStateRef = React.useRef<AgentState>('connecting');\n  const agentParticipantExistsRef = React.useRef(false);\n\n  const startAgentConnectedTimeout = (agentConnectTimeoutMilliseconds?: number) => {\n    return setTimeout(() => {\n      if (!agentParticipantExistsRef.current) {\n        setAgentTimeoutFailureReason('Agent did not join the room.');\n        return;\n      }\n\n      const { isConnected } = generateDerivedStateValues(agentStateRef.current);\n      if (!isConnected) {\n        setAgentTimeoutFailureReason('Agent joined the room but did not complete initializing.');\n        return;\n      }\n    }, agentConnectTimeoutMilliseconds ?? DEFAULT_AGENT_CONNECT_TIMEOUT_MILLISECONDS);\n  };\n\n  return {\n    agentTimeoutFailureReason,\n    startAgentTimeout: React.useCallback(\n      (agentConnectTimeoutMilliseconds?: number) => {\n        if (agentTimeoutId) {\n          clearTimeout(agentTimeoutId);\n        }\n\n        setAgentTimeoutFailureReason(null);\n        setAgentTimeoutId(startAgentConnectedTimeout(agentConnectTimeoutMilliseconds));\n        agentStateRef.current = 'connecting';\n        agentParticipantExistsRef.current = false;\n      },\n      [agentTimeoutId],\n    ),\n    clearAgentTimeout: React.useCallback(() => {\n      if (agentTimeoutId) {\n        clearTimeout(agentTimeoutId);\n      }\n\n      setAgentTimeoutFailureReason(null);\n      setAgentTimeoutId(null);\n      agentStateRef.current = 'connecting';\n      agentParticipantExistsRef.current = false;\n    }, [agentTimeoutId]),\n    clearAgentTimeoutFailureReason: React.useCallback(() => {\n      setAgentTimeoutFailureReason(null);\n    }, []),\n\n    updateAgentTimeoutState: React.useCallback((agentState: AgentState) => {\n      agentStateRef.current = agentState;\n    }, []),\n    updateAgentTimeoutParticipantExists: React.useCallback((agentParticipantExists: boolean) => {\n      agentParticipantExistsRef.current = agentParticipantExists;\n    }, []),\n  };\n};\n\ntype SessionStub = Pick<UseSessionReturn, 'connectionState' | 'room' | 'internal'>;\n\n/** Internal hook used by useAgent which generates a function that when called, will return a\n * promise which resolves when agent.isAvailable is enabled. */\nfunction useAgentWaitUntilDerivedStates(\n  emitter: TypedEventEmitter<AgentCallbacks>,\n  state: AgentState,\n) {\n  const stateRef = React.useRef(state);\n  React.useEffect(() => {\n    stateRef.current = state;\n  }, [state]);\n\n  const waitUntilConnected = React.useCallback(\n    async (signal?: AbortSignal) => {\n      const { isConnected } = generateDerivedStateValues(stateRef.current);\n      if (isConnected) {\n        return;\n      }\n\n      return new Promise<void>((resolve, reject) => {\n        const stateChangedHandler = (state: AgentState) => {\n          const { isConnected } = generateDerivedStateValues(state);\n          if (!isConnected) {\n            return;\n          }\n          cleanup();\n          resolve();\n        };\n        const abortHandler = () => {\n          cleanup();\n          reject(new Error('useAgent(/* ... */).waitUntilConnected - signal aborted'));\n        };\n\n        const cleanup = () => {\n          emitter.off(AgentEvent.StateChanged, stateChangedHandler);\n          signal?.removeEventListener('abort', abortHandler);\n        };\n\n        emitter.on(AgentEvent.StateChanged, stateChangedHandler);\n        signal?.addEventListener('abort', abortHandler);\n      });\n    },\n    [emitter],\n  );\n\n  const waitUntilCouldBeListening = React.useCallback(\n    async (signal?: AbortSignal) => {\n      const { canListen } = generateDerivedStateValues(stateRef.current);\n      if (canListen) {\n        return;\n      }\n\n      return new Promise<void>((resolve, reject) => {\n        const stateChangedHandler = (state: AgentState) => {\n          const { canListen } = generateDerivedStateValues(state);\n          if (!canListen) {\n            return;\n          }\n          cleanup();\n          resolve();\n        };\n        const abortHandler = () => {\n          cleanup();\n          reject(new Error('useAgent(/* ... */).waitUntilCouldBeListening - signal aborted'));\n        };\n\n        const cleanup = () => {\n          emitter.off(AgentEvent.StateChanged, stateChangedHandler);\n          signal?.removeEventListener('abort', abortHandler);\n        };\n\n        emitter.on(AgentEvent.StateChanged, stateChangedHandler);\n        signal?.addEventListener('abort', abortHandler);\n      });\n    },\n    [emitter],\n  );\n\n  const waitUntilFinished = React.useCallback(\n    async (signal?: AbortSignal) => {\n      const { isFinished } = generateDerivedStateValues(stateRef.current);\n      if (isFinished) {\n        return;\n      }\n\n      return new Promise<void>((resolve, reject) => {\n        const stateChangedHandler = (state: AgentState) => {\n          const { isFinished } = generateDerivedStateValues(state);\n          if (!isFinished) {\n            return;\n          }\n          cleanup();\n          resolve();\n        };\n        const abortHandler = () => {\n          cleanup();\n          reject(new Error('useAgent(/* ... */).waitUntilFinished - signal aborted'));\n        };\n\n        const cleanup = () => {\n          emitter.off(AgentEvent.StateChanged, stateChangedHandler);\n          signal?.removeEventListener('abort', abortHandler);\n        };\n\n        emitter.on(AgentEvent.StateChanged, stateChangedHandler);\n        signal?.addEventListener('abort', abortHandler);\n      });\n    },\n    [emitter],\n  );\n\n  return { waitUntilConnected, waitUntilCouldBeListening, waitUntilFinished };\n}\n\n/**\n * useAgent encapculates all agent state, normalizing some quirks around how LiveKit Agents work.\n * @beta\n */\nexport function useAgent(session?: SessionStub): UseAgentReturn {\n  const sessionFromContext = useMaybeSessionContext();\n  session = session ?? sessionFromContext;\n  if (!session) {\n    throw new Error(\n      'No session provided, make sure you are inside a Session context or pass the session explicitly',\n    );\n  }\n\n  const {\n    room,\n    internal: {\n      agentConnectTimeoutMilliseconds,\n\n      agentTimeoutFailureReason,\n      startAgentTimeout,\n      clearAgentTimeout,\n      clearAgentTimeoutFailureReason,\n      updateAgentTimeoutState,\n      updateAgentTimeoutParticipantExists,\n    },\n  } = session;\n\n  const emitter = React.useMemo(() => new EventEmitter() as TypedEventEmitter<AgentCallbacks>, []);\n\n  const roomRemoteParticipants = useRemoteParticipants({ room });\n\n  const agentParticipant = React.useMemo(() => {\n    return (\n      roomRemoteParticipants.find(\n        (p) =>\n          p.kind === ParticipantKind.AGENT &&\n          !(ParticipantAgentAttributes.PublishOnBehalf in p.attributes),\n      ) ?? null\n    );\n  }, [roomRemoteParticipants]);\n  const workerParticipant = React.useMemo(() => {\n    if (!agentParticipant) {\n      return null;\n    }\n    return (\n      roomRemoteParticipants.find(\n        (p) =>\n          p.kind === ParticipantKind.AGENT &&\n          p.attributes[ParticipantAgentAttributes.PublishOnBehalf] === agentParticipant.identity,\n      ) ?? null\n    );\n  }, [agentParticipant, roomRemoteParticipants]);\n\n  // 1. Derive attributes directly from the participant object\n  // Reactivity is already provided by useRemoteParticipants via RoomEvent.ParticipantAttributesChanged.\n  const agentParticipantAttributes = agentParticipant?.attributes ?? {};\n\n  // 2. Listen for track updates\n  const agentTracks = useParticipantTracks([Track.Source.Camera, Track.Source.Microphone], {\n    room,\n    participantIdentity: agentParticipant?.identity,\n  });\n  const workerTracks = useParticipantTracks([Track.Source.Camera, Track.Source.Microphone], {\n    room,\n    participantIdentity: workerParticipant?.identity,\n  });\n\n  const videoTrack = React.useMemo(\n    () =>\n      agentTracks.find((t) => t.source === Track.Source.Camera) ??\n      workerTracks.find((t) => t.source === Track.Source.Camera),\n    [agentTracks, workerTracks],\n  );\n  React.useEffect(() => {\n    emitter.emit(AgentEvent.CameraChanged, videoTrack);\n  }, [emitter, videoTrack]);\n\n  const audioTrack = React.useMemo(\n    () =>\n      agentTracks.find((t) => t.source === Track.Source.Microphone) ??\n      workerTracks.find((t) => t.source === Track.Source.Microphone),\n    [agentTracks, workerTracks],\n  );\n  React.useEffect(() => {\n    emitter.emit(AgentEvent.MicrophoneChanged, audioTrack);\n  }, [emitter, audioTrack]);\n\n  // Listen for room connection state updates\n  const [roomConnectionState, setRoomConnectionState] = React.useState(room.state);\n  React.useEffect(() => {\n    const handleConnectionStateChanged = (connectionState: ConnectionState) => {\n      setRoomConnectionState(connectionState);\n    };\n\n    room.on(RoomEvent.ConnectionStateChanged, handleConnectionStateChanged);\n    return () => {\n      room.off(RoomEvent.ConnectionStateChanged, handleConnectionStateChanged);\n    };\n  }, [room]);\n\n  // When the agent participant connects, reset the timeout failure state\n  React.useEffect(() => {\n    if (!agentParticipant) {\n      return;\n    }\n\n    clearAgentTimeoutFailureReason();\n  }, [agentParticipant]);\n\n  // If the agent participant disconnects in the middle of a conversation unexpectedly, mark that as an explicit failure\n  const [agentDisconnectedFailureReason, setAgentDisconnectedFailureReason] = React.useState<\n    string | null\n  >(null);\n  React.useEffect(() => {\n    if (!agentParticipant) {\n      return;\n    }\n\n    const onParticipantDisconnect = (participant: RemoteParticipant) => {\n      if (participant.identity !== agentParticipant?.identity) {\n        return;\n      }\n      setAgentDisconnectedFailureReason('Agent left the room unexpectedly.');\n    };\n\n    room.on(RoomEvent.ParticipantDisconnected, onParticipantDisconnect);\n\n    return () => {\n      room.off(RoomEvent.ParticipantDisconnected, onParticipantDisconnect);\n    };\n  }, [agentParticipant, room]);\n\n  React.useEffect(() => {\n    if (roomConnectionState !== ConnectionState.Disconnected) {\n      return;\n    }\n    // Clear the agent disconnect failure state when the room disconnects\n    setAgentDisconnectedFailureReason(null);\n  }, [roomConnectionState]);\n\n  const [localMicTrack, setLocalMicTrack] = React.useState<LocalTrackPublication | null>(\n    () => room.localParticipant.getTrackPublication(Track.Source.Microphone) ?? null,\n  );\n  React.useEffect(() => {\n    const handleLocalParticipantTrackPublished = () => {\n      setLocalMicTrack(room.localParticipant.getTrackPublication(Track.Source.Microphone) ?? null);\n    };\n    const handleLocalParticipantTrackUnPublished = () => {\n      setLocalMicTrack(null);\n    };\n\n    room.localParticipant.on(\n      ParticipantEvent.LocalTrackPublished,\n      handleLocalParticipantTrackPublished,\n    );\n    room.localParticipant.on(\n      ParticipantEvent.LocalTrackUnpublished,\n      handleLocalParticipantTrackUnPublished,\n    );\n    return () => {\n      room.localParticipant.off(\n        ParticipantEvent.LocalTrackPublished,\n        handleLocalParticipantTrackPublished,\n      );\n      room.localParticipant.off(\n        ParticipantEvent.LocalTrackUnpublished,\n        handleLocalParticipantTrackUnPublished,\n      );\n    };\n  }, [room.localParticipant]);\n\n  const failureReasons = React.useMemo(() => {\n    const reasons = [];\n    if (agentTimeoutFailureReason) {\n      reasons.push(agentTimeoutFailureReason);\n    }\n    if (agentDisconnectedFailureReason) {\n      reasons.push(agentDisconnectedFailureReason);\n    }\n    return reasons;\n  }, [agentTimeoutFailureReason, agentDisconnectedFailureReason]);\n\n  const state = React.useMemo(() => {\n    if (failureReasons.length > 0) {\n      return 'failed';\n    }\n\n    let state: AgentState = 'disconnected';\n\n    if (roomConnectionState !== ConnectionState.Disconnected) {\n      state = 'connecting';\n    }\n\n    // If the microphone preconnect buffer is active, then a special 'pre-connect-buffering' state\n    // is set\n    if (localMicTrack) {\n      state = 'pre-connect-buffering';\n    }\n\n    if (agentParticipant && agentParticipantAttributes[ParticipantAgentAttributes.AgentState]) {\n      state = agentParticipantAttributes[ParticipantAgentAttributes.AgentState] as AgentSdkStates;\n    }\n\n    return state;\n  }, [\n    failureReasons,\n    roomConnectionState,\n    localMicTrack,\n    agentParticipant,\n    agentParticipantAttributes,\n  ]);\n\n  React.useEffect(() => {\n    emitter.emit(AgentEvent.StateChanged, state);\n    updateAgentTimeoutState(state);\n  }, [emitter, state]);\n  React.useEffect(() => {\n    updateAgentTimeoutParticipantExists(agentParticipant !== null);\n  }, [agentParticipant]);\n\n  // When the session room begins connecting, start the agent timeout\n  const isSessionDisconnected = session.connectionState === 'disconnected';\n  React.useEffect(() => {\n    if (isSessionDisconnected) {\n      return;\n    }\n\n    startAgentTimeout(agentConnectTimeoutMilliseconds);\n    return () => {\n      clearAgentTimeout();\n    };\n  }, [isSessionDisconnected, agentConnectTimeoutMilliseconds]);\n\n  const {\n    identity: agentParticipantIdentity,\n    name: agentParticipantName,\n    metadata: agentParticipantMetadata,\n  } = useParticipantInfo({ participant: agentParticipant ?? undefined });\n\n  const agentState: AgentStateCases = React.useMemo(() => {\n    const common: AgentStateCommon = {\n      attributes: agentParticipantAttributes,\n\n      internal: {\n        agentParticipant,\n        workerParticipant,\n        emitter,\n      },\n    };\n\n    switch (state) {\n      case 'disconnected':\n        return {\n          ...common,\n          identity: undefined,\n          name: undefined,\n          metadata: undefined,\n\n          state,\n          ...generateDerivedStateValues(state),\n          failureReasons: null,\n\n          // Clear inner values if no longer connected\n          cameraTrack: undefined,\n          microphoneTrack: undefined,\n        };\n\n      case 'connecting':\n        return {\n          ...common,\n          identity: undefined,\n          name: undefined,\n          metadata: undefined,\n\n          state,\n          ...generateDerivedStateValues(state),\n          failureReasons: null,\n\n          // Clear inner values if no longer connected\n          cameraTrack: undefined,\n          microphoneTrack: undefined,\n        };\n\n      case 'initializing':\n      case 'idle':\n        return {\n          ...common,\n          identity: agentParticipantIdentity!,\n          name: agentParticipantName,\n          metadata: agentParticipantMetadata,\n\n          state,\n          ...generateDerivedStateValues(state),\n          failureReasons: null,\n\n          cameraTrack: videoTrack,\n          microphoneTrack: audioTrack,\n        };\n\n      case 'pre-connect-buffering':\n        return {\n          ...common,\n          identity: agentParticipantIdentity!,\n          name: agentParticipantName,\n          metadata: agentParticipantMetadata,\n\n          state,\n          ...generateDerivedStateValues(state),\n          failureReasons: null,\n\n          cameraTrack: videoTrack,\n          microphoneTrack: audioTrack,\n        };\n\n      case 'listening':\n      case 'thinking':\n      case 'speaking':\n        return {\n          ...common,\n          identity: agentParticipantIdentity!,\n          name: agentParticipantName,\n          metadata: agentParticipantMetadata,\n\n          state,\n          ...generateDerivedStateValues(state),\n          failureReasons: null,\n\n          cameraTrack: videoTrack,\n          microphoneTrack: audioTrack,\n        };\n\n      case 'failed':\n        return {\n          ...common,\n          identity: undefined,\n          name: undefined,\n          metadata: undefined,\n\n          state: 'failed',\n          ...generateDerivedStateValues('failed'),\n          failureReasons,\n\n          // Clear inner values if no longer connected\n          cameraTrack: undefined,\n          microphoneTrack: undefined,\n        };\n    }\n  }, [\n    agentParticipantIdentity,\n    agentParticipantName,\n    agentParticipantMetadata,\n    agentParticipantAttributes,\n    emitter,\n    agentParticipant,\n    state,\n    videoTrack,\n    audioTrack,\n  ]);\n\n  const { waitUntilConnected, waitUntilCouldBeListening, waitUntilFinished } =\n    useAgentWaitUntilDerivedStates(emitter, state);\n\n  const waitUntilCamera = React.useCallback(\n    (signal?: AbortSignal) => {\n      return new Promise<TrackReference>((resolve, reject) => {\n        const stateChangedHandler = (camera: TrackReference | undefined) => {\n          if (!camera) {\n            return;\n          }\n          cleanup();\n          resolve(camera);\n        };\n        const abortHandler = () => {\n          cleanup();\n          reject(new Error('useAgent(/* ... */).waitUntilCamera - signal aborted'));\n        };\n\n        const cleanup = () => {\n          emitter.off(AgentEvent.CameraChanged, stateChangedHandler);\n          signal?.removeEventListener('abort', abortHandler);\n        };\n\n        emitter.on(AgentEvent.CameraChanged, stateChangedHandler);\n        signal?.addEventListener('abort', abortHandler);\n      });\n    },\n    [emitter],\n  );\n\n  const waitUntilMicrophone = React.useCallback(\n    (signal?: AbortSignal) => {\n      return new Promise<TrackReference>((resolve, reject) => {\n        const stateChangedHandler = (microphone: TrackReference | undefined) => {\n          if (!microphone) {\n            return;\n          }\n          cleanup();\n          resolve(microphone);\n        };\n        const abortHandler = () => {\n          cleanup();\n          reject(new Error('useAgent(/* ... */).waitUntilMicrophone - signal aborted'));\n        };\n\n        const cleanup = () => {\n          emitter.off(AgentEvent.MicrophoneChanged, stateChangedHandler);\n          signal?.removeEventListener('abort', abortHandler);\n        };\n\n        emitter.on(AgentEvent.MicrophoneChanged, stateChangedHandler);\n        signal?.addEventListener('abort', abortHandler);\n      });\n    },\n    [emitter],\n  );\n\n  return React.useMemo(() => {\n    return {\n      ...agentState,\n      waitUntilConnected,\n      waitUntilCouldBeListening,\n      waitUntilFinished,\n      waitUntilCamera,\n      waitUntilMicrophone,\n    };\n  }, [\n    agentState,\n    waitUntilConnected,\n    waitUntilCouldBeListening,\n    waitUntilFinished,\n    waitUntilCamera,\n    waitUntilMicrophone,\n  ]);\n}\n","import * as React from 'react';\nimport type TypedEventEmitter from 'typed-emitter';\nimport {\n  Room,\n  RoomEvent,\n  ConnectionState,\n  TrackPublishOptions,\n  Track,\n  TokenSourceConfigurable,\n  TokenSourceFixed,\n  TokenSourceFetchOptions,\n  RoomConnectOptions,\n  decodeTokenPayload,\n  BaseKeyProvider,\n  RoomOptions,\n  ExternalE2EEKeyProvider,\n  type BaseE2EEManager,\n} from 'livekit-client';\nimport { EventEmitter } from 'events';\n\nimport { useMaybeRoomContext } from '../context';\nimport { AgentState, useAgent, useAgentTimeoutIdStore } from './useAgent';\nimport { TrackReference, log } from '@livekit/components-core';\nimport { useLocalParticipant } from './useLocalParticipant';\n\n/** @beta */\nexport enum SessionEvent {\n  ConnectionStateChanged = 'connectionStateChanged',\n  /**\n   * Emits when an error is encountered while attempting to create a track.\n   * Use MediaDeviceFailure.getFailure(error) to get the reason of failure.\n   * args: (error: Error, kind: MediaDeviceKind)\n   */\n  MediaDevicesError = 'mediaDevicesError',\n  /**\n   * Emits when an error is received while decrypting frame received frame information.\n   * args: (error: Error)\n   */\n  EncryptionError = 'encryptionError',\n}\n\n/** @beta */\nexport type SessionCallbacks = {\n  [SessionEvent.ConnectionStateChanged]: (newAgentConnectionState: ConnectionState) => void;\n  [SessionEvent.MediaDevicesError]: (error: Error) => void;\n  [SessionEvent.EncryptionError]: (error: Error) => void;\n};\n\n/** @beta */\nexport type SessionConnectOptions = {\n  /** Optional abort signal which if triggered will terminate connecting even if it isn't complete */\n  signal?: AbortSignal;\n\n  tracks?: {\n    microphone?: {\n      enabled?: boolean;\n      publishOptions?: TrackPublishOptions;\n    };\n    camera?: {\n      enabled?: boolean;\n      publishOptions?: TrackPublishOptions;\n    };\n    screenShare?: {\n      enabled?: boolean;\n      publishOptions?: TrackPublishOptions;\n    };\n  };\n\n  /** Options for Room.connect(.., .., opts) */\n  roomConnectOptions?: RoomConnectOptions;\n};\n\n/** @beta */\nexport type SwitchActiveDeviceOptions = {\n  /**\n   *  If true, adds an `exact` constraint to the getUserMedia request.\n   *  The request will fail if this option is true and the device specified is not actually available\n   */\n  exact?: boolean;\n};\n\ntype SessionStateCommon = {\n  room: Room;\n  internal: {\n    emitter: TypedEventEmitter<SessionCallbacks>;\n    tokenSource: TokenSourceConfigurable | TokenSourceFixed;\n    agentConnectTimeoutMilliseconds?: number;\n\n    agentTimeoutFailureReason: string | null;\n    startAgentTimeout: (agentConnectTimeoutMilliseconds?: number) => void;\n    clearAgentTimeout: () => void;\n    clearAgentTimeoutFailureReason: () => void;\n    updateAgentTimeoutState: (agentState: AgentState) => void;\n    updateAgentTimeoutParticipantExists: (agentParticipantExists: boolean) => void;\n  };\n};\n\ntype SessionStateConnecting = SessionStateCommon & {\n  connectionState: ConnectionState.Connecting;\n  isConnected: false;\n\n  local: {\n    cameraTrack: undefined;\n    microphoneTrack: undefined;\n    screenShareTrack: undefined;\n  };\n};\n\ntype SessionStateConnected = SessionStateCommon & {\n  connectionState:\n    | ConnectionState.Connected\n    | ConnectionState.Reconnecting\n    | ConnectionState.SignalReconnecting;\n  isConnected: true;\n\n  local: {\n    cameraTrack?: TrackReference;\n    microphoneTrack?: TrackReference;\n    screenShareTrack?: TrackReference;\n  };\n};\n\ntype SessionStateDisconnected = SessionStateCommon & {\n  connectionState: ConnectionState.Disconnected;\n  isConnected: false;\n\n  local: {\n    cameraTrack: undefined;\n    microphoneTrack: undefined;\n    screenShareTrack: undefined;\n  };\n};\n\ntype SessionActions = {\n  /** Returns a promise that resolves once the room connects. */\n  waitUntilConnected: (signal?: AbortSignal) => Promise<void>;\n  /** Returns a promise that resolves once the room disconnects */\n  waitUntilDisconnected: (signal?: AbortSignal) => Promise<void>;\n\n  prepareConnection: () => Promise<void>;\n\n  /** Connect to the underlying room and dispatch any agents */\n  start: (options?: SessionConnectOptions) => Promise<void>;\n\n  /** Disconnect from the underlying room */\n  end: () => Promise<void>;\n\n  /** Enable or disable E2EE. */\n  setEncryptionEnabled: (enabled: boolean) => Promise<void>;\n};\n\n/** @beta */\nexport type UseSessionReturn = (\n  | SessionStateConnecting\n  | SessionStateConnected\n  | SessionStateDisconnected\n) &\n  SessionActions;\n\n/** @internal */\nexport function isUseSessionReturn(value: unknown): value is UseSessionReturn {\n  return (\n    typeof value === 'object' &&\n    value !== null &&\n    'room' in value &&\n    'connectionState' in value &&\n    'internal' in value\n  );\n}\n\ntype UseSessionCommonOptions = {\n  /**\n   * Amount of time in milliseonds the system will wait for an agent to join the room, before\n   * transitioning to the \"failure\" state.\n   */\n  agentConnectTimeoutMilliseconds?: number;\n};\n\ntype UseSessionWithRoomOptions = {\n  room: Room;\n  encryption?: never;\n};\n\ntype UseSessionEncryptionOptions =\n  | {\n      /**\n       * Accepts a passphrase that's used to create the crypto keys.\n       * When passing in a string, PBKDF2 is used. (recommended for maximum compatibility across SDKs)\n       * When passing in an ArrayBuffer of cryptographically random numbers, HKDF is used.\n       *\n       * Note: Not all client SDKs support HKDF.\n       */\n      key: string | ArrayBuffer | BaseKeyProvider;\n\n      /** An instance of the E2EE webworker, which must be constructed using your js build tool's\n       * webworker construction mechanism. */\n      worker: Worker;\n\n      e2eeManager?: undefined;\n    }\n  | {\n      key?: undefined;\n      worker?: undefined;\n      /**\n       * For React Native usage: Pass the e2eeManager obtained from the `useRNE2EEManager()` hook\n       * in the `\\@livekit/react-native` package.\n       */\n      e2eeManager: BaseE2EEManager;\n    }\n  | {\n      key?: undefined;\n      worker?: undefined;\n      e2eeManager?: undefined;\n    };\n\ntype UseSessionWithoutRoomOptions = {\n  // NOTE: This must be here to make typescript go down this discriminated union branch when\n  // \"room\" is omitted.\n  room?: never;\n\n  /** Configuration for room-level E2EE */\n  encryption?: UseSessionEncryptionOptions;\n};\n\ntype UseSessionRoomOptions = UseSessionWithRoomOptions | UseSessionWithoutRoomOptions;\n\ntype UseSessionConfigurableOptions = UseSessionCommonOptions &\n  UseSessionRoomOptions &\n  TokenSourceFetchOptions;\ntype UseSessionFixedOptions = UseSessionCommonOptions & UseSessionRoomOptions;\n\n/**\n * Given two TokenSourceFetchOptions values, check to see if they are deep equal.\n *\n * FIXME: swap this for an import from livekit-client once\n * https://github.com/livekit/client-sdk-js/pull/1733 is merged and published!\n * */\nfunction areTokenSourceFetchOptionsEqual(a: TokenSourceFetchOptions, b: TokenSourceFetchOptions) {\n  const allKeysSet = new Set([...Object.keys(a), ...Object.keys(b)]) as Set<\n    keyof TokenSourceFetchOptions\n  >;\n\n  for (const key of allKeysSet) {\n    switch (key) {\n      case 'roomName':\n      case 'participantName':\n      case 'participantIdentity':\n      case 'participantMetadata':\n      case 'participantAttributes':\n      case 'agentName':\n      case 'agentMetadata':\n        if (a[key] !== b[key]) {\n          return false;\n        }\n        break;\n      default:\n        // ref: https://stackoverflow.com/a/58009992\n        const exhaustiveCheckedKey: never = key;\n        throw new Error(`Options key ${exhaustiveCheckedKey} not being checked for equality!`);\n    }\n  }\n\n  return true;\n}\n\n/** Internal hook used by useSession to manage creating a function which can be used to wait\n * until the session is in a given state before resolving. */\nfunction useSessionWaitUntilConnectionState(\n  emitter: TypedEventEmitter<SessionCallbacks>,\n  connectionState: UseSessionReturn['connectionState'],\n) {\n  const connectionStateRef = React.useRef(connectionState);\n  React.useEffect(() => {\n    connectionStateRef.current = connectionState;\n  }, [connectionState]);\n\n  const waitUntilConnectionState = React.useCallback(\n    async (state: UseSessionReturn['connectionState'], signal?: AbortSignal) => {\n      if (connectionStateRef.current === state) {\n        return;\n      }\n\n      return new Promise<void>((resolve, reject) => {\n        const onceEventOccurred = (newState: UseSessionReturn['connectionState']) => {\n          if (newState !== state) {\n            return;\n          }\n          cleanup();\n          resolve();\n        };\n        const abortHandler = () => {\n          cleanup();\n          reject(\n            new Error(\n              `useSession(/* ... */).waitUntilConnectionState(${state}, /* signal */) - signal aborted`,\n            ),\n          );\n        };\n\n        const cleanup = () => {\n          emitter.off(SessionEvent.ConnectionStateChanged, onceEventOccurred);\n          signal?.removeEventListener('abort', abortHandler);\n        };\n\n        emitter.on(SessionEvent.ConnectionStateChanged, onceEventOccurred);\n        signal?.addEventListener('abort', abortHandler);\n      });\n    },\n    [emitter],\n  );\n\n  return waitUntilConnectionState;\n}\n\n/** Internal hook used by useSession to manage creating a function that properly invokes\n * tokenSource.fetch(...) with any fetch options */\nfunction useSessionTokenSourceFetch(\n  tokenSource: TokenSourceConfigurable | TokenSourceFixed,\n  unstableRestOptions: Exclude<UseSessionConfigurableOptions, keyof UseSessionCommonOptions>,\n) {\n  const isConfigurable = tokenSource instanceof TokenSourceConfigurable;\n\n  const memoizedTokenFetchOptionsRef = React.useRef<TokenSourceFetchOptions | null>(\n    isConfigurable ? unstableRestOptions : null,\n  );\n\n  React.useEffect(() => {\n    if (!isConfigurable) {\n      memoizedTokenFetchOptionsRef.current = null;\n      return;\n    }\n\n    if (\n      memoizedTokenFetchOptionsRef.current !== null &&\n      areTokenSourceFetchOptionsEqual(memoizedTokenFetchOptionsRef.current, unstableRestOptions)\n    ) {\n      return;\n    }\n    memoizedTokenFetchOptionsRef.current = unstableRestOptions;\n  }, [isConfigurable, unstableRestOptions]);\n\n  const tokenSourceFetch = React.useCallback(\n    async (force?: boolean) => {\n      if (isConfigurable) {\n        if (!memoizedTokenFetchOptionsRef.current) {\n          throw new Error(\n            `AgentSession - memoized token fetch options are not set, but the passed tokenSource was an instance of TokenSourceConfigurable. If you are seeing this please make a new GitHub issue!`,\n          );\n        }\n        return tokenSource.fetch(memoizedTokenFetchOptionsRef.current, force);\n      } else {\n        return tokenSource.fetch();\n      }\n    },\n    [isConfigurable, tokenSource],\n  );\n\n  return tokenSourceFetch;\n}\n\n/**\n * A Session represents a managed connection to a Room which can contain Agents.\n * @beta\n */\nexport function useSession(\n  tokenSource: TokenSourceConfigurable,\n  options?: UseSessionConfigurableOptions,\n): UseSessionReturn;\n/**\n * A Session represents a managed connection to a Room which can contain Agents.\n * @beta\n */\nexport function useSession(\n  tokenSource: TokenSourceFixed,\n  options?: UseSessionFixedOptions,\n): UseSessionReturn;\nexport function useSession(\n  tokenSource: TokenSourceConfigurable | TokenSourceFixed,\n  options: UseSessionConfigurableOptions | UseSessionFixedOptions = {},\n): UseSessionReturn {\n  const {\n    room: optionsRoom,\n    agentConnectTimeoutMilliseconds,\n    encryption: unstableEncryption,\n    ...unstableRestOptions\n  } = options;\n\n  const encryptionE2eeManager =\n    unstableEncryption && 'e2eeManager' in unstableEncryption\n      ? unstableEncryption.e2eeManager\n      : null;\n  const encryptionKey =\n    unstableEncryption && !('e2eeManager' in unstableEncryption)\n      ? (unstableEncryption.key ?? null)\n      : null;\n  const encryptionWorker =\n    unstableEncryption && !('e2eeManager' in unstableEncryption)\n      ? (unstableEncryption.worker ?? null)\n      : null;\n\n  const roomFromContext = useMaybeRoomContext();\n\n  const externalKeyProviderRef = React.useRef<ExternalE2EEKeyProvider | null>(null);\n\n  const keyProvider = React.useMemo(() => {\n    if (typeof encryptionKey === 'string' || encryptionKey instanceof ArrayBuffer) {\n      if (externalKeyProviderRef.current === null) {\n        externalKeyProviderRef.current = new ExternalE2EEKeyProvider();\n      }\n      externalKeyProviderRef.current.setKey(encryptionKey).catch((e) => log.error(e));\n      return externalKeyProviderRef.current;\n    } else {\n      return encryptionKey;\n    }\n  }, [encryptionKey]);\n\n  const room = React.useMemo(() => {\n    const preGeneratedRoom = roomFromContext ?? optionsRoom;\n    if (preGeneratedRoom) {\n      return preGeneratedRoom;\n    }\n\n    const encryptionViaWorker = !!(keyProvider && encryptionWorker);\n    const encryptionViaManager = !!encryptionE2eeManager;\n    const encryptionEnabled = encryptionViaWorker || encryptionViaManager;\n\n    const roomOptions: RoomOptions = {};\n    if (encryptionViaWorker) {\n      roomOptions.encryption = {\n        keyProvider,\n        worker: encryptionWorker,\n      };\n    } else if (encryptionViaManager) {\n      roomOptions.encryption = {\n        e2eeManager: encryptionE2eeManager,\n      };\n    } else if (unstableEncryption !== undefined) {\n      log.warn(\n        'useSession options encryption was set, but neither encryption.key with encryption.worker nor encryption.e2eeManager was provided.',\n      );\n    }\n    const room = new Room(roomOptions);\n    if (encryptionEnabled) {\n      room.setE2EEEnabled(true);\n    }\n    return room;\n  }, [roomFromContext, optionsRoom, keyProvider, encryptionWorker, encryptionE2eeManager]);\n\n  React.useEffect(() => {\n    return () => {\n      room.disconnect();\n    };\n  }, [room]);\n\n  const emitter = React.useMemo(\n    () => new EventEmitter() as TypedEventEmitter<SessionCallbacks>,\n    [],\n  );\n\n  const generateDerivedConnectionStateValues = React.useCallback(\n    <State extends UseSessionReturn['connectionState']>(connectionState: State) =>\n      ({\n        isConnected:\n          connectionState === ConnectionState.Connected ||\n          connectionState === ConnectionState.Reconnecting ||\n          connectionState === ConnectionState.SignalReconnecting,\n      }) as {\n        isConnected: State extends\n          | ConnectionState.Connected\n          | ConnectionState.Reconnecting\n          | ConnectionState.SignalReconnecting\n          ? true\n          : false;\n      },\n    [],\n  );\n\n  const [roomConnectionState, setRoomConnectionState] = React.useState(room.state);\n  React.useEffect(() => {\n    const handleConnectionStateChanged = (connectionState: ConnectionState) => {\n      setRoomConnectionState(connectionState);\n    };\n\n    room.on(RoomEvent.ConnectionStateChanged, handleConnectionStateChanged);\n    return () => {\n      room.off(RoomEvent.ConnectionStateChanged, handleConnectionStateChanged);\n    };\n  }, [room]);\n\n  React.useEffect(() => {\n    const handleMediaDevicesError = async (error: Error) => {\n      emitter.emit(SessionEvent.MediaDevicesError, error);\n    };\n\n    room.on(RoomEvent.MediaDevicesError, handleMediaDevicesError);\n    return () => {\n      room.off(RoomEvent.MediaDevicesError, handleMediaDevicesError);\n    };\n  }, [room, emitter]);\n\n  React.useEffect(() => {\n    const handleEncryptionError = async (error: Error) => {\n      emitter.emit(SessionEvent.EncryptionError, error);\n    };\n\n    room.on(RoomEvent.EncryptionError, handleEncryptionError);\n    return () => {\n      room.off(RoomEvent.EncryptionError, handleEncryptionError);\n    };\n  }, [room, emitter]);\n\n  const { localParticipant } = useLocalParticipant({ room });\n  const cameraPublication = localParticipant.getTrackPublication(Track.Source.Camera);\n  const localCamera = React.useMemo(() => {\n    if (!cameraPublication) {\n      return undefined;\n    }\n    return {\n      source: Track.Source.Camera,\n      participant: localParticipant,\n      publication: cameraPublication,\n    };\n  }, [localParticipant, cameraPublication]);\n  const microphonePublication = localParticipant.getTrackPublication(Track.Source.Microphone);\n  const localMicrophone = React.useMemo(() => {\n    if (!microphonePublication) {\n      return undefined;\n    }\n    return {\n      source: Track.Source.Microphone,\n      participant: localParticipant,\n      publication: microphonePublication,\n    };\n  }, [localParticipant, microphonePublication]);\n  const screenSharePublication = localParticipant.getTrackPublication(Track.Source.ScreenShare);\n  const localScreenShare = React.useMemo(() => {\n    if (!screenSharePublication) {\n      return undefined;\n    }\n    return {\n      source: Track.Source.ScreenShare,\n      participant: localParticipant,\n      publication: screenSharePublication,\n    };\n  }, [localParticipant, screenSharePublication]);\n\n  const {\n    agentTimeoutFailureReason,\n    startAgentTimeout,\n    clearAgentTimeout,\n    clearAgentTimeoutFailureReason,\n    updateAgentTimeoutState,\n    updateAgentTimeoutParticipantExists,\n  } = useAgentTimeoutIdStore();\n\n  const sessionInternal: UseSessionReturn['internal'] = React.useMemo(\n    () => ({\n      emitter,\n      tokenSource,\n      agentConnectTimeoutMilliseconds,\n\n      agentTimeoutFailureReason,\n      startAgentTimeout,\n      clearAgentTimeout,\n      clearAgentTimeoutFailureReason,\n      updateAgentTimeoutState,\n      updateAgentTimeoutParticipantExists,\n    }),\n    [\n      emitter,\n      agentConnectTimeoutMilliseconds,\n      tokenSource,\n      agentTimeoutFailureReason,\n      startAgentTimeout,\n      clearAgentTimeout,\n      clearAgentTimeoutFailureReason,\n      updateAgentTimeoutState,\n      updateAgentTimeoutParticipantExists,\n    ],\n  );\n\n  const conversationState = React.useMemo(():\n    | SessionStateConnecting\n    | SessionStateConnected\n    | SessionStateDisconnected => {\n    const common: SessionStateCommon = {\n      room,\n      internal: sessionInternal,\n    };\n\n    switch (roomConnectionState) {\n      case ConnectionState.Connecting:\n        return {\n          ...common,\n\n          connectionState: ConnectionState.Connecting,\n          ...generateDerivedConnectionStateValues(ConnectionState.Connecting),\n\n          local: {\n            cameraTrack: undefined,\n            microphoneTrack: undefined,\n            screenShareTrack: undefined,\n          },\n        };\n\n      case ConnectionState.Connected:\n      case ConnectionState.Reconnecting:\n      case ConnectionState.SignalReconnecting:\n        return {\n          ...common,\n\n          connectionState: roomConnectionState,\n          ...generateDerivedConnectionStateValues(roomConnectionState),\n\n          local: {\n            cameraTrack: localCamera,\n            microphoneTrack: localMicrophone,\n            screenShareTrack: localScreenShare,\n          },\n        };\n\n      case ConnectionState.Disconnected:\n        return {\n          ...common,\n\n          connectionState: ConnectionState.Disconnected,\n          ...generateDerivedConnectionStateValues(ConnectionState.Disconnected),\n\n          local: {\n            cameraTrack: undefined,\n            microphoneTrack: undefined,\n            screenShareTrack: undefined,\n          },\n        };\n    }\n  }, [\n    sessionInternal,\n    room,\n    roomConnectionState,\n    localCamera,\n    localMicrophone,\n    generateDerivedConnectionStateValues,\n  ]);\n  React.useEffect(() => {\n    emitter.emit(SessionEvent.ConnectionStateChanged, conversationState.connectionState);\n  }, [emitter, conversationState.connectionState]);\n\n  const waitUntilConnectionState = useSessionWaitUntilConnectionState(\n    emitter,\n    conversationState.connectionState,\n  );\n\n  const waitUntilConnected = React.useCallback(\n    async (signal?: AbortSignal) => {\n      return waitUntilConnectionState(\n        ConnectionState.Connected /* FIXME: should I check for other states too? */,\n        signal,\n      );\n    },\n    [waitUntilConnectionState],\n  );\n\n  const waitUntilDisconnected = React.useCallback(\n    async (signal?: AbortSignal) => {\n      return waitUntilConnectionState(ConnectionState.Disconnected, signal);\n    },\n    [waitUntilConnectionState],\n  );\n\n  const setEncryptionEnabled = React.useCallback(\n    async (enabled: boolean) => room.setE2EEEnabled(enabled),\n    [room],\n  );\n\n  const agent = useAgent(\n    React.useMemo(\n      () => ({\n        connectionState: conversationState.connectionState,\n        room,\n        internal: sessionInternal,\n      }),\n      [conversationState, room, sessionInternal],\n    ),\n  );\n\n  const tokenSourceFetch = useSessionTokenSourceFetch(tokenSource, unstableRestOptions);\n\n  const wasSessionEndCalledRef = React.useRef(false);\n\n  const start = React.useCallback(\n    async (connectOptions: SessionConnectOptions = {}) => {\n      const {\n        signal,\n        tracks = { microphone: { enabled: true, publishOptions: { preConnectBuffer: true } } },\n        roomConnectOptions,\n      } = connectOptions;\n\n      await waitUntilDisconnected(signal);\n      wasSessionEndCalledRef.current = false;\n\n      const onSignalAbort = () => {\n        room.disconnect();\n      };\n      signal?.addEventListener('abort', onSignalAbort);\n\n      const onDisconnected = () => {\n        // on disconnection force a new token to be fetched in order to avoid reusing the same room right after\n        // this works around the fact that agents won't rejoin a room that existed previously\n        // and depends on the assumption that the endpoint will return a token for a different room\n        if (!wasSessionEndCalledRef.current) {\n          tokenSourceFetch(true);\n        }\n      };\n      room.once(RoomEvent.Disconnected, onDisconnected);\n\n      let tokenDispatchesAgent = false;\n      await Promise.all([\n        tokenSourceFetch().then(({ serverUrl, participantToken }) => {\n          const participantTokenPayload = decodeTokenPayload(participantToken);\n          const participantTokenAgentDispatchCount =\n            participantTokenPayload.roomConfig?.agents?.length ?? 0;\n          tokenDispatchesAgent = participantTokenAgentDispatchCount > 0;\n\n          return room.connect(serverUrl, participantToken, roomConnectOptions);\n        }),\n\n        // Start microphone (with preconnect buffer) by default\n        tracks.microphone?.enabled\n          ? room.localParticipant.setMicrophoneEnabled(\n              true,\n              undefined,\n              tracks.microphone?.publishOptions ?? {},\n            )\n          : Promise.resolve(),\n        tracks.camera?.enabled\n          ? room.localParticipant.setCameraEnabled(\n              true,\n              undefined,\n              tracks.camera?.publishOptions ?? {},\n            )\n          : Promise.resolve(),\n        tracks.screenShare?.enabled\n          ? room.localParticipant.setScreenShareEnabled(\n              true,\n              undefined,\n              tracks.screenShare?.publishOptions ?? {},\n            )\n          : Promise.resolve(),\n      ]);\n\n      await waitUntilConnected(signal);\n      if (tokenDispatchesAgent) {\n        await agent.waitUntilConnected(signal);\n      }\n\n      signal?.removeEventListener('abort', onSignalAbort);\n    },\n    [room, waitUntilDisconnected, tokenSourceFetch, waitUntilConnected, agent.waitUntilConnected],\n  );\n\n  const end = React.useCallback(async () => {\n    wasSessionEndCalledRef.current = true;\n    tokenSourceFetch(true);\n    await room.disconnect();\n  }, [room, tokenSourceFetch]);\n\n  const prepareConnection = React.useCallback(async () => {\n    const credentials = await tokenSourceFetch();\n    await room.prepareConnection(credentials.serverUrl, credentials.participantToken);\n  }, [tokenSourceFetch, room]);\n  React.useEffect(\n    () => {\n      prepareConnection().catch((err) => {\n        // FIXME: figure out a better logging solution?\n        console.warn('WARNING: Room.prepareConnection failed:', err);\n      });\n    },\n    [\n      /* note: no prepareConnection here, this effect should only ever run once! */\n    ],\n  );\n\n  return React.useMemo(\n    () => ({\n      ...conversationState,\n\n      waitUntilConnected,\n      waitUntilDisconnected,\n\n      prepareConnection,\n      start,\n      end,\n\n      setEncryptionEnabled,\n    }),\n    [\n      conversationState,\n      waitUntilConnected,\n      waitUntilDisconnected,\n      prepareConnection,\n      start,\n      end,\n      setEncryptionEnabled,\n    ],\n  );\n}\n","import * as React from 'react';\nimport TypedEventEmitter, { EventMap } from 'typed-emitter';\n\n/** @public */\nexport function useEvents<\n  Emitter extends TypedEventEmitter<EventMap>,\n  EmitterEventMap extends Emitter extends TypedEventEmitter<infer EM> ? EM : never,\n  Event extends Parameters<Emitter['on']>[0],\n  Callback extends EmitterEventMap[Event],\n>(\n  instance: Emitter | { internal: { emitter: Emitter } } | null | undefined,\n  event: Event,\n  handlerFn: Callback | undefined,\n  dependencies?: React.DependencyList,\n) {\n  const fallback = React.useMemo(() => () => {}, []);\n  const wrappedCallback = React.useCallback(handlerFn ?? fallback, dependencies ?? []);\n  const callback = dependencies ? wrappedCallback : handlerFn;\n\n  const emitter = React.useMemo(() => {\n    if (!instance) {\n      return null;\n    }\n    if ('internal' in instance) {\n      return instance.internal.emitter;\n    }\n    return instance;\n  }, [instance]);\n\n  React.useEffect(() => {\n    if (!emitter || !callback) {\n      return;\n    }\n    emitter.on(event, callback);\n    return () => {\n      emitter.off(event, callback);\n    };\n  }, [emitter, event, callback]);\n}\n","import * as React from 'react';\nimport type TypedEventEmitter from 'typed-emitter';\nimport { SendTextOptions } from 'livekit-client';\nimport { EventEmitter } from 'events';\nimport {\n  ReceivedMessage,\n  ReceivedChatMessage,\n  TextStreamData,\n  ReceivedUserTranscriptionMessage,\n  ReceivedAgentTranscriptionMessage,\n} from '@livekit/components-core';\n\nimport { useAgent } from './useAgent';\nimport { useTranscriptions } from './useTranscriptions';\nimport { useChat } from './useChat';\nimport { UseSessionReturn } from './useSession';\nimport { useEnsureSession } from '../context';\n\n/** @beta */\nexport type UseSessionMessagesReturn = {\n  messages: Array<ReceivedMessage>;\n\n  /** Is a send operation currently in progress? */\n  isSending: boolean;\n\n  send: (message: string, options?: SendTextOptions) => Promise<ReceivedChatMessage>;\n\n  internal: {\n    emitter: TypedEventEmitter<MessagesCallbacks>;\n  };\n};\n\n/** @beta */\nexport enum MessagesEvent {\n  /**\n   * Emits when a new message is received from a participant\n   * args: (message: ReceivedMessage)\n   */\n  MessageReceived = 'messageReceived',\n}\n\n/** @beta */\nexport type MessagesCallbacks = {\n  [MessagesEvent.MessageReceived]: (message: ReceivedMessage) => void;\n};\n\n/** @beta */\nexport function useSessionMessages(session?: UseSessionReturn): UseSessionMessagesReturn {\n  const { room } = useEnsureSession(session);\n\n  const emitter = React.useMemo(\n    () => new EventEmitter() as TypedEventEmitter<MessagesCallbacks>,\n    [],\n  );\n\n  const agent = useAgent(session);\n\n  const transcriptions: Array<TextStreamData> = useTranscriptions({ room });\n  const chatOptions = React.useMemo(() => ({ room }), [room]);\n  const chat = useChat(chatOptions);\n\n  const transcriptionMessages: Array<\n    ReceivedUserTranscriptionMessage | ReceivedAgentTranscriptionMessage\n  > = React.useMemo(() => {\n    return transcriptions.map((transcription) => {\n      switch (transcription.participantInfo.identity) {\n        case room.localParticipant.identity:\n          return {\n            type: 'userTranscript',\n            message: transcription.text,\n\n            id: transcription.streamInfo.id,\n            timestamp: transcription.streamInfo.timestamp,\n            from: room.localParticipant,\n          };\n\n        case agent.internal.agentParticipant?.identity:\n        case agent.internal.workerParticipant?.identity:\n          return {\n            type: 'agentTranscript',\n            message: transcription.text,\n\n            id: transcription.streamInfo.id,\n            timestamp: transcription.streamInfo.timestamp,\n            from:\n              agent.internal.agentParticipant?.identity === transcription.participantInfo.identity\n                ? agent.internal.agentParticipant\n                : agent.internal.workerParticipant!,\n          };\n\n        default:\n          // FIXME: what should happen if an associated participant is not found?\n          //\n          // For now, just assume it is an agent transcription, since maybe it is from an agent\n          // which disconencted from the room or something like that.\n          return {\n            type: 'agentTranscript',\n            message: transcription.text,\n\n            id: transcription.streamInfo.id,\n            timestamp: transcription.streamInfo.timestamp,\n            from: Array.from(room.remoteParticipants.values()).find(\n              (p) => p.identity === transcription.participantInfo.identity,\n            ),\n          };\n      }\n    });\n  }, [transcriptions, room]);\n\n  const receivedMessages = React.useMemo(() => {\n    const merged: Array<ReceivedMessage> = [...transcriptionMessages, ...chat.chatMessages];\n    return merged;\n  }, [transcriptionMessages, chat.chatMessages]);\n\n  const messageFirstReceivedTimeMapRef = React.useRef(new Map<ReceivedMessage['id'], Date>());\n  const sortedReceivedMessages = React.useMemo(() => {\n    const now = new Date();\n    for (const message of receivedMessages) {\n      if (messageFirstReceivedTimeMapRef.current.has(message.id)) {\n        continue;\n      }\n\n      messageFirstReceivedTimeMapRef.current.set(message.id, now);\n    }\n\n    return receivedMessages.sort((a, b) => {\n      const aFirstReceivedAt = messageFirstReceivedTimeMapRef.current.get(a.id);\n      const bFirstReceivedAt = messageFirstReceivedTimeMapRef.current.get(b.id);\n      if (typeof aFirstReceivedAt === 'undefined' || typeof bFirstReceivedAt === 'undefined') {\n        return 0;\n      }\n\n      return aFirstReceivedAt.getTime() - bFirstReceivedAt.getTime();\n    });\n  }, [receivedMessages]);\n\n  const previouslyReceivedMessageIdsRef = React.useRef(new Set());\n  React.useEffect(() => {\n    for (const message of sortedReceivedMessages) {\n      if (previouslyReceivedMessageIdsRef.current.has(message.id)) {\n        continue;\n      }\n\n      previouslyReceivedMessageIdsRef.current.add(message.id);\n      emitter.emit(MessagesEvent.MessageReceived, message);\n    }\n  }, [sortedReceivedMessages]);\n\n  return React.useMemo(\n    () => ({\n      messages: sortedReceivedMessages,\n      send: chat.send,\n      isSending: chat.isSending,\n      internal: { emitter },\n    }),\n    [sortedReceivedMessages, chat.send, chat.isSending],\n  );\n}\n","import * as React from 'react';\nimport {\n  RpcError,\n  type RpcInvocationData,\n  type PerformRpcParams,\n  type Serializer,\n  isSerializer,\n  type SerializerInput,\n  type SerializerOutput,\n  serializers,\n} from 'livekit-client';\n\nimport { useEnsureSession } from '../context';\nimport { isUseSessionReturn, type UseSessionReturn } from './useSession';\n\n// ---------------------------------------------------------------------------\n// RPC types\n// ---------------------------------------------------------------------------\n\n/** @beta */\nexport type RpcHandler<Input = any, Output = any> = (\n  payload: Input,\n  data: RpcInvocationData,\n) => Promise<Output>;\n\n/**\n * Base RPC call parameters with an arbitrary payload type (used when the payload\n * will be serialized by a serializer).\n *\n * @beta\n */\nexport type RpcCallParams<Payload> = Omit<PerformRpcParams, 'payload'> & { payload: Payload };\n\n/**\n * Options for {@link (useRpc:1)}.\n * @beta\n */\nexport type UseRpcOptions<S extends Serializer<any, any> = Serializer<any, any>> = {\n  /** Only accept RPCs from this participant. Others will receive UNSUPPORTED_METHOD. */\n  fromIdentity?: string;\n  /**\n   * Serializer applied to the data coming in and leaving the handler. Defaults to `serializers.json()`\n   */\n  serializer?: S;\n};\n\n// ---------------------------------------------------------------------------\n// useRpc hook\n// ---------------------------------------------------------------------------\n\n/** @beta */\nexport type RpcPerformFn = {\n  /** Serializer-wrapped call: payload is serialized and response is parsed by the serializer. */\n  <Output = string, Input = unknown>(\n    params: RpcCallParams<Input>,\n    serializer: Serializer<Output, Input>,\n  ): Promise<Output>;\n  /** Plain call: payload is already a string, response is returned as a string. */\n  (params: PerformRpcParams): Promise<string>;\n};\n\n/** @beta */\nexport type UseRpcReturn = {\n  perform: RpcPerformFn;\n};\n\n/**\n * Hook for declarative RPC method registration and outbound RPC calls.\n *\n * Registers a handler for an incoming RPC method and returns a `performRpc`\n * function for outbound calls. The handler is registered on mount and\n * unregistered on unmount. Handler identity does not matter (captured by ref),\n * so inline functions work without `useCallback`.\n *\n * @example\n * ```tsx\n * const { performRpc } = useRpc(session, \"getUserLocation\", async (payload: { highAccuracy: boolean }) => {\n *   const pos = await getPosition(payload.highAccuracy);\n *   return { lat: pos.coords.latitude, lng: pos.coords.longitude };\n * });\n * ```\n *\n * @beta\n */\nexport function useRpc<S extends Serializer<any, any>>(\n  session: UseSessionReturn,\n  methodName: string,\n  handler: RpcHandler<SerializerInput<S>, SerializerOutput<S>>,\n  options?: UseRpcOptions<S>,\n): UseRpcReturn;\n/** @beta */\nexport function useRpc<S extends Serializer<any, any>>(\n  methodName: string,\n  handler: RpcHandler<SerializerInput<S>, SerializerOutput<S>>,\n  options?: UseRpcOptions<S>,\n): UseRpcReturn;\n/** @beta */\nexport function useRpc(session: UseSessionReturn): UseRpcReturn;\n/** @beta */\nexport function useRpc(): UseRpcReturn;\nexport function useRpc(\n  methodNameOrSession?: string | UseSessionReturn,\n  handlerOrMethodName?: RpcHandler<any, any> | string,\n  optionsOrHandler?: UseRpcOptions<Serializer<any, any>> | RpcHandler<any, any>,\n  maybeOptions?: UseRpcOptions<Serializer<any, any>>,\n): UseRpcReturn {\n  let session: UseSessionReturn | undefined;\n  let methodName: string | undefined;\n  let handler: RpcHandler<any, any> | undefined;\n  let options: UseRpcOptions<Serializer<any, any>> | undefined;\n\n  if (isUseSessionReturn(methodNameOrSession)) {\n    session = methodNameOrSession;\n    methodName = handlerOrMethodName as string;\n    handler = optionsOrHandler as RpcHandler<any, any>;\n    options = maybeOptions;\n  } else {\n    methodName = methodNameOrSession;\n    handler = handlerOrMethodName as RpcHandler<any, any>;\n    options = optionsOrHandler as UseRpcOptions<any>;\n  }\n\n  const { room } = useEnsureSession(session);\n\n  // Ref that always holds the latest handler — updated synchronously on render\n  const handlerRef = React.useRef(handler);\n  handlerRef.current = handler;\n\n  // Ref that always holds the latest options\n  const optionsRef = React.useRef(options);\n  optionsRef.current = options;\n\n  React.useEffect(() => {\n    if (!methodName) {\n      return;\n    }\n\n    room.registerRpcMethod(methodName, async (data: RpcInvocationData) => {\n      const fromIdentity = optionsRef.current?.fromIdentity;\n      if (fromIdentity && data.callerIdentity !== fromIdentity) {\n        throw RpcError.builtIn(\n          'UNSUPPORTED_METHOD',\n          `Method not available for caller ${data.callerIdentity}`,\n        );\n      }\n\n      const currentHandler = handlerRef.current;\n      if (!currentHandler) {\n        throw RpcError.builtIn(\n          'APPLICATION_ERROR',\n          `No handler registered for method \"${methodName}\"`,\n        );\n      }\n\n      const serializer = optionsRef.current?.serializer ?? serializers.json();\n\n      let parsed;\n      try {\n        parsed = serializer.parse(data.payload);\n      } catch (e) {\n        throw RpcError.builtIn('APPLICATION_ERROR', `Failed to parse RPC payload: ${e}`);\n      }\n\n      const result = await currentHandler(parsed, data);\n\n      try {\n        return serializer.serialize(result);\n      } catch (e) {\n        throw RpcError.builtIn('APPLICATION_ERROR', `Failed to serialize RPC response: ${e}`);\n      }\n    });\n\n    return () => {\n      room.unregisterRpcMethod(methodName);\n    };\n  }, [room, methodName]);\n\n  // Stable rpc calling function\n  const performRpc: RpcPerformFn = React.useCallback(\n    async (\n      params: RpcCallParams<unknown>,\n      serializer: Serializer<any, any> = serializers.json(),\n    ) => {\n      if (isSerializer(serializer)) {\n        let serialized: string;\n        try {\n          serialized = serializer.serialize(params.payload);\n        } catch (e) {\n          throw RpcError.builtIn('APPLICATION_ERROR', `Failed to serialize RPC payload: ${e}`);\n        }\n        const rawResponse = await room.localParticipant.performRpc({\n          destinationIdentity: params.destinationIdentity,\n          method: params.method,\n          payload: serialized,\n          responseTimeout: params.responseTimeout,\n        });\n        try {\n          return serializer.parse(rawResponse);\n        } catch (e) {\n          throw RpcError.builtIn('APPLICATION_ERROR', `Failed to parse RPC response: ${e}`);\n        }\n      } else {\n        return room.localParticipant.performRpc(params as PerformRpcParams);\n      }\n    },\n    [room],\n  );\n\n  return React.useMemo(() => ({ perform: performRpc }), [performRpc]);\n}\n"],"names":["useLatest","current","storedValue","React","useResizeObserver","target","callback","resizeObserver","getResizeObserver","storedCallback","didUnsubscribe","targetEl","cb","entry","observer","createResizeObserver","ticking","allEntries","callbacks","entries","obs","triggered","i","cbs","cbIndex","_resizeObserver","useSize","size","setSize","width","height","resizeCallback","useObservableState","observable","startWith","resetWhenObservableChanges","state","setState","subscription","useMediaQuery","query","getMatches","matches","setMatches","handleChange","matchMedia","useAudioPlayback","room","roomEnsured","useEnsureRoom","startAudio","roomAudioPlaybackAllowedObservable","canPlayAudio","useClearPinButton","props","dispatch","useLayoutContext","className","setupClearPinButton","mergeProps","useConnectionQualityIndicator","options","p","useEnsureParticipant","connectionQualityObserver","setupConnectionQualityIndicator","quality","useConnectionState","r","connectionStateObserver","useDataChannel","topicOrCallback","onMessage","topic","useRoomContext","send","messageObservable","isSendingObservable","setupDataMessageHandler","message","isSending","useDisconnectButton","connectionState","disconnect","setupDisconnectButton","ConnectionState","useFacingMode","trackReference","LocalTrackPublication","localTrack","facingMode","facingModeFromLocalTrack","useFocusToggle","trackRef","useEnsureTrackRef","layoutContext","useMaybeLayoutContext","setupFocusToggle","inFocus","isTrackReferencePinned","event","useGridLayout","gridElement","trackCount","gridLayouts","GRID_LAYOUTS","layout","selectGridLayout","useIsMuted","sourceOrTrackRef","passedParticipant","ref","isMuted","setIsMuted","listener","mutedObserver","getTrackReferenceId","useIsSpeaking","participant","createIsSpeakingObserver","useLocalParticipant","localParticipant","setLocalParticipant","isMicrophoneEnabled","setIsMicrophoneEnabled","isCameraEnabled","setIsCameraEnabled","isScreenShareEnabled","setIsScreenShareEnabled","lastMicrophoneError","setLastMicrophoneError","lastCameraError","setLastCameraError","microphoneTrack","setMicrophoneTrack","cameraTrack","setCameraTrack","handleUpdate","media","observeParticipantMedia","useLocalParticipantPermissions","permissionObserver","participantPermissionObserver","useMediaDeviceSelect","kind","track","requestPermissions","onError","roomContext","useMaybeRoomContext","roomFallback","Room","deviceObserver","createMediaDeviceObserver","devices","currentDeviceId","setCurrentDeviceId","activeDeviceObservable","setActiveMediaDevice","setupDeviceSelector","deviceId","log","useMediaDevices","useVisualStableUpdate","trackReferences","maxItemsOnPage","lastTrackRefs","lastMaxItemsOnPage","layoutChanged","sortedTrackRefs","sortTrackReferences","updatedTrackRefs","updatePages","error","usePagination","itemPerPage","currentPage","setCurrentPage","totalPageCount","lastItemIndex","firstItemIndex","changePage","direction","goToPage","num","tracksOnPage","useParticipantInfo","useMaybeParticipantContext","infoObserver","participantInfoObserver","identity","name","metadata","useParticipantPermissions","useParticipantTile","onParticipantClick","disableSpeakingIndicator","htmlProps","mergedProps","setupParticipantTile","micTrack","Track","micRef","isVideoMuted","isAudioMuted","isSpeaking","useRemoteParticipants","participants","setParticipants","connectedParticipantsObserver","useParticipants","remoteParticipants","usePinnedTracks","useEnsureLayoutContext","useRemoteParticipant","identityOrIdentifier","updateOnlyOn","connectedParticipantObserver","participantByIdentifierObserver","participantWrapper","setParticipantWrapper","useRoomInfo","roomInfoObserver","useSpeakingParticipants","ensuredRoom","speakerObserver","activeSpeakerObserver","useSortedParticipants","sortedParticipants","setSortedParticipants","sortParticipants","activeSpeakers","useStartAudio","handleStartAudioPlayback","setupStartAudio","useStartVideo","roomVideoPlaybackAllowedObservable","handleStartVideoPlayback","setupStartVideo","canPlayVideo","useSwipe","element","touchStart","touchEnd","minSwipeDistance","onTouchStart","onTouchMove","onTouchEnd","distance","isLeftSwipe","isRightSwipe","elementCopy","useChatToggle","setupChatToggle","useToken","tokenEndpoint","roomName","token","setToken","params","res","accessToken","useTrackMutedIndicator","mediaMutedObserver","setupTrackMutedIndicator","useTrackToggle","source","onChange","initialState","captureOptions","publishOptions","onDeviceError","rest","roomFromContext","userInteractionRef","toggle","pendingObserver","enabledObserver","setupMediaToggle","setupManualToggle","pending","enabled","newProps","clickHandler","evt","useTracks","sources","setTrackReferences","sources_","s","isSourceWitOptions","trackReferencesObservable","isSourcesWithOptions","requirePlaceholder","requiredPlaceholders","trackReferencesWithPlaceholders","placeholderSource","publication","placeholder","difference","setA","setB","_difference","elem","placeholderMap","sourcesThatNeedPlaceholder","sourceWithOption","sourcesOfSubscribedTracks","pub","trackSource","placeholderNeededForThisParticipant","useTrackRefBySourceOrName","setPublication","getTrackByIdentifier","trackObserver","setupMediaTrack","useTrackByName","useChat","isDisconnected","setup","setupChat","chatMessages","usePersistentUserChoices","userChoices","setSettings","loadUserChoices","saveAudioInputEnabled","isEnabled","prev","saveVideoInputEnabled","saveAudioInputDeviceId","saveVideoInputDeviceId","saveUsername","username","saveUserChoices","useIsEncrypted","encryptionStatusObservable","useTrackVolume","trackOrTrackReference","isTrackReference","volume","setVolume","cleanup","analyser","createAudioAnalyser","bufferLength","dataArray","interval","sum","a","normalizeFrequencies","frequencies","normalizeDb","value","db","multibandDefaults","useMultibandTrackVolume","opts","frequencyBands","setFrequencyBands","val","normalizedFrequencies","totalBins","chunks","startIndex","endIndex","chunk","chunkLength","summedVolumes","acc","waveformDefaults","useAudioWaveform","aggregateWave","timeRef","updates","bars","setBars","onUpdate","wave","filterData","v","getFFTSizeValue","update","updateWaveform","newData","x","pow2ceil","audioData","numSamples","blockSize","filteredData","blockStart","j","useParticipantTracks","optionsOrParticipantIdentity","participantIdentity","participantContext","participantTracksObservable","useTrackSyncTime","trackSyncTimeObserver","TRACK_TRANSCRIPTION_DEFAULTS","useTrackTranscription","segments","setSegments","syncTimestamps","handleSegmentMessage","newSegments","prevSegments","dedupeSegments","addTimestampsToTranscription","trackTranscriptionObserver","useParticipantAttributes","attributeObserver","participantAttributesObserver","useParticipantAttribute","attributeKey","attribute","setAttribute","state_attribute","ParticipantAgentAttributes","useVoiceAssistant","agent","ParticipantKind","worker","agentTracks","workerTracks","audioTrack","t","videoTrack","agentTranscriptions","attributes","useIsRecording","recordingStatusObservable","useTextStream","textStreamData","setupTextStream","useTranscriptions","participantIdentities","trackSids","textStreams","DataTopic","stream","CONNECT_DISCONNECT_WARNING_THRESHOLD_QUANTITY","CONNECT_DISCONNECT_WARNING_THRESHOLD_MS","ROOM_CHANGE_WARNING_THRESHOLD_QUANTITY","ROOM_CHANGE_WARNING_THRESHOLD_MS","useSequentialRoomConnectDisconnect","connectDisconnectQueueRef","useRef","processConnectsAndDisconnectsLock","useMemo","Mutex","processConnectsAndDisconnects","useCallback","unlock","roomChangedTimesRef","checkRoomThreshold","now","roomChangesInThreshold","isWithinThreshold","useEffect","connectDisconnectEnqueueTimes","checkConnectDisconnectThreshold","connectDisconnectsInThreshold","connect","args","resolve","reject","R","ReflectApply","receiver","ReflectOwnKeys","ProcessEmitWarning","warning","NumberIsNaN","EventEmitter","eventsModule","once","defaultMaxListeners","checkListener","arg","n","_getMaxListeners","that","type","doError","events","er","err","handler","len","listeners","arrayClone","_addListener","prepend","m","existing","w","onceWrapper","_onceWrap","wrapped","list","position","originalListener","spliceOne","keys","key","_listeners","unwrap","evlistener","unwrapListeners","emitter","listenerCount","arr","copy","index","ret","errorListener","resolver","eventTargetAgnosticAddListener","addErrorHandlerIfEventEmitter","flags","wrapListener","DEFAULT_AGENT_CONNECT_TIMEOUT_MILLISECONDS","AgentEvent","generateDerivedStateValues","useAgentTimeoutIdStore","agentTimeoutFailureReason","setAgentTimeoutFailureReason","agentTimeoutId","setAgentTimeoutId","agentStateRef","agentParticipantExistsRef","startAgentConnectedTimeout","agentConnectTimeoutMilliseconds","isConnected","agentState","agentParticipantExists","useAgentWaitUntilDerivedStates","stateRef","waitUntilConnected","signal","stateChangedHandler","abortHandler","waitUntilCouldBeListening","canListen","waitUntilFinished","isFinished","useAgent","session","sessionFromContext","useMaybeSessionContext","startAgentTimeout","clearAgentTimeout","clearAgentTimeoutFailureReason","updateAgentTimeoutState","updateAgentTimeoutParticipantExists","roomRemoteParticipants","agentParticipant","workerParticipant","agentParticipantAttributes","roomConnectionState","setRoomConnectionState","handleConnectionStateChanged","RoomEvent","agentDisconnectedFailureReason","setAgentDisconnectedFailureReason","onParticipantDisconnect","localMicTrack","setLocalMicTrack","handleLocalParticipantTrackPublished","handleLocalParticipantTrackUnPublished","ParticipantEvent","failureReasons","reasons","isSessionDisconnected","agentParticipantIdentity","agentParticipantName","agentParticipantMetadata","common","waitUntilCamera","camera","waitUntilMicrophone","microphone","SessionEvent","isUseSessionReturn","areTokenSourceFetchOptionsEqual","b","allKeysSet","exhaustiveCheckedKey","useSessionWaitUntilConnectionState","connectionStateRef","onceEventOccurred","newState","useSessionTokenSourceFetch","tokenSource","unstableRestOptions","isConfigurable","TokenSourceConfigurable","memoizedTokenFetchOptionsRef","force","useSession","optionsRoom","unstableEncryption","encryptionE2eeManager","encryptionKey","encryptionWorker","externalKeyProviderRef","keyProvider","ExternalE2EEKeyProvider","e","preGeneratedRoom","encryptionViaWorker","encryptionViaManager","encryptionEnabled","roomOptions","generateDerivedConnectionStateValues","handleMediaDevicesError","handleEncryptionError","cameraPublication","localCamera","microphonePublication","localMicrophone","screenSharePublication","localScreenShare","sessionInternal","conversationState","waitUntilConnectionState","waitUntilDisconnected","setEncryptionEnabled","tokenSourceFetch","wasSessionEndCalledRef","start","connectOptions","tracks","roomConnectOptions","onSignalAbort","onDisconnected","tokenDispatchesAgent","serverUrl","participantToken","decodeTokenPayload","end","prepareConnection","credentials","useEvents","instance","handlerFn","dependencies","fallback","wrappedCallback","MessagesEvent","useSessionMessages","useEnsureSession","transcriptions","chatOptions","chat","transcriptionMessages","transcription","receivedMessages","messageFirstReceivedTimeMapRef","sortedReceivedMessages","aFirstReceivedAt","bFirstReceivedAt","previouslyReceivedMessageIdsRef","useRpc","methodNameOrSession","handlerOrMethodName","optionsOrHandler","maybeOptions","methodName","handlerRef","optionsRef","data","fromIdentity","RpcError","currentHandler","serializer","serializers","parsed","result","performRpc","isSerializer","serialized","rawResponse"],"mappings":"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","x_google_ignoreList":[53]}