@voltkit-rtc/react-native 0.0.0-stage → 0.1.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.
Files changed (225) hide show
  1. package/CHANGELOG.md +121 -0
  2. package/LICENSE +21 -0
  3. package/README.md +1608 -2
  4. package/android/build.gradle +70 -0
  5. package/android/consumer-rules.pro +21 -0
  6. package/android/src/main/AndroidManifest.xml +25 -0
  7. package/android/src/main/java/com/voltkit/rtc/reactnative/AppVisibility.kt +67 -0
  8. package/android/src/main/java/com/voltkit/rtc/reactnative/AudioDevices.kt +67 -0
  9. package/android/src/main/java/com/voltkit/rtc/reactnative/AudioRouter.kt +487 -0
  10. package/android/src/main/java/com/voltkit/rtc/reactnative/CallServiceTypes.kt +120 -0
  11. package/android/src/main/java/com/voltkit/rtc/reactnative/NativeTimers.kt +106 -0
  12. package/android/src/main/java/com/voltkit/rtc/reactnative/NetworkWatch.kt +120 -0
  13. package/android/src/main/java/com/voltkit/rtc/reactnative/OutputChoice.kt +65 -0
  14. package/android/src/main/java/com/voltkit/rtc/reactnative/RtcConfig.kt +83 -0
  15. package/android/src/main/java/com/voltkit/rtc/reactnative/ScoLink.kt +61 -0
  16. package/android/src/main/java/com/voltkit/rtc/reactnative/VoltkitCallService.kt +287 -0
  17. package/android/src/main/java/com/voltkit/rtc/reactnative/VoltkitRtcInitProvider.kt +215 -0
  18. package/android/src/main/java/com/voltkit/rtc/reactnative/VoltkitRtcModule.kt +313 -0
  19. package/android/src/main/java/com/voltkit/rtc/reactnative/VoltkitRtcPackage.kt +30 -0
  20. package/android/src/main/res/drawable/voltkit_rtc_default_call_icon.xml +15 -0
  21. package/android/src/main/res/raw/voltkit_rtc_keep.xml +7 -0
  22. package/app.plugin.js +17 -0
  23. package/lib/commonjs/audio.js +215 -0
  24. package/lib/commonjs/audio.js.map +1 -0
  25. package/lib/commonjs/components.js +207 -0
  26. package/lib/commonjs/components.js.map +1 -0
  27. package/lib/commonjs/create-client.js +47 -0
  28. package/lib/commonjs/create-client.js.map +1 -0
  29. package/lib/commonjs/errors.js +99 -0
  30. package/lib/commonjs/errors.js.map +1 -0
  31. package/lib/commonjs/globals.js +61 -0
  32. package/lib/commonjs/globals.js.map +1 -0
  33. package/lib/commonjs/index.js +234 -0
  34. package/lib/commonjs/index.js.map +1 -0
  35. package/lib/commonjs/local-media.js +392 -0
  36. package/lib/commonjs/local-media.js.map +1 -0
  37. package/lib/commonjs/native-session.js +365 -0
  38. package/lib/commonjs/native-session.js.map +1 -0
  39. package/lib/commonjs/native.js +99 -0
  40. package/lib/commonjs/native.js.map +1 -0
  41. package/lib/commonjs/package.json +1 -0
  42. package/lib/commonjs/permissions.js +166 -0
  43. package/lib/commonjs/permissions.js.map +1 -0
  44. package/lib/commonjs/platform/android.js +126 -0
  45. package/lib/commonjs/platform/android.js.map +1 -0
  46. package/lib/commonjs/platform/common.js +138 -0
  47. package/lib/commonjs/platform/common.js.map +1 -0
  48. package/lib/commonjs/platform/devices.js +151 -0
  49. package/lib/commonjs/platform/devices.js.map +1 -0
  50. package/lib/commonjs/platform/index.js +35 -0
  51. package/lib/commonjs/platform/index.js.map +1 -0
  52. package/lib/commonjs/platform/ios.js +54 -0
  53. package/lib/commonjs/platform/ios.js.map +1 -0
  54. package/lib/commonjs/platform/streams.js +273 -0
  55. package/lib/commonjs/platform/streams.js.map +1 -0
  56. package/lib/commonjs/platform/timers.js +71 -0
  57. package/lib/commonjs/platform/timers.js.map +1 -0
  58. package/lib/commonjs/platform/visibility.js +60 -0
  59. package/lib/commonjs/platform/visibility.js.map +1 -0
  60. package/lib/commonjs/preflight.js +77 -0
  61. package/lib/commonjs/preflight.js.map +1 -0
  62. package/lib/commonjs/provider.js +75 -0
  63. package/lib/commonjs/provider.js.map +1 -0
  64. package/lib/commonjs/specs/NativeVoltkitRtc.js +29 -0
  65. package/lib/commonjs/specs/NativeVoltkitRtc.js.map +1 -0
  66. package/lib/module/audio.js +207 -0
  67. package/lib/module/audio.js.map +1 -0
  68. package/lib/module/components.js +200 -0
  69. package/lib/module/components.js.map +1 -0
  70. package/lib/module/create-client.js +42 -0
  71. package/lib/module/create-client.js.map +1 -0
  72. package/lib/module/errors.js +87 -0
  73. package/lib/module/errors.js.map +1 -0
  74. package/lib/module/globals.js +53 -0
  75. package/lib/module/globals.js.map +1 -0
  76. package/lib/module/index.js +33 -0
  77. package/lib/module/index.js.map +1 -0
  78. package/lib/module/local-media.js +387 -0
  79. package/lib/module/local-media.js.map +1 -0
  80. package/lib/module/native-session.js +360 -0
  81. package/lib/module/native-session.js.map +1 -0
  82. package/lib/module/native.js +87 -0
  83. package/lib/module/native.js.map +1 -0
  84. package/lib/module/package.json +1 -0
  85. package/lib/module/permissions.js +160 -0
  86. package/lib/module/permissions.js.map +1 -0
  87. package/lib/module/platform/android.js +122 -0
  88. package/lib/module/platform/android.js.map +1 -0
  89. package/lib/module/platform/common.js +128 -0
  90. package/lib/module/platform/common.js.map +1 -0
  91. package/lib/module/platform/devices.js +142 -0
  92. package/lib/module/platform/devices.js.map +1 -0
  93. package/lib/module/platform/index.js +24 -0
  94. package/lib/module/platform/index.js.map +1 -0
  95. package/lib/module/platform/ios.js +49 -0
  96. package/lib/module/platform/ios.js.map +1 -0
  97. package/lib/module/platform/streams.js +268 -0
  98. package/lib/module/platform/streams.js.map +1 -0
  99. package/lib/module/platform/timers.js +67 -0
  100. package/lib/module/platform/timers.js.map +1 -0
  101. package/lib/module/platform/visibility.js +54 -0
  102. package/lib/module/platform/visibility.js.map +1 -0
  103. package/lib/module/preflight.js +72 -0
  104. package/lib/module/preflight.js.map +1 -0
  105. package/lib/module/provider.js +70 -0
  106. package/lib/module/provider.js.map +1 -0
  107. package/lib/module/specs/NativeVoltkitRtc.js +37 -0
  108. package/lib/module/specs/NativeVoltkitRtc.js.map +1 -0
  109. package/lib/typescript/commonjs/audio.d.ts +58 -0
  110. package/lib/typescript/commonjs/audio.d.ts.map +1 -0
  111. package/lib/typescript/commonjs/components.d.ts +58 -0
  112. package/lib/typescript/commonjs/components.d.ts.map +1 -0
  113. package/lib/typescript/commonjs/create-client.d.ts +35 -0
  114. package/lib/typescript/commonjs/create-client.d.ts.map +1 -0
  115. package/lib/typescript/commonjs/errors.d.ts +34 -0
  116. package/lib/typescript/commonjs/errors.d.ts.map +1 -0
  117. package/lib/typescript/commonjs/globals.d.ts +16 -0
  118. package/lib/typescript/commonjs/globals.d.ts.map +1 -0
  119. package/lib/typescript/commonjs/index.d.ts +24 -0
  120. package/lib/typescript/commonjs/index.d.ts.map +1 -0
  121. package/lib/typescript/commonjs/local-media.d.ts +86 -0
  122. package/lib/typescript/commonjs/local-media.d.ts.map +1 -0
  123. package/lib/typescript/commonjs/native-session.d.ts +38 -0
  124. package/lib/typescript/commonjs/native-session.d.ts.map +1 -0
  125. package/lib/typescript/commonjs/native.d.ts +18 -0
  126. package/lib/typescript/commonjs/native.d.ts.map +1 -0
  127. package/lib/typescript/commonjs/package.json +1 -0
  128. package/lib/typescript/commonjs/permissions.d.ts +30 -0
  129. package/lib/typescript/commonjs/permissions.d.ts.map +1 -0
  130. package/lib/typescript/commonjs/platform/android.d.ts +4 -0
  131. package/lib/typescript/commonjs/platform/android.d.ts.map +1 -0
  132. package/lib/typescript/commonjs/platform/common.d.ts +101 -0
  133. package/lib/typescript/commonjs/platform/common.d.ts.map +1 -0
  134. package/lib/typescript/commonjs/platform/devices.d.ts +42 -0
  135. package/lib/typescript/commonjs/platform/devices.d.ts.map +1 -0
  136. package/lib/typescript/commonjs/platform/index.d.ts +6 -0
  137. package/lib/typescript/commonjs/platform/index.d.ts.map +1 -0
  138. package/lib/typescript/commonjs/platform/ios.d.ts +4 -0
  139. package/lib/typescript/commonjs/platform/ios.d.ts.map +1 -0
  140. package/lib/typescript/commonjs/platform/streams.d.ts +82 -0
  141. package/lib/typescript/commonjs/platform/streams.d.ts.map +1 -0
  142. package/lib/typescript/commonjs/platform/timers.d.ts +19 -0
  143. package/lib/typescript/commonjs/platform/timers.d.ts.map +1 -0
  144. package/lib/typescript/commonjs/platform/visibility.d.ts +11 -0
  145. package/lib/typescript/commonjs/platform/visibility.d.ts.map +1 -0
  146. package/lib/typescript/commonjs/preflight.d.ts +19 -0
  147. package/lib/typescript/commonjs/preflight.d.ts.map +1 -0
  148. package/lib/typescript/commonjs/provider.d.ts +35 -0
  149. package/lib/typescript/commonjs/provider.d.ts.map +1 -0
  150. package/lib/typescript/commonjs/specs/NativeVoltkitRtc.d.ts +157 -0
  151. package/lib/typescript/commonjs/specs/NativeVoltkitRtc.d.ts.map +1 -0
  152. package/lib/typescript/module/audio.d.ts +58 -0
  153. package/lib/typescript/module/audio.d.ts.map +1 -0
  154. package/lib/typescript/module/components.d.ts +58 -0
  155. package/lib/typescript/module/components.d.ts.map +1 -0
  156. package/lib/typescript/module/create-client.d.ts +35 -0
  157. package/lib/typescript/module/create-client.d.ts.map +1 -0
  158. package/lib/typescript/module/errors.d.ts +34 -0
  159. package/lib/typescript/module/errors.d.ts.map +1 -0
  160. package/lib/typescript/module/globals.d.ts +16 -0
  161. package/lib/typescript/module/globals.d.ts.map +1 -0
  162. package/lib/typescript/module/index.d.ts +24 -0
  163. package/lib/typescript/module/index.d.ts.map +1 -0
  164. package/lib/typescript/module/local-media.d.ts +86 -0
  165. package/lib/typescript/module/local-media.d.ts.map +1 -0
  166. package/lib/typescript/module/native-session.d.ts +38 -0
  167. package/lib/typescript/module/native-session.d.ts.map +1 -0
  168. package/lib/typescript/module/native.d.ts +18 -0
  169. package/lib/typescript/module/native.d.ts.map +1 -0
  170. package/lib/typescript/module/package.json +1 -0
  171. package/lib/typescript/module/permissions.d.ts +30 -0
  172. package/lib/typescript/module/permissions.d.ts.map +1 -0
  173. package/lib/typescript/module/platform/android.d.ts +4 -0
  174. package/lib/typescript/module/platform/android.d.ts.map +1 -0
  175. package/lib/typescript/module/platform/common.d.ts +101 -0
  176. package/lib/typescript/module/platform/common.d.ts.map +1 -0
  177. package/lib/typescript/module/platform/devices.d.ts +42 -0
  178. package/lib/typescript/module/platform/devices.d.ts.map +1 -0
  179. package/lib/typescript/module/platform/index.d.ts +6 -0
  180. package/lib/typescript/module/platform/index.d.ts.map +1 -0
  181. package/lib/typescript/module/platform/ios.d.ts +4 -0
  182. package/lib/typescript/module/platform/ios.d.ts.map +1 -0
  183. package/lib/typescript/module/platform/streams.d.ts +82 -0
  184. package/lib/typescript/module/platform/streams.d.ts.map +1 -0
  185. package/lib/typescript/module/platform/timers.d.ts +19 -0
  186. package/lib/typescript/module/platform/timers.d.ts.map +1 -0
  187. package/lib/typescript/module/platform/visibility.d.ts +11 -0
  188. package/lib/typescript/module/platform/visibility.d.ts.map +1 -0
  189. package/lib/typescript/module/preflight.d.ts +19 -0
  190. package/lib/typescript/module/preflight.d.ts.map +1 -0
  191. package/lib/typescript/module/provider.d.ts +35 -0
  192. package/lib/typescript/module/provider.d.ts.map +1 -0
  193. package/lib/typescript/module/specs/NativeVoltkitRtc.d.ts +157 -0
  194. package/lib/typescript/module/specs/NativeVoltkitRtc.d.ts.map +1 -0
  195. package/package.json +140 -4
  196. package/plugin/build/android.d.ts +36 -0
  197. package/plugin/build/android.js +265 -0
  198. package/plugin/build/index.d.ts +9 -0
  199. package/plugin/build/index.js +54 -0
  200. package/plugin/build/ios.d.ts +4 -0
  201. package/plugin/build/ios.js +43 -0
  202. package/plugin/build/options.d.ts +93 -0
  203. package/plugin/build/options.js +140 -0
  204. package/react-native.config.js +11 -0
  205. package/src/audio.ts +221 -0
  206. package/src/components.tsx +233 -0
  207. package/src/create-client.ts +53 -0
  208. package/src/errors.ts +81 -0
  209. package/src/globals.ts +54 -0
  210. package/src/index.ts +95 -0
  211. package/src/local-media.ts +420 -0
  212. package/src/native-session.tsx +384 -0
  213. package/src/native.ts +84 -0
  214. package/src/permissions.ts +173 -0
  215. package/src/platform/android.ts +128 -0
  216. package/src/platform/common.ts +157 -0
  217. package/src/platform/devices.ts +148 -0
  218. package/src/platform/index.ts +22 -0
  219. package/src/platform/ios.ts +48 -0
  220. package/src/platform/streams.ts +285 -0
  221. package/src/platform/timers.ts +72 -0
  222. package/src/platform/visibility.ts +59 -0
  223. package/src/preflight.ts +60 -0
  224. package/src/provider.tsx +88 -0
  225. package/src/specs/NativeVoltkitRtc.ts +180 -0
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * @voltkit-rtc/react-native: VoltKit RTC calls, audio rooms and live video in React Native (Android; iOS in preview),
5
+ * with the hooks of @voltkit-rtc/react on @voltkit-rtc/client, react-native-webrtc for WebRTC, and native background
6
+ * calls, audio routing and an Expo config plugin.
7
+ *
8
+ * Importing it installs react-native-webrtc's globals (registerVoltkitGlobals), which does nothing and throws nothing
9
+ * where react-native-webrtc's native module is missing (Expo Go): the provider then reports it.
10
+ *
11
+ * A React call screen ports by changing the import: VoltkitProvider, useLocalMedia, VideoTrack and AudioTrack are this
12
+ * package's own, and every other hook is @voltkit-rtc/react's, re-exported. ChatClient and RpcError come from
13
+ * @voltkit-rtc/client, as with React.
14
+ */
15
+ import { registerVoltkitGlobals } from "./globals.js";
16
+ registerVoltkitGlobals();
17
+ export { registerVoltkitGlobals } from "./globals.js";
18
+ export { createClient, reactNativeClientOptions } from "./create-client.js";
19
+ export { preflight } from "./preflight.js";
20
+ export { reactNativePlatform } from "./platform/index.js";
21
+ export { VoltkitProvider } from "./provider.js";
22
+ export { useCallService } from "./native-session.js";
23
+ export { useLocalMedia } from "./local-media.js";
24
+ export { VideoTrack, AudioTrack } from "./components.js";
25
+ export { useAudioOutput, setSpeakerphoneOn, selectAudioOutput } from "./audio.js";
26
+ export { requestMediaPermissions, checkMediaPermissions, usePermissions } from "./permissions.js";
27
+ export { SDK_VERSION } from "./native.js";
28
+
29
+ // The hooks of @voltkit-rtc/react, unchanged: they read the client this package's provider makes.
30
+ export { useVoltkitClient, useRoom, useConnectionState, useParticipants, useRemoteTracks, useNetworkQuality, useWalletLow, useVoltkitEvent, useActiveSpeakers, useAudioLevels, useCpuConstrained, useDevices, useIsSpeaking, useMediaWarnings, usePublishFallback, useStreamFallback } from '@voltkit-rtc/react';
31
+
32
+ // The SDK's types these hooks take and return, so an app needs one import.
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["registerVoltkitGlobals","createClient","reactNativeClientOptions","preflight","reactNativePlatform","VoltkitProvider","useCallService","useLocalMedia","VideoTrack","AudioTrack","useAudioOutput","setSpeakerphoneOn","selectAudioOutput","requestMediaPermissions","checkMediaPermissions","usePermissions","SDK_VERSION","useVoltkitClient","useRoom","useConnectionState","useParticipants","useRemoteTracks","useNetworkQuality","useWalletLow","useVoltkitEvent","useActiveSpeakers","useAudioLevels","useCpuConstrained","useDevices","useIsSpeaking","useMediaWarnings","usePublishFallback","useStreamFallback"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASA,sBAAsB,QAAQ,cAAW;AAElDA,sBAAsB,CAAC,CAAC;AAExB,SAASA,sBAAsB,QAAQ,cAAW;AAClD,SAASC,YAAY,EAAEC,wBAAwB,QAAQ,oBAAiB;AAExE,SAASC,SAAS,QAAQ,gBAAa;AAEvC,SAASC,mBAAmB,QAAQ,qBAAY;AAEhD,SAASC,eAAe,QAAQ,eAAY;AAE5C,SAASC,cAAc,QAAQ,qBAAkB;AAEjD,SAASC,aAAa,QAAQ,kBAAe;AAE7C,SAASC,UAAU,EAAEC,UAAU,QAAQ,iBAAc;AAErD,SAASC,cAAc,EAAEC,iBAAiB,EAAEC,iBAAiB,QAAQ,YAAS;AAE9E,SAASC,uBAAuB,EAAEC,qBAAqB,EAAEC,cAAc,QAAQ,kBAAe;AAE9F,SAASC,WAAW,QAAQ,aAAU;;AAEtC;AACA,SACEC,gBAAgB,EAChBC,OAAO,EACPC,kBAAkB,EAClBC,eAAe,EACfC,eAAe,EACfC,iBAAiB,EACjBC,YAAY,EACZC,eAAe,EACfC,iBAAiB,EACjBC,cAAc,EACdC,iBAAiB,EACjBC,UAAU,EACVC,aAAa,EACbC,gBAAgB,EAChBC,kBAAkB,EAClBC,iBAAiB,QACZ,oBAAoB;;AAG3B","ignoreList":[]}
@@ -0,0 +1,387 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Your camera, microphone and screen on React Native: @voltkit-rtc/react's useLocalMedia, plus switchCamera() and
5
+ * facingMode. publish() asks for the permissions it needs before any device opens -- a refusal rejects with
6
+ * `media-unavailable` `{ permission, status }`, the camera light never comes on and getUserMedia is never called --
7
+ * then opens the devices through react-native-webrtc at the size and frame rate it will send.
8
+ *
9
+ * What is captured here is released in the right order when the client stops it (platform/streams.ts): the app never
10
+ * releases a stream or track it got from publish().
11
+ */
12
+ import { useMemo, useSyncExternalStore } from 'react';
13
+ import { allowedQuality, DEFAULT_MEDIA_PERMISSIONS, RpcError } from '@voltkit-rtc/client';
14
+ import { useVoltkitClient } from '@voltkit-rtc/react';
15
+ import { permissionRefused, webrtcMissing } from "./errors.js";
16
+ import { requestMediaPermissions } from "./permissions.js";
17
+ import { registerVoltkitGlobals } from "./globals.js";
18
+ import { reactNativePlatform } from "./platform/index.js";
19
+ import { streamBook } from "./platform/streams.js";
20
+ import { listCameras } from "./platform/devices.js";
21
+ import { localStream } from "./platform/common.js";
22
+
23
+ /** A camera's or microphone's constraints, as the client declares them (this package compiles without the DOM library). */
24
+
25
+ // --------------------------------------------------------------------------------------- what only events tell
26
+
27
+ /**
28
+ * Per client: the screen being shared (only events tell it) and a signal for what changes without an event (publish,
29
+ * a camera switch). Recorded while held: the provider holds its client's for as long as it has the client.
30
+ */
31
+ class LocalSession {
32
+ screen = null;
33
+ listeners = new Set();
34
+ holders = 0;
35
+ stopListening = null;
36
+ constructor(client) {
37
+ this.client = client;
38
+ }
39
+ hold() {
40
+ if (this.holders++ === 0) this.stopListening = this.listen();
41
+ let held = true;
42
+ return () => {
43
+ if (!held) return;
44
+ held = false;
45
+ if (--this.holders === 0) {
46
+ this.stopListening?.();
47
+ this.stopListening = null;
48
+ }
49
+ };
50
+ }
51
+ subscribe(listener) {
52
+ this.listeners.add(listener);
53
+ return () => {
54
+ this.listeners.delete(listener);
55
+ };
56
+ }
57
+ changed() {
58
+ for (const listener of [...this.listeners]) listener();
59
+ }
60
+ listen() {
61
+ const client = this.client;
62
+ const offs = [client.on('screenShareStarted', ({
63
+ stream
64
+ }) => {
65
+ // The client's stream type is the web's; on React Native it is react-native-webrtc's stream.
66
+ this.screen = stream;
67
+ this.changed();
68
+ }), client.on('screenShareEnded', () => this.endScreen()), client.on('connectionStateChanged', ({
69
+ state
70
+ }) => {
71
+ if (state === 'closed') this.endScreen();
72
+ })];
73
+ return () => {
74
+ for (const off of offs) off();
75
+ };
76
+ }
77
+ endScreen() {
78
+ if (!this.screen) return;
79
+ this.screen = null;
80
+ this.changed();
81
+ }
82
+ }
83
+ const sessions = new WeakMap();
84
+ export function localSessionOf(client) {
85
+ let session = sessions.get(client);
86
+ if (!session) {
87
+ session = new LocalSession(client);
88
+ sessions.set(client, session);
89
+ }
90
+ return session;
91
+ }
92
+
93
+ // ------------------------------------------------------------------------------------------------- the state
94
+
95
+ const EVENTS = ['localMediaChanged', 'localStreamChanged', 'screenShareStarted', 'screenShareEnded', 'joined', 'connectionStateChanged', 'error'];
96
+ const FALLBACK = Object.freeze({
97
+ stream: null,
98
+ publishing: false,
99
+ micEnabled: false,
100
+ camEnabled: false,
101
+ audioQuality: 'std',
102
+ videoQuality: DEFAULT_MEDIA_PERMISSIONS.maxVideoQuality,
103
+ videoFrameRate: 30,
104
+ screenSharing: false,
105
+ screenStream: null,
106
+ permissions: DEFAULT_MEDIA_PERMISSIONS,
107
+ facingMode: null
108
+ });
109
+ function facingOf(client) {
110
+ const settings = localStream(client)?.getVideoTracks()[0]?.getSettings();
111
+ const facing = settings?.facingMode;
112
+ return facing === 'user' || facing === 'environment' ? facing : null;
113
+ }
114
+ function read(client, session) {
115
+ return {
116
+ stream: localStream(client),
117
+ publishing: client.publishing,
118
+ micEnabled: client.micEnabled,
119
+ camEnabled: client.camEnabled,
120
+ audioQuality: client.audioQuality,
121
+ videoQuality: client.videoQuality,
122
+ videoFrameRate: client.videoFrameRate,
123
+ screenSharing: session.screen !== null,
124
+ screenStream: session.screen,
125
+ permissions: client.mediaPermissions,
126
+ facingMode: facingOf(client)
127
+ };
128
+ }
129
+ function sameFields(a, b) {
130
+ const keys = Object.keys(a);
131
+ return keys.length === Object.keys(b).length && keys.every(key => Object.is(a[key], b[key]));
132
+ }
133
+
134
+ /** The local state of `client`, read again after the events that change it and the calls that emit none. */
135
+ function localSource(client) {
136
+ const session = localSessionOf(client);
137
+ let version = 0;
138
+ let cache = null;
139
+ return {
140
+ subscribe(onChange) {
141
+ const changed = () => {
142
+ version += 1;
143
+ onChange();
144
+ };
145
+ const offs = EVENTS.map(event => client.on(event, changed));
146
+ offs.push(session.hold(), session.subscribe(changed));
147
+ version += 1;
148
+ return () => {
149
+ for (const off of offs) off();
150
+ };
151
+ },
152
+ getSnapshot() {
153
+ if (cache?.version === version) return cache.value;
154
+ const next = read(client, session);
155
+ if (cache) {
156
+ // `mediaPermissions` is a new object on every read.
157
+ const permissions = sameFields(cache.value.permissions, next.permissions) ? cache.value.permissions : next.permissions;
158
+ const settled = {
159
+ ...next,
160
+ permissions
161
+ };
162
+ const value = sameFields(cache.value, settled) ? cache.value : settled;
163
+ cache = {
164
+ version,
165
+ value
166
+ };
167
+ return value;
168
+ }
169
+ cache = {
170
+ version,
171
+ value: next
172
+ };
173
+ return next;
174
+ }
175
+ };
176
+ }
177
+ const noSubscription = () => () => undefined;
178
+ const fallback = () => FALLBACK;
179
+
180
+ /** Your camera, microphone and screen: what is published, and the calls that change it. */
181
+ export function useLocalMedia() {
182
+ const client = useVoltkitClient();
183
+ const source = useMemo(() => client ? localSource(client) : null, [client]);
184
+ const state = useSyncExternalStore(source ? source.subscribe : noSubscription, source ? source.getSnapshot : fallback, fallback);
185
+ const actions = useMemo(() => localActions(client), [client]);
186
+ return useMemo(() => ({
187
+ ...state,
188
+ ...actions
189
+ }), [state, actions]);
190
+ }
191
+ function localActions(client) {
192
+ async function call(task) {
193
+ if (!client) throw new RpcError('not-connected', 'no client yet: call this inside a VoltkitProvider that has one');
194
+ try {
195
+ return await task(client);
196
+ } finally {
197
+ // publish(), a camera switch and the quality changes emit no event: read again.
198
+ localSessionOf(client).changed();
199
+ }
200
+ }
201
+ return {
202
+ publish: (options = {}) => call(c => publishDevices(c, options)),
203
+ unpublish: () => call(c => c.unpublish()),
204
+ setMicEnabled: on => call(c => c.setMicEnabled(on)),
205
+ setCamEnabled: on => call(c => c.setCamEnabled(on)),
206
+ setAudioQuality: quality => call(c => c.setAudioQuality(quality)),
207
+ setVideoQuality: quality => call(async c => {
208
+ await raiseCapture(c, quality);
209
+ return c.setVideoQuality(quality);
210
+ }),
211
+ setVideoFrameRate: frameRate => call(c => c.setVideoFrameRate(frameRate)),
212
+ switchCamera: () => call(c => switchCamera(c)),
213
+ startScreenShare: options => call(async c => await c.publishScreen(options)),
214
+ stopScreenShare: () => call(c => c.unpublishScreen())
215
+ };
216
+ }
217
+
218
+ // ----------------------------------------------------------------------------------------------------- publish
219
+
220
+ /** Clients with a publish() between asking for permissions and publishing. */
221
+ const publishing = new WeakSet();
222
+ async function publishDevices(client, options) {
223
+ // facingMode is a capture choice, not a publish option.
224
+ const {
225
+ audio = true,
226
+ video = true,
227
+ facingMode: _facingMode,
228
+ ...publishOptions
229
+ } = options;
230
+ if (audio === false && video === false) throw new TypeError('publish: ask for audio, video or both');
231
+ // Everything that would refuse the publish is checked before a permission is asked for or a device opens.
232
+ if (client.connectionState !== 'connected') throw new RpcError('not-connected', 'connect before publishing');
233
+ const role = client.info?.role;
234
+ if (role !== 'host' && role !== 'cohost') throw new RpcError('forbidden', 'only hosts and cohosts can publish');
235
+ if (publishing.has(client) || localStream(client)?.getTracks().some(track => track.readyState === 'live')) {
236
+ throw new RpcError('source-already-published', 'already publishing: unpublish() first');
237
+ }
238
+ const permissions = client.mediaPermissions;
239
+ if (audio !== false && !permissions.audio) throw new RpcError('media-disabled', 'audio is switched off for this project');
240
+ if (video !== false && !permissions.video) throw new RpcError('media-disabled', 'video is switched off for this project');
241
+ if (!registerVoltkitGlobals()) throw webrtcMissing();
242
+ publishing.add(client);
243
+ try {
244
+ const kinds = [];
245
+ if (video !== false) kinds.push('camera');
246
+ if (audio !== false) kinds.push('microphone');
247
+ const statuses = await requestMediaPermissions(kinds);
248
+ for (const kind of kinds) {
249
+ const status = statuses[kind];
250
+ if (status !== 'granted') throw permissionRefused(kind, status);
251
+ }
252
+ // The dialog stays up as long as the user thinks: the call may be over by now (the screen unmounted, a kick, the
253
+ // room closed). Nothing opens a device for a session that is gone.
254
+ if (client.connectionState !== 'connected') throw new RpcError('not-connected', 'the session ended while the permissions were being asked for');
255
+ const constraints = captureConstraints(options, permissions);
256
+ const platform = reactNativePlatform();
257
+ const stream = await platform.getUserMedia(constraints);
258
+ try {
259
+ // With the constraints, a reconnect that finds the devices gone opens them again.
260
+ await client.publish(stream, constraints, publishOptions);
261
+ } catch (error) {
262
+ // Released here, the stream before its tracks (platform/streams.ts): the client kept none of it.
263
+ const book = streamBook();
264
+ const tracks = stream.getTracks();
265
+ book.release(stream);
266
+ for (const track of tracks) book.stop(track);
267
+ throw error;
268
+ }
269
+ } finally {
270
+ publishing.delete(client);
271
+ }
272
+ }
273
+
274
+ /** Each quality's 16:9 frame, as the SDK sends it. */
275
+ const FRAMES = {
276
+ '1080p': {
277
+ width: 1920,
278
+ height: 1080
279
+ },
280
+ '720p': {
281
+ width: 1280,
282
+ height: 720
283
+ },
284
+ '480p': {
285
+ width: 854,
286
+ height: 480
287
+ }
288
+ };
289
+
290
+ /** What publish() captures: never more than the project allows, which the SDK would only scale down. */
291
+ function captureConstraints(options, permissions) {
292
+ const {
293
+ audio = true,
294
+ video = true
295
+ } = options;
296
+ return {
297
+ audio: audio === true ? microphone(options.audioQuality === 'hd' && permissions.audioQualityMax === 'hd') : audio,
298
+ video: video === true ? camera(options, permissions) : video
299
+ };
300
+ }
301
+ function microphone(hd) {
302
+ const constraints = {
303
+ echoCancellation: true,
304
+ noiseSuppression: true,
305
+ autoGainControl: true
306
+ };
307
+ // HD is stereo, which needs a capture with two channels to send.
308
+ if (hd) constraints.channelCount = {
309
+ ideal: 2
310
+ };
311
+ return constraints;
312
+ }
313
+ function camera(options, permissions) {
314
+ const fps = options.frameRate === 60 && permissions.maxFrameRate === 60 ? 60 : 30;
315
+ const {
316
+ width,
317
+ height
318
+ } = FRAMES[allowedQuality(options.quality, {
319
+ maxQuality: permissions.maxVideoQuality
320
+ })];
321
+ return {
322
+ width: {
323
+ ideal: width
324
+ },
325
+ height: {
326
+ ideal: height
327
+ },
328
+ frameRate: {
329
+ ideal: fps,
330
+ max: fps
331
+ },
332
+ facingMode: options.facingMode ?? 'user'
333
+ };
334
+ }
335
+
336
+ /** The SDK sends no bigger than the camera's picture: a switch to a higher quality raises the capture first. Best effort. */
337
+ async function raiseCapture(client, quality) {
338
+ const track = localStream(client)?.getVideoTracks()[0];
339
+ if (!track || track.readyState !== 'live') return;
340
+ const frame = FRAMES[allowedQuality(quality, {
341
+ maxQuality: client.mediaPermissions.maxVideoQuality
342
+ })];
343
+ const {
344
+ width = 0,
345
+ height = 0
346
+ } = track.getSettings();
347
+ if (Math.max(width, height) >= frame.width && Math.min(width, height) >= frame.height) return;
348
+ try {
349
+ await track.applyConstraints({
350
+ ...track.getConstraints(),
351
+ width: {
352
+ ideal: frame.width
353
+ },
354
+ height: {
355
+ ideal: frame.height
356
+ }
357
+ });
358
+ } catch {
359
+ // The camera keeps its size; the SDK sends what it has.
360
+ }
361
+ }
362
+
363
+ // ------------------------------------------------------------------------------------------------ switchCamera
364
+
365
+ /** Camera switches in turn per client: each one reads where the last one left the camera. */
366
+ const switching = new WeakMap();
367
+ function switchCamera(client) {
368
+ const previous = switching.get(client) ?? Promise.resolve();
369
+ const next = previous.catch(() => undefined).then(() => flipCamera(client));
370
+ switching.set(client, next);
371
+ return next;
372
+ }
373
+ async function flipCamera(client) {
374
+ const track = localStream(client)?.getVideoTracks()[0];
375
+ if (!track || track.readyState !== 'live') {
376
+ throw new RpcError('media-unavailable', 'switchCamera: no camera is being published');
377
+ }
378
+ const settings = track.getSettings();
379
+ const cameras = await listCameras();
380
+ const current = cameras.find(c => c.deviceId === settings.deviceId);
381
+ const front = current ? current.facing === 'front' : settings.facingMode !== 'environment';
382
+ const target = cameras.find(c => c.deviceId !== settings.deviceId && c.facing === 'front' !== front);
383
+ if (!target) return front;
384
+ await client.switchDevice('videoinput', target.deviceId);
385
+ return target.facing === 'front';
386
+ }
387
+ //# sourceMappingURL=local-media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useMemo","useSyncExternalStore","allowedQuality","DEFAULT_MEDIA_PERMISSIONS","RpcError","useVoltkitClient","permissionRefused","webrtcMissing","requestMediaPermissions","registerVoltkitGlobals","reactNativePlatform","streamBook","listCameras","localStream","LocalSession","screen","listeners","Set","holders","stopListening","constructor","client","hold","listen","held","subscribe","listener","add","delete","changed","offs","on","stream","endScreen","state","off","sessions","WeakMap","localSessionOf","session","get","set","EVENTS","FALLBACK","Object","freeze","publishing","micEnabled","camEnabled","audioQuality","videoQuality","maxVideoQuality","videoFrameRate","screenSharing","screenStream","permissions","facingMode","facingOf","settings","getVideoTracks","getSettings","facing","read","mediaPermissions","sameFields","a","b","keys","length","every","key","is","localSource","version","cache","onChange","map","event","push","getSnapshot","value","next","settled","noSubscription","undefined","fallback","useLocalMedia","source","actions","localActions","call","task","publish","options","c","publishDevices","unpublish","setMicEnabled","setCamEnabled","setAudioQuality","quality","setVideoQuality","raiseCapture","setVideoFrameRate","frameRate","switchCamera","startScreenShare","publishScreen","stopScreenShare","unpublishScreen","WeakSet","audio","video","_facingMode","publishOptions","TypeError","connectionState","role","info","has","getTracks","some","track","readyState","kinds","statuses","kind","status","constraints","captureConstraints","platform","getUserMedia","error","book","tracks","release","stop","FRAMES","width","height","microphone","audioQualityMax","camera","hd","echoCancellation","noiseSuppression","autoGainControl","channelCount","ideal","fps","maxFrameRate","maxQuality","max","frame","Math","min","applyConstraints","getConstraints","switching","previous","Promise","resolve","catch","then","flipCamera","cameras","current","find","deviceId","front","target","switchDevice"],"sourceRoot":"../../src","sources":["local-media.ts"],"mappings":"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","ignoreList":[]}