@cloudflare/realtimekit-react-native 0.3.1 → 0.3.2-staging.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/lib/commonjs/AGENTS.md +58 -0
  2. package/lib/commonjs/AudioSampleHandler.js +4 -2
  3. package/lib/commonjs/AudioSampleHandler.js.map +1 -1
  4. package/lib/commonjs/BackgroundHandler.js +3 -3
  5. package/lib/commonjs/BackgroundHandler.js.map +1 -1
  6. package/lib/commonjs/LocalMediaHandler.js +75 -30
  7. package/lib/commonjs/LocalMediaHandler.js.map +1 -1
  8. package/lib/commonjs/LocalMediaUtils.js +3 -2
  9. package/lib/commonjs/LocalMediaUtils.js.map +1 -1
  10. package/lib/commonjs/ReactHooks.js +26 -0
  11. package/lib/commonjs/ReactHooks.js.map +1 -1
  12. package/lib/commonjs/utils/version.js +1 -1
  13. package/lib/commonjs/utils/version.js.map +1 -1
  14. package/lib/module/AGENTS.md +58 -0
  15. package/lib/module/AudioSampleHandler.js +3 -1
  16. package/lib/module/AudioSampleHandler.js.map +1 -1
  17. package/lib/module/BackgroundHandler.js +2 -2
  18. package/lib/module/BackgroundHandler.js.map +1 -1
  19. package/lib/module/LocalMediaHandler.js +74 -29
  20. package/lib/module/LocalMediaHandler.js.map +1 -1
  21. package/lib/module/LocalMediaUtils.js +2 -1
  22. package/lib/module/LocalMediaUtils.js.map +1 -1
  23. package/lib/module/ReactHooks.js +26 -0
  24. package/lib/module/ReactHooks.js.map +1 -1
  25. package/lib/module/utils/version.js +1 -1
  26. package/lib/module/utils/version.js.map +1 -1
  27. package/lib/typescript/AudioSampleHandler.d.ts +2 -0
  28. package/lib/typescript/BackgroundHandler.d.ts +2 -0
  29. package/lib/typescript/LocalMediaHandler.d.ts +2 -0
  30. package/lib/typescript/LocalMediaUtils.d.ts +2 -0
  31. package/lib/typescript/ReactHooks.d.ts +1 -1
  32. package/lib/typescript/utils/version.d.ts +1 -1
  33. package/package.json +2 -4
@@ -0,0 +1,58 @@
1
+ # src/ — Library Source
2
+
3
+ Core TypeScript source for `@cloudflare/realtimekit-react-native`. Thin React Native bridge over `@cloudflare/realtimekit`.
4
+
5
+ ## FILE MAP
6
+
7
+ | File | Lines | Role |
8
+ |------|-------|------|
9
+ | `index.tsx` | 87 | **Entry point**. Side-effect imports: registers WebRTC globals, patches `navigator`, polyfills crypto/URL/encoding. Exports hooks + provider. |
10
+ | `ReactHooks.tsx` | 99 | `useRealtimeKitClient`, `useRealtimeKitSelector`, `useRTKSelector` (deprecated), `useRealtimeKitMeeting`. Re-exports from ReactContext. |
11
+ | `ReactContext.tsx` | 140 | `RealtimeKitProvider` component + `RealtimeKitUpdates` listener manager. Has `@ts-nocheck` — legacy, do not propagate. |
12
+ | `LocalMediaHandler.ts` | 1084 | **Largest file.** Audio/video/screenshare track lifecycle, device switching, permission gating, iOS broadcast + Android foreground service integration. |
13
+ | `LocalMediaUtils.ts` | 481 | Static helpers: `getUserMedia` with timeout, device enumeration (audio from native, video from WebRTC), `chooseAudioRoute`, video constraints. |
14
+ | `LocalMediaInterfaces.ts` | 101 | Type definitions: `MediaDeviceInfo`, `MediaPermission`, constraint types, quality enums. |
15
+ | `LocalMediaError.ts` | 9 | Simple `Error` subclass with `code` field. |
16
+ | `NativeAudioManager.ts` | 105 | JS wrapper for `InCallManager` native module. Audio routing, speaker control, device queries. Has `@ts-nocheck`. |
17
+ | `PermissionHandler.ts` | 227 | Platform-specific permission flow. Custom `PERMISSIONS`/`RESULTS` constants (mirrors react-native-permissions API without the dependency). Recursive retry with 20s timeout. |
18
+ | `BackgroundHandler.ts` | 134 | Native timer bridge (`RTKRNBackgroundTimer`). setTimeout/setInterval that survive background. Exported as singleton instance. |
19
+ | `AudioSampleHandler.ts` | 65 | Listens to `audioSamples` events from WebRTCModule. Provides `getFloatTimeDomainData` for audio visualization. |
20
+ | `DeviceInfo.ts` | 34 | Reads platform info + SDK version. Exported as singleton. |
21
+ | `utils/crypto.ts` | 155 | `crypto.getRandomValues` polyfill. Cascading fallbacks: ExpoCrypto → NativeModules.Core → ExpoRandom (SDK 41-44) → ExpoModules (SDK 45+). Insecure Math.random fallback in debug only. |
22
+ | `utils/version.ts` | 2 | `SDK_VERSION` constant, auto-generated by `scripts/generate-version.js`. |
23
+ | `__tests__/index.test.tsx` | — | Placeholder: `it.todo('write a test')`. |
24
+
25
+ ## KEY PATTERNS
26
+
27
+ ### Navigator Property Injection
28
+ The core `@cloudflare/realtimekit` SDK reads implementations from `navigator` at runtime. This package injects them via `Object.defineProperty` in `index.tsx`:
29
+ - `navigator.RNLocalMediaHandlerImpl` → `LocalMediaHandler`
30
+ - `navigator.RNAudioSampleHandlerImpl` → `AudioSampleHandler`
31
+ - `navigator.RNBackgroundTimerImpl` → `BackgroundTimer`
32
+ - `navigator.RNDeviceInfoImpl` → `DeviceInfo`
33
+
34
+ ### Audio Device Flow
35
+ ```
36
+ Native event (onAudioDeviceChanged)
37
+ → LocalMediaUtils.onDeviceChange()
38
+ → LocalMediaHandler.onDeviceChange()
39
+ → setupSpeaker() / setupAudioStream()
40
+ → NativeAudioManager.chooseAudioRoute()
41
+ ```
42
+ Audio devices (earpiece, speaker, bluetooth, wired) are enumerated from native layer, NOT from WebRTC `enumerateDevices`. Video devices use WebRTC enumeration.
43
+
44
+ ### Selector Hook Pattern
45
+ `useRealtimeKitSelector(fn)` uses `useRef` + `useReducer` for forced re-renders. Two subscription paths:
46
+ 1. If selected value has `addListener` → subscribes directly to that object
47
+ 2. Otherwise → subscribes to `RealtimeKitUpdates` global event bus
48
+
49
+ ### Permission Flow
50
+ `setupPermissions(audio, video)` → maps to platform constants → `requestMultiplePermissions` → recursive retry with `setInterval` + 20s rejection timeout. Returns `{camera, microphone, bluetooth, location}` states.
51
+
52
+ ## ANTI-PATTERNS TO AVOID
53
+
54
+ - Do NOT add more `@ts-nocheck` files (ReactContext.tsx and NativeAudioManager.ts are legacy exceptions)
55
+ - Do NOT add `eslint-disable` without a tracked issue
56
+ - Do NOT export new singletons (BackgroundHandler/DeviceInfo pattern is tech debt)
57
+ - Do NOT use `as any` for type suppression — define proper types in LocalMediaInterfaces.ts
58
+ - Empty catch at `ReactHooks.tsx:122` (cleanUpEvents function) — should at minimum log
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
6
+ exports.webRTCModuleEmitter = exports.default = void 0;
7
7
  var _reactNative = require("react-native");
8
8
  var _events = require("events");
9
9
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
@@ -12,6 +12,7 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
12
12
  const {
13
13
  WebRTCModule
14
14
  } = _reactNative.NativeModules;
15
+ const webRTCModuleEmitter = exports.webRTCModuleEmitter = new _reactNative.NativeEventEmitter(WebRTCModule);
15
16
  class AudioSampleHandler extends _events.EventEmitter {
16
17
  constructor() {
17
18
  super();
@@ -19,7 +20,7 @@ class AudioSampleHandler extends _events.EventEmitter {
19
20
  _defineProperty(this, "_audioSamplesListener", void 0);
20
21
  _defineProperty(this, "_isListening", false);
21
22
  _defineProperty(this, "_currentSamples", void 0);
22
- this.webRTCModuleEmitter = new _reactNative.NativeEventEmitter(WebRTCModule);
23
+ this.webRTCModuleEmitter = webRTCModuleEmitter;
23
24
  this._audioSampleHandler = this._audioSampleHandler.bind(this);
24
25
  this._currentSamples = new Float32Array(1024);
25
26
  this.initialiseSampler();
@@ -47,6 +48,7 @@ class AudioSampleHandler extends _events.EventEmitter {
47
48
  }
48
49
  stopListening() {
49
50
  if (this._audioSamplesListener) {
51
+ this._audioSamplesListener.remove();
50
52
  this._audioSamplesListener = undefined;
51
53
  this._isListening = false;
52
54
  this._currentSamples.fill(0);
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_events","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","WebRTCModule","NativeModules","AudioSampleHandler","EventEmitter","constructor","webRTCModuleEmitter","NativeEventEmitter","_audioSampleHandler","bind","_currentSamples","Float32Array","initialiseSampler","init","audioData","fill","Platform","OS","set","samples","_audioSamplesListener","addListener","_isListening","getFloatTimeDomainData","stopListening","undefined","destructor","exports","default"],"sources":["AudioSampleHandler.ts"],"sourcesContent":["import {\n NativeEventEmitter,\n NativeEventSubscription,\n NativeModules,\n Platform,\n} from 'react-native';\nimport { EventEmitter } from 'events';\n\nconst { WebRTCModule } = NativeModules;\n\nexport default class AudioSampleHandler extends EventEmitter {\n private webRTCModuleEmitter: NativeEventEmitter;\n private _audioSamplesListener?: NativeEventSubscription;\n private _isListening = false;\n private _currentSamples: Float32Array;\n\n constructor() {\n super();\n this.webRTCModuleEmitter = new NativeEventEmitter(WebRTCModule);\n this._audioSampleHandler = this._audioSampleHandler.bind(this);\n this._currentSamples = new Float32Array(1024);\n this.initialiseSampler();\n }\n\n public static async init() {\n return new AudioSampleHandler();\n }\n\n private _audioSampleHandler(audioData: any) {\n this._currentSamples.fill(0);\n if (Platform.OS === 'android') {\n this._currentSamples.set(audioData);\n } else {\n this._currentSamples.set(audioData.samples);\n }\n }\n\n private initialiseSampler() {\n this._audioSamplesListener = this.webRTCModuleEmitter.addListener(\n 'audioSamples',\n this._audioSampleHandler\n );\n this._isListening = true;\n }\n\n public getFloatTimeDomainData(samples: Float32Array) {\n if (!this._isListening) {\n this.initialiseSampler();\n }\n samples.set(this._currentSamples);\n }\n\n public stopListening() {\n if (this._audioSamplesListener) {\n this._audioSamplesListener = undefined;\n this._isListening = false;\n this._currentSamples.fill(0);\n }\n }\n\n public destructor() {\n this.stopListening();\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAMA,IAAAC,OAAA,GAAAD,OAAA;AAAsC,SAAAE,gBAAAC,CAAA,EAAAC,CAAA,EAAAC,CAAA,YAAAD,CAAA,GAAAE,cAAA,CAAAF,CAAA,MAAAD,CAAA,GAAAI,MAAA,CAAAC,cAAA,CAAAL,CAAA,EAAAC,CAAA,IAAAK,KAAA,EAAAJ,CAAA,EAAAK,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAAT,CAAA,CAAAC,CAAA,IAAAC,CAAA,EAAAF,CAAA;AAAA,SAAAG,eAAAD,CAAA,QAAAQ,CAAA,GAAAC,YAAA,CAAAT,CAAA,uCAAAQ,CAAA,GAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAC,aAAAT,CAAA,EAAAD,CAAA,2BAAAC,CAAA,KAAAA,CAAA,SAAAA,CAAA,MAAAF,CAAA,GAAAE,CAAA,CAAAU,MAAA,CAAAC,WAAA,kBAAAb,CAAA,QAAAU,CAAA,GAAAV,CAAA,CAAAc,IAAA,CAAAZ,CAAA,EAAAD,CAAA,uCAAAS,CAAA,SAAAA,CAAA,YAAAK,SAAA,yEAAAd,CAAA,GAAAe,MAAA,GAAAC,MAAA,EAAAf,CAAA;AAEtC,MAAM;EAAEgB;AAAa,CAAC,GAAGC,0BAAa;AAEvB,MAAMC,kBAAkB,SAASC,oBAAY,CAAC;EAM3DC,WAAWA,CAAA,EAAG;IACZ,KAAK,CAAC,CAAC;IAACvB,eAAA;IAAAA,eAAA;IAAAA,eAAA,uBAJa,KAAK;IAAAA,eAAA;IAK1B,IAAI,CAACwB,mBAAmB,GAAG,IAAIC,+BAAkB,CAACN,YAAY,CAAC;IAC/D,IAAI,CAACO,mBAAmB,GAAG,IAAI,CAACA,mBAAmB,CAACC,IAAI,CAAC,IAAI,CAAC;IAC9D,IAAI,CAACC,eAAe,GAAG,IAAIC,YAAY,CAAC,IAAI,CAAC;IAC7C,IAAI,CAACC,iBAAiB,CAAC,CAAC;EAC1B;EAEA,aAAoBC,IAAIA,CAAA,EAAG;IACzB,OAAO,IAAIV,kBAAkB,CAAC,CAAC;EACjC;EAEQK,mBAAmBA,CAACM,SAAc,EAAE;IAC1C,IAAI,CAACJ,eAAe,CAACK,IAAI,CAAC,CAAC,CAAC;IAC5B,IAAIC,qBAAQ,CAACC,EAAE,KAAK,SAAS,EAAE;MAC7B,IAAI,CAACP,eAAe,CAACQ,GAAG,CAACJ,SAAS,CAAC;IACrC,CAAC,MAAM;MACL,IAAI,CAACJ,eAAe,CAACQ,GAAG,CAACJ,SAAS,CAACK,OAAO,CAAC;IAC7C;EACF;EAEQP,iBAAiBA,CAAA,EAAG;IAC1B,IAAI,CAACQ,qBAAqB,GAAG,IAAI,CAACd,mBAAmB,CAACe,WAAW,CAC/D,cAAc,EACd,IAAI,CAACb,mBACP,CAAC;IACD,IAAI,CAACc,YAAY,GAAG,IAAI;EAC1B;EAEOC,sBAAsBA,CAACJ,OAAqB,EAAE;IACnD,IAAI,CAAC,IAAI,CAACG,YAAY,EAAE;MACtB,IAAI,CAACV,iBAAiB,CAAC,CAAC;IAC1B;IACAO,OAAO,CAACD,GAAG,CAAC,IAAI,CAACR,eAAe,CAAC;EACnC;EAEOc,aAAaA,CAAA,EAAG;IACrB,IAAI,IAAI,CAACJ,qBAAqB,EAAE;MAC9B,IAAI,CAACA,qBAAqB,GAAGK,SAAS;MACtC,IAAI,CAACH,YAAY,GAAG,KAAK;MACzB,IAAI,CAACZ,eAAe,CAACK,IAAI,CAAC,CAAC,CAAC;IAC9B;EACF;EAEOW,UAAUA,CAAA,EAAG;IAClB,IAAI,CAACF,aAAa,CAAC,CAAC;EACtB;AACF;AAACG,OAAA,CAAAC,OAAA,GAAAzB,kBAAA","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_events","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","WebRTCModule","NativeModules","webRTCModuleEmitter","exports","NativeEventEmitter","AudioSampleHandler","EventEmitter","constructor","_audioSampleHandler","bind","_currentSamples","Float32Array","initialiseSampler","init","audioData","fill","Platform","OS","set","samples","_audioSamplesListener","addListener","_isListening","getFloatTimeDomainData","stopListening","remove","undefined","destructor","default"],"sources":["AudioSampleHandler.ts"],"sourcesContent":["import {\n NativeEventEmitter,\n NativeEventSubscription,\n NativeModules,\n Platform,\n} from 'react-native';\nimport { EventEmitter } from 'events';\n\nconst { WebRTCModule } = NativeModules;\n\nexport const webRTCModuleEmitter = new NativeEventEmitter(WebRTCModule);\n\nexport default class AudioSampleHandler extends EventEmitter {\n private webRTCModuleEmitter: NativeEventEmitter;\n private _audioSamplesListener?: NativeEventSubscription;\n private _isListening = false;\n private _currentSamples: Float32Array;\n\n constructor() {\n super();\n this.webRTCModuleEmitter = webRTCModuleEmitter;\n this._audioSampleHandler = this._audioSampleHandler.bind(this);\n this._currentSamples = new Float32Array(1024);\n this.initialiseSampler();\n }\n\n public static async init() {\n return new AudioSampleHandler();\n }\n\n private _audioSampleHandler(audioData: any) {\n this._currentSamples.fill(0);\n if (Platform.OS === 'android') {\n this._currentSamples.set(audioData);\n } else {\n this._currentSamples.set(audioData.samples);\n }\n }\n\n private initialiseSampler() {\n this._audioSamplesListener = this.webRTCModuleEmitter.addListener(\n 'audioSamples',\n this._audioSampleHandler\n );\n this._isListening = true;\n }\n\n public getFloatTimeDomainData(samples: Float32Array) {\n if (!this._isListening) {\n this.initialiseSampler();\n }\n samples.set(this._currentSamples);\n }\n\n public stopListening() {\n if (this._audioSamplesListener) {\n this._audioSamplesListener.remove();\n this._audioSamplesListener = undefined;\n this._isListening = false;\n this._currentSamples.fill(0);\n }\n }\n\n public destructor() {\n this.stopListening();\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
6
+ exports.default = exports.backgroundEmitter = void 0;
7
7
  var _reactNative = require("react-native");
8
8
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
9
9
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
@@ -11,7 +11,7 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
11
11
  const {
12
12
  RTKRNBackgroundTimer
13
13
  } = _reactNative.NativeModules;
14
- const Emitter = new _reactNative.NativeEventEmitter(RTKRNBackgroundTimer);
14
+ const backgroundEmitter = exports.backgroundEmitter = new _reactNative.NativeEventEmitter(RTKRNBackgroundTimer);
15
15
  class BackgroundTimer {
16
16
  constructor() {
17
17
  _defineProperty(this, "uniqueId", void 0);
@@ -20,7 +20,7 @@ class BackgroundTimer {
20
20
  _defineProperty(this, "backgroundListener", void 0);
21
21
  this.uniqueId = 0;
22
22
  this.callbacks = {};
23
- Emitter.addListener('backgroundTimer.timeout', id => {
23
+ backgroundEmitter.addListener('backgroundTimer.timeout', id => {
24
24
  if (this.callbacks[id]) {
25
25
  const callbackById = this.callbacks[id];
26
26
  const {
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","RTKRNBackgroundTimer","NativeModules","Emitter","NativeEventEmitter","BackgroundTimer","constructor","uniqueId","callbacks","addListener","id","callbackById","callback","interval","Platform","OS","backgroundTimerSetTimeout","timeout","setTimeout","init","start","delay","backgroundTimerStart","stop","backgroundTimerStop","runBackgroundTimer","EventEmitter","select","ios","NativeAppEventEmitter","android","DeviceEventEmitter","backgroundListener","remove","backgroundClockMethod","backgroundTimer","stopBackgroundTimer","clearTimeout","timeoutId","setInterval","intervalId","clearInterval","_default","exports","default"],"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":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAMsB,SAAAC,gBAAAC,CAAA,EAAAC,CAAA,EAAAC,CAAA,YAAAD,CAAA,GAAAE,cAAA,CAAAF,CAAA,MAAAD,CAAA,GAAAI,MAAA,CAAAC,cAAA,CAAAL,CAAA,EAAAC,CAAA,IAAAK,KAAA,EAAAJ,CAAA,EAAAK,UAAA,MAAAC,YAAA,MAAAC,QAAA,UAAAT,CAAA,CAAAC,CAAA,IAAAC,CAAA,EAAAF,CAAA;AAAA,SAAAG,eAAAD,CAAA,QAAAQ,CAAA,GAAAC,YAAA,CAAAT,CAAA,uCAAAQ,CAAA,GAAAA,CAAA,GAAAA,CAAA;AAAA,SAAAC,aAAAT,CAAA,EAAAD,CAAA,2BAAAC,CAAA,KAAAA,CAAA,SAAAA,CAAA,MAAAF,CAAA,GAAAE,CAAA,CAAAU,MAAA,CAAAC,WAAA,kBAAAb,CAAA,QAAAU,CAAA,GAAAV,CAAA,CAAAc,IAAA,CAAAZ,CAAA,EAAAD,CAAA,uCAAAS,CAAA,SAAAA,CAAA,YAAAK,SAAA,yEAAAd,CAAA,GAAAe,MAAA,GAAAC,MAAA,EAAAf,CAAA;AAEtB,MAAM;EAAEgB;AAAqB,CAAC,GAAGC,0BAAa;AAC9C,MAAMC,OAAO,GAAG,IAAIC,+BAAkB,CAACH,oBAAoB,CAAC;AAE5D,MAAMI,eAAe,CAAC;EASpBC,WAAWA,CAAA,EAAG;IAAAxB,eAAA;IAAAA,eAAA;IAAAA,eAAA;IAAAA,eAAA;IACZ,IAAI,CAACyB,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;UACLI,qBAAQ,CAACC,EAAE,KAAK,SAAS,GACrBd,oBAAoB,CAACe,yBAAyB,CAC5CN,EAAE,EACF,IAAI,CAACF,SAAS,CAACE,EAAE,CAAC,CAACO,OACrB,CAAC,GACDhB,oBAAoB,CAACiB,UAAU,CAACR,EAAE,EAAE,IAAI,CAACF,SAAS,CAACE,EAAE,CAAC,CAACO,OAAO,CAAC;QACrE;QACAL,QAAQ,CAAC,CAAC;MACZ;IACF,CAAC,CAAC;EACJ;EAEAO,IAAIA,CAAA,EAAG;IACL,OAAO,IAAId,eAAe,CAAC,CAAC;EAC9B;;EAEA;EACAe,KAAKA,CAACC,KAAK,GAAG,CAAC,EAAE;IACf,OAAOP,qBAAQ,CAACC,EAAE,KAAK,SAAS,GAC5Bd,oBAAoB,CAACqB,oBAAoB,CAACD,KAAK,CAAC,GAChDpB,oBAAoB,CAACmB,KAAK,CAACC,KAAK,CAAC;EACvC;EAEAE,IAAIA,CAAA,EAAG;IACL,OAAOT,qBAAQ,CAACC,EAAE,KAAK,SAAS,GAC5Bd,oBAAoB,CAACuB,mBAAmB,CAAC,CAAC,GAC1CvB,oBAAoB,CAACsB,IAAI,CAAC,CAAC;EACjC;EAEAE,kBAAkBA,CAACb,QAAQ,EAAES,KAAK,EAAE;IAClC,MAAMK,YAAY,GAAGZ,qBAAQ,CAACa,MAAM,CAAC;MACnCC,GAAG,EAAEA,CAAA,KAAMC,kCAAqB;MAChCC,OAAO,EAAEA,CAAA,KAAMC;IACjB,CAAC,CAAC,CAAC,CAAC;IACJ,IAAI,CAACX,KAAK,CAAC,CAAC,CAAC;IACb,IAAI,CAACY,kBAAkB,GAAGN,YAAY,CAACjB,WAAW,CAChD,iBAAiB,EACjB,MAAM;MACJ,IAAI,CAACuB,kBAAkB,CAACC,MAAM,CAAC,CAAC;MAChC,IAAI,CAACC,qBAAqB,CAACtB,QAAQ,EAAES,KAAK,CAAC;IAC7C,CACF,CAAC;EACH;EAEAa,qBAAqBA,CAACtB,QAAQ,EAAES,KAAK,EAAE;IACrC,IAAI,CAACc,eAAe,GAAG,IAAI,CAACjB,UAAU,CAAC,MAAM;MAC3CN,QAAQ,CAAC,CAAC;MACV,IAAI,CAACsB,qBAAqB,CAACtB,QAAQ,EAAES,KAAK,CAAC;IAC7C,CAAC,EAAEA,KAAK,CAAC;EACX;EAEAe,mBAAmBA,CAAA,EAAG;IACpB,IAAI,CAACb,IAAI,CAAC,CAAC;IACX,IAAI,CAACc,YAAY,CAAC,IAAI,CAACF,eAAe,CAAC;EACzC;;EAEA;EACAjB,UAAUA,CAACN,QAAQ,EAAEK,OAAO,EAAE;IAC5B,IAAI,CAACV,QAAQ,IAAI,CAAC;IAClB,MAAM+B,SAAS,GAAG,IAAI,CAAC/B,QAAQ;IAC/B,IAAI,CAACC,SAAS,CAAC8B,SAAS,CAAC,GAAG;MAC1B1B,QAAQ;MACRC,QAAQ,EAAE,KAAK;MACfI;IACF,CAAC;IACDH,qBAAQ,CAACC,EAAE,KAAK,SAAS,GACrBd,oBAAoB,CAACe,yBAAyB,CAACsB,SAAS,EAAErB,OAAO,CAAC,GAClEhB,oBAAoB,CAACiB,UAAU,CAACoB,SAAS,EAAErB,OAAO,CAAC;IACvD,OAAOqB,SAAS;EAClB;EAEAD,YAAYA,CAACC,SAAS,EAAE;IACtB,IAAI,IAAI,CAAC9B,SAAS,CAAC8B,SAAS,CAAC,EAAE;MAC7B,OAAO,IAAI,CAAC9B,SAAS,CAAC8B,SAAS,CAAC;MAChC;IACF;EACF;EAEAC,WAAWA,CAAC3B,QAAQ,EAAEK,OAAO,EAAE;IAC7B,IAAI,CAACV,QAAQ,IAAI,CAAC;IAClB,MAAMiC,UAAU,GAAG,IAAI,CAACjC,QAAQ;IAChC,IAAI,CAACC,SAAS,CAACgC,UAAU,CAAC,GAAG;MAC3B5B,QAAQ;MACRC,QAAQ,EAAE,IAAI;MACdI;IACF,CAAC;IACDH,qBAAQ,CAACC,EAAE,KAAK,SAAS,GACrBd,oBAAoB,CAACe,yBAAyB,CAACwB,UAAU,EAAEvB,OAAO,CAAC,GACnEhB,oBAAoB,CAACiB,UAAU,CAACsB,UAAU,EAAEvB,OAAO,CAAC;IACxD,OAAOuB,UAAU;EACnB;EAEAC,aAAaA,CAACD,UAAU,EAAE;IACxB,IAAI,IAAI,CAAChC,SAAS,CAACgC,UAAU,CAAC,EAAE;MAC9B,OAAO,IAAI,CAAChC,SAAS,CAACgC,UAAU,CAAC;MACjC;IACF;EACF;AACF;;AAEA;AAAA,IAAAE,QAAA,GAAAC,OAAA,CAAAC,OAAA,GACe,IAAIvC,eAAe,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","RTKRNBackgroundTimer","NativeModules","backgroundEmitter","exports","NativeEventEmitter","BackgroundTimer","constructor","uniqueId","callbacks","addListener","id","callbackById","callback","interval","Platform","OS","backgroundTimerSetTimeout","timeout","setTimeout","init","start","delay","backgroundTimerStart","stop","backgroundTimerStop","runBackgroundTimer","EventEmitter","select","ios","NativeAppEventEmitter","android","DeviceEventEmitter","backgroundListener","remove","backgroundClockMethod","backgroundTimer","stopBackgroundTimer","clearTimeout","timeoutId","setInterval","intervalId","clearInterval","_default","default"],"sources":["BackgroundHandler.ts"],"sourcesContent":["import {\n DeviceEventEmitter,\n NativeAppEventEmitter,\n NativeEventEmitter,\n NativeModules,\n Platform,\n} from 'react-native';\n\nconst { RTKRNBackgroundTimer } = NativeModules;\nexport const backgroundEmitter = 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 backgroundEmitter.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":[]}
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = exports.MediaEvents = void 0;
6
+ exports.default = exports.broadcastEmitter = exports.MediaEvents = void 0;
7
7
  var _events = require("events");
8
8
  var _LocalMediaUtils = _interopRequireDefault(require("./LocalMediaUtils"));
9
9
  var _reactNative = require("react-native");
@@ -23,7 +23,7 @@ const {
23
23
  RTKHelper,
24
24
  BroadcastEventEmitter
25
25
  } = _reactNative.NativeModules;
26
- const broadcastEmitter = new _reactNative.NativeEventEmitter(BroadcastEventEmitter);
26
+ const broadcastEmitter = exports.broadcastEmitter = new _reactNative.NativeEventEmitter(BroadcastEventEmitter);
27
27
 
28
28
  // eslint-disable-next-line no-shadow
29
29
  let MediaEvents = exports.MediaEvents = /*#__PURE__*/function (MediaEvents) {
@@ -45,7 +45,11 @@ var _localMediaUtils = /*#__PURE__*/new WeakMap();
45
45
  var _appState = /*#__PURE__*/new WeakMap();
46
46
  var _appStateSubscription = /*#__PURE__*/new WeakMap();
47
47
  var _interval = /*#__PURE__*/new WeakMap();
48
+ var _screenShareState = /*#__PURE__*/new WeakMap();
48
49
  var _deviceRemovalTimeout = /*#__PURE__*/new WeakMap();
50
+ var _broadcastEmitter = /*#__PURE__*/new WeakMap();
51
+ var _broadcastStartedSubscription = /*#__PURE__*/new WeakMap();
52
+ var _broadcastStoppedSubscription = /*#__PURE__*/new WeakMap();
49
53
  class LocalMediaHandler extends _events.EventEmitter {
50
54
  async configureForeground() {
51
55
  if (_reactNative.Platform.OS !== 'android') return;
@@ -73,6 +77,7 @@ class LocalMediaHandler extends _events.EventEmitter {
73
77
  _classPrivateFieldInitSpec(this, _appState, void 0);
74
78
  _classPrivateFieldInitSpec(this, _appStateSubscription, void 0);
75
79
  _classPrivateFieldInitSpec(this, _interval, void 0);
80
+ _classPrivateFieldInitSpec(this, _screenShareState, void 0);
76
81
  _defineProperty(this, "audioTrack", void 0);
77
82
  _defineProperty(this, "rawAudioTrack", void 0);
78
83
  _defineProperty(this, "videoTrack", void 0);
@@ -85,6 +90,9 @@ class LocalMediaHandler extends _events.EventEmitter {
85
90
  _defineProperty(this, "currentDevices", void 0);
86
91
  _defineProperty(this, "permissions", void 0);
87
92
  _classPrivateFieldInitSpec(this, _deviceRemovalTimeout, null);
93
+ _classPrivateFieldInitSpec(this, _broadcastEmitter, void 0);
94
+ _classPrivateFieldInitSpec(this, _broadcastStartedSubscription, void 0);
95
+ _classPrivateFieldInitSpec(this, _broadcastStoppedSubscription, void 0);
88
96
  _defineProperty(this, "_handleAppStateChange", nextAppState => {
89
97
  if (_classPrivateFieldGet(_appState, this).match(/inactive|background/) && nextAppState === 'active') {
90
98
  _BackgroundHandler.default.clearInterval(_classPrivateFieldGet(_interval, this));
@@ -108,6 +116,7 @@ class LocalMediaHandler extends _events.EventEmitter {
108
116
  }
109
117
  });
110
118
  _classPrivateFieldSet(_localMediaUtils, this, localMediaUtils);
119
+ _classPrivateFieldSet(_broadcastEmitter, this, broadcastEmitter);
111
120
  _classPrivateFieldSet(_appState, this, '');
112
121
  this.audioEnabled = true;
113
122
  this.videoEnabled = true;
@@ -130,12 +139,12 @@ class LocalMediaHandler extends _events.EventEmitter {
130
139
  await this.onDeviceChange(changedDevices, false);
131
140
  });
132
141
  if (_reactNative.Platform.OS === 'ios') {
133
- broadcastEmitter.addListener('iOS_BroadcastStarted', () => {
142
+ _classPrivateFieldSet(_broadcastStartedSubscription, this, _classPrivateFieldGet(_broadcastEmitter, this).addListener('iOS_BroadcastStarted', () => {
134
143
  this.oniOSBroadcastStart();
135
- });
136
- broadcastEmitter.addListener('iOS_BroadcastStopped', () => {
144
+ }));
145
+ _classPrivateFieldSet(_broadcastStoppedSubscription, this, _classPrivateFieldGet(_broadcastEmitter, this).addListener('iOS_BroadcastStopped', () => {
137
146
  this.oniOSBroadcastStop();
138
- });
147
+ }));
139
148
  }
140
149
  _NativeAudioManager.default.start({
141
150
  media: 'video'
@@ -298,7 +307,7 @@ class LocalMediaHandler extends _events.EventEmitter {
298
307
  }
299
308
  }
300
309
  this.setVideoTrack(this.rawVideoTrack);
301
- this.addMediaStreamTrackListeners(this.rawVideoTrack);
310
+ this.addMediaStreamTrackListeners(this.videoTrack);
302
311
  this.emit('VIDEO_TRACK_CHANGE');
303
312
  }
304
313
  if (forceStopTrack) {
@@ -515,7 +524,10 @@ class LocalMediaHandler extends _events.EventEmitter {
515
524
  return;
516
525
  }
517
526
  if (audioTrack === undefined) {
518
- this.stopAudioTrack();
527
+ var _this$rawAudioTrack2, _this$rawAudioTrack3;
528
+ (_this$rawAudioTrack2 = this.rawAudioTrack) === null || _this$rawAudioTrack2 === void 0 || _this$rawAudioTrack2.stop();
529
+ (_this$rawAudioTrack3 = this.rawAudioTrack) === null || _this$rawAudioTrack3 === void 0 || _this$rawAudioTrack3.release();
530
+ this.rawAudioTrack = undefined;
519
531
  }
520
532
  this.audioTrack = audioTrack;
521
533
  }
@@ -524,7 +536,10 @@ class LocalMediaHandler extends _events.EventEmitter {
524
536
  return;
525
537
  }
526
538
  if (videoTrack === undefined) {
527
- this.stopVideoTrack();
539
+ var _this$rawVideoTrack2, _this$rawVideoTrack3;
540
+ (_this$rawVideoTrack2 = this.rawVideoTrack) === null || _this$rawVideoTrack2 === void 0 || _this$rawVideoTrack2.stop();
541
+ (_this$rawVideoTrack3 = this.rawVideoTrack) === null || _this$rawVideoTrack3 === void 0 || _this$rawVideoTrack3.release();
542
+ this.rawVideoTrack = undefined;
528
543
  }
529
544
  this.videoTrack = videoTrack;
530
545
  }
@@ -626,7 +641,10 @@ class LocalMediaHandler extends _events.EventEmitter {
626
641
  return;
627
642
  }
628
643
  if (this.videoEnabled) {
629
- this.stopVideoTrack();
644
+ var _this$rawVideoTrack4, _this$rawVideoTrack5;
645
+ (_this$rawVideoTrack4 = this.rawVideoTrack) === null || _this$rawVideoTrack4 === void 0 || _this$rawVideoTrack4.stop();
646
+ (_this$rawVideoTrack5 = this.rawVideoTrack) === null || _this$rawVideoTrack5 === void 0 || _this$rawVideoTrack5.release();
647
+ this.rawVideoTrack = undefined;
630
648
  this.videoEnabled = false;
631
649
  return;
632
650
  }
@@ -642,7 +660,10 @@ class LocalMediaHandler extends _events.EventEmitter {
642
660
  }
643
661
  async setVideoDevice(device) {
644
662
  if (this.videoEnabled) {
645
- this.stopVideoTrack();
663
+ var _this$rawVideoTrack6, _this$rawVideoTrack7;
664
+ (_this$rawVideoTrack6 = this.rawVideoTrack) === null || _this$rawVideoTrack6 === void 0 || _this$rawVideoTrack6.stop();
665
+ (_this$rawVideoTrack7 = this.rawVideoTrack) === null || _this$rawVideoTrack7 === void 0 || _this$rawVideoTrack7.release();
666
+ this.rawVideoTrack = undefined;
646
667
  }
647
668
  await this.setupVideoStream(device.deviceId);
648
669
  }
@@ -655,12 +676,12 @@ class LocalMediaHandler extends _events.EventEmitter {
655
676
  async oniOSBroadcastStart() {
656
677
  this.setScreenShareTracks(await _LocalMediaUtils.default.getScreenShareTracks());
657
678
  this.screenShareEnabled = true;
658
- this.emit('SCREENSHARE_TRACK_CHANGE');
679
+ _classPrivateFieldSet(_screenShareState, this, 'STARTED');
659
680
  }
660
681
  async oniOSBroadcastStop() {
682
+ _classPrivateFieldSet(_screenShareState, this, 'STOPPED');
661
683
  if (this.screenShareEnabled) {
662
684
  this.removeScreenShareTracks();
663
- this.emit('SCREENSHARE_TRACK_CHANGE');
664
685
  return;
665
686
  }
666
687
  }
@@ -679,6 +700,22 @@ class LocalMediaHandler extends _events.EventEmitter {
679
700
  }
680
701
  if (_reactNative.Platform.OS === 'ios' && this.screenShareEnabled) {
681
702
  _reactNative.NativeModules.RTKScreensharePickerView.showScreenSharePickerView();
703
+ _classPrivateFieldSet(_screenShareState, this, 'PENDING');
704
+ await new Promise((resolve, reject) => {
705
+ let timeoutId;
706
+ let time = 0;
707
+ timeoutId = setInterval(() => {
708
+ if (_classPrivateFieldGet(_screenShareState, this) === 'STOPPED') {
709
+ clearInterval(timeoutId);
710
+ resolve();
711
+ }
712
+ time = time + 100;
713
+ if (time > 20000) {
714
+ clearInterval(timeoutId);
715
+ reject('Timeout exceeded for disableScreenShare()');
716
+ }
717
+ }, 100);
718
+ });
682
719
  return;
683
720
  }
684
721
  if (_reactNative.Platform.OS === 'android') {
@@ -700,7 +737,23 @@ class LocalMediaHandler extends _events.EventEmitter {
700
737
  }
701
738
  }
702
739
  if (_reactNative.Platform.OS === 'ios') {
740
+ _classPrivateFieldSet(_screenShareState, this, 'PENDING');
703
741
  _reactNative.NativeModules.RTKScreensharePickerView.showScreenSharePickerView();
742
+ await new Promise((resolve, reject) => {
743
+ let timeoutId;
744
+ let time = 0;
745
+ timeoutId = setInterval(() => {
746
+ if (_classPrivateFieldGet(_screenShareState, this) === 'STARTED') {
747
+ clearInterval(timeoutId);
748
+ resolve();
749
+ }
750
+ time = time + 100;
751
+ if (time > 20000) {
752
+ clearInterval(timeoutId);
753
+ reject('Timeout exceeded for enableScreenShare()');
754
+ }
755
+ }, 100);
756
+ });
704
757
  }
705
758
  }
706
759
  async enableScreenShare() {
@@ -845,34 +898,26 @@ class LocalMediaHandler extends _events.EventEmitter {
845
898
  return super.on(event, listener);
846
899
  }
847
900
  destruct() {
848
- _classPrivateFieldGet(_localMediaUtils, this).destruct();
901
+ this.stopAudioTrack();
902
+ this.stopVideoTrack();
903
+ this.stopScreenShareTracks();
849
904
  if (_reactNative.Platform.OS === 'android') _classPrivateFieldGet(_appStateSubscription, this).remove();
850
- _BackgroundHandler.default.stop();
851
- try {
852
- if (_reactNative.Platform.OS === 'android') {
853
- RTKHelper.isForegroundServiceRunning().then(val => {
854
- if (val) {
855
- RTKHelper.stopService();
856
- }
857
- });
858
- }
859
- } catch (_err) {}
860
905
  }
861
906
  stopAudioTrack() {
862
- var _this$rawAudioTrack2, _this$audioTrack3, _this$rawAudioTrack3, _this$audioTrack4;
863
- (_this$rawAudioTrack2 = this.rawAudioTrack) === null || _this$rawAudioTrack2 === void 0 || _this$rawAudioTrack2.stop();
907
+ var _this$rawAudioTrack4, _this$audioTrack3, _this$rawAudioTrack5, _this$audioTrack4;
908
+ (_this$rawAudioTrack4 = this.rawAudioTrack) === null || _this$rawAudioTrack4 === void 0 || _this$rawAudioTrack4.stop();
864
909
  (_this$audioTrack3 = this.audioTrack) === null || _this$audioTrack3 === void 0 || _this$audioTrack3.stop();
865
- (_this$rawAudioTrack3 = this.rawAudioTrack) === null || _this$rawAudioTrack3 === void 0 || _this$rawAudioTrack3.release();
910
+ (_this$rawAudioTrack5 = this.rawAudioTrack) === null || _this$rawAudioTrack5 === void 0 || _this$rawAudioTrack5.release();
866
911
  (_this$audioTrack4 = this.audioTrack) === null || _this$audioTrack4 === void 0 || _this$audioTrack4.release();
867
912
  this.audioEnabled = false;
868
913
  this.audioTrack = undefined;
869
914
  this.rawAudioTrack = undefined;
870
915
  }
871
916
  stopVideoTrack() {
872
- var _this$rawVideoTrack2, _this$videoTrack3, _this$rawVideoTrack3, _this$videoTrack4;
873
- (_this$rawVideoTrack2 = this.rawVideoTrack) === null || _this$rawVideoTrack2 === void 0 || _this$rawVideoTrack2.stop();
917
+ var _this$rawVideoTrack8, _this$videoTrack3, _this$rawVideoTrack9, _this$videoTrack4;
918
+ (_this$rawVideoTrack8 = this.rawVideoTrack) === null || _this$rawVideoTrack8 === void 0 || _this$rawVideoTrack8.stop();
874
919
  (_this$videoTrack3 = this.videoTrack) === null || _this$videoTrack3 === void 0 || _this$videoTrack3.stop();
875
- (_this$rawVideoTrack3 = this.rawVideoTrack) === null || _this$rawVideoTrack3 === void 0 || _this$rawVideoTrack3.release();
920
+ (_this$rawVideoTrack9 = this.rawVideoTrack) === null || _this$rawVideoTrack9 === void 0 || _this$rawVideoTrack9.release();
876
921
  (_this$videoTrack4 = this.videoTrack) === null || _this$videoTrack4 === void 0 || _this$videoTrack4.release();
877
922
  this.videoTrack = undefined;
878
923
  this.rawVideoTrack = undefined;