@cloudflare/realtimekit-react-native 0.3.1 → 0.3.2-staging.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.
- package/lib/commonjs/AGENTS.md +58 -0
- package/lib/commonjs/AudioSampleHandler.js +4 -2
- package/lib/commonjs/AudioSampleHandler.js.map +1 -1
- package/lib/commonjs/BackgroundHandler.js +3 -3
- package/lib/commonjs/BackgroundHandler.js.map +1 -1
- package/lib/commonjs/LocalMediaHandler.js +77 -31
- package/lib/commonjs/LocalMediaHandler.js.map +1 -1
- package/lib/commonjs/LocalMediaUtils.js +3 -2
- package/lib/commonjs/LocalMediaUtils.js.map +1 -1
- package/lib/commonjs/ReactHooks.js +26 -0
- package/lib/commonjs/ReactHooks.js.map +1 -1
- package/lib/commonjs/utils/version.js +1 -1
- package/lib/commonjs/utils/version.js.map +1 -1
- package/lib/module/AGENTS.md +58 -0
- package/lib/module/AudioSampleHandler.js +3 -1
- package/lib/module/AudioSampleHandler.js.map +1 -1
- package/lib/module/BackgroundHandler.js +2 -2
- package/lib/module/BackgroundHandler.js.map +1 -1
- package/lib/module/LocalMediaHandler.js +76 -30
- package/lib/module/LocalMediaHandler.js.map +1 -1
- package/lib/module/LocalMediaUtils.js +2 -1
- package/lib/module/LocalMediaUtils.js.map +1 -1
- package/lib/module/ReactHooks.js +26 -0
- package/lib/module/ReactHooks.js.map +1 -1
- package/lib/module/utils/version.js +1 -1
- package/lib/module/utils/version.js.map +1 -1
- package/lib/typescript/AudioSampleHandler.d.ts +2 -0
- package/lib/typescript/BackgroundHandler.d.ts +2 -0
- package/lib/typescript/LocalMediaHandler.d.ts +2 -0
- package/lib/typescript/LocalMediaUtils.d.ts +2 -0
- package/lib/typescript/ReactHooks.d.ts +1 -1
- package/lib/typescript/utils/version.d.ts +1 -1
- package/package.json +2 -4
- package/plugin/tsconfig.tsbuildinfo +1 -1
|
@@ -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 =
|
|
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","
|
|
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
|
|
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
|
-
|
|
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","
|
|
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
|
-
|
|
142
|
+
_classPrivateFieldSet(_broadcastStartedSubscription, this, _classPrivateFieldGet(_broadcastEmitter, this).addListener('iOS_BroadcastStarted', () => {
|
|
134
143
|
this.oniOSBroadcastStart();
|
|
135
|
-
});
|
|
136
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,27 @@ class LocalMediaHandler extends _events.EventEmitter {
|
|
|
845
898
|
return super.on(event, listener);
|
|
846
899
|
}
|
|
847
900
|
destruct() {
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
RTKHelper.isForegroundServiceRunning().then(val => {
|
|
854
|
-
if (val) {
|
|
855
|
-
RTKHelper.stopService();
|
|
856
|
-
}
|
|
857
|
-
});
|
|
858
|
-
}
|
|
859
|
-
} catch (_err) {}
|
|
901
|
+
var _classPrivateFieldGet2;
|
|
902
|
+
this.stopAudioTrack();
|
|
903
|
+
this.stopVideoTrack();
|
|
904
|
+
this.stopScreenShareTracks();
|
|
905
|
+
if (_reactNative.Platform.OS === 'android') (_classPrivateFieldGet2 = _classPrivateFieldGet(_appStateSubscription, this)) === null || _classPrivateFieldGet2 === void 0 || _classPrivateFieldGet2.remove();
|
|
860
906
|
}
|
|
861
907
|
stopAudioTrack() {
|
|
862
|
-
var _this$
|
|
863
|
-
(_this$
|
|
908
|
+
var _this$rawAudioTrack4, _this$audioTrack3, _this$rawAudioTrack5, _this$audioTrack4;
|
|
909
|
+
(_this$rawAudioTrack4 = this.rawAudioTrack) === null || _this$rawAudioTrack4 === void 0 || _this$rawAudioTrack4.stop();
|
|
864
910
|
(_this$audioTrack3 = this.audioTrack) === null || _this$audioTrack3 === void 0 || _this$audioTrack3.stop();
|
|
865
|
-
(_this$
|
|
911
|
+
(_this$rawAudioTrack5 = this.rawAudioTrack) === null || _this$rawAudioTrack5 === void 0 || _this$rawAudioTrack5.release();
|
|
866
912
|
(_this$audioTrack4 = this.audioTrack) === null || _this$audioTrack4 === void 0 || _this$audioTrack4.release();
|
|
867
913
|
this.audioEnabled = false;
|
|
868
914
|
this.audioTrack = undefined;
|
|
869
915
|
this.rawAudioTrack = undefined;
|
|
870
916
|
}
|
|
871
917
|
stopVideoTrack() {
|
|
872
|
-
var _this$
|
|
873
|
-
(_this$
|
|
918
|
+
var _this$rawVideoTrack8, _this$videoTrack3, _this$rawVideoTrack9, _this$videoTrack4;
|
|
919
|
+
(_this$rawVideoTrack8 = this.rawVideoTrack) === null || _this$rawVideoTrack8 === void 0 || _this$rawVideoTrack8.stop();
|
|
874
920
|
(_this$videoTrack3 = this.videoTrack) === null || _this$videoTrack3 === void 0 || _this$videoTrack3.stop();
|
|
875
|
-
(_this$
|
|
921
|
+
(_this$rawVideoTrack9 = this.rawVideoTrack) === null || _this$rawVideoTrack9 === void 0 || _this$rawVideoTrack9.release();
|
|
876
922
|
(_this$videoTrack4 = this.videoTrack) === null || _this$videoTrack4 === void 0 || _this$videoTrack4.release();
|
|
877
923
|
this.videoTrack = undefined;
|
|
878
924
|
this.rawVideoTrack = undefined;
|