{"version":3,"file":"useVoiceAssistant-BdD_-dgF.cjs","sources":["../src/composables/useRoomContext.ts","../src/composables/useLiveKitRoom.ts","../src/composables/useTracks.ts","../src/composables/useObservableState.ts","../src/composables/useMediaDeviceSelect.ts","../src/composables/useDebounce.ts","../src/composables/useElementVisibility.ts","../src/composables/useTrackVolume.ts","../src/composables/useParticipantContext.ts","../src/composables/useConnectionQualityIndicator.ts","../src/composables/useConnectionStatus.ts","../src/composables/useIsMuted.ts","../src/composables/useLocalParticipant.ts","../src/composables/useRemoteParticipants.ts","../src/composables/useParticipants.ts","../src/composables/useTrackToggle.ts","../src/composables/useParticipantTracks.ts","../src/composables/useParticipantAttributes.ts","../src/composables/useVoiceAssistant.ts"],"sourcesContent":["import type { Room } from 'livekit-client';\nimport {\n  computed,\n  inject,\n  MaybeRef,\n  provide,\n  shallowRef,\n  toValue,\n  type InjectionKey,\n  type ShallowRef,\n} from 'vue';\n\nexport type RoomContext = ShallowRef<Room>;\n\nconst RoomContextKey: InjectionKey<RoomContext> = Symbol('livekit-room-context');\n\nexport function useProvideRoomContext(initialValue: MaybeRef<Room>): RoomContext {\n  const ctx = shallowRef(initialValue);\n  console.log('>>>>>>>>>', ctx);\n  provide<RoomContext, InjectionKey<RoomContext>>(RoomContextKey, ctx);\n  return ctx;\n}\n\nexport function useMaybeRoomContext(): RoomContext | undefined {\n  return inject(RoomContextKey);\n}\n\nexport function useRoomContext(): RoomContext {\n  const ctx = useMaybeRoomContext();\n  if (!ctx) {\n    throw Error('tried to access room context outside of livekit room component');\n  }\n  return ctx;\n}\n\nexport function useEnsureRoom(room?: MaybeRef<Room | undefined>): RoomContext {\n  const ctx = useMaybeRoomContext();\n  const r = computed(() => toValue(room) ?? toValue(ctx));\n  if (!r.value) {\n    throw new Error(\n      'No room provided, make sure you are inside a Room context or pass the room explicitly',\n    );\n  }\n  return r as RoomContext;\n}\n","import { log } from '@livekit/components-core';\nimport type {\n  DisconnectReason,\n  RoomOptions,\n  RoomConnectOptions,\n  AudioCaptureOptions,\n  VideoCaptureOptions,\n  ScreenShareCaptureOptions,\n} from 'livekit-client';\nimport { Room, MediaDeviceFailure, RoomEvent } from 'livekit-client';\nimport {\n  ref,\n  shallowRef,\n  watch,\n  watchEffect,\n  onBeforeUnmount,\n  markRaw,\n  toValue,\n  type MaybeRef,\n} from 'vue';\n\n/**\n *\n * @internal\n * used to stringify room options to detect dependency changes for react hooks.\n * Replaces processors and e2ee options with strings.\n */\nexport function roomOptionsStringifyReplacer(key: string, val: unknown) {\n  if (key === 'processor' && val && typeof val === 'object' && 'name' in val) {\n    return val.name;\n  }\n  if (key === 'e2ee' && val) {\n    return 'e2ee-enabled';\n  }\n  return val;\n}\n\nconst defaultRoomOptions = {\n  connect: true,\n  audio: false,\n  video: false,\n};\n\nexport interface LiveKitRoomProps {\n  serverUrl: MaybeRef<string>;\n  token: MaybeRef<string>;\n  audio?: MaybeRef<AudioCaptureOptions | boolean>;\n  video?: MaybeRef<VideoCaptureOptions | boolean>;\n  screen?: MaybeRef<ScreenShareCaptureOptions | boolean>;\n  connect?: MaybeRef<boolean>;\n  options?: MaybeRef<RoomOptions>;\n  connectOptions?: MaybeRef<RoomConnectOptions | undefined>;\n  room?: MaybeRef<Room | undefined>;\n  simulateParticipants?: MaybeRef<number | undefined>;\n  onConnected?: () => void;\n  onDisconnected?: (reason?: DisconnectReason) => void;\n  onError?: (error: Error) => void;\n  onMediaDeviceFailure?: (failure?: MediaDeviceFailure, kind?: MediaDeviceKind) => void;\n  onEncryptionError?: (error: Error) => void;\n}\n\nexport function useLiveKitRoom(opts: LiveKitRoomProps) {\n  const props = { ...defaultRoomOptions, ...opts };\n\n  const {\n    token,\n    serverUrl,\n    options,\n    room: passedRoom,\n    connectOptions,\n    connect,\n    audio,\n    video,\n    screen,\n    onConnected,\n    onDisconnected,\n    onError,\n    onMediaDeviceFailure,\n    onEncryptionError,\n    simulateParticipants,\n  } = props;\n\n  if (toValue(options) && toValue(passedRoom)) {\n    log.warn(\n      'when using a manually created room, the options object will be ignored. set the desired options directly when creating the room instead.',\n    );\n  }\n\n  const room = shallowRef<Room | undefined>();\n  const shouldConnect = ref(toValue(connect));\n\n  watch(\n    () =>\n      [\n        toValue(passedRoom),\n        JSON.stringify(toValue(options), roomOptionsStringifyReplacer),\n      ] as const,\n    (newValues, oldValues) => {\n      const [_passedRoom, _optionsString] = newValues;\n      const _oldPassedRoom = oldValues?.[0];\n      const _oldOptionsString = oldValues?.[1];\n\n      if (_passedRoom) {\n        if (_passedRoom === _oldPassedRoom && room.value) return;\n\n        if (room.value) {\n          log.info('disconnecting on onmount (replacing with passedRoom)');\n          room.value.disconnect();\n        }\n\n        room.value = markRaw(_passedRoom);\n        return;\n      }\n\n      if (_optionsString === _oldOptionsString && room.value) return;\n\n      if (room.value) {\n        log.info('disconnecting on onmount (recreating room from options)');\n        room.value.disconnect();\n      }\n\n      room.value = markRaw(new Room(toValue(options)));\n    },\n    { immediate: true },\n  );\n\n  watchEffect((onCleanup) => {\n    const _room = toValue(room);\n    const _audio = toValue(audio);\n    const _video = toValue(video);\n    const _screen = toValue(screen);\n\n    if (!_room) return;\n\n    const onSignalConnected = () => {\n      const localP = _room.localParticipant;\n\n      log.debug('trying to publish local tracks');\n      Promise.all([\n        localP.setMicrophoneEnabled(!!_audio, typeof _audio !== 'boolean' ? _audio : undefined),\n        localP.setCameraEnabled(!!_video, typeof _video !== 'boolean' ? _video : undefined),\n        localP.setScreenShareEnabled(!!_screen, typeof _screen !== 'boolean' ? _screen : undefined),\n      ]).catch((e) => {\n        log.warn(e);\n        onError?.(e as Error);\n      });\n    };\n\n    const handleMediaDeviceError = (e: Error, kind?: MediaDeviceKind) => {\n      const mediaDeviceFailure = MediaDeviceFailure.getFailure(e);\n      onMediaDeviceFailure?.(mediaDeviceFailure, kind);\n    };\n    const handleEncryptionError = (e: Error) => {\n      onEncryptionError?.(e);\n    };\n    const handleDisconnected = (reason?: DisconnectReason) => {\n      onDisconnected?.(reason);\n    };\n    const handleConnected = () => {\n      onConnected?.();\n    };\n\n    _room\n      .on(RoomEvent.SignalConnected, onSignalConnected)\n      .on(RoomEvent.MediaDevicesError, handleMediaDeviceError)\n      .on(RoomEvent.EncryptionError, handleEncryptionError)\n      .on(RoomEvent.Disconnected, handleDisconnected)\n      .on(RoomEvent.Connected, handleConnected);\n\n    onCleanup(() => {\n      _room\n        .off(RoomEvent.SignalConnected, onSignalConnected)\n        .off(RoomEvent.MediaDevicesError, handleMediaDeviceError)\n        .off(RoomEvent.EncryptionError, handleEncryptionError)\n        .off(RoomEvent.Disconnected, handleDisconnected)\n        .off(RoomEvent.Connected, handleConnected);\n    });\n  });\n\n  watchEffect(() => {\n    const _connect = toValue(connect);\n    const _token = toValue(token);\n    const _connectOptions = toValue(connectOptions);\n    const _room = toValue(room);\n    const _serverUrl = toValue(serverUrl);\n    const _simulateParticipants = toValue(simulateParticipants);\n\n    if (!_room) return;\n\n    if (_simulateParticipants) {\n      _room.simulateParticipants({\n        participants: {\n          count: _simulateParticipants,\n        },\n        publish: {\n          audio: true,\n          useRealTracks: true,\n        },\n      });\n      return;\n    }\n\n    if (_connect) {\n      shouldConnect.value = true;\n      log.debug('connecting');\n      if (!_token) {\n        log.debug('no token yet');\n        return;\n      }\n      if (!_serverUrl) {\n        log.warn('no livekit url provided');\n        onError?.(Error('no livekit url provided'));\n        return;\n      }\n      _room.connect(_serverUrl, _token, _connectOptions).catch((e) => {\n        log.warn(e);\n        if (shouldConnect.value === true) {\n          onError?.(e as Error);\n        }\n      });\n    } else {\n      log.debug('disconnecting because connect is false');\n      shouldConnect.value = false;\n      _room.disconnect();\n    }\n  });\n\n  onBeforeUnmount(() => {\n    log.info('disconnecting on onmount');\n    room.value?.disconnect();\n  });\n\n  return {\n    room,\n  };\n}\n","import { Track } from 'livekit-client';\nimport {\n  isSourcesWithOptions,\n  isSourceWitOptions,\n  log,\n  trackReferencesObservable,\n} from '@livekit/components-core';\nimport { computed, shallowRef, watchEffect, toValue, type ComputedRef, type MaybeRef } from 'vue';\nimport { useEnsureRoom } from './useRoomContext.js';\nimport type {\n  SourcesArray,\n  TrackReference,\n  TrackReferenceOrPlaceholder,\n  TrackSourceWithOptions,\n  TrackReferencePlaceholder,\n} from '@livekit/components-core';\nimport type { Participant, Room, RoomEvent } from 'livekit-client';\n\nexport type UseTracksOptions = {\n  updateOnlyOn?: MaybeRef<RoomEvent[]>;\n  onlySubscribed?: MaybeRef<boolean>;\n  room?: MaybeRef<Room>;\n};\n\nexport type UseTracksReturnType<T> = T extends Track.Source[]\n  ? TrackReference[]\n  : T extends TrackSourceWithOptions[]\n    ? TrackReferenceOrPlaceholder[]\n    : never;\n\nexport function useTracks<T extends SourcesArray = Track.Source[]>(\n  sources: MaybeRef<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): ComputedRef<UseTracksReturnType<T>> {\n  const room = useEnsureRoom(toValue(options?.room));\n  const trackReferences = shallowRef<TrackReference[]>([]);\n  const participants = shallowRef<Participant[]>([]);\n\n  const sourcesComputed = computed(() =>\n    toValue(sources).map((s: Track.Source | TrackSourceWithOptions) =>\n      isSourceWitOptions(s) ? s.source : s,\n    ),\n  );\n\n  watchEffect((onCleanup) => {\n    const room_ = room.value;\n    const sources_ = sourcesComputed.value;\n    const onlySubscribed = toValue(options.onlySubscribed);\n    const updateOnlyOn = toValue(options.updateOnlyOn);\n\n    if (!room_) {\n      return;\n    }\n\n    const subscription = trackReferencesObservable(room_, sources_, {\n      additionalRoomEvents: updateOnlyOn,\n      onlySubscribed: onlySubscribed,\n    }).subscribe(({ trackReferences: t, participants: p }) => {\n      log.debug('setting track bundles', t, p);\n      trackReferences.value = t;\n      participants.value = p;\n    });\n\n    onCleanup(() => {\n      subscription.unsubscribe();\n    });\n  });\n\n  const maybeTrackReferences = computed(() => {\n    const sources_ = toValue(sources);\n    if (isSourcesWithOptions(sources_)) {\n      const requirePlaceholder = requiredPlaceholders(sources_, participants.value);\n      const trackReferencesWithPlaceholders: TrackReferenceOrPlaceholder[] = Array.from(\n        trackReferences.value,\n      );\n      participants.value.forEach((participant: Participant) => {\n        if (requirePlaceholder.has(participant.identity)) {\n          const sourcesToAddPlaceholder = requirePlaceholder.get(participant.identity) ?? [];\n          sourcesToAddPlaceholder.forEach((placeholderSource: Track.Source) => {\n            if (\n              trackReferences.value.find(\n                ({ participant: p, publication }: TrackReference) =>\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.value;\n    }\n  });\n\n  return maybeTrackReferences as ComputedRef<UseTracksReturnType<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 { shallowRef, watch, toValue, type ShallowRef, type MaybeRef } from 'vue';\nimport type { Observable } from 'rxjs';\n\nexport function useObservableState<T>(\n  observable: MaybeRef<Observable<T> | undefined>,\n  startWith: T,\n): ShallowRef<T> {\n  const state = shallowRef<T>(startWith);\n  watch(\n    () => toValue(observable),\n    (obs, _oldObs, onCleanup) => {\n      state.value = startWith;\n      // observable state doesn't run in SSR\n      if (typeof window === 'undefined' || !obs) return;\n      const subscription = obs.subscribe((value: T) => (state.value = value));\n      onCleanup(() => subscription.unsubscribe());\n    },\n    {\n      immediate: true,\n    },\n  );\n  return state;\n}\n","import { ref, computed, watch, toValue, type MaybeRef } from 'vue';\nimport {\n  createMediaDeviceObserver,\n  setupDeviceSelector,\n  log,\n  type SetMediaDeviceOptions,\n} from '@livekit/components-core';\nimport { Room, type LocalAudioTrack, type LocalVideoTrack } from 'livekit-client';\nimport { useMaybeRoomContext } from './useRoomContext';\nimport { useObservableState } from './useObservableState';\n\nexport interface UseMediaDeviceSelectProps {\n  kind: MaybeRef<MediaDeviceKind>;\n  room?: MaybeRef<Room | undefined>;\n  track?: MaybeRef<LocalAudioTrack | LocalVideoTrack | undefined>;\n  requestPermissions?: MaybeRef<boolean | undefined>;\n  onError?: (e: Error) => void;\n}\n\nexport function useMediaDeviceSelect(props: UseMediaDeviceSelectProps) {\n  const roomContext = useMaybeRoomContext();\n\n  const roomFallback = computed(() => toValue(props.room) ?? toValue(roomContext) ?? new Room());\n\n  const kind = computed(() => toValue(props.kind));\n\n  const deviceObserver = computed(() =>\n    createMediaDeviceObserver(kind.value, props.onError, toValue(props.requestPermissions)),\n  );\n\n  const devices = useObservableState(deviceObserver, [] as MediaDeviceInfo[]);\n\n  const currentDeviceId = ref(roomFallback.value?.getActiveDevice(kind.value) ?? 'default');\n\n  const deviceSelector = computed(() =>\n    setupDeviceSelector(kind.value, roomFallback.value, toValue(props.track)),\n  );\n\n  watch(\n    () => deviceSelector.value.activeDeviceObservable,\n    (obs, _oldObs, onCleanup) => {\n      if (!obs) return;\n\n      const listener = obs.subscribe((deviceId: string) => {\n        if (!deviceId) {\n          return;\n        }\n        log.info('setCurrentDeviceId', deviceId);\n        currentDeviceId.value = deviceId;\n      });\n\n      onCleanup(() => {\n        listener.unsubscribe();\n      });\n    },\n    { immediate: true },\n  );\n\n  const className = computed(() => deviceSelector.value.className);\n\n  const setActiveMediaDevice = (id: string, options?: SetMediaDeviceOptions) => {\n    return deviceSelector.value.setActiveMediaDevice(id, options);\n  };\n\n  return {\n    devices,\n    className,\n    activeDeviceId: currentDeviceId,\n    setActiveMediaDevice,\n  };\n}\n","import { ref, watch, type Ref } from 'vue';\n\n/**\n * Debounce a ref value\n */\nexport function useDebounce<T>(value: Ref<T>, delay: number = 200): Ref<T> {\n  const debouncedValue = ref(value.value) as Ref<T>;\n  let timeout: ReturnType<typeof setTimeout> | null = null;\n\n  watch(value, (newValue) => {\n    if (timeout) {\n      clearTimeout(timeout);\n    }\n    timeout = setTimeout(() => {\n      debouncedValue.value = newValue;\n    }, delay);\n  });\n\n  return debouncedValue;\n}\n","import { ref, onMounted, onBeforeUnmount, type Ref } from 'vue';\n\n/**\n * Track element visibility using IntersectionObserver\n */\nexport function useElementVisibility(element: Ref<HTMLElement | null>): Ref<boolean> {\n  const isVisible = ref(false);\n  let observer: IntersectionObserver | null = null;\n\n  onMounted(() => {\n    if (!element.value) return;\n\n    observer = new IntersectionObserver(\n      (entries) => {\n        isVisible.value = entries[0].isIntersecting;\n      },\n      {\n        threshold: 0.1,\n      },\n    );\n\n    observer.observe(element.value);\n  });\n\n  onBeforeUnmount(() => {\n    if (observer) {\n      observer.disconnect();\n    }\n  });\n\n  return isVisible;\n}\n","import { ref, watch, toValue, type MaybeRef } from 'vue';\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\nexport function useTrackVolume(\n  trackOrTrackReference?: MaybeRef<LocalAudioTrack | RemoteAudioTrack | TrackReference>,\n  options: MaybeRef<AudioAnalyserOptions> = {\n    fftSize: 32,\n    smoothingTimeConstant: 0,\n  },\n) {\n  const volume = ref<number>(0);\n\n  watch(\n    [() => toValue(trackOrTrackReference), () => toValue(options)],\n    ([trackOrRef, currentOptions]: [any, AudioAnalyserOptions], _oldVal, onCleanup) => {\n      const track = isTrackReference(trackOrRef)\n        ? <LocalAudioTrack | RemoteAudioTrack | undefined>trackOrRef.publication.track\n        : trackOrRef;\n\n      if (!track || !track.mediaStream) {\n        volume.value = 0;\n        return;\n      }\n\n      const { cleanup, analyser } = createAudioAnalyser(track, currentOptions);\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        volume.value = Math.sqrt(sum / dataArray.length) / 255;\n      };\n\n      const interval = setInterval(updateVolume, 1000 / 30);\n\n      onCleanup(() => {\n        cleanup();\n        clearInterval(interval);\n      });\n    },\n    { immediate: true, deep: true },\n  );\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\nexport interface MultiBandTrackVolumeOptions {\n  bands?: number;\n  loPass?: number;\n  hiPass?: number;\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\nexport function useMultibandTrackVolume(\n  trackOrTrackReference?: MaybeRef<\n    LocalAudioTrack | RemoteAudioTrack | TrackReferenceOrPlaceholder | undefined\n  >,\n  options: MaybeRef<MultiBandTrackVolumeOptions> = {},\n) {\n  const frequencyBands = ref<Array<number>>([]);\n\n  watch(\n    [() => toValue(trackOrTrackReference), () => toValue(options)],\n    ([trackOrRef, currentOptions]: [any, MultiBandTrackVolumeOptions], _oldVal, onCleanup) => {\n      const track =\n        trackOrRef instanceof Track\n          ? trackOrRef\n          : <LocalAudioTrack | RemoteAudioTrack | undefined>trackOrRef?.publication?.track;\n\n      const opts = { ...multibandDefaults, ...currentOptions };\n\n      if (!track || !track.mediaStream) {\n        frequencyBands.value = new Array(opts.bands).fill(0);\n        return;\n      }\n\n      const { analyser, cleanup } = createAudioAnalyser(\n        track as LocalAudioTrack | RemoteAudioTrack,\n        opts.analyserOptions,\n      );\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 chunkSize = Math.ceil(normalizedFrequencies.length / opts.bands); // we want logarithmic chunking here\n        const chunks: Array<number> = [];\n        for (let i = 0; i < opts.bands; i++) {\n          const summedVolumes = normalizedFrequencies\n            .slice(i * chunkSize, (i + 1) * chunkSize)\n            .reduce((acc, val) => (acc += val), 0);\n          chunks.push(summedVolumes / chunkSize);\n        }\n\n        frequencyBands.value = chunks;\n      };\n\n      const interval = setInterval(updateVolume, opts.updateInterval);\n\n      onCleanup(() => {\n        cleanup();\n        clearInterval(interval);\n      });\n    },\n    {\n      immediate: true,\n      deep: true,\n    },\n  );\n\n  return frequencyBands;\n}\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\nexport function useAudioWaveform(\n  trackOrTrackReference?: MaybeRef<\n    LocalAudioTrack | RemoteAudioTrack | TrackReferenceOrPlaceholder\n  >,\n  options: MaybeRef<AudioWaveformOptions> = {},\n) {\n  const aggregateWave = ref(new Float32Array());\n  const timeRef = ref(performance.now());\n  const updates = ref(0);\n  const bars = ref<number[]>([]);\n\n  watch(\n    [() => toValue(trackOrTrackReference), () => toValue(options)],\n    ([trackOrRef, currentOptions]: [any, AudioWaveformOptions], _oldVal, onCleanup) => {\n      const track =\n        trackOrRef instanceof Track\n          ? trackOrRef\n          : <LocalAudioTrack | RemoteAudioTrack | undefined>trackOrRef?.publication?.track;\n\n      const opts = { ...waveformDefaults, ...currentOptions };\n\n      if (!track || !track.mediaStream) {\n        bars.value = [];\n        return;\n      }\n\n      const { analyser, cleanup } = createAudioAnalyser(\n        track as LocalAudioTrack | RemoteAudioTrack,\n        {\n          fftSize: getFFTSizeValue(opts.barCount),\n        },\n      );\n\n      const bufferLength = getFFTSizeValue(opts.barCount);\n      const dataArray = new Float32Array(bufferLength);\n\n      const onUpdate = (wave: Float32Array) => {\n        bars.value = Array.from(\n          filterData(wave, opts.barCount).map((v) => Math.sqrt(v) * opts.volMultiplier),\n        );\n      };\n\n      const update = () => {\n        updateWaveform = requestAnimationFrame(update);\n        analyser.getFloatTimeDomainData(dataArray);\n        aggregateWave.value.map((v, i) => v + dataArray[i]);\n        updates.value += 1;\n\n        if (performance.now() - timeRef.value >= opts.updateInterval) {\n          const newData = dataArray.map((v) => v / updates.value);\n          onUpdate(newData);\n          timeRef.value = performance.now();\n          updates.value = 0;\n        }\n      };\n\n      let updateWaveform = requestAnimationFrame(update);\n\n      onCleanup(() => {\n        cleanup();\n        cancelAnimationFrame(updateWaveform);\n      });\n    },\n    { immediate: true, deep: true },\n  );\n\n  return { bars };\n}\n\nfunction getFFTSizeValue(x: number) {\n  if (x < 32) return 32;\n  else return pow2ceil(x);\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","import type { Participant } from 'livekit-client';\nimport {\n  inject,\n  provide,\n  shallowRef,\n  type InjectionKey,\n  type ShallowRef,\n  computed,\n  toValue,\n  type MaybeRef,\n  type ComputedRef,\n} from 'vue';\n\nexport type ParticipantContext = ShallowRef<Participant | undefined>;\n\nconst ParticipantContextKey: InjectionKey<ParticipantContext> = Symbol(\n  'livekit-participant-context',\n);\n\nfunction useProvideParticipantContext(initialValue: Participant): ParticipantContext {\n  const context = shallowRef<Participant | undefined>(initialValue);\n  provide(ParticipantContextKey, context);\n  return context;\n}\n\nfunction useParticipantContextRaw(): ParticipantContext | undefined {\n  return inject(ParticipantContextKey, undefined);\n}\n\nexport { useParticipantContextRaw, useProvideParticipantContext };\n\nexport function useMaybeParticipantContext(): ParticipantContext | undefined {\n  return useParticipantContextRaw();\n}\n\nexport function useParticipantContext(): ParticipantContext {\n  return useParticipantContextRaw() ?? shallowRef(undefined);\n}\n\nexport function useResolveParticipant(\n  participantRef?: MaybeRef<Participant | undefined>,\n): ComputedRef<Participant | undefined> {\n  const participantFromContext = useMaybeParticipantContext();\n\n  return computed(() => {\n    const participantFromProp = toValue(participantRef);\n    if (participantFromProp) {\n      return participantFromProp;\n    }\n\n    const participantFromCtx = participantFromContext?.value;\n    if (participantFromCtx) {\n      return participantFromCtx;\n    }\n\n    return undefined;\n  });\n}\n\nexport function useEnsureParticipant(\n  participantRef?: MaybeRef<Participant | undefined>,\n): ComputedRef<Participant> {\n  const resolvedParticipant = useResolveParticipant(participantRef);\n\n  return computed(() => {\n    const p = resolvedParticipant.value;\n    if (!p) {\n      throw new Error(\n        'Participant could not be found in props or context. Please ensure that a participant is provided.',\n      );\n    }\n    return p;\n  });\n}\n","import { computed, type MaybeRef } from 'vue';\nimport { setupConnectionQualityIndicator } from '@livekit/components-core';\nimport type { Participant } from 'livekit-client';\nimport { useObservableState } from './useObservableState';\nimport { useEnsureParticipant } from './useParticipantContext';\n\nexport interface ConnectionQualityIndicatorOptions {\n  participant?: MaybeRef<Participant | undefined>;\n}\n\nexport function useConnectionQualityIndicator(options: ConnectionQualityIndicatorOptions = {}) {\n  const p = useEnsureParticipant(options.participant);\n\n  const setup = computed(() => setupConnectionQualityIndicator(p.value));\n\n  const className = computed(() => setup.value.className);\n  const connectionQualityObserver = computed(() => setup.value.connectionQualityObserver);\n\n  const quality = useObservableState(connectionQualityObserver, p.value.connectionQuality);\n\n  return {\n    quality,\n    className,\n  };\n}\n","import { computed } from 'vue';\nimport { connectionStateObserver } from '@livekit/components-core';\nimport { useEnsureRoom } from './useRoomContext';\nimport type { ConnectionState, Room } from 'livekit-client';\nimport { useObservableState } from './useObservableState';\n\nexport function useConnectionState(room?: Room) {\n  const r = useEnsureRoom(room);\n  const observable = computed(() => connectionStateObserver(r.value!));\n  const connectionState = useObservableState<ConnectionState>(observable, r.value!.state);\n  return connectionState;\n}\n","import { ref, computed, watch, toValue, type Ref, type MaybeRef } from 'vue';\nimport {\n  type TrackReferenceOrPlaceholder,\n  getTrackReferenceId,\n  mutedObserver,\n} from '@livekit/components-core';\nimport type { Participant, Track } from 'livekit-client';\nimport { useEnsureParticipant } from './useParticipantContext';\n\nexport interface UseIsMutedOptions {\n  participant?: MaybeRef<Participant | undefined>;\n}\n\nexport function useIsMuted(trackRef: MaybeRef<TrackReferenceOrPlaceholder>): Ref<boolean>;\nexport function useIsMuted(\n  sourceOrTrackRef: MaybeRef<TrackReferenceOrPlaceholder | Track.Source>,\n  options: UseIsMutedOptions = {},\n): Ref<boolean> {\n  const isMuted = ref(false);\n\n  const resolvedTrackRef = computed<TrackReferenceOrPlaceholder>(() => {\n    const _sourceOrTrackRef = toValue(sourceOrTrackRef);\n    const _participant = toValue(options.participant);\n    const passedParticipant =\n      typeof _sourceOrTrackRef === 'string' ? _participant : _sourceOrTrackRef.participant;\n    const p = useEnsureParticipant(passedParticipant);\n    if (typeof _sourceOrTrackRef === 'string') {\n      return { participant: toValue(p), source: _sourceOrTrackRef };\n    }\n    return _sourceOrTrackRef;\n  });\n\n  watch(\n    resolvedTrackRef,\n    (\n      newTrackRef: TrackReferenceOrPlaceholder,\n      oldTrackRef: TrackReferenceOrPlaceholder | undefined,\n      onCleanup,\n    ) => {\n      if (!newTrackRef) {\n        isMuted.value = false;\n        return;\n      }\n\n      if (oldTrackRef && getTrackReferenceId(newTrackRef) === getTrackReferenceId(oldTrackRef)) {\n        return;\n      }\n\n      const listener = mutedObserver(newTrackRef).subscribe((muted) => {\n        isMuted.value = muted;\n      });\n\n      onCleanup(() => {\n        listener.unsubscribe();\n      });\n    },\n    { immediate: true },\n  );\n\n  return isMuted;\n}\n","import { ref, shallowRef, watch, toValue, type MaybeRef } from 'vue';\nimport type { ParticipantMedia } from '@livekit/components-core';\nimport { observeParticipantMedia } from '@livekit/components-core';\nimport type { TrackPublication, LocalParticipant, Room } from 'livekit-client';\nimport { useEnsureRoom } from './useRoomContext';\n\nexport interface UseLocalParticipantOptions {\n  room?: MaybeRef<Room | undefined>;\n}\n\nexport function useLocalParticipant(options: UseLocalParticipantOptions = {}) {\n  const room = useEnsureRoom(toValue(options.room));\n\n  const localParticipant = shallowRef<LocalParticipant>(room.value!.localParticipant);\n  const isMicrophoneEnabled = ref(localParticipant.value.isMicrophoneEnabled);\n  const isCameraEnabled = ref(localParticipant.value.isCameraEnabled);\n  const isScreenShareEnabled = ref(localParticipant.value.isScreenShareEnabled);\n  const lastMicrophoneError = ref(localParticipant.value.lastMicrophoneError);\n  const lastCameraError = ref(localParticipant.value.lastCameraError);\n  const microphoneTrack = shallowRef<TrackPublication | undefined>(undefined);\n  const cameraTrack = shallowRef<TrackPublication | undefined>(undefined);\n\n  const handleUpdate = (media: ParticipantMedia<LocalParticipant>) => {\n    isCameraEnabled.value = media.isCameraEnabled;\n    isMicrophoneEnabled.value = media.isMicrophoneEnabled;\n    isScreenShareEnabled.value = media.isScreenShareEnabled;\n    cameraTrack.value = media.cameraTrack;\n    microphoneTrack.value = media.microphoneTrack;\n    lastMicrophoneError.value = media.participant.lastMicrophoneError;\n    lastCameraError.value = media.participant.lastCameraError;\n    localParticipant.value = media.participant;\n  };\n\n  watch(\n    () => room.value,\n    (newRoom: Room | undefined, _oldRoom: Room | undefined, onCleanup) => {\n      if (!newRoom) return;\n\n      const listener = observeParticipantMedia(newRoom.localParticipant).subscribe(handleUpdate);\n\n      onCleanup(() => {\n        listener.unsubscribe();\n      });\n    },\n    { immediate: true },\n  );\n\n  return {\n    isMicrophoneEnabled,\n    isScreenShareEnabled,\n    isCameraEnabled,\n    microphoneTrack,\n    cameraTrack,\n    lastMicrophoneError,\n    lastCameraError,\n    localParticipant,\n  };\n}\n","import { shallowRef, watch, markRaw, toValue, type MaybeRef } from 'vue';\nimport type { RoomEvent, RemoteParticipant, Room } from 'livekit-client';\nimport { connectedParticipantsObserver } from '@livekit/components-core';\nimport { useEnsureRoom } from './useRoomContext.js';\n\nexport interface UseRemoteParticipantsOptions {\n  updateOnlyOn?: MaybeRef<RoomEvent[] | undefined>;\n  room?: MaybeRef<Room | undefined>;\n}\n\nexport function useRemoteParticipants(options: UseRemoteParticipantsOptions = {}) {\n  const room = useEnsureRoom(toValue(options.room));\n  const participants = shallowRef<RemoteParticipant[]>([]);\n\n  watch(\n    [() => markRaw(room.value!), () => toValue(options.updateOnlyOn)],\n    ([r, updateOnlyOn]: [Room, RoomEvent[] | undefined], _oldVal, onCleanup) => {\n      const observable = connectedParticipantsObserver(r, {\n        additionalRoomEvents: updateOnlyOn,\n      });\n      const subscription = observable.subscribe((p: RemoteParticipant[]) => {\n        participants.value = p;\n      });\n      onCleanup(() => {\n        subscription.unsubscribe();\n      });\n    },\n    {\n      immediate: true,\n      deep: true,\n    },\n  );\n\n  return participants;\n}\n","import type { Room, RoomEvent } from 'livekit-client';\nimport { computed, type MaybeRef } from 'vue';\nimport { useLocalParticipant } from './useLocalParticipant';\nimport { useRemoteParticipants } from './useRemoteParticipants';\n\nexport interface UseParticipantsOptions {\n  updateOnlyOn?: MaybeRef<RoomEvent[] | undefined>;\n  room?: MaybeRef<Room | undefined>;\n}\n\nexport function useParticipants(options: UseParticipantsOptions = {}) {\n  const remoteParticipants = useRemoteParticipants(options);\n  const { localParticipant } = useLocalParticipant({ room: options.room });\n\n  return computed(() => [\n    ...(localParticipant.value ? [localParticipant.value] : []),\n    ...(remoteParticipants.value || []),\n  ]);\n}\n","import type { CaptureOptionsBySource, ToggleSource } from '@livekit/components-core';\nimport { setupMediaToggle, setupManualToggle, log } from '@livekit/components-core';\nimport type { TrackPublishOptions } from 'livekit-client';\nimport { computed, ref, watchEffect, type Ref } from 'vue';\nimport { useObservableState } from './useObservableState';\nimport { useRoomContext } from './useRoomContext';\n\nexport interface UseTrackToggleProps<T extends ToggleSource> {\n  source: T;\n  onChange?: (enabled: boolean, isUserInitiated: boolean) => void;\n  initialState?: boolean;\n  captureOptions?: CaptureOptionsBySource<T>;\n  publishOptions?: TrackPublishOptions;\n  onDeviceError?: (error: Error) => void;\n}\n\nexport interface UseTrackToggleReturn {\n  toggle: (forceState?: boolean) => Promise<void | boolean | undefined>;\n  enabled: Ref<boolean>;\n  pending: Ref<boolean>;\n  className: string;\n}\n\nexport function useTrackToggle<T extends ToggleSource>(\n  props: UseTrackToggleProps<T>,\n): UseTrackToggleReturn {\n  const room = useRoomContext();\n  const track = computed(() => room.value?.localParticipant?.getTrackPublication(props.source));\n\n  const userInteractionRef = ref(false);\n\n  const { toggle, className, pendingObserver, enabledObserver } = computed(() =>\n    room.value\n      ? setupMediaToggle<T>(\n          props.source,\n          room.value,\n          props.captureOptions,\n          props.publishOptions,\n          props.onDeviceError,\n        )\n      : setupManualToggle(),\n  ).value;\n\n  const pending = useObservableState(pendingObserver, false);\n  const enabled = useObservableState(\n    enabledObserver,\n    props.initialState ?? !!track.value?.isEnabled,\n  );\n\n  watchEffect(() => {\n    if (props.onChange) {\n      props.onChange(enabled.value, userInteractionRef.value);\n    }\n    userInteractionRef.value = false;\n  });\n\n  watchEffect((onCleanup) => {\n    let mounted = true;\n    onCleanup(() => {\n      mounted = false;\n    });\n\n    if (props.initialState !== undefined && mounted) {\n      log.debug('forcing initial toggle state', props.source, props.initialState);\n      toggle(props.initialState);\n    }\n  });\n\n  const handleToggle = (forceState?: boolean) => {\n    userInteractionRef.value = true;\n    return toggle(forceState)\n      .then((result) => {\n        userInteractionRef.value = false;\n        return result;\n      })\n      .catch((error) => {\n        userInteractionRef.value = false;\n        throw error;\n      });\n  };\n\n  return {\n    toggle: handleToggle,\n    enabled,\n    pending,\n    className,\n  };\n}\n","import { shallowRef, computed, watch, toValue, type ShallowRef, type MaybeRef } from 'vue';\nimport type { Track } from 'livekit-client';\nimport { participantTracksObservable, type TrackReference } from '@livekit/components-core';\nimport { useRemoteParticipants } from './useRemoteParticipants';\nimport { useMaybeParticipantContext } from './useParticipantContext';\n\nexport function useParticipantTracks(\n  sources: MaybeRef<Track.Source[]>,\n  participantIdentity?: MaybeRef<string | undefined>,\n): ShallowRef<TrackReference[]> {\n  const participantContext = useMaybeParticipantContext();\n  const remoteParticipants = useRemoteParticipants({ updateOnlyOn: [] });\n  const trackRefs = shallowRef<TrackReference[]>([]);\n\n  const participant = computed(() => {\n    const identity = toValue(participantIdentity);\n    if (identity) {\n      return remoteParticipants.value.find((p) => p.identity === identity);\n    }\n    return toValue(participantContext);\n  });\n\n  // todo participant object deep watch performance problem\n  watch(\n    [participant, () => toValue(sources)],\n    ([p, currentSources]: [any, Track.Source[]], _oldVal, onCleanup) => {\n      if (!p) {\n        trackRefs.value = [];\n        return;\n      }\n\n      const observable = participantTracksObservable(p, {\n        sources: currentSources,\n      });\n\n      const subscription = observable.subscribe((tracks: TrackReference[]) => {\n        trackRefs.value = tracks;\n      });\n\n      onCleanup(() => {\n        subscription.unsubscribe();\n      });\n    },\n    {\n      immediate: true,\n      deep: true,\n    },\n  );\n\n  return trackRefs;\n}\n","import { ref, computed, watchEffect, toValue, type MaybeRef } from 'vue';\nimport { participantAttributesObserver } from '@livekit/components-core';\nimport { type Participant } from 'livekit-client';\nimport { useEnsureParticipant, useMaybeParticipantContext } from './useParticipantContext';\nimport { useObservableState } from './useObservableState';\n\nexport interface UseParticipantAttributesOptions {\n  participant?: MaybeRef<Participant | undefined>;\n}\n\nexport function useParticipantAttributes(options: UseParticipantAttributesOptions = {}) {\n  const participantContext = useMaybeParticipantContext();\n  const participant = computed(() => toValue(options.participant) ?? toValue(participantContext));\n\n  const attributeObserver = computed(() => {\n    const p = participant.value;\n    // weird typescript constraint\n    return p ? participantAttributesObserver(p) : participantAttributesObserver(p);\n  });\n\n  const attributeState = useObservableState<{\n    changed?: Participant['attributes'];\n    attributes?: Participant['attributes'];\n  }>(attributeObserver, {\n    changed: undefined,\n    attributes: participant.value?.attributes,\n  });\n\n  return attributeState;\n}\n\nexport function useParticipantAttribute(\n  attributeKey: MaybeRef<string>,\n  options: UseParticipantAttributesOptions = {},\n) {\n  const participant = useEnsureParticipant(toValue(options.participant));\n  const attribute = ref(participant.value.attributes[toValue(attributeKey)]);\n\n  watchEffect((onCleanup) => {\n    const p = participant.value;\n    const key = toValue(attributeKey);\n\n    if (!p) {\n      return;\n    }\n\n    attribute.value = p.attributes[key];\n\n    const subscription = participantAttributesObserver(p).subscribe((val) => {\n      if (val.changed[key] !== undefined) {\n        attribute.value = val.attributes[key];\n      }\n    });\n\n    onCleanup(() => {\n      subscription.unsubscribe();\n    });\n  });\n\n  return attribute;\n}\n","import { computed, reactive } from 'vue';\nimport { ConnectionState, ParticipantKind, Track } from 'livekit-client';\nimport type { RemoteParticipant } from 'livekit-client';\nimport type { TrackReference } from '@livekit/components-core';\nimport { useParticipantTracks } from './useParticipantTracks';\nimport { useRemoteParticipants } from './useRemoteParticipants';\nimport { useConnectionState } from './useConnectionStatus';\nimport { useParticipantAttributes } from './useParticipantAttributes';\n\nexport type AgentState =\n  | 'disconnected'\n  | 'connecting'\n  | 'initializing'\n  | 'listening'\n  | 'thinking'\n  | 'speaking';\n\nexport interface VoiceAssistant {\n  agent: RemoteParticipant | undefined;\n  state: AgentState;\n  audioTrack: TrackReference | undefined;\n  videoTrack: TrackReference | undefined;\n  // agentTranscriptions: ReceivedTranscriptionSegment[];\n  agentAttributes: RemoteParticipant['attributes'] | undefined;\n}\n\nconst state_attribute = 'lk.agent.state';\n\nexport function useVoiceAssistant(): VoiceAssistant {\n  const remoteParticipants = useRemoteParticipants();\n\n  const agent = computed(() =>\n    remoteParticipants.value.find(\n      (p: RemoteParticipant) =>\n        p.kind === ParticipantKind.AGENT && !('lk.publish_on_behalf' in p.attributes),\n    ),\n  );\n\n  const worker = computed(() =>\n    remoteParticipants.value.find(\n      (p: RemoteParticipant) =>\n        p.kind === ParticipantKind.AGENT &&\n        p.attributes['lk.publish_on_behalf'] === agent.value?.identity,\n    ),\n  );\n\n  const agentIdentity = computed(() => agent.value?.identity);\n  const workerIdentity = computed(() => worker.value?.identity);\n\n  const agentTracks = useParticipantTracks(\n    [Track.Source.Microphone, Track.Source.Camera],\n    agentIdentity,\n  );\n\n  const workerTracks = useParticipantTracks(\n    [Track.Source.Microphone, Track.Source.Camera],\n    workerIdentity,\n  );\n\n  const audioTrack = computed(\n    () =>\n      agentTracks.value.find((t) => t.source === Track.Source.Microphone) ??\n      workerTracks.value.find((t) => t.source === Track.Source.Microphone),\n  );\n\n  const videoTrack = computed(\n    () =>\n      agentTracks.value.find((t) => t.source === Track.Source.Camera) ??\n      workerTracks.value.find((t) => t.source === Track.Source.Camera),\n  );\n\n  const connectionState = useConnectionState();\n  const attributeState = useParticipantAttributes({\n    participant: agent,\n  });\n\n  const agentAttributes = computed(() => attributeState.value.attributes);\n\n  const state = computed(() => {\n    if (connectionState.value === ConnectionState.Disconnected) {\n      return 'disconnected';\n    } else if (\n      connectionState.value === ConnectionState.Connecting ||\n      !agent.value ||\n      !agentAttributes.value?.[state_attribute]\n    ) {\n      return 'connecting';\n    } else {\n      return agentAttributes.value[state_attribute] as AgentState;\n    }\n  });\n\n  return reactive({\n    agent,\n    state,\n    audioTrack,\n    videoTrack,\n    agentAttributes,\n  });\n}\n"],"names":["RoomContextKey","useProvideRoomContext","initialValue","ctx","shallowRef","provide","useMaybeRoomContext","inject","useRoomContext","useEnsureRoom","room","r","computed","toValue","roomOptionsStringifyReplacer","key","val","defaultRoomOptions","useLiveKitRoom","opts","props","token","serverUrl","options","passedRoom","connectOptions","connect","audio","video","screen","onConnected","onDisconnected","onError","onMediaDeviceFailure","onEncryptionError","simulateParticipants","log","shouldConnect","ref","watch","newValues","oldValues","_passedRoom","_optionsString","_oldPassedRoom","_oldOptionsString","markRaw","Room","watchEffect","onCleanup","_room","_audio","_video","_screen","onSignalConnected","localP","e","handleMediaDeviceError","kind","mediaDeviceFailure","MediaDeviceFailure","handleEncryptionError","handleDisconnected","reason","handleConnected","RoomEvent","_connect","_token","_connectOptions","_serverUrl","_simulateParticipants","onBeforeUnmount","_a","useTracks","sources","Track","trackReferences","participants","sourcesComputed","s","isSourceWitOptions","room_","sources_","onlySubscribed","updateOnlyOn","subscription","trackReferencesObservable","t","p","isSourcesWithOptions","requirePlaceholder","requiredPlaceholders","trackReferencesWithPlaceholders","participant","placeholderSource","publication","placeholder","difference","setA","setB","_difference","elem","placeholderMap","sourcesThatNeedPlaceholder","sourceWithOption","sourcesOfSubscribedTracks","pub","trackSource","placeholderNeededForThisParticipant","useObservableState","observable","startWith","state","obs","_oldObs","value","useMediaDeviceSelect","roomContext","roomFallback","deviceObserver","createMediaDeviceObserver","devices","currentDeviceId","deviceSelector","setupDeviceSelector","listener","deviceId","className","id","useDebounce","delay","debouncedValue","timeout","newValue","useElementVisibility","element","isVisible","observer","onMounted","entries","useTrackVolume","trackOrTrackReference","volume","trackOrRef","currentOptions","_oldVal","track","isTrackReference","cleanup","analyser","createAudioAnalyser","bufferLength","dataArray","interval","sum","i","a","normalizeFrequencies","frequencies","normalizeDb","db","multibandDefaults","useMultibandTrackVolume","frequencyBands","normalizedFrequencies","chunkSize","chunks","summedVolumes","acc","waveformDefaults","useAudioWaveform","aggregateWave","timeRef","updates","bars","getFFTSizeValue","onUpdate","wave","filterData","v","update","updateWaveform","newData","x","pow2ceil","audioData","numSamples","blockSize","filteredData","blockStart","j","ParticipantContextKey","useParticipantContextRaw","useMaybeParticipantContext","useResolveParticipant","participantRef","participantFromContext","participantFromProp","participantFromCtx","useEnsureParticipant","resolvedParticipant","useConnectionQualityIndicator","setup","setupConnectionQualityIndicator","connectionQualityObserver","useConnectionState","connectionStateObserver","useIsMuted","sourceOrTrackRef","isMuted","resolvedTrackRef","_sourceOrTrackRef","_participant","passedParticipant","newTrackRef","oldTrackRef","getTrackReferenceId","mutedObserver","muted","useLocalParticipant","localParticipant","isMicrophoneEnabled","isCameraEnabled","isScreenShareEnabled","lastMicrophoneError","lastCameraError","microphoneTrack","cameraTrack","handleUpdate","media","newRoom","_oldRoom","observeParticipantMedia","useRemoteParticipants","connectedParticipantsObserver","useParticipants","remoteParticipants","useTrackToggle","_b","userInteractionRef","toggle","pendingObserver","enabledObserver","setupMediaToggle","setupManualToggle","pending","enabled","mounted","forceState","result","error","useParticipantTracks","participantIdentity","participantContext","trackRefs","identity","currentSources","participantTracksObservable","tracks","useParticipantAttributes","attributeObserver","participantAttributesObserver","useParticipantAttribute","attributeKey","attribute","state_attribute","useVoiceAssistant","agent","ParticipantKind","worker","agentIdentity","workerIdentity","agentTracks","workerTracks","audioTrack","videoTrack","connectionState","attributeState","agentAttributes","ConnectionState","reactive"],"mappings":"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"}