@voltkit-rtc/react-native 0.0.0-stage → 0.1.0
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/CHANGELOG.md +96 -0
- package/LICENSE +21 -0
- package/README.md +1606 -2
- package/android/build.gradle +70 -0
- package/android/consumer-rules.pro +21 -0
- package/android/src/main/AndroidManifest.xml +25 -0
- package/android/src/main/java/com/voltkit/rtc/reactnative/AppVisibility.kt +67 -0
- package/android/src/main/java/com/voltkit/rtc/reactnative/AudioDevices.kt +67 -0
- package/android/src/main/java/com/voltkit/rtc/reactnative/AudioRouter.kt +487 -0
- package/android/src/main/java/com/voltkit/rtc/reactnative/CallServiceTypes.kt +120 -0
- package/android/src/main/java/com/voltkit/rtc/reactnative/NativeTimers.kt +106 -0
- package/android/src/main/java/com/voltkit/rtc/reactnative/NetworkWatch.kt +120 -0
- package/android/src/main/java/com/voltkit/rtc/reactnative/OutputChoice.kt +65 -0
- package/android/src/main/java/com/voltkit/rtc/reactnative/RtcConfig.kt +83 -0
- package/android/src/main/java/com/voltkit/rtc/reactnative/ScoLink.kt +61 -0
- package/android/src/main/java/com/voltkit/rtc/reactnative/VoltkitCallService.kt +287 -0
- package/android/src/main/java/com/voltkit/rtc/reactnative/VoltkitRtcInitProvider.kt +215 -0
- package/android/src/main/java/com/voltkit/rtc/reactnative/VoltkitRtcModule.kt +313 -0
- package/android/src/main/java/com/voltkit/rtc/reactnative/VoltkitRtcPackage.kt +30 -0
- package/android/src/main/res/drawable/voltkit_rtc_default_call_icon.xml +15 -0
- package/android/src/main/res/raw/voltkit_rtc_keep.xml +7 -0
- package/app.plugin.js +17 -0
- package/lib/commonjs/audio.js +215 -0
- package/lib/commonjs/audio.js.map +1 -0
- package/lib/commonjs/components.js +207 -0
- package/lib/commonjs/components.js.map +1 -0
- package/lib/commonjs/create-client.js +47 -0
- package/lib/commonjs/create-client.js.map +1 -0
- package/lib/commonjs/errors.js +99 -0
- package/lib/commonjs/errors.js.map +1 -0
- package/lib/commonjs/globals.js +61 -0
- package/lib/commonjs/globals.js.map +1 -0
- package/lib/commonjs/index.js +234 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/local-media.js +392 -0
- package/lib/commonjs/local-media.js.map +1 -0
- package/lib/commonjs/native-session.js +314 -0
- package/lib/commonjs/native-session.js.map +1 -0
- package/lib/commonjs/native.js +99 -0
- package/lib/commonjs/native.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/permissions.js +166 -0
- package/lib/commonjs/permissions.js.map +1 -0
- package/lib/commonjs/platform/android.js +126 -0
- package/lib/commonjs/platform/android.js.map +1 -0
- package/lib/commonjs/platform/common.js +138 -0
- package/lib/commonjs/platform/common.js.map +1 -0
- package/lib/commonjs/platform/devices.js +151 -0
- package/lib/commonjs/platform/devices.js.map +1 -0
- package/lib/commonjs/platform/index.js +35 -0
- package/lib/commonjs/platform/index.js.map +1 -0
- package/lib/commonjs/platform/ios.js +54 -0
- package/lib/commonjs/platform/ios.js.map +1 -0
- package/lib/commonjs/platform/streams.js +273 -0
- package/lib/commonjs/platform/streams.js.map +1 -0
- package/lib/commonjs/platform/timers.js +71 -0
- package/lib/commonjs/platform/timers.js.map +1 -0
- package/lib/commonjs/platform/visibility.js +60 -0
- package/lib/commonjs/platform/visibility.js.map +1 -0
- package/lib/commonjs/preflight.js +77 -0
- package/lib/commonjs/preflight.js.map +1 -0
- package/lib/commonjs/provider.js +73 -0
- package/lib/commonjs/provider.js.map +1 -0
- package/lib/commonjs/specs/NativeVoltkitRtc.js +29 -0
- package/lib/commonjs/specs/NativeVoltkitRtc.js.map +1 -0
- package/lib/module/audio.js +207 -0
- package/lib/module/audio.js.map +1 -0
- package/lib/module/components.js +200 -0
- package/lib/module/components.js.map +1 -0
- package/lib/module/create-client.js +42 -0
- package/lib/module/create-client.js.map +1 -0
- package/lib/module/errors.js +87 -0
- package/lib/module/errors.js.map +1 -0
- package/lib/module/globals.js +53 -0
- package/lib/module/globals.js.map +1 -0
- package/lib/module/index.js +33 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/local-media.js +387 -0
- package/lib/module/local-media.js.map +1 -0
- package/lib/module/native-session.js +309 -0
- package/lib/module/native-session.js.map +1 -0
- package/lib/module/native.js +87 -0
- package/lib/module/native.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/permissions.js +160 -0
- package/lib/module/permissions.js.map +1 -0
- package/lib/module/platform/android.js +122 -0
- package/lib/module/platform/android.js.map +1 -0
- package/lib/module/platform/common.js +128 -0
- package/lib/module/platform/common.js.map +1 -0
- package/lib/module/platform/devices.js +142 -0
- package/lib/module/platform/devices.js.map +1 -0
- package/lib/module/platform/index.js +24 -0
- package/lib/module/platform/index.js.map +1 -0
- package/lib/module/platform/ios.js +49 -0
- package/lib/module/platform/ios.js.map +1 -0
- package/lib/module/platform/streams.js +268 -0
- package/lib/module/platform/streams.js.map +1 -0
- package/lib/module/platform/timers.js +67 -0
- package/lib/module/platform/timers.js.map +1 -0
- package/lib/module/platform/visibility.js +54 -0
- package/lib/module/platform/visibility.js.map +1 -0
- package/lib/module/preflight.js +72 -0
- package/lib/module/preflight.js.map +1 -0
- package/lib/module/provider.js +68 -0
- package/lib/module/provider.js.map +1 -0
- package/lib/module/specs/NativeVoltkitRtc.js +37 -0
- package/lib/module/specs/NativeVoltkitRtc.js.map +1 -0
- package/lib/typescript/commonjs/audio.d.ts +58 -0
- package/lib/typescript/commonjs/audio.d.ts.map +1 -0
- package/lib/typescript/commonjs/components.d.ts +58 -0
- package/lib/typescript/commonjs/components.d.ts.map +1 -0
- package/lib/typescript/commonjs/create-client.d.ts +35 -0
- package/lib/typescript/commonjs/create-client.d.ts.map +1 -0
- package/lib/typescript/commonjs/errors.d.ts +34 -0
- package/lib/typescript/commonjs/errors.d.ts.map +1 -0
- package/lib/typescript/commonjs/globals.d.ts +16 -0
- package/lib/typescript/commonjs/globals.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +24 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/local-media.d.ts +86 -0
- package/lib/typescript/commonjs/local-media.d.ts.map +1 -0
- package/lib/typescript/commonjs/native-session.d.ts +38 -0
- package/lib/typescript/commonjs/native-session.d.ts.map +1 -0
- package/lib/typescript/commonjs/native.d.ts +18 -0
- package/lib/typescript/commonjs/native.d.ts.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/permissions.d.ts +30 -0
- package/lib/typescript/commonjs/permissions.d.ts.map +1 -0
- package/lib/typescript/commonjs/platform/android.d.ts +4 -0
- package/lib/typescript/commonjs/platform/android.d.ts.map +1 -0
- package/lib/typescript/commonjs/platform/common.d.ts +101 -0
- package/lib/typescript/commonjs/platform/common.d.ts.map +1 -0
- package/lib/typescript/commonjs/platform/devices.d.ts +42 -0
- package/lib/typescript/commonjs/platform/devices.d.ts.map +1 -0
- package/lib/typescript/commonjs/platform/index.d.ts +6 -0
- package/lib/typescript/commonjs/platform/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/platform/ios.d.ts +4 -0
- package/lib/typescript/commonjs/platform/ios.d.ts.map +1 -0
- package/lib/typescript/commonjs/platform/streams.d.ts +82 -0
- package/lib/typescript/commonjs/platform/streams.d.ts.map +1 -0
- package/lib/typescript/commonjs/platform/timers.d.ts +19 -0
- package/lib/typescript/commonjs/platform/timers.d.ts.map +1 -0
- package/lib/typescript/commonjs/platform/visibility.d.ts +11 -0
- package/lib/typescript/commonjs/platform/visibility.d.ts.map +1 -0
- package/lib/typescript/commonjs/preflight.d.ts +19 -0
- package/lib/typescript/commonjs/preflight.d.ts.map +1 -0
- package/lib/typescript/commonjs/provider.d.ts +35 -0
- package/lib/typescript/commonjs/provider.d.ts.map +1 -0
- package/lib/typescript/commonjs/specs/NativeVoltkitRtc.d.ts +157 -0
- package/lib/typescript/commonjs/specs/NativeVoltkitRtc.d.ts.map +1 -0
- package/lib/typescript/module/audio.d.ts +58 -0
- package/lib/typescript/module/audio.d.ts.map +1 -0
- package/lib/typescript/module/components.d.ts +58 -0
- package/lib/typescript/module/components.d.ts.map +1 -0
- package/lib/typescript/module/create-client.d.ts +35 -0
- package/lib/typescript/module/create-client.d.ts.map +1 -0
- package/lib/typescript/module/errors.d.ts +34 -0
- package/lib/typescript/module/errors.d.ts.map +1 -0
- package/lib/typescript/module/globals.d.ts +16 -0
- package/lib/typescript/module/globals.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +24 -0
- package/lib/typescript/module/index.d.ts.map +1 -0
- package/lib/typescript/module/local-media.d.ts +86 -0
- package/lib/typescript/module/local-media.d.ts.map +1 -0
- package/lib/typescript/module/native-session.d.ts +38 -0
- package/lib/typescript/module/native-session.d.ts.map +1 -0
- package/lib/typescript/module/native.d.ts +18 -0
- package/lib/typescript/module/native.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/permissions.d.ts +30 -0
- package/lib/typescript/module/permissions.d.ts.map +1 -0
- package/lib/typescript/module/platform/android.d.ts +4 -0
- package/lib/typescript/module/platform/android.d.ts.map +1 -0
- package/lib/typescript/module/platform/common.d.ts +101 -0
- package/lib/typescript/module/platform/common.d.ts.map +1 -0
- package/lib/typescript/module/platform/devices.d.ts +42 -0
- package/lib/typescript/module/platform/devices.d.ts.map +1 -0
- package/lib/typescript/module/platform/index.d.ts +6 -0
- package/lib/typescript/module/platform/index.d.ts.map +1 -0
- package/lib/typescript/module/platform/ios.d.ts +4 -0
- package/lib/typescript/module/platform/ios.d.ts.map +1 -0
- package/lib/typescript/module/platform/streams.d.ts +82 -0
- package/lib/typescript/module/platform/streams.d.ts.map +1 -0
- package/lib/typescript/module/platform/timers.d.ts +19 -0
- package/lib/typescript/module/platform/timers.d.ts.map +1 -0
- package/lib/typescript/module/platform/visibility.d.ts +11 -0
- package/lib/typescript/module/platform/visibility.d.ts.map +1 -0
- package/lib/typescript/module/preflight.d.ts +19 -0
- package/lib/typescript/module/preflight.d.ts.map +1 -0
- package/lib/typescript/module/provider.d.ts +35 -0
- package/lib/typescript/module/provider.d.ts.map +1 -0
- package/lib/typescript/module/specs/NativeVoltkitRtc.d.ts +157 -0
- package/lib/typescript/module/specs/NativeVoltkitRtc.d.ts.map +1 -0
- package/package.json +140 -4
- package/plugin/build/android.d.ts +36 -0
- package/plugin/build/android.js +265 -0
- package/plugin/build/index.d.ts +9 -0
- package/plugin/build/index.js +54 -0
- package/plugin/build/ios.d.ts +4 -0
- package/plugin/build/ios.js +43 -0
- package/plugin/build/options.d.ts +93 -0
- package/plugin/build/options.js +140 -0
- package/react-native.config.js +11 -0
- package/src/audio.ts +221 -0
- package/src/components.tsx +233 -0
- package/src/create-client.ts +53 -0
- package/src/errors.ts +81 -0
- package/src/globals.ts +54 -0
- package/src/index.ts +95 -0
- package/src/local-media.ts +420 -0
- package/src/native-session.tsx +338 -0
- package/src/native.ts +84 -0
- package/src/permissions.ts +173 -0
- package/src/platform/android.ts +128 -0
- package/src/platform/common.ts +157 -0
- package/src/platform/devices.ts +148 -0
- package/src/platform/index.ts +22 -0
- package/src/platform/ios.ts +48 -0
- package/src/platform/streams.ts +285 -0
- package/src/platform/timers.ts +72 -0
- package/src/platform/visibility.ts +59 -0
- package/src/preflight.ts +60 -0
- package/src/provider.tsx +86 -0
- 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":[]}
|