@livekit/react-native 2.5.1 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +4 -3
  2. package/android/build.gradle +2 -1
  3. package/android/src/main/java/com/livekit/reactnative/LiveKitReactNative.kt +61 -5
  4. package/android/src/main/java/com/livekit/reactnative/LivekitReactNativeModule.kt +81 -4
  5. package/android/src/main/java/com/livekit/reactnative/audio/events/Events.kt +6 -0
  6. package/android/src/main/java/com/livekit/reactnative/audio/processing/AudioFormat.kt +2 -0
  7. package/android/src/main/java/com/livekit/reactnative/audio/processing/AudioProcessingController.kt +27 -0
  8. package/android/src/main/java/com/livekit/reactnative/audio/processing/AudioProcessorInterface.kt +52 -0
  9. package/android/src/main/java/com/livekit/reactnative/audio/processing/AudioRecordSamplesDispatcher.kt +72 -0
  10. package/android/src/main/java/com/livekit/reactnative/audio/processing/AudioSinkManager.kt +75 -0
  11. package/android/src/main/java/com/livekit/reactnative/audio/processing/CustomAudioProcessingFactory.kt +78 -0
  12. package/android/src/main/java/com/livekit/reactnative/audio/processing/MultibandVolumeProcessor.kt +181 -0
  13. package/android/src/main/java/com/livekit/reactnative/audio/processing/VolumeProcessor.kt +67 -0
  14. package/android/src/main/java/com/livekit/reactnative/audio/processing/fft/FFTAudioAnalyzer.kt +224 -0
  15. package/ios/LKAudioProcessingAdapter.h +26 -0
  16. package/ios/LKAudioProcessingAdapter.m +117 -0
  17. package/ios/LKAudioProcessingManager.h +34 -0
  18. package/ios/LKAudioProcessingManager.m +63 -0
  19. package/ios/LivekitReactNative-Bridging-Header.h +2 -0
  20. package/ios/LivekitReactNative.h +9 -4
  21. package/ios/LivekitReactNative.m +83 -5
  22. package/ios/Logging.swift +4 -0
  23. package/ios/audio/AVAudioPCMBuffer.swift +136 -0
  24. package/ios/audio/AudioProcessing.swift +163 -0
  25. package/ios/audio/AudioRendererManager.swift +72 -0
  26. package/ios/audio/FFTProcessor.swift +147 -0
  27. package/ios/audio/MultibandVolumeAudioRenderer.swift +65 -0
  28. package/ios/audio/RingBuffer.swift +51 -0
  29. package/ios/audio/VolumeAudioRenderer.swift +48 -0
  30. package/lib/commonjs/LKNativeModule.js +18 -0
  31. package/lib/commonjs/LKNativeModule.js.map +1 -0
  32. package/lib/commonjs/components/BarVisualizer.js +192 -0
  33. package/lib/commonjs/components/BarVisualizer.js.map +1 -0
  34. package/lib/commonjs/events/EventEmitter.js +45 -0
  35. package/lib/commonjs/events/EventEmitter.js.map +1 -0
  36. package/lib/commonjs/hooks/useMultibandTrackVolume.js +64 -0
  37. package/lib/commonjs/hooks/useMultibandTrackVolume.js.map +1 -0
  38. package/lib/commonjs/hooks/useTrackVolume.js +45 -0
  39. package/lib/commonjs/hooks/useTrackVolume.js.map +1 -0
  40. package/lib/commonjs/hooks.js +24 -0
  41. package/lib/commonjs/hooks.js.map +1 -1
  42. package/lib/commonjs/index.js +14 -0
  43. package/lib/commonjs/index.js.map +1 -1
  44. package/lib/module/LKNativeModule.js +12 -0
  45. package/lib/module/LKNativeModule.js.map +1 -0
  46. package/lib/module/components/BarVisualizer.js +182 -0
  47. package/lib/module/components/BarVisualizer.js.map +1 -0
  48. package/lib/module/events/EventEmitter.js +36 -0
  49. package/lib/module/events/EventEmitter.js.map +1 -0
  50. package/lib/module/hooks/useMultibandTrackVolume.js +58 -0
  51. package/lib/module/hooks/useMultibandTrackVolume.js.map +1 -0
  52. package/lib/module/hooks/useTrackVolume.js +39 -0
  53. package/lib/module/hooks/useTrackVolume.js.map +1 -0
  54. package/lib/module/hooks.js +2 -0
  55. package/lib/module/hooks.js.map +1 -1
  56. package/lib/module/index.js +3 -0
  57. package/lib/module/index.js.map +1 -1
  58. package/lib/typescript/lib/commonjs/LKNativeModule.d.ts +3 -0
  59. package/lib/typescript/lib/commonjs/components/BarVisualizer.d.ts +32 -0
  60. package/lib/typescript/lib/commonjs/events/EventEmitter.d.ts +4 -0
  61. package/lib/typescript/lib/commonjs/hooks/useMultibandTrackVolume.d.ts +8 -0
  62. package/lib/typescript/lib/commonjs/hooks/useTrackVolume.d.ts +8 -0
  63. package/lib/typescript/lib/module/LKNativeModule.d.ts +2 -0
  64. package/lib/typescript/lib/module/components/BarVisualizer.d.ts +10 -0
  65. package/lib/typescript/lib/module/events/EventEmitter.d.ts +3 -0
  66. package/lib/typescript/lib/module/hooks/useMultibandTrackVolume.d.ts +7 -0
  67. package/lib/typescript/lib/module/hooks/useTrackVolume.d.ts +7 -0
  68. package/lib/typescript/lib/module/hooks.d.ts +2 -0
  69. package/lib/typescript/lib/module/index.d.ts +1 -0
  70. package/lib/typescript/src/LKNativeModule.d.ts +2 -0
  71. package/lib/typescript/src/components/BarVisualizer.d.ts +49 -0
  72. package/lib/typescript/src/events/EventEmitter.d.ts +6 -0
  73. package/lib/typescript/src/hooks/useMultibandTrackVolume.d.ts +31 -0
  74. package/lib/typescript/src/hooks/useTrackVolume.d.ts +9 -0
  75. package/lib/typescript/src/hooks.d.ts +2 -0
  76. package/lib/typescript/src/index.d.ts +1 -0
  77. package/livekit-react-native.podspec +1 -1
  78. package/package.json +5 -5
  79. package/src/LKNativeModule.ts +19 -0
  80. package/src/components/BarVisualizer.tsx +252 -0
  81. package/src/events/EventEmitter.ts +51 -0
  82. package/src/hooks/useMultibandTrackVolume.ts +97 -0
  83. package/src/hooks/useTrackVolume.ts +62 -0
  84. package/src/hooks.ts +2 -0
  85. package/src/index.tsx +3 -0
@@ -0,0 +1,39 @@
1
+ import { Track } from 'livekit-client';
2
+ import { useEffect, useState } from 'react';
3
+ import { addListener, removeListener } from '../events/EventEmitter';
4
+ import LiveKitModule from '../LKNativeModule';
5
+
6
+ /**
7
+ * A hook for tracking the volume of an audio track.
8
+ *
9
+ * @param trackOrTrackReference
10
+ * @returns A number between 0-1 representing the volume.
11
+ */
12
+ export function useTrackVolume(trackOrTrackReference) {
13
+ var _trackOrTrackReferenc;
14
+ const track = trackOrTrackReference instanceof Track ? trackOrTrackReference : trackOrTrackReference === null || trackOrTrackReference === void 0 || (_trackOrTrackReferenc = trackOrTrackReference.publication) === null || _trackOrTrackReferenc === void 0 ? void 0 : _trackOrTrackReferenc.track;
15
+ const mediaStreamTrack = track === null || track === void 0 ? void 0 : track.mediaStreamTrack;
16
+ let [volume, setVolume] = useState(0.0);
17
+ useEffect(() => {
18
+ let listener = Object();
19
+ let reactTag = null;
20
+ if (mediaStreamTrack) {
21
+ reactTag = LiveKitModule.createVolumeProcessor(mediaStreamTrack._peerConnectionId ?? -1, mediaStreamTrack.id);
22
+ addListener(listener, 'LK_VOLUME_PROCESSED', event => {
23
+ if (event.volume && reactTag && event.id === reactTag) {
24
+ setVolume(event.volume);
25
+ }
26
+ });
27
+ }
28
+ return () => {
29
+ if (mediaStreamTrack) {
30
+ removeListener(listener);
31
+ if (reactTag) {
32
+ LiveKitModule.deleteVolumeProcessor(reactTag, mediaStreamTrack._peerConnectionId ?? -1, mediaStreamTrack.id);
33
+ }
34
+ }
35
+ };
36
+ }, [mediaStreamTrack]);
37
+ return volume;
38
+ }
39
+ //# sourceMappingURL=useTrackVolume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["Track","useEffect","useState","addListener","removeListener","LiveKitModule","useTrackVolume","trackOrTrackReference","_trackOrTrackReferenc","track","publication","mediaStreamTrack","volume","setVolume","listener","Object","reactTag","createVolumeProcessor","_peerConnectionId","id","event","deleteVolumeProcessor"],"sources":["useTrackVolume.ts"],"sourcesContent":["import { type TrackReferenceOrPlaceholder } from '@livekit/components-react';\nimport {\n Track,\n type LocalAudioTrack,\n type RemoteAudioTrack,\n} from 'livekit-client';\nimport { useEffect, useState } from 'react';\nimport { addListener, removeListener } from '../events/EventEmitter';\nimport LiveKitModule from '../LKNativeModule';\n\n/**\n * A hook for tracking the volume of an audio track.\n *\n * @param trackOrTrackReference\n * @returns A number between 0-1 representing the volume.\n */\nexport function useTrackVolume(\n trackOrTrackReference?:\n | LocalAudioTrack\n | RemoteAudioTrack\n | TrackReferenceOrPlaceholder\n) {\n const track =\n trackOrTrackReference instanceof Track\n ? trackOrTrackReference\n : <LocalAudioTrack | RemoteAudioTrack | undefined>(\n trackOrTrackReference?.publication?.track\n );\n\n const mediaStreamTrack = track?.mediaStreamTrack;\n\n let [volume, setVolume] = useState(0.0);\n useEffect(() => {\n let listener = Object();\n let reactTag: string | null = null;\n if (mediaStreamTrack) {\n reactTag = LiveKitModule.createVolumeProcessor(\n mediaStreamTrack._peerConnectionId ?? -1,\n mediaStreamTrack.id\n );\n addListener(listener, 'LK_VOLUME_PROCESSED', (event: any) => {\n if (event.volume && reactTag && event.id === reactTag) {\n setVolume(event.volume);\n }\n });\n }\n return () => {\n if (mediaStreamTrack) {\n removeListener(listener);\n if (reactTag) {\n LiveKitModule.deleteVolumeProcessor(\n reactTag,\n mediaStreamTrack._peerConnectionId ?? -1,\n mediaStreamTrack.id\n );\n }\n }\n };\n }, [mediaStreamTrack]);\n\n return volume;\n}\n"],"mappings":"AACA,SACEA,KAAK,QAGA,gBAAgB;AACvB,SAASC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAC3C,SAASC,WAAW,EAAEC,cAAc,QAAQ,wBAAwB;AACpE,OAAOC,aAAa,MAAM,mBAAmB;;AAE7C;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,cAAcA,CAC5BC,qBAG+B,EAC/B;EAAA,IAAAC,qBAAA;EACA,MAAMC,KAAK,GACTF,qBAAqB,YAAYP,KAAK,GAClCO,qBAAqB,GAEnBA,qBAAqB,aAArBA,qBAAqB,gBAAAC,qBAAA,GAArBD,qBAAqB,CAAEG,WAAW,cAAAF,qBAAA,uBAAlCA,qBAAA,CAAoCC,KACrC;EAEP,MAAME,gBAAgB,GAAGF,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEE,gBAAgB;EAEhD,IAAI,CAACC,MAAM,EAAEC,SAAS,CAAC,GAAGX,QAAQ,CAAC,GAAG,CAAC;EACvCD,SAAS,CAAC,MAAM;IACd,IAAIa,QAAQ,GAAGC,MAAM,CAAC,CAAC;IACvB,IAAIC,QAAuB,GAAG,IAAI;IAClC,IAAIL,gBAAgB,EAAE;MACpBK,QAAQ,GAAGX,aAAa,CAACY,qBAAqB,CAC5CN,gBAAgB,CAACO,iBAAiB,IAAI,CAAC,CAAC,EACxCP,gBAAgB,CAACQ,EACnB,CAAC;MACDhB,WAAW,CAACW,QAAQ,EAAE,qBAAqB,EAAGM,KAAU,IAAK;QAC3D,IAAIA,KAAK,CAACR,MAAM,IAAII,QAAQ,IAAII,KAAK,CAACD,EAAE,KAAKH,QAAQ,EAAE;UACrDH,SAAS,CAACO,KAAK,CAACR,MAAM,CAAC;QACzB;MACF,CAAC,CAAC;IACJ;IACA,OAAO,MAAM;MACX,IAAID,gBAAgB,EAAE;QACpBP,cAAc,CAACU,QAAQ,CAAC;QACxB,IAAIE,QAAQ,EAAE;UACZX,aAAa,CAACgB,qBAAqB,CACjCL,QAAQ,EACRL,gBAAgB,CAACO,iBAAiB,IAAI,CAAC,CAAC,EACxCP,gBAAgB,CAACQ,EACnB,CAAC;QACH;MACF;IACF,CAAC;EACH,CAAC,EAAE,CAACR,gBAAgB,CAAC,CAAC;EAEtB,OAAOC,MAAM;AACf","ignoreList":[]}
@@ -1,3 +1,5 @@
1
1
  export { useConnectionState, useDataChannel, useIsSpeaking, useLocalParticipant, useLocalParticipantPermissions, useParticipantInfo, useParticipants, useRemoteParticipants, useRemoteParticipant, useSpeakingParticipants, useSortedParticipants, useChat, useIsEncrypted, useRoomInfo, useIsMuted, useParticipantTracks, useLiveKitRoom, RoomContext, useRoomContext, ParticipantContext, useParticipantContext, TrackRefContext, useTrackRefContext, useTracks, isTrackReference, useEnsureTrackRef, useTrackMutedIndicator, useVisualStableUpdate } from '@livekit/components-react';
2
2
  export * from './hooks/useE2EEManager';
3
+ export * from './hooks/useTrackVolume';
4
+ export * from './hooks/useMultibandTrackVolume';
3
5
  //# sourceMappingURL=hooks.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["useConnectionState","useDataChannel","useIsSpeaking","useLocalParticipant","useLocalParticipantPermissions","useParticipantInfo","useParticipants","useRemoteParticipants","useRemoteParticipant","useSpeakingParticipants","useSortedParticipants","useChat","useIsEncrypted","useRoomInfo","useIsMuted","useParticipantTracks","useLiveKitRoom","RoomContext","useRoomContext","ParticipantContext","useParticipantContext","TrackRefContext","useTrackRefContext","useTracks","isTrackReference","useEnsureTrackRef","useTrackMutedIndicator","useVisualStableUpdate"],"sources":["hooks.ts"],"sourcesContent":["export {\n useConnectionState,\n useDataChannel,\n useIsSpeaking,\n useLocalParticipant,\n useLocalParticipantPermissions,\n useParticipantInfo,\n useParticipants,\n useRemoteParticipants,\n useRemoteParticipant,\n useSpeakingParticipants,\n useSortedParticipants,\n useChat,\n useIsEncrypted,\n useRoomInfo,\n useIsMuted,\n useParticipantTracks,\n useLiveKitRoom,\n RoomContext,\n useRoomContext,\n ParticipantContext,\n useParticipantContext,\n TrackRefContext,\n useTrackRefContext,\n useTracks,\n isTrackReference,\n useEnsureTrackRef,\n useTrackMutedIndicator,\n useVisualStableUpdate,\n} from '@livekit/components-react';\nexport type {\n UseLocalParticipantOptions,\n UseParticipantInfoOptions,\n UseParticipantsOptions,\n UseRemoteParticipantOptions,\n UseRemoteParticipantsOptions,\n UseTracksOptions,\n TrackReference,\n TrackReferenceOrPlaceholder,\n UseVisualStableUpdateOptions,\n} from '@livekit/components-react';\n\nexport type { ReceivedDataMessage } from '@livekit/components-core';\nexport * from './hooks/useE2EEManager';\nexport type { UseRNE2EEManagerOptions } from './hooks/useE2EEManager';\n"],"mappings":"AAAA,SACEA,kBAAkB,EAClBC,cAAc,EACdC,aAAa,EACbC,mBAAmB,EACnBC,8BAA8B,EAC9BC,kBAAkB,EAClBC,eAAe,EACfC,qBAAqB,EACrBC,oBAAoB,EACpBC,uBAAuB,EACvBC,qBAAqB,EACrBC,OAAO,EACPC,cAAc,EACdC,WAAW,EACXC,UAAU,EACVC,oBAAoB,EACpBC,cAAc,EACdC,WAAW,EACXC,cAAc,EACdC,kBAAkB,EAClBC,qBAAqB,EACrBC,eAAe,EACfC,kBAAkB,EAClBC,SAAS,EACTC,gBAAgB,EAChBC,iBAAiB,EACjBC,sBAAsB,EACtBC,qBAAqB,QAChB,2BAA2B;AAclC,cAAc,wBAAwB","ignoreList":[]}
1
+ {"version":3,"names":["useConnectionState","useDataChannel","useIsSpeaking","useLocalParticipant","useLocalParticipantPermissions","useParticipantInfo","useParticipants","useRemoteParticipants","useRemoteParticipant","useSpeakingParticipants","useSortedParticipants","useChat","useIsEncrypted","useRoomInfo","useIsMuted","useParticipantTracks","useLiveKitRoom","RoomContext","useRoomContext","ParticipantContext","useParticipantContext","TrackRefContext","useTrackRefContext","useTracks","isTrackReference","useEnsureTrackRef","useTrackMutedIndicator","useVisualStableUpdate"],"sources":["hooks.ts"],"sourcesContent":["export {\n useConnectionState,\n useDataChannel,\n useIsSpeaking,\n useLocalParticipant,\n useLocalParticipantPermissions,\n useParticipantInfo,\n useParticipants,\n useRemoteParticipants,\n useRemoteParticipant,\n useSpeakingParticipants,\n useSortedParticipants,\n useChat,\n useIsEncrypted,\n useRoomInfo,\n useIsMuted,\n useParticipantTracks,\n useLiveKitRoom,\n RoomContext,\n useRoomContext,\n ParticipantContext,\n useParticipantContext,\n TrackRefContext,\n useTrackRefContext,\n useTracks,\n isTrackReference,\n useEnsureTrackRef,\n useTrackMutedIndicator,\n useVisualStableUpdate,\n} from '@livekit/components-react';\nexport type {\n UseLocalParticipantOptions,\n UseParticipantInfoOptions,\n UseParticipantsOptions,\n UseRemoteParticipantOptions,\n UseRemoteParticipantsOptions,\n UseTracksOptions,\n TrackReference,\n TrackReferenceOrPlaceholder,\n UseVisualStableUpdateOptions,\n} from '@livekit/components-react';\n\nexport type { ReceivedDataMessage } from '@livekit/components-core';\nexport * from './hooks/useE2EEManager';\nexport * from './hooks/useTrackVolume';\nexport * from './hooks/useMultibandTrackVolume';\nexport type { UseRNE2EEManagerOptions } from './hooks/useE2EEManager';\n"],"mappings":"AAAA,SACEA,kBAAkB,EAClBC,cAAc,EACdC,aAAa,EACbC,mBAAmB,EACnBC,8BAA8B,EAC9BC,kBAAkB,EAClBC,eAAe,EACfC,qBAAqB,EACrBC,oBAAoB,EACpBC,uBAAuB,EACvBC,qBAAqB,EACrBC,OAAO,EACPC,cAAc,EACdC,WAAW,EACXC,UAAU,EACVC,oBAAoB,EACpBC,cAAc,EACdC,WAAW,EACXC,cAAc,EACdC,kBAAkB,EAClBC,qBAAqB,EACrBC,eAAe,EACfC,kBAAkB,EAClBC,SAAS,EACTC,gBAAgB,EAChBC,iBAAiB,EACjBC,sBAAsB,EACtBC,qBAAqB,QAChB,2BAA2B;AAclC,cAAc,wBAAwB;AACtC,cAAc,wBAAwB;AACtC,cAAc,iCAAiC","ignoreList":[]}
@@ -5,6 +5,7 @@ import AudioSession, { AndroidAudioTypePresets, getDefaultAppleAudioConfiguratio
5
5
  import { PixelRatio, Platform } from 'react-native';
6
6
  import RNE2EEManager from './e2ee/RNE2EEManager';
7
7
  import RNKeyProvider from './e2ee/RNKeyProvider';
8
+ import { setupNativeEvents } from './events/EventEmitter';
8
9
 
9
10
  /**
10
11
  * Registers the required globals needed for LiveKit to work.
@@ -21,6 +22,7 @@ export function registerGlobals() {
21
22
  shimArrayAt();
22
23
  shimAsyncIterator();
23
24
  shimIterator();
25
+ setupNativeEvents();
24
26
  }
25
27
 
26
28
  /**
@@ -83,6 +85,7 @@ function shimIterator() {
83
85
  shim();
84
86
  }
85
87
  export * from './hooks';
88
+ export * from './components/BarVisualizer';
86
89
  export * from './components/LiveKitRoom';
87
90
  export * from './components/VideoTrack';
88
91
  export * from './components/VideoView'; // deprecated
@@ -1 +1 @@
1
- {"version":3,"names":["registerGlobals","webrtcRegisterGlobals","setupURLPolyfill","AudioSession","AndroidAudioTypePresets","getDefaultAppleAudioConfigurationForMode","PixelRatio","Platform","RNE2EEManager","RNKeyProvider","iosCategoryEnforce","livekitRegisterGlobals","fixWebrtcAdapter","shimPromiseAllSettled","shimArrayAt","shimAsyncIterator","shimIterator","OS","getUserMediaFunc","global","navigator","mediaDevices","getUserMedia","constraints","audio","setAppleAudioConfiguration","audioCategory","lkGlobal","platform","devicePixelRatio","get","LiveKitReactNativeGlobal","_window","window","undefined","userAgent","product","allSettled","require","shim","Array","prototype","at"],"sources":["index.tsx"],"sourcesContent":["import { registerGlobals as webrtcRegisterGlobals } from '@livekit/react-native-webrtc';\nimport { setupURLPolyfill } from 'react-native-url-polyfill';\nimport './polyfills/EncoderDecoderTogether.min.js';\nimport AudioSession, {\n AndroidAudioTypePresets,\n type AndroidAudioTypeOptions,\n type AppleAudioCategory,\n type AppleAudioCategoryOption,\n type AppleAudioConfiguration,\n type AppleAudioMode,\n type AudioTrackState,\n getDefaultAppleAudioConfigurationForMode,\n} from './audio/AudioSession';\nimport type { AudioConfiguration } from './audio/AudioSession';\nimport { PixelRatio, Platform } from 'react-native';\nimport { type LiveKitReactNativeInfo } from 'livekit-client';\nimport type { LogLevel, SetLogLevelOptions } from './logger';\nimport RNE2EEManager from './e2ee/RNE2EEManager';\nimport RNKeyProvider, { type RNKeyProviderOptions } from './e2ee/RNKeyProvider';\n\n/**\n * Registers the required globals needed for LiveKit to work.\n *\n * Must be called before using LiveKit.\n */\nexport function registerGlobals() {\n webrtcRegisterGlobals();\n iosCategoryEnforce();\n livekitRegisterGlobals();\n setupURLPolyfill();\n fixWebrtcAdapter();\n shimPromiseAllSettled();\n shimArrayAt();\n shimAsyncIterator();\n shimIterator();\n}\n\n/**\n * Enforces changing to playAndRecord category prior to obtaining microphone.\n */\nfunction iosCategoryEnforce() {\n if (Platform.OS === 'ios') {\n // @ts-ignore\n let getUserMediaFunc = global.navigator.mediaDevices.getUserMedia;\n // @ts-ignore\n global.navigator.mediaDevices.getUserMedia = async (constraints: any) => {\n if (constraints.audio) {\n await AudioSession.setAppleAudioConfiguration({\n audioCategory: 'playAndRecord',\n });\n }\n\n return await getUserMediaFunc(constraints);\n };\n }\n}\n\nfunction livekitRegisterGlobals() {\n let lkGlobal: LiveKitReactNativeInfo = {\n platform: Platform.OS,\n devicePixelRatio: PixelRatio.get(),\n };\n\n // @ts-ignore\n global.LiveKitReactNativeGlobal = lkGlobal;\n}\n\nfunction fixWebrtcAdapter() {\n // @ts-ignore\n if (window?.navigator !== undefined) {\n // @ts-ignore\n const { navigator } = window;\n if (navigator.userAgent === undefined) {\n navigator.userAgent = navigator.product ?? 'Unknown';\n }\n }\n}\n\nfunction shimPromiseAllSettled() {\n var allSettled = require('promise.allsettled');\n allSettled.shim();\n}\n\nfunction shimArrayAt() {\n // Some versions of RN don't have Array.prototype.at, which is used by sdp-transform\n if (!Array.prototype.at) {\n var at = require('array.prototype.at');\n at.shim();\n }\n}\n\nfunction shimAsyncIterator() {\n var shim = require('well-known-symbols/Symbol.asyncIterator/shim');\n shim();\n}\n\nfunction shimIterator() {\n var shim = require('well-known-symbols/Symbol.iterator/shim');\n shim();\n}\nexport * from './hooks';\nexport * from './components/LiveKitRoom';\nexport * from './components/VideoTrack';\nexport * from './components/VideoView'; // deprecated\nexport * from './useParticipant'; // deprecated\nexport * from './useRoom'; // deprecated\nexport * from './logger';\nexport * from './audio/AudioManager';\n\nexport {\n AudioSession,\n RNE2EEManager,\n RNKeyProvider,\n AndroidAudioTypePresets,\n getDefaultAppleAudioConfigurationForMode,\n};\nexport type {\n AudioConfiguration,\n AndroidAudioTypeOptions,\n AppleAudioCategory,\n AppleAudioCategoryOption,\n AppleAudioConfiguration,\n AppleAudioMode,\n AudioTrackState,\n LogLevel,\n SetLogLevelOptions,\n RNKeyProviderOptions,\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["registerGlobals","webrtcRegisterGlobals","setupURLPolyfill","AudioSession","AndroidAudioTypePresets","getDefaultAppleAudioConfigurationForMode","PixelRatio","Platform","RNE2EEManager","RNKeyProvider","setupNativeEvents","iosCategoryEnforce","livekitRegisterGlobals","fixWebrtcAdapter","shimPromiseAllSettled","shimArrayAt","shimAsyncIterator","shimIterator","OS","getUserMediaFunc","global","navigator","mediaDevices","getUserMedia","constraints","audio","setAppleAudioConfiguration","audioCategory","lkGlobal","platform","devicePixelRatio","get","LiveKitReactNativeGlobal","_window","window","undefined","userAgent","product","allSettled","require","shim","Array","prototype","at"],"sources":["index.tsx"],"sourcesContent":["import { registerGlobals as webrtcRegisterGlobals } from '@livekit/react-native-webrtc';\nimport { setupURLPolyfill } from 'react-native-url-polyfill';\nimport './polyfills/EncoderDecoderTogether.min.js';\nimport AudioSession, {\n AndroidAudioTypePresets,\n type AndroidAudioTypeOptions,\n type AppleAudioCategory,\n type AppleAudioCategoryOption,\n type AppleAudioConfiguration,\n type AppleAudioMode,\n type AudioTrackState,\n getDefaultAppleAudioConfigurationForMode,\n} from './audio/AudioSession';\nimport type { AudioConfiguration } from './audio/AudioSession';\nimport { PixelRatio, Platform } from 'react-native';\nimport { type LiveKitReactNativeInfo } from 'livekit-client';\nimport type { LogLevel, SetLogLevelOptions } from './logger';\nimport RNE2EEManager from './e2ee/RNE2EEManager';\nimport RNKeyProvider, { type RNKeyProviderOptions } from './e2ee/RNKeyProvider';\nimport { setupNativeEvents } from './events/EventEmitter';\n\n/**\n * Registers the required globals needed for LiveKit to work.\n *\n * Must be called before using LiveKit.\n */\nexport function registerGlobals() {\n webrtcRegisterGlobals();\n iosCategoryEnforce();\n livekitRegisterGlobals();\n setupURLPolyfill();\n fixWebrtcAdapter();\n shimPromiseAllSettled();\n shimArrayAt();\n shimAsyncIterator();\n shimIterator();\n setupNativeEvents();\n}\n\n/**\n * Enforces changing to playAndRecord category prior to obtaining microphone.\n */\nfunction iosCategoryEnforce() {\n if (Platform.OS === 'ios') {\n // @ts-ignore\n let getUserMediaFunc = global.navigator.mediaDevices.getUserMedia;\n // @ts-ignore\n global.navigator.mediaDevices.getUserMedia = async (constraints: any) => {\n if (constraints.audio) {\n await AudioSession.setAppleAudioConfiguration({\n audioCategory: 'playAndRecord',\n });\n }\n\n return await getUserMediaFunc(constraints);\n };\n }\n}\n\nfunction livekitRegisterGlobals() {\n let lkGlobal: LiveKitReactNativeInfo = {\n platform: Platform.OS,\n devicePixelRatio: PixelRatio.get(),\n };\n\n // @ts-ignore\n global.LiveKitReactNativeGlobal = lkGlobal;\n}\n\nfunction fixWebrtcAdapter() {\n // @ts-ignore\n if (window?.navigator !== undefined) {\n // @ts-ignore\n const { navigator } = window;\n if (navigator.userAgent === undefined) {\n navigator.userAgent = navigator.product ?? 'Unknown';\n }\n }\n}\n\nfunction shimPromiseAllSettled() {\n var allSettled = require('promise.allsettled');\n allSettled.shim();\n}\n\nfunction shimArrayAt() {\n // Some versions of RN don't have Array.prototype.at, which is used by sdp-transform\n if (!Array.prototype.at) {\n var at = require('array.prototype.at');\n at.shim();\n }\n}\n\nfunction shimAsyncIterator() {\n var shim = require('well-known-symbols/Symbol.asyncIterator/shim');\n shim();\n}\n\nfunction shimIterator() {\n var shim = require('well-known-symbols/Symbol.iterator/shim');\n shim();\n}\nexport * from './hooks';\nexport * from './components/BarVisualizer';\nexport * from './components/LiveKitRoom';\nexport * from './components/VideoTrack';\nexport * from './components/VideoView'; // deprecated\nexport * from './useParticipant'; // deprecated\nexport * from './useRoom'; // deprecated\nexport * from './logger';\nexport * from './audio/AudioManager';\n\nexport {\n AudioSession,\n RNE2EEManager,\n RNKeyProvider,\n AndroidAudioTypePresets,\n getDefaultAppleAudioConfigurationForMode,\n};\nexport type {\n AudioConfiguration,\n AndroidAudioTypeOptions,\n AppleAudioCategory,\n AppleAudioCategoryOption,\n AppleAudioConfiguration,\n AppleAudioMode,\n AudioTrackState,\n LogLevel,\n SetLogLevelOptions,\n RNKeyProviderOptions,\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,3 @@
1
+ export const __esModule: boolean;
2
+ export default LiveKitModule;
3
+ declare const LiveKitModule: any;
@@ -0,0 +1,32 @@
1
+ export const __esModule: boolean;
2
+ /**
3
+ * @beta
4
+ */
5
+ /**
6
+ * Visualizes audio signals from a TrackReference as bars.
7
+ * If the `state` prop is set, it automatically transitions between VoiceAssistant states.
8
+ * @beta
9
+ *
10
+ * @remarks For VoiceAssistant state transitions this component requires a voice assistant agent running with livekit-agents \>= 0.9.0
11
+ *
12
+ * @example
13
+ * ```tsx
14
+ * function SimpleVoiceAssistant() {
15
+ * const { state, audioTrack } = useVoiceAssistant();
16
+ * return (
17
+ * <BarVisualizer
18
+ * state={state}
19
+ * trackRef={audioTrack}
20
+ * />
21
+ * );
22
+ * }
23
+ * ```
24
+ */
25
+ export function BarVisualizer({ style, state, barCount, trackRef, options }: {
26
+ style?: {} | undefined;
27
+ state: any;
28
+ barCount?: number | undefined;
29
+ trackRef: any;
30
+ options: any;
31
+ }): any;
32
+ export function useBarAnimator(state: any, columns: any, interval: any): any;
@@ -0,0 +1,4 @@
1
+ export const __esModule: boolean;
2
+ export function addListener(listener: any, eventName: any, eventHandler: any): void;
3
+ export function removeListener(listener: any): void;
4
+ export function setupNativeEvents(): void;
@@ -0,0 +1,8 @@
1
+ export const __esModule: boolean;
2
+ /**
3
+ * A hook for tracking the volume of an audio track across multiple frequency bands.
4
+ *
5
+ * @param trackOrTrackReference
6
+ * @returns A number array containing the volume for each frequency band.
7
+ */
8
+ export function useMultibandTrackVolume(trackOrTrackReference: any, options?: {}): any;
@@ -0,0 +1,8 @@
1
+ export const __esModule: boolean;
2
+ /**
3
+ * A hook for tracking the volume of an audio track.
4
+ *
5
+ * @param trackOrTrackReference
6
+ * @returns A number between 0-1 representing the volume.
7
+ */
8
+ export function useTrackVolume(trackOrTrackReference: any): any;
@@ -0,0 +1,2 @@
1
+ export default LiveKitModule;
2
+ declare const LiveKitModule: any;
@@ -0,0 +1,10 @@
1
+ export function BarVisualizer({ style, state, barCount, trackRef, options }: {
2
+ style?: {} | undefined;
3
+ state: any;
4
+ barCount?: number | undefined;
5
+ trackRef: any;
6
+ options: any;
7
+ }): React.CElement<import("react-native").ViewProps, View>;
8
+ export function useBarAnimator(state: any, columns: any, interval: any): never[];
9
+ import { View } from 'react-native';
10
+ import React from 'react';
@@ -0,0 +1,3 @@
1
+ export function setupNativeEvents(): void;
2
+ export function addListener(listener: any, eventName: any, eventHandler: any): void;
3
+ export function removeListener(listener: any): void;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * A hook for tracking the volume of an audio track across multiple frequency bands.
3
+ *
4
+ * @param trackOrTrackReference
5
+ * @returns A number array containing the volume for each frequency band.
6
+ */
7
+ export function useMultibandTrackVolume(trackOrTrackReference: any, options?: {}): never[];
@@ -0,0 +1,7 @@
1
+ /**
2
+ * A hook for tracking the volume of an audio track.
3
+ *
4
+ * @param trackOrTrackReference
5
+ * @returns A number between 0-1 representing the volume.
6
+ */
7
+ export function useTrackVolume(trackOrTrackReference: any): number;
@@ -1,2 +1,4 @@
1
1
  export * from "./hooks/useE2EEManager";
2
+ export * from "./hooks/useTrackVolume";
3
+ export * from "./hooks/useMultibandTrackVolume";
2
4
  export { useConnectionState, useDataChannel, useIsSpeaking, useLocalParticipant, useLocalParticipantPermissions, useParticipantInfo, useParticipants, useRemoteParticipants, useRemoteParticipant, useSpeakingParticipants, useSortedParticipants, useChat, useIsEncrypted, useRoomInfo, useIsMuted, useParticipantTracks, useLiveKitRoom, RoomContext, useRoomContext, ParticipantContext, useParticipantContext, TrackRefContext, useTrackRefContext, useTracks, isTrackReference, useEnsureTrackRef, useTrackMutedIndicator, useVisualStableUpdate } from "@livekit/components-react";
@@ -5,6 +5,7 @@
5
5
  */
6
6
  export function registerGlobals(): void;
7
7
  export * from "./hooks";
8
+ export * from "./components/BarVisualizer";
8
9
  export * from "./components/LiveKitRoom";
9
10
  export * from "./components/VideoTrack";
10
11
  export * from "./components/VideoView";
@@ -0,0 +1,2 @@
1
+ declare const LiveKitModule: any;
2
+ export default LiveKitModule;
@@ -0,0 +1,49 @@
1
+ import { type AgentState, type TrackReferenceOrPlaceholder } from '@livekit/components-react';
2
+ import { type ColorValue, type DimensionValue, type ViewStyle } from 'react-native';
3
+ import React from 'react';
4
+ export type BarVisualizerOptions = {
5
+ /** decimal values from 0 to 1 */
6
+ maxHeight?: number;
7
+ /** decimal values from 0 to 1 */
8
+ minHeight?: number;
9
+ barColor?: ColorValue;
10
+ barWidth?: DimensionValue;
11
+ barBorderRadius?: number;
12
+ };
13
+ /**
14
+ * @beta
15
+ */
16
+ export interface BarVisualizerProps {
17
+ /** If set, the visualizer will transition between different voice assistant states */
18
+ state?: AgentState;
19
+ /** Number of bars that show up in the visualizer */
20
+ barCount?: number;
21
+ trackRef?: TrackReferenceOrPlaceholder;
22
+ options?: BarVisualizerOptions;
23
+ /**
24
+ * Custom React Native styles for the container.
25
+ */
26
+ style?: ViewStyle;
27
+ }
28
+ /**
29
+ * Visualizes audio signals from a TrackReference as bars.
30
+ * If the `state` prop is set, it automatically transitions between VoiceAssistant states.
31
+ * @beta
32
+ *
33
+ * @remarks For VoiceAssistant state transitions this component requires a voice assistant agent running with livekit-agents \>= 0.9.0
34
+ *
35
+ * @example
36
+ * ```tsx
37
+ * function SimpleVoiceAssistant() {
38
+ * const { state, audioTrack } = useVoiceAssistant();
39
+ * return (
40
+ * <BarVisualizer
41
+ * state={state}
42
+ * trackRef={audioTrack}
43
+ * />
44
+ * );
45
+ * }
46
+ * ```
47
+ */
48
+ export declare const BarVisualizer: ({ style, state, barCount, trackRef, options, }: BarVisualizerProps) => React.JSX.Element;
49
+ export declare const useBarAnimator: (state: AgentState | undefined, columns: number, interval: number) => number[];
@@ -0,0 +1,6 @@
1
+ export declare function setupNativeEvents(): void;
2
+ type EventHandler = (event: unknown) => void;
3
+ type Listener = unknown;
4
+ export declare function addListener(listener: Listener, eventName: string, eventHandler: EventHandler): void;
5
+ export declare function removeListener(listener: Listener): void;
6
+ export {};
@@ -0,0 +1,31 @@
1
+ import { type TrackReferenceOrPlaceholder } from '@livekit/components-react';
2
+ import { type LocalAudioTrack, type RemoteAudioTrack } from 'livekit-client';
3
+ /**
4
+ * Interface for configuring options for the useMultibandTrackVolume hook.
5
+ * @alpha
6
+ */
7
+ export interface MultiBandTrackVolumeOptions {
8
+ /**
9
+ * the number of bands to split the audio into
10
+ */
11
+ bands?: number;
12
+ /**
13
+ * cut off frequency on the lower end
14
+ */
15
+ minFrequency?: number;
16
+ /**
17
+ * cut off frequency on the higher end
18
+ */
19
+ maxFrequency?: number;
20
+ /**
21
+ * update should run every x ms
22
+ */
23
+ updateInterval?: number;
24
+ }
25
+ /**
26
+ * A hook for tracking the volume of an audio track across multiple frequency bands.
27
+ *
28
+ * @param trackOrTrackReference
29
+ * @returns A number array containing the volume for each frequency band.
30
+ */
31
+ export declare function useMultibandTrackVolume(trackOrTrackReference?: LocalAudioTrack | RemoteAudioTrack | TrackReferenceOrPlaceholder, options?: MultiBandTrackVolumeOptions): number[];
@@ -0,0 +1,9 @@
1
+ import { type TrackReferenceOrPlaceholder } from '@livekit/components-react';
2
+ import { type LocalAudioTrack, type RemoteAudioTrack } from 'livekit-client';
3
+ /**
4
+ * A hook for tracking the volume of an audio track.
5
+ *
6
+ * @param trackOrTrackReference
7
+ * @returns A number between 0-1 representing the volume.
8
+ */
9
+ export declare function useTrackVolume(trackOrTrackReference?: LocalAudioTrack | RemoteAudioTrack | TrackReferenceOrPlaceholder): number;
@@ -2,4 +2,6 @@ export { useConnectionState, useDataChannel, useIsSpeaking, useLocalParticipant,
2
2
  export type { UseLocalParticipantOptions, UseParticipantInfoOptions, UseParticipantsOptions, UseRemoteParticipantOptions, UseRemoteParticipantsOptions, UseTracksOptions, TrackReference, TrackReferenceOrPlaceholder, UseVisualStableUpdateOptions, } from '@livekit/components-react';
3
3
  export type { ReceivedDataMessage } from '@livekit/components-core';
4
4
  export * from './hooks/useE2EEManager';
5
+ export * from './hooks/useTrackVolume';
6
+ export * from './hooks/useMultibandTrackVolume';
5
7
  export type { UseRNE2EEManagerOptions } from './hooks/useE2EEManager';
@@ -11,6 +11,7 @@ import RNKeyProvider, { type RNKeyProviderOptions } from './e2ee/RNKeyProvider';
11
11
  */
12
12
  export declare function registerGlobals(): void;
13
13
  export * from './hooks';
14
+ export * from './components/BarVisualizer';
14
15
  export * from './components/LiveKitRoom';
15
16
  export * from './components/VideoTrack';
16
17
  export * from './components/VideoView';
@@ -13,7 +13,7 @@ Pod::Spec.new do |s|
13
13
  s.platforms = { :ios => "10.0" }
14
14
  s.source = { :git => "https://github.com/livekit/client-sdk-react-native.git", :tag => "#{s.version}" }
15
15
 
16
- s.source_files = "ios/**/*.{h,m,mm}"
16
+ s.source_files = "ios/**/*.{h,m,mm,swift}"
17
17
 
18
18
  s.framework = 'AVFAudio'
19
19
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@livekit/react-native",
3
- "version": "2.5.1",
3
+ "version": "2.6.0",
4
4
  "description": "LiveKit for React Native",
5
5
  "main": "lib/commonjs/index",
6
6
  "module": "lib/module/index",
@@ -42,10 +42,10 @@
42
42
  "android"
43
43
  ],
44
44
  "dependencies": {
45
- "@livekit/components-react": "^2.0.6",
45
+ "@livekit/components-react": "^2.8.1",
46
46
  "array.prototype.at": "^1.1.1",
47
47
  "events": "^3.3.0",
48
- "livekit-client": "^2.7.5",
48
+ "livekit-client": "^2.9.0",
49
49
  "loglevel": "^1.8.0",
50
50
  "promise.allsettled": "^1.0.5",
51
51
  "react-native-url-polyfill": "^1.3.0",
@@ -57,7 +57,7 @@
57
57
  "@babel/preset-env": "^7.20.0",
58
58
  "@babel/runtime": "^7.20.0",
59
59
  "@commitlint/config-conventional": "^16.2.1",
60
- "@livekit/react-native-webrtc": "^125.0.7",
60
+ "@livekit/react-native-webrtc": "^125.0.8",
61
61
  "@react-native/babel-preset": "0.74.84",
62
62
  "@react-native/eslint-config": "0.74.84",
63
63
  "@react-native/metro-config": "0.74.84",
@@ -83,7 +83,7 @@
83
83
  "typescript": "5.0.4"
84
84
  },
85
85
  "peerDependencies": {
86
- "@livekit/react-native-webrtc": "^125.0.7",
86
+ "@livekit/react-native-webrtc": "^125.0.8",
87
87
  "react": "*",
88
88
  "react-native": "*"
89
89
  },
@@ -0,0 +1,19 @@
1
+ import { NativeModules, Platform } from 'react-native';
2
+ const LINKING_ERROR =
3
+ `The package '@livekit/react-native' doesn't seem to be linked. Make sure: \n\n` +
4
+ Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) +
5
+ '- You rebuilt the app after installing the package\n' +
6
+ '- You are not using Expo managed workflow\n';
7
+
8
+ const LiveKitModule = NativeModules.LivekitReactNative
9
+ ? NativeModules.LivekitReactNative
10
+ : new Proxy(
11
+ {},
12
+ {
13
+ get() {
14
+ throw new Error(LINKING_ERROR);
15
+ },
16
+ }
17
+ );
18
+
19
+ export default LiveKitModule;