@cloudflare/realtimekit-react-native 1.1.0 → 1.2.0-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/README.md +2 -2
- package/android/src/main/AndroidManifest.xml +6 -1
- package/android/src/main/java/com/cloudflare/realtimekit/KeepAliveService.java +176 -0
- package/android/src/main/java/com/cloudflare/realtimekit/RTKHelperModule.java +27 -60
- package/lib/commonjs/LocalMediaHandler.js +114 -82
- package/lib/commonjs/LocalMediaHandler.js.map +1 -1
- package/lib/commonjs/LocalMediaUtils.js +3 -5
- package/lib/commonjs/LocalMediaUtils.js.map +1 -1
- package/lib/commonjs/ReactContext.js +33 -33
- package/lib/commonjs/ReactContext.js.map +1 -1
- package/lib/commonjs/ReactHooks.js +71 -15
- package/lib/commonjs/ReactHooks.js.map +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/utils/version.js +1 -1
- package/lib/commonjs/utils/version.js.map +1 -1
- package/lib/module/LocalMediaHandler.js +114 -82
- package/lib/module/LocalMediaHandler.js.map +1 -1
- package/lib/module/LocalMediaUtils.js +3 -5
- package/lib/module/LocalMediaUtils.js.map +1 -1
- package/lib/module/ReactContext.js +33 -33
- package/lib/module/ReactContext.js.map +1 -1
- package/lib/module/ReactHooks.js +71 -15
- package/lib/module/ReactHooks.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/utils/version.js +1 -1
- package/lib/module/utils/version.js.map +1 -1
- package/lib/typescript/LocalMediaHandler.d.ts +18 -4
- package/lib/typescript/ReactHooks.d.ts +22 -1
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/utils/version.d.ts +1 -1
- package/package.json +3 -5
- package/plugin/build/withRTK.js +50 -22
- package/plugin/src/withRTK.ts +58 -23
- package/android/src/main/java/com/cloudflare/realtimekit/ForegroundService.java +0 -46
- package/android/src/main/java/com/cloudflare/realtimekit/NotificationHelper.java +0 -126
|
@@ -5,40 +5,45 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
|
|
|
5
5
|
import React, { createContext, useContext, useEffect, useRef, useState } from 'react';
|
|
6
6
|
class RealtimeKitUpdates {
|
|
7
7
|
constructor(meeting) {
|
|
8
|
-
var _this$meeting$self, _this$meeting$meta, _this$meeting$partici, _this$meeting$partici2, _this$meeting$partici3, _this$meeting$partici4, _this$meeting$chat, _this$meeting$polls, _this$meeting$plugins, _this$meeting$
|
|
8
|
+
var _this$meeting$self, _this$meeting$connect, _this$meeting$meta, _this$meeting$partici, _this$meeting$partici2, _this$meeting$partici3, _this$meeting$partici4, _this$meeting$chat, _this$meeting$polls, _this$meeting$plugins, _this$meeting$recordi, _this$meeting$stage, _this$meeting$livestr;
|
|
9
9
|
_defineProperty(this, "meeting", void 0);
|
|
10
10
|
_defineProperty(this, "l", void 0);
|
|
11
|
+
_defineProperty(this, "update", () => {
|
|
12
|
+
this.l.forEach(l => {
|
|
13
|
+
l();
|
|
14
|
+
});
|
|
15
|
+
});
|
|
11
16
|
this.meeting = meeting;
|
|
12
17
|
this.l = new Set();
|
|
13
|
-
(_this$meeting$self = this.meeting.self) === null || _this$meeting$self === void 0 || _this$meeting$self.addListener('*', this.update
|
|
14
|
-
(_this$meeting$
|
|
15
|
-
(_this$meeting$
|
|
16
|
-
(_this$meeting$
|
|
17
|
-
(_this$meeting$
|
|
18
|
-
(_this$meeting$
|
|
19
|
-
(_this$meeting$
|
|
20
|
-
(_this$meeting$
|
|
21
|
-
(_this$meeting$
|
|
22
|
-
(_this$meeting$
|
|
23
|
-
(_this$meeting$recordi = this.meeting.recording) === null || _this$meeting$recordi === void 0 || _this$meeting$recordi.addListener('*', this.update
|
|
24
|
-
(_this$meeting$stage = this.meeting.stage) === null || _this$meeting$stage === void 0 || _this$meeting$stage.addListener('*', this.update
|
|
25
|
-
(_this$meeting$livestr = this.meeting.livestream) === null || _this$meeting$livestr === void 0 || _this$meeting$livestr.addListener('*', this.update
|
|
18
|
+
(_this$meeting$self = this.meeting.self) === null || _this$meeting$self === void 0 || _this$meeting$self.addListener('*', this.update);
|
|
19
|
+
(_this$meeting$connect = this.meeting.connectedMeetings) === null || _this$meeting$connect === void 0 || _this$meeting$connect.addListener('*', this.update);
|
|
20
|
+
(_this$meeting$meta = this.meeting.meta) === null || _this$meeting$meta === void 0 || _this$meeting$meta.addListener('*', this.update);
|
|
21
|
+
(_this$meeting$partici = this.meeting.participants) === null || _this$meeting$partici === void 0 || _this$meeting$partici.addListener('*', this.update);
|
|
22
|
+
(_this$meeting$partici2 = this.meeting.participants) === null || _this$meeting$partici2 === void 0 || (_this$meeting$partici2 = _this$meeting$partici2.joined) === null || _this$meeting$partici2 === void 0 || _this$meeting$partici2.addListener('*', this.update);
|
|
23
|
+
(_this$meeting$partici3 = this.meeting.participants) === null || _this$meeting$partici3 === void 0 || (_this$meeting$partici3 = _this$meeting$partici3.active) === null || _this$meeting$partici3 === void 0 || _this$meeting$partici3.addListener('*', this.update);
|
|
24
|
+
(_this$meeting$partici4 = this.meeting.participants) === null || _this$meeting$partici4 === void 0 || (_this$meeting$partici4 = _this$meeting$partici4.waitlisted) === null || _this$meeting$partici4 === void 0 || _this$meeting$partici4.addListener('*', this.update);
|
|
25
|
+
(_this$meeting$chat = this.meeting.chat) === null || _this$meeting$chat === void 0 || _this$meeting$chat.addListener('*', this.update);
|
|
26
|
+
(_this$meeting$polls = this.meeting.polls) === null || _this$meeting$polls === void 0 || _this$meeting$polls.addListener('*', this.update);
|
|
27
|
+
(_this$meeting$plugins = this.meeting.plugins) === null || _this$meeting$plugins === void 0 || (_this$meeting$plugins = _this$meeting$plugins.all) === null || _this$meeting$plugins === void 0 || _this$meeting$plugins.addListener('*', this.update);
|
|
28
|
+
(_this$meeting$recordi = this.meeting.recording) === null || _this$meeting$recordi === void 0 || _this$meeting$recordi.addListener('*', this.update);
|
|
29
|
+
(_this$meeting$stage = this.meeting.stage) === null || _this$meeting$stage === void 0 || _this$meeting$stage.addListener('*', this.update);
|
|
30
|
+
(_this$meeting$livestr = this.meeting.livestream) === null || _this$meeting$livestr === void 0 || _this$meeting$livestr.addListener('*', this.update);
|
|
26
31
|
}
|
|
27
32
|
clean() {
|
|
28
|
-
var _this$meeting$self2, _this$meeting$meta2, _this$meeting$partici5, _this$meeting$partici6, _this$meeting$partici7, _this$meeting$partici8, _this$meeting$chat2, _this$meeting$polls2, _this$meeting$
|
|
29
|
-
(_this$meeting$self2 = this.meeting.self) === null || _this$meeting$self2 === void 0 || _this$meeting$self2.removeListener('*', this.update
|
|
30
|
-
(_this$meeting$
|
|
31
|
-
(_this$meeting$
|
|
32
|
-
(_this$meeting$
|
|
33
|
-
(_this$meeting$
|
|
34
|
-
(_this$meeting$
|
|
35
|
-
(_this$meeting$
|
|
36
|
-
(_this$meeting$
|
|
37
|
-
(_this$meeting$
|
|
38
|
-
(_this$meeting$
|
|
39
|
-
(_this$meeting$recordi2 = this.meeting.recording) === null || _this$meeting$recordi2 === void 0 || _this$meeting$recordi2.removeListener('*', this.update
|
|
40
|
-
(_this$meeting$stage2 = this.meeting.stage) === null || _this$meeting$stage2 === void 0 || _this$meeting$stage2.removeListener('*', this.update
|
|
41
|
-
(_this$meeting$livestr2 = this.meeting.livestream) === null || _this$meeting$livestr2 === void 0 || _this$meeting$livestr2.removeListener('*', this.update
|
|
33
|
+
var _this$meeting$self2, _this$meeting$connect2, _this$meeting$meta2, _this$meeting$partici5, _this$meeting$partici6, _this$meeting$partici7, _this$meeting$partici8, _this$meeting$chat2, _this$meeting$polls2, _this$meeting$plugins2, _this$meeting$recordi2, _this$meeting$stage2, _this$meeting$livestr2;
|
|
34
|
+
(_this$meeting$self2 = this.meeting.self) === null || _this$meeting$self2 === void 0 || _this$meeting$self2.removeListener('*', this.update);
|
|
35
|
+
(_this$meeting$connect2 = this.meeting.connectedMeetings) === null || _this$meeting$connect2 === void 0 || _this$meeting$connect2.removeListener('*', this.update);
|
|
36
|
+
(_this$meeting$meta2 = this.meeting.meta) === null || _this$meeting$meta2 === void 0 || _this$meeting$meta2.removeListener('*', this.update);
|
|
37
|
+
(_this$meeting$partici5 = this.meeting.participants) === null || _this$meeting$partici5 === void 0 || _this$meeting$partici5.removeListener('*', this.update);
|
|
38
|
+
(_this$meeting$partici6 = this.meeting.participants) === null || _this$meeting$partici6 === void 0 || (_this$meeting$partici6 = _this$meeting$partici6.joined) === null || _this$meeting$partici6 === void 0 || _this$meeting$partici6.removeListener('*', this.update);
|
|
39
|
+
(_this$meeting$partici7 = this.meeting.participants) === null || _this$meeting$partici7 === void 0 || (_this$meeting$partici7 = _this$meeting$partici7.active) === null || _this$meeting$partici7 === void 0 || _this$meeting$partici7.removeListener('*', this.update);
|
|
40
|
+
(_this$meeting$partici8 = this.meeting.participants) === null || _this$meeting$partici8 === void 0 || (_this$meeting$partici8 = _this$meeting$partici8.waitlisted) === null || _this$meeting$partici8 === void 0 || _this$meeting$partici8.removeListener('*', this.update);
|
|
41
|
+
(_this$meeting$chat2 = this.meeting.chat) === null || _this$meeting$chat2 === void 0 || _this$meeting$chat2.removeListener('*', this.update);
|
|
42
|
+
(_this$meeting$polls2 = this.meeting.polls) === null || _this$meeting$polls2 === void 0 || _this$meeting$polls2.removeListener('*', this.update);
|
|
43
|
+
(_this$meeting$plugins2 = this.meeting.plugins) === null || _this$meeting$plugins2 === void 0 || (_this$meeting$plugins2 = _this$meeting$plugins2.all) === null || _this$meeting$plugins2 === void 0 || _this$meeting$plugins2.removeListener('*', this.update);
|
|
44
|
+
(_this$meeting$recordi2 = this.meeting.recording) === null || _this$meeting$recordi2 === void 0 || _this$meeting$recordi2.removeListener('*', this.update);
|
|
45
|
+
(_this$meeting$stage2 = this.meeting.stage) === null || _this$meeting$stage2 === void 0 || _this$meeting$stage2.removeListener('*', this.update);
|
|
46
|
+
(_this$meeting$livestr2 = this.meeting.livestream) === null || _this$meeting$livestr2 === void 0 || _this$meeting$livestr2.removeListener('*', this.update);
|
|
42
47
|
}
|
|
43
48
|
addListener(listener) {
|
|
44
49
|
this.l.add(listener);
|
|
@@ -46,11 +51,6 @@ class RealtimeKitUpdates {
|
|
|
46
51
|
removeListener(listener) {
|
|
47
52
|
this.l.delete(listener);
|
|
48
53
|
}
|
|
49
|
-
update() {
|
|
50
|
-
this.l.forEach(l => {
|
|
51
|
-
l();
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
54
|
}
|
|
55
55
|
export const RealtimeKitContext = /*#__PURE__*/createContext({
|
|
56
56
|
meeting: undefined,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["React","createContext","useContext","useEffect","useRef","useState","RealtimeKitUpdates","constructor","meeting","_this$meeting$self","_this$meeting$meta","_this$meeting$partici","_this$meeting$partici2","_this$meeting$partici3","_this$meeting$partici4","_this$meeting$chat","_this$meeting$polls","_this$meeting$plugins","_this$meeting$plugins2","_this$meeting$recordi","_this$meeting$stage","_this$meeting$livestr","_defineProperty","l","Set","self","addListener","update","bind","meta","participants","joined","active","pinned","chat","polls","plugins","all","recording","stage","livestream","clean","_this$meeting$self2","_this$meeting$meta2","_this$meeting$partici5","_this$meeting$partici6","_this$meeting$partici7","_this$meeting$partici8","_this$meeting$chat2","_this$meeting$polls2","_this$meeting$plugins3","_this$meeting$plugins4","_this$meeting$recordi2","_this$meeting$stage2","_this$meeting$livestr2","removeListener","listener","add","delete","forEach","RealtimeKitContext","undefined","updates","RealtimeKitProvider","value","children","fallback","setUpdates","updatesRef","newUpdate","current","_updatesRef$current","createElement","Provider","useRealtimeKitMeeting","Error"],"sources":["ReactContext.tsx"],"sourcesContent":["// @ts-nocheck\nimport React, {\n createContext,\n useContext,\n ReactChild,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport RealtimeKitClient from '@cloudflare/realtimekit';\n\ntype Listener = () => void;\nclass RealtimeKitUpdates {\n private meeting: RealtimeKitClient;\n\n private l: Set<Listener>;\n\n constructor(meeting: RealtimeKitClient) {\n this.meeting = meeting;\n this.l = new Set();\n this.meeting.self?.addListener('*', this.update.bind(this));\n this.meeting.meta?.addListener('*', this.update.bind(this));\n this.meeting.participants?.addListener('*', this.update.bind(this));\n this.meeting.participants?.joined?.addListener('*', this.update.bind(this));\n this.meeting.participants?.active?.addListener('*', this.update.bind(this));\n this.meeting.participants?.pinned?.addListener('*', this.update.bind(this));\n this.meeting.chat?.addListener('*', this.update.bind(this));\n this.meeting.polls?.addListener('*', this.update.bind(this));\n this.meeting.plugins?.all?.addListener('*', this.update.bind(this));\n this.meeting.plugins?.active?.addListener('*', this.update.bind(this));\n this.meeting.recording?.addListener('*', this.update.bind(this));\n this.meeting.stage?.addListener('*', this.update.bind(this));\n this.meeting.livestream?.addListener('*', this.update.bind(this));\n }\n\n clean() {\n this.meeting.self?.removeListener('*', this.update.bind(this));\n this.meeting.meta?.removeListener('*', this.update.bind(this));\n this.meeting.participants?.removeListener('*', this.update.bind(this));\n this.meeting.participants?.joined?.removeListener(\n '*',\n this.update.bind(this)\n );\n this.meeting.participants?.active?.removeListener(\n '*',\n this.update.bind(this)\n );\n this.meeting.participants?.pinned?.removeListener(\n '*',\n this.update.bind(this)\n );\n this.meeting.chat?.removeListener('*', this.update.bind(this));\n this.meeting.polls?.removeListener('*', this.update.bind(this));\n this.meeting.plugins?.all?.removeListener('*', this.update.bind(this));\n this.meeting.plugins?.active?.removeListener('*', this.update.bind(this));\n this.meeting.recording?.removeListener('*', this.update.bind(this));\n this.meeting.stage?.removeListener('*', this.update.bind(this));\n this.meeting.livestream?.removeListener('*', this.update.bind(this));\n }\n\n addListener(listener: Listener) {\n this.l.add(listener);\n }\n\n removeListener(listener: Listener) {\n this.l.delete(listener);\n }\n\n private update() {\n this.l.forEach((l) => {\n l();\n });\n }\n}\n\nexport const RealtimeKitContext = createContext<{\n meeting: RealtimeKitClient | undefined;\n updates: RealtimeKitUpdates | undefined;\n}>({\n meeting: undefined,\n updates: undefined,\n});\n\n/**\n * Provider component which makes the RealtimeKitClient object\n * available to nested components\n * @component\n * @param value The RealtimeKitClient instance from `useRealtimeKitClient()`\n * @param renderBeforeLoad The provider will not render children by default\n * until it gets a client object, renderBeforeLoad can be used to override that\n */\nexport function RealtimeKitProvider({\n value,\n children,\n fallback = null,\n}: {\n value: RealtimeKitClient | undefined;\n children: ReactChild | ReactChild[];\n fallback?: ReactChild | ReactChild[];\n}) {\n const [updates, setUpdates] = useState<RealtimeKitUpdates>();\n const updatesRef = useRef<RealtimeKitUpdates>();\n\n useEffect(() => {\n if (value) {\n const newUpdate = new RealtimeKitUpdates(value);\n setUpdates(newUpdate);\n updatesRef.current = newUpdate;\n }\n return () => {\n updatesRef.current?.clean();\n };\n }, [value]);\n\n return (\n <RealtimeKitContext.Provider\n value={{\n meeting: value,\n updates,\n }}\n >\n {value ? children : fallback}\n </RealtimeKitContext.Provider>\n );\n}\n\n/**\n * Hook which returns the reference to the RealtimeKitClient object\n * @returns meeting instance from `useRealtimeKitClient()`\n */\nexport const useRealtimeKitMeeting = () => {\n const { meeting } = useContext(RealtimeKitContext);\n if (!meeting)\n throw new Error(\n 'useRealtimeKitMeeting must be used within the RealtimeKitProvider'\n );\n\n return { meeting };\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["React","createContext","useContext","useEffect","useRef","useState","RealtimeKitUpdates","constructor","meeting","_this$meeting$self","_this$meeting$connect","_this$meeting$meta","_this$meeting$partici","_this$meeting$partici2","_this$meeting$partici3","_this$meeting$partici4","_this$meeting$chat","_this$meeting$polls","_this$meeting$plugins","_this$meeting$recordi","_this$meeting$stage","_this$meeting$livestr","_defineProperty","l","forEach","Set","self","addListener","update","connectedMeetings","meta","participants","joined","active","waitlisted","chat","polls","plugins","all","recording","stage","livestream","clean","_this$meeting$self2","_this$meeting$connect2","_this$meeting$meta2","_this$meeting$partici5","_this$meeting$partici6","_this$meeting$partici7","_this$meeting$partici8","_this$meeting$chat2","_this$meeting$polls2","_this$meeting$plugins2","_this$meeting$recordi2","_this$meeting$stage2","_this$meeting$livestr2","removeListener","listener","add","delete","RealtimeKitContext","undefined","updates","RealtimeKitProvider","value","children","fallback","setUpdates","updatesRef","newUpdate","current","_updatesRef$current","createElement","Provider","useRealtimeKitMeeting","Error"],"sources":["ReactContext.tsx"],"sourcesContent":["// @ts-nocheck\nimport React, {\n createContext,\n useContext,\n ReactChild,\n useEffect,\n useRef,\n useState,\n} from 'react';\nimport RealtimeKitClient from '@cloudflare/realtimekit';\n\ntype Listener = () => void;\nclass RealtimeKitUpdates {\n private meeting: RealtimeKitClient;\n\n private l: Set<Listener>;\n\n constructor(meeting: RealtimeKitClient) {\n this.meeting = meeting;\n this.l = new Set();\n this.meeting.self?.addListener('*', this.update);\n this.meeting.connectedMeetings?.addListener('*', this.update);\n this.meeting.meta?.addListener('*', this.update);\n this.meeting.participants?.addListener('*', this.update);\n this.meeting.participants?.joined?.addListener('*', this.update);\n this.meeting.participants?.active?.addListener('*', this.update);\n this.meeting.participants?.waitlisted?.addListener('*', this.update);\n this.meeting.chat?.addListener('*', this.update);\n this.meeting.polls?.addListener('*', this.update);\n this.meeting.plugins?.all?.addListener('*', this.update);\n this.meeting.recording?.addListener('*', this.update);\n this.meeting.stage?.addListener('*', this.update);\n this.meeting.livestream?.addListener('*', this.update);\n }\n\n clean() {\n this.meeting.self?.removeListener('*', this.update);\n this.meeting.connectedMeetings?.removeListener('*', this.update);\n this.meeting.meta?.removeListener('*', this.update);\n this.meeting.participants?.removeListener('*', this.update);\n this.meeting.participants?.joined?.removeListener('*', this.update);\n this.meeting.participants?.active?.removeListener('*', this.update);\n this.meeting.participants?.waitlisted?.removeListener('*', this.update);\n this.meeting.chat?.removeListener('*', this.update);\n this.meeting.polls?.removeListener('*', this.update);\n this.meeting.plugins?.all?.removeListener('*', this.update);\n this.meeting.recording?.removeListener('*', this.update);\n this.meeting.stage?.removeListener('*', this.update);\n this.meeting.livestream?.removeListener('*', this.update);\n }\n\n addListener(listener: Listener) {\n this.l.add(listener);\n }\n\n removeListener(listener: Listener) {\n this.l.delete(listener);\n }\n\n private update = () => {\n this.l.forEach((l) => {\n l();\n });\n };\n}\n\nexport const RealtimeKitContext = createContext<{\n meeting: RealtimeKitClient | undefined;\n updates: RealtimeKitUpdates | undefined;\n}>({\n meeting: undefined,\n updates: undefined,\n});\n\n/**\n * Provider component which makes the RealtimeKitClient object\n * available to nested components\n * @component\n * @param value The RealtimeKitClient instance from `useRealtimeKitClient()`\n * @param renderBeforeLoad The provider will not render children by default\n * until it gets a client object, renderBeforeLoad can be used to override that\n */\nexport function RealtimeKitProvider({\n value,\n children,\n fallback = null,\n}: {\n value: RealtimeKitClient | undefined;\n children: ReactChild | ReactChild[];\n fallback?: ReactChild | ReactChild[];\n}) {\n const [updates, setUpdates] = useState<RealtimeKitUpdates>();\n const updatesRef = useRef<RealtimeKitUpdates>();\n\n useEffect(() => {\n if (value) {\n const newUpdate = new RealtimeKitUpdates(value);\n setUpdates(newUpdate);\n updatesRef.current = newUpdate;\n }\n return () => {\n updatesRef.current?.clean();\n };\n }, [value]);\n\n return (\n <RealtimeKitContext.Provider\n value={{\n meeting: value,\n updates,\n }}\n >\n {value ? children : fallback}\n </RealtimeKitContext.Provider>\n );\n}\n\n/**\n * Hook which returns the reference to the RealtimeKitClient object\n * @returns meeting instance from `useRealtimeKitClient()`\n */\nexport const useRealtimeKitMeeting = () => {\n const { meeting } = useContext(RealtimeKitContext);\n if (!meeting)\n throw new Error(\n 'useRealtimeKitMeeting must be used within the RealtimeKitProvider'\n );\n\n return { meeting };\n};\n"],"mappings":"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","ignoreList":[]}
|
package/lib/module/ReactHooks.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useState, useEffect, useRef, useReducer, useContext } from 'react';
|
|
1
|
+
import { useState, useEffect, useRef, useReducer, useContext, useCallback } from 'react';
|
|
2
2
|
import { NativeModules, Platform } from 'react-native';
|
|
3
3
|
import RealtimeKitClient from '@cloudflare/realtimekit';
|
|
4
4
|
import { RealtimeKitContext } from './ReactContext';
|
|
@@ -6,18 +6,80 @@ import BackgroundTimer from './BackgroundHandler';
|
|
|
6
6
|
import { webRTCModuleEmitter } from './AudioSampleHandler';
|
|
7
7
|
import { deviceChangeListener } from './LocalMediaUtils';
|
|
8
8
|
import { broadcastEmitter } from './LocalMediaHandler';
|
|
9
|
+
import LocalMediaHandler from './LocalMediaHandler';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Public configuration for the Android meeting foreground service.
|
|
13
|
+
* Structurally identical to the relevant fields of MeetingServiceConfig so
|
|
14
|
+
* no cast is required when passing it to LocalMediaHandler.configure().
|
|
15
|
+
*/
|
|
9
16
|
|
|
10
17
|
/**
|
|
11
18
|
* Hook which manages a RealtimeKitClient instance
|
|
12
19
|
*/
|
|
13
|
-
export const useRealtimeKitClient =
|
|
20
|
+
export const useRealtimeKitClient = clientParams => {
|
|
21
|
+
const isRunning = useRef(false);
|
|
14
22
|
const [client, setClient] = useState();
|
|
15
|
-
const
|
|
23
|
+
const resetOnLeave = clientParams === null || clientParams === void 0 ? void 0 : clientParams.resetOnLeave;
|
|
24
|
+
const keepAliveService = clientParams === null || clientParams === void 0 ? void 0 : clientParams.keepAliveService;
|
|
25
|
+
|
|
26
|
+
// Configure synchronously during render — not in useEffect — so the
|
|
27
|
+
// module-level config is guaranteed to be in place before initClient()
|
|
28
|
+
// is called. useEffect is asynchronous w.r.t. render and would create a
|
|
29
|
+
// race where initClient() fires before the config is applied.
|
|
30
|
+
// LocalMediaHandler.configure() is idempotent for the same values.
|
|
31
|
+
if (keepAliveService !== undefined) {
|
|
32
|
+
LocalMediaHandler.configure(keepAliveService);
|
|
33
|
+
}
|
|
34
|
+
const initClient = useCallback(async options => {
|
|
35
|
+
if (isRunning.current) return undefined;
|
|
36
|
+
isRunning.current = true;
|
|
16
37
|
cleanUpEvents();
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
38
|
+
return RealtimeKitClient.init(options).then(meeting => {
|
|
39
|
+
setClient(meeting);
|
|
40
|
+
return meeting;
|
|
41
|
+
}).finally(() => {
|
|
42
|
+
isRunning.current = false;
|
|
43
|
+
});
|
|
44
|
+
}, []);
|
|
45
|
+
useEffect(() => {
|
|
46
|
+
if (!client || !resetOnLeave) return () => {};
|
|
47
|
+
const onLeave = ({
|
|
48
|
+
state
|
|
49
|
+
}) => {
|
|
50
|
+
if (state !== 'connected-meeting' && state !== 'disconnected') {
|
|
51
|
+
setClient(undefined);
|
|
52
|
+
}
|
|
53
|
+
if (state === 'ended' || state === 'kicked' || state === 'rejected' || state === 'failed') {
|
|
54
|
+
// Stop the KeepAlive foreground service when the meeting ends.
|
|
55
|
+
if (Platform.OS === 'android') {
|
|
56
|
+
var _NativeModules$RTKHel, _NativeModules$RTKHel2;
|
|
57
|
+
(_NativeModules$RTKHel = NativeModules.RTKHelper) === null || _NativeModules$RTKHel === void 0 || (_NativeModules$RTKHel2 = _NativeModules$RTKHel.stopMeetingService) === null || _NativeModules$RTKHel2 === void 0 || _NativeModules$RTKHel2.call(_NativeModules$RTKHel);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
client.self.on('roomLeft', onLeave);
|
|
62
|
+
return () => {
|
|
63
|
+
client.self.removeListener('roomLeft', onLeave);
|
|
64
|
+
};
|
|
65
|
+
}, [client, resetOnLeave]);
|
|
66
|
+
useEffect(() => {
|
|
67
|
+
if (!client || !client.connectedMeetings) return () => {};
|
|
68
|
+
const onMeetingChanged = newClient => {
|
|
69
|
+
// NOTE: do NOT clear this timeout in the effect cleanup. `setClient(
|
|
70
|
+
// undefined)` re-runs this effect (client is a dependency) and its
|
|
71
|
+
// cleanup fires *before* the timeout — clearing it would drop the new
|
|
72
|
+
// client and leave the UI stuck on the loading screen.
|
|
73
|
+
setClient(undefined);
|
|
74
|
+
setTimeout(() => {
|
|
75
|
+
setClient(newClient);
|
|
76
|
+
}, 100);
|
|
77
|
+
};
|
|
78
|
+
client.connectedMeetings.on('meetingChanged', onMeetingChanged);
|
|
79
|
+
return () => {
|
|
80
|
+
client.connectedMeetings.removeListener('meetingChanged', onMeetingChanged);
|
|
81
|
+
};
|
|
82
|
+
}, [client]);
|
|
21
83
|
return [client, initClient];
|
|
22
84
|
};
|
|
23
85
|
|
|
@@ -78,19 +140,13 @@ export const useRealtimeKitSelector = selector => {
|
|
|
78
140
|
return state.current;
|
|
79
141
|
};
|
|
80
142
|
function cleanUpEvents() {
|
|
81
|
-
const {
|
|
82
|
-
RTKHelper
|
|
83
|
-
} = NativeModules;
|
|
84
143
|
webRTCModuleEmitter.removeAllListeners('audioSamples');
|
|
85
144
|
deviceChangeListener.removeAllListeners('onAudioDeviceChanged');
|
|
86
145
|
BackgroundTimer.stop();
|
|
87
146
|
try {
|
|
88
147
|
if (Platform.OS === 'android') {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
RTKHelper.stopService();
|
|
92
|
-
}
|
|
93
|
-
});
|
|
148
|
+
var _NativeModules$RTKHel3, _NativeModules$RTKHel4;
|
|
149
|
+
(_NativeModules$RTKHel3 = NativeModules.RTKHelper) === null || _NativeModules$RTKHel3 === void 0 || (_NativeModules$RTKHel4 = _NativeModules$RTKHel3.stopMeetingService) === null || _NativeModules$RTKHel4 === void 0 || _NativeModules$RTKHel4.call(_NativeModules$RTKHel3);
|
|
94
150
|
} else {
|
|
95
151
|
broadcastEmitter.removeAllListeners('iOS_BroadcastStarted');
|
|
96
152
|
broadcastEmitter.removeAllListeners('iOS_BroadcastStopped');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useState","useEffect","useRef","useReducer","useContext","NativeModules","Platform","RealtimeKitClient","RealtimeKitContext","BackgroundTimer","webRTCModuleEmitter","deviceChangeListener","broadcastEmitter","useRealtimeKitClient","client","setClient","initClient","options","cleanUpEvents","cli","init","shouldUpdate","slice","newSlice","Array","isArray","length","useRTKSelector","selector","useRealtimeKitSelector","meeting","updates","Error","state","forceUpdate","c","currentState","listener","newStateSlice","current","addListener","removeListener","RTKHelper","removeAllListeners","stop","OS","isForegroundServiceRunning","then","val","stopService","_err"],"sources":["ReactHooks.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useReducer, useContext } from 'react';\nimport { NativeModules, Platform } from 'react-native';\nimport RealtimeKitClient, { RTKClientOptions } from '@cloudflare/realtimekit';\nimport { RealtimeKitContext } from './ReactContext';\nimport BackgroundTimer from './BackgroundHandler';\nimport { webRTCModuleEmitter } from './AudioSampleHandler';\nimport { deviceChangeListener } from './LocalMediaUtils';\nimport { broadcastEmitter } from './LocalMediaHandler';\n\n/**\n * Hook which manages a RealtimeKitClient instance\n */\nexport const useRealtimeKitClient = (): [\n RealtimeKitClient | undefined,\n (options: RTKClientOptions) => Promise<RealtimeKitClient>\n] => {\n const [client, setClient] = useState<RealtimeKitClient>();\n const initClient = async (\n options: RTKClientOptions\n ): Promise<RealtimeKitClient> => {\n cleanUpEvents();\n const cli = await RealtimeKitClient.init(options);\n setClient(cli);\n return cli;\n };\n return [client, initClient];\n};\n\n/**\n * Utility function which determines whether to trigger update or not\n */\nconst shouldUpdate = <StateSlice,>(\n slice: StateSlice,\n newSlice: StateSlice\n): boolean => {\n if (slice !== newSlice) {\n return true;\n }\n if (Array.isArray(slice) && Array.isArray(newSlice)) {\n if (slice.length !== newSlice.length) {\n return true;\n }\n }\n\n return false;\n};\n\ntype StateSelector<T extends object, U> = (state: T) => U;\n\n/**\n * @deprecated Use `useRealtimeKitSelector` instead.\n * Hook which extracts data from the RealtimeKitClient object\n */\nexport const useRTKSelector = <StateSlice,>(\n selector: StateSelector<RealtimeKitClient, StateSlice>\n) => {\n return useRealtimeKitSelector(selector);\n};\n\n/**\n * Hook which extracts data from the RealtimeKitClient object\n */\nexport const useRealtimeKitSelector = <StateSlice,>(\n selector: StateSelector<RealtimeKitClient, StateSlice>\n) => {\n const { meeting, updates } = useContext(RealtimeKitContext);\n if (!meeting)\n throw new Error(\n 'useRealtimeKitSelector must be used within the RealtimeKitProvider'\n );\n const state = useRef(selector(meeting));\n const [, forceUpdate] = useReducer((c) => c + 1, 0) as [never, () => void];\n\n useEffect(() => {\n const currentState = meeting && selector(meeting);\n const listener = () => {\n const newStateSlice = meeting && selector(meeting);\n if (shouldUpdate(state.current, newStateSlice)) {\n state.current = newStateSlice;\n forceUpdate();\n }\n };\n if (\n currentState &&\n typeof currentState === 'object' &&\n 'addListener' in currentState\n ) {\n (currentState as any).addListener('*', forceUpdate);\n return () => {\n (currentState as any).removeListener('*', forceUpdate);\n };\n }\n updates?.addListener(listener);\n return () => {\n updates?.removeListener(listener);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [meeting, updates]);\n return state.current;\n};\n\nfunction cleanUpEvents() {\n const { RTKHelper } = NativeModules;\n\n webRTCModuleEmitter.removeAllListeners('audioSamples');\n deviceChangeListener.removeAllListeners('onAudioDeviceChanged');\n BackgroundTimer.stop();\n\n try {\n if (Platform.OS === 'android') {\n RTKHelper.isForegroundServiceRunning().then((val) => {\n if (val) {\n RTKHelper.stopService();\n }\n });\n } else {\n broadcastEmitter.removeAllListeners('iOS_BroadcastStarted');\n broadcastEmitter.removeAllListeners('iOS_BroadcastStopped');\n }\n } catch (_err) {}\n}\nexport * from './ReactContext';\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["useState","useEffect","useRef","useReducer","useContext","useCallback","NativeModules","Platform","RealtimeKitClient","RealtimeKitContext","BackgroundTimer","webRTCModuleEmitter","deviceChangeListener","broadcastEmitter","LocalMediaHandler","useRealtimeKitClient","clientParams","isRunning","client","setClient","resetOnLeave","keepAliveService","undefined","configure","initClient","options","current","cleanUpEvents","init","then","meeting","finally","onLeave","state","OS","_NativeModules$RTKHel","_NativeModules$RTKHel2","RTKHelper","stopMeetingService","call","self","on","removeListener","connectedMeetings","onMeetingChanged","newClient","setTimeout","shouldUpdate","slice","newSlice","Array","isArray","length","useRTKSelector","selector","useRealtimeKitSelector","updates","Error","forceUpdate","c","currentState","listener","newStateSlice","addListener","removeAllListeners","stop","_NativeModules$RTKHel3","_NativeModules$RTKHel4","_err"],"sources":["ReactHooks.tsx"],"sourcesContent":["import {\n useState,\n useEffect,\n useRef,\n useReducer,\n useContext,\n useCallback,\n} from 'react';\nimport { NativeModules, Platform } from 'react-native';\nimport RealtimeKitClient, {\n RTKClientOptions,\n LeaveRoomState,\n} from '@cloudflare/realtimekit';\nimport { RealtimeKitContext } from './ReactContext';\nimport BackgroundTimer from './BackgroundHandler';\nimport { webRTCModuleEmitter } from './AudioSampleHandler';\nimport { deviceChangeListener } from './LocalMediaUtils';\nimport { broadcastEmitter } from './LocalMediaHandler';\nimport LocalMediaHandler, { MeetingServiceConfig } from './LocalMediaHandler';\n\n/**\n * Public configuration for the Android meeting foreground service.\n * Structurally identical to the relevant fields of MeetingServiceConfig so\n * no cast is required when passing it to LocalMediaHandler.configure().\n */\nexport type KeepAliveServiceConfig = Pick<\n MeetingServiceConfig,\n 'enabled' | 'title' | 'text'\n>;\n\ninterface RealtimeKitClientParams {\n resetOnLeave?: boolean;\n /**\n * Android only. Configures (or disables) the meeting foreground service.\n *\n * @example\n * // Disable:\n * useRealtimeKitClient({ keepAliveService: { enabled: false } })\n *\n * // Custom notification text:\n * useRealtimeKitClient({ keepAliveService: { enabled: true, title: 'Team call', text: 'Tap to return' } })\n */\n keepAliveService?: KeepAliveServiceConfig;\n}\n\n/**\n * Hook which manages a RealtimeKitClient instance\n */\nexport const useRealtimeKitClient = (\n clientParams?: RealtimeKitClientParams\n): [\n RealtimeKitClient | undefined,\n (options: RTKClientOptions) => Promise<RealtimeKitClient | undefined>\n] => {\n const isRunning = useRef(false);\n const [client, setClient] = useState<RealtimeKitClient>();\n const resetOnLeave = clientParams?.resetOnLeave;\n const keepAliveService = clientParams?.keepAliveService;\n\n // Configure synchronously during render — not in useEffect — so the\n // module-level config is guaranteed to be in place before initClient()\n // is called. useEffect is asynchronous w.r.t. render and would create a\n // race where initClient() fires before the config is applied.\n // LocalMediaHandler.configure() is idempotent for the same values.\n if (keepAliveService !== undefined) {\n LocalMediaHandler.configure(keepAliveService);\n }\n\n const initClient = useCallback(\n async (\n options: RTKClientOptions\n ): Promise<RealtimeKitClient | undefined> => {\n if (isRunning.current) return undefined;\n isRunning.current = true;\n cleanUpEvents();\n return RealtimeKitClient.init(options)\n .then((meeting: RealtimeKitClient) => {\n setClient(meeting);\n return meeting;\n })\n .finally(() => {\n isRunning.current = false;\n });\n },\n []\n );\n\n useEffect(() => {\n if (!client || !resetOnLeave) return () => {};\n const onLeave = ({ state }: { state: LeaveRoomState }) => {\n if (state !== 'connected-meeting' && state !== 'disconnected') {\n setClient(undefined);\n }\n if (\n state === 'ended' ||\n state === 'kicked' ||\n state === 'rejected' ||\n state === 'failed'\n ) {\n // Stop the KeepAlive foreground service when the meeting ends.\n if (Platform.OS === 'android') {\n NativeModules.RTKHelper?.stopMeetingService?.();\n }\n }\n };\n\n client.self.on('roomLeft', onLeave);\n return () => {\n client.self.removeListener('roomLeft', onLeave);\n };\n }, [client, resetOnLeave]);\n\n useEffect(() => {\n if (!client || !client.connectedMeetings) return () => {};\n const onMeetingChanged = (newClient: RealtimeKitClient) => {\n // NOTE: do NOT clear this timeout in the effect cleanup. `setClient(\n // undefined)` re-runs this effect (client is a dependency) and its\n // cleanup fires *before* the timeout — clearing it would drop the new\n // client and leave the UI stuck on the loading screen.\n setClient(undefined);\n setTimeout(() => {\n setClient(newClient);\n }, 100);\n };\n client.connectedMeetings.on('meetingChanged', onMeetingChanged);\n return () => {\n client.connectedMeetings.removeListener(\n 'meetingChanged',\n onMeetingChanged\n );\n };\n }, [client]);\n\n return [client, initClient] as [\n RealtimeKitClient | undefined,\n (options: RTKClientOptions) => Promise<RealtimeKitClient | undefined>\n ];\n};\n\n/**\n * Utility function which determines whether to trigger update or not\n */\nconst shouldUpdate = <StateSlice,>(\n slice: StateSlice,\n newSlice: StateSlice\n): boolean => {\n if (slice !== newSlice) {\n return true;\n }\n if (Array.isArray(slice) && Array.isArray(newSlice)) {\n if (slice.length !== newSlice.length) {\n return true;\n }\n }\n\n return false;\n};\n\ntype StateSelector<T extends object, U> = (state: T) => U;\n\n/**\n * @deprecated Use `useRealtimeKitSelector` instead.\n * Hook which extracts data from the RealtimeKitClient object\n */\nexport const useRTKSelector = <StateSlice,>(\n selector: StateSelector<RealtimeKitClient, StateSlice>\n) => {\n return useRealtimeKitSelector(selector);\n};\n\n/**\n * Hook which extracts data from the RealtimeKitClient object\n */\nexport const useRealtimeKitSelector = <StateSlice,>(\n selector: StateSelector<RealtimeKitClient, StateSlice>\n) => {\n const { meeting, updates } = useContext(RealtimeKitContext);\n if (!meeting)\n throw new Error(\n 'useRealtimeKitSelector must be used within the RealtimeKitProvider'\n );\n const state = useRef(selector(meeting));\n const [, forceUpdate] = useReducer((c) => c + 1, 0) as [never, () => void];\n\n useEffect(() => {\n const currentState = meeting && selector(meeting);\n const listener = () => {\n const newStateSlice = meeting && selector(meeting);\n if (shouldUpdate(state.current, newStateSlice)) {\n state.current = newStateSlice;\n forceUpdate();\n }\n };\n if (\n currentState &&\n typeof currentState === 'object' &&\n 'addListener' in currentState\n ) {\n (currentState as any).addListener('*', forceUpdate);\n return () => {\n (currentState as any).removeListener('*', forceUpdate);\n };\n }\n updates?.addListener(listener);\n return () => {\n updates?.removeListener(listener);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [meeting, updates]);\n return state.current;\n};\n\nfunction cleanUpEvents() {\n webRTCModuleEmitter.removeAllListeners('audioSamples');\n deviceChangeListener.removeAllListeners('onAudioDeviceChanged');\n BackgroundTimer.stop();\n\n try {\n if (Platform.OS === 'android') {\n NativeModules.RTKHelper?.stopMeetingService?.();\n } else {\n broadcastEmitter.removeAllListeners('iOS_BroadcastStarted');\n broadcastEmitter.removeAllListeners('iOS_BroadcastStopped');\n }\n } catch (_err) {}\n}\nexport * from './ReactContext';\n"],"mappings":"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","ignoreList":[]}
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NativeModules","Platform","RealtimeKitMeeting","LocalMediaHandler","AudioSampleHandler","BackgroundTimer","registerGlobals","DeviceInfo","encode","decode","global","atob","btoa","RealtimeKitProvider","useRealtimeKitClient","useRTKSelector","useRealtimeKitSelector","useRealtimeKitMeeting","LINKING_ERROR","select","ios","default","Core","Proxy","get","Error","Object","defineProperty","navigator","configurable"],"sources":["index.tsx"],"sourcesContent":["import { NativeModules, Platform } from 'react-native';\nimport RealtimeKitMeeting from '@cloudflare/realtimekit';\nimport LocalMediaHandler from './LocalMediaHandler';\nimport AudioSampleHandler from './AudioSampleHandler';\nimport BackgroundTimer from './BackgroundHandler';\nimport { registerGlobals } from '@cloudflare/react-native-webrtc';\nimport './utils/crypto';\nimport 'text-encoding-polyfill';\nimport 'react-native-url-polyfill/auto';\nimport DeviceInfo from './DeviceInfo';\nimport { encode, decode } from 'base-64';\nglobal.atob = decode;\nglobal.btoa = encode;\n\nexport {\n RealtimeKitProvider,\n useRealtimeKitClient,\n useRTKSelector,\n useRealtimeKitSelector,\n useRealtimeKitMeeting,\n} from './ReactHooks';\n\nregisterGlobals();\n\nconst LINKING_ERROR =\n `The package '@cloudflare/realtimekit-react-native' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: '' }) +\n '- You rebuilt the app after installing the package\\n' +\n '- You are not using Expo managed workflow\\n';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst Core = NativeModules.Core\n ? NativeModules.Core\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n }\n );\n\ndeclare global {\n // @ts-ignore\n var navigator: any;\n}\n\nObject.defineProperty(navigator as any, 'isReactNative', {\n get: function () {\n return true;\n },\n configurable: true,\n});\n\nObject.defineProperty(navigator as any, 'userAgent', {\n get: function () {\n return 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4753.0 Safari/537.36'; // customized user agent\n },\n configurable: true,\n});\n\nObject.defineProperty(navigator as any, 'RNLocalMediaHandlerImpl', {\n get: function () {\n return LocalMediaHandler;\n },\n});\n\nObject.defineProperty(navigator as any, 'RNAudioSampleHandlerImpl', {\n get: function () {\n return AudioSampleHandler;\n },\n});\n\nObject.defineProperty(navigator as any, 'RNBackgroundTimerImpl', {\n get: function () {\n return BackgroundTimer;\n },\n});\n\nObject.defineProperty(navigator as any, 'RNDeviceInfoImpl', {\n get: function () {\n return DeviceInfo;\n },\n});\n\nexport default RealtimeKitMeeting;\n"],"mappings":"AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AACtD,OAAOC,kBAAkB,MAAM,yBAAyB;AACxD,OAAOC,iBAAiB,MAAM,qBAAqB;AACnD,OAAOC,kBAAkB,MAAM,sBAAsB;AACrD,OAAOC,eAAe,MAAM,qBAAqB;AACjD,SAASC,eAAe,QAAQ,iCAAiC;AACjE,OAAO,gBAAgB;AACvB,OAAO,wBAAwB;AAC/B,OAAO,gCAAgC;AACvC,OAAOC,UAAU,MAAM,cAAc;AACrC,SAASC,MAAM,EAAEC,MAAM,QAAQ,SAAS;
|
|
1
|
+
{"version":3,"names":["NativeModules","Platform","RealtimeKitMeeting","LocalMediaHandler","AudioSampleHandler","BackgroundTimer","registerGlobals","DeviceInfo","encode","decode","global","atob","btoa","RealtimeKitProvider","useRealtimeKitClient","useRTKSelector","useRealtimeKitSelector","useRealtimeKitMeeting","LINKING_ERROR","select","ios","default","Core","Proxy","get","Error","Object","defineProperty","navigator","configurable"],"sources":["index.tsx"],"sourcesContent":["import { NativeModules, Platform } from 'react-native';\nimport RealtimeKitMeeting from '@cloudflare/realtimekit';\nimport LocalMediaHandler from './LocalMediaHandler';\nimport AudioSampleHandler from './AudioSampleHandler';\nimport BackgroundTimer from './BackgroundHandler';\nimport { registerGlobals } from '@cloudflare/react-native-webrtc';\nimport './utils/crypto';\nimport 'text-encoding-polyfill';\nimport 'react-native-url-polyfill/auto';\nimport DeviceInfo from './DeviceInfo';\nimport { encode, decode } from 'base-64';\nexport type { KeepAliveServiceConfig } from './ReactHooks';\nglobal.atob = decode;\nglobal.btoa = encode;\n\nexport {\n RealtimeKitProvider,\n useRealtimeKitClient,\n useRTKSelector,\n useRealtimeKitSelector,\n useRealtimeKitMeeting,\n} from './ReactHooks';\n\nregisterGlobals();\n\nconst LINKING_ERROR =\n `The package '@cloudflare/realtimekit-react-native' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: '' }) +\n '- You rebuilt the app after installing the package\\n' +\n '- You are not using Expo managed workflow\\n';\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nconst Core = NativeModules.Core\n ? NativeModules.Core\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n }\n );\n\ndeclare global {\n // @ts-ignore\n var navigator: any;\n}\n\nObject.defineProperty(navigator as any, 'isReactNative', {\n get: function () {\n return true;\n },\n configurable: true,\n});\n\nObject.defineProperty(navigator as any, 'userAgent', {\n get: function () {\n return 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4753.0 Safari/537.36'; // customized user agent\n },\n configurable: true,\n});\n\nObject.defineProperty(navigator as any, 'RNLocalMediaHandlerImpl', {\n get: function () {\n return LocalMediaHandler;\n },\n});\n\nObject.defineProperty(navigator as any, 'RNAudioSampleHandlerImpl', {\n get: function () {\n return AudioSampleHandler;\n },\n});\n\nObject.defineProperty(navigator as any, 'RNBackgroundTimerImpl', {\n get: function () {\n return BackgroundTimer;\n },\n});\n\nObject.defineProperty(navigator as any, 'RNDeviceInfoImpl', {\n get: function () {\n return DeviceInfo;\n },\n});\n\nexport default RealtimeKitMeeting;\n"],"mappings":"AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AACtD,OAAOC,kBAAkB,MAAM,yBAAyB;AACxD,OAAOC,iBAAiB,MAAM,qBAAqB;AACnD,OAAOC,kBAAkB,MAAM,sBAAsB;AACrD,OAAOC,eAAe,MAAM,qBAAqB;AACjD,SAASC,eAAe,QAAQ,iCAAiC;AACjE,OAAO,gBAAgB;AACvB,OAAO,wBAAwB;AAC/B,OAAO,gCAAgC;AACvC,OAAOC,UAAU,MAAM,cAAc;AACrC,SAASC,MAAM,EAAEC,MAAM,QAAQ,SAAS;AAExCC,MAAM,CAACC,IAAI,GAAGF,MAAM;AACpBC,MAAM,CAACE,IAAI,GAAGJ,MAAM;AAEpB,SACEK,mBAAmB,EACnBC,oBAAoB,EACpBC,cAAc,EACdC,sBAAsB,EACtBC,qBAAqB,QAChB,cAAc;AAErBX,eAAe,CAAC,CAAC;AAEjB,MAAMY,aAAa,GACjB,+FAA+F,GAC/FjB,QAAQ,CAACkB,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,6CAA6C;;AAE/C;AACA,MAAMC,IAAI,GAAGtB,aAAa,CAACsB,IAAI,GAC3BtB,aAAa,CAACsB,IAAI,GAClB,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACP,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAOLQ,MAAM,CAACC,cAAc,CAACC,SAAS,EAAS,eAAe,EAAE;EACvDJ,GAAG,EAAE,SAAAA,CAAA,EAAY;IACf,OAAO,IAAI;EACb,CAAC;EACDK,YAAY,EAAE;AAChB,CAAC,CAAC;AAEFH,MAAM,CAACC,cAAc,CAACC,SAAS,EAAS,WAAW,EAAE;EACnDJ,GAAG,EAAE,SAAAA,CAAA,EAAY;IACf,OAAO,yHAAyH,CAAC,CAAC;EACpI,CAAC;EACDK,YAAY,EAAE;AAChB,CAAC,CAAC;AAEFH,MAAM,CAACC,cAAc,CAACC,SAAS,EAAS,yBAAyB,EAAE;EACjEJ,GAAG,EAAE,SAAAA,CAAA,EAAY;IACf,OAAOrB,iBAAiB;EAC1B;AACF,CAAC,CAAC;AAEFuB,MAAM,CAACC,cAAc,CAACC,SAAS,EAAS,0BAA0B,EAAE;EAClEJ,GAAG,EAAE,SAAAA,CAAA,EAAY;IACf,OAAOpB,kBAAkB;EAC3B;AACF,CAAC,CAAC;AAEFsB,MAAM,CAACC,cAAc,CAACC,SAAS,EAAS,uBAAuB,EAAE;EAC/DJ,GAAG,EAAE,SAAAA,CAAA,EAAY;IACf,OAAOnB,eAAe;EACxB;AACF,CAAC,CAAC;AAEFqB,MAAM,CAACC,cAAc,CAACC,SAAS,EAAS,kBAAkB,EAAE;EAC1DJ,GAAG,EAAE,SAAAA,CAAA,EAAY;IACf,OAAOjB,UAAU;EACnB;AACF,CAAC,CAAC;AAEF,eAAeL,kBAAkB","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const SDK_VERSION = '1.
|
|
1
|
+
export const SDK_VERSION = '1.2.0-staging.1';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SDK_VERSION"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '1.
|
|
1
|
+
{"version":3,"names":["SDK_VERSION"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '1.2.0-staging.1';\n"],"mappings":"AAAA,OAAO,MAAMA,WAAW,GAAG,iBAAiB","ignoreList":[]}
|
|
@@ -3,8 +3,18 @@ import LocalMediaUtils from './LocalMediaUtils';
|
|
|
3
3
|
import { MediaPermission } from './LocalMediaInterfaces';
|
|
4
4
|
import type { MediaStreamTrack } from '@cloudflare/react-native-webrtc';
|
|
5
5
|
import type { MediaDeviceInfo } from './LocalMediaInterfaces';
|
|
6
|
-
import { NativeEventEmitter } from 'react-native';
|
|
6
|
+
import { AppStateStatus, NativeEventEmitter } from 'react-native';
|
|
7
7
|
export declare const broadcastEmitter: NativeEventEmitter;
|
|
8
|
+
export interface MeetingServiceConfig {
|
|
9
|
+
/** Whether to start the Android meeting foreground service. Default: true. */
|
|
10
|
+
enabled: boolean;
|
|
11
|
+
/** Notification title. Default: "In a call". */
|
|
12
|
+
title?: string;
|
|
13
|
+
/** Notification body text. Default: "Tap to return to your meeting". */
|
|
14
|
+
text?: string;
|
|
15
|
+
channelId?: string;
|
|
16
|
+
channelName?: string;
|
|
17
|
+
}
|
|
8
18
|
export declare enum MediaEvents {
|
|
9
19
|
AUDIO_TRACK_CHANGE = 0,
|
|
10
20
|
VIDEO_TRACK_CHANGE = 1,
|
|
@@ -38,8 +48,7 @@ export default class LocalMediaHandler extends EventEmitter {
|
|
|
38
48
|
audio?: MediaPermission;
|
|
39
49
|
video?: MediaPermission;
|
|
40
50
|
};
|
|
41
|
-
_handleAppStateChange: (nextAppState:
|
|
42
|
-
private configureForeground;
|
|
51
|
+
_handleAppStateChange: (nextAppState: AppStateStatus) => void;
|
|
43
52
|
constructor(localMediaUtils: LocalMediaUtils);
|
|
44
53
|
private conditionallyRestartAudio;
|
|
45
54
|
private conditionallyRestartVideo;
|
|
@@ -85,7 +94,6 @@ export default class LocalMediaHandler extends EventEmitter {
|
|
|
85
94
|
setDevice(route: MediaDeviceInfo): Promise<void>;
|
|
86
95
|
private oniOSBroadcastStart;
|
|
87
96
|
private oniOSBroadcastStop;
|
|
88
|
-
toggleScreenShare(): Promise<void>;
|
|
89
97
|
enableScreenShare(): Promise<void>;
|
|
90
98
|
disableScreenShare(): Promise<void>;
|
|
91
99
|
getAllDevices(): MediaDeviceInfo[];
|
|
@@ -110,7 +118,13 @@ export default class LocalMediaHandler extends EventEmitter {
|
|
|
110
118
|
removed: MediaDeviceInfo[];
|
|
111
119
|
selectedDevice?: string;
|
|
112
120
|
}, forceDeviceChange: boolean): Promise<void>;
|
|
121
|
+
/**
|
|
122
|
+
* Override the meeting foreground service config before the first meeting
|
|
123
|
+
* session. Called by useRealtimeKitClient when keepAliveService is set.
|
|
124
|
+
*/
|
|
125
|
+
static configure(config: Partial<MeetingServiceConfig>): void;
|
|
113
126
|
static init(_: any): Promise<LocalMediaHandler>;
|
|
127
|
+
private startMeetingService;
|
|
114
128
|
emit(event: keyof typeof MediaEvents, ...args: any[]): boolean;
|
|
115
129
|
on(event: keyof typeof MediaEvents, listener: (...args: any[]) => void): this;
|
|
116
130
|
destruct(): void;
|
|
@@ -1,8 +1,29 @@
|
|
|
1
1
|
import RealtimeKitClient, { RTKClientOptions } from '@cloudflare/realtimekit';
|
|
2
|
+
import { MeetingServiceConfig } from './LocalMediaHandler';
|
|
3
|
+
/**
|
|
4
|
+
* Public configuration for the Android meeting foreground service.
|
|
5
|
+
* Structurally identical to the relevant fields of MeetingServiceConfig so
|
|
6
|
+
* no cast is required when passing it to LocalMediaHandler.configure().
|
|
7
|
+
*/
|
|
8
|
+
export type KeepAliveServiceConfig = Pick<MeetingServiceConfig, 'enabled' | 'title' | 'text'>;
|
|
9
|
+
interface RealtimeKitClientParams {
|
|
10
|
+
resetOnLeave?: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Android only. Configures (or disables) the meeting foreground service.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* // Disable:
|
|
16
|
+
* useRealtimeKitClient({ keepAliveService: { enabled: false } })
|
|
17
|
+
*
|
|
18
|
+
* // Custom notification text:
|
|
19
|
+
* useRealtimeKitClient({ keepAliveService: { enabled: true, title: 'Team call', text: 'Tap to return' } })
|
|
20
|
+
*/
|
|
21
|
+
keepAliveService?: KeepAliveServiceConfig;
|
|
22
|
+
}
|
|
2
23
|
/**
|
|
3
24
|
* Hook which manages a RealtimeKitClient instance
|
|
4
25
|
*/
|
|
5
|
-
export declare const useRealtimeKitClient: () => [RealtimeKitClient | undefined, (options: RTKClientOptions) => Promise<RealtimeKitClient>];
|
|
26
|
+
export declare const useRealtimeKitClient: (clientParams?: RealtimeKitClientParams) => [RealtimeKitClient | undefined, (options: RTKClientOptions) => Promise<RealtimeKitClient | undefined>];
|
|
6
27
|
type StateSelector<T extends object, U> = (state: T) => U;
|
|
7
28
|
/**
|
|
8
29
|
* @deprecated Use `useRealtimeKitSelector` instead.
|
|
@@ -2,6 +2,7 @@ import RealtimeKitMeeting from '@cloudflare/realtimekit';
|
|
|
2
2
|
import './utils/crypto';
|
|
3
3
|
import 'text-encoding-polyfill';
|
|
4
4
|
import 'react-native-url-polyfill/auto';
|
|
5
|
+
export type { KeepAliveServiceConfig } from './ReactHooks';
|
|
5
6
|
export { RealtimeKitProvider, useRealtimeKitClient, useRTKSelector, useRealtimeKitSelector, useRealtimeKitMeeting, } from './ReactHooks';
|
|
6
7
|
declare global {
|
|
7
8
|
var navigator: any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "1.
|
|
1
|
+
export declare const SDK_VERSION = "1.2.0-staging.1";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cloudflare/realtimekit-react-native",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0-staging.1",
|
|
4
4
|
"description": "Cloudflare RealtimeKit SDK for react native",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"author": "Cloudflare",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
},
|
|
27
27
|
"private": false,
|
|
28
28
|
"dependencies": {
|
|
29
|
-
"@cloudflare/realtimekit": "
|
|
29
|
+
"@cloudflare/realtimekit": "2.0.0",
|
|
30
30
|
"base-64": "^1.0.0",
|
|
31
31
|
"events": "^3.3.0",
|
|
32
32
|
"react-native-url-polyfill": "1.3.0",
|
|
@@ -44,9 +44,7 @@
|
|
|
44
44
|
"react-native": ">=0.77.0"
|
|
45
45
|
},
|
|
46
46
|
"publishConfig": {
|
|
47
|
-
"
|
|
48
|
-
"access": "public",
|
|
49
|
-
"tag": "latest"
|
|
47
|
+
"tag": "staging"
|
|
50
48
|
},
|
|
51
49
|
"scripts": {
|
|
52
50
|
"postpublish": "mv package.json.bak package.json"
|
package/plugin/build/withRTK.js
CHANGED
|
@@ -38,23 +38,13 @@ const withIosPermissions = (c, { microphonePermission, cameraPermission, library
|
|
|
38
38
|
});
|
|
39
39
|
};
|
|
40
40
|
/**
|
|
41
|
-
* Adds the following to
|
|
42
|
-
*
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
<uses-permission android:name="android.permission.RECORD_AUDIO"/>
|
|
49
|
-
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
|
|
50
|
-
<uses-permission android:name="android.permission.WAKE_LOCK"/>
|
|
51
|
-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
|
52
|
-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_CAMERA" />
|
|
53
|
-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MICROPHONE" />
|
|
54
|
-
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION" />
|
|
55
|
-
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
|
56
|
-
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
|
57
|
-
<uses-permission android:name="android.permission.MICROPHONE" />
|
|
41
|
+
* Adds the following permissions to `AndroidManifest.xml`:
|
|
42
|
+
* ACCESS_NETWORK_STATE, BLUETOOTH, CAMERA, INTERNET,
|
|
43
|
+
* MODIFY_AUDIO_SETTINGS, RECORD_AUDIO, SYSTEM_ALERT_WINDOW, WAKE_LOCK,
|
|
44
|
+
* POST_NOTIFICATIONS,
|
|
45
|
+
* FOREGROUND_SERVICE, FOREGROUND_SERVICE_CAMERA, FOREGROUND_SERVICE_MICROPHONE,
|
|
46
|
+
* FOREGROUND_SERVICE_MEDIA_PLAYBACK,
|
|
47
|
+
* WRITE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE, MICROPHONE
|
|
58
48
|
*/
|
|
59
49
|
const withAndroidPermissions = (config) => {
|
|
60
50
|
return config_plugins_1.AndroidConfig.Permissions.withPermissions(config, [
|
|
@@ -66,8 +56,11 @@ const withAndroidPermissions = (config) => {
|
|
|
66
56
|
'android.permission.RECORD_AUDIO',
|
|
67
57
|
'android.permission.SYSTEM_ALERT_WINDOW',
|
|
68
58
|
'android.permission.WAKE_LOCK',
|
|
59
|
+
'android.permission.POST_NOTIFICATIONS',
|
|
69
60
|
'android.permission.FOREGROUND_SERVICE',
|
|
70
|
-
'android.permission.
|
|
61
|
+
'android.permission.FOREGROUND_SERVICE_CAMERA',
|
|
62
|
+
'android.permission.FOREGROUND_SERVICE_MICROPHONE',
|
|
63
|
+
'android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK',
|
|
71
64
|
'android.permission.WRITE_EXTERNAL_STORAGE',
|
|
72
65
|
'android.permission.READ_EXTERNAL_STORAGE',
|
|
73
66
|
'android.permission.MICROPHONE',
|
|
@@ -78,17 +71,27 @@ const withAndroidScreenshare = (config) => {
|
|
|
78
71
|
const manifest = _config.modResults;
|
|
79
72
|
const app = manifest.manifest.application?.[0];
|
|
80
73
|
if (app) {
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
74
|
+
const newServiceName = 'com.cloudflare.realtimekit.WebRTCModule.MediaProjectionService';
|
|
75
|
+
// Remove the old ForegroundService entry if it exists (migration from previous versions).
|
|
76
|
+
const oldServiceName = 'com.cloudflare.realtimekit.ForegroundService';
|
|
77
|
+
if (app.service) {
|
|
78
|
+
app.service = app.service.filter((service) => service.$['android:name'] !== oldServiceName);
|
|
79
|
+
}
|
|
80
|
+
// Add the new MediaProjectionService entry if not already present.
|
|
81
|
+
// Note: react-native-webrtc's own AndroidManifest.xml also declares this
|
|
82
|
+
// service, so Expo managed apps that merge library manifests may not need
|
|
83
|
+
// this entry. It is added here explicitly for safety with bare workflow
|
|
84
|
+
// apps that do not perform automatic manifest merging.
|
|
85
|
+
const exists = (app.service || []).some((service) => service.$['android:name'] === newServiceName);
|
|
84
86
|
if (!exists) {
|
|
85
87
|
app.service = [
|
|
86
88
|
...(app.service || []),
|
|
87
89
|
{
|
|
88
90
|
$: {
|
|
89
91
|
'android:enabled': 'true',
|
|
92
|
+
'android:exported': 'false',
|
|
90
93
|
'android:foregroundServiceType': 'mediaProjection',
|
|
91
|
-
'android:name':
|
|
94
|
+
'android:name': newServiceName,
|
|
92
95
|
},
|
|
93
96
|
},
|
|
94
97
|
];
|
|
@@ -114,6 +117,30 @@ const withAndroidBlobProviderAuthority = (config) => {
|
|
|
114
117
|
return _config;
|
|
115
118
|
});
|
|
116
119
|
};
|
|
120
|
+
const withAndroidMeetingService = (config) => {
|
|
121
|
+
return (0, config_plugins_1.withAndroidManifest)(config, (_config) => {
|
|
122
|
+
const manifest = _config.modResults;
|
|
123
|
+
const app = manifest.manifest.application?.[0];
|
|
124
|
+
if (!app)
|
|
125
|
+
return _config;
|
|
126
|
+
const serviceName = 'com.cloudflare.realtimekit.KeepAliveService';
|
|
127
|
+
const exists = (app.service || []).some((service) => service.$['android:name'] === serviceName);
|
|
128
|
+
if (!exists) {
|
|
129
|
+
app.service = [
|
|
130
|
+
...(app.service || []),
|
|
131
|
+
{
|
|
132
|
+
$: {
|
|
133
|
+
'android:name': serviceName,
|
|
134
|
+
'android:enabled': 'true',
|
|
135
|
+
'android:exported': 'false',
|
|
136
|
+
'android:foregroundServiceType': 'camera|microphone|mediaPlayback',
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
];
|
|
140
|
+
}
|
|
141
|
+
return _config;
|
|
142
|
+
});
|
|
143
|
+
};
|
|
117
144
|
const withVoice = (config, props = {}) => {
|
|
118
145
|
const _props = props ? props : {};
|
|
119
146
|
config = withIosPermissions(config, _props);
|
|
@@ -121,6 +148,7 @@ const withVoice = (config, props = {}) => {
|
|
|
121
148
|
config = withAndroidPermissions(config);
|
|
122
149
|
}
|
|
123
150
|
config = withAndroidScreenshare(config);
|
|
151
|
+
config = withAndroidMeetingService(config);
|
|
124
152
|
config = withAndroidBlobProviderAuthority(config);
|
|
125
153
|
return config;
|
|
126
154
|
};
|