livekit-client 0.18.4-RC7 → 0.18.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/README.md +2 -5
  2. package/dist/api/RequestQueue.d.ts +13 -12
  3. package/dist/api/RequestQueue.d.ts.map +1 -0
  4. package/dist/api/SignalClient.d.ts +67 -66
  5. package/dist/api/SignalClient.d.ts.map +1 -0
  6. package/dist/connect.d.ts +24 -23
  7. package/dist/connect.d.ts.map +1 -0
  8. package/dist/index.d.ts +27 -26
  9. package/dist/index.d.ts.map +1 -0
  10. package/dist/livekit-client.esm.mjs +638 -517
  11. package/dist/livekit-client.esm.mjs.map +1 -1
  12. package/dist/livekit-client.umd.js +1 -1
  13. package/dist/livekit-client.umd.js.map +1 -1
  14. package/dist/logger.d.ts +26 -25
  15. package/dist/logger.d.ts.map +1 -0
  16. package/dist/options.d.ts +128 -127
  17. package/dist/options.d.ts.map +1 -0
  18. package/dist/proto/google/protobuf/timestamp.d.ts +133 -132
  19. package/dist/proto/google/protobuf/timestamp.d.ts.map +1 -0
  20. package/dist/proto/livekit_models.d.ts +876 -875
  21. package/dist/proto/livekit_models.d.ts.map +1 -0
  22. package/dist/proto/livekit_rtc.d.ts +3904 -3903
  23. package/dist/proto/livekit_rtc.d.ts.map +1 -0
  24. package/dist/room/DeviceManager.d.ts +8 -7
  25. package/dist/room/DeviceManager.d.ts.map +1 -0
  26. package/dist/room/PCTransport.d.ts +16 -15
  27. package/dist/room/PCTransport.d.ts.map +1 -0
  28. package/dist/room/RTCEngine.d.ts +67 -66
  29. package/dist/room/RTCEngine.d.ts.map +1 -0
  30. package/dist/room/Room.d.ts +166 -165
  31. package/dist/room/Room.d.ts.map +1 -0
  32. package/dist/room/errors.d.ts +29 -28
  33. package/dist/room/errors.d.ts.map +1 -0
  34. package/dist/room/events.d.ts +391 -390
  35. package/dist/room/events.d.ts.map +1 -0
  36. package/dist/room/participant/LocalParticipant.d.ts +126 -125
  37. package/dist/room/participant/LocalParticipant.d.ts.map +1 -0
  38. package/dist/room/participant/Participant.d.ts +94 -93
  39. package/dist/room/participant/Participant.d.ts.map +1 -0
  40. package/dist/room/participant/ParticipantTrackPermission.d.ts +26 -25
  41. package/dist/room/participant/ParticipantTrackPermission.d.ts.map +1 -0
  42. package/dist/room/participant/RemoteParticipant.d.ts +40 -39
  43. package/dist/room/participant/RemoteParticipant.d.ts.map +1 -0
  44. package/dist/room/participant/publishUtils.d.ts +18 -17
  45. package/dist/room/participant/publishUtils.d.ts.map +1 -0
  46. package/dist/room/stats.d.ts +66 -65
  47. package/dist/room/stats.d.ts.map +1 -0
  48. package/dist/room/track/LocalAudioTrack.d.ts +20 -19
  49. package/dist/room/track/LocalAudioTrack.d.ts.map +1 -0
  50. package/dist/room/track/LocalTrack.d.ts +28 -27
  51. package/dist/room/track/LocalTrack.d.ts.map +1 -0
  52. package/dist/room/track/LocalTrackPublication.d.ts +38 -37
  53. package/dist/room/track/LocalTrackPublication.d.ts.map +1 -0
  54. package/dist/room/track/LocalVideoTrack.d.ts +31 -30
  55. package/dist/room/track/LocalVideoTrack.d.ts.map +1 -0
  56. package/dist/room/track/RemoteAudioTrack.d.ts +20 -19
  57. package/dist/room/track/RemoteAudioTrack.d.ts.map +1 -0
  58. package/dist/room/track/RemoteTrack.d.ts +16 -15
  59. package/dist/room/track/RemoteTrack.d.ts.map +1 -0
  60. package/dist/room/track/RemoteTrackPublication.d.ts +51 -50
  61. package/dist/room/track/RemoteTrackPublication.d.ts.map +1 -0
  62. package/dist/room/track/RemoteVideoTrack.d.ts +29 -27
  63. package/dist/room/track/RemoteVideoTrack.d.ts.map +1 -0
  64. package/dist/room/track/Track.d.ts +105 -100
  65. package/dist/room/track/Track.d.ts.map +1 -0
  66. package/dist/room/track/TrackPublication.d.ts +50 -49
  67. package/dist/room/track/TrackPublication.d.ts.map +1 -0
  68. package/dist/room/track/create.d.ts +24 -23
  69. package/dist/room/track/create.d.ts.map +1 -0
  70. package/dist/room/track/defaults.d.ts +5 -4
  71. package/dist/room/track/defaults.d.ts.map +1 -0
  72. package/dist/room/track/options.d.ts +232 -222
  73. package/dist/room/track/options.d.ts.map +1 -0
  74. package/dist/room/track/types.d.ts +19 -18
  75. package/dist/room/track/types.d.ts.map +1 -0
  76. package/dist/room/track/utils.d.ts +14 -13
  77. package/dist/room/track/utils.d.ts.map +1 -0
  78. package/dist/room/utils.d.ts +17 -15
  79. package/dist/room/utils.d.ts.map +1 -0
  80. package/dist/test/mocks.d.ts +12 -11
  81. package/dist/test/mocks.d.ts.map +1 -0
  82. package/dist/version.d.ts +3 -2
  83. package/dist/version.d.ts.map +1 -0
  84. package/package.json +4 -5
  85. package/src/api/RequestQueue.ts +53 -0
  86. package/src/api/SignalClient.ts +497 -0
  87. package/src/connect.ts +98 -0
  88. package/src/index.ts +49 -0
  89. package/src/logger.ts +56 -0
  90. package/src/options.ts +156 -0
  91. package/src/proto/google/protobuf/timestamp.ts +216 -0
  92. package/src/proto/livekit_models.ts +2456 -0
  93. package/src/proto/livekit_rtc.ts +2859 -0
  94. package/src/room/DeviceManager.ts +80 -0
  95. package/src/room/PCTransport.ts +88 -0
  96. package/src/room/RTCEngine.ts +695 -0
  97. package/src/room/Room.ts +970 -0
  98. package/src/room/errors.ts +65 -0
  99. package/src/room/events.ts +438 -0
  100. package/src/room/participant/LocalParticipant.ts +779 -0
  101. package/src/room/participant/Participant.ts +287 -0
  102. package/src/room/participant/ParticipantTrackPermission.ts +42 -0
  103. package/src/room/participant/RemoteParticipant.ts +263 -0
  104. package/src/room/participant/publishUtils.test.ts +144 -0
  105. package/src/room/participant/publishUtils.ts +258 -0
  106. package/src/room/stats.ts +134 -0
  107. package/src/room/track/LocalAudioTrack.ts +134 -0
  108. package/src/room/track/LocalTrack.ts +229 -0
  109. package/src/room/track/LocalTrackPublication.ts +87 -0
  110. package/src/room/track/LocalVideoTrack.test.ts +72 -0
  111. package/src/room/track/LocalVideoTrack.ts +295 -0
  112. package/src/room/track/RemoteAudioTrack.ts +86 -0
  113. package/src/room/track/RemoteTrack.ts +62 -0
  114. package/src/room/track/RemoteTrackPublication.ts +207 -0
  115. package/src/room/track/RemoteVideoTrack.ts +249 -0
  116. package/src/room/track/Track.ts +365 -0
  117. package/src/room/track/TrackPublication.ts +120 -0
  118. package/src/room/track/create.ts +122 -0
  119. package/src/room/track/defaults.ts +26 -0
  120. package/src/room/track/options.ts +292 -0
  121. package/src/room/track/types.ts +20 -0
  122. package/src/room/track/utils.test.ts +110 -0
  123. package/src/room/track/utils.ts +113 -0
  124. package/src/room/utils.ts +115 -0
  125. package/src/test/mocks.ts +17 -0
  126. package/src/version.ts +2 -0
  127. package/CHANGELOG.md +0 -5
@@ -0,0 +1,80 @@
1
+ const defaultId = 'default';
2
+
3
+ export default class DeviceManager {
4
+ private static instance?: DeviceManager;
5
+
6
+ static mediaDeviceKinds: MediaDeviceKind[] = ['audioinput', 'audiooutput', 'videoinput'];
7
+
8
+ static getInstance(): DeviceManager {
9
+ if (this.instance === undefined) {
10
+ this.instance = new DeviceManager();
11
+ }
12
+ return this.instance;
13
+ }
14
+
15
+ async getDevices(
16
+ kind?: MediaDeviceKind,
17
+ requestPermissions: boolean = true,
18
+ ): Promise<MediaDeviceInfo[]> {
19
+ let devices = await navigator.mediaDevices.enumerateDevices();
20
+
21
+ if (requestPermissions) {
22
+ const isDummyDeviceOrEmpty =
23
+ devices.length === 0 ||
24
+ devices.some((device) => {
25
+ const noLabel = device.label === '';
26
+ const isRelevant = kind ? device.kind === kind : true;
27
+ return noLabel && isRelevant;
28
+ });
29
+
30
+ if (isDummyDeviceOrEmpty) {
31
+ const permissionsToAcquire = {
32
+ video: kind !== 'audioinput' && kind !== 'audiooutput',
33
+ audio: kind !== 'videoinput',
34
+ };
35
+ await navigator.mediaDevices.getUserMedia(permissionsToAcquire);
36
+ devices = await navigator.mediaDevices.enumerateDevices();
37
+ }
38
+ }
39
+ if (kind) {
40
+ devices = devices.filter((device) => device.kind === kind);
41
+ }
42
+
43
+ // Chrome returns 'default' devices, we would filter them out, but put the default
44
+ // device at first
45
+ // we would only do this if there are more than 1 device though
46
+ if (devices.length > 1 && devices[0].deviceId === defaultId) {
47
+ // find another device with matching group id, and move that to 0
48
+ const defaultDevice = devices[0];
49
+ for (let i = 1; i < devices.length; i += 1) {
50
+ if (devices[i].groupId === defaultDevice.groupId) {
51
+ const temp = devices[0];
52
+ devices[0] = devices[i];
53
+ devices[i] = temp;
54
+ break;
55
+ }
56
+ }
57
+ return devices.filter((device) => device !== defaultDevice);
58
+ }
59
+
60
+ return devices;
61
+ }
62
+
63
+ async normalizeDeviceId(
64
+ kind: MediaDeviceKind,
65
+ deviceId?: string,
66
+ groupId?: string,
67
+ ): Promise<string | undefined> {
68
+ if (deviceId !== defaultId) {
69
+ return deviceId;
70
+ }
71
+
72
+ // resolve actual device id if it's 'default': Chrome returns it when no
73
+ // device has been chosen
74
+ const devices = await this.getDevices(kind);
75
+
76
+ const device = devices.find((d) => d.groupId === groupId && d.deviceId !== defaultId);
77
+
78
+ return device?.deviceId;
79
+ }
80
+ }
@@ -0,0 +1,88 @@
1
+ import { debounce } from 'ts-debounce';
2
+ import log from '../logger';
3
+
4
+ /** @internal */
5
+ export default class PCTransport {
6
+ pc: RTCPeerConnection;
7
+
8
+ pendingCandidates: RTCIceCandidateInit[] = [];
9
+
10
+ restartingIce: boolean = false;
11
+
12
+ renegotiate: boolean = false;
13
+
14
+ onOffer?: (offer: RTCSessionDescriptionInit) => void;
15
+
16
+ constructor(config?: RTCConfiguration) {
17
+ this.pc = new RTCPeerConnection(config);
18
+ }
19
+
20
+ get isICEConnected(): boolean {
21
+ return this.pc.iceConnectionState === 'connected' || this.pc.iceConnectionState === 'completed';
22
+ }
23
+
24
+ async addIceCandidate(candidate: RTCIceCandidateInit): Promise<void> {
25
+ if (this.pc.remoteDescription && !this.restartingIce) {
26
+ return this.pc.addIceCandidate(candidate);
27
+ }
28
+ this.pendingCandidates.push(candidate);
29
+ }
30
+
31
+ async setRemoteDescription(sd: RTCSessionDescriptionInit): Promise<void> {
32
+ await this.pc.setRemoteDescription(sd);
33
+
34
+ this.pendingCandidates.forEach((candidate) => {
35
+ this.pc.addIceCandidate(candidate);
36
+ });
37
+ this.pendingCandidates = [];
38
+ this.restartingIce = false;
39
+
40
+ if (this.renegotiate) {
41
+ this.renegotiate = false;
42
+ this.createAndSendOffer();
43
+ }
44
+ }
45
+
46
+ // debounced negotiate interface
47
+ negotiate = debounce(() => {
48
+ this.createAndSendOffer();
49
+ }, 100);
50
+
51
+ async createAndSendOffer(options?: RTCOfferOptions) {
52
+ if (this.onOffer === undefined) {
53
+ return;
54
+ }
55
+
56
+ if (options?.iceRestart) {
57
+ log.debug('restarting ICE');
58
+ this.restartingIce = true;
59
+ }
60
+
61
+ if (this.pc.signalingState === 'have-local-offer') {
62
+ // we're waiting for the peer to accept our offer, so we'll just wait
63
+ // the only exception to this is when ICE restart is needed
64
+ const currentSD = this.pc.remoteDescription;
65
+ if (options?.iceRestart && currentSD) {
66
+ // TODO: handle when ICE restart is needed but we don't have a remote description
67
+ // the best thing to do is to recreate the peerconnection
68
+ await this.pc.setRemoteDescription(currentSD);
69
+ } else {
70
+ this.renegotiate = true;
71
+ return;
72
+ }
73
+ } else if (this.pc.signalingState === 'closed') {
74
+ log.warn('could not createOffer with closed peer connection');
75
+ return;
76
+ }
77
+
78
+ // actually negotiate
79
+ log.debug('starting to negotiate');
80
+ const offer = await this.pc.createOffer(options);
81
+ await this.pc.setLocalDescription(offer);
82
+ this.onOffer(offer);
83
+ }
84
+
85
+ close() {
86
+ this.pc.close();
87
+ }
88
+ }