@cloudflare/realtimekit-react-native 0.1.3 → 0.1.4-staging.10

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 (91) hide show
  1. package/lib/commonjs/AudioSampleHandler.js +61 -0
  2. package/lib/commonjs/AudioSampleHandler.js.map +1 -0
  3. package/lib/commonjs/BackgroundHandler.js +109 -0
  4. package/lib/commonjs/BackgroundHandler.js.map +1 -0
  5. package/lib/commonjs/DeviceInfo.js +37 -0
  6. package/lib/commonjs/DeviceInfo.js.map +1 -0
  7. package/lib/commonjs/LocalMediaError.js +18 -0
  8. package/lib/commonjs/LocalMediaError.js.map +1 -0
  9. package/lib/commonjs/LocalMediaHandler.js +791 -0
  10. package/lib/commonjs/LocalMediaHandler.js.map +1 -0
  11. package/lib/commonjs/LocalMediaInterfaces.js +2 -0
  12. package/lib/commonjs/LocalMediaInterfaces.js.map +1 -0
  13. package/lib/commonjs/LocalMediaUtils.js +298 -0
  14. package/lib/commonjs/LocalMediaUtils.js.map +1 -0
  15. package/lib/commonjs/NativeAudioManager.js +72 -0
  16. package/lib/commonjs/NativeAudioManager.js.map +1 -0
  17. package/lib/commonjs/PermissionHandler.js +157 -0
  18. package/lib/commonjs/PermissionHandler.js.map +1 -0
  19. package/lib/commonjs/ReactContext.js +116 -0
  20. package/lib/commonjs/ReactContext.js.map +1 -0
  21. package/lib/commonjs/ReactHooks.js +99 -0
  22. package/lib/commonjs/ReactHooks.js.map +1 -0
  23. package/lib/commonjs/index.js +95 -0
  24. package/lib/commonjs/index.js.map +1 -0
  25. package/lib/commonjs/utils/constants.js +7 -0
  26. package/lib/commonjs/utils/constants.js.map +1 -0
  27. package/lib/commonjs/utils/crypto.js +76 -0
  28. package/lib/commonjs/utils/crypto.js.map +1 -0
  29. package/lib/commonjs/utils/version.js +8 -0
  30. package/lib/commonjs/utils/version.js.map +1 -0
  31. package/lib/module/AudioSampleHandler.js +54 -0
  32. package/lib/module/AudioSampleHandler.js.map +1 -0
  33. package/lib/module/BackgroundHandler.js +103 -0
  34. package/lib/module/BackgroundHandler.js.map +1 -0
  35. package/lib/module/DeviceInfo.js +31 -0
  36. package/lib/module/DeviceInfo.js.map +1 -0
  37. package/lib/module/LocalMediaError.js +11 -0
  38. package/lib/module/LocalMediaError.js.map +1 -0
  39. package/lib/module/LocalMediaHandler.js +784 -0
  40. package/lib/module/LocalMediaHandler.js.map +1 -0
  41. package/lib/module/LocalMediaInterfaces.js +2 -0
  42. package/lib/module/LocalMediaInterfaces.js.map +1 -0
  43. package/lib/module/LocalMediaUtils.js +290 -0
  44. package/lib/module/LocalMediaUtils.js.map +1 -0
  45. package/lib/module/NativeAudioManager.js +65 -0
  46. package/lib/module/NativeAudioManager.js.map +1 -0
  47. package/lib/module/PermissionHandler.js +149 -0
  48. package/lib/module/PermissionHandler.js.map +1 -0
  49. package/lib/module/ReactContext.js +107 -0
  50. package/lib/module/ReactContext.js.map +1 -0
  51. package/lib/module/ReactHooks.js +75 -0
  52. package/lib/module/ReactHooks.js.map +1 -0
  53. package/lib/module/index.js +58 -0
  54. package/lib/module/index.js.map +1 -0
  55. package/lib/module/utils/constants.js +5 -0
  56. package/lib/module/utils/constants.js.map +1 -0
  57. package/lib/module/utils/crypto.js +74 -0
  58. package/lib/module/utils/crypto.js.map +1 -0
  59. package/lib/module/utils/version.js +2 -0
  60. package/lib/module/utils/version.js.map +1 -0
  61. package/lib/typescript/DeviceInfo.d.ts +9 -0
  62. package/lib/{LocalMediaHandler.d.ts → typescript/LocalMediaHandler.d.ts} +0 -4
  63. package/lib/{ReactHooks.d.ts → typescript/ReactHooks.d.ts} +2 -2
  64. package/lib/typescript/utils/constants.d.ts +1 -0
  65. package/lib/typescript/utils/version.d.ts +1 -0
  66. package/package.json +6 -7
  67. package/plugin/build/withRTK.js +43 -17
  68. package/plugin/src/withRTK.ts +55 -25
  69. package/android/src/main/res/values/strings.xml +0 -3
  70. package/lib/AudioSampleHandler.js +0 -57
  71. package/lib/BackgroundHandler.js +0 -100
  72. package/lib/LocalMediaError.js +0 -6
  73. package/lib/LocalMediaHandler.js +0 -860
  74. package/lib/LocalMediaInterfaces.js +0 -1
  75. package/lib/LocalMediaUtils.js +0 -288
  76. package/lib/NativeAudioManager.js +0 -93
  77. package/lib/PermissionHandler.js +0 -179
  78. package/lib/ReactContext.js +0 -90
  79. package/lib/ReactHooks.js +0 -80
  80. package/lib/index.js +0 -52
  81. package/lib/utils/crypto.js +0 -82
  82. /package/lib/{AudioSampleHandler.d.ts → typescript/AudioSampleHandler.d.ts} +0 -0
  83. /package/lib/{BackgroundHandler.d.ts → typescript/BackgroundHandler.d.ts} +0 -0
  84. /package/lib/{LocalMediaError.d.ts → typescript/LocalMediaError.d.ts} +0 -0
  85. /package/lib/{LocalMediaInterfaces.d.ts → typescript/LocalMediaInterfaces.d.ts} +0 -0
  86. /package/lib/{LocalMediaUtils.d.ts → typescript/LocalMediaUtils.d.ts} +0 -0
  87. /package/lib/{NativeAudioManager.d.ts → typescript/NativeAudioManager.d.ts} +0 -0
  88. /package/lib/{PermissionHandler.d.ts → typescript/PermissionHandler.d.ts} +0 -0
  89. /package/lib/{ReactContext.d.ts → typescript/ReactContext.d.ts} +0 -0
  90. /package/lib/{index.d.ts → typescript/index.d.ts} +0 -0
  91. /package/lib/{utils → typescript/utils}/crypto.d.ts +0 -0
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@cloudflare/realtimekit-react-native",
3
- "version": "0.1.3",
3
+ "version": "0.1.4-staging.10",
4
4
  "description": "Cloudflare RealtimeKit SDK for react native",
5
- "main": "lib/index.js",
5
+ "main": "lib/commonjs/index",
6
6
  "author": "Cloudflare",
7
7
  "homepage": "https://realtime.cloudflare.com",
8
- "types": "lib/index.d.ts",
8
+ "module": "lib/module/index",
9
+ "types": "lib/typescript/index.d.ts",
9
10
  "files": [
10
11
  "lib",
11
12
  "android",
@@ -25,7 +26,7 @@
25
26
  },
26
27
  "private": false,
27
28
  "dependencies": {
28
- "@cloudflare/realtimekit": "1.1.5",
29
+ "@cloudflare/realtimekit": "1.1.7",
29
30
  "events": "^3.3.0",
30
31
  "fast-base64-decode": "1.0.0",
31
32
  "node-libs-react-native": "^1.2.1",
@@ -44,9 +45,7 @@
44
45
  "react-native": "*"
45
46
  },
46
47
  "publishConfig": {
47
- "registry": "https://registry.npmjs.org/",
48
- "access": "public",
49
- "tag": "latest"
48
+ "tag": "staging"
50
49
  },
51
50
  "scripts": {
52
51
  "postpublish": "mv package.json.bak package.json"
@@ -3,8 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const config_plugins_1 = require("@expo/config-plugins");
4
4
  const MICROPHONE = 'Allow $(PRODUCT_NAME) to access the microphone';
5
5
  const CAMERA = 'Allow $(PRODUCT_NAME) to access the camera';
6
- const BLUETOOTH = 'Allow $(PRODUCT_NAME) to access the bluetooth';
7
- const BLUETOOTH_ALWAYS = 'Allow $(PRODUCT_NAME) to access the bluetooth';
8
6
  const LIBRARY = 'Allow $(PRODUCT_NAME) to access the files';
9
7
  /**
10
8
  * Adds `NSMicrophoneUsageDescription` and `NSSpeechRecognitionUsageDescription` to the `Info.plist`.
@@ -13,7 +11,7 @@ const LIBRARY = 'Allow $(PRODUCT_NAME) to access the files';
13
11
  * @param props.microphonePermission microphone permission message
14
12
  * @returns
15
13
  */
16
- const withIosPermissions = (c, { microphonePermission, cameraPermission, libraryPermission, bluetoothPermission, bluetoothAlwaysPermission, } = {}) => {
14
+ const withIosPermissions = (c, { microphonePermission, cameraPermission, libraryPermission } = {}) => {
17
15
  return (0, config_plugins_1.withInfoPlist)(c, (config) => {
18
16
  if (microphonePermission !== false) {
19
17
  config.modResults.NSMicrophoneUsageDescription =
@@ -27,18 +25,6 @@ const withIosPermissions = (c, { microphonePermission, cameraPermission, library
27
25
  config.modResults.NSCameraUsageDescription ||
28
26
  CAMERA;
29
27
  }
30
- if (bluetoothPermission !== false) {
31
- config.modResults.NSBluetoothPeripheralUsageDescription =
32
- bluetoothPermission ||
33
- config.modResults.NSBluetoothPeripheralUsageDescription ||
34
- BLUETOOTH;
35
- }
36
- if (bluetoothAlwaysPermission !== false) {
37
- config.modResults.NSBluetoothAlwaysUsageDescription =
38
- bluetoothAlwaysPermission ||
39
- config.modResults.NSBluetoothAlwaysUsageDescription ||
40
- BLUETOOTH_ALWAYS;
41
- }
42
28
  if (libraryPermission !== false) {
43
29
  config.modResults.NSPhotoLibraryUsageDescription =
44
30
  libraryPermission ||
@@ -81,20 +67,60 @@ const withAndroidPermissions = (config) => {
81
67
  'android.permission.SYSTEM_ALERT_WINDOW',
82
68
  'android.permission.WAKE_LOCK',
83
69
  'android.permission.FOREGROUND_SERVICE',
84
- 'android.permission.FOREGROUND_SERVICE_CAMERA',
85
- 'android.permission.FOREGROUND_SERVICE_MICROPHONE',
86
70
  'android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION',
87
71
  'android.permission.WRITE_EXTERNAL_STORAGE',
88
72
  'android.permission.READ_EXTERNAL_STORAGE',
89
73
  'android.permission.MICROPHONE',
90
74
  ]);
91
75
  };
76
+ const withAndroidScreenshare = (config) => {
77
+ return (0, config_plugins_1.withAndroidManifest)(config, (_config) => {
78
+ const manifest = _config.modResults;
79
+ const app = manifest.manifest.application?.[0];
80
+ if (app) {
81
+ // Avoid duplicate entries
82
+ const exists = (app.service || []).some((service) => service.$['android:name'] ===
83
+ 'com.cloudflare.realtimekit.ForegroundService');
84
+ if (!exists) {
85
+ app.service = [
86
+ ...(app.service || []),
87
+ {
88
+ $: {
89
+ 'android:enabled': 'true',
90
+ 'android:foregroundServiceType': 'mediaProjection',
91
+ 'android:name': 'com.cloudflare.realtimekit.ForegroundService',
92
+ },
93
+ },
94
+ ];
95
+ }
96
+ }
97
+ return _config;
98
+ });
99
+ };
100
+ const withAndroidBlobProviderAuthority = (config) => {
101
+ return (0, config_plugins_1.withStringsXml)(config, async (_config) => {
102
+ // Avoid duplicates
103
+ const existing = _config.modResults.resources.string?.find((item) => item.$.name === 'blob_provider_authority');
104
+ if (!existing) {
105
+ _config.modResults.resources.string = [
106
+ ...(_config.modResults.resources.string || []),
107
+ {
108
+ $: { name: 'blob_provider_authority' },
109
+ _: 'com.cloudflare.realtimekit.expo.blobs',
110
+ },
111
+ ];
112
+ }
113
+ return _config;
114
+ });
115
+ };
92
116
  const withVoice = (config, props = {}) => {
93
117
  const _props = props ? props : {};
94
118
  config = withIosPermissions(config, _props);
95
119
  if (_props.microphonePermission !== false) {
96
120
  config = withAndroidPermissions(config);
97
121
  }
122
+ config = withAndroidScreenshare(config);
123
+ config = withAndroidBlobProviderAuthority(config);
98
124
  return config;
99
125
  };
100
126
  exports.default = (0, config_plugins_1.createRunOncePlugin)(withVoice, '@cloudflare/realtimekit-react-native');
@@ -1,14 +1,15 @@
1
1
  import {
2
2
  AndroidConfig,
3
+ AndroidManifest,
3
4
  ConfigPlugin,
4
5
  createRunOncePlugin,
6
+ withAndroidManifest,
5
7
  withInfoPlist,
8
+ withStringsXml,
6
9
  } from '@expo/config-plugins';
7
10
 
8
11
  const MICROPHONE = 'Allow $(PRODUCT_NAME) to access the microphone';
9
12
  const CAMERA = 'Allow $(PRODUCT_NAME) to access the camera';
10
- const BLUETOOTH = 'Allow $(PRODUCT_NAME) to access the bluetooth';
11
- const BLUETOOTH_ALWAYS = 'Allow $(PRODUCT_NAME) to access the bluetooth';
12
13
  const LIBRARY = 'Allow $(PRODUCT_NAME) to access the files';
13
14
 
14
15
  export type Props = {
@@ -47,13 +48,7 @@ export type Props = {
47
48
  */
48
49
  const withIosPermissions: ConfigPlugin<Props> = (
49
50
  c,
50
- {
51
- microphonePermission,
52
- cameraPermission,
53
- libraryPermission,
54
- bluetoothPermission,
55
- bluetoothAlwaysPermission,
56
- } = {}
51
+ { microphonePermission, cameraPermission, libraryPermission } = {}
57
52
  ) => {
58
53
  return withInfoPlist(c, (config) => {
59
54
  if (microphonePermission !== false) {
@@ -70,20 +65,6 @@ const withIosPermissions: ConfigPlugin<Props> = (
70
65
  CAMERA;
71
66
  }
72
67
 
73
- if (bluetoothPermission !== false) {
74
- config.modResults.NSBluetoothPeripheralUsageDescription =
75
- bluetoothPermission ||
76
- config.modResults.NSBluetoothPeripheralUsageDescription ||
77
- BLUETOOTH;
78
- }
79
-
80
- if (bluetoothAlwaysPermission !== false) {
81
- config.modResults.NSBluetoothAlwaysUsageDescription =
82
- bluetoothAlwaysPermission ||
83
- config.modResults.NSBluetoothAlwaysUsageDescription ||
84
- BLUETOOTH_ALWAYS;
85
- }
86
-
87
68
  if (libraryPermission !== false) {
88
69
  config.modResults.NSPhotoLibraryUsageDescription =
89
70
  libraryPermission ||
@@ -129,8 +110,6 @@ const withAndroidPermissions: ConfigPlugin = (config) => {
129
110
  'android.permission.SYSTEM_ALERT_WINDOW',
130
111
  'android.permission.WAKE_LOCK',
131
112
  'android.permission.FOREGROUND_SERVICE',
132
- 'android.permission.FOREGROUND_SERVICE_CAMERA',
133
- 'android.permission.FOREGROUND_SERVICE_MICROPHONE',
134
113
  'android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION',
135
114
  'android.permission.WRITE_EXTERNAL_STORAGE',
136
115
  'android.permission.READ_EXTERNAL_STORAGE',
@@ -138,12 +117,63 @@ const withAndroidPermissions: ConfigPlugin = (config) => {
138
117
  ]);
139
118
  };
140
119
 
120
+ const withAndroidScreenshare: ConfigPlugin = (config) => {
121
+ return withAndroidManifest(config, (_config) => {
122
+ const manifest = _config.modResults as AndroidManifest;
123
+ const app = manifest.manifest.application?.[0];
124
+
125
+ if (app) {
126
+ // Avoid duplicate entries
127
+ const exists = (app.service || []).some(
128
+ (service) =>
129
+ service.$['android:name'] ===
130
+ 'com.cloudflare.realtimekit.ForegroundService'
131
+ );
132
+ if (!exists) {
133
+ app.service = [
134
+ ...(app.service || []),
135
+ {
136
+ $: {
137
+ 'android:enabled': 'true',
138
+ 'android:foregroundServiceType': 'mediaProjection',
139
+ 'android:name': 'com.cloudflare.realtimekit.ForegroundService',
140
+ },
141
+ },
142
+ ];
143
+ }
144
+ }
145
+
146
+ return _config;
147
+ });
148
+ };
149
+
150
+ const withAndroidBlobProviderAuthority: ConfigPlugin = (config) => {
151
+ return withStringsXml(config, async (_config) => {
152
+ // Avoid duplicates
153
+ const existing = _config.modResults.resources.string?.find(
154
+ (item) => item.$.name === 'blob_provider_authority'
155
+ );
156
+ if (!existing) {
157
+ _config.modResults.resources.string = [
158
+ ...(_config.modResults.resources.string || []),
159
+ {
160
+ $: { name: 'blob_provider_authority' },
161
+ _: 'com.cloudflare.realtimekit.expo.blobs',
162
+ },
163
+ ];
164
+ }
165
+ return _config;
166
+ });
167
+ };
168
+
141
169
  const withVoice: ConfigPlugin<Props | void> = (config, props = {}) => {
142
170
  const _props = props ? props : {};
143
171
  config = withIosPermissions(config, _props);
144
172
  if (_props.microphonePermission !== false) {
145
173
  config = withAndroidPermissions(config);
146
174
  }
175
+ config = withAndroidScreenshare(config);
176
+ config = withAndroidBlobProviderAuthority(config);
147
177
  return config;
148
178
  };
149
179
 
@@ -1,3 +0,0 @@
1
- <resources>
2
- <string name="blob_provider_authority">com.cloudflare.realtimekit.blobs</string>
3
- </resources>
@@ -1,57 +0,0 @@
1
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
- return new (P || (P = Promise))(function (resolve, reject) {
4
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
- step((generator = generator.apply(thisArg, _arguments || [])).next());
8
- });
9
- };
10
- import { NativeEventEmitter, NativeModules, Platform, } from 'react-native';
11
- import { EventEmitter } from 'events';
12
- const { WebRTCModule } = NativeModules;
13
- export default class AudioSampleHandler extends EventEmitter {
14
- constructor() {
15
- super();
16
- this._isListening = false;
17
- this.webRTCModuleEmitter = new NativeEventEmitter(WebRTCModule);
18
- this._audioSampleHandler = this._audioSampleHandler.bind(this);
19
- this._currentSamples = new Float32Array(1024);
20
- this.initialiseSampler();
21
- }
22
- static init() {
23
- return __awaiter(this, void 0, void 0, function* () {
24
- return new AudioSampleHandler();
25
- });
26
- }
27
- _audioSampleHandler(audioData) {
28
- this._currentSamples.fill(0);
29
- if (Platform.OS === 'android') {
30
- this._currentSamples.set(audioData);
31
- }
32
- else {
33
- this._currentSamples.set(audioData.samples);
34
- }
35
- }
36
- initialiseSampler() {
37
- this._audioSamplesListener = this.webRTCModuleEmitter.addListener('audioSamples', this._audioSampleHandler);
38
- this._isListening = true;
39
- }
40
- getFloatTimeDomainData(samples) {
41
- if (!this._isListening) {
42
- this.initialiseSampler();
43
- }
44
- samples.set(this._currentSamples);
45
- }
46
- stopListening() {
47
- if (this._audioSamplesListener) {
48
- this._audioSamplesListener.remove();
49
- this._audioSamplesListener = undefined;
50
- this._isListening = false;
51
- this._currentSamples.fill(0);
52
- }
53
- }
54
- destructor() {
55
- this.stopListening();
56
- }
57
- }
@@ -1,100 +0,0 @@
1
- import { DeviceEventEmitter, NativeAppEventEmitter, NativeEventEmitter, NativeModules, Platform, } from 'react-native';
2
- const { RTKRNBackgroundTimer } = NativeModules;
3
- const Emitter = new NativeEventEmitter(RTKRNBackgroundTimer);
4
- class BackgroundTimer {
5
- constructor() {
6
- this.uniqueId = 0;
7
- this.callbacks = {};
8
- Emitter.addListener('backgroundTimer.timeout', (id) => {
9
- if (this.callbacks[id]) {
10
- const callbackById = this.callbacks[id];
11
- const { callback } = callbackById;
12
- if (!this.callbacks[id].interval) {
13
- delete this.callbacks[id];
14
- }
15
- else {
16
- Platform.OS === 'android'
17
- ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(id, this.callbacks[id].timeout)
18
- : RTKRNBackgroundTimer.setTimeout(id, this.callbacks[id].timeout);
19
- }
20
- callback();
21
- }
22
- });
23
- }
24
- init() {
25
- return new BackgroundTimer();
26
- }
27
- // Original API
28
- start(delay = 0) {
29
- return Platform.OS === 'android'
30
- ? RTKRNBackgroundTimer.backgroundTimerStart(delay)
31
- : RTKRNBackgroundTimer.start(delay);
32
- }
33
- stop() {
34
- Emitter.removeAllListeners('backgroundTimer.timeout');
35
- return Platform.OS === 'android'
36
- ? RTKRNBackgroundTimer.backgroundTimerStop()
37
- : RTKRNBackgroundTimer.stop();
38
- }
39
- runBackgroundTimer(callback, delay) {
40
- const EventEmitter = Platform.select({
41
- ios: () => NativeAppEventEmitter,
42
- android: () => DeviceEventEmitter,
43
- })();
44
- this.start(0);
45
- this.backgroundListener = EventEmitter.addListener('backgroundTimer', () => {
46
- this.backgroundListener.remove();
47
- this.backgroundClockMethod(callback, delay);
48
- });
49
- }
50
- backgroundClockMethod(callback, delay) {
51
- this.backgroundTimer = this.setTimeout(() => {
52
- callback();
53
- this.backgroundClockMethod(callback, delay);
54
- }, delay);
55
- }
56
- stopBackgroundTimer() {
57
- this.stop();
58
- this.clearTimeout(this.backgroundTimer);
59
- }
60
- // New API, allowing for multiple timers
61
- setTimeout(callback, timeout) {
62
- this.uniqueId += 1;
63
- const timeoutId = this.uniqueId;
64
- this.callbacks[timeoutId] = {
65
- callback,
66
- interval: false,
67
- timeout,
68
- };
69
- Platform.OS === 'android'
70
- ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(timeoutId, timeout)
71
- : RTKRNBackgroundTimer.setTimeout(timeoutId, timeout);
72
- return timeoutId;
73
- }
74
- clearTimeout(timeoutId) {
75
- if (this.callbacks[timeoutId]) {
76
- delete this.callbacks[timeoutId];
77
- // RTKRNBackgroundTimer.clearTimeout(timeoutId);
78
- }
79
- }
80
- setInterval(callback, timeout) {
81
- this.uniqueId += 1;
82
- const intervalId = this.uniqueId;
83
- this.callbacks[intervalId] = {
84
- callback,
85
- interval: true,
86
- timeout,
87
- };
88
- Platform.OS === 'android'
89
- ? RTKRNBackgroundTimer.backgroundTimerSetTimeout(intervalId, timeout)
90
- : RTKRNBackgroundTimer.setTimeout(intervalId, timeout);
91
- return intervalId;
92
- }
93
- clearInterval(intervalId) {
94
- if (this.callbacks[intervalId]) {
95
- delete this.callbacks[intervalId];
96
- // RTKRNBackgroundTimer.clearTimeout(intervalId);
97
- }
98
- }
99
- }
100
- export default new BackgroundTimer();
@@ -1,6 +0,0 @@
1
- export default class LocalMediaError extends Error {
2
- constructor(message, code) {
3
- super(message);
4
- this.code = code;
5
- }
6
- }