@cloudflare/realtimekit-react-native 1.2.0-staging.2 → 1.2.0-staging.3
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/ReactHooks.js +18 -4
- 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/ReactHooks.js +18 -4
- 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/utils/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -72,11 +72,25 @@ const useRealtimeKitClient = clientParams => {
|
|
|
72
72
|
if (state !== 'connected-meeting' && state !== 'disconnected') {
|
|
73
73
|
setClient(undefined);
|
|
74
74
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
75
|
+
};
|
|
76
|
+
client.self.on('roomLeft', onLeave);
|
|
77
|
+
return () => {
|
|
78
|
+
client.self.removeListener('roomLeft', onLeave);
|
|
79
|
+
};
|
|
80
|
+
}, [client, resetOnLeave]);
|
|
81
|
+
|
|
82
|
+
// Android-only: stop the KeepAlive foreground service on terminal states.
|
|
83
|
+
(0, _react.useEffect)(() => {
|
|
84
|
+
if (!client || _reactNative.Platform.OS !== 'android') return () => {};
|
|
85
|
+
const onLeave = ({
|
|
86
|
+
state
|
|
87
|
+
}) => {
|
|
88
|
+
if (state !== 'connected-meeting' && state !== 'disconnected') {
|
|
89
|
+
try {
|
|
78
90
|
var _NativeModules$RTKHel, _NativeModules$RTKHel2;
|
|
79
91
|
(_NativeModules$RTKHel = _reactNative.NativeModules.RTKHelper) === null || _NativeModules$RTKHel === void 0 || (_NativeModules$RTKHel2 = _NativeModules$RTKHel.stopMeetingService) === null || _NativeModules$RTKHel2 === void 0 || _NativeModules$RTKHel2.call(_NativeModules$RTKHel);
|
|
92
|
+
} catch (err) {
|
|
93
|
+
console.warn('[RealtimeKit] stopMeetingService failed:', err);
|
|
80
94
|
}
|
|
81
95
|
}
|
|
82
96
|
};
|
|
@@ -84,7 +98,7 @@ const useRealtimeKitClient = clientParams => {
|
|
|
84
98
|
return () => {
|
|
85
99
|
client.self.removeListener('roomLeft', onLeave);
|
|
86
100
|
};
|
|
87
|
-
}, [client
|
|
101
|
+
}, [client]);
|
|
88
102
|
(0, _react.useEffect)(() => {
|
|
89
103
|
if (!client || !client.connectedMeetings) return () => {};
|
|
90
104
|
const onMeetingChanged = newClient => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_react","require","_reactNative","_realtimekit","_interopRequireDefault","_ReactContext","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_BackgroundHandler","_AudioSampleHandler","_LocalMediaUtils","_LocalMediaHandler","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","set","getOwnPropertyDescriptor","useRealtimeKitClient","clientParams","isRunning","useRef","client","setClient","useState","resetOnLeave","keepAliveService","undefined","LocalMediaHandler","configure","initClient","useCallback","options","current","cleanUpEvents","RealtimeKitClient","init","then","meeting","finally","useEffect","onLeave","state","Platform","OS","_NativeModules$RTKHel","_NativeModules$RTKHel2","NativeModules","RTKHelper","stopMeetingService","self","on","removeListener","connectedMeetings","onMeetingChanged","newClient","setTimeout","shouldUpdate","slice","newSlice","Array","isArray","length","useRTKSelector","selector","useRealtimeKitSelector","updates","useContext","RealtimeKitContext","Error","forceUpdate","useReducer","c","currentState","listener","newStateSlice","addListener","webRTCModuleEmitter","removeAllListeners","deviceChangeListener","BackgroundTimer","stop","_NativeModules$RTKHel3","_NativeModules$RTKHel4","broadcastEmitter","_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":[]}
|
|
1
|
+
{"version":3,"names":["_react","require","_reactNative","_realtimekit","_interopRequireDefault","_ReactContext","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_BackgroundHandler","_AudioSampleHandler","_LocalMediaUtils","_LocalMediaHandler","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","set","getOwnPropertyDescriptor","useRealtimeKitClient","clientParams","isRunning","useRef","client","setClient","useState","resetOnLeave","keepAliveService","undefined","LocalMediaHandler","configure","initClient","useCallback","options","current","cleanUpEvents","RealtimeKitClient","init","then","meeting","finally","useEffect","onLeave","state","self","on","removeListener","Platform","OS","_NativeModules$RTKHel","_NativeModules$RTKHel2","NativeModules","RTKHelper","stopMeetingService","err","console","warn","connectedMeetings","onMeetingChanged","newClient","setTimeout","shouldUpdate","slice","newSlice","Array","isArray","length","useRTKSelector","selector","useRealtimeKitSelector","updates","useContext","RealtimeKitContext","Error","forceUpdate","useReducer","c","currentState","listener","newStateSlice","addListener","webRTCModuleEmitter","removeAllListeners","deviceChangeListener","BackgroundTimer","stop","_NativeModules$RTKHel3","_NativeModules$RTKHel4","broadcastEmitter","_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 };\n\n client.self.on('roomLeft', onLeave);\n return () => {\n client.self.removeListener('roomLeft', onLeave);\n };\n }, [client, resetOnLeave]);\n\n // Android-only: stop the KeepAlive foreground service on terminal states.\n useEffect(() => {\n if (!client || Platform.OS !== 'android') return () => {};\n const onLeave = ({ state }: { state: LeaveRoomState }) => {\n if (state !== 'connected-meeting' && state !== 'disconnected') {\n try {\n NativeModules.RTKHelper?.stopMeetingService?.();\n } catch (err) {\n console.warn('[RealtimeKit] stopMeetingService failed:', err);\n }\n }\n };\n\n client.self.on('roomLeft', onLeave);\n return () => {\n client.self.removeListener('roomLeft', onLeave);\n };\n }, [client]);\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":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SDK_VERSION","exports"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '1.2.0-staging.
|
|
1
|
+
{"version":3,"names":["SDK_VERSION","exports"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '1.2.0-staging.3';\n"],"mappings":";;;;;;AAAO,MAAMA,WAAW,GAAAC,OAAA,CAAAD,WAAA,GAAG,iBAAiB","ignoreList":[]}
|
package/lib/module/ReactHooks.js
CHANGED
|
@@ -50,11 +50,25 @@ export const useRealtimeKitClient = clientParams => {
|
|
|
50
50
|
if (state !== 'connected-meeting' && state !== 'disconnected') {
|
|
51
51
|
setClient(undefined);
|
|
52
52
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
};
|
|
54
|
+
client.self.on('roomLeft', onLeave);
|
|
55
|
+
return () => {
|
|
56
|
+
client.self.removeListener('roomLeft', onLeave);
|
|
57
|
+
};
|
|
58
|
+
}, [client, resetOnLeave]);
|
|
59
|
+
|
|
60
|
+
// Android-only: stop the KeepAlive foreground service on terminal states.
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (!client || Platform.OS !== 'android') return () => {};
|
|
63
|
+
const onLeave = ({
|
|
64
|
+
state
|
|
65
|
+
}) => {
|
|
66
|
+
if (state !== 'connected-meeting' && state !== 'disconnected') {
|
|
67
|
+
try {
|
|
56
68
|
var _NativeModules$RTKHel, _NativeModules$RTKHel2;
|
|
57
69
|
(_NativeModules$RTKHel = NativeModules.RTKHelper) === null || _NativeModules$RTKHel === void 0 || (_NativeModules$RTKHel2 = _NativeModules$RTKHel.stopMeetingService) === null || _NativeModules$RTKHel2 === void 0 || _NativeModules$RTKHel2.call(_NativeModules$RTKHel);
|
|
70
|
+
} catch (err) {
|
|
71
|
+
console.warn('[RealtimeKit] stopMeetingService failed:', err);
|
|
58
72
|
}
|
|
59
73
|
}
|
|
60
74
|
};
|
|
@@ -62,7 +76,7 @@ export const useRealtimeKitClient = clientParams => {
|
|
|
62
76
|
return () => {
|
|
63
77
|
client.self.removeListener('roomLeft', onLeave);
|
|
64
78
|
};
|
|
65
|
-
}, [client
|
|
79
|
+
}, [client]);
|
|
66
80
|
useEffect(() => {
|
|
67
81
|
if (!client || !client.connectedMeetings) return () => {};
|
|
68
82
|
const onMeetingChanged = newClient => {
|
|
@@ -1 +1 @@
|
|
|
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":[]}
|
|
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","self","on","removeListener","OS","_NativeModules$RTKHel","_NativeModules$RTKHel2","RTKHelper","stopMeetingService","call","err","console","warn","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 };\n\n client.self.on('roomLeft', onLeave);\n return () => {\n client.self.removeListener('roomLeft', onLeave);\n };\n }, [client, resetOnLeave]);\n\n // Android-only: stop the KeepAlive foreground service on terminal states.\n useEffect(() => {\n if (!client || Platform.OS !== 'android') return () => {};\n const onLeave = ({ state }: { state: LeaveRoomState }) => {\n if (state !== 'connected-meeting' && state !== 'disconnected') {\n try {\n NativeModules.RTKHelper?.stopMeetingService?.();\n } catch (err) {\n console.warn('[RealtimeKit] stopMeetingService failed:', err);\n }\n }\n };\n\n client.self.on('roomLeft', onLeave);\n return () => {\n client.self.removeListener('roomLeft', onLeave);\n };\n }, [client]);\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":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const SDK_VERSION = '1.2.0-staging.
|
|
1
|
+
export const SDK_VERSION = '1.2.0-staging.3';
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["SDK_VERSION"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '1.2.0-staging.
|
|
1
|
+
{"version":3,"names":["SDK_VERSION"],"sources":["version.ts"],"sourcesContent":["export const SDK_VERSION = '1.2.0-staging.3';\n"],"mappings":"AAAA,OAAO,MAAMA,WAAW,GAAG,iBAAiB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const SDK_VERSION = "1.2.0-staging.
|
|
1
|
+
export declare const SDK_VERSION = "1.2.0-staging.3";
|