@livekit/react-native 2.4.3 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +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 +6 -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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["RTCFrameCryptorAlgorithm","RTCFrameCryptorFactory","ParticipantEvent","RoomEvent","EncryptionEvent","EventEmitter","RNE2EEManager","constructor","keyProvider","_defineProperty","Map","kAesGcm","encryptionEnabled","setup","room","setupEventListeners","localParticipant","on","LocalTrackPublished","publication","setupE2EESender","LocalTrackUnpublished","frameCryptor","findTrackCryptor","trackSid","frameCryptors","delete","setEnabled","dispose","TrackSubscribed","_track","pub","participant","setupE2EEReceiver","TrackUnsubscribed","_participant","isEncrypted","createFrameCryptorForSender","track","sender","identity","set","setKeyIndex","getLatestKeyIndex","createFrameCryptorForReceiver","receiver","setSifTrailer","trailer","trackId","get","participantId","createFrameCryptorForRtpSender","algorithm","rtcKeyProvider","createFrameCryptorForRtpReceiver","setupEngine","_engine","setParticipantCryptorEnabled","enabled","participantIdentity","_this$room","emit","ParticipantEncryptionStatusChanged","_this$room2","getParticipantByIdentity","TypeError"],"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,97 @@
|
|
|
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 { BaseKeyProvider } from 'livekit-client';
|
|
5
|
+
import { RTCFrameCryptorFactory } from '@livekit/react-native-webrtc';
|
|
6
|
+
const defaultRatchetSalt = 'LKFrameEncryptionKey';
|
|
7
|
+
const defaultMagicBytes = 'LK-ROCKS';
|
|
8
|
+
const defaultRatchetWindowSize = 16;
|
|
9
|
+
const defaultFailureTolerance = -1;
|
|
10
|
+
const defaultKeyRingSize = 16;
|
|
11
|
+
const defaultDiscardFrameWhenCryptorNotReady = false;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Options for construction an RNKeyProvider
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* @experimental
|
|
19
|
+
*/
|
|
20
|
+
export default class RNKeyProvider extends BaseKeyProvider {
|
|
21
|
+
constructor(options) {
|
|
22
|
+
const opts = {
|
|
23
|
+
sharedKey: options.sharedKey ?? true,
|
|
24
|
+
ratchetSalt: options.ratchetSalt ?? defaultRatchetSalt,
|
|
25
|
+
ratchetWindowSize: options.ratchetWindowSize ?? defaultRatchetWindowSize,
|
|
26
|
+
failureTolerance: options.failureTolerance ?? defaultFailureTolerance,
|
|
27
|
+
keyRingSize: options.keyringSize ?? defaultKeyRingSize,
|
|
28
|
+
keyringSize: options.keyringSize ?? defaultKeyRingSize,
|
|
29
|
+
discardFrameWhenCryptorNotReady: defaultDiscardFrameWhenCryptorNotReady
|
|
30
|
+
};
|
|
31
|
+
let magicBytes = options.uncryptedMagicBytes ?? defaultMagicBytes;
|
|
32
|
+
if (typeof magicBytes === 'string') {
|
|
33
|
+
magicBytes = new TextEncoder().encode(magicBytes);
|
|
34
|
+
}
|
|
35
|
+
opts.uncryptedMagicBytes = magicBytes;
|
|
36
|
+
super(opts);
|
|
37
|
+
_defineProperty(this, "latestSetIndex", new Map());
|
|
38
|
+
_defineProperty(this, "nativeKeyProvider", void 0);
|
|
39
|
+
this.nativeKeyProvider = RTCFrameCryptorFactory.createDefaultKeyProvider(opts);
|
|
40
|
+
}
|
|
41
|
+
getLatestKeyIndex(participantId) {
|
|
42
|
+
return this.latestSetIndex.get(participantId) ?? 0;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Accepts a passphrase that's used to create the crypto keys.
|
|
47
|
+
* @param key
|
|
48
|
+
*/
|
|
49
|
+
async setSharedKey(key, keyIndex) {
|
|
50
|
+
return this.nativeKeyProvider.setSharedKey(key, keyIndex);
|
|
51
|
+
}
|
|
52
|
+
async ratchetSharedKey(keyIndex) {
|
|
53
|
+
this.nativeKeyProvider.ratchetSharedKey(keyIndex);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Accepts a passphrase that's used to create the crypto keys for a participant's stream.
|
|
58
|
+
* @param key
|
|
59
|
+
*/
|
|
60
|
+
async setKey(participantId, key, keyIndex) {
|
|
61
|
+
if (this.getOptions().sharedKey) {
|
|
62
|
+
return this.setSharedKey(key, keyIndex);
|
|
63
|
+
}
|
|
64
|
+
this.latestSetIndex.set(participantId, keyIndex ?? 0);
|
|
65
|
+
return this.nativeKeyProvider.setKey(participantId, key, keyIndex);
|
|
66
|
+
}
|
|
67
|
+
async ratchetKey(participantIdentity, keyIndex) {
|
|
68
|
+
if (!this.getOptions().sharedKey && participantIdentity) {
|
|
69
|
+
this.nativeKeyProvider.ratchetKey(participantIdentity, keyIndex);
|
|
70
|
+
} else {
|
|
71
|
+
this.ratchetSharedKey(keyIndex);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
async setSifTrailer(trailer) {
|
|
75
|
+
return this.nativeKeyProvider.setSifTrailer(trailer);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* @internal
|
|
80
|
+
*/
|
|
81
|
+
get rtcKeyProvider() {
|
|
82
|
+
return this.nativeKeyProvider;
|
|
83
|
+
}
|
|
84
|
+
dispose() {
|
|
85
|
+
this.nativeKeyProvider.dispose();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// /**
|
|
90
|
+
// * Define the `onxxx` event handlers.
|
|
91
|
+
// */
|
|
92
|
+
// const proto = RNExternalE2EEKeyProvider.prototype;
|
|
93
|
+
|
|
94
|
+
// defineEventAttribute(proto, KeyProviderEvent.SetKey);
|
|
95
|
+
// defineEventAttribute(proto, KeyProviderEvent.RatchetRequest);
|
|
96
|
+
// defineEventAttribute(proto, KeyProviderEvent.KeyRatcheted);
|
|
97
|
+
//# sourceMappingURL=RNKeyProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["BaseKeyProvider","RTCFrameCryptorFactory","defaultRatchetSalt","defaultMagicBytes","defaultRatchetWindowSize","defaultFailureTolerance","defaultKeyRingSize","defaultDiscardFrameWhenCryptorNotReady","RNKeyProvider","constructor","options","opts","sharedKey","ratchetSalt","ratchetWindowSize","failureTolerance","keyRingSize","keyringSize","discardFrameWhenCryptorNotReady","magicBytes","uncryptedMagicBytes","TextEncoder","encode","_defineProperty","Map","nativeKeyProvider","createDefaultKeyProvider","getLatestKeyIndex","participantId","latestSetIndex","get","setSharedKey","key","keyIndex","ratchetSharedKey","setKey","getOptions","set","ratchetKey","participantIdentity","setSifTrailer","trailer","rtcKeyProvider","dispose"],"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,31 @@
|
|
|
1
|
+
import RNE2EEManager from '../e2ee/RNE2EEManager';
|
|
2
|
+
import { log, RNKeyProvider } from '..';
|
|
3
|
+
import { useEffect, useState } from 'react';
|
|
4
|
+
/**
|
|
5
|
+
* @experimental
|
|
6
|
+
*/
|
|
7
|
+
export function useRNE2EEManager(options) {
|
|
8
|
+
let [keyProvider] = useState(() => new RNKeyProvider(options.keyProviderOptions ?? {}));
|
|
9
|
+
let [e2eeManager] = useState(() => new RNE2EEManager(keyProvider));
|
|
10
|
+
useEffect(() => {
|
|
11
|
+
let setup = async () => {
|
|
12
|
+
try {
|
|
13
|
+
await keyProvider.setSharedKey(options.sharedKey);
|
|
14
|
+
} catch (error) {
|
|
15
|
+
log.warn('unable to set shared key', error);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
setup();
|
|
19
|
+
return () => {};
|
|
20
|
+
}, [keyProvider, options.sharedKey]);
|
|
21
|
+
useEffect(() => {
|
|
22
|
+
return () => {
|
|
23
|
+
keyProvider.dispose();
|
|
24
|
+
};
|
|
25
|
+
}, [keyProvider]);
|
|
26
|
+
return {
|
|
27
|
+
keyProvider,
|
|
28
|
+
e2eeManager
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=useE2EEManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["RNE2EEManager","log","RNKeyProvider","useEffect","useState","useRNE2EEManager","options","keyProvider","keyProviderOptions","e2eeManager","setup","setSharedKey","sharedKey","error","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,OAAOA,aAAa,MAAM,uBAAuB;AACjD,SAASC,GAAG,EAAEC,aAAa,QAAQ,IAAI;AACvC,SAASC,SAAS,EAAEC,QAAQ,QAAQ,OAAO;AAa3C;AACA;AACA;AACA,OAAO,SAASC,gBAAgBA,CAC9BC,OAAgC,EACZ;EACpB,IAAI,CAACC,WAAW,CAAC,GAAGH,QAAQ,CAC1B,MAAM,IAAIF,aAAa,CAACI,OAAO,CAACE,kBAAkB,IAAI,CAAC,CAAC,CAC1D,CAAC;EACD,IAAI,CAACC,WAAW,CAAC,GAAGL,QAAQ,CAAC,MAAM,IAAIJ,aAAa,CAACO,WAAW,CAAC,CAAC;EAElEJ,SAAS,CAAC,MAAM;IACd,IAAIO,KAAK,GAAG,MAAAA,CAAA,KAAY;MACtB,IAAI;QACF,MAAMH,WAAW,CAACI,YAAY,CAACL,OAAO,CAACM,SAAS,CAAC;MACnD,CAAC,CAAC,OAAOC,KAAK,EAAE;QACdZ,GAAG,CAACa,IAAI,CAAC,0BAA0B,EAAED,KAAK,CAAC;MAC7C;IACF,CAAC;IACDH,KAAK,CAAC,CAAC;IACP,OAAO,MAAM,CAAC,CAAC;EACjB,CAAC,EAAE,CAACH,WAAW,EAAED,OAAO,CAACM,SAAS,CAAC,CAAC;EAEpCT,SAAS,CAAC,MAAM;IACd,OAAO,MAAM;MACXI,WAAW,CAACQ,OAAO,CAAC,CAAC;IACvB,CAAC;EACH,CAAC,EAAE,CAACR,WAAW,CAAC,CAAC;EAEjB,OAAO;IACLA,WAAW;IACXE;EACF,CAAC;AACH","ignoreList":[]}
|
package/lib/module/hooks.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
1
|
export { useConnectionState, useDataChannel, useIsSpeaking, useLocalParticipant, useLocalParticipantPermissions, useParticipantInfo, useParticipants, useRemoteParticipants, useRemoteParticipant, useSpeakingParticipants, useSortedParticipants, useChat, useIsEncrypted, useRoomInfo, useIsMuted, useParticipantTracks, useLiveKitRoom, RoomContext, useRoomContext, ParticipantContext, useParticipantContext, TrackRefContext, useTrackRefContext, useTracks, isTrackReference, useEnsureTrackRef, useTrackMutedIndicator, useVisualStableUpdate } from '@livekit/components-react';
|
|
2
|
+
export * from './hooks/useE2EEManager';
|
|
2
3
|
//# sourceMappingURL=hooks.js.map
|
package/lib/module/hooks.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["useConnectionState","useDataChannel","useIsSpeaking","useLocalParticipant","useLocalParticipantPermissions","useParticipantInfo","useParticipants","useRemoteParticipants","useRemoteParticipant","useSpeakingParticipants","useSortedParticipants","useChat","useIsEncrypted","useRoomInfo","useIsMuted","useParticipantTracks","useLiveKitRoom","RoomContext","useRoomContext","ParticipantContext","useParticipantContext","TrackRefContext","useTrackRefContext","useTracks","isTrackReference","useEnsureTrackRef","useTrackMutedIndicator","useVisualStableUpdate"],"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":"AAAA,SACEA,kBAAkB,EAClBC,cAAc,EACdC,aAAa,EACbC,mBAAmB,EACnBC,8BAA8B,EAC9BC,kBAAkB,EAClBC,eAAe,EACfC,qBAAqB,EACrBC,oBAAoB,EACpBC,uBAAuB,EACvBC,qBAAqB,EACrBC,OAAO,EACPC,cAAc,EACdC,WAAW,EACXC,UAAU,EACVC,oBAAoB,EACpBC,cAAc,EACdC,WAAW,EACXC,cAAc,EACdC,kBAAkB,EAClBC,qBAAqB,EACrBC,eAAe,EACfC,kBAAkB,EAClBC,SAAS,EACTC,gBAAgB,EAChBC,iBAAiB,EACjBC,sBAAsB,EACtBC,qBAAqB,QAChB,2BAA2B","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["useConnectionState","useDataChannel","useIsSpeaking","useLocalParticipant","useLocalParticipantPermissions","useParticipantInfo","useParticipants","useRemoteParticipants","useRemoteParticipant","useSpeakingParticipants","useSortedParticipants","useChat","useIsEncrypted","useRoomInfo","useIsMuted","useParticipantTracks","useLiveKitRoom","RoomContext","useRoomContext","ParticipantContext","useParticipantContext","TrackRefContext","useTrackRefContext","useTracks","isTrackReference","useEnsureTrackRef","useTrackMutedIndicator","useVisualStableUpdate"],"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,SACEA,kBAAkB,EAClBC,cAAc,EACdC,aAAa,EACbC,mBAAmB,EACnBC,8BAA8B,EAC9BC,kBAAkB,EAClBC,eAAe,EACfC,qBAAqB,EACrBC,oBAAoB,EACpBC,uBAAuB,EACvBC,qBAAqB,EACrBC,OAAO,EACPC,cAAc,EACdC,WAAW,EACXC,UAAU,EACVC,oBAAoB,EACpBC,cAAc,EACdC,WAAW,EACXC,cAAc,EACdC,kBAAkB,EAClBC,qBAAqB,EACrBC,eAAe,EACfC,kBAAkB,EAClBC,SAAS,EACTC,gBAAgB,EAChBC,iBAAiB,EACjBC,sBAAsB,EACtBC,qBAAqB,QAChB,2BAA2B;AAclC,cAAc,wBAAwB","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -3,6 +3,9 @@ import { setupURLPolyfill } from 'react-native-url-polyfill';
|
|
|
3
3
|
import './polyfills/EncoderDecoderTogether.min.js';
|
|
4
4
|
import AudioSession, { AndroidAudioTypePresets, getDefaultAppleAudioConfigurationForMode } from './audio/AudioSession';
|
|
5
5
|
import { PixelRatio, Platform } from 'react-native';
|
|
6
|
+
import RNE2EEManager from './e2ee/RNE2EEManager';
|
|
7
|
+
import RNKeyProvider from './e2ee/RNKeyProvider';
|
|
8
|
+
|
|
6
9
|
/**
|
|
7
10
|
* Registers the required globals needed for LiveKit to work.
|
|
8
11
|
*
|
|
@@ -87,5 +90,5 @@ export * from './useParticipant'; // deprecated
|
|
|
87
90
|
export * from './useRoom'; // deprecated
|
|
88
91
|
export * from './logger';
|
|
89
92
|
export * from './audio/AudioManager';
|
|
90
|
-
export { AudioSession, AndroidAudioTypePresets, getDefaultAppleAudioConfigurationForMode };
|
|
93
|
+
export { AudioSession, RNE2EEManager, RNKeyProvider, AndroidAudioTypePresets, getDefaultAppleAudioConfigurationForMode };
|
|
91
94
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["registerGlobals","webrtcRegisterGlobals","setupURLPolyfill","AudioSession","AndroidAudioTypePresets","getDefaultAppleAudioConfigurationForMode","PixelRatio","Platform","iosCategoryEnforce","livekitRegisterGlobals","fixWebrtcAdapter","shimPromiseAllSettled","shimArrayAt","shimAsyncIterator","shimIterator","OS","getUserMediaFunc","global","navigator","mediaDevices","getUserMedia","constraints","audio","setAppleAudioConfiguration","audioCategory","lkGlobal","platform","devicePixelRatio","get","LiveKitReactNativeGlobal","_window","window","undefined","userAgent","product","allSettled","require","shim","Array","prototype","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":"AAAA,SAASA,eAAe,IAAIC,qBAAqB,QAAQ,8BAA8B;AACvF,SAASC,gBAAgB,QAAQ,2BAA2B;AAC5D,OAAO,2CAA2C;AAClD,OAAOC,YAAY,IACjBC,uBAAuB,EAOvBC,wCAAwC,QACnC,sBAAsB;AAE7B,SAASC,UAAU,EAAEC,QAAQ,QAAQ,cAAc;
|
|
1
|
+
{"version":3,"names":["registerGlobals","webrtcRegisterGlobals","setupURLPolyfill","AudioSession","AndroidAudioTypePresets","getDefaultAppleAudioConfigurationForMode","PixelRatio","Platform","RNE2EEManager","RNKeyProvider","iosCategoryEnforce","livekitRegisterGlobals","fixWebrtcAdapter","shimPromiseAllSettled","shimArrayAt","shimAsyncIterator","shimIterator","OS","getUserMediaFunc","global","navigator","mediaDevices","getUserMedia","constraints","audio","setAppleAudioConfiguration","audioCategory","lkGlobal","platform","devicePixelRatio","get","LiveKitReactNativeGlobal","_window","window","undefined","userAgent","product","allSettled","require","shim","Array","prototype","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,23 @@
|
|
|
1
|
+
export const __esModule: boolean;
|
|
2
|
+
export default RNE2EEManager;
|
|
3
|
+
declare const RNE2EEManager_base: any;
|
|
4
|
+
/**
|
|
5
|
+
* @experimental
|
|
6
|
+
*/
|
|
7
|
+
declare class RNE2EEManager extends RNE2EEManager_base {
|
|
8
|
+
[x: string]: any;
|
|
9
|
+
constructor(keyProvider: any);
|
|
10
|
+
keyProvider: any;
|
|
11
|
+
encryptionEnabled: boolean;
|
|
12
|
+
setup(room: any): void;
|
|
13
|
+
room: any;
|
|
14
|
+
setupEventListeners(room: any): void;
|
|
15
|
+
setupE2EESender(publication: any, participant: any): Promise<void>;
|
|
16
|
+
setupE2EEReceiver(publication: any, participant: any): Promise<void>;
|
|
17
|
+
setSifTrailer(trailer: any): void;
|
|
18
|
+
findTrackCryptor(trackId: any): any;
|
|
19
|
+
createFrameCryptorForSender(sender: any, participantId: any): any;
|
|
20
|
+
createFrameCryptorForReceiver(receiver: any, participantId: any): any;
|
|
21
|
+
setupEngine(_engine: any): void;
|
|
22
|
+
setParticipantCryptorEnabled(enabled: any, participantIdentity: any): void;
|
|
23
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export const __esModule: boolean;
|
|
2
|
+
export default RNKeyProvider;
|
|
3
|
+
declare const RNKeyProvider_base: any;
|
|
4
|
+
/**
|
|
5
|
+
* Options for construction an RNKeyProvider
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* @experimental
|
|
9
|
+
*/
|
|
10
|
+
declare class RNKeyProvider extends RNKeyProvider_base {
|
|
11
|
+
[x: string]: any;
|
|
12
|
+
constructor(options: any);
|
|
13
|
+
nativeKeyProvider: any;
|
|
14
|
+
getLatestKeyIndex(participantId: any): any;
|
|
15
|
+
/**
|
|
16
|
+
* Accepts a passphrase that's used to create the crypto keys.
|
|
17
|
+
* @param key
|
|
18
|
+
*/
|
|
19
|
+
setSharedKey(key: any, keyIndex: any): Promise<any>;
|
|
20
|
+
ratchetSharedKey(keyIndex: any): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Accepts a passphrase that's used to create the crypto keys for a participant's stream.
|
|
23
|
+
* @param key
|
|
24
|
+
*/
|
|
25
|
+
setKey(participantId: any, key: any, keyIndex: any): Promise<any>;
|
|
26
|
+
ratchetKey(participantIdentity: any, keyIndex: any): Promise<void>;
|
|
27
|
+
setSifTrailer(trailer: any): Promise<any>;
|
|
28
|
+
/**
|
|
29
|
+
* @internal
|
|
30
|
+
*/
|
|
31
|
+
get rtcKeyProvider(): any;
|
|
32
|
+
dispose(): void;
|
|
33
|
+
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export const __esModule: boolean;
|
|
2
2
|
export const AndroidAudioTypePresets: any;
|
|
3
3
|
export const AudioSession: any;
|
|
4
|
+
export const RNE2EEManager: any;
|
|
5
|
+
export const RNKeyProvider: any;
|
|
4
6
|
export const getDefaultAppleAudioConfigurationForMode: any;
|
|
5
7
|
/**
|
|
6
8
|
* Registers the required globals needed for LiveKit to work.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/**
|
|
3
|
+
* @experimental
|
|
4
|
+
*/
|
|
5
|
+
export default class RNE2EEManager extends EventEmitter<[never]> {
|
|
6
|
+
constructor(keyProvider: any);
|
|
7
|
+
keyProvider: any;
|
|
8
|
+
encryptionEnabled: boolean;
|
|
9
|
+
setup(room: any): void;
|
|
10
|
+
room: any;
|
|
11
|
+
setupEventListeners(room: any): void;
|
|
12
|
+
setupE2EESender(publication: any, participant: any): Promise<void>;
|
|
13
|
+
setupE2EEReceiver(publication: any, participant: any): Promise<void>;
|
|
14
|
+
setSifTrailer(trailer: any): void;
|
|
15
|
+
findTrackCryptor(trackId: any): any;
|
|
16
|
+
createFrameCryptorForSender(sender: any, participantId: any): import("@livekit/react-native-webrtc").RTCFrameCryptor;
|
|
17
|
+
createFrameCryptorForReceiver(receiver: any, participantId: any): import("@livekit/react-native-webrtc").RTCFrameCryptor;
|
|
18
|
+
setupEngine(_engine: any): void;
|
|
19
|
+
setParticipantCryptorEnabled(enabled: any, participantIdentity: any): void;
|
|
20
|
+
}
|
|
21
|
+
import EventEmitter from 'events';
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Options for construction an RNKeyProvider
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* @experimental
|
|
6
|
+
*/
|
|
7
|
+
export default class RNKeyProvider extends BaseKeyProvider {
|
|
8
|
+
constructor(options: any);
|
|
9
|
+
nativeKeyProvider: import("@livekit/react-native-webrtc").RTCKeyProvider;
|
|
10
|
+
getLatestKeyIndex(participantId: any): any;
|
|
11
|
+
/**
|
|
12
|
+
* Accepts a passphrase that's used to create the crypto keys.
|
|
13
|
+
* @param key
|
|
14
|
+
*/
|
|
15
|
+
setSharedKey(key: any, keyIndex: any): Promise<any>;
|
|
16
|
+
ratchetSharedKey(keyIndex: any): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Accepts a passphrase that's used to create the crypto keys for a participant's stream.
|
|
19
|
+
* @param key
|
|
20
|
+
*/
|
|
21
|
+
setKey(participantId: any, key: any, keyIndex: any): Promise<any>;
|
|
22
|
+
ratchetKey(participantIdentity: any, keyIndex: any): Promise<void>;
|
|
23
|
+
setSifTrailer(trailer: any): Promise<any>;
|
|
24
|
+
/**
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
get rtcKeyProvider(): import("@livekit/react-native-webrtc").RTCKeyProvider;
|
|
28
|
+
dispose(): void;
|
|
29
|
+
}
|
|
30
|
+
import { BaseKeyProvider } from 'livekit-client';
|
|
@@ -1 +1,2 @@
|
|
|
1
|
+
export * from "./hooks/useE2EEManager";
|
|
1
2
|
export { useConnectionState, useDataChannel, useIsSpeaking, useLocalParticipant, useLocalParticipantPermissions, useParticipantInfo, useParticipants, useRemoteParticipants, useRemoteParticipant, useSpeakingParticipants, useSortedParticipants, useChat, useIsEncrypted, useRoomInfo, useIsMuted, useParticipantTracks, useLiveKitRoom, RoomContext, useRoomContext, ParticipantContext, useParticipantContext, TrackRefContext, useTrackRefContext, useTracks, isTrackReference, useEnsureTrackRef, useTrackMutedIndicator, useVisualStableUpdate } from "@livekit/components-react";
|
|
@@ -13,6 +13,8 @@ export * from "./useRoom";
|
|
|
13
13
|
export * from "./logger";
|
|
14
14
|
export * from "./audio/AudioManager";
|
|
15
15
|
import AudioSession from './audio/AudioSession';
|
|
16
|
+
import RNE2EEManager from './e2ee/RNE2EEManager';
|
|
17
|
+
import RNKeyProvider from './e2ee/RNKeyProvider';
|
|
16
18
|
import { AndroidAudioTypePresets } from './audio/AudioSession';
|
|
17
19
|
import { getDefaultAppleAudioConfigurationForMode } from './audio/AudioSession';
|
|
18
|
-
export { AudioSession, AndroidAudioTypePresets, getDefaultAppleAudioConfigurationForMode };
|
|
20
|
+
export { AudioSession, RNE2EEManager, RNKeyProvider, AndroidAudioTypePresets, getDefaultAppleAudioConfigurationForMode };
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { type Room, type BaseE2EEManager, type E2EEManagerCallbacks } from 'livekit-client';
|
|
2
|
+
import type RNKeyProvider from './RNKeyProvider';
|
|
3
|
+
import type RTCEngine from 'livekit-client/dist/src/room/RTCEngine';
|
|
4
|
+
import type TypedEventEmitter from 'typed-emitter';
|
|
5
|
+
declare const RNE2EEManager_base: new () => TypedEventEmitter<E2EEManagerCallbacks>;
|
|
6
|
+
/**
|
|
7
|
+
* @experimental
|
|
8
|
+
*/
|
|
9
|
+
export default class RNE2EEManager extends RNE2EEManager_base implements BaseE2EEManager {
|
|
10
|
+
private room?;
|
|
11
|
+
private frameCryptors;
|
|
12
|
+
private keyProvider;
|
|
13
|
+
private algorithm;
|
|
14
|
+
private encryptionEnabled;
|
|
15
|
+
constructor(keyProvider: RNKeyProvider);
|
|
16
|
+
setup(room: Room): void;
|
|
17
|
+
private setupEventListeners;
|
|
18
|
+
private setupE2EESender;
|
|
19
|
+
private setupE2EEReceiver;
|
|
20
|
+
setSifTrailer(trailer: Uint8Array): void;
|
|
21
|
+
private findTrackCryptor;
|
|
22
|
+
private createFrameCryptorForSender;
|
|
23
|
+
private createFrameCryptorForReceiver;
|
|
24
|
+
setupEngine(_engine: RTCEngine): void;
|
|
25
|
+
setParticipantCryptorEnabled(enabled: boolean, participantIdentity: string): void;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { BaseKeyProvider, type KeyProviderOptions } from 'livekit-client';
|
|
2
|
+
import { RTCKeyProvider } from '@livekit/react-native-webrtc';
|
|
3
|
+
/**
|
|
4
|
+
* Options for construction an RNKeyProvider
|
|
5
|
+
*/
|
|
6
|
+
export type RNKeyProviderOptions = KeyProviderOptions & {
|
|
7
|
+
uncryptedMagicBytes?: string | Uint8Array;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* @experimental
|
|
11
|
+
*/
|
|
12
|
+
export default class RNKeyProvider extends BaseKeyProvider {
|
|
13
|
+
private latestSetIndex;
|
|
14
|
+
private nativeKeyProvider;
|
|
15
|
+
constructor(options: Partial<RNKeyProviderOptions>);
|
|
16
|
+
getLatestKeyIndex(participantId: string): number;
|
|
17
|
+
/**
|
|
18
|
+
* Accepts a passphrase that's used to create the crypto keys.
|
|
19
|
+
* @param key
|
|
20
|
+
*/
|
|
21
|
+
setSharedKey(key: string | Uint8Array, keyIndex?: number): Promise<any>;
|
|
22
|
+
ratchetSharedKey(keyIndex?: number): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Accepts a passphrase that's used to create the crypto keys for a participant's stream.
|
|
25
|
+
* @param key
|
|
26
|
+
*/
|
|
27
|
+
setKey(participantId: string, key: string | Uint8Array, keyIndex?: number): Promise<any>;
|
|
28
|
+
ratchetKey(participantIdentity?: string, keyIndex?: number): Promise<void>;
|
|
29
|
+
setSifTrailer(trailer: Uint8Array): Promise<any>;
|
|
30
|
+
/**
|
|
31
|
+
* @internal
|
|
32
|
+
*/
|
|
33
|
+
get rtcKeyProvider(): RTCKeyProvider;
|
|
34
|
+
dispose(): void;
|
|
35
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import RNE2EEManager from '../e2ee/RNE2EEManager';
|
|
2
|
+
import { RNKeyProvider } from '..';
|
|
3
|
+
import type { RNKeyProviderOptions } from '../e2ee/RNKeyProvider';
|
|
4
|
+
export type UseRNE2EEManagerOptions = {
|
|
5
|
+
keyProviderOptions?: RNKeyProviderOptions;
|
|
6
|
+
sharedKey: string | Uint8Array;
|
|
7
|
+
};
|
|
8
|
+
export interface RNE2EEManagerState {
|
|
9
|
+
keyProvider: RNKeyProvider;
|
|
10
|
+
e2eeManager: RNE2EEManager;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* @experimental
|
|
14
|
+
*/
|
|
15
|
+
export declare function useRNE2EEManager(options: UseRNE2EEManagerOptions): RNE2EEManagerState;
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
export { useConnectionState, useDataChannel, useIsSpeaking, useLocalParticipant, useLocalParticipantPermissions, useParticipantInfo, useParticipants, useRemoteParticipants, useRemoteParticipant, useSpeakingParticipants, useSortedParticipants, useChat, useIsEncrypted, useRoomInfo, useIsMuted, useParticipantTracks, useLiveKitRoom, RoomContext, useRoomContext, ParticipantContext, useParticipantContext, TrackRefContext, useTrackRefContext, useTracks, isTrackReference, useEnsureTrackRef, useTrackMutedIndicator, useVisualStableUpdate, } from '@livekit/components-react';
|
|
2
2
|
export type { UseLocalParticipantOptions, UseParticipantInfoOptions, UseParticipantsOptions, UseRemoteParticipantOptions, UseRemoteParticipantsOptions, UseTracksOptions, TrackReference, TrackReferenceOrPlaceholder, UseVisualStableUpdateOptions, } from '@livekit/components-react';
|
|
3
3
|
export type { ReceivedDataMessage } from '@livekit/components-core';
|
|
4
|
+
export * from './hooks/useE2EEManager';
|
|
5
|
+
export type { UseRNE2EEManagerOptions } from './hooks/useE2EEManager';
|
|
@@ -2,6 +2,8 @@ import './polyfills/EncoderDecoderTogether.min.js';
|
|
|
2
2
|
import AudioSession, { AndroidAudioTypePresets, type AndroidAudioTypeOptions, type AppleAudioCategory, type AppleAudioCategoryOption, type AppleAudioConfiguration, type AppleAudioMode, type AudioTrackState, getDefaultAppleAudioConfigurationForMode } from './audio/AudioSession';
|
|
3
3
|
import type { AudioConfiguration } from './audio/AudioSession';
|
|
4
4
|
import type { LogLevel, SetLogLevelOptions } from './logger';
|
|
5
|
+
import RNE2EEManager from './e2ee/RNE2EEManager';
|
|
6
|
+
import RNKeyProvider, { type RNKeyProviderOptions } from './e2ee/RNKeyProvider';
|
|
5
7
|
/**
|
|
6
8
|
* Registers the required globals needed for LiveKit to work.
|
|
7
9
|
*
|
|
@@ -16,5 +18,5 @@ export * from './useParticipant';
|
|
|
16
18
|
export * from './useRoom';
|
|
17
19
|
export * from './logger';
|
|
18
20
|
export * from './audio/AudioManager';
|
|
19
|
-
export { AudioSession, AndroidAudioTypePresets, getDefaultAppleAudioConfigurationForMode, };
|
|
20
|
-
export type { AudioConfiguration, AndroidAudioTypeOptions, AppleAudioCategory, AppleAudioCategoryOption, AppleAudioConfiguration, AppleAudioMode, AudioTrackState, LogLevel, SetLogLevelOptions, };
|
|
21
|
+
export { AudioSession, RNE2EEManager, RNKeyProvider, AndroidAudioTypePresets, getDefaultAppleAudioConfigurationForMode, };
|
|
22
|
+
export type { AudioConfiguration, AndroidAudioTypeOptions, AppleAudioCategory, AppleAudioCategoryOption, AppleAudioConfiguration, AppleAudioMode, AudioTrackState, LogLevel, SetLogLevelOptions, RNKeyProviderOptions, };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@livekit/react-native",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.1",
|
|
4
4
|
"description": "LiveKit for React Native",
|
|
5
5
|
"main": "lib/commonjs/index",
|
|
6
6
|
"module": "lib/module/index",
|
|
@@ -44,10 +44,12 @@
|
|
|
44
44
|
"dependencies": {
|
|
45
45
|
"@livekit/components-react": "^2.0.6",
|
|
46
46
|
"array.prototype.at": "^1.1.1",
|
|
47
|
-
"
|
|
47
|
+
"events": "^3.3.0",
|
|
48
|
+
"livekit-client": "^2.7.5",
|
|
48
49
|
"loglevel": "^1.8.0",
|
|
49
50
|
"promise.allsettled": "^1.0.5",
|
|
50
51
|
"react-native-url-polyfill": "^1.3.0",
|
|
52
|
+
"typed-emitter": "^2.1.0",
|
|
51
53
|
"well-known-symbols": "^4.0.0"
|
|
52
54
|
},
|
|
53
55
|
"devDependencies": {
|
|
@@ -55,7 +57,7 @@
|
|
|
55
57
|
"@babel/preset-env": "^7.20.0",
|
|
56
58
|
"@babel/runtime": "^7.20.0",
|
|
57
59
|
"@commitlint/config-conventional": "^16.2.1",
|
|
58
|
-
"@livekit/react-native-webrtc": "^125.0.
|
|
60
|
+
"@livekit/react-native-webrtc": "^125.0.7",
|
|
59
61
|
"@react-native/babel-preset": "0.74.84",
|
|
60
62
|
"@react-native/eslint-config": "0.74.84",
|
|
61
63
|
"@react-native/metro-config": "0.74.84",
|
|
@@ -81,7 +83,7 @@
|
|
|
81
83
|
"typescript": "5.0.4"
|
|
82
84
|
},
|
|
83
85
|
"peerDependencies": {
|
|
84
|
-
"@livekit/react-native-webrtc": "^125.0.
|
|
86
|
+
"@livekit/react-native-webrtc": "^125.0.7",
|
|
85
87
|
"react": "*",
|
|
86
88
|
"react-native": "*"
|
|
87
89
|
},
|