@livekit/react-native 2.0.1 → 2.1.0-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.
- package/README.md +4 -0
- package/android/src/main/java/com/livekit/reactnative/LiveKitReactNative.kt +4 -4
- package/android/src/main/java/com/livekit/reactnative/video/CustomVideoDecoderFactory.kt +67 -0
- package/android/src/main/java/com/livekit/reactnative/video/CustomVideoEncoderFactory.kt +74 -0
- package/lib/commonjs/components/LiveKitRoom.js +43 -0
- package/lib/commonjs/components/LiveKitRoom.js.map +1 -0
- package/lib/commonjs/components/VideoTrack.js +171 -0
- package/lib/commonjs/components/VideoTrack.js.map +1 -0
- package/lib/commonjs/components/VideoView.js +15 -11
- package/lib/commonjs/components/VideoView.js.map +1 -1
- package/lib/commonjs/components/ViewPortDetector.js +134 -39
- package/lib/commonjs/components/ViewPortDetector.js.map +1 -1
- package/lib/commonjs/hooks.js +232 -0
- package/lib/commonjs/hooks.js.map +1 -0
- package/lib/commonjs/index.js +42 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/useParticipant.js +1 -0
- package/lib/commonjs/useParticipant.js.map +1 -1
- package/lib/commonjs/useRoom.js +1 -0
- package/lib/commonjs/useRoom.js.map +1 -1
- package/lib/module/components/LiveKitRoom.js +32 -0
- package/lib/module/components/LiveKitRoom.js.map +1 -0
- package/lib/module/components/VideoTrack.js +152 -0
- package/lib/module/components/VideoTrack.js.map +1 -0
- package/lib/module/components/VideoView.js +20 -12
- package/lib/module/components/VideoView.js.map +1 -1
- package/lib/module/components/ViewPortDetector.js +134 -40
- package/lib/module/components/ViewPortDetector.js.map +1 -1
- package/lib/module/hooks.js +3 -0
- package/lib/module/hooks.js.map +1 -0
- package/lib/module/index.js +9 -3
- package/lib/module/index.js.map +1 -1
- package/lib/module/useParticipant.js +3 -0
- package/lib/module/useParticipant.js.map +1 -1
- package/lib/module/useRoom.js +2 -0
- package/lib/module/useRoom.js.map +1 -1
- package/lib/typescript/components/LiveKitRoom.d.ts +90 -0
- package/lib/typescript/components/VideoTrack.d.ts +11 -0
- package/lib/typescript/components/VideoView.d.ts +6 -0
- package/lib/typescript/components/ViewPortDetector.d.ts +11 -4
- package/lib/typescript/hooks.d.ts +2 -0
- package/lib/typescript/index.d.ts +3 -0
- package/lib/typescript/useParticipant.d.ts +2 -0
- package/lib/typescript/useRoom.d.ts +1 -0
- package/livekit-react-native.podspec +5 -0
- package/package.json +2 -1
- package/src/components/LiveKitRoom.tsx +118 -0
- package/src/components/VideoTrack.tsx +150 -0
- package/src/components/VideoView.tsx +26 -13
- package/src/components/ViewPortDetector.tsx +112 -21
- package/src/hooks.ts +40 -0
- package/src/index.tsx +6 -4
- package/src/useParticipant.ts +2 -1
- package/src/useRoom.ts +1 -0
- package/android/local.properties +0 -8
- package/ios/LivekitReactNative.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
- package/ios/LivekitReactNative.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/ios/LivekitReactNative.xcodeproj/project.xcworkspace/xcuserdata/davidliu.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/ios/LivekitReactNative.xcodeproj/xcuserdata/davidliu.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
package/lib/module/index.js
CHANGED
|
@@ -74,9 +74,15 @@ function shimIterator() {
|
|
|
74
74
|
shim();
|
|
75
75
|
}
|
|
76
76
|
|
|
77
|
-
export * from './
|
|
78
|
-
export * from './
|
|
79
|
-
export * from './
|
|
77
|
+
export * from './hooks';
|
|
78
|
+
export * from './components/LiveKitRoom';
|
|
79
|
+
export * from './components/VideoTrack';
|
|
80
|
+
export * from './components/VideoView'; // deprecated
|
|
81
|
+
|
|
82
|
+
export * from './useParticipant'; // deprecated
|
|
83
|
+
|
|
84
|
+
export * from './useRoom'; // deprecated
|
|
85
|
+
|
|
80
86
|
export * from './logger';
|
|
81
87
|
export * from './audio/AudioManager';
|
|
82
88
|
export { AudioSession, AndroidAudioTypeOptions, AndroidAudioTypePresets, AppleAudioCategory, AppleAudioCategoryOption, AppleAudioConfiguration, AppleAudioMode, AudioTrackState, getDefaultAppleAudioConfigurationForMode };
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["index.tsx"],"names":["registerGlobals","webrtcRegisterGlobals","setupURLPolyfill","AudioSession","AndroidAudioTypePresets","AndroidAudioTypeOptions","AppleAudioCategory","AppleAudioCategoryOption","AppleAudioConfiguration","AppleAudioMode","AudioTrackState","getDefaultAppleAudioConfigurationForMode","PixelRatio","Platform","livekitRegisterGlobals","fixWebrtcAdapter","shimPromiseAllSettled","shimArrayAt","shimAsyncIterator","shimIterator","lkGlobal","platform","OS","devicePixelRatio","get","global","LiveKitReactNativeGlobal","window","navigator","undefined","userAgent","product","allSettled","require","shim","Array","prototype","at"],"mappings":"AAAA,SAASA,eAAe,IAAIC,qBAA5B,QAAyD,8BAAzD;AACA,SAASC,gBAAT,QAAiC,2BAAjC;AACA,OAAO,mCAAP;AACA,OAAOC,YAAP,IACEC,uBADF,EAEEC,uBAFF,EAGEC,kBAHF,EAIEC,wBAJF,EAKEC,uBALF,EAMEC,cANF,EAOEC,eAPF,EAQEC,wCARF,QASO,sBATP;AAWA,SAASC,UAAT,EAAqBC,QAArB,QAAqC,cAArC;;AAIA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASb,eAAT,GAA2B;AAChCC,EAAAA,qBAAqB;AACrBa,EAAAA,sBAAsB;AACtBZ,EAAAA,gBAAgB;AAChBa,EAAAA,gBAAgB;AAChBC,EAAAA,qBAAqB;AACrBC,EAAAA,WAAW;AACXC,EAAAA,iBAAiB;AACjBC,EAAAA,YAAY;AACb;;AACD,SAASL,sBAAT,GAAkC;AAChC,MAAIM,QAAgC,GAAG;AACrCC,IAAAA,QAAQ,EAAER,QAAQ,CAACS,EADkB;AAErCC,IAAAA,gBAAgB,EAAEX,UAAU,CAACY,GAAX;AAFmB,GAAvC,CADgC,CAMhC;;AACAC,EAAAA,MAAM,CAACC,wBAAP,GAAkCN,QAAlC;AACD;;AAED,SAASL,gBAAT,GAA4B;AAAA;;AAC1B;AACA,MAAI,YAAAY,MAAM,UAAN,0CAAQC,SAAR,MAAsBC,SAA1B,EAAqC;AACnC;AACA,UAAM;AAAED,MAAAA;AAAF,QAAgBD,MAAtB;;AACA,QAAIC,SAAS,CAACE,SAAV,KAAwBD,SAA5B,EAAuC;AAAA;;AACrCD,MAAAA,SAAS,CAACE,SAAV,yBAAsBF,SAAS,CAACG,OAAhC,mEAA2C,SAA3C;AACD;AACF;AACF;;AAED,SAASf,qBAAT,GAAiC;AAC/B,MAAIgB,UAAU,GAAGC,OAAO,CAAC,oBAAD,CAAxB;;AACAD,EAAAA,UAAU,CAACE,IAAX;AACD;;AAED,SAASjB,WAAT,GAAuB;AACrB;AACA,MAAI,CAACkB,KAAK,CAACC,SAAN,CAAgBC,EAArB,EAAyB;AACvB,QAAIA,EAAE,GAAGJ,OAAO,CAAC,oBAAD,CAAhB;;AACAI,IAAAA,EAAE,CAACH,IAAH;AACD;AACF;;AAED,SAAShB,iBAAT,GAA6B;AAC3B,MAAIgB,IAAI,GAAGD,OAAO,CAAC,8CAAD,CAAlB;;AACAC,EAAAA,IAAI;AACL;;AAED,SAASf,YAAT,GAAwB;AACtB,MAAIe,IAAI,GAAGD,OAAO,CAAC,yCAAD,CAAlB;;AACAC,EAAAA,IAAI;AACL;;
|
|
1
|
+
{"version":3,"sources":["index.tsx"],"names":["registerGlobals","webrtcRegisterGlobals","setupURLPolyfill","AudioSession","AndroidAudioTypePresets","AndroidAudioTypeOptions","AppleAudioCategory","AppleAudioCategoryOption","AppleAudioConfiguration","AppleAudioMode","AudioTrackState","getDefaultAppleAudioConfigurationForMode","PixelRatio","Platform","livekitRegisterGlobals","fixWebrtcAdapter","shimPromiseAllSettled","shimArrayAt","shimAsyncIterator","shimIterator","lkGlobal","platform","OS","devicePixelRatio","get","global","LiveKitReactNativeGlobal","window","navigator","undefined","userAgent","product","allSettled","require","shim","Array","prototype","at"],"mappings":"AAAA,SAASA,eAAe,IAAIC,qBAA5B,QAAyD,8BAAzD;AACA,SAASC,gBAAT,QAAiC,2BAAjC;AACA,OAAO,mCAAP;AACA,OAAOC,YAAP,IACEC,uBADF,EAEEC,uBAFF,EAGEC,kBAHF,EAIEC,wBAJF,EAKEC,uBALF,EAMEC,cANF,EAOEC,eAPF,EAQEC,wCARF,QASO,sBATP;AAWA,SAASC,UAAT,EAAqBC,QAArB,QAAqC,cAArC;;AAIA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASb,eAAT,GAA2B;AAChCC,EAAAA,qBAAqB;AACrBa,EAAAA,sBAAsB;AACtBZ,EAAAA,gBAAgB;AAChBa,EAAAA,gBAAgB;AAChBC,EAAAA,qBAAqB;AACrBC,EAAAA,WAAW;AACXC,EAAAA,iBAAiB;AACjBC,EAAAA,YAAY;AACb;;AACD,SAASL,sBAAT,GAAkC;AAChC,MAAIM,QAAgC,GAAG;AACrCC,IAAAA,QAAQ,EAAER,QAAQ,CAACS,EADkB;AAErCC,IAAAA,gBAAgB,EAAEX,UAAU,CAACY,GAAX;AAFmB,GAAvC,CADgC,CAMhC;;AACAC,EAAAA,MAAM,CAACC,wBAAP,GAAkCN,QAAlC;AACD;;AAED,SAASL,gBAAT,GAA4B;AAAA;;AAC1B;AACA,MAAI,YAAAY,MAAM,UAAN,0CAAQC,SAAR,MAAsBC,SAA1B,EAAqC;AACnC;AACA,UAAM;AAAED,MAAAA;AAAF,QAAgBD,MAAtB;;AACA,QAAIC,SAAS,CAACE,SAAV,KAAwBD,SAA5B,EAAuC;AAAA;;AACrCD,MAAAA,SAAS,CAACE,SAAV,yBAAsBF,SAAS,CAACG,OAAhC,mEAA2C,SAA3C;AACD;AACF;AACF;;AAED,SAASf,qBAAT,GAAiC;AAC/B,MAAIgB,UAAU,GAAGC,OAAO,CAAC,oBAAD,CAAxB;;AACAD,EAAAA,UAAU,CAACE,IAAX;AACD;;AAED,SAASjB,WAAT,GAAuB;AACrB;AACA,MAAI,CAACkB,KAAK,CAACC,SAAN,CAAgBC,EAArB,EAAyB;AACvB,QAAIA,EAAE,GAAGJ,OAAO,CAAC,oBAAD,CAAhB;;AACAI,IAAAA,EAAE,CAACH,IAAH;AACD;AACF;;AAED,SAAShB,iBAAT,GAA6B;AAC3B,MAAIgB,IAAI,GAAGD,OAAO,CAAC,8CAAD,CAAlB;;AACAC,EAAAA,IAAI;AACL;;AAED,SAASf,YAAT,GAAwB;AACtB,MAAIe,IAAI,GAAGD,OAAO,CAAC,yCAAD,CAAlB;;AACAC,EAAAA,IAAI;AACL;;AACD,cAAc,SAAd;AACA,cAAc,0BAAd;AACA,cAAc,yBAAd;AACA,cAAc,wBAAd,C,CAAwC;;AACxC,cAAc,kBAAd,C,CAAkC;;AAClC,cAAc,WAAd,C,CAA2B;;AAC3B,cAAc,UAAd;AACA,cAAc,sBAAd;AAEA,SACE/B,YADF,EAGEE,uBAHF,EAIED,uBAJF,EAKEE,kBALF,EAMEC,wBANF,EAOEC,uBAPF,EAQEC,cARF,EASEC,eATF,EAUEC,wCAVF","sourcesContent":["import { registerGlobals as webrtcRegisterGlobals } from '@livekit/react-native-webrtc';\nimport { setupURLPolyfill } from 'react-native-url-polyfill';\nimport 'fastestsmallesttextencoderdecoder';\nimport AudioSession, {\n AndroidAudioTypePresets,\n AndroidAudioTypeOptions,\n AppleAudioCategory,\n AppleAudioCategoryOption,\n AppleAudioConfiguration,\n AppleAudioMode,\n 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';\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 livekitRegisterGlobals();\n setupURLPolyfill();\n fixWebrtcAdapter();\n shimPromiseAllSettled();\n shimArrayAt();\n shimAsyncIterator();\n shimIterator();\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 AudioConfiguration,\n AndroidAudioTypeOptions,\n AndroidAudioTypePresets,\n AppleAudioCategory,\n AppleAudioCategoryOption,\n AppleAudioConfiguration,\n AppleAudioMode,\n AudioTrackState,\n getDefaultAppleAudioConfigurationForMode,\n LogLevel,\n SetLogLevelOptions,\n};\n"]}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { LocalParticipant, ParticipantEvent, Track } from 'livekit-client';
|
|
2
2
|
import { useEffect, useState } from 'react';
|
|
3
|
+
/** @deprecated use `useRemoteParticipant` or `useLocalParticipant` instead */
|
|
4
|
+
|
|
5
|
+
/** @deprecated use `useRemoteParticipant` or `useLocalParticipant` instead */
|
|
3
6
|
export function useParticipant(participant) {
|
|
4
7
|
const [isAudioMuted, setAudioMuted] = useState(false);
|
|
5
8
|
const [, setVideoMuted] = useState(false);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useParticipant.ts"],"names":["LocalParticipant","ParticipantEvent","Track","useEffect","useState","useParticipant","participant","isAudioMuted","setAudioMuted","setVideoMuted","connectionQuality","setConnectionQuality","isSpeaking","setSpeaking","metadata","setMetadata","publications","setPublications","subscribedTracks","setSubscribedTracks","cameraPublication","setCameraPublication","getTrackPublication","Source","Camera","microphonePublication","setMicrophonePublication","Microphone","screenSharePublication","setScreenSharePublication","ScreenShare","onPublicationsChanged","Array","from","trackPublications","values","filter","pub","isSubscribed","track","undefined","onMuted","kind","Kind","Audio","Video","onUnmuted","onMetadataChanged","onIsSpeakingChanged","onConnectionQualityUpdate","on","TrackMuted","TrackUnmuted","ParticipantMetadataChanged","IsSpeakingChanged","TrackPublished","TrackUnpublished","TrackSubscribed","TrackUnsubscribed","LocalTrackPublished","LocalTrackUnpublished","ConnectionQualityChanged","off","muted","audioTrackPublications","forEach","isMuted","isLocal"],"mappings":"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","sourcesContent":["import {\n ConnectionQuality,\n LocalParticipant,\n Participant,\n ParticipantEvent,\n Track,\n TrackPublication,\n} from 'livekit-client';\nimport { useEffect, useState } from 'react';\n\nexport interface ParticipantState {\n isSpeaking: boolean;\n connectionQuality: ConnectionQuality;\n isLocal: boolean;\n metadata?: string;\n publications: TrackPublication[];\n subscribedTracks: TrackPublication[];\n cameraPublication?: TrackPublication;\n microphonePublication?: TrackPublication;\n screenSharePublication?: TrackPublication;\n}\n\nexport function useParticipant(participant: Participant): ParticipantState {\n const [isAudioMuted, setAudioMuted] = useState(false);\n const [, setVideoMuted] = useState(false);\n const [connectionQuality, setConnectionQuality] = useState<ConnectionQuality>(\n participant.connectionQuality\n );\n const [isSpeaking, setSpeaking] = useState(false);\n const [metadata, setMetadata] = useState<string>();\n const [publications, setPublications] = useState<TrackPublication[]>([]);\n const [subscribedTracks, setSubscribedTracks] = useState<TrackPublication[]>(\n []\n );\n\n const [cameraPublication, setCameraPublication] = useState(\n participant.getTrackPublication(Track.Source.Camera)\n );\n const [microphonePublication, setMicrophonePublication] = useState(\n participant.getTrackPublication(Track.Source.Microphone)\n );\n const [screenSharePublication, setScreenSharePublication] = useState(\n participant.getTrackPublication(Track.Source.ScreenShare)\n );\n useEffect(() => {\n const onPublicationsChanged = () => {\n setPublications(Array.from(participant.trackPublications.values()));\n setCameraPublication(\n participant.getTrackPublication(Track.Source.Camera)\n );\n setMicrophonePublication(\n participant.getTrackPublication(Track.Source.Microphone)\n );\n setScreenSharePublication(\n participant.getTrackPublication(Track.Source.ScreenShare)\n );\n setSubscribedTracks(\n Array.from(participant.trackPublications.values()).filter((pub) => {\n return pub.isSubscribed && pub.track !== undefined;\n })\n );\n };\n const onMuted = (pub: TrackPublication) => {\n if (pub.kind === Track.Kind.Audio) {\n setAudioMuted(true);\n } else if (pub.kind === Track.Kind.Video) {\n setVideoMuted(true);\n }\n };\n const onUnmuted = (pub: TrackPublication) => {\n if (pub.kind === Track.Kind.Audio) {\n setAudioMuted(false);\n } else if (pub.kind === Track.Kind.Video) {\n setVideoMuted(false);\n }\n };\n const onMetadataChanged = () => {\n if (participant.metadata) {\n setMetadata(participant.metadata);\n }\n };\n const onIsSpeakingChanged = () => {\n setSpeaking(participant.isSpeaking);\n };\n const onConnectionQualityUpdate = () => {\n setConnectionQuality(participant.connectionQuality);\n };\n\n // register listeners\n participant\n .on(ParticipantEvent.TrackMuted, onMuted)\n .on(ParticipantEvent.TrackUnmuted, onUnmuted)\n .on(ParticipantEvent.ParticipantMetadataChanged, onMetadataChanged)\n .on(ParticipantEvent.IsSpeakingChanged, onIsSpeakingChanged)\n .on(ParticipantEvent.TrackPublished, onPublicationsChanged)\n .on(ParticipantEvent.TrackUnpublished, onPublicationsChanged)\n .on(ParticipantEvent.TrackSubscribed, onPublicationsChanged)\n .on(ParticipantEvent.TrackUnsubscribed, onPublicationsChanged)\n .on(ParticipantEvent.LocalTrackPublished, onPublicationsChanged)\n .on(ParticipantEvent.LocalTrackUnpublished, onPublicationsChanged)\n .on(ParticipantEvent.ConnectionQualityChanged, onConnectionQualityUpdate);\n\n // set initial state\n onMetadataChanged();\n onIsSpeakingChanged();\n onPublicationsChanged();\n\n return () => {\n // cleanup\n participant\n .off(ParticipantEvent.TrackMuted, onMuted)\n .off(ParticipantEvent.TrackUnmuted, onUnmuted)\n .off(ParticipantEvent.ParticipantMetadataChanged, onMetadataChanged)\n .off(ParticipantEvent.IsSpeakingChanged, onIsSpeakingChanged)\n .off(ParticipantEvent.TrackPublished, onPublicationsChanged)\n .off(ParticipantEvent.TrackUnpublished, onPublicationsChanged)\n .off(ParticipantEvent.TrackSubscribed, onPublicationsChanged)\n .off(ParticipantEvent.TrackUnsubscribed, onPublicationsChanged)\n .off(ParticipantEvent.LocalTrackPublished, onPublicationsChanged)\n .off(ParticipantEvent.LocalTrackUnpublished, onPublicationsChanged)\n .off(\n ParticipantEvent.ConnectionQualityChanged,\n onConnectionQualityUpdate\n );\n };\n }, [participant]);\n\n let muted: boolean | undefined;\n participant.audioTrackPublications.forEach((pub) => {\n muted = pub.isMuted;\n });\n if (muted === undefined) {\n muted = true;\n }\n if (isAudioMuted !== muted) {\n setAudioMuted(muted);\n }\n\n return {\n isLocal: participant instanceof LocalParticipant,\n isSpeaking,\n connectionQuality,\n publications,\n subscribedTracks,\n cameraPublication,\n microphonePublication,\n screenSharePublication,\n metadata,\n };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["useParticipant.ts"],"names":["LocalParticipant","ParticipantEvent","Track","useEffect","useState","useParticipant","participant","isAudioMuted","setAudioMuted","setVideoMuted","connectionQuality","setConnectionQuality","isSpeaking","setSpeaking","metadata","setMetadata","publications","setPublications","subscribedTracks","setSubscribedTracks","cameraPublication","setCameraPublication","getTrackPublication","Source","Camera","microphonePublication","setMicrophonePublication","Microphone","screenSharePublication","setScreenSharePublication","ScreenShare","onPublicationsChanged","Array","from","trackPublications","values","filter","pub","isSubscribed","track","undefined","onMuted","kind","Kind","Audio","Video","onUnmuted","onMetadataChanged","onIsSpeakingChanged","onConnectionQualityUpdate","on","TrackMuted","TrackUnmuted","ParticipantMetadataChanged","IsSpeakingChanged","TrackPublished","TrackUnpublished","TrackSubscribed","TrackUnsubscribed","LocalTrackPublished","LocalTrackUnpublished","ConnectionQualityChanged","off","muted","audioTrackPublications","forEach","isMuted","isLocal"],"mappings":"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","sourcesContent":["import {\n ConnectionQuality,\n LocalParticipant,\n Participant,\n ParticipantEvent,\n Track,\n TrackPublication,\n} from 'livekit-client';\nimport { useEffect, useState } from 'react';\n\n/** @deprecated use `useRemoteParticipant` or `useLocalParticipant` instead */\nexport interface ParticipantState {\n isSpeaking: boolean;\n connectionQuality: ConnectionQuality;\n isLocal: boolean;\n metadata?: string;\n publications: TrackPublication[];\n subscribedTracks: TrackPublication[];\n cameraPublication?: TrackPublication;\n microphonePublication?: TrackPublication;\n screenSharePublication?: TrackPublication;\n}\n/** @deprecated use `useRemoteParticipant` or `useLocalParticipant` instead */\nexport function useParticipant(participant: Participant): ParticipantState {\n const [isAudioMuted, setAudioMuted] = useState(false);\n const [, setVideoMuted] = useState(false);\n const [connectionQuality, setConnectionQuality] = useState<ConnectionQuality>(\n participant.connectionQuality\n );\n const [isSpeaking, setSpeaking] = useState(false);\n const [metadata, setMetadata] = useState<string>();\n const [publications, setPublications] = useState<TrackPublication[]>([]);\n const [subscribedTracks, setSubscribedTracks] = useState<TrackPublication[]>(\n []\n );\n\n const [cameraPublication, setCameraPublication] = useState(\n participant.getTrackPublication(Track.Source.Camera)\n );\n const [microphonePublication, setMicrophonePublication] = useState(\n participant.getTrackPublication(Track.Source.Microphone)\n );\n const [screenSharePublication, setScreenSharePublication] = useState(\n participant.getTrackPublication(Track.Source.ScreenShare)\n );\n useEffect(() => {\n const onPublicationsChanged = () => {\n setPublications(Array.from(participant.trackPublications.values()));\n setCameraPublication(\n participant.getTrackPublication(Track.Source.Camera)\n );\n setMicrophonePublication(\n participant.getTrackPublication(Track.Source.Microphone)\n );\n setScreenSharePublication(\n participant.getTrackPublication(Track.Source.ScreenShare)\n );\n setSubscribedTracks(\n Array.from(participant.trackPublications.values()).filter((pub) => {\n return pub.isSubscribed && pub.track !== undefined;\n })\n );\n };\n const onMuted = (pub: TrackPublication) => {\n if (pub.kind === Track.Kind.Audio) {\n setAudioMuted(true);\n } else if (pub.kind === Track.Kind.Video) {\n setVideoMuted(true);\n }\n };\n const onUnmuted = (pub: TrackPublication) => {\n if (pub.kind === Track.Kind.Audio) {\n setAudioMuted(false);\n } else if (pub.kind === Track.Kind.Video) {\n setVideoMuted(false);\n }\n };\n const onMetadataChanged = () => {\n if (participant.metadata) {\n setMetadata(participant.metadata);\n }\n };\n const onIsSpeakingChanged = () => {\n setSpeaking(participant.isSpeaking);\n };\n const onConnectionQualityUpdate = () => {\n setConnectionQuality(participant.connectionQuality);\n };\n\n // register listeners\n participant\n .on(ParticipantEvent.TrackMuted, onMuted)\n .on(ParticipantEvent.TrackUnmuted, onUnmuted)\n .on(ParticipantEvent.ParticipantMetadataChanged, onMetadataChanged)\n .on(ParticipantEvent.IsSpeakingChanged, onIsSpeakingChanged)\n .on(ParticipantEvent.TrackPublished, onPublicationsChanged)\n .on(ParticipantEvent.TrackUnpublished, onPublicationsChanged)\n .on(ParticipantEvent.TrackSubscribed, onPublicationsChanged)\n .on(ParticipantEvent.TrackUnsubscribed, onPublicationsChanged)\n .on(ParticipantEvent.LocalTrackPublished, onPublicationsChanged)\n .on(ParticipantEvent.LocalTrackUnpublished, onPublicationsChanged)\n .on(ParticipantEvent.ConnectionQualityChanged, onConnectionQualityUpdate);\n\n // set initial state\n onMetadataChanged();\n onIsSpeakingChanged();\n onPublicationsChanged();\n\n return () => {\n // cleanup\n participant\n .off(ParticipantEvent.TrackMuted, onMuted)\n .off(ParticipantEvent.TrackUnmuted, onUnmuted)\n .off(ParticipantEvent.ParticipantMetadataChanged, onMetadataChanged)\n .off(ParticipantEvent.IsSpeakingChanged, onIsSpeakingChanged)\n .off(ParticipantEvent.TrackPublished, onPublicationsChanged)\n .off(ParticipantEvent.TrackUnpublished, onPublicationsChanged)\n .off(ParticipantEvent.TrackSubscribed, onPublicationsChanged)\n .off(ParticipantEvent.TrackUnsubscribed, onPublicationsChanged)\n .off(ParticipantEvent.LocalTrackPublished, onPublicationsChanged)\n .off(ParticipantEvent.LocalTrackUnpublished, onPublicationsChanged)\n .off(\n ParticipantEvent.ConnectionQualityChanged,\n onConnectionQualityUpdate\n );\n };\n }, [participant]);\n\n let muted: boolean | undefined;\n participant.audioTrackPublications.forEach((pub) => {\n muted = pub.isMuted;\n });\n if (muted === undefined) {\n muted = true;\n }\n if (isAudioMuted !== muted) {\n setAudioMuted(muted);\n }\n\n return {\n isLocal: participant instanceof LocalParticipant,\n isSpeaking,\n connectionQuality,\n publications,\n subscribedTracks,\n cameraPublication,\n microphonePublication,\n screenSharePublication,\n metadata,\n };\n}\n"]}
|
package/lib/module/useRoom.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { ConnectionState, RoomEvent, Track } from 'livekit-client';
|
|
2
2
|
import { useEffect, useState } from 'react';
|
|
3
|
+
|
|
4
|
+
/** @deprecated wrap your components in a <LiveKitRoom> component instead and use more granular hooks to track state you're interested in */
|
|
3
5
|
export function useRoom(room, options) {
|
|
4
6
|
var _options$sortParticip;
|
|
5
7
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["useRoom.ts"],"names":["ConnectionState","RoomEvent","Track","useEffect","useState","useRoom","room","options","error","participants","setParticipants","audioTracks","setAudioTracks","sortFunc","sortParticipants","onParticipantsChanged","remotes","Array","from","remoteParticipants","values","newParticipants","localParticipant","push","onSubscribedTrackChanged","track","kind","Kind","Audio","tracks","forEach","p","audioTrackPublications","pub","audioTrack","onConnectionStateChanged","state","Connected","once","Disconnected","off","ParticipantConnected","ParticipantDisconnected","ActiveSpeakersChanged","TrackSubscribed","TrackUnsubscribed","LocalTrackPublished","LocalTrackUnpublished","AudioPlaybackStatusChanged","ConnectionStateChanged","on","Reconnected","disconnect","sort","a","b","isSpeaking","audioLevel","lastSpokeAt","aLast","getTime","bLast","aVideo","videoTrackPublications","size","bVideo","joinedAt","localIdx","indexOf","splice","length"],"mappings":"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","sourcesContent":["import {\n AudioTrack,\n ConnectionState,\n LocalParticipant,\n Participant,\n RemoteTrack,\n Room,\n RoomEvent,\n Track,\n} from 'livekit-client';\nimport { useEffect, useState } from 'react';\n\nexport interface RoomState {\n room?: Room;\n /* all participants in the room, including the local participant. */\n participants: Participant[];\n /* all subscribed audio tracks in the room, not including local participant. */\n audioTracks: AudioTrack[];\n error?: Error;\n}\n\nexport interface RoomOptions {\n sortParticipants?: (participants: Participant[]) => void;\n}\n\nexport function useRoom(room: Room, options?: RoomOptions): RoomState {\n const [error] = useState<Error>();\n const [participants, setParticipants] = useState<Participant[]>([]);\n const [audioTracks, setAudioTracks] = useState<AudioTrack[]>([]);\n\n const sortFunc = options?.sortParticipants ?? sortParticipants;\n\n useEffect(() => {\n const onParticipantsChanged = () => {\n const remotes = Array.from(room.remoteParticipants.values());\n const newParticipants: Participant[] = [room.localParticipant];\n newParticipants.push(...remotes);\n sortFunc(newParticipants, room.localParticipant);\n setParticipants(newParticipants);\n };\n const onSubscribedTrackChanged = (track?: RemoteTrack) => {\n // ordering may have changed, re-sort\n onParticipantsChanged();\n if (track && track.kind !== Track.Kind.Audio) {\n return;\n }\n const tracks: AudioTrack[] = [];\n room.remoteParticipants.forEach((p) => {\n p.audioTrackPublications.forEach((pub) => {\n if (pub.audioTrack) {\n tracks.push(pub.audioTrack);\n }\n });\n });\n setAudioTracks(tracks);\n };\n\n const onConnectionStateChanged = (state: ConnectionState) => {\n if (state === ConnectionState.Connected) {\n onParticipantsChanged();\n }\n };\n\n room.once(RoomEvent.Disconnected, () => {\n room\n .off(RoomEvent.ParticipantConnected, onParticipantsChanged)\n .off(RoomEvent.ParticipantDisconnected, onParticipantsChanged)\n .off(RoomEvent.ActiveSpeakersChanged, onParticipantsChanged)\n .off(RoomEvent.TrackSubscribed, onSubscribedTrackChanged)\n .off(RoomEvent.TrackUnsubscribed, onSubscribedTrackChanged)\n .off(RoomEvent.LocalTrackPublished, onParticipantsChanged)\n .off(RoomEvent.LocalTrackUnpublished, onParticipantsChanged)\n .off(RoomEvent.AudioPlaybackStatusChanged, onParticipantsChanged)\n .off(RoomEvent.ConnectionStateChanged, onConnectionStateChanged);\n });\n room\n .on(RoomEvent.ConnectionStateChanged, onConnectionStateChanged)\n .on(RoomEvent.Reconnected, onParticipantsChanged)\n .on(RoomEvent.ParticipantConnected, onParticipantsChanged)\n .on(RoomEvent.ParticipantDisconnected, onParticipantsChanged)\n .on(RoomEvent.ActiveSpeakersChanged, onParticipantsChanged)\n .on(RoomEvent.TrackSubscribed, onSubscribedTrackChanged)\n .on(RoomEvent.TrackUnsubscribed, onSubscribedTrackChanged)\n .on(RoomEvent.LocalTrackPublished, onParticipantsChanged)\n .on(RoomEvent.LocalTrackUnpublished, onParticipantsChanged)\n // trigger a state change by re-sorting participants\n .on(RoomEvent.AudioPlaybackStatusChanged, onParticipantsChanged);\n\n onSubscribedTrackChanged();\n\n return () => {\n room.disconnect();\n };\n }, [room, sortFunc]);\n\n return {\n error,\n participants,\n audioTracks,\n };\n}\n\n/**\n * Default sort for participants, it'll order participants by:\n * 1. dominant speaker (speaker with the loudest audio level)\n * 2. local participant\n * 3. other speakers that are recently active\n * 4. participants with video on\n * 5. by joinedAt\n */\nexport function sortParticipants(\n participants: Participant[],\n localParticipant?: LocalParticipant\n) {\n participants.sort((a, b) => {\n // loudest speaker first\n if (a.isSpeaking && b.isSpeaking) {\n return b.audioLevel - a.audioLevel;\n }\n\n // speaker goes first\n if (a.isSpeaking !== b.isSpeaking) {\n if (a.isSpeaking) {\n return -1;\n } else {\n return 1;\n }\n }\n\n // last active speaker first\n if (a.lastSpokeAt !== b.lastSpokeAt) {\n const aLast = a.lastSpokeAt?.getTime() ?? 0;\n const bLast = b.lastSpokeAt?.getTime() ?? 0;\n return bLast - aLast;\n }\n\n // video on\n const aVideo = a.videoTrackPublications.size > 0;\n const bVideo = b.videoTrackPublications.size > 0;\n if (aVideo !== bVideo) {\n if (aVideo) {\n return -1;\n } else {\n return 1;\n }\n }\n\n // joinedAt\n return (a.joinedAt?.getTime() ?? 0) - (b.joinedAt?.getTime() ?? 0);\n });\n\n if (localParticipant) {\n const localIdx = participants.indexOf(localParticipant);\n if (localIdx >= 0) {\n participants.splice(localIdx, 1);\n if (participants.length > 0) {\n participants.splice(1, 0, localParticipant);\n } else {\n participants.push(localParticipant);\n }\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["useRoom.ts"],"names":["ConnectionState","RoomEvent","Track","useEffect","useState","useRoom","room","options","error","participants","setParticipants","audioTracks","setAudioTracks","sortFunc","sortParticipants","onParticipantsChanged","remotes","Array","from","remoteParticipants","values","newParticipants","localParticipant","push","onSubscribedTrackChanged","track","kind","Kind","Audio","tracks","forEach","p","audioTrackPublications","pub","audioTrack","onConnectionStateChanged","state","Connected","once","Disconnected","off","ParticipantConnected","ParticipantDisconnected","ActiveSpeakersChanged","TrackSubscribed","TrackUnsubscribed","LocalTrackPublished","LocalTrackUnpublished","AudioPlaybackStatusChanged","ConnectionStateChanged","on","Reconnected","disconnect","sort","a","b","isSpeaking","audioLevel","lastSpokeAt","aLast","getTime","bLast","aVideo","videoTrackPublications","size","bVideo","joinedAt","localIdx","indexOf","splice","length"],"mappings":"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","sourcesContent":["import {\n AudioTrack,\n ConnectionState,\n LocalParticipant,\n Participant,\n RemoteTrack,\n Room,\n RoomEvent,\n Track,\n} from 'livekit-client';\nimport { useEffect, useState } from 'react';\n\nexport interface RoomState {\n room?: Room;\n /* all participants in the room, including the local participant. */\n participants: Participant[];\n /* all subscribed audio tracks in the room, not including local participant. */\n audioTracks: AudioTrack[];\n error?: Error;\n}\n\nexport interface RoomOptions {\n sortParticipants?: (participants: Participant[]) => void;\n}\n\n/** @deprecated wrap your components in a <LiveKitRoom> component instead and use more granular hooks to track state you're interested in */\nexport function useRoom(room: Room, options?: RoomOptions): RoomState {\n const [error] = useState<Error>();\n const [participants, setParticipants] = useState<Participant[]>([]);\n const [audioTracks, setAudioTracks] = useState<AudioTrack[]>([]);\n\n const sortFunc = options?.sortParticipants ?? sortParticipants;\n\n useEffect(() => {\n const onParticipantsChanged = () => {\n const remotes = Array.from(room.remoteParticipants.values());\n const newParticipants: Participant[] = [room.localParticipant];\n newParticipants.push(...remotes);\n sortFunc(newParticipants, room.localParticipant);\n setParticipants(newParticipants);\n };\n const onSubscribedTrackChanged = (track?: RemoteTrack) => {\n // ordering may have changed, re-sort\n onParticipantsChanged();\n if (track && track.kind !== Track.Kind.Audio) {\n return;\n }\n const tracks: AudioTrack[] = [];\n room.remoteParticipants.forEach((p) => {\n p.audioTrackPublications.forEach((pub) => {\n if (pub.audioTrack) {\n tracks.push(pub.audioTrack);\n }\n });\n });\n setAudioTracks(tracks);\n };\n\n const onConnectionStateChanged = (state: ConnectionState) => {\n if (state === ConnectionState.Connected) {\n onParticipantsChanged();\n }\n };\n\n room.once(RoomEvent.Disconnected, () => {\n room\n .off(RoomEvent.ParticipantConnected, onParticipantsChanged)\n .off(RoomEvent.ParticipantDisconnected, onParticipantsChanged)\n .off(RoomEvent.ActiveSpeakersChanged, onParticipantsChanged)\n .off(RoomEvent.TrackSubscribed, onSubscribedTrackChanged)\n .off(RoomEvent.TrackUnsubscribed, onSubscribedTrackChanged)\n .off(RoomEvent.LocalTrackPublished, onParticipantsChanged)\n .off(RoomEvent.LocalTrackUnpublished, onParticipantsChanged)\n .off(RoomEvent.AudioPlaybackStatusChanged, onParticipantsChanged)\n .off(RoomEvent.ConnectionStateChanged, onConnectionStateChanged);\n });\n room\n .on(RoomEvent.ConnectionStateChanged, onConnectionStateChanged)\n .on(RoomEvent.Reconnected, onParticipantsChanged)\n .on(RoomEvent.ParticipantConnected, onParticipantsChanged)\n .on(RoomEvent.ParticipantDisconnected, onParticipantsChanged)\n .on(RoomEvent.ActiveSpeakersChanged, onParticipantsChanged)\n .on(RoomEvent.TrackSubscribed, onSubscribedTrackChanged)\n .on(RoomEvent.TrackUnsubscribed, onSubscribedTrackChanged)\n .on(RoomEvent.LocalTrackPublished, onParticipantsChanged)\n .on(RoomEvent.LocalTrackUnpublished, onParticipantsChanged)\n // trigger a state change by re-sorting participants\n .on(RoomEvent.AudioPlaybackStatusChanged, onParticipantsChanged);\n\n onSubscribedTrackChanged();\n\n return () => {\n room.disconnect();\n };\n }, [room, sortFunc]);\n\n return {\n error,\n participants,\n audioTracks,\n };\n}\n\n/**\n * Default sort for participants, it'll order participants by:\n * 1. dominant speaker (speaker with the loudest audio level)\n * 2. local participant\n * 3. other speakers that are recently active\n * 4. participants with video on\n * 5. by joinedAt\n */\nexport function sortParticipants(\n participants: Participant[],\n localParticipant?: LocalParticipant\n) {\n participants.sort((a, b) => {\n // loudest speaker first\n if (a.isSpeaking && b.isSpeaking) {\n return b.audioLevel - a.audioLevel;\n }\n\n // speaker goes first\n if (a.isSpeaking !== b.isSpeaking) {\n if (a.isSpeaking) {\n return -1;\n } else {\n return 1;\n }\n }\n\n // last active speaker first\n if (a.lastSpokeAt !== b.lastSpokeAt) {\n const aLast = a.lastSpokeAt?.getTime() ?? 0;\n const bLast = b.lastSpokeAt?.getTime() ?? 0;\n return bLast - aLast;\n }\n\n // video on\n const aVideo = a.videoTrackPublications.size > 0;\n const bVideo = b.videoTrackPublications.size > 0;\n if (aVideo !== bVideo) {\n if (aVideo) {\n return -1;\n } else {\n return 1;\n }\n }\n\n // joinedAt\n return (a.joinedAt?.getTime() ?? 0) - (b.joinedAt?.getTime() ?? 0);\n });\n\n if (localParticipant) {\n const localIdx = participants.indexOf(localParticipant);\n if (localIdx >= 0) {\n participants.splice(localIdx, 1);\n if (participants.length > 0) {\n participants.splice(1, 0, localParticipant);\n } else {\n participants.push(localParticipant);\n }\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { FeatureFlags } from '@livekit/components-react';
|
|
2
|
+
import type { AudioCaptureOptions, RoomConnectOptions, RoomOptions, ScreenShareCaptureOptions, VideoCaptureOptions } from 'livekit-client';
|
|
3
|
+
import type { MediaDeviceFailure, Room } from 'livekit-client';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
/** @public */
|
|
6
|
+
export interface LiveKitRoomProps {
|
|
7
|
+
/**
|
|
8
|
+
* URL to the LiveKit server.
|
|
9
|
+
* For example: `wss://<domain>.livekit.cloud`
|
|
10
|
+
* To simplify the implementation, `undefined` is also accepted as an intermediate value, but only with a valid string url can the connection be established.
|
|
11
|
+
*/
|
|
12
|
+
serverUrl: string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* A user specific access token for a client to authenticate to the room.
|
|
15
|
+
* This token is necessary to establish a connection to the room.
|
|
16
|
+
* To simplify the implementation, `undefined` is also accepted as an intermediate value, but only with a valid string token can the connection be established.
|
|
17
|
+
*
|
|
18
|
+
* @see https://docs.livekit.io/cloud/project-management/keys-and-tokens/#generating-access-tokens
|
|
19
|
+
*/
|
|
20
|
+
token: string | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* Publish audio immediately after connecting to your LiveKit room.
|
|
23
|
+
* @defaultValue `false`
|
|
24
|
+
* @see https://docs.livekit.io/client-sdk-js/interfaces/AudioCaptureOptions.html
|
|
25
|
+
*/
|
|
26
|
+
audio?: AudioCaptureOptions | boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Publish video immediately after connecting to your LiveKit room.
|
|
29
|
+
* @defaultValue `false`
|
|
30
|
+
* @see https://docs.livekit.io/client-sdk-js/interfaces/VideoCaptureOptions.html
|
|
31
|
+
*/
|
|
32
|
+
video?: VideoCaptureOptions | boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Publish screen share immediately after connecting to your LiveKit room.
|
|
35
|
+
* @defaultValue `false`
|
|
36
|
+
* @see https://docs.livekit.io/client-sdk-js/interfaces/ScreenShareCaptureOptions.html
|
|
37
|
+
*/
|
|
38
|
+
screen?: ScreenShareCaptureOptions | boolean;
|
|
39
|
+
/**
|
|
40
|
+
* If set to true a connection to LiveKit room is initiated.
|
|
41
|
+
* @defaultValue `false`
|
|
42
|
+
*/
|
|
43
|
+
connect?: boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Options for when creating a new room.
|
|
46
|
+
* When you pass your own room instance to this component, these options have no effect.
|
|
47
|
+
* Instead, set the options directly in the room instance.
|
|
48
|
+
*
|
|
49
|
+
* @see https://docs.livekit.io/client-sdk-js/interfaces/RoomOptions.html
|
|
50
|
+
*/
|
|
51
|
+
options?: RoomOptions;
|
|
52
|
+
/**
|
|
53
|
+
* Define options how to connect to the LiveKit server.
|
|
54
|
+
*
|
|
55
|
+
* @see https://docs.livekit.io/client-sdk-js/interfaces/RoomConnectOptions.html
|
|
56
|
+
*/
|
|
57
|
+
connectOptions?: RoomConnectOptions;
|
|
58
|
+
onConnected?: () => void;
|
|
59
|
+
onDisconnected?: () => void;
|
|
60
|
+
onError?: (error: Error) => void;
|
|
61
|
+
onMediaDeviceFailure?: (failure?: MediaDeviceFailure) => void;
|
|
62
|
+
onEncryptionError?: (error: Error) => void;
|
|
63
|
+
/**
|
|
64
|
+
* Optional room instance.
|
|
65
|
+
* By passing your own room instance you overwrite the `options` parameter,
|
|
66
|
+
* make sure to set the options directly on the room instance itself.
|
|
67
|
+
*/
|
|
68
|
+
room?: Room;
|
|
69
|
+
simulateParticipants?: number | undefined;
|
|
70
|
+
/** @experimental */
|
|
71
|
+
featureFlags?: FeatureFlags | undefined;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* The `LiveKitRoom` component provides the room context to all its child components.
|
|
75
|
+
* It is generally the starting point of your LiveKit app and the root of the LiveKit component tree.
|
|
76
|
+
* It provides the room state as a React context to all child components, so you don't have to pass it yourself.
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```tsx
|
|
80
|
+
* <LiveKitRoom
|
|
81
|
+
* token='<livekit-token>'
|
|
82
|
+
* serverUrl='<url-to-livekit-server>'
|
|
83
|
+
* connect={true}
|
|
84
|
+
* >
|
|
85
|
+
* ...
|
|
86
|
+
* </LiveKitRoom>
|
|
87
|
+
* ```
|
|
88
|
+
* @public
|
|
89
|
+
*/
|
|
90
|
+
export declare function LiveKitRoom(props: React.PropsWithChildren<LiveKitRoomProps>): React.JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { ViewStyle } from 'react-native';
|
|
3
|
+
import type { TrackReference } from '@livekit/components-react';
|
|
4
|
+
export declare type VideoTrackProps = {
|
|
5
|
+
trackRef: TrackReference | undefined;
|
|
6
|
+
style?: ViewStyle;
|
|
7
|
+
objectFit?: 'cover' | 'contain' | undefined;
|
|
8
|
+
mirror?: boolean;
|
|
9
|
+
zOrder?: number;
|
|
10
|
+
};
|
|
11
|
+
export declare const VideoTrack: ({ style, trackRef, objectFit, zOrder, mirror, }: VideoTrackProps) => React.JSX.Element;
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { ViewStyle } from 'react-native';
|
|
3
3
|
import { VideoTrack } from 'livekit-client';
|
|
4
|
+
/**
|
|
5
|
+
* @deprecated use `VideoTrack` and `VideoTrackProps` instead.
|
|
6
|
+
*/
|
|
4
7
|
export declare type Props = {
|
|
5
8
|
videoTrack?: VideoTrack | undefined;
|
|
6
9
|
style?: ViewStyle;
|
|
@@ -8,4 +11,7 @@ export declare type Props = {
|
|
|
8
11
|
mirror?: boolean;
|
|
9
12
|
zOrder?: number;
|
|
10
13
|
};
|
|
14
|
+
/**
|
|
15
|
+
* @deprecated use `VideoTrack` and `VideoTrackProps` instead.
|
|
16
|
+
*/
|
|
11
17
|
export declare const VideoView: ({ style, videoTrack, objectFit, zOrder, mirror, }: Props) => React.JSX.Element;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import React, { Component, PropsWithChildren } from 'react';
|
|
2
|
-
import { ViewStyle } from 'react-native';
|
|
2
|
+
import { AppStateStatus, ViewStyle } from 'react-native';
|
|
3
3
|
export declare type Props = {
|
|
4
4
|
disabled?: boolean;
|
|
5
5
|
style?: ViewStyle;
|
|
6
6
|
onChange?: (isVisible: boolean) => void;
|
|
7
7
|
delay?: number;
|
|
8
|
+
propKey?: any;
|
|
8
9
|
};
|
|
9
10
|
/**
|
|
10
11
|
* Detects when this is in the viewport and visible.
|
|
@@ -15,12 +16,18 @@ export default class ViewPortDetector extends Component<PropsWithChildren<Props>
|
|
|
15
16
|
private lastValue;
|
|
16
17
|
private interval;
|
|
17
18
|
private view;
|
|
19
|
+
private lastAppStateActive;
|
|
20
|
+
private appStateSubscription;
|
|
18
21
|
constructor(props: Props);
|
|
19
22
|
componentDidMount(): void;
|
|
20
23
|
componentWillUnmount(): void;
|
|
24
|
+
hasValidTimeout: (disabled?: boolean, delay?: number) => boolean;
|
|
21
25
|
UNSAFE_componentWillReceiveProps(nextProps: Props): void;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
26
|
+
handleAppStateChange: (nextAppState: AppStateStatus) => void;
|
|
27
|
+
startWatching: () => void;
|
|
28
|
+
stopWatching: () => void;
|
|
29
|
+
checkVisibility: () => void;
|
|
30
|
+
checkInViewPort: (width?: number, height?: number) => void;
|
|
31
|
+
updateVisibility: (isVisible: boolean) => void;
|
|
25
32
|
render(): React.JSX.Element;
|
|
26
33
|
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { useConnectionState, useDataChannel, useIsSpeaking, useLocalParticipant, UseLocalParticipantOptions, useLocalParticipantPermissions, useParticipantInfo, UseParticipantInfoOptions, useParticipants, UseParticipantsOptions, useRemoteParticipants, UseRemoteParticipantOptions, useRemoteParticipant, UseRemoteParticipantsOptions, useSpeakingParticipants, useSortedParticipants, useChat, useIsEncrypted, useIsMuted, useParticipantTracks, useLiveKitRoom, RoomContext, useRoomContext, ParticipantContext, useParticipantContext, TrackRefContext, useTrackRefContext, useTracks, UseTracksOptions, TrackReference, TrackReferenceOrPlaceholder, isTrackReference, useEnsureTrackRef, useTrackMutedIndicator, useVisualStableUpdate, UseVisualStableUpdateOptions, } from '@livekit/components-react';
|
|
2
|
+
export { ReceivedDataMessage } from '@livekit/components-core';
|
|
@@ -8,6 +8,9 @@ import type { LogLevel, SetLogLevelOptions } from './logger';
|
|
|
8
8
|
* Must be called before using LiveKit.
|
|
9
9
|
*/
|
|
10
10
|
export declare function registerGlobals(): void;
|
|
11
|
+
export * from './hooks';
|
|
12
|
+
export * from './components/LiveKitRoom';
|
|
13
|
+
export * from './components/VideoTrack';
|
|
11
14
|
export * from './components/VideoView';
|
|
12
15
|
export * from './useParticipant';
|
|
13
16
|
export * from './useRoom';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ConnectionQuality, Participant, TrackPublication } from 'livekit-client';
|
|
2
|
+
/** @deprecated use `useRemoteParticipant` or `useLocalParticipant` instead */
|
|
2
3
|
export interface ParticipantState {
|
|
3
4
|
isSpeaking: boolean;
|
|
4
5
|
connectionQuality: ConnectionQuality;
|
|
@@ -10,4 +11,5 @@ export interface ParticipantState {
|
|
|
10
11
|
microphonePublication?: TrackPublication;
|
|
11
12
|
screenSharePublication?: TrackPublication;
|
|
12
13
|
}
|
|
14
|
+
/** @deprecated use `useRemoteParticipant` or `useLocalParticipant` instead */
|
|
13
15
|
export declare function useParticipant(participant: Participant): ParticipantState;
|
|
@@ -8,6 +8,7 @@ export interface RoomState {
|
|
|
8
8
|
export interface RoomOptions {
|
|
9
9
|
sortParticipants?: (participants: Participant[]) => void;
|
|
10
10
|
}
|
|
11
|
+
/** @deprecated wrap your components in a <LiveKitRoom> component instead and use more granular hooks to track state you're interested in */
|
|
11
12
|
export declare function useRoom(room: Room, options?: RoomOptions): RoomState;
|
|
12
13
|
/**
|
|
13
14
|
* Default sort for participants, it'll order participants by:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livekit/react-native",
|
|
3
|
-
"version": "2.0
|
|
3
|
+
"version": "2.1.0-0",
|
|
4
4
|
"description": "LiveKit for React Native",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"android"
|
|
43
43
|
],
|
|
44
44
|
"dependencies": {
|
|
45
|
+
"@livekit/components-react": "^2.0.6",
|
|
45
46
|
"array.prototype.at": "^1.1.1",
|
|
46
47
|
"fastestsmallesttextencoderdecoder": "^1.0.22",
|
|
47
48
|
"livekit-client": "^2.0.0",
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import {
|
|
2
|
+
FeatureFlags,
|
|
3
|
+
LKFeatureContext,
|
|
4
|
+
RoomContext,
|
|
5
|
+
useLiveKitRoom,
|
|
6
|
+
} from '@livekit/components-react';
|
|
7
|
+
import type {
|
|
8
|
+
AudioCaptureOptions,
|
|
9
|
+
RoomConnectOptions,
|
|
10
|
+
RoomOptions,
|
|
11
|
+
ScreenShareCaptureOptions,
|
|
12
|
+
VideoCaptureOptions,
|
|
13
|
+
} from 'livekit-client';
|
|
14
|
+
import type { MediaDeviceFailure, Room } from 'livekit-client';
|
|
15
|
+
import * as React from 'react';
|
|
16
|
+
|
|
17
|
+
/** @public */
|
|
18
|
+
export interface LiveKitRoomProps {
|
|
19
|
+
/**
|
|
20
|
+
* URL to the LiveKit server.
|
|
21
|
+
* For example: `wss://<domain>.livekit.cloud`
|
|
22
|
+
* To simplify the implementation, `undefined` is also accepted as an intermediate value, but only with a valid string url can the connection be established.
|
|
23
|
+
*/
|
|
24
|
+
serverUrl: string | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* A user specific access token for a client to authenticate to the room.
|
|
27
|
+
* This token is necessary to establish a connection to the room.
|
|
28
|
+
* To simplify the implementation, `undefined` is also accepted as an intermediate value, but only with a valid string token can the connection be established.
|
|
29
|
+
*
|
|
30
|
+
* @see https://docs.livekit.io/cloud/project-management/keys-and-tokens/#generating-access-tokens
|
|
31
|
+
*/
|
|
32
|
+
token: string | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Publish audio immediately after connecting to your LiveKit room.
|
|
35
|
+
* @defaultValue `false`
|
|
36
|
+
* @see https://docs.livekit.io/client-sdk-js/interfaces/AudioCaptureOptions.html
|
|
37
|
+
*/
|
|
38
|
+
audio?: AudioCaptureOptions | boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Publish video immediately after connecting to your LiveKit room.
|
|
41
|
+
* @defaultValue `false`
|
|
42
|
+
* @see https://docs.livekit.io/client-sdk-js/interfaces/VideoCaptureOptions.html
|
|
43
|
+
*/
|
|
44
|
+
video?: VideoCaptureOptions | boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Publish screen share immediately after connecting to your LiveKit room.
|
|
47
|
+
* @defaultValue `false`
|
|
48
|
+
* @see https://docs.livekit.io/client-sdk-js/interfaces/ScreenShareCaptureOptions.html
|
|
49
|
+
*/
|
|
50
|
+
screen?: ScreenShareCaptureOptions | boolean;
|
|
51
|
+
/**
|
|
52
|
+
* If set to true a connection to LiveKit room is initiated.
|
|
53
|
+
* @defaultValue `false`
|
|
54
|
+
*/
|
|
55
|
+
connect?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Options for when creating a new room.
|
|
58
|
+
* When you pass your own room instance to this component, these options have no effect.
|
|
59
|
+
* Instead, set the options directly in the room instance.
|
|
60
|
+
*
|
|
61
|
+
* @see https://docs.livekit.io/client-sdk-js/interfaces/RoomOptions.html
|
|
62
|
+
*/
|
|
63
|
+
options?: RoomOptions;
|
|
64
|
+
/**
|
|
65
|
+
* Define options how to connect to the LiveKit server.
|
|
66
|
+
*
|
|
67
|
+
* @see https://docs.livekit.io/client-sdk-js/interfaces/RoomConnectOptions.html
|
|
68
|
+
*/
|
|
69
|
+
connectOptions?: RoomConnectOptions;
|
|
70
|
+
onConnected?: () => void;
|
|
71
|
+
onDisconnected?: () => void;
|
|
72
|
+
onError?: (error: Error) => void;
|
|
73
|
+
onMediaDeviceFailure?: (failure?: MediaDeviceFailure) => void;
|
|
74
|
+
onEncryptionError?: (error: Error) => void;
|
|
75
|
+
/**
|
|
76
|
+
* Optional room instance.
|
|
77
|
+
* By passing your own room instance you overwrite the `options` parameter,
|
|
78
|
+
* make sure to set the options directly on the room instance itself.
|
|
79
|
+
*/
|
|
80
|
+
room?: Room;
|
|
81
|
+
|
|
82
|
+
simulateParticipants?: number | undefined;
|
|
83
|
+
|
|
84
|
+
/** @experimental */
|
|
85
|
+
featureFlags?: FeatureFlags | undefined;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The `LiveKitRoom` component provides the room context to all its child components.
|
|
90
|
+
* It is generally the starting point of your LiveKit app and the root of the LiveKit component tree.
|
|
91
|
+
* It provides the room state as a React context to all child components, so you don't have to pass it yourself.
|
|
92
|
+
*
|
|
93
|
+
* @example
|
|
94
|
+
* ```tsx
|
|
95
|
+
* <LiveKitRoom
|
|
96
|
+
* token='<livekit-token>'
|
|
97
|
+
* serverUrl='<url-to-livekit-server>'
|
|
98
|
+
* connect={true}
|
|
99
|
+
* >
|
|
100
|
+
* ...
|
|
101
|
+
* </LiveKitRoom>
|
|
102
|
+
* ```
|
|
103
|
+
* @public
|
|
104
|
+
*/
|
|
105
|
+
export function LiveKitRoom(props: React.PropsWithChildren<LiveKitRoomProps>) {
|
|
106
|
+
const { room } = useLiveKitRoom(props);
|
|
107
|
+
return (
|
|
108
|
+
<>
|
|
109
|
+
{room && (
|
|
110
|
+
<RoomContext.Provider value={room}>
|
|
111
|
+
<LKFeatureContext.Provider value={props.featureFlags}>
|
|
112
|
+
{props.children}
|
|
113
|
+
</LKFeatureContext.Provider>
|
|
114
|
+
</RoomContext.Provider>
|
|
115
|
+
)}
|
|
116
|
+
</>
|
|
117
|
+
);
|
|
118
|
+
}
|