livekit-client 1.7.1 → 1.8.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 +20 -1
- package/dist/livekit-client.esm.mjs +2178 -1060
- package/dist/livekit-client.esm.mjs.map +1 -1
- package/dist/livekit-client.umd.js +1 -1
- package/dist/livekit-client.umd.js.map +1 -1
- package/dist/src/index.d.ts +3 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/proto/google/protobuf/timestamp.d.ts.map +1 -1
- package/dist/src/proto/livekit_models.d.ts +32 -0
- package/dist/src/proto/livekit_models.d.ts.map +1 -1
- package/dist/src/proto/livekit_rtc.d.ts +315 -75
- package/dist/src/proto/livekit_rtc.d.ts.map +1 -1
- package/dist/src/room/RTCEngine.d.ts +8 -1
- package/dist/src/room/RTCEngine.d.ts.map +1 -1
- package/dist/src/room/ReconnectPolicy.d.ts +1 -0
- package/dist/src/room/ReconnectPolicy.d.ts.map +1 -1
- package/dist/src/room/RegionUrlProvider.d.ts +14 -0
- package/dist/src/room/RegionUrlProvider.d.ts.map +1 -0
- package/dist/src/room/Room.d.ts +4 -0
- package/dist/src/room/Room.d.ts.map +1 -1
- package/dist/src/room/errors.d.ts +2 -1
- package/dist/src/room/errors.d.ts.map +1 -1
- package/dist/src/room/events.d.ts +8 -2
- package/dist/src/room/events.d.ts.map +1 -1
- package/dist/src/room/track/LocalAudioTrack.d.ts.map +1 -1
- package/dist/src/room/track/LocalTrack.d.ts +3 -2
- package/dist/src/room/track/LocalTrack.d.ts.map +1 -1
- package/dist/src/room/track/LocalVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/RemoteTrackPublication.d.ts +1 -1
- package/dist/src/room/track/RemoteTrackPublication.d.ts.map +1 -1
- package/dist/src/room/track/RemoteVideoTrack.d.ts +1 -1
- package/dist/src/room/track/RemoteVideoTrack.d.ts.map +1 -1
- package/dist/src/room/track/Track.d.ts +3 -1
- package/dist/src/room/track/Track.d.ts.map +1 -1
- package/dist/src/room/types.d.ts +4 -0
- package/dist/src/room/types.d.ts.map +1 -1
- package/dist/src/room/utils.d.ts +4 -0
- package/dist/src/room/utils.d.ts.map +1 -1
- package/dist/ts4.2/src/index.d.ts +3 -1
- package/dist/ts4.2/src/proto/livekit_models.d.ts +32 -0
- package/dist/ts4.2/src/proto/livekit_rtc.d.ts +348 -84
- package/dist/ts4.2/src/room/RTCEngine.d.ts +8 -1
- package/dist/ts4.2/src/room/ReconnectPolicy.d.ts +1 -0
- package/dist/ts4.2/src/room/RegionUrlProvider.d.ts +14 -0
- package/dist/ts4.2/src/room/Room.d.ts +4 -0
- package/dist/ts4.2/src/room/errors.d.ts +2 -1
- package/dist/ts4.2/src/room/events.d.ts +8 -2
- package/dist/ts4.2/src/room/track/LocalTrack.d.ts +3 -2
- package/dist/ts4.2/src/room/track/RemoteTrackPublication.d.ts +1 -1
- package/dist/ts4.2/src/room/track/RemoteVideoTrack.d.ts +1 -1
- package/dist/ts4.2/src/room/track/Track.d.ts +3 -1
- package/dist/ts4.2/src/room/types.d.ts +4 -0
- package/dist/ts4.2/src/room/utils.d.ts +4 -0
- package/package.json +19 -19
- package/src/api/SignalClient.ts +4 -4
- package/src/index.ts +3 -0
- package/src/proto/google/protobuf/timestamp.ts +15 -6
- package/src/proto/livekit_models.ts +903 -222
- package/src/proto/livekit_rtc.ts +1053 -279
- package/src/room/RTCEngine.ts +143 -40
- package/src/room/ReconnectPolicy.ts +2 -0
- package/src/room/RegionUrlProvider.ts +73 -0
- package/src/room/Room.ts +201 -132
- package/src/room/errors.ts +1 -0
- package/src/room/events.ts +7 -0
- package/src/room/track/LocalAudioTrack.ts +13 -6
- package/src/room/track/LocalTrack.ts +22 -8
- package/src/room/track/LocalVideoTrack.ts +12 -6
- package/src/room/track/RemoteTrackPublication.ts +4 -3
- package/src/room/track/RemoteVideoTrack.ts +5 -4
- package/src/room/track/Track.ts +46 -31
- package/src/room/types.ts +6 -0
- package/src/room/utils.ts +53 -0
package/src/room/track/Track.ts
CHANGED
@@ -42,7 +42,7 @@ export abstract class Track extends (EventEmitter as new () => TypedEventEmitter
|
|
42
42
|
|
43
43
|
protected _mediaStreamID: string;
|
44
44
|
|
45
|
-
protected isInBackground: boolean;
|
45
|
+
protected isInBackground: boolean = false;
|
46
46
|
|
47
47
|
private backgroundTimeout: ReturnType<typeof setTimeout> | undefined;
|
48
48
|
|
@@ -57,12 +57,6 @@ export abstract class Track extends (EventEmitter as new () => TypedEventEmitter
|
|
57
57
|
this._mediaStreamTrack = mediaTrack;
|
58
58
|
this._mediaStreamID = mediaTrack.id;
|
59
59
|
this.source = Track.Source.Unknown;
|
60
|
-
if (isWeb()) {
|
61
|
-
this.isInBackground = document.visibilityState === 'hidden';
|
62
|
-
document.addEventListener('visibilitychange', this.appVisibilityChangedListener);
|
63
|
-
} else {
|
64
|
-
this.isInBackground = false;
|
65
|
-
}
|
66
60
|
}
|
67
61
|
|
68
62
|
/** current receive bits per second */
|
@@ -97,6 +91,9 @@ export abstract class Track extends (EventEmitter as new () => TypedEventEmitter
|
|
97
91
|
if (this.kind === Track.Kind.Video) {
|
98
92
|
elementType = 'video';
|
99
93
|
}
|
94
|
+
if (this.attachedElements.length === 0 && Track.Kind.Video) {
|
95
|
+
this.addAppVisibilityListener();
|
96
|
+
}
|
100
97
|
if (!element) {
|
101
98
|
if (elementType === 'audio') {
|
102
99
|
recycledElements.forEach((e) => {
|
@@ -167,37 +164,40 @@ export abstract class Track extends (EventEmitter as new () => TypedEventEmitter
|
|
167
164
|
*/
|
168
165
|
detach(element: HTMLMediaElement): HTMLMediaElement;
|
169
166
|
detach(element?: HTMLMediaElement): HTMLMediaElement | HTMLMediaElement[] {
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
167
|
+
try {
|
168
|
+
// detach from a single element
|
169
|
+
if (element) {
|
170
|
+
detachTrack(this._mediaStreamTrack, element);
|
171
|
+
const idx = this.attachedElements.indexOf(element);
|
172
|
+
if (idx >= 0) {
|
173
|
+
this.attachedElements.splice(idx, 1);
|
174
|
+
this.recycleElement(element);
|
175
|
+
this.emit(TrackEvent.ElementDetached, element);
|
176
|
+
}
|
177
|
+
return element;
|
178
178
|
}
|
179
|
-
return element;
|
180
|
-
}
|
181
179
|
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
180
|
+
const detached: HTMLMediaElement[] = [];
|
181
|
+
this.attachedElements.forEach((elm) => {
|
182
|
+
detachTrack(this._mediaStreamTrack, elm);
|
183
|
+
detached.push(elm);
|
184
|
+
this.recycleElement(elm);
|
185
|
+
this.emit(TrackEvent.ElementDetached, elm);
|
186
|
+
});
|
189
187
|
|
190
|
-
|
191
|
-
|
192
|
-
|
188
|
+
// remove all tracks
|
189
|
+
this.attachedElements = [];
|
190
|
+
return detached;
|
191
|
+
} finally {
|
192
|
+
if (this.attachedElements.length === 0) {
|
193
|
+
this.removeAppVisibilityListener();
|
194
|
+
}
|
195
|
+
}
|
193
196
|
}
|
194
197
|
|
195
198
|
stop() {
|
196
199
|
this.stopMonitor();
|
197
200
|
this._mediaStreamTrack.stop();
|
198
|
-
if (isWeb()) {
|
199
|
-
document.removeEventListener('visibilitychange', this.appVisibilityChangedListener);
|
200
|
-
}
|
201
201
|
}
|
202
202
|
|
203
203
|
protected enable() {
|
@@ -212,7 +212,7 @@ export abstract class Track extends (EventEmitter as new () => TypedEventEmitter
|
|
212
212
|
abstract startMonitor(signalClient?: SignalClient): void;
|
213
213
|
|
214
214
|
/* @internal */
|
215
|
-
|
215
|
+
stopMonitor() {
|
216
216
|
if (this.monitorInterval) {
|
217
217
|
clearInterval(this.monitorInterval);
|
218
218
|
}
|
@@ -253,6 +253,21 @@ export abstract class Track extends (EventEmitter as new () => TypedEventEmitter
|
|
253
253
|
protected async handleAppVisibilityChanged() {
|
254
254
|
this.isInBackground = document.visibilityState === 'hidden';
|
255
255
|
}
|
256
|
+
|
257
|
+
protected addAppVisibilityListener() {
|
258
|
+
if (isWeb()) {
|
259
|
+
this.isInBackground = document.visibilityState === 'hidden';
|
260
|
+
document.addEventListener('visibilitychange', this.appVisibilityChangedListener);
|
261
|
+
} else {
|
262
|
+
this.isInBackground = false;
|
263
|
+
}
|
264
|
+
}
|
265
|
+
|
266
|
+
protected removeAppVisibilityListener() {
|
267
|
+
if (isWeb()) {
|
268
|
+
document.removeEventListener('visibilitychange', this.appVisibilityChangedListener);
|
269
|
+
}
|
270
|
+
}
|
256
271
|
}
|
257
272
|
|
258
273
|
/** @internal */
|
package/src/room/types.ts
CHANGED
@@ -20,3 +20,9 @@ export type DataPublishOptions = {
|
|
20
20
|
/** the topic under which the message gets published */
|
21
21
|
topic?: string;
|
22
22
|
};
|
23
|
+
|
24
|
+
export type LiveKitReactNativeInfo = {
|
25
|
+
// Corresponds to RN's PlatformOSType
|
26
|
+
platform: 'ios' | 'android' | 'windows' | 'macos' | 'web' | 'native';
|
27
|
+
devicePixelRatio: number;
|
28
|
+
};
|
package/src/room/utils.ts
CHANGED
@@ -4,6 +4,7 @@ import { protocolVersion, version } from '../version';
|
|
4
4
|
import type LocalAudioTrack from './track/LocalAudioTrack';
|
5
5
|
import type RemoteAudioTrack from './track/RemoteAudioTrack';
|
6
6
|
import { getNewAudioContext } from './track/utils';
|
7
|
+
import type { LiveKitReactNativeInfo } from './types';
|
7
8
|
|
8
9
|
const separator = '|';
|
9
10
|
|
@@ -122,6 +123,54 @@ export function isWeb(): boolean {
|
|
122
123
|
return typeof document !== 'undefined';
|
123
124
|
}
|
124
125
|
|
126
|
+
export function isReactNative(): boolean {
|
127
|
+
// navigator.product is deprecated on browsers, but will be set appropriately for react-native.
|
128
|
+
return navigator.product == 'ReactNative';
|
129
|
+
}
|
130
|
+
|
131
|
+
export function isCloud(serverUrl: URL) {
|
132
|
+
return serverUrl.hostname.endsWith('.livekit.cloud');
|
133
|
+
}
|
134
|
+
|
135
|
+
function getLKReactNativeInfo(): LiveKitReactNativeInfo | undefined {
|
136
|
+
// global defined only for ReactNative.
|
137
|
+
// @ts-ignore
|
138
|
+
if (global && global.LiveKitReactNativeGlobal) {
|
139
|
+
// @ts-ignore
|
140
|
+
return global.LiveKitReactNativeGlobal as LiveKitReactNativeInfo;
|
141
|
+
}
|
142
|
+
|
143
|
+
return undefined;
|
144
|
+
}
|
145
|
+
|
146
|
+
export function getReactNativeOs(): string | undefined {
|
147
|
+
if (!isReactNative()) {
|
148
|
+
return undefined;
|
149
|
+
}
|
150
|
+
|
151
|
+
let info = getLKReactNativeInfo();
|
152
|
+
if (info) {
|
153
|
+
return info.platform;
|
154
|
+
}
|
155
|
+
|
156
|
+
return undefined;
|
157
|
+
}
|
158
|
+
|
159
|
+
export function getDevicePixelRatio(): number {
|
160
|
+
if (isWeb()) {
|
161
|
+
return window.devicePixelRatio;
|
162
|
+
}
|
163
|
+
|
164
|
+
if (isReactNative()) {
|
165
|
+
let info = getLKReactNativeInfo();
|
166
|
+
if (info) {
|
167
|
+
return info.devicePixelRatio;
|
168
|
+
}
|
169
|
+
}
|
170
|
+
|
171
|
+
return 1;
|
172
|
+
}
|
173
|
+
|
125
174
|
export function compareVersions(v1: string, v2: string): number {
|
126
175
|
const parts1 = v1.split('.');
|
127
176
|
const parts2 = v2.split('.');
|
@@ -174,6 +223,10 @@ export function getClientInfo(): ClientInfo {
|
|
174
223
|
protocol: protocolVersion,
|
175
224
|
version,
|
176
225
|
});
|
226
|
+
|
227
|
+
if (isReactNative()) {
|
228
|
+
info.os = getReactNativeOs() ?? '';
|
229
|
+
}
|
177
230
|
return info;
|
178
231
|
}
|
179
232
|
|