@livekit/react-native 2.4.3 → 2.5.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/README.md +7 -7
- package/android/local.properties +8 -0
- package/lib/commonjs/e2ee/RNE2EEManager.js +115 -0
- package/lib/commonjs/e2ee/RNE2EEManager.js.map +1 -0
- package/lib/commonjs/e2ee/RNKeyProvider.js +104 -0
- package/lib/commonjs/e2ee/RNKeyProvider.js.map +1 -0
- package/lib/commonjs/hooks/useE2EEManager.js +38 -0
- package/lib/commonjs/hooks/useE2EEManager.js.map +1 -0
- package/lib/commonjs/hooks.js +42 -0
- package/lib/commonjs/hooks.js.map +1 -1
- package/lib/commonjs/index.js +18 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/e2ee/RNE2EEManager.js +107 -0
- package/lib/module/e2ee/RNE2EEManager.js.map +1 -0
- package/lib/module/e2ee/RNKeyProvider.js +97 -0
- package/lib/module/e2ee/RNKeyProvider.js.map +1 -0
- package/lib/module/hooks/useE2EEManager.js +31 -0
- package/lib/module/hooks/useE2EEManager.js.map +1 -0
- package/lib/module/hooks.js +1 -0
- package/lib/module/hooks.js.map +1 -1
- package/lib/module/index.js +4 -1
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/lib/commonjs/e2ee/RNE2EEManager.d.ts +23 -0
- package/lib/typescript/lib/commonjs/e2ee/RNKeyProvider.d.ts +33 -0
- package/lib/typescript/lib/commonjs/hooks/useE2EEManager.d.ts +8 -0
- package/lib/typescript/lib/commonjs/index.d.ts +2 -0
- package/lib/typescript/lib/module/e2ee/RNE2EEManager.d.ts +21 -0
- package/lib/typescript/lib/module/e2ee/RNKeyProvider.d.ts +30 -0
- package/lib/typescript/lib/module/hooks/useE2EEManager.d.ts +9 -0
- package/lib/typescript/lib/module/hooks.d.ts +1 -0
- package/lib/typescript/lib/module/index.d.ts +3 -1
- package/lib/typescript/src/e2ee/RNE2EEManager.d.ts +27 -0
- package/lib/typescript/src/e2ee/RNKeyProvider.d.ts +35 -0
- package/lib/typescript/src/hooks/useE2EEManager.d.ts +15 -0
- package/lib/typescript/src/hooks.d.ts +2 -0
- package/lib/typescript/src/index.d.ts +4 -2
- package/package.json +5 -4
- package/src/e2ee/RNE2EEManager.ts +199 -0
- package/src/e2ee/RNKeyProvider.ts +116 -0
- package/src/hooks/useE2EEManager.ts +49 -0
- package/src/hooks.ts +2 -0
- package/src/index.tsx +5 -0
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ Use this SDK to add realtime video, audio and data features to your React Native
|
|
|
16
16
|
|
|
17
17
|
> [!NOTE]
|
|
18
18
|
> This is v2 of the React-Native SDK. When migrating from v1.x to v2.x you might encounter a small set of breaking changes.
|
|
19
|
-
> Read the [migration guide](https://docs.livekit.io/
|
|
19
|
+
> Read the [migration guide](https://docs.livekit.io/recipes/migrate-from-v1/) for a detailed overview of what has changed.
|
|
20
20
|
|
|
21
21
|
## Installation
|
|
22
22
|
|
|
@@ -295,7 +295,7 @@ Enabling screenshare requires extra installation steps:
|
|
|
295
295
|
|
|
296
296
|
Android screenshare requires a foreground service with type `mediaProjection` to be present.
|
|
297
297
|
|
|
298
|
-
From version 2.4.0 onwards, the foreground service is handled internally,
|
|
298
|
+
From version 2.4.0 onwards, the foreground service is handled internally,
|
|
299
299
|
but you must declare the permission yourself in your app's AndroidManifest.xml file.
|
|
300
300
|
|
|
301
301
|
```
|
|
@@ -375,15 +375,15 @@ Once setup, [start the foreground service](https://github.com/livekit/client-sdk
|
|
|
375
375
|
|
|
376
376
|
### iOS
|
|
377
377
|
|
|
378
|
-
By default, simple background processing can be enabled by selecting the `audio` and `voip`
|
|
379
|
-
[UIBackgroundModes](https://developer.apple.com/documentation/bundleresources/information_property_list/uibackgroundmodes)
|
|
378
|
+
By default, simple background processing can be enabled by selecting the `audio` and `voip`
|
|
379
|
+
[UIBackgroundModes](https://developer.apple.com/documentation/bundleresources/information_property_list/uibackgroundmodes)
|
|
380
380
|
in your XCode project. In your project, select your app target -> Signing & Capabilities -> Add Capability -> Background Modes.
|
|
381
381
|
|
|
382
382
|
These background modes will keep the app alive in the background as long as a mic or audio track is playing.
|
|
383
383
|
|
|
384
|
-
For a more robust background that isn't sensitive to the above conditions, we suggest using
|
|
385
|
-
[CallKit](https://developer.apple.com/documentation/callkit/) to maintain the
|
|
386
|
-
connection while in the background. The example uses
|
|
384
|
+
For a more robust background that isn't sensitive to the above conditions, we suggest using
|
|
385
|
+
[CallKit](https://developer.apple.com/documentation/callkit/) to maintain the
|
|
386
|
+
connection while in the background. The example uses
|
|
387
387
|
[react-native-callkeep](https://github.com/react-native-webrtc/react-native-callkeep)
|
|
388
388
|
for simple integration with CallKit.
|
|
389
389
|
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
## This file must *NOT* be checked into Version Control Systems,
|
|
2
|
+
# as it contains information specific to your local configuration.
|
|
3
|
+
#
|
|
4
|
+
# Location of the SDK. This is only used by Gradle.
|
|
5
|
+
# For customization when using a Version Control System, please read the
|
|
6
|
+
# header note.
|
|
7
|
+
#Mon Nov 18 17:25:28 PST 2024
|
|
8
|
+
sdk.dir=/Users/davidliu/Library/Android/sdk
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _reactNativeWebrtc = require("@livekit/react-native-webrtc");
|
|
8
|
+
var _livekitClient = require("livekit-client");
|
|
9
|
+
var _events = _interopRequireDefault(require("events"));
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
12
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
13
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
14
|
+
/**
|
|
15
|
+
* @experimental
|
|
16
|
+
*/
|
|
17
|
+
class RNE2EEManager extends _events.default {
|
|
18
|
+
constructor(keyProvider) {
|
|
19
|
+
super();
|
|
20
|
+
_defineProperty(this, "room", void 0);
|
|
21
|
+
_defineProperty(this, "frameCryptors", new Map());
|
|
22
|
+
_defineProperty(this, "keyProvider", void 0);
|
|
23
|
+
_defineProperty(this, "algorithm", _reactNativeWebrtc.RTCFrameCryptorAlgorithm.kAesGcm);
|
|
24
|
+
_defineProperty(this, "encryptionEnabled", false);
|
|
25
|
+
this.keyProvider = keyProvider;
|
|
26
|
+
this.encryptionEnabled = false;
|
|
27
|
+
}
|
|
28
|
+
setup(room) {
|
|
29
|
+
if (this.room !== room) {
|
|
30
|
+
this.room = room;
|
|
31
|
+
this.setupEventListeners(room);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
setupEventListeners(room) {
|
|
35
|
+
room.localParticipant.on(_livekitClient.ParticipantEvent.LocalTrackPublished, async publication => {
|
|
36
|
+
this.setupE2EESender(publication, room.localParticipant);
|
|
37
|
+
}).on(_livekitClient.ParticipantEvent.LocalTrackUnpublished, async publication => {
|
|
38
|
+
let frameCryptor = this.findTrackCryptor(publication.trackSid);
|
|
39
|
+
if (frameCryptor) {
|
|
40
|
+
this.frameCryptors.delete(publication.trackSid);
|
|
41
|
+
await frameCryptor.setEnabled(false);
|
|
42
|
+
await frameCryptor.dispose();
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
room.on(_livekitClient.RoomEvent.TrackSubscribed, (_track, pub, participant) => {
|
|
46
|
+
this.setupE2EEReceiver(pub, participant);
|
|
47
|
+
}).on(_livekitClient.RoomEvent.TrackUnsubscribed, async (_track, publication, _participant) => {
|
|
48
|
+
let frameCryptor = this.findTrackCryptor(publication.trackSid);
|
|
49
|
+
if (frameCryptor) {
|
|
50
|
+
this.frameCryptors.delete(publication.trackSid);
|
|
51
|
+
await frameCryptor.setEnabled(false);
|
|
52
|
+
await frameCryptor.dispose();
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
async setupE2EESender(publication, participant) {
|
|
57
|
+
if (!publication.isEncrypted) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
var frameCryptor = this.findTrackCryptor(publication.trackSid);
|
|
61
|
+
if (!frameCryptor) {
|
|
62
|
+
frameCryptor = this.createFrameCryptorForSender(publication.track.sender, participant.identity);
|
|
63
|
+
this.frameCryptors.set(publication.trackSid, frameCryptor);
|
|
64
|
+
frameCryptor.setEnabled(true);
|
|
65
|
+
frameCryptor.setKeyIndex(this.keyProvider.getLatestKeyIndex(participant.identity));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async setupE2EEReceiver(publication, participant) {
|
|
69
|
+
if (!publication.isEncrypted) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
var frameCryptor = this.findTrackCryptor(publication.trackSid);
|
|
73
|
+
if (!frameCryptor) {
|
|
74
|
+
frameCryptor = this.createFrameCryptorForReceiver(publication.track.receiver, participant.identity);
|
|
75
|
+
this.frameCryptors.set(publication.trackSid, frameCryptor);
|
|
76
|
+
frameCryptor.setEnabled(true);
|
|
77
|
+
frameCryptor.setKeyIndex(this.keyProvider.getLatestKeyIndex(participant.identity));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
setSifTrailer(trailer) {
|
|
81
|
+
this.keyProvider.setSifTrailer(trailer);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Utility methods
|
|
85
|
+
//////////////////////
|
|
86
|
+
|
|
87
|
+
findTrackCryptor(trackId) {
|
|
88
|
+
return this.frameCryptors.get(trackId);
|
|
89
|
+
}
|
|
90
|
+
createFrameCryptorForSender(sender, participantId) {
|
|
91
|
+
return _reactNativeWebrtc.RTCFrameCryptorFactory.createFrameCryptorForRtpSender(participantId, sender, this.algorithm, this.keyProvider.rtcKeyProvider);
|
|
92
|
+
}
|
|
93
|
+
createFrameCryptorForReceiver(receiver, participantId) {
|
|
94
|
+
return _reactNativeWebrtc.RTCFrameCryptorFactory.createFrameCryptorForRtpReceiver(participantId, receiver, this.algorithm, this.keyProvider.rtcKeyProvider);
|
|
95
|
+
}
|
|
96
|
+
setupEngine(_engine) {
|
|
97
|
+
// No-op
|
|
98
|
+
}
|
|
99
|
+
setParticipantCryptorEnabled(enabled, participantIdentity) {
|
|
100
|
+
var _this$room;
|
|
101
|
+
if (this.encryptionEnabled !== enabled && participantIdentity === ((_this$room = this.room) === null || _this$room === void 0 ? void 0 : _this$room.localParticipant.identity)) {
|
|
102
|
+
this.encryptionEnabled = enabled;
|
|
103
|
+
this.emit(_livekitClient.EncryptionEvent.ParticipantEncryptionStatusChanged, enabled, this.room.localParticipant);
|
|
104
|
+
} else {
|
|
105
|
+
var _this$room2;
|
|
106
|
+
const participant = (_this$room2 = this.room) === null || _this$room2 === void 0 ? void 0 : _this$room2.getParticipantByIdentity(participantIdentity);
|
|
107
|
+
if (!participant) {
|
|
108
|
+
throw TypeError(`couldn't set encryption status, participant not found ${participantIdentity}`);
|
|
109
|
+
}
|
|
110
|
+
this.emit(_livekitClient.EncryptionEvent.ParticipantEncryptionStatusChanged, enabled, participant);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
exports.default = RNE2EEManager;
|
|
115
|
+
//# sourceMappingURL=RNE2EEManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_reactNativeWebrtc","require","_livekitClient","_events","_interopRequireDefault","e","__esModule","default","_defineProperty","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","RNE2EEManager","EventEmitter","constructor","keyProvider","Map","RTCFrameCryptorAlgorithm","kAesGcm","encryptionEnabled","setup","room","setupEventListeners","localParticipant","on","ParticipantEvent","LocalTrackPublished","publication","setupE2EESender","LocalTrackUnpublished","frameCryptor","findTrackCryptor","trackSid","frameCryptors","delete","setEnabled","dispose","RoomEvent","TrackSubscribed","_track","pub","participant","setupE2EEReceiver","TrackUnsubscribed","_participant","isEncrypted","createFrameCryptorForSender","track","sender","identity","set","setKeyIndex","getLatestKeyIndex","createFrameCryptorForReceiver","receiver","setSifTrailer","trailer","trackId","get","participantId","RTCFrameCryptorFactory","createFrameCryptorForRtpSender","algorithm","rtcKeyProvider","createFrameCryptorForRtpReceiver","setupEngine","_engine","setParticipantCryptorEnabled","enabled","participantIdentity","_this$room","emit","EncryptionEvent","ParticipantEncryptionStatusChanged","_this$room2","getParticipantByIdentity","exports"],"sources":["RNE2EEManager.ts"],"sourcesContent":["import {\n RTCFrameCryptorAlgorithm,\n RTCFrameCryptorFactory,\n RTCRtpReceiver,\n type RTCFrameCryptor,\n type RTCRtpSender,\n} from '@livekit/react-native-webrtc';\nimport {\n LocalParticipant,\n LocalTrackPublication,\n ParticipantEvent,\n RemoteParticipant,\n RemoteTrackPublication,\n RoomEvent,\n type Room,\n type BaseE2EEManager,\n type E2EEManagerCallbacks,\n EncryptionEvent,\n} from 'livekit-client';\nimport type RNKeyProvider from './RNKeyProvider';\nimport type RTCEngine from 'livekit-client/dist/src/room/RTCEngine';\nimport EventEmitter from 'events';\nimport type TypedEventEmitter from 'typed-emitter';\n\n/**\n * @experimental\n */\nexport default class RNE2EEManager\n extends (EventEmitter as new () => TypedEventEmitter<E2EEManagerCallbacks>)\n implements BaseE2EEManager\n{\n private room?: Room;\n private frameCryptors: Map<string, RTCFrameCryptor> = new Map();\n private keyProvider: RNKeyProvider;\n private algorithm: RTCFrameCryptorAlgorithm =\n RTCFrameCryptorAlgorithm.kAesGcm;\n\n private encryptionEnabled: boolean = false;\n\n constructor(keyProvider: RNKeyProvider) {\n super();\n this.keyProvider = keyProvider;\n this.encryptionEnabled = false;\n }\n\n setup(room: Room) {\n if (this.room !== room) {\n this.room = room;\n this.setupEventListeners(room);\n }\n }\n\n private setupEventListeners(room: Room) {\n room.localParticipant\n .on(ParticipantEvent.LocalTrackPublished, async (publication) => {\n this.setupE2EESender(publication, room.localParticipant);\n })\n .on(ParticipantEvent.LocalTrackUnpublished, async (publication) => {\n let frameCryptor = this.findTrackCryptor(publication.trackSid);\n if (frameCryptor) {\n this.frameCryptors.delete(publication.trackSid);\n await frameCryptor.setEnabled(false);\n await frameCryptor.dispose();\n }\n });\n\n room\n .on(RoomEvent.TrackSubscribed, (_track, pub, participant) => {\n this.setupE2EEReceiver(pub, participant);\n })\n .on(\n RoomEvent.TrackUnsubscribed,\n async (_track, publication, _participant) => {\n let frameCryptor = this.findTrackCryptor(publication.trackSid);\n if (frameCryptor) {\n this.frameCryptors.delete(publication.trackSid);\n await frameCryptor.setEnabled(false);\n await frameCryptor.dispose();\n }\n }\n );\n }\n\n private async setupE2EESender(\n publication: LocalTrackPublication,\n participant: LocalParticipant\n ) {\n if (!publication.isEncrypted) {\n return;\n }\n\n var frameCryptor = this.findTrackCryptor(publication.trackSid);\n\n if (!frameCryptor) {\n frameCryptor = this.createFrameCryptorForSender(\n publication.track!.sender,\n participant.identity\n );\n\n this.frameCryptors.set(publication.trackSid, frameCryptor);\n frameCryptor.setEnabled(true);\n frameCryptor.setKeyIndex(\n this.keyProvider.getLatestKeyIndex(participant.identity)\n );\n }\n }\n\n private async setupE2EEReceiver(\n publication: RemoteTrackPublication,\n participant: RemoteParticipant\n ) {\n if (!publication.isEncrypted) {\n return;\n }\n\n var frameCryptor = this.findTrackCryptor(publication.trackSid);\n\n if (!frameCryptor) {\n frameCryptor = this.createFrameCryptorForReceiver(\n publication.track!.receiver,\n participant.identity\n );\n\n this.frameCryptors.set(publication.trackSid, frameCryptor);\n frameCryptor.setEnabled(true);\n frameCryptor.setKeyIndex(\n this.keyProvider.getLatestKeyIndex(participant.identity)\n );\n }\n }\n\n setSifTrailer(trailer: Uint8Array): void {\n this.keyProvider.setSifTrailer(trailer);\n }\n\n // Utility methods\n //////////////////////\n\n private findTrackCryptor(trackId: string): RTCFrameCryptor | undefined {\n return this.frameCryptors.get(trackId);\n }\n\n private createFrameCryptorForSender(\n sender: RTCRtpSender,\n participantId: string\n ): RTCFrameCryptor {\n return RTCFrameCryptorFactory.createFrameCryptorForRtpSender(\n participantId,\n sender,\n this.algorithm,\n this.keyProvider.rtcKeyProvider\n );\n }\n\n private createFrameCryptorForReceiver(\n receiver: RTCRtpReceiver,\n participantId: string\n ): RTCFrameCryptor {\n return RTCFrameCryptorFactory.createFrameCryptorForRtpReceiver(\n participantId,\n receiver,\n this.algorithm,\n this.keyProvider.rtcKeyProvider\n );\n }\n\n setupEngine(_engine: RTCEngine): void {\n // No-op\n }\n setParticipantCryptorEnabled(\n enabled: boolean,\n participantIdentity: string\n ): void {\n if (\n this.encryptionEnabled !== enabled &&\n participantIdentity === this.room?.localParticipant.identity\n ) {\n this.encryptionEnabled = enabled;\n this.emit(\n EncryptionEvent.ParticipantEncryptionStatusChanged,\n enabled,\n this.room!.localParticipant\n );\n } else {\n const participant =\n this.room?.getParticipantByIdentity(participantIdentity);\n if (!participant) {\n throw TypeError(\n `couldn't set encryption status, participant not found ${participantIdentity}`\n );\n }\n this.emit(\n EncryptionEvent.ParticipantEncryptionStatusChanged,\n enabled,\n participant\n );\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _livekitClient = require("livekit-client");
|
|
8
|
+
var _reactNativeWebrtc = require("@livekit/react-native-webrtc");
|
|
9
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
10
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
11
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
12
|
+
const defaultRatchetSalt = 'LKFrameEncryptionKey';
|
|
13
|
+
const defaultMagicBytes = 'LK-ROCKS';
|
|
14
|
+
const defaultRatchetWindowSize = 16;
|
|
15
|
+
const defaultFailureTolerance = -1;
|
|
16
|
+
const defaultKeyRingSize = 16;
|
|
17
|
+
const defaultDiscardFrameWhenCryptorNotReady = false;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Options for construction an RNKeyProvider
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* @experimental
|
|
25
|
+
*/
|
|
26
|
+
class RNKeyProvider extends _livekitClient.BaseKeyProvider {
|
|
27
|
+
constructor(options) {
|
|
28
|
+
const opts = {
|
|
29
|
+
sharedKey: options.sharedKey ?? true,
|
|
30
|
+
ratchetSalt: options.ratchetSalt ?? defaultRatchetSalt,
|
|
31
|
+
ratchetWindowSize: options.ratchetWindowSize ?? defaultRatchetWindowSize,
|
|
32
|
+
failureTolerance: options.failureTolerance ?? defaultFailureTolerance,
|
|
33
|
+
keyRingSize: options.keyringSize ?? defaultKeyRingSize,
|
|
34
|
+
keyringSize: options.keyringSize ?? defaultKeyRingSize,
|
|
35
|
+
discardFrameWhenCryptorNotReady: defaultDiscardFrameWhenCryptorNotReady
|
|
36
|
+
};
|
|
37
|
+
let magicBytes = options.uncryptedMagicBytes ?? defaultMagicBytes;
|
|
38
|
+
if (typeof magicBytes === 'string') {
|
|
39
|
+
magicBytes = new TextEncoder().encode(magicBytes);
|
|
40
|
+
}
|
|
41
|
+
opts.uncryptedMagicBytes = magicBytes;
|
|
42
|
+
super(opts);
|
|
43
|
+
_defineProperty(this, "latestSetIndex", new Map());
|
|
44
|
+
_defineProperty(this, "nativeKeyProvider", void 0);
|
|
45
|
+
this.nativeKeyProvider = _reactNativeWebrtc.RTCFrameCryptorFactory.createDefaultKeyProvider(opts);
|
|
46
|
+
}
|
|
47
|
+
getLatestKeyIndex(participantId) {
|
|
48
|
+
return this.latestSetIndex.get(participantId) ?? 0;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Accepts a passphrase that's used to create the crypto keys.
|
|
53
|
+
* @param key
|
|
54
|
+
*/
|
|
55
|
+
async setSharedKey(key, keyIndex) {
|
|
56
|
+
return this.nativeKeyProvider.setSharedKey(key, keyIndex);
|
|
57
|
+
}
|
|
58
|
+
async ratchetSharedKey(keyIndex) {
|
|
59
|
+
this.nativeKeyProvider.ratchetSharedKey(keyIndex);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Accepts a passphrase that's used to create the crypto keys for a participant's stream.
|
|
64
|
+
* @param key
|
|
65
|
+
*/
|
|
66
|
+
async setKey(participantId, key, keyIndex) {
|
|
67
|
+
if (this.getOptions().sharedKey) {
|
|
68
|
+
return this.setSharedKey(key, keyIndex);
|
|
69
|
+
}
|
|
70
|
+
this.latestSetIndex.set(participantId, keyIndex ?? 0);
|
|
71
|
+
return this.nativeKeyProvider.setKey(participantId, key, keyIndex);
|
|
72
|
+
}
|
|
73
|
+
async ratchetKey(participantIdentity, keyIndex) {
|
|
74
|
+
if (!this.getOptions().sharedKey && participantIdentity) {
|
|
75
|
+
this.nativeKeyProvider.ratchetKey(participantIdentity, keyIndex);
|
|
76
|
+
} else {
|
|
77
|
+
this.ratchetSharedKey(keyIndex);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async setSifTrailer(trailer) {
|
|
81
|
+
return this.nativeKeyProvider.setSifTrailer(trailer);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @internal
|
|
86
|
+
*/
|
|
87
|
+
get rtcKeyProvider() {
|
|
88
|
+
return this.nativeKeyProvider;
|
|
89
|
+
}
|
|
90
|
+
dispose() {
|
|
91
|
+
this.nativeKeyProvider.dispose();
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// /**
|
|
96
|
+
// * Define the `onxxx` event handlers.
|
|
97
|
+
// */
|
|
98
|
+
// const proto = RNExternalE2EEKeyProvider.prototype;
|
|
99
|
+
|
|
100
|
+
// defineEventAttribute(proto, KeyProviderEvent.SetKey);
|
|
101
|
+
// defineEventAttribute(proto, KeyProviderEvent.RatchetRequest);
|
|
102
|
+
// defineEventAttribute(proto, KeyProviderEvent.KeyRatcheted);
|
|
103
|
+
exports.default = RNKeyProvider;
|
|
104
|
+
//# sourceMappingURL=RNKeyProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_livekitClient","require","_reactNativeWebrtc","_defineProperty","e","r","t","_toPropertyKey","Object","defineProperty","value","enumerable","configurable","writable","i","_toPrimitive","Symbol","toPrimitive","call","TypeError","String","Number","defaultRatchetSalt","defaultMagicBytes","defaultRatchetWindowSize","defaultFailureTolerance","defaultKeyRingSize","defaultDiscardFrameWhenCryptorNotReady","RNKeyProvider","BaseKeyProvider","constructor","options","opts","sharedKey","ratchetSalt","ratchetWindowSize","failureTolerance","keyRingSize","keyringSize","discardFrameWhenCryptorNotReady","magicBytes","uncryptedMagicBytes","TextEncoder","encode","Map","nativeKeyProvider","RTCFrameCryptorFactory","createDefaultKeyProvider","getLatestKeyIndex","participantId","latestSetIndex","get","setSharedKey","key","keyIndex","ratchetSharedKey","setKey","getOptions","set","ratchetKey","participantIdentity","setSifTrailer","trailer","rtcKeyProvider","dispose","exports","default"],"sources":["RNKeyProvider.ts"],"sourcesContent":["import { BaseKeyProvider, type KeyProviderOptions } from 'livekit-client';\nimport {\n RTCFrameCryptorFactory,\n RTCKeyProvider,\n type RTCKeyProviderOptions,\n} from '@livekit/react-native-webrtc';\n\nconst defaultRatchetSalt = 'LKFrameEncryptionKey';\nconst defaultMagicBytes = 'LK-ROCKS';\nconst defaultRatchetWindowSize = 16;\nconst defaultFailureTolerance = -1;\nconst defaultKeyRingSize = 16;\nconst defaultDiscardFrameWhenCryptorNotReady = false;\n\n/**\n * Options for construction an RNKeyProvider\n */\nexport type RNKeyProviderOptions = KeyProviderOptions & {\n uncryptedMagicBytes?: string | Uint8Array;\n};\n\n/**\n * @experimental\n */\nexport default class RNKeyProvider extends BaseKeyProvider {\n private latestSetIndex: Map<string, number> = new Map();\n private nativeKeyProvider: RTCKeyProvider;\n\n constructor(options: Partial<RNKeyProviderOptions>) {\n const opts: RTCKeyProviderOptions & KeyProviderOptions = {\n sharedKey: options.sharedKey ?? true,\n ratchetSalt: options.ratchetSalt ?? defaultRatchetSalt,\n ratchetWindowSize: options.ratchetWindowSize ?? defaultRatchetWindowSize,\n failureTolerance: options.failureTolerance ?? defaultFailureTolerance,\n keyRingSize: options.keyringSize ?? defaultKeyRingSize,\n keyringSize: options.keyringSize ?? defaultKeyRingSize,\n discardFrameWhenCryptorNotReady: defaultDiscardFrameWhenCryptorNotReady,\n };\n\n let magicBytes = options.uncryptedMagicBytes ?? defaultMagicBytes;\n if (typeof magicBytes === 'string') {\n magicBytes = new TextEncoder().encode(magicBytes);\n }\n opts.uncryptedMagicBytes = magicBytes;\n\n super(opts);\n\n this.nativeKeyProvider =\n RTCFrameCryptorFactory.createDefaultKeyProvider(opts);\n }\n\n getLatestKeyIndex(participantId: string) {\n return this.latestSetIndex.get(participantId) ?? 0;\n }\n\n /**\n * Accepts a passphrase that's used to create the crypto keys.\n * @param key\n */\n async setSharedKey(key: string | Uint8Array, keyIndex?: number) {\n return this.nativeKeyProvider.setSharedKey(key, keyIndex);\n }\n\n async ratchetSharedKey(keyIndex?: number) {\n this.nativeKeyProvider.ratchetSharedKey(keyIndex);\n }\n\n /**\n * Accepts a passphrase that's used to create the crypto keys for a participant's stream.\n * @param key\n */\n async setKey(\n participantId: string,\n key: string | Uint8Array,\n keyIndex?: number\n ) {\n if (this.getOptions().sharedKey) {\n return this.setSharedKey(key, keyIndex);\n }\n\n this.latestSetIndex.set(participantId, keyIndex ?? 0);\n return this.nativeKeyProvider.setKey(participantId, key, keyIndex);\n }\n\n override async ratchetKey(participantIdentity?: string, keyIndex?: number) {\n if (!this.getOptions().sharedKey && participantIdentity) {\n this.nativeKeyProvider.ratchetKey(participantIdentity, keyIndex);\n } else {\n this.ratchetSharedKey(keyIndex);\n }\n }\n\n async setSifTrailer(trailer: Uint8Array) {\n return this.nativeKeyProvider.setSifTrailer(trailer);\n }\n\n /**\n * @internal\n */\n get rtcKeyProvider() {\n return this.nativeKeyProvider;\n }\n\n dispose() {\n this.nativeKeyProvider.dispose();\n }\n}\n\n// /**\n// * Define the `onxxx` event handlers.\n// */\n// const proto = RNExternalE2EEKeyProvider.prototype;\n\n// defineEventAttribute(proto, KeyProviderEvent.SetKey);\n// defineEventAttribute(proto, KeyProviderEvent.RatchetRequest);\n// defineEventAttribute(proto, KeyProviderEvent.KeyRatcheted);\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useRNE2EEManager = useRNE2EEManager;
|
|
7
|
+
var _RNE2EEManager = _interopRequireDefault(require("../e2ee/RNE2EEManager"));
|
|
8
|
+
var _ = require("..");
|
|
9
|
+
var _react = require("react");
|
|
10
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
/**
|
|
12
|
+
* @experimental
|
|
13
|
+
*/
|
|
14
|
+
function useRNE2EEManager(options) {
|
|
15
|
+
let [keyProvider] = (0, _react.useState)(() => new _.RNKeyProvider(options.keyProviderOptions ?? {}));
|
|
16
|
+
let [e2eeManager] = (0, _react.useState)(() => new _RNE2EEManager.default(keyProvider));
|
|
17
|
+
(0, _react.useEffect)(() => {
|
|
18
|
+
let setup = async () => {
|
|
19
|
+
try {
|
|
20
|
+
await keyProvider.setSharedKey(options.sharedKey);
|
|
21
|
+
} catch (error) {
|
|
22
|
+
_.log.warn('unable to set shared key', error);
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
setup();
|
|
26
|
+
return () => {};
|
|
27
|
+
}, [keyProvider, options.sharedKey]);
|
|
28
|
+
(0, _react.useEffect)(() => {
|
|
29
|
+
return () => {
|
|
30
|
+
keyProvider.dispose();
|
|
31
|
+
};
|
|
32
|
+
}, [keyProvider]);
|
|
33
|
+
return {
|
|
34
|
+
keyProvider,
|
|
35
|
+
e2eeManager
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=useE2EEManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_RNE2EEManager","_interopRequireDefault","require","_","_react","e","__esModule","default","useRNE2EEManager","options","keyProvider","useState","RNKeyProvider","keyProviderOptions","e2eeManager","RNE2EEManager","useEffect","setup","setSharedKey","sharedKey","error","log","warn","dispose"],"sources":["useE2EEManager.ts"],"sourcesContent":["import RNE2EEManager from '../e2ee/RNE2EEManager';\nimport { log, RNKeyProvider } from '..';\nimport { useEffect, useState } from 'react';\nimport type { RNKeyProviderOptions } from '../e2ee/RNKeyProvider';\n\nexport type UseRNE2EEManagerOptions = {\n keyProviderOptions?: RNKeyProviderOptions;\n sharedKey: string | Uint8Array;\n};\n\nexport interface RNE2EEManagerState {\n keyProvider: RNKeyProvider;\n e2eeManager: RNE2EEManager;\n}\n\n/**\n * @experimental\n */\nexport function useRNE2EEManager(\n options: UseRNE2EEManagerOptions\n): RNE2EEManagerState {\n let [keyProvider] = useState(\n () => new RNKeyProvider(options.keyProviderOptions ?? {})\n );\n let [e2eeManager] = useState(() => new RNE2EEManager(keyProvider));\n\n useEffect(() => {\n let setup = async () => {\n try {\n await keyProvider.setSharedKey(options.sharedKey);\n } catch (error) {\n log.warn('unable to set shared key', error);\n }\n };\n setup();\n return () => {};\n }, [keyProvider, options.sharedKey]);\n\n useEffect(() => {\n return () => {\n keyProvider.dispose();\n };\n }, [keyProvider]);\n\n return {\n keyProvider,\n e2eeManager,\n };\n}\n"],"mappings":";;;;;;AAAA,IAAAA,cAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,CAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAA4C,SAAAD,uBAAAI,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AAa5C;AACA;AACA;AACO,SAASG,gBAAgBA,CAC9BC,OAAgC,EACZ;EACpB,IAAI,CAACC,WAAW,CAAC,GAAG,IAAAC,eAAQ,EAC1B,MAAM,IAAIC,eAAa,CAACH,OAAO,CAACI,kBAAkB,IAAI,CAAC,CAAC,CAC1D,CAAC;EACD,IAAI,CAACC,WAAW,CAAC,GAAG,IAAAH,eAAQ,EAAC,MAAM,IAAII,sBAAa,CAACL,WAAW,CAAC,CAAC;EAElE,IAAAM,gBAAS,EAAC,MAAM;IACd,IAAIC,KAAK,GAAG,MAAAA,CAAA,KAAY;MACtB,IAAI;QACF,MAAMP,WAAW,CAACQ,YAAY,CAACT,OAAO,CAACU,SAAS,CAAC;MACnD,CAAC,CAAC,OAAOC,KAAK,EAAE;QACdC,KAAG,CAACC,IAAI,CAAC,0BAA0B,EAAEF,KAAK,CAAC;MAC7C;IACF,CAAC;IACDH,KAAK,CAAC,CAAC;IACP,OAAO,MAAM,CAAC,CAAC;EACjB,CAAC,EAAE,CAACP,WAAW,EAAED,OAAO,CAACU,SAAS,CAAC,CAAC;EAEpC,IAAAH,gBAAS,EAAC,MAAM;IACd,OAAO,MAAM;MACXN,WAAW,CAACa,OAAO,CAAC,CAAC;IACvB,CAAC;EACH,CAAC,EAAE,CAACb,WAAW,CAAC,CAAC;EAEjB,OAAO;IACLA,WAAW;IACXI;EACF,CAAC;AACH","ignoreList":[]}
|
package/lib/commonjs/hooks.js
CHANGED
|
@@ -3,6 +3,36 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
var _exportNames = {
|
|
7
|
+
useConnectionState: true,
|
|
8
|
+
useDataChannel: true,
|
|
9
|
+
useIsSpeaking: true,
|
|
10
|
+
useLocalParticipant: true,
|
|
11
|
+
useLocalParticipantPermissions: true,
|
|
12
|
+
useParticipantInfo: true,
|
|
13
|
+
useParticipants: true,
|
|
14
|
+
useRemoteParticipants: true,
|
|
15
|
+
useRemoteParticipant: true,
|
|
16
|
+
useSpeakingParticipants: true,
|
|
17
|
+
useSortedParticipants: true,
|
|
18
|
+
useChat: true,
|
|
19
|
+
useIsEncrypted: true,
|
|
20
|
+
useRoomInfo: true,
|
|
21
|
+
useIsMuted: true,
|
|
22
|
+
useParticipantTracks: true,
|
|
23
|
+
useLiveKitRoom: true,
|
|
24
|
+
RoomContext: true,
|
|
25
|
+
useRoomContext: true,
|
|
26
|
+
ParticipantContext: true,
|
|
27
|
+
useParticipantContext: true,
|
|
28
|
+
TrackRefContext: true,
|
|
29
|
+
useTrackRefContext: true,
|
|
30
|
+
useTracks: true,
|
|
31
|
+
isTrackReference: true,
|
|
32
|
+
useEnsureTrackRef: true,
|
|
33
|
+
useTrackMutedIndicator: true,
|
|
34
|
+
useVisualStableUpdate: true
|
|
35
|
+
};
|
|
6
36
|
Object.defineProperty(exports, "ParticipantContext", {
|
|
7
37
|
enumerable: true,
|
|
8
38
|
get: function () {
|
|
@@ -172,4 +202,16 @@ Object.defineProperty(exports, "useVisualStableUpdate", {
|
|
|
172
202
|
}
|
|
173
203
|
});
|
|
174
204
|
var _componentsReact = require("@livekit/components-react");
|
|
205
|
+
var _useE2EEManager = require("./hooks/useE2EEManager");
|
|
206
|
+
Object.keys(_useE2EEManager).forEach(function (key) {
|
|
207
|
+
if (key === "default" || key === "__esModule") return;
|
|
208
|
+
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
|
|
209
|
+
if (key in exports && exports[key] === _useE2EEManager[key]) return;
|
|
210
|
+
Object.defineProperty(exports, key, {
|
|
211
|
+
enumerable: true,
|
|
212
|
+
get: function () {
|
|
213
|
+
return _useE2EEManager[key];
|
|
214
|
+
}
|
|
215
|
+
});
|
|
216
|
+
});
|
|
175
217
|
//# sourceMappingURL=hooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_componentsReact","require"],"sources":["hooks.ts"],"sourcesContent":["export {\n useConnectionState,\n useDataChannel,\n useIsSpeaking,\n useLocalParticipant,\n useLocalParticipantPermissions,\n useParticipantInfo,\n useParticipants,\n useRemoteParticipants,\n useRemoteParticipant,\n useSpeakingParticipants,\n useSortedParticipants,\n useChat,\n useIsEncrypted,\n useRoomInfo,\n useIsMuted,\n useParticipantTracks,\n useLiveKitRoom,\n RoomContext,\n useRoomContext,\n ParticipantContext,\n useParticipantContext,\n TrackRefContext,\n useTrackRefContext,\n useTracks,\n isTrackReference,\n useEnsureTrackRef,\n useTrackMutedIndicator,\n useVisualStableUpdate,\n} from '@livekit/components-react';\nexport type {\n UseLocalParticipantOptions,\n UseParticipantInfoOptions,\n UseParticipantsOptions,\n UseRemoteParticipantOptions,\n UseRemoteParticipantsOptions,\n UseTracksOptions,\n TrackReference,\n TrackReferenceOrPlaceholder,\n UseVisualStableUpdateOptions,\n} from '@livekit/components-react';\n\nexport type { ReceivedDataMessage } from '@livekit/components-core';\n"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_componentsReact","require","_useE2EEManager","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get"],"sources":["hooks.ts"],"sourcesContent":["export {\n useConnectionState,\n useDataChannel,\n useIsSpeaking,\n useLocalParticipant,\n useLocalParticipantPermissions,\n useParticipantInfo,\n useParticipants,\n useRemoteParticipants,\n useRemoteParticipant,\n useSpeakingParticipants,\n useSortedParticipants,\n useChat,\n useIsEncrypted,\n useRoomInfo,\n useIsMuted,\n useParticipantTracks,\n useLiveKitRoom,\n RoomContext,\n useRoomContext,\n ParticipantContext,\n useParticipantContext,\n TrackRefContext,\n useTrackRefContext,\n useTracks,\n isTrackReference,\n useEnsureTrackRef,\n useTrackMutedIndicator,\n useVisualStableUpdate,\n} from '@livekit/components-react';\nexport type {\n UseLocalParticipantOptions,\n UseParticipantInfoOptions,\n UseParticipantsOptions,\n UseRemoteParticipantOptions,\n UseRemoteParticipantsOptions,\n UseTracksOptions,\n TrackReference,\n TrackReferenceOrPlaceholder,\n UseVisualStableUpdateOptions,\n} from '@livekit/components-react';\n\nexport type { ReceivedDataMessage } from '@livekit/components-core';\nexport * from './hooks/useE2EEManager';\nexport type { UseRNE2EEManagerOptions } from './hooks/useE2EEManager';\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,gBAAA,GAAAC,OAAA;AA2CA,IAAAC,eAAA,GAAAD,OAAA;AAAAE,MAAA,CAAAC,IAAA,CAAAF,eAAA,EAAAG,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAJ,eAAA,CAAAI,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,CAAA;MAAA,OAAAZ,eAAA,CAAAI,GAAA;IAAA;EAAA;AAAA","ignoreList":[]}
|
package/lib/commonjs/index.js
CHANGED
|
@@ -7,7 +7,9 @@ var _exportNames = {
|
|
|
7
7
|
registerGlobals: true,
|
|
8
8
|
AudioSession: true,
|
|
9
9
|
AndroidAudioTypePresets: true,
|
|
10
|
-
getDefaultAppleAudioConfigurationForMode: true
|
|
10
|
+
getDefaultAppleAudioConfigurationForMode: true,
|
|
11
|
+
RNE2EEManager: true,
|
|
12
|
+
RNKeyProvider: true
|
|
11
13
|
};
|
|
12
14
|
Object.defineProperty(exports, "AndroidAudioTypePresets", {
|
|
13
15
|
enumerable: true,
|
|
@@ -21,6 +23,18 @@ Object.defineProperty(exports, "AudioSession", {
|
|
|
21
23
|
return _AudioSession.default;
|
|
22
24
|
}
|
|
23
25
|
});
|
|
26
|
+
Object.defineProperty(exports, "RNE2EEManager", {
|
|
27
|
+
enumerable: true,
|
|
28
|
+
get: function () {
|
|
29
|
+
return _RNE2EEManager.default;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(exports, "RNKeyProvider", {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
get: function () {
|
|
35
|
+
return _RNKeyProvider.default;
|
|
36
|
+
}
|
|
37
|
+
});
|
|
24
38
|
Object.defineProperty(exports, "getDefaultAppleAudioConfigurationForMode", {
|
|
25
39
|
enumerable: true,
|
|
26
40
|
get: function () {
|
|
@@ -33,6 +47,8 @@ var _reactNativeUrlPolyfill = require("react-native-url-polyfill");
|
|
|
33
47
|
require("./polyfills/EncoderDecoderTogether.min.js");
|
|
34
48
|
var _AudioSession = _interopRequireWildcard(require("./audio/AudioSession"));
|
|
35
49
|
var _reactNative = require("react-native");
|
|
50
|
+
var _RNE2EEManager = _interopRequireDefault(require("./e2ee/RNE2EEManager"));
|
|
51
|
+
var _RNKeyProvider = _interopRequireDefault(require("./e2ee/RNKeyProvider"));
|
|
36
52
|
var _hooks = require("./hooks");
|
|
37
53
|
Object.keys(_hooks).forEach(function (key) {
|
|
38
54
|
if (key === "default" || key === "__esModule") return;
|
|
@@ -129,6 +145,7 @@ Object.keys(_AudioManager).forEach(function (key) {
|
|
|
129
145
|
}
|
|
130
146
|
});
|
|
131
147
|
});
|
|
148
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
132
149
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
133
150
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
134
151
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNativeWebrtc","require","_reactNativeUrlPolyfill","_AudioSession","_interopRequireWildcard","_reactNative","_hooks","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_LiveKitRoom","_VideoTrack","_VideoView","_useParticipant","_useRoom","_logger","_AudioManager","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","n","__proto__","a","getOwnPropertyDescriptor","u","i","set","registerGlobals","webrtcRegisterGlobals","iosCategoryEnforce","livekitRegisterGlobals","setupURLPolyfill","fixWebrtcAdapter","shimPromiseAllSettled","shimArrayAt","shimAsyncIterator","shimIterator","Platform","OS","getUserMediaFunc","global","navigator","mediaDevices","getUserMedia","constraints","audio","AudioSession","setAppleAudioConfiguration","audioCategory","lkGlobal","platform","devicePixelRatio","PixelRatio","LiveKitReactNativeGlobal","_window","window","undefined","userAgent","product","allSettled","shim","Array","at"],"sources":["index.tsx"],"sourcesContent":["import { registerGlobals as webrtcRegisterGlobals } from '@livekit/react-native-webrtc';\nimport { setupURLPolyfill } from 'react-native-url-polyfill';\nimport './polyfills/EncoderDecoderTogether.min.js';\nimport AudioSession, {\n AndroidAudioTypePresets,\n type AndroidAudioTypeOptions,\n type AppleAudioCategory,\n type AppleAudioCategoryOption,\n type AppleAudioConfiguration,\n type AppleAudioMode,\n type AudioTrackState,\n getDefaultAppleAudioConfigurationForMode,\n} from './audio/AudioSession';\nimport type { AudioConfiguration } from './audio/AudioSession';\nimport { PixelRatio, Platform } from 'react-native';\nimport { type LiveKitReactNativeInfo } from 'livekit-client';\nimport type { LogLevel, SetLogLevelOptions } from './logger';\n\n/**\n * Registers the required globals needed for LiveKit to work.\n *\n * Must be called before using LiveKit.\n */\nexport function registerGlobals() {\n webrtcRegisterGlobals();\n iosCategoryEnforce();\n livekitRegisterGlobals();\n setupURLPolyfill();\n fixWebrtcAdapter();\n shimPromiseAllSettled();\n shimArrayAt();\n shimAsyncIterator();\n shimIterator();\n}\n\n/**\n * Enforces changing to playAndRecord category prior to obtaining microphone.\n */\nfunction iosCategoryEnforce() {\n if (Platform.OS === 'ios') {\n // @ts-ignore\n let getUserMediaFunc = global.navigator.mediaDevices.getUserMedia;\n // @ts-ignore\n global.navigator.mediaDevices.getUserMedia = async (constraints: any) => {\n if (constraints.audio) {\n await AudioSession.setAppleAudioConfiguration({\n audioCategory: 'playAndRecord',\n });\n }\n\n return await getUserMediaFunc(constraints);\n };\n }\n}\n\nfunction livekitRegisterGlobals() {\n let lkGlobal: LiveKitReactNativeInfo = {\n platform: Platform.OS,\n devicePixelRatio: PixelRatio.get(),\n };\n\n // @ts-ignore\n global.LiveKitReactNativeGlobal = lkGlobal;\n}\n\nfunction fixWebrtcAdapter() {\n // @ts-ignore\n if (window?.navigator !== undefined) {\n // @ts-ignore\n const { navigator } = window;\n if (navigator.userAgent === undefined) {\n navigator.userAgent = navigator.product ?? 'Unknown';\n }\n }\n}\n\nfunction shimPromiseAllSettled() {\n var allSettled = require('promise.allsettled');\n allSettled.shim();\n}\n\nfunction shimArrayAt() {\n // Some versions of RN don't have Array.prototype.at, which is used by sdp-transform\n if (!Array.prototype.at) {\n var at = require('array.prototype.at');\n at.shim();\n }\n}\n\nfunction shimAsyncIterator() {\n var shim = require('well-known-symbols/Symbol.asyncIterator/shim');\n shim();\n}\n\nfunction shimIterator() {\n var shim = require('well-known-symbols/Symbol.iterator/shim');\n shim();\n}\nexport * from './hooks';\nexport * from './components/LiveKitRoom';\nexport * from './components/VideoTrack';\nexport * from './components/VideoView'; // deprecated\nexport * from './useParticipant'; // deprecated\nexport * from './useRoom'; // deprecated\nexport * from './logger';\nexport * from './audio/AudioManager';\n\nexport {\n AudioSession,\n AndroidAudioTypePresets,\n getDefaultAppleAudioConfigurationForMode,\n};\nexport type {\n AudioConfiguration,\n AndroidAudioTypeOptions,\n AppleAudioCategory,\n AppleAudioCategoryOption,\n AppleAudioConfiguration,\n AppleAudioMode,\n AudioTrackState,\n LogLevel,\n SetLogLevelOptions,\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_reactNativeWebrtc","require","_reactNativeUrlPolyfill","_AudioSession","_interopRequireWildcard","_reactNative","_RNE2EEManager","_interopRequireDefault","_RNKeyProvider","_hooks","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_LiveKitRoom","_VideoTrack","_VideoView","_useParticipant","_useRoom","_logger","_AudioManager","e","__esModule","default","_getRequireWildcardCache","WeakMap","r","t","has","n","__proto__","a","getOwnPropertyDescriptor","u","i","set","registerGlobals","webrtcRegisterGlobals","iosCategoryEnforce","livekitRegisterGlobals","setupURLPolyfill","fixWebrtcAdapter","shimPromiseAllSettled","shimArrayAt","shimAsyncIterator","shimIterator","Platform","OS","getUserMediaFunc","global","navigator","mediaDevices","getUserMedia","constraints","audio","AudioSession","setAppleAudioConfiguration","audioCategory","lkGlobal","platform","devicePixelRatio","PixelRatio","LiveKitReactNativeGlobal","_window","window","undefined","userAgent","product","allSettled","shim","Array","at"],"sources":["index.tsx"],"sourcesContent":["import { registerGlobals as webrtcRegisterGlobals } from '@livekit/react-native-webrtc';\nimport { setupURLPolyfill } from 'react-native-url-polyfill';\nimport './polyfills/EncoderDecoderTogether.min.js';\nimport AudioSession, {\n AndroidAudioTypePresets,\n type AndroidAudioTypeOptions,\n type AppleAudioCategory,\n type AppleAudioCategoryOption,\n type AppleAudioConfiguration,\n type AppleAudioMode,\n type AudioTrackState,\n getDefaultAppleAudioConfigurationForMode,\n} from './audio/AudioSession';\nimport type { AudioConfiguration } from './audio/AudioSession';\nimport { PixelRatio, Platform } from 'react-native';\nimport { type LiveKitReactNativeInfo } from 'livekit-client';\nimport type { LogLevel, SetLogLevelOptions } from './logger';\nimport RNE2EEManager from './e2ee/RNE2EEManager';\nimport RNKeyProvider, { type RNKeyProviderOptions } from './e2ee/RNKeyProvider';\n\n/**\n * Registers the required globals needed for LiveKit to work.\n *\n * Must be called before using LiveKit.\n */\nexport function registerGlobals() {\n webrtcRegisterGlobals();\n iosCategoryEnforce();\n livekitRegisterGlobals();\n setupURLPolyfill();\n fixWebrtcAdapter();\n shimPromiseAllSettled();\n shimArrayAt();\n shimAsyncIterator();\n shimIterator();\n}\n\n/**\n * Enforces changing to playAndRecord category prior to obtaining microphone.\n */\nfunction iosCategoryEnforce() {\n if (Platform.OS === 'ios') {\n // @ts-ignore\n let getUserMediaFunc = global.navigator.mediaDevices.getUserMedia;\n // @ts-ignore\n global.navigator.mediaDevices.getUserMedia = async (constraints: any) => {\n if (constraints.audio) {\n await AudioSession.setAppleAudioConfiguration({\n audioCategory: 'playAndRecord',\n });\n }\n\n return await getUserMediaFunc(constraints);\n };\n }\n}\n\nfunction livekitRegisterGlobals() {\n let lkGlobal: LiveKitReactNativeInfo = {\n platform: Platform.OS,\n devicePixelRatio: PixelRatio.get(),\n };\n\n // @ts-ignore\n global.LiveKitReactNativeGlobal = lkGlobal;\n}\n\nfunction fixWebrtcAdapter() {\n // @ts-ignore\n if (window?.navigator !== undefined) {\n // @ts-ignore\n const { navigator } = window;\n if (navigator.userAgent === undefined) {\n navigator.userAgent = navigator.product ?? 'Unknown';\n }\n }\n}\n\nfunction shimPromiseAllSettled() {\n var allSettled = require('promise.allsettled');\n allSettled.shim();\n}\n\nfunction shimArrayAt() {\n // Some versions of RN don't have Array.prototype.at, which is used by sdp-transform\n if (!Array.prototype.at) {\n var at = require('array.prototype.at');\n at.shim();\n }\n}\n\nfunction shimAsyncIterator() {\n var shim = require('well-known-symbols/Symbol.asyncIterator/shim');\n shim();\n}\n\nfunction shimIterator() {\n var shim = require('well-known-symbols/Symbol.iterator/shim');\n shim();\n}\nexport * from './hooks';\nexport * from './components/LiveKitRoom';\nexport * from './components/VideoTrack';\nexport * from './components/VideoView'; // deprecated\nexport * from './useParticipant'; // deprecated\nexport * from './useRoom'; // deprecated\nexport * from './logger';\nexport * from './audio/AudioManager';\n\nexport {\n AudioSession,\n RNE2EEManager,\n RNKeyProvider,\n AndroidAudioTypePresets,\n getDefaultAppleAudioConfigurationForMode,\n};\nexport type {\n AudioConfiguration,\n AndroidAudioTypeOptions,\n AppleAudioCategory,\n AppleAudioCategoryOption,\n AppleAudioConfiguration,\n AppleAudioMode,\n AudioTrackState,\n LogLevel,\n SetLogLevelOptions,\n RNKeyProviderOptions,\n};\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
2
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
3
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
4
|
+
import { RTCFrameCryptorAlgorithm, RTCFrameCryptorFactory } from '@livekit/react-native-webrtc';
|
|
5
|
+
import { ParticipantEvent, RoomEvent, EncryptionEvent } from 'livekit-client';
|
|
6
|
+
import EventEmitter from 'events';
|
|
7
|
+
/**
|
|
8
|
+
* @experimental
|
|
9
|
+
*/
|
|
10
|
+
export default class RNE2EEManager extends EventEmitter {
|
|
11
|
+
constructor(keyProvider) {
|
|
12
|
+
super();
|
|
13
|
+
_defineProperty(this, "room", void 0);
|
|
14
|
+
_defineProperty(this, "frameCryptors", new Map());
|
|
15
|
+
_defineProperty(this, "keyProvider", void 0);
|
|
16
|
+
_defineProperty(this, "algorithm", RTCFrameCryptorAlgorithm.kAesGcm);
|
|
17
|
+
_defineProperty(this, "encryptionEnabled", false);
|
|
18
|
+
this.keyProvider = keyProvider;
|
|
19
|
+
this.encryptionEnabled = false;
|
|
20
|
+
}
|
|
21
|
+
setup(room) {
|
|
22
|
+
if (this.room !== room) {
|
|
23
|
+
this.room = room;
|
|
24
|
+
this.setupEventListeners(room);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
setupEventListeners(room) {
|
|
28
|
+
room.localParticipant.on(ParticipantEvent.LocalTrackPublished, async publication => {
|
|
29
|
+
this.setupE2EESender(publication, room.localParticipant);
|
|
30
|
+
}).on(ParticipantEvent.LocalTrackUnpublished, async publication => {
|
|
31
|
+
let frameCryptor = this.findTrackCryptor(publication.trackSid);
|
|
32
|
+
if (frameCryptor) {
|
|
33
|
+
this.frameCryptors.delete(publication.trackSid);
|
|
34
|
+
await frameCryptor.setEnabled(false);
|
|
35
|
+
await frameCryptor.dispose();
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
room.on(RoomEvent.TrackSubscribed, (_track, pub, participant) => {
|
|
39
|
+
this.setupE2EEReceiver(pub, participant);
|
|
40
|
+
}).on(RoomEvent.TrackUnsubscribed, async (_track, publication, _participant) => {
|
|
41
|
+
let frameCryptor = this.findTrackCryptor(publication.trackSid);
|
|
42
|
+
if (frameCryptor) {
|
|
43
|
+
this.frameCryptors.delete(publication.trackSid);
|
|
44
|
+
await frameCryptor.setEnabled(false);
|
|
45
|
+
await frameCryptor.dispose();
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
async setupE2EESender(publication, participant) {
|
|
50
|
+
if (!publication.isEncrypted) {
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
var frameCryptor = this.findTrackCryptor(publication.trackSid);
|
|
54
|
+
if (!frameCryptor) {
|
|
55
|
+
frameCryptor = this.createFrameCryptorForSender(publication.track.sender, participant.identity);
|
|
56
|
+
this.frameCryptors.set(publication.trackSid, frameCryptor);
|
|
57
|
+
frameCryptor.setEnabled(true);
|
|
58
|
+
frameCryptor.setKeyIndex(this.keyProvider.getLatestKeyIndex(participant.identity));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async setupE2EEReceiver(publication, participant) {
|
|
62
|
+
if (!publication.isEncrypted) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
var frameCryptor = this.findTrackCryptor(publication.trackSid);
|
|
66
|
+
if (!frameCryptor) {
|
|
67
|
+
frameCryptor = this.createFrameCryptorForReceiver(publication.track.receiver, participant.identity);
|
|
68
|
+
this.frameCryptors.set(publication.trackSid, frameCryptor);
|
|
69
|
+
frameCryptor.setEnabled(true);
|
|
70
|
+
frameCryptor.setKeyIndex(this.keyProvider.getLatestKeyIndex(participant.identity));
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
setSifTrailer(trailer) {
|
|
74
|
+
this.keyProvider.setSifTrailer(trailer);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Utility methods
|
|
78
|
+
//////////////////////
|
|
79
|
+
|
|
80
|
+
findTrackCryptor(trackId) {
|
|
81
|
+
return this.frameCryptors.get(trackId);
|
|
82
|
+
}
|
|
83
|
+
createFrameCryptorForSender(sender, participantId) {
|
|
84
|
+
return RTCFrameCryptorFactory.createFrameCryptorForRtpSender(participantId, sender, this.algorithm, this.keyProvider.rtcKeyProvider);
|
|
85
|
+
}
|
|
86
|
+
createFrameCryptorForReceiver(receiver, participantId) {
|
|
87
|
+
return RTCFrameCryptorFactory.createFrameCryptorForRtpReceiver(participantId, receiver, this.algorithm, this.keyProvider.rtcKeyProvider);
|
|
88
|
+
}
|
|
89
|
+
setupEngine(_engine) {
|
|
90
|
+
// No-op
|
|
91
|
+
}
|
|
92
|
+
setParticipantCryptorEnabled(enabled, participantIdentity) {
|
|
93
|
+
var _this$room;
|
|
94
|
+
if (this.encryptionEnabled !== enabled && participantIdentity === ((_this$room = this.room) === null || _this$room === void 0 ? void 0 : _this$room.localParticipant.identity)) {
|
|
95
|
+
this.encryptionEnabled = enabled;
|
|
96
|
+
this.emit(EncryptionEvent.ParticipantEncryptionStatusChanged, enabled, this.room.localParticipant);
|
|
97
|
+
} else {
|
|
98
|
+
var _this$room2;
|
|
99
|
+
const participant = (_this$room2 = this.room) === null || _this$room2 === void 0 ? void 0 : _this$room2.getParticipantByIdentity(participantIdentity);
|
|
100
|
+
if (!participant) {
|
|
101
|
+
throw TypeError(`couldn't set encryption status, participant not found ${participantIdentity}`);
|
|
102
|
+
}
|
|
103
|
+
this.emit(EncryptionEvent.ParticipantEncryptionStatusChanged, enabled, participant);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=RNE2EEManager.js.map
|