@cloudflare/realtimekit-react-native 0.3.1-staging.1 → 0.3.1

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.
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_reactNativeWebrtc","_LocalMediaError","_interopRequireDefault","_NativeAudioManager","e","__esModule","default","_classPrivateFieldInitSpec","t","a","_checkPrivateRedeclaration","set","has","TypeError","_classPrivateFieldGet","s","get","_assertClassBrand","_classPrivateFieldSet","r","n","arguments","length","LogBox","ignoreLogs","VIDEO_CONSTRAINTS","exports","qvga","width","ideal","height","vga","hd","hd_cropped","_availableDevices","WeakMap","_nativeEventEmitter","_previouslySelectedDevice","LocalMediaUtils","constructor","availableDevices","NativeEventEmitter","NativeModules","InCallManager","init","availableVideoDevices","enumerateVideoDevices","availableAudioDevices","enumerateAudioDevices","concat","destruct","removeAllListeners","isDeviceListAvailable","deviceMem","videoDevices","mediaDevices","enumerateDevices","filter","d","kind","facing","error","audioDevices","earpiece","connected","haveMic","speaker","bluetooth","wired","isWiredHeadphonesConnected","NativeAudioManager","getIsWiredHeadsetPluggedIn","isBluetoothHeadsetConnected","resp","Object","keys","map","audioDevice","audioDeviceProps","deviceId","label","getVideoConstraints","options","constraints","videoDeviceId","videoTrackConstraints","facingMode","frameRate","max","video","getUserMediaWithTimeout","timeout","getUserMedia","Promise","race","_resolve","reject","setTimeout","LocalMediaError","err","getAudioTrack","mediaStream","audio","getAudioTracks","getVideoTrack","getVideoTracks","getScreenShareTracks","stream","getDisplayMedia","getAudioAndVideoTrack","audioTrack","videoTrack","onDeviceChange","callback","onChange","deviceData","checkDeviceId","_id","toLowerCase","includes","selectedDevice","selectedAudioDevice","hasSelectedDeviceChanged","isFirstDeviceEvent","previouslyAvailableDevices","device","previouslyAvailableDeviceIds","availableDeviceListFromEvent","len","availableAudioDeviceList","JSON","parse","currentlyAvailableDevices","currentlyAvailableDeviceIds","changedDevices","added","removed","hasAvailableListChanged","every","repopulateAvailableDevices","then","shouldFireCallback","listenerCount","addListener","chooseAudioRoute","route","getAvailableDevicesByKind","getDeviceById","normalizedDeviceId","find","deviceIdLower","getAudioDevices","getVideoDevices","getSpeakerDevices","speakerDevices"],"sources":["LocalMediaUtils.ts"],"sourcesContent":["import { NativeEventEmitter, NativeModules, LogBox } from 'react-native';\nimport { mediaDevices, MediaStream } from '@cloudflare/react-native-webrtc';\nimport LocalMediaError from './LocalMediaError';\nimport {\n ConstrainDouble,\n RealtimeKitMediaStreamConstraints,\n RealtimeKitMediaTrackConstraints,\n MediaDeviceInfo,\n} from './LocalMediaInterfaces';\nimport NativeAudioManager from './NativeAudioManager';\nLogBox.ignoreLogs(['new NativeEventEmitter']);\nexport interface LocalAudioOptions {\n // Disables all audio processing\n disableAP?: boolean;\n\n // Disables Acoustic Echo Cancellation\n disableAEC?: boolean;\n\n // Disables Noise Suppression\n disableNS?: boolean;\n\n // Disables Automatic Gain Control\n disableAGC?: boolean;\n\n // Disables Highpass Filter\n disableHPF?: boolean;\n}\n\nexport const VIDEO_CONSTRAINTS = {\n qvga: { width: { ideal: 320 }, height: { ideal: 240 } },\n vga: { width: { ideal: 640 }, height: { ideal: 480 } },\n hd: { width: { ideal: 1280 }, height: { ideal: 720 } },\n hd_cropped: { width: { ideal: 900 }, height: { ideal: 720 } },\n};\n\n/**\n * To initialize an instance of this class, use the\n * `.init()` static method.\n */\nexport default class LocalMediaUtils {\n #availableDevices: MediaDeviceInfo[];\n\n #nativeEventEmitter: NativeEventEmitter;\n\n #previouslySelectedDevice: string | null = null;\n\n private constructor(availableDevices: MediaDeviceInfo[]) {\n this.#availableDevices = availableDevices;\n this.#nativeEventEmitter = new NativeEventEmitter(\n NativeModules.InCallManager\n );\n }\n\n public static async init() {\n const availableVideoDevices = await LocalMediaUtils.enumerateVideoDevices();\n const availableAudioDevices = await LocalMediaUtils.enumerateAudioDevices();\n return new LocalMediaUtils(\n availableAudioDevices.concat(availableVideoDevices)\n );\n }\n\n public async destruct() {\n this.#nativeEventEmitter.removeAllListeners('onAudioDeviceChanged');\n }\n\n public static isDeviceListAvailable() {\n return true;\n }\n\n private static async enumerateVideoDevices(): Promise<MediaDeviceInfo[]> {\n try {\n const deviceMem = {};\n const videoDevices =\n (await mediaDevices.enumerateDevices()) as MediaDeviceInfo[];\n return videoDevices.filter((d) => {\n if (d.kind === 'videoinput' && !deviceMem[d.facing]) {\n deviceMem[d.facing] = true;\n return d;\n }\n return false;\n });\n } catch (error) {\n return [];\n }\n }\n\n private static async enumerateAudioDevices(): Promise<MediaDeviceInfo[]> {\n let audioDevices = {\n earpiece: {\n connected: true,\n haveMic: true,\n },\n speaker: {\n connected: true,\n haveMic: true,\n },\n bluetooth: {\n connected: false,\n haveMic: false,\n },\n wired: {\n connected: false,\n haveMic: false,\n },\n };\n const isWiredHeadphonesConnected =\n await NativeAudioManager.getIsWiredHeadsetPluggedIn();\n audioDevices.wired = isWiredHeadphonesConnected\n ? {\n connected: true,\n haveMic: true,\n }\n : {\n connected: false,\n haveMic: false,\n };\n const isBluetoothHeadsetConnected =\n await NativeAudioManager.isBluetoothHeadsetConnected();\n audioDevices.bluetooth = isBluetoothHeadsetConnected\n ? {\n connected: true,\n haveMic: true,\n }\n : {\n connected: false,\n haveMic: false,\n };\n const resp = Object.keys(audioDevices)\n .map((audioDevice) => {\n const audioDeviceProps = audioDevices[audioDevice];\n return {\n ...audioDeviceProps,\n deviceId: audioDevice,\n label: audioDevice,\n kind: 'audioinput',\n };\n })\n .filter((audioDevice) => audioDevice.connected);\n return resp as MediaDeviceInfo[];\n }\n\n public static getVideoConstraints(options?: {\n videoDeviceId?: string;\n videoTrackConstraints?: boolean | RealtimeKitMediaTrackConstraints;\n facingMode?: string;\n frameRate?: ConstrainDouble;\n }) {\n const constraints: RealtimeKitMediaStreamConstraints = {};\n const {\n videoDeviceId,\n videoTrackConstraints,\n facingMode = 'user',\n frameRate = { ideal: 24, max: 30 },\n } = options;\n\n constraints.video = videoTrackConstraints || VIDEO_CONSTRAINTS.vga;\n if (typeof constraints.video === 'boolean') {\n return constraints;\n }\n\n constraints.video.deviceId = videoDeviceId;\n constraints.video.facingMode = facingMode;\n constraints.video.frameRate = frameRate;\n return constraints;\n }\n\n private static async getUserMediaWithTimeout(\n constraints: RealtimeKitMediaStreamConstraints = {},\n timeout: number = 0\n ) {\n try {\n if (!timeout) {\n return await mediaDevices.getUserMedia(constraints);\n }\n\n // NOTE(roerohan): The await is required to catch errors (if any).\n return Promise.race<Promise<unknown>>([\n mediaDevices.getUserMedia(constraints),\n\n new Promise<MediaStream>((_resolve, reject) => {\n setTimeout(\n () =>\n reject(\n new LocalMediaError(\n 'Get user media timed out',\n 'ERR_GUM_TIMEOUT'\n )\n ),\n timeout\n );\n }),\n ]);\n } catch (err) {\n throw err;\n }\n }\n\n public static async getAudioTrack() {\n const mediaStream = (await LocalMediaUtils.getUserMediaWithTimeout({\n audio: true,\n timeout: 5000,\n })) as MediaStream;\n return mediaStream.getAudioTracks()[0];\n }\n\n public static async getVideoTrack(\n constraints: RealtimeKitMediaStreamConstraints\n ) {\n const mediaStream = (await LocalMediaUtils.getUserMediaWithTimeout({\n ...constraints,\n timeout: 5000,\n })) as MediaStream;\n return mediaStream.getVideoTracks()[0];\n }\n\n public static async getScreenShareTracks() {\n /**\n * getDisplayMedia is not defined on type MediaDevices.\n * Need to update this when a fix\n * is made: https://github.com/microsoft/TypeScript/issues/33232\n */\n const stream: MediaStream =\n (await mediaDevices.getDisplayMedia()) as MediaStream;\n return {\n video: stream.getVideoTracks()[0],\n audio: stream.getAudioTracks()[0],\n };\n }\n\n public static async getAudioAndVideoTrack(\n constraints: RealtimeKitMediaStreamConstraints\n ) {\n try {\n const mediaStream = (await LocalMediaUtils.getUserMediaWithTimeout({\n ...constraints,\n timeout: 5000,\n })) as MediaStream;\n return {\n audioTrack: mediaStream.getAudioTracks()[0],\n videoTrack: mediaStream.getVideoTracks()[0],\n };\n } catch (err) {\n throw err;\n }\n }\n\n public onDeviceChange(\n callback: (\n changedDevices: {\n added: MediaDeviceInfo[];\n removed: MediaDeviceInfo[];\n selectedDevice?: string;\n },\n forceDeviceChange?: boolean\n ) => void\n ) {\n const onChange = async (deviceData) => {\n const checkDeviceId = (_id: string) => {\n if (_id.toLowerCase().includes('speaker')) return 'speaker';\n else return _id;\n };\n\n // Extract selected device from event\n const selectedDevice = deviceData.selectedAudioDevice;\n const hasSelectedDeviceChanged =\n selectedDevice &&\n this.#previouslySelectedDevice !== null &&\n selectedDevice !== this.#previouslySelectedDevice;\n\n // On first event, we need to initialize previouslySelectedDevice and fire callback\n const isFirstDeviceEvent =\n selectedDevice && this.#previouslySelectedDevice === null;\n\n // Update previouslySelectedDevice IMMEDIATELY after detection to avoid race conditions\n // This must happen BEFORE any async operations\n if (selectedDevice) {\n this.#previouslySelectedDevice = selectedDevice;\n }\n\n const previouslyAvailableDevices = this.#availableDevices.filter(\n (device) =>\n device.kind === 'audioinput' || device.kind === 'audiooutput'\n );\n const previouslyAvailableDeviceIds = previouslyAvailableDevices.map(\n (device) => checkDeviceId(device.deviceId)\n );\n\n // Parse available device list from event to detect list changes\n let availableDeviceListFromEvent: string[] = [];\n const len = deviceData.availableAudioDeviceList.length;\n if (typeof deviceData.availableAudioDeviceList === 'string') {\n try {\n availableDeviceListFromEvent = JSON.parse(\n deviceData.availableAudioDeviceList\n );\n } catch (e) {\n // If parsing fails, fall back to empty array\n availableDeviceListFromEvent = [];\n }\n }\n if (len === 0) {\n const currentlyAvailableDevices =\n await LocalMediaUtils.enumerateAudioDevices();\n const currentlyAvailableDeviceIds = currentlyAvailableDevices.map(\n (device) => checkDeviceId(device.deviceId)\n );\n\n const changedDevices = {\n added: currentlyAvailableDevices.filter(\n (device) =>\n !previouslyAvailableDeviceIds.includes(\n checkDeviceId(device.deviceId)\n )\n ),\n removed: previouslyAvailableDevices.filter(\n (device) => !currentlyAvailableDeviceIds.includes(device.deviceId)\n ),\n selectedDevice: selectedDevice,\n };\n\n // Check if available device list changed\n const hasAvailableListChanged =\n availableDeviceListFromEvent.length > 0 &&\n (availableDeviceListFromEvent.length !==\n previouslyAvailableDeviceIds.length ||\n !availableDeviceListFromEvent.every((device) =>\n previouslyAvailableDeviceIds.includes(device)\n ));\n\n this.repopulateAvailableDevices().then(() => {\n const shouldFireCallback =\n changedDevices.added.length ||\n changedDevices.removed.length ||\n hasSelectedDeviceChanged ||\n isFirstDeviceEvent ||\n hasAvailableListChanged;\n\n if (shouldFireCallback) {\n callback(changedDevices, false);\n }\n });\n } else {\n const currentlyAvailableDevices =\n await LocalMediaUtils.enumerateAudioDevices();\n const currentlyAvailableDeviceIds = currentlyAvailableDevices.map(\n (device) => checkDeviceId(device.deviceId)\n );\n const availableAudioDevices =\n await LocalMediaUtils.enumerateAudioDevices();\n\n const changedDevices = {\n added: availableAudioDevices.filter(\n (device) =>\n !previouslyAvailableDeviceIds.includes(\n checkDeviceId(device.deviceId)\n )\n ),\n removed: previouslyAvailableDevices.filter(\n (device) => !currentlyAvailableDeviceIds.includes(device.deviceId)\n ),\n selectedDevice: selectedDevice,\n };\n\n // Check if available device list changed\n const hasAvailableListChanged =\n availableDeviceListFromEvent.length > 0 &&\n (availableDeviceListFromEvent.length !==\n previouslyAvailableDeviceIds.length ||\n !availableDeviceListFromEvent.every((device) =>\n previouslyAvailableDeviceIds.includes(device)\n ));\n\n this.repopulateAvailableDevices().then(() => {\n const shouldFireCallback =\n changedDevices.added.length ||\n changedDevices.removed.length ||\n hasSelectedDeviceChanged ||\n isFirstDeviceEvent ||\n hasAvailableListChanged;\n\n if (shouldFireCallback) {\n callback(changedDevices, false);\n }\n });\n }\n };\n if (this.#nativeEventEmitter.listenerCount('onAudioDeviceChanged') === 0) {\n this.#nativeEventEmitter.addListener('onAudioDeviceChanged', onChange);\n }\n }\n\n public async repopulateAvailableDevices() {\n const videoDevices = await LocalMediaUtils.enumerateVideoDevices();\n const audioDevices = await LocalMediaUtils.enumerateAudioDevices();\n this.#availableDevices = videoDevices.concat(audioDevices);\n }\n\n public async chooseAudioRoute(route: String) {\n return await NativeAudioManager.chooseAudioRoute(route);\n }\n\n public get availableDevices() {\n return this.#availableDevices;\n }\n\n public getAvailableDevicesByKind(kind: string) {\n return this.#availableDevices.filter((device) => device.kind === kind);\n }\n\n public getDeviceById(\n deviceId: string,\n kind: 'audioinput' | 'audiooutput' | 'videoinput'\n ) {\n const normalizedDeviceId = deviceId.toLowerCase();\n\n return this.#availableDevices.find((device) => {\n if (device.kind !== kind) return false;\n\n const deviceIdLower = device.deviceId.toLowerCase();\n\n // Exact match first\n if (device.deviceId === deviceId) return true;\n\n // iOS special cases\n if (\n normalizedDeviceId === 'speaker' &&\n deviceIdLower.includes('speaker')\n ) {\n return true;\n }\n if (\n normalizedDeviceId === 'bluetooth' &&\n deviceIdLower.includes('bluetooth')\n ) {\n return true;\n }\n if (\n normalizedDeviceId === 'earpiece' &&\n deviceIdLower.includes('earpiece')\n ) {\n return true;\n }\n\n return false;\n });\n }\n\n /**\n * Returns all audio input devices (microphone devices).\n */\n public getAudioDevices() {\n return this.getAvailableDevicesByKind('audioinput');\n }\n\n /**\n * Returns all video input devices.\n */\n public getVideoDevices() {\n return this.getAvailableDevicesByKind('videoinput');\n }\n\n /**\n * Returns all audio output devices (speaker devices).\n */\n public getSpeakerDevices() {\n const speakerDevices = this.#availableDevices;\n // In Mobile, speaker devices are the same as audio input devices\n return speakerDevices\n .filter((device) => device.kind === 'audioinput')\n .map((device) => ({\n ...device,\n deviceId: device.deviceId,\n label: device.label,\n kind: 'audiooutput',\n }));\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_reactNativeWebrtc","_LocalMediaError","_interopRequireDefault","_NativeAudioManager","e","__esModule","default","_classPrivateFieldInitSpec","t","a","_checkPrivateRedeclaration","set","has","TypeError","_classPrivateFieldGet","s","get","_assertClassBrand","_classPrivateFieldSet","r","n","arguments","length","LogBox","ignoreLogs","VIDEO_CONSTRAINTS","exports","qvga","width","ideal","height","vga","hd","hd_cropped","_availableDevices","WeakMap","_nativeEventEmitter","_previouslySelectedDevice","LocalMediaUtils","constructor","availableDevices","NativeEventEmitter","NativeModules","InCallManager","init","availableVideoDevices","enumerateVideoDevices","availableAudioDevices","enumerateAudioDevices","concat","destruct","removeAllListeners","isDeviceListAvailable","deviceMem","videoDevices","mediaDevices","enumerateDevices","filter","d","kind","facing","error","audioDevices","earpiece","connected","haveMic","speaker","bluetooth","wired","isWiredHeadphonesConnected","NativeAudioManager","getIsWiredHeadsetPluggedIn","isBluetoothHeadsetConnected","resp","Object","keys","map","audioDevice","audioDeviceProps","deviceId","label","getVideoConstraints","options","constraints","videoDeviceId","videoTrackConstraints","facingMode","frameRate","max","video","getUserMediaWithTimeout","timeout","getUserMedia","Promise","race","_resolve","reject","setTimeout","LocalMediaError","err","getAudioTrack","mediaStream","audio","getAudioTracks","getVideoTrack","getVideoTracks","getScreenShareTracks","stream","getDisplayMedia","getAudioAndVideoTrack","audioTrack","videoTrack","onDeviceChange","callback","onChange","deviceData","checkDeviceId","_id","toLowerCase","includes","selectedDevice","selectedAudioDevice","hasSelectedDeviceChanged","isFirstDeviceEvent","previouslyAvailableDevices","device","previouslyAvailableDeviceIds","availableDeviceListFromEvent","len","availableAudioDeviceList","JSON","parse","currentlyAvailableDevices","currentlyAvailableDeviceIds","changedDevices","added","removed","hasAvailableListChanged","every","repopulateAvailableDevices","then","shouldFireCallback","listenerCount","addListener","chooseAudioRoute","route","getAvailableDevicesByKind","getDeviceById","normalizedDeviceId","find","deviceIdLower","getAudioDevices","getVideoDevices","getSpeakerDevices","speakerDevices"],"sources":["LocalMediaUtils.ts"],"sourcesContent":["import { NativeEventEmitter, NativeModules, LogBox } from 'react-native';\nimport { mediaDevices, MediaStream } from '@cloudflare/react-native-webrtc';\nimport LocalMediaError from './LocalMediaError';\nimport {\n ConstrainDouble,\n RealtimeKitMediaStreamConstraints,\n RealtimeKitMediaTrackConstraints,\n MediaDeviceInfo,\n} from './LocalMediaInterfaces';\nimport NativeAudioManager from './NativeAudioManager';\nLogBox.ignoreLogs(['new NativeEventEmitter']);\nexport interface LocalAudioOptions {\n // Disables all audio processing\n disableAP?: boolean;\n\n // Disables Acoustic Echo Cancellation\n disableAEC?: boolean;\n\n // Disables Noise Suppression\n disableNS?: boolean;\n\n // Disables Automatic Gain Control\n disableAGC?: boolean;\n\n // Disables Highpass Filter\n disableHPF?: boolean;\n}\n\nexport const VIDEO_CONSTRAINTS = {\n qvga: { width: { ideal: 320 }, height: { ideal: 240 } },\n vga: { width: { ideal: 640 }, height: { ideal: 480 } },\n hd: { width: { ideal: 1280 }, height: { ideal: 720 } },\n hd_cropped: { width: { ideal: 900 }, height: { ideal: 720 } },\n};\n\n/**\n * To initialize an instance of this class, use the\n * `.init()` static method.\n */\nexport default class LocalMediaUtils {\n #availableDevices: MediaDeviceInfo[];\n\n #nativeEventEmitter: NativeEventEmitter;\n\n #previouslySelectedDevice: string | null = null;\n\n private constructor(availableDevices: MediaDeviceInfo[]) {\n this.#availableDevices = availableDevices;\n this.#nativeEventEmitter = new NativeEventEmitter(\n NativeModules.InCallManager\n );\n }\n\n public static async init() {\n const availableVideoDevices = await LocalMediaUtils.enumerateVideoDevices();\n const availableAudioDevices = await LocalMediaUtils.enumerateAudioDevices();\n return new LocalMediaUtils(\n availableAudioDevices.concat(availableVideoDevices)\n );\n }\n\n public async destruct() {\n this.#nativeEventEmitter.removeAllListeners('onAudioDeviceChanged');\n }\n\n public static isDeviceListAvailable() {\n return true;\n }\n\n private static async enumerateVideoDevices(): Promise<MediaDeviceInfo[]> {\n try {\n const deviceMem = {};\n const videoDevices =\n (await mediaDevices.enumerateDevices()) as MediaDeviceInfo[];\n return videoDevices.filter((d) => {\n if (d.kind === 'videoinput' && !deviceMem[d.facing]) {\n deviceMem[d.facing] = true;\n return d;\n }\n return false;\n });\n } catch (error) {\n return [];\n }\n }\n\n private static async enumerateAudioDevices(): Promise<MediaDeviceInfo[]> {\n let audioDevices = {\n earpiece: {\n connected: true,\n haveMic: true,\n },\n speaker: {\n connected: true,\n haveMic: true,\n },\n bluetooth: {\n connected: false,\n haveMic: false,\n },\n wired: {\n connected: false,\n haveMic: false,\n },\n };\n const isWiredHeadphonesConnected =\n await NativeAudioManager.getIsWiredHeadsetPluggedIn();\n audioDevices.wired = isWiredHeadphonesConnected\n ? {\n connected: true,\n haveMic: true,\n }\n : {\n connected: false,\n haveMic: false,\n };\n const isBluetoothHeadsetConnected =\n await NativeAudioManager.isBluetoothHeadsetConnected();\n audioDevices.bluetooth = isBluetoothHeadsetConnected\n ? {\n connected: true,\n haveMic: true,\n }\n : {\n connected: false,\n haveMic: false,\n };\n const resp = Object.keys(audioDevices)\n .map((audioDevice) => {\n const audioDeviceProps = audioDevices[audioDevice];\n return {\n ...audioDeviceProps,\n deviceId: audioDevice,\n label: audioDevice,\n kind: 'audioinput',\n };\n })\n .filter((audioDevice) => audioDevice.connected);\n return resp as MediaDeviceInfo[];\n }\n\n public static getVideoConstraints(options?: {\n videoDeviceId?: string;\n videoTrackConstraints?: boolean | RealtimeKitMediaTrackConstraints;\n facingMode?: string;\n frameRate?: ConstrainDouble;\n }) {\n const constraints: RealtimeKitMediaStreamConstraints = {};\n const {\n videoDeviceId,\n videoTrackConstraints,\n facingMode = 'user',\n frameRate = { ideal: 24, max: 30 },\n } = options;\n\n constraints.video = videoTrackConstraints || VIDEO_CONSTRAINTS.vga;\n if (typeof constraints.video === 'boolean') {\n return constraints;\n }\n\n constraints.video.deviceId = videoDeviceId;\n constraints.video.facingMode = facingMode;\n constraints.video.frameRate = frameRate;\n return constraints;\n }\n\n private static async getUserMediaWithTimeout(\n constraints: RealtimeKitMediaStreamConstraints = {},\n timeout: number = 0\n ) {\n try {\n if (!timeout) {\n return await mediaDevices.getUserMedia(constraints);\n }\n\n // NOTE(roerohan): The await is required to catch errors (if any).\n return Promise.race<Promise<unknown>>([\n mediaDevices.getUserMedia(constraints),\n\n new Promise<MediaStream>((_resolve, reject) => {\n setTimeout(\n () =>\n reject(\n new LocalMediaError(\n 'Get user media timed out',\n 'ERR_GUM_TIMEOUT'\n )\n ),\n timeout\n );\n }),\n ]);\n } catch (err) {\n throw err;\n }\n }\n\n public static async getAudioTrack() {\n const mediaStream = (await LocalMediaUtils.getUserMediaWithTimeout({\n audio: true,\n timeout: 5000,\n })) as MediaStream;\n return mediaStream.getAudioTracks()[0];\n }\n\n public static async getVideoTrack(\n constraints: RealtimeKitMediaStreamConstraints\n ) {\n const mediaStream = (await LocalMediaUtils.getUserMediaWithTimeout({\n ...constraints,\n timeout: 5000,\n })) as MediaStream;\n return mediaStream.getVideoTracks()[0];\n }\n\n public static async getScreenShareTracks() {\n /**\n * getDisplayMedia is not defined on type MediaDevices.\n * Need to update this when a fix\n * is made: https://github.com/microsoft/TypeScript/issues/33232\n */\n const stream: MediaStream =\n (await mediaDevices.getDisplayMedia()) as MediaStream;\n return {\n video: stream.getVideoTracks()[0],\n audio: stream.getAudioTracks()[0],\n };\n }\n\n public static async getAudioAndVideoTrack(\n constraints: RealtimeKitMediaStreamConstraints\n ) {\n try {\n const mediaStream = (await LocalMediaUtils.getUserMediaWithTimeout({\n ...constraints,\n timeout: 5000,\n })) as MediaStream;\n return {\n audioTrack: mediaStream.getAudioTracks()[0],\n videoTrack: mediaStream.getVideoTracks()[0],\n };\n } catch (err) {\n throw err;\n }\n }\n\n public onDeviceChange(\n callback: (\n changedDevices: {\n added: MediaDeviceInfo[];\n removed: MediaDeviceInfo[];\n selectedDevice?: string;\n },\n forceDeviceChange?: boolean\n ) => void\n ) {\n const onChange = async (deviceData) => {\n const checkDeviceId = (_id: string) => {\n if (_id.toLowerCase().includes('speaker')) return 'speaker';\n else return _id;\n };\n\n // Extract selected device from event\n const selectedDevice = deviceData.selectedAudioDevice;\n const hasSelectedDeviceChanged =\n selectedDevice &&\n this.#previouslySelectedDevice !== null &&\n selectedDevice !== this.#previouslySelectedDevice;\n\n // On first event, we need to initialize previouslySelectedDevice and fire callback\n const isFirstDeviceEvent =\n selectedDevice && this.#previouslySelectedDevice === null;\n\n // Update previouslySelectedDevice IMMEDIATELY after detection to avoid race conditions\n // This must happen BEFORE any async operations\n if (selectedDevice) {\n this.#previouslySelectedDevice = selectedDevice;\n }\n\n const previouslyAvailableDevices = this.#availableDevices.filter(\n (device) =>\n device.kind === 'audioinput' || device.kind === 'audiooutput'\n );\n const previouslyAvailableDeviceIds = previouslyAvailableDevices.map(\n (device) => checkDeviceId(device.deviceId)\n );\n\n // Parse available device list from event to detect list changes\n let availableDeviceListFromEvent: string[] = [];\n const len = deviceData.availableAudioDeviceList.length;\n if (typeof deviceData.availableAudioDeviceList === 'string') {\n try {\n availableDeviceListFromEvent = JSON.parse(\n deviceData.availableAudioDeviceList\n );\n } catch (e) {\n // If parsing fails, fall back to empty array\n availableDeviceListFromEvent = [];\n }\n }\n if (len === 0) {\n const currentlyAvailableDevices =\n await LocalMediaUtils.enumerateAudioDevices();\n const currentlyAvailableDeviceIds = currentlyAvailableDevices.map(\n (device) => checkDeviceId(device.deviceId)\n );\n\n const changedDevices = {\n added: currentlyAvailableDevices.filter(\n (device) =>\n !previouslyAvailableDeviceIds.includes(\n checkDeviceId(device.deviceId)\n )\n ),\n removed: previouslyAvailableDevices.filter(\n (device) => !currentlyAvailableDeviceIds.includes(device.deviceId)\n ),\n selectedDevice: selectedDevice,\n };\n\n // Check if available device list changed\n const hasAvailableListChanged =\n availableDeviceListFromEvent.length > 0 &&\n (availableDeviceListFromEvent.length !==\n previouslyAvailableDeviceIds.length ||\n !availableDeviceListFromEvent.every((device) =>\n previouslyAvailableDeviceIds.includes(device)\n ));\n\n this.repopulateAvailableDevices().then(() => {\n const shouldFireCallback =\n changedDevices.added.length ||\n changedDevices.removed.length ||\n hasSelectedDeviceChanged ||\n isFirstDeviceEvent ||\n hasAvailableListChanged;\n\n if (shouldFireCallback) {\n callback(changedDevices, false);\n }\n });\n } else {\n const currentlyAvailableDevices =\n await LocalMediaUtils.enumerateAudioDevices();\n const currentlyAvailableDeviceIds = currentlyAvailableDevices.map(\n (device) => checkDeviceId(device.deviceId)\n );\n const availableAudioDevices =\n await LocalMediaUtils.enumerateAudioDevices();\n\n const changedDevices = {\n added: availableAudioDevices.filter(\n (device) =>\n !previouslyAvailableDeviceIds.includes(\n checkDeviceId(device.deviceId)\n )\n ),\n removed: previouslyAvailableDevices.filter(\n (device) => !currentlyAvailableDeviceIds.includes(device.deviceId)\n ),\n selectedDevice: selectedDevice,\n };\n\n // Check if available device list changed\n const hasAvailableListChanged =\n availableDeviceListFromEvent.length > 0 &&\n (availableDeviceListFromEvent.length !==\n previouslyAvailableDeviceIds.length ||\n !availableDeviceListFromEvent.every((device) =>\n previouslyAvailableDeviceIds.includes(device)\n ));\n\n this.repopulateAvailableDevices().then(() => {\n const shouldFireCallback =\n changedDevices.added.length ||\n changedDevices.removed.length ||\n hasSelectedDeviceChanged ||\n isFirstDeviceEvent ||\n hasAvailableListChanged;\n\n if (shouldFireCallback) {\n callback(changedDevices, false);\n }\n });\n }\n };\n if (this.#nativeEventEmitter.listenerCount('onAudioDeviceChanged') === 0) {\n this.#nativeEventEmitter.addListener('onAudioDeviceChanged', onChange);\n }\n }\n\n public async repopulateAvailableDevices() {\n const videoDevices = await LocalMediaUtils.enumerateVideoDevices();\n const audioDevices = await LocalMediaUtils.enumerateAudioDevices();\n this.#availableDevices = videoDevices.concat(audioDevices);\n }\n\n public async chooseAudioRoute(route: String) {\n return await NativeAudioManager.chooseAudioRoute(route);\n }\n\n public get availableDevices() {\n return this.#availableDevices;\n }\n\n public getAvailableDevicesByKind(kind: string) {\n return this.#availableDevices.filter((device) => device.kind === kind);\n }\n\n public getDeviceById(\n deviceId: string,\n kind: 'audioinput' | 'audiooutput' | 'videoinput'\n ) {\n const normalizedDeviceId = deviceId.toLowerCase();\n\n return this.#availableDevices.find((device) => {\n if (device.kind !== kind) return false;\n\n const deviceIdLower = device.deviceId.toLowerCase();\n\n // Exact match first\n if (device.deviceId === deviceId) return true;\n\n // iOS special cases\n if (\n normalizedDeviceId === 'speaker' &&\n deviceIdLower.includes('speaker')\n ) {\n return true;\n }\n if (\n normalizedDeviceId === 'bluetooth' &&\n deviceIdLower.includes('bluetooth')\n ) {\n return true;\n }\n if (\n normalizedDeviceId === 'earpiece' &&\n deviceIdLower.includes('earpiece')\n ) {\n return true;\n }\n\n return false;\n });\n }\n\n /**\n * Returns all audio input devices (microphone devices).\n */\n public async getAudioDevices() {\n await this.repopulateAvailableDevices();\n return this.getAvailableDevicesByKind('audioinput');\n }\n\n /**\n * Returns all video input devices.\n */\n public async getVideoDevices() {\n await this.repopulateAvailableDevices();\n return this.getAvailableDevicesByKind('videoinput');\n }\n\n /**\n * Returns all audio output devices (speaker devices).\n */\n public async getSpeakerDevices() {\n await this.repopulateAvailableDevices();\n const speakerDevices = this.#availableDevices;\n // In Mobile, speaker devices are the same as audio input devices\n return speakerDevices\n .filter((device) => device.kind === 'audioinput')\n .map((device) => ({\n ...device,\n deviceId: device.deviceId,\n label: device.label,\n kind: 'audiooutput',\n }));\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -8,7 +8,7 @@ var _reactNative = require("react-native");
8
8
  // @ts-nocheck
9
9
 
10
10
  const _InCallManager = _reactNative.NativeModules.InCallManager;
11
- class InCallManager {
11
+ class NativeAudioManager {
12
12
  constructor() {
13
13
  this.vibrate = false;
14
14
  }
@@ -18,10 +18,8 @@ class InCallManager {
18
18
  _InCallManager.start();
19
19
  if (media === 'audio') _InCallManager.setVoiceCallMode();
20
20
  }
21
- stop(setup) {
22
- setup = setup === undefined ? {} : setup;
23
- const busytone = setup.busytone ? typeof setup.busytone === 'string' ? setup.busytone : '' : '';
24
- _InCallManager.stop(busytone);
21
+ stop() {
22
+ _reactNative.Platform.OS === 'android' ? _InCallManager.stop() : _InCallManager.stop({});
25
23
  }
26
24
  async getIsWiredHeadsetPluggedIn() {
27
25
  try {
@@ -71,6 +69,27 @@ class InCallManager {
71
69
  _InCallManager.forceUpdateAudioDevices();
72
70
  }
73
71
  }
72
+ async getCurrentAudioDevice() {
73
+ try {
74
+ const result = await _InCallManager.getCurrentAudioDevice();
75
+ if (_reactNative.Platform.OS === 'android' && result && result.currentDevice) {
76
+ // Map Android device names to lowercase format
77
+ const deviceMap = {
78
+ SPEAKER_PHONE: 'speaker',
79
+ BLUETOOTH: 'bluetooth',
80
+ WIRED_HEADSET: 'wired',
81
+ EARPIECE: 'earpiece',
82
+ NONE: null
83
+ };
84
+ return deviceMap[result.currentDevice] || null;
85
+ }
86
+
87
+ // iOS returns string directly
88
+ return result || null;
89
+ } catch (_err) {
90
+ return null;
91
+ }
92
+ }
74
93
  }
75
- var _default = exports.default = new InCallManager();
94
+ var _default = exports.default = new NativeAudioManager();
76
95
  //# sourceMappingURL=NativeAudioManager.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_InCallManager","NativeModules","InCallManager","constructor","vibrate","start","setup","undefined","media","setVoiceCallMode","stop","busytone","getIsWiredHeadsetPluggedIn","e","isBluetoothHeadsetConnected","setKeepScreenOn","enable","setSpeakerphoneOn","setForceSpeakerphoneOn","_flag","flag","setMicrophoneMute","chooseAudioRoute","route","requestAudioFocus","Platform","OS","requestAudioFocusJS","abandonAudioFocus","abandonAudioFocusJS","forceUpdateAudioDevices","_default","exports","default"],"sources":["NativeAudioManager.ts"],"sourcesContent":["// @ts-nocheck\nimport { Platform, NativeModules } from 'react-native';\n\nconst _InCallManager = NativeModules.InCallManager;\n\nclass InCallManager {\n constructor() {\n this.vibrate = false;\n }\n\n start(setup) {\n setup = setup === undefined ? {} : setup;\n const media = setup.media === 'video' ? 'video' : 'audio';\n _InCallManager.start();\n if (media === 'audio') _InCallManager.setVoiceCallMode();\n }\n\n stop(setup) {\n setup = setup === undefined ? {} : setup;\n const busytone = setup.busytone\n ? typeof setup.busytone === 'string'\n ? setup.busytone\n : ''\n : '';\n _InCallManager.stop(busytone);\n }\n\n async getIsWiredHeadsetPluggedIn() {\n try {\n return await _InCallManager.getIsWiredHeadsetPluggedIn();\n } catch (e) {\n return {};\n }\n }\n\n async isBluetoothHeadsetConnected() {\n try {\n return await _InCallManager.isBluetoothHeadsetConnected();\n } catch (e) {\n return {};\n }\n }\n\n setKeepScreenOn(enable) {\n enable = enable === true;\n _InCallManager.setKeepScreenOn(enable);\n }\n\n setSpeakerphoneOn(enable) {\n enable = enable === true;\n _InCallManager.setSpeakerphoneOn(enable);\n }\n\n setForceSpeakerphoneOn(_flag) {\n const flag = typeof _flag === 'boolean' ? (_flag ? 1 : -1) : 0;\n _InCallManager.setForceSpeakerphoneOn(flag);\n }\n\n setMicrophoneMute(enable) {\n enable = enable === true;\n _InCallManager.setMicrophoneMute(enable);\n }\n\n async chooseAudioRoute(route: String) {\n return await _InCallManager.chooseAudioRoute(route);\n }\n\n async requestAudioFocus() {\n if (Platform.OS === 'android') {\n return await _InCallManager.requestAudioFocusJS();\n }\n }\n\n async abandonAudioFocus() {\n if (Platform.OS === 'android') {\n return await _InCallManager.abandonAudioFocusJS();\n }\n }\n\n forceUpdateAudioDevices() {\n if (Platform.OS === 'ios') {\n _InCallManager.forceUpdateAudioDevices();\n }\n }\n}\n\nexport default new InCallManager();\n"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AADA;;AAGA,MAAMC,cAAc,GAAGC,0BAAa,CAACC,aAAa;AAElD,MAAMA,aAAa,CAAC;EAClBC,WAAWA,CAAA,EAAG;IACZ,IAAI,CAACC,OAAO,GAAG,KAAK;EACtB;EAEAC,KAAKA,CAACC,KAAK,EAAE;IACXA,KAAK,GAAGA,KAAK,KAAKC,SAAS,GAAG,CAAC,CAAC,GAAGD,KAAK;IACxC,MAAME,KAAK,GAAGF,KAAK,CAACE,KAAK,KAAK,OAAO,GAAG,OAAO,GAAG,OAAO;IACzDR,cAAc,CAACK,KAAK,CAAC,CAAC;IACtB,IAAIG,KAAK,KAAK,OAAO,EAAER,cAAc,CAACS,gBAAgB,CAAC,CAAC;EAC1D;EAEAC,IAAIA,CAACJ,KAAK,EAAE;IACVA,KAAK,GAAGA,KAAK,KAAKC,SAAS,GAAG,CAAC,CAAC,GAAGD,KAAK;IACxC,MAAMK,QAAQ,GAAGL,KAAK,CAACK,QAAQ,GAC3B,OAAOL,KAAK,CAACK,QAAQ,KAAK,QAAQ,GAChCL,KAAK,CAACK,QAAQ,GACd,EAAE,GACJ,EAAE;IACNX,cAAc,CAACU,IAAI,CAACC,QAAQ,CAAC;EAC/B;EAEA,MAAMC,0BAA0BA,CAAA,EAAG;IACjC,IAAI;MACF,OAAO,MAAMZ,cAAc,CAACY,0BAA0B,CAAC,CAAC;IAC1D,CAAC,CAAC,OAAOC,CAAC,EAAE;MACV,OAAO,CAAC,CAAC;IACX;EACF;EAEA,MAAMC,2BAA2BA,CAAA,EAAG;IAClC,IAAI;MACF,OAAO,MAAMd,cAAc,CAACc,2BAA2B,CAAC,CAAC;IAC3D,CAAC,CAAC,OAAOD,CAAC,EAAE;MACV,OAAO,CAAC,CAAC;IACX;EACF;EAEAE,eAAeA,CAACC,MAAM,EAAE;IACtBA,MAAM,GAAGA,MAAM,KAAK,IAAI;IACxBhB,cAAc,CAACe,eAAe,CAACC,MAAM,CAAC;EACxC;EAEAC,iBAAiBA,CAACD,MAAM,EAAE;IACxBA,MAAM,GAAGA,MAAM,KAAK,IAAI;IACxBhB,cAAc,CAACiB,iBAAiB,CAACD,MAAM,CAAC;EAC1C;EAEAE,sBAAsBA,CAACC,KAAK,EAAE;IAC5B,MAAMC,IAAI,GAAG,OAAOD,KAAK,KAAK,SAAS,GAAIA,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,GAAI,CAAC;IAC9DnB,cAAc,CAACkB,sBAAsB,CAACE,IAAI,CAAC;EAC7C;EAEAC,iBAAiBA,CAACL,MAAM,EAAE;IACxBA,MAAM,GAAGA,MAAM,KAAK,IAAI;IACxBhB,cAAc,CAACqB,iBAAiB,CAACL,MAAM,CAAC;EAC1C;EAEA,MAAMM,gBAAgBA,CAACC,KAAa,EAAE;IACpC,OAAO,MAAMvB,cAAc,CAACsB,gBAAgB,CAACC,KAAK,CAAC;EACrD;EAEA,MAAMC,iBAAiBA,CAAA,EAAG;IACxB,IAAIC,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,MAAM1B,cAAc,CAAC2B,mBAAmB,CAAC,CAAC;IACnD;EACF;EAEA,MAAMC,iBAAiBA,CAAA,EAAG;IACxB,IAAIH,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;MAC7B,OAAO,MAAM1B,cAAc,CAAC6B,mBAAmB,CAAC,CAAC;IACnD;EACF;EAEAC,uBAAuBA,CAAA,EAAG;IACxB,IAAIL,qBAAQ,CAACC,EAAE,KAAK,KAAK,EAAE;MACzB1B,cAAc,CAAC8B,uBAAuB,CAAC,CAAC;IAC1C;EACF;AACF;AAAC,IAAAC,QAAA,GAAAC,OAAA,CAAAC,OAAA,GAEc,IAAI/B,aAAa,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_InCallManager","NativeModules","InCallManager","NativeAudioManager","constructor","vibrate","start","setup","undefined","media","setVoiceCallMode","stop","Platform","OS","getIsWiredHeadsetPluggedIn","e","isBluetoothHeadsetConnected","setKeepScreenOn","enable","setSpeakerphoneOn","setForceSpeakerphoneOn","_flag","flag","setMicrophoneMute","chooseAudioRoute","route","requestAudioFocus","requestAudioFocusJS","abandonAudioFocus","abandonAudioFocusJS","forceUpdateAudioDevices","getCurrentAudioDevice","result","currentDevice","deviceMap","SPEAKER_PHONE","BLUETOOTH","WIRED_HEADSET","EARPIECE","NONE","_err","_default","exports","default"],"sources":["NativeAudioManager.ts"],"sourcesContent":["// @ts-nocheck\nimport { Platform, NativeModules } from 'react-native';\n\nconst _InCallManager = NativeModules.InCallManager;\n\nclass NativeAudioManager {\n constructor() {\n this.vibrate = false;\n }\n\n start(setup) {\n setup = setup === undefined ? {} : setup;\n const media = setup.media === 'video' ? 'video' : 'audio';\n _InCallManager.start();\n if (media === 'audio') _InCallManager.setVoiceCallMode();\n }\n\n stop() {\n Platform.OS === 'android' ? _InCallManager.stop() : _InCallManager.stop({});\n }\n\n async getIsWiredHeadsetPluggedIn() {\n try {\n return await _InCallManager.getIsWiredHeadsetPluggedIn();\n } catch (e) {\n return {};\n }\n }\n\n async isBluetoothHeadsetConnected() {\n try {\n return await _InCallManager.isBluetoothHeadsetConnected();\n } catch (e) {\n return {};\n }\n }\n\n setKeepScreenOn(enable) {\n enable = enable === true;\n _InCallManager.setKeepScreenOn(enable);\n }\n\n setSpeakerphoneOn(enable) {\n enable = enable === true;\n _InCallManager.setSpeakerphoneOn(enable);\n }\n\n setForceSpeakerphoneOn(_flag) {\n const flag = typeof _flag === 'boolean' ? (_flag ? 1 : -1) : 0;\n _InCallManager.setForceSpeakerphoneOn(flag);\n }\n\n setMicrophoneMute(enable) {\n enable = enable === true;\n _InCallManager.setMicrophoneMute(enable);\n }\n\n async chooseAudioRoute(route: String) {\n return await _InCallManager.chooseAudioRoute(route);\n }\n\n async requestAudioFocus() {\n if (Platform.OS === 'android') {\n return await _InCallManager.requestAudioFocusJS();\n }\n }\n\n async abandonAudioFocus() {\n if (Platform.OS === 'android') {\n return await _InCallManager.abandonAudioFocusJS();\n }\n }\n\n forceUpdateAudioDevices() {\n if (Platform.OS === 'ios') {\n _InCallManager.forceUpdateAudioDevices();\n }\n }\n\n async getCurrentAudioDevice() {\n try {\n const result = await _InCallManager.getCurrentAudioDevice();\n\n if (Platform.OS === 'android' && result && result.currentDevice) {\n // Map Android device names to lowercase format\n const deviceMap = {\n SPEAKER_PHONE: 'speaker',\n BLUETOOTH: 'bluetooth',\n WIRED_HEADSET: 'wired',\n EARPIECE: 'earpiece',\n NONE: null,\n };\n return deviceMap[result.currentDevice] || null;\n }\n\n // iOS returns string directly\n return result || null;\n } catch (_err) {\n return null;\n }\n }\n}\n\nexport default new NativeAudioManager();\n"],"mappings":"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","ignoreList":[]}
@@ -4,5 +4,5 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.SDK_VERSION = void 0;
7
- const SDK_VERSION = exports.SDK_VERSION = '0.3.1-staging.1';
7
+ const SDK_VERSION = exports.SDK_VERSION = '0.3.1';
8
8
  //# sourceMappingURL=version.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["SDK_VERSION","exports"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '0.3.1-staging.1';\n"],"mappings":";;;;;;AAAO,MAAMA,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,iBAAiB","ignoreList":[]}
1
+ {"version":3,"names":["SDK_VERSION","exports"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '0.3.1';\n"],"mappings":";;;;;;AAAO,MAAMA,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,OAAO","ignoreList":[]}
@@ -98,5 +98,7 @@ class BackgroundTimer {
98
98
  }
99
99
  }
100
100
  }
101
+
102
+ // TODO: Remove singleton pattern
101
103
  export default new BackgroundTimer();
102
104
  //# sourceMappingURL=BackgroundHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["DeviceEventEmitter","NativeAppEventEmitter","NativeEventEmitter","NativeModules","Platform","RTKRNBackgroundTimer","Emitter","BackgroundTimer","constructor","_defineProperty","uniqueId","callbacks","addListener","id","callbackById","callback","interval","OS","backgroundTimerSetTimeout","timeout","setTimeout","init","start","delay","backgroundTimerStart","stop","backgroundTimerStop","runBackgroundTimer","EventEmitter","select","ios","android","backgroundListener","remove","backgroundClockMethod","backgroundTimer","stopBackgroundTimer","clearTimeout","timeoutId","setInterval","intervalId","clearInterval"],"sources":["BackgroundHandler.ts"],"sourcesContent":["import {\n DeviceEventEmitter,\n NativeAppEventEmitter,\n NativeEventEmitter,\n NativeModules,\n Platform,\n} from 'react-native';\n\nconst { RTKRNBackgroundTimer } = NativeModules;\nconst Emitter = new NativeEventEmitter(RTKRNBackgroundTimer);\n\nclass BackgroundTimer {\n uniqueId: number;\n\n callbacks: { [key: string]: any };\n\n backgroundTimer: number | NodeJS.Timeout | null;\n\n backgroundListener: any;\n\n constructor() {\n this.uniqueId = 0;\n this.callbacks = {};\n\n Emitter.addListener('backgroundTimer.timeout', (id) => {\n if (this.callbacks[id]) {\n const callbackById = this.callbacks[id];\n const { callback } = callbackById;\n if (!this.callbacks[id].interval) {\n delete this.callbacks[id];\n } else {\n Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(\n id,\n this.callbacks[id].timeout\n )\n : RTKRNBackgroundTimer.setTimeout(id, this.callbacks[id].timeout);\n }\n callback();\n }\n });\n }\n\n init() {\n return new BackgroundTimer();\n }\n\n // Original API\n start(delay = 0) {\n return Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerStart(delay)\n : RTKRNBackgroundTimer.start(delay);\n }\n\n stop() {\n return Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerStop()\n : RTKRNBackgroundTimer.stop();\n }\n\n runBackgroundTimer(callback, delay) {\n const EventEmitter = Platform.select({\n ios: () => NativeAppEventEmitter,\n android: () => DeviceEventEmitter,\n })();\n this.start(0);\n this.backgroundListener = EventEmitter.addListener(\n 'backgroundTimer',\n () => {\n this.backgroundListener.remove();\n this.backgroundClockMethod(callback, delay);\n }\n );\n }\n\n backgroundClockMethod(callback, delay) {\n this.backgroundTimer = this.setTimeout(() => {\n callback();\n this.backgroundClockMethod(callback, delay);\n }, delay);\n }\n\n stopBackgroundTimer() {\n this.stop();\n this.clearTimeout(this.backgroundTimer);\n }\n\n // New API, allowing for multiple timers\n setTimeout(callback, timeout) {\n this.uniqueId += 1;\n const timeoutId = this.uniqueId;\n this.callbacks[timeoutId] = {\n callback,\n interval: false,\n timeout,\n };\n Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(timeoutId, timeout)\n : RTKRNBackgroundTimer.setTimeout(timeoutId, timeout);\n return timeoutId;\n }\n\n clearTimeout(timeoutId) {\n if (this.callbacks[timeoutId]) {\n delete this.callbacks[timeoutId];\n // RTKRNBackgroundTimer.clearTimeout(timeoutId);\n }\n }\n\n setInterval(callback, timeout) {\n this.uniqueId += 1;\n const intervalId = this.uniqueId;\n this.callbacks[intervalId] = {\n callback,\n interval: true,\n timeout,\n };\n Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(intervalId, timeout)\n : RTKRNBackgroundTimer.setTimeout(intervalId, timeout);\n return intervalId;\n }\n\n clearInterval(intervalId) {\n if (this.callbacks[intervalId]) {\n delete this.callbacks[intervalId];\n // RTKRNBackgroundTimer.clearTimeout(intervalId);\n }\n }\n}\n\nexport default new BackgroundTimer();\n"],"mappings":";;;AAAA,SACEA,kBAAkB,EAClBC,qBAAqB,EACrBC,kBAAkB,EAClBC,aAAa,EACbC,QAAQ,QACH,cAAc;AAErB,MAAM;EAAEC;AAAqB,CAAC,GAAGF,aAAa;AAC9C,MAAMG,OAAO,GAAG,IAAIJ,kBAAkB,CAACG,oBAAoB,CAAC;AAE5D,MAAME,eAAe,CAAC;EASpBC,WAAWA,CAAA,EAAG;IAAAC,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IACZ,IAAI,CAACC,QAAQ,GAAG,CAAC;IACjB,IAAI,CAACC,SAAS,GAAG,CAAC,CAAC;IAEnBL,OAAO,CAACM,WAAW,CAAC,yBAAyB,EAAGC,EAAE,IAAK;MACrD,IAAI,IAAI,CAACF,SAAS,CAACE,EAAE,CAAC,EAAE;QACtB,MAAMC,YAAY,GAAG,IAAI,CAACH,SAAS,CAACE,EAAE,CAAC;QACvC,MAAM;UAAEE;QAAS,CAAC,GAAGD,YAAY;QACjC,IAAI,CAAC,IAAI,CAACH,SAAS,CAACE,EAAE,CAAC,CAACG,QAAQ,EAAE;UAChC,OAAO,IAAI,CAACL,SAAS,CAACE,EAAE,CAAC;QAC3B,CAAC,MAAM;UACLT,QAAQ,CAACa,EAAE,KAAK,SAAS,GACrBZ,oBAAoB,CAACa,yBAAyB,CAC5CL,EAAE,EACF,IAAI,CAACF,SAAS,CAACE,EAAE,CAAC,CAACM,OACrB,CAAC,GACDd,oBAAoB,CAACe,UAAU,CAACP,EAAE,EAAE,IAAI,CAACF,SAAS,CAACE,EAAE,CAAC,CAACM,OAAO,CAAC;QACrE;QACAJ,QAAQ,CAAC,CAAC;MACZ;IACF,CAAC,CAAC;EACJ;EAEAM,IAAIA,CAAA,EAAG;IACL,OAAO,IAAId,eAAe,CAAC,CAAC;EAC9B;;EAEA;EACAe,KAAKA,CAACC,KAAK,GAAG,CAAC,EAAE;IACf,OAAOnB,QAAQ,CAACa,EAAE,KAAK,SAAS,GAC5BZ,oBAAoB,CAACmB,oBAAoB,CAACD,KAAK,CAAC,GAChDlB,oBAAoB,CAACiB,KAAK,CAACC,KAAK,CAAC;EACvC;EAEAE,IAAIA,CAAA,EAAG;IACL,OAAOrB,QAAQ,CAACa,EAAE,KAAK,SAAS,GAC5BZ,oBAAoB,CAACqB,mBAAmB,CAAC,CAAC,GAC1CrB,oBAAoB,CAACoB,IAAI,CAAC,CAAC;EACjC;EAEAE,kBAAkBA,CAACZ,QAAQ,EAAEQ,KAAK,EAAE;IAClC,MAAMK,YAAY,GAAGxB,QAAQ,CAACyB,MAAM,CAAC;MACnCC,GAAG,EAAEA,CAAA,KAAM7B,qBAAqB;MAChC8B,OAAO,EAAEA,CAAA,KAAM/B;IACjB,CAAC,CAAC,CAAC,CAAC;IACJ,IAAI,CAACsB,KAAK,CAAC,CAAC,CAAC;IACb,IAAI,CAACU,kBAAkB,GAAGJ,YAAY,CAAChB,WAAW,CAChD,iBAAiB,EACjB,MAAM;MACJ,IAAI,CAACoB,kBAAkB,CAACC,MAAM,CAAC,CAAC;MAChC,IAAI,CAACC,qBAAqB,CAACnB,QAAQ,EAAEQ,KAAK,CAAC;IAC7C,CACF,CAAC;EACH;EAEAW,qBAAqBA,CAACnB,QAAQ,EAAEQ,KAAK,EAAE;IACrC,IAAI,CAACY,eAAe,GAAG,IAAI,CAACf,UAAU,CAAC,MAAM;MAC3CL,QAAQ,CAAC,CAAC;MACV,IAAI,CAACmB,qBAAqB,CAACnB,QAAQ,EAAEQ,KAAK,CAAC;IAC7C,CAAC,EAAEA,KAAK,CAAC;EACX;EAEAa,mBAAmBA,CAAA,EAAG;IACpB,IAAI,CAACX,IAAI,CAAC,CAAC;IACX,IAAI,CAACY,YAAY,CAAC,IAAI,CAACF,eAAe,CAAC;EACzC;;EAEA;EACAf,UAAUA,CAACL,QAAQ,EAAEI,OAAO,EAAE;IAC5B,IAAI,CAACT,QAAQ,IAAI,CAAC;IAClB,MAAM4B,SAAS,GAAG,IAAI,CAAC5B,QAAQ;IAC/B,IAAI,CAACC,SAAS,CAAC2B,SAAS,CAAC,GAAG;MAC1BvB,QAAQ;MACRC,QAAQ,EAAE,KAAK;MACfG;IACF,CAAC;IACDf,QAAQ,CAACa,EAAE,KAAK,SAAS,GACrBZ,oBAAoB,CAACa,yBAAyB,CAACoB,SAAS,EAAEnB,OAAO,CAAC,GAClEd,oBAAoB,CAACe,UAAU,CAACkB,SAAS,EAAEnB,OAAO,CAAC;IACvD,OAAOmB,SAAS;EAClB;EAEAD,YAAYA,CAACC,SAAS,EAAE;IACtB,IAAI,IAAI,CAAC3B,SAAS,CAAC2B,SAAS,CAAC,EAAE;MAC7B,OAAO,IAAI,CAAC3B,SAAS,CAAC2B,SAAS,CAAC;MAChC;IACF;EACF;EAEAC,WAAWA,CAACxB,QAAQ,EAAEI,OAAO,EAAE;IAC7B,IAAI,CAACT,QAAQ,IAAI,CAAC;IAClB,MAAM8B,UAAU,GAAG,IAAI,CAAC9B,QAAQ;IAChC,IAAI,CAACC,SAAS,CAAC6B,UAAU,CAAC,GAAG;MAC3BzB,QAAQ;MACRC,QAAQ,EAAE,IAAI;MACdG;IACF,CAAC;IACDf,QAAQ,CAACa,EAAE,KAAK,SAAS,GACrBZ,oBAAoB,CAACa,yBAAyB,CAACsB,UAAU,EAAErB,OAAO,CAAC,GACnEd,oBAAoB,CAACe,UAAU,CAACoB,UAAU,EAAErB,OAAO,CAAC;IACxD,OAAOqB,UAAU;EACnB;EAEAC,aAAaA,CAACD,UAAU,EAAE;IACxB,IAAI,IAAI,CAAC7B,SAAS,CAAC6B,UAAU,CAAC,EAAE;MAC9B,OAAO,IAAI,CAAC7B,SAAS,CAAC6B,UAAU,CAAC;MACjC;IACF;EACF;AACF;AAEA,eAAe,IAAIjC,eAAe,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["DeviceEventEmitter","NativeAppEventEmitter","NativeEventEmitter","NativeModules","Platform","RTKRNBackgroundTimer","Emitter","BackgroundTimer","constructor","_defineProperty","uniqueId","callbacks","addListener","id","callbackById","callback","interval","OS","backgroundTimerSetTimeout","timeout","setTimeout","init","start","delay","backgroundTimerStart","stop","backgroundTimerStop","runBackgroundTimer","EventEmitter","select","ios","android","backgroundListener","remove","backgroundClockMethod","backgroundTimer","stopBackgroundTimer","clearTimeout","timeoutId","setInterval","intervalId","clearInterval"],"sources":["BackgroundHandler.ts"],"sourcesContent":["import {\n DeviceEventEmitter,\n NativeAppEventEmitter,\n NativeEventEmitter,\n NativeModules,\n Platform,\n} from 'react-native';\n\nconst { RTKRNBackgroundTimer } = NativeModules;\nconst Emitter = new NativeEventEmitter(RTKRNBackgroundTimer);\n\nclass BackgroundTimer {\n uniqueId: number;\n\n callbacks: { [key: string]: any };\n\n backgroundTimer: number | NodeJS.Timeout | null;\n\n backgroundListener: any;\n\n constructor() {\n this.uniqueId = 0;\n this.callbacks = {};\n\n Emitter.addListener('backgroundTimer.timeout', (id) => {\n if (this.callbacks[id]) {\n const callbackById = this.callbacks[id];\n const { callback } = callbackById;\n if (!this.callbacks[id].interval) {\n delete this.callbacks[id];\n } else {\n Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(\n id,\n this.callbacks[id].timeout\n )\n : RTKRNBackgroundTimer.setTimeout(id, this.callbacks[id].timeout);\n }\n callback();\n }\n });\n }\n\n init() {\n return new BackgroundTimer();\n }\n\n // Original API\n start(delay = 0) {\n return Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerStart(delay)\n : RTKRNBackgroundTimer.start(delay);\n }\n\n stop() {\n return Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerStop()\n : RTKRNBackgroundTimer.stop();\n }\n\n runBackgroundTimer(callback, delay) {\n const EventEmitter = Platform.select({\n ios: () => NativeAppEventEmitter,\n android: () => DeviceEventEmitter,\n })();\n this.start(0);\n this.backgroundListener = EventEmitter.addListener(\n 'backgroundTimer',\n () => {\n this.backgroundListener.remove();\n this.backgroundClockMethod(callback, delay);\n }\n );\n }\n\n backgroundClockMethod(callback, delay) {\n this.backgroundTimer = this.setTimeout(() => {\n callback();\n this.backgroundClockMethod(callback, delay);\n }, delay);\n }\n\n stopBackgroundTimer() {\n this.stop();\n this.clearTimeout(this.backgroundTimer);\n }\n\n // New API, allowing for multiple timers\n setTimeout(callback, timeout) {\n this.uniqueId += 1;\n const timeoutId = this.uniqueId;\n this.callbacks[timeoutId] = {\n callback,\n interval: false,\n timeout,\n };\n Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(timeoutId, timeout)\n : RTKRNBackgroundTimer.setTimeout(timeoutId, timeout);\n return timeoutId;\n }\n\n clearTimeout(timeoutId) {\n if (this.callbacks[timeoutId]) {\n delete this.callbacks[timeoutId];\n // RTKRNBackgroundTimer.clearTimeout(timeoutId);\n }\n }\n\n setInterval(callback, timeout) {\n this.uniqueId += 1;\n const intervalId = this.uniqueId;\n this.callbacks[intervalId] = {\n callback,\n interval: true,\n timeout,\n };\n Platform.OS === 'android'\n ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(intervalId, timeout)\n : RTKRNBackgroundTimer.setTimeout(intervalId, timeout);\n return intervalId;\n }\n\n clearInterval(intervalId) {\n if (this.callbacks[intervalId]) {\n delete this.callbacks[intervalId];\n // RTKRNBackgroundTimer.clearTimeout(intervalId);\n }\n }\n}\n\n// TODO: Remove singleton pattern\nexport default new BackgroundTimer();\n"],"mappings":"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","ignoreList":[]}
@@ -11,7 +11,7 @@ import { EventEmitter } from 'events';
11
11
  import LocalMediaUtils from './LocalMediaUtils';
12
12
  import { AppState, NativeEventEmitter, NativeModules, PermissionsAndroid, Platform } from 'react-native';
13
13
  import BackgroundTimer from './BackgroundHandler';
14
- import InCallManger from './NativeAudioManager';
14
+ import NativeAudioManager from './NativeAudioManager';
15
15
  import { setupPermissions } from './PermissionHandler';
16
16
  const {
17
17
  RTKHelper,
@@ -131,7 +131,7 @@ export default class LocalMediaHandler extends EventEmitter {
131
131
  this.oniOSBroadcastStop();
132
132
  });
133
133
  }
134
- InCallManger.start({
134
+ NativeAudioManager.start({
135
135
  media: 'video'
136
136
  });
137
137
  }
@@ -216,7 +216,7 @@ export default class LocalMediaHandler extends EventEmitter {
216
216
  }
217
217
  async setupAudioStream(deviceId, forceStopTrack = false) {
218
218
  var _this$currentDevices$2;
219
- const audioDevices = _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
219
+ const audioDevices = await _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
220
220
  if (!audioDevices.length) {
221
221
  return;
222
222
  }
@@ -253,7 +253,7 @@ export default class LocalMediaHandler extends EventEmitter {
253
253
 
254
254
  // Force update audio devices on iOS after audio session is active
255
255
  // This ensures route change notifications start firing
256
- InCallManger.forceUpdateAudioDevices();
256
+ NativeAudioManager.forceUpdateAudioDevices();
257
257
  this.emit('DEVICE_CHANGE', {
258
258
  device: this.currentDevices.audio
259
259
  });
@@ -263,7 +263,7 @@ export default class LocalMediaHandler extends EventEmitter {
263
263
  }
264
264
  async setupVideoStream(deviceId, forceStopTrack = false) {
265
265
  var _this$currentDevices$3;
266
- const videoDevices = _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
266
+ const videoDevices = await _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
267
267
  if (!videoDevices.length) {
268
268
  return;
269
269
  }
@@ -313,7 +313,7 @@ export default class LocalMediaHandler extends EventEmitter {
313
313
  }
314
314
  async setupSpeaker(deviceId) {
315
315
  var _this$currentDevices$5;
316
- const speakerDevices = _classPrivateFieldGet(_localMediaUtils, this).getSpeakerDevices();
316
+ const speakerDevices = await _classPrivateFieldGet(_localMediaUtils, this).getSpeakerDevices();
317
317
  if (!speakerDevices.length) {
318
318
  return;
319
319
  }
@@ -349,7 +349,7 @@ export default class LocalMediaHandler extends EventEmitter {
349
349
  });
350
350
  }
351
351
  async getOperationalWebcamDeviceId() {
352
- let videoDevices = _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
352
+ let videoDevices = await _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
353
353
  if (!videoDevices.length) {
354
354
  return {
355
355
  isOperational: false,
@@ -380,7 +380,7 @@ export default class LocalMediaHandler extends EventEmitter {
380
380
  };
381
381
  }
382
382
  async getOperationalMicDeviceId() {
383
- let audioDevices = _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
383
+ let audioDevices = await _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
384
384
  if (!audioDevices.length) {
385
385
  return {
386
386
  isOperational: false,
@@ -446,7 +446,7 @@ export default class LocalMediaHandler extends EventEmitter {
446
446
  };
447
447
  }
448
448
  if (audio) {
449
- const audioDevices = _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
449
+ const audioDevices = await _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
450
450
  if (audioDevices.length !== 0) {
451
451
  const audioDeviceId = (await this.getOperationalMicDeviceId()).deviceId;
452
452
  this.currentDevices.audio = _classPrivateFieldGet(_localMediaUtils, this).getDeviceById(audioDeviceId, 'audioinput');
@@ -454,7 +454,7 @@ export default class LocalMediaHandler extends EventEmitter {
454
454
  }
455
455
  }
456
456
  if (video) {
457
- const videoDevices = _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
457
+ const videoDevices = await _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
458
458
  if (videoDevices.length !== 0) {
459
459
  const videoDeviceId = (await this.getOperationalWebcamDeviceId()).deviceId;
460
460
  this.currentDevices.video = _classPrivateFieldGet(_localMediaUtils, this).getDeviceById(videoDeviceId, 'videoinput');
@@ -712,14 +712,43 @@ export default class LocalMediaHandler extends EventEmitter {
712
712
  getDeviceById(deviceId, kind) {
713
713
  return _classPrivateFieldGet(_localMediaUtils, this).getDeviceById(deviceId, kind);
714
714
  }
715
- getAudioDevices() {
716
- return _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
715
+ async getAudioDevices() {
716
+ const devices = await _classPrivateFieldGet(_localMediaUtils, this).getAudioDevices();
717
+
718
+ // Update current audio device from native layer
719
+ try {
720
+ const currentDeviceId = await NativeAudioManager.getCurrentAudioDevice();
721
+ if (currentDeviceId) {
722
+ const currentDevice = _classPrivateFieldGet(_localMediaUtils, this).getDeviceById(currentDeviceId, 'audioinput');
723
+ if (currentDevice) {
724
+ this.currentDevices.audio = currentDevice;
725
+ }
726
+ }
727
+ } catch (e) {
728
+ console.warn('Failed to update current audio device:', e);
729
+ }
730
+ return devices;
717
731
  }
718
- getVideoDevices() {
719
- return _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
732
+ async getVideoDevices() {
733
+ return await _classPrivateFieldGet(_localMediaUtils, this).getVideoDevices();
720
734
  }
721
- getSpeakerDevices() {
722
- return _classPrivateFieldGet(_localMediaUtils, this).getSpeakerDevices();
735
+ async getSpeakerDevices() {
736
+ const devices = await _classPrivateFieldGet(_localMediaUtils, this).getSpeakerDevices();
737
+
738
+ // Update current speaker device from native layer
739
+ try {
740
+ const currentDeviceId = await NativeAudioManager.getCurrentAudioDevice();
741
+ if (currentDeviceId) {
742
+ const currentDevice = _classPrivateFieldGet(_localMediaUtils, this).getDeviceById(currentDeviceId, 'audioinput');
743
+ if (currentDevice) {
744
+ this.currentDevices.speaker = currentDevice;
745
+ this.currentDevices.audio = currentDevice;
746
+ }
747
+ }
748
+ } catch (e) {
749
+ console.warn('Failed to update current speaker device:', e);
750
+ }
751
+ return devices;
723
752
  }
724
753
  async onDeviceChange(changedDevices, forceDeviceChange) {
725
754
  let addedDevice;
@@ -794,7 +823,7 @@ export default class LocalMediaHandler extends EventEmitter {
794
823
  // 1. Devices were added or removed, OR
795
824
  // 2. Selected device changed (platform routed to a different device)
796
825
  const hasDeviceListChanged = changedDevices.added.length || changedDevices.removed.length;
797
- const hasSelectedDeviceInfo = changedDevices.selectedDevice !== undefined;
826
+ const hasSelectedDeviceInfo = changedDevices.selectedDevice.length > 0;
798
827
  if (hasDeviceListChanged || hasSelectedDeviceInfo) {
799
828
  this.emit('DEVICE_LIST_UPDATED', changedDevices);
800
829
  }
@@ -810,8 +839,7 @@ export default class LocalMediaHandler extends EventEmitter {
810
839
  return super.on(event, listener);
811
840
  }
812
841
  destruct() {
813
- // TODO: Do not remove native broadcast listeners when going OFF_STAGE in webinar
814
- // this.#localMediaUtils.destruct();
842
+ _classPrivateFieldGet(_localMediaUtils, this).destruct();
815
843
  if (Platform.OS === 'android') _classPrivateFieldGet(_appStateSubscription, this).remove();
816
844
  BackgroundTimer.stop();
817
845
  try {
@@ -823,7 +851,6 @@ export default class LocalMediaHandler extends EventEmitter {
823
851
  });
824
852
  }
825
853
  } catch (_err) {}
826
- // InCallManger.stop(undefined);
827
854
  }
828
855
  stopAudioTrack() {
829
856
  var _this$rawAudioTrack2, _this$audioTrack3, _this$rawAudioTrack3, _this$audioTrack4;