livekit-client 0.15.0 → 0.15.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/.gitmodules +3 -0
- package/README.md +21 -4
- package/dist/api/SignalClient.d.ts +3 -1
- package/dist/api/SignalClient.js +12 -1
- package/dist/api/SignalClient.js.map +1 -1
- package/dist/connect.js +3 -0
- package/dist/connect.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/logger.js +1 -0
- package/dist/logger.js.map +1 -1
- package/dist/options.d.ts +23 -14
- package/dist/proto/livekit_rtc.d.ts +65 -0
- package/dist/proto/livekit_rtc.js +481 -3
- package/dist/proto/livekit_rtc.js.map +1 -1
- package/dist/room/RTCEngine.d.ts +2 -0
- package/dist/room/RTCEngine.js +25 -31
- package/dist/room/RTCEngine.js.map +1 -1
- package/dist/room/Room.d.ts +7 -0
- package/dist/room/Room.js +72 -54
- package/dist/room/Room.js.map +1 -1
- package/dist/room/events.d.ts +22 -6
- package/dist/room/events.js +21 -5
- package/dist/room/events.js.map +1 -1
- package/dist/room/participant/LocalParticipant.d.ts +2 -0
- package/dist/room/participant/LocalParticipant.js +26 -5
- package/dist/room/participant/LocalParticipant.js.map +1 -1
- package/dist/room/participant/RemoteParticipant.d.ts +1 -1
- package/dist/room/participant/RemoteParticipant.js +5 -3
- package/dist/room/participant/RemoteParticipant.js.map +1 -1
- package/dist/room/participant/publishUtils.d.ts +1 -1
- package/dist/room/participant/publishUtils.js +3 -3
- package/dist/room/participant/publishUtils.js.map +1 -1
- package/dist/room/participant/publishUtils.test.js +1 -1
- package/dist/room/participant/publishUtils.test.js.map +1 -1
- package/dist/room/stats.d.ts +21 -6
- package/dist/room/stats.js +22 -1
- package/dist/room/stats.js.map +1 -1
- package/dist/room/track/LocalAudioTrack.d.ts +5 -1
- package/dist/room/track/LocalAudioTrack.js +45 -1
- package/dist/room/track/LocalAudioTrack.js.map +1 -1
- package/dist/room/track/LocalTrack.d.ts +3 -0
- package/dist/room/track/LocalTrack.js +5 -0
- package/dist/room/track/LocalTrack.js.map +1 -1
- package/dist/room/track/LocalVideoTrack.d.ts +7 -0
- package/dist/room/track/LocalVideoTrack.js +111 -47
- package/dist/room/track/LocalVideoTrack.js.map +1 -1
- package/dist/room/track/RemoteAudioTrack.d.ts +7 -0
- package/dist/room/track/RemoteAudioTrack.js +61 -0
- package/dist/room/track/RemoteAudioTrack.js.map +1 -1
- package/dist/room/track/RemoteTrackPublication.d.ts +1 -1
- package/dist/room/track/RemoteTrackPublication.js +8 -8
- package/dist/room/track/RemoteTrackPublication.js.map +1 -1
- package/dist/room/track/RemoteVideoTrack.d.ts +9 -3
- package/dist/room/track/RemoteVideoTrack.js +71 -6
- package/dist/room/track/RemoteVideoTrack.js.map +1 -1
- package/dist/room/track/Track.d.ts +9 -0
- package/dist/room/track/Track.js +28 -0
- package/dist/room/track/Track.js.map +1 -1
- package/dist/room/track/create.d.ts +23 -0
- package/dist/room/track/create.js +125 -0
- package/dist/room/track/create.js.map +1 -0
- package/dist/room/track/defaults.d.ts +4 -0
- package/dist/room/track/defaults.js +21 -0
- package/dist/room/track/defaults.js.map +1 -0
- package/dist/room/utils.d.ts +1 -1
- package/dist/room/utils.js +5 -6
- package/dist/room/utils.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/example/index.html +14 -3
- package/example/sample.ts +52 -6
- package/package.json +2 -2
@@ -0,0 +1,125 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
9
|
+
});
|
10
|
+
};
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
13
|
+
};
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
15
|
+
exports.createLocalScreenTracks = exports.createLocalAudioTrack = exports.createLocalVideoTrack = exports.createLocalTracks = void 0;
|
16
|
+
const errors_1 = require("../errors");
|
17
|
+
const publishUtils_1 = require("../participant/publishUtils");
|
18
|
+
const defaults_1 = require("./defaults");
|
19
|
+
const LocalAudioTrack_1 = __importDefault(require("./LocalAudioTrack"));
|
20
|
+
const LocalVideoTrack_1 = __importDefault(require("./LocalVideoTrack"));
|
21
|
+
const options_1 = require("./options");
|
22
|
+
const Track_1 = require("./Track");
|
23
|
+
const utils_1 = require("./utils");
|
24
|
+
/**
|
25
|
+
* Creates a local video and audio track at the same time. When acquiring both
|
26
|
+
* audio and video tracks together, it'll display a single permission prompt to
|
27
|
+
* the user instead of two separate ones.
|
28
|
+
* @param options
|
29
|
+
*/
|
30
|
+
function createLocalTracks(options) {
|
31
|
+
return __awaiter(this, void 0, void 0, function* () {
|
32
|
+
const opts = utils_1.mergeDefaultOptions(options, defaults_1.audioDefaults, defaults_1.videoDefaults);
|
33
|
+
const constraints = utils_1.constraintsForOptions(opts);
|
34
|
+
const stream = yield navigator.mediaDevices.getUserMedia(constraints);
|
35
|
+
return stream.getTracks().map((mediaStreamTrack) => {
|
36
|
+
const isAudio = mediaStreamTrack.kind === 'audio';
|
37
|
+
let trackOptions = isAudio ? options.audio : options.video;
|
38
|
+
if (typeof trackOptions === 'boolean' || !trackOptions) {
|
39
|
+
trackOptions = {};
|
40
|
+
}
|
41
|
+
let trackConstraints;
|
42
|
+
const conOrBool = isAudio ? constraints.audio : constraints.video;
|
43
|
+
if (typeof conOrBool !== 'boolean') {
|
44
|
+
trackConstraints = conOrBool;
|
45
|
+
}
|
46
|
+
const track = publishUtils_1.mediaTrackToLocalTrack(mediaStreamTrack, trackConstraints);
|
47
|
+
if (track.kind === Track_1.Track.Kind.Video) {
|
48
|
+
track.source = Track_1.Track.Source.Camera;
|
49
|
+
}
|
50
|
+
else if (track.kind === Track_1.Track.Kind.Audio) {
|
51
|
+
track.source = Track_1.Track.Source.Microphone;
|
52
|
+
}
|
53
|
+
return track;
|
54
|
+
});
|
55
|
+
});
|
56
|
+
}
|
57
|
+
exports.createLocalTracks = createLocalTracks;
|
58
|
+
/**
|
59
|
+
* Creates a [[LocalVideoTrack]] with getUserMedia()
|
60
|
+
* @param options
|
61
|
+
*/
|
62
|
+
function createLocalVideoTrack(options) {
|
63
|
+
return __awaiter(this, void 0, void 0, function* () {
|
64
|
+
const tracks = yield createLocalTracks({
|
65
|
+
audio: false,
|
66
|
+
video: options,
|
67
|
+
});
|
68
|
+
return tracks[0];
|
69
|
+
});
|
70
|
+
}
|
71
|
+
exports.createLocalVideoTrack = createLocalVideoTrack;
|
72
|
+
function createLocalAudioTrack(options) {
|
73
|
+
return __awaiter(this, void 0, void 0, function* () {
|
74
|
+
const tracks = yield createLocalTracks({
|
75
|
+
audio: options,
|
76
|
+
video: false,
|
77
|
+
});
|
78
|
+
return tracks[0];
|
79
|
+
});
|
80
|
+
}
|
81
|
+
exports.createLocalAudioTrack = createLocalAudioTrack;
|
82
|
+
/**
|
83
|
+
* Creates a screen capture tracks with getDisplayMedia().
|
84
|
+
* A LocalVideoTrack is always created and returned.
|
85
|
+
* If { audio: true }, and the browser supports audio capture, a LocalAudioTrack is also created.
|
86
|
+
*/
|
87
|
+
function createLocalScreenTracks(options) {
|
88
|
+
var _a;
|
89
|
+
return __awaiter(this, void 0, void 0, function* () {
|
90
|
+
if (options === undefined) {
|
91
|
+
options = {};
|
92
|
+
}
|
93
|
+
if (options.resolution === undefined) {
|
94
|
+
options.resolution = options_1.VideoPresets.fhd.resolution;
|
95
|
+
}
|
96
|
+
let videoConstraints = true;
|
97
|
+
if (options.resolution) {
|
98
|
+
videoConstraints = {
|
99
|
+
width: options.resolution.width,
|
100
|
+
height: options.resolution.height,
|
101
|
+
};
|
102
|
+
}
|
103
|
+
// typescript definition is missing getDisplayMedia: https://github.com/microsoft/TypeScript/issues/33232
|
104
|
+
// @ts-ignore
|
105
|
+
const stream = yield navigator.mediaDevices.getDisplayMedia({
|
106
|
+
audio: (_a = options.audio) !== null && _a !== void 0 ? _a : false,
|
107
|
+
video: videoConstraints,
|
108
|
+
});
|
109
|
+
const tracks = stream.getVideoTracks();
|
110
|
+
if (tracks.length === 0) {
|
111
|
+
throw new errors_1.TrackInvalidError('no video track found');
|
112
|
+
}
|
113
|
+
const screenVideo = new LocalVideoTrack_1.default(tracks[0]);
|
114
|
+
screenVideo.source = Track_1.Track.Source.ScreenShare;
|
115
|
+
const localTracks = [screenVideo];
|
116
|
+
if (stream.getAudioTracks().length > 0) {
|
117
|
+
const screenAudio = new LocalAudioTrack_1.default(stream.getAudioTracks()[0]);
|
118
|
+
screenAudio.source = Track_1.Track.Source.ScreenShareAudio;
|
119
|
+
localTracks.push(screenAudio);
|
120
|
+
}
|
121
|
+
return localTracks;
|
122
|
+
});
|
123
|
+
}
|
124
|
+
exports.createLocalScreenTracks = createLocalScreenTracks;
|
125
|
+
//# sourceMappingURL=create.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/room/track/create.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,21 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.videoDefaults = exports.audioDefaults = exports.publishDefaults = void 0;
|
4
|
+
const options_1 = require("./options");
|
5
|
+
exports.publishDefaults = {
|
6
|
+
audioBitrate: options_1.AudioPresets.speech.maxBitrate,
|
7
|
+
dtx: true,
|
8
|
+
simulcast: true,
|
9
|
+
screenShareEncoding: options_1.ScreenSharePresets.hd_15.encoding,
|
10
|
+
stopMicTrackOnMute: false,
|
11
|
+
};
|
12
|
+
exports.audioDefaults = {
|
13
|
+
autoGainControl: true,
|
14
|
+
channelCount: 1,
|
15
|
+
echoCancellation: true,
|
16
|
+
noiseSuppression: true,
|
17
|
+
};
|
18
|
+
exports.videoDefaults = {
|
19
|
+
resolution: options_1.VideoPresets.qhd.resolution,
|
20
|
+
};
|
21
|
+
//# sourceMappingURL=defaults.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../src/room/track/defaults.ts"],"names":[],"mappings":";;;AAAA,uCAGmB;AAEN,QAAA,eAAe,GAAyB;IACnD,YAAY,EAAE,sBAAY,CAAC,MAAM,CAAC,UAAU;IAC5C,GAAG,EAAE,IAAI;IACT,SAAS,EAAE,IAAI;IACf,mBAAmB,EAAE,4BAAkB,CAAC,KAAK,CAAC,QAAQ;IACtD,kBAAkB,EAAE,KAAK;CAC1B,CAAC;AAEW,QAAA,aAAa,GAAwB;IAChD,eAAe,EAAE,IAAI;IACrB,YAAY,EAAE,CAAC;IACf,gBAAgB,EAAE,IAAI;IACtB,gBAAgB,EAAE,IAAI;CACvB,CAAC;AAEW,QAAA,aAAa,GAAwB;IAChD,UAAU,EAAE,sBAAY,CAAC,GAAG,CAAC,UAAU;CACxC,CAAC"}
|
package/dist/room/utils.d.ts
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
export declare function unpackStreamId(packed: string): string[];
|
2
|
-
export declare function useLegacyAPI(): boolean;
|
3
2
|
export declare function sleep(duration: number): Promise<void>;
|
3
|
+
export declare function isFireFox(): boolean;
|
4
4
|
export declare const getResizeObserver: () => ResizeObserver;
|
5
5
|
export declare const getIntersectionObserver: () => IntersectionObserver;
|
6
6
|
export interface ObservableMediaElement extends HTMLMediaElement {
|
package/dist/room/utils.js
CHANGED
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
9
9
|
});
|
10
10
|
};
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
12
|
-
exports.getIntersectionObserver = exports.getResizeObserver = exports.
|
12
|
+
exports.getIntersectionObserver = exports.getResizeObserver = exports.isFireFox = exports.sleep = exports.unpackStreamId = void 0;
|
13
13
|
const separator = '|';
|
14
14
|
function unpackStreamId(packed) {
|
15
15
|
const parts = packed.split(separator);
|
@@ -19,17 +19,16 @@ function unpackStreamId(packed) {
|
|
19
19
|
return [packed, ''];
|
20
20
|
}
|
21
21
|
exports.unpackStreamId = unpackStreamId;
|
22
|
-
function useLegacyAPI() {
|
23
|
-
// react native is using old stream based API
|
24
|
-
return typeof navigator !== 'undefined' && navigator.product === 'ReactNative';
|
25
|
-
}
|
26
|
-
exports.useLegacyAPI = useLegacyAPI;
|
27
22
|
function sleep(duration) {
|
28
23
|
return __awaiter(this, void 0, void 0, function* () {
|
29
24
|
return new Promise((resolve) => setTimeout(resolve, duration));
|
30
25
|
});
|
31
26
|
}
|
32
27
|
exports.sleep = sleep;
|
28
|
+
function isFireFox() {
|
29
|
+
return navigator.userAgent.indexOf('Firefox') !== -1;
|
30
|
+
}
|
31
|
+
exports.isFireFox = isFireFox;
|
33
32
|
function roDispatchCallback(entries) {
|
34
33
|
for (const entry of entries) {
|
35
34
|
entry.target.handleResize(entry);
|
package/dist/room/utils.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/room/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,SAAgB,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;KACvD;IACD,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC;AAND,wCAMC;AAED,
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/room/utils.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,SAAgB,cAAc,CAAC,MAAc;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACtC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;QACpB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;KACvD;IACD,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AACtB,CAAC;AAND,wCAMC;AAED,SAAsB,KAAK,CAAC,QAAgB;;QAC1C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjE,CAAC;CAAA;AAFD,sBAEC;AAED,SAAgB,SAAS;IACvB,OAAO,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;AACvD,CAAC;AAFD,8BAEC;AAED,SAAS,kBAAkB,CAAC,OAA8B;IACxD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;QAC1B,KAAK,CAAC,MAAiC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;KAC9D;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAoC;IAC9D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE;QAC1B,KAAK,CAAC,MAAiC,CAAC,uBAAuB,CAAC,KAAK,CAAC,CAAC;KACzE;AACH,CAAC;AAED,IAAI,cAAc,GAA0B,IAAI,CAAC;AAC1C,MAAM,iBAAiB,GAAG,GAAG,EAAE;IACpC,IAAI,CAAC,cAAc;QAAE,cAAc,GAAG,IAAI,cAAc,CAAC,kBAAkB,CAAC,CAAC;IAC7E,OAAO,cAAc,CAAC;AACxB,CAAC,CAAC;AAHW,QAAA,iBAAiB,qBAG5B;AAEF,IAAI,oBAAoB,GAAgC,IAAI,CAAC;AACtD,MAAM,uBAAuB,GAAG,GAAG,EAAE;IAC1C,IAAI,CAAC,oBAAoB;QAAE,oBAAoB,GAAG,IAAI,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;IAC/F,OAAO,oBAAoB,CAAC;AAC9B,CAAC,CAAC;AAHW,QAAA,uBAAuB,2BAGlC"}
|
package/dist/version.d.ts
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
export declare const version = "0.15.
|
1
|
+
export declare const version = "0.15.1";
|
2
2
|
export declare const protocolVersion = 5;
|
package/dist/version.js
CHANGED
package/example/index.html
CHANGED
@@ -72,11 +72,22 @@
|
|
72
72
|
<input
|
73
73
|
type="checkbox"
|
74
74
|
class="form-check-input"
|
75
|
-
id="
|
75
|
+
id="dynacast"
|
76
76
|
checked
|
77
77
|
/>
|
78
|
-
<label for="
|
79
|
-
|
78
|
+
<label for="dynacast" class="form-check-label">
|
79
|
+
Dynacast
|
80
|
+
</label>
|
81
|
+
</div>
|
82
|
+
<div>
|
83
|
+
<input
|
84
|
+
type="checkbox"
|
85
|
+
class="form-check-input"
|
86
|
+
id="adaptive-stream"
|
87
|
+
checked
|
88
|
+
/>
|
89
|
+
<label for="adaptive-stream" class="form-check-label">
|
90
|
+
AdaptiveStream
|
80
91
|
</label>
|
81
92
|
</div>
|
82
93
|
<div>
|
package/example/sample.ts
CHANGED
@@ -1,9 +1,11 @@
|
|
1
1
|
import {
|
2
2
|
DataPacket_Kind, LocalParticipant,
|
3
|
+
LocalTrack,
|
3
4
|
MediaDeviceFailure,
|
4
5
|
Participant,
|
5
6
|
ParticipantEvent,
|
6
|
-
|
7
|
+
RemoteAudioTrack,
|
8
|
+
RemoteParticipant, RemoteVideoTrack, Room, RoomConnectOptions, RoomEvent,
|
7
9
|
RoomOptions, RoomState, setLogLevel, Track, TrackPublication,
|
8
10
|
VideoCaptureOptions, VideoPresets,
|
9
11
|
} from '../src/index';
|
@@ -16,8 +18,8 @@ const state = {
|
|
16
18
|
encoder: new TextEncoder(),
|
17
19
|
decoder: new TextDecoder(),
|
18
20
|
defaultDevices: new Map<MediaDeviceKind, string>(),
|
21
|
+
bitrateInterval: undefined as any,
|
19
22
|
};
|
20
|
-
|
21
23
|
let currentRoom: Room | undefined;
|
22
24
|
|
23
25
|
// handles actions from the HTML
|
@@ -26,14 +28,16 @@ const appActions = {
|
|
26
28
|
const url = (<HTMLInputElement>$('url')).value;
|
27
29
|
const token = (<HTMLInputElement>$('token')).value;
|
28
30
|
const simulcast = (<HTMLInputElement>$('simulcast')).checked;
|
31
|
+
const dynacast = (<HTMLInputElement>$('dynacast')).checked;
|
29
32
|
const forceTURN = (<HTMLInputElement>$('force-turn')).checked;
|
30
|
-
const
|
33
|
+
const adaptiveStream = (<HTMLInputElement>$('adaptive-stream')).checked;
|
31
34
|
const shouldPublish = (<HTMLInputElement>$('publish-option')).checked;
|
32
35
|
|
33
36
|
setLogLevel('debug');
|
34
37
|
|
35
38
|
const roomOpts: RoomOptions = {
|
36
|
-
|
39
|
+
adaptiveStream,
|
40
|
+
dynacast,
|
37
41
|
publishDefaults: {
|
38
42
|
simulcast,
|
39
43
|
},
|
@@ -54,6 +58,8 @@ const appActions = {
|
|
54
58
|
await room.localParticipant.enableCameraAndMicrophone();
|
55
59
|
updateButtonsForPublishState();
|
56
60
|
}
|
61
|
+
|
62
|
+
state.bitrateInterval = setInterval(renderBitrate, 1000);
|
57
63
|
},
|
58
64
|
|
59
65
|
connectToRoom: async (
|
@@ -200,6 +206,9 @@ const appActions = {
|
|
200
206
|
if (currentRoom) {
|
201
207
|
currentRoom.disconnect();
|
202
208
|
}
|
209
|
+
if (state.bitrateInterval) {
|
210
|
+
clearInterval(state.bitrateInterval);
|
211
|
+
}
|
203
212
|
},
|
204
213
|
|
205
214
|
disconnectSignal: () => {
|
@@ -340,7 +349,11 @@ function renderParticipant(participant: Participant, remove: boolean = false) {
|
|
340
349
|
<div class="info-bar">
|
341
350
|
<div id="name-${participant.sid}" class="name">
|
342
351
|
</div>
|
343
|
-
<div
|
352
|
+
<div style="text-align: center;">
|
353
|
+
<span id="size-${participant.sid}" class="size">
|
354
|
+
</span>
|
355
|
+
<span id="bitrate-${participant.sid}" class="bitrate">
|
356
|
+
</span>
|
344
357
|
</div>
|
345
358
|
<div class="right">
|
346
359
|
<span id="signal-${participant.sid}"></span>
|
@@ -385,11 +398,18 @@ function renderParticipant(participant: Participant, remove: boolean = false) {
|
|
385
398
|
|
386
399
|
const cameraEnabled = cameraPub && cameraPub.isSubscribed && !cameraPub.isMuted;
|
387
400
|
if (cameraEnabled) {
|
388
|
-
cameraPub?.videoTrack?.attach(videoElm);
|
389
401
|
if (participant instanceof LocalParticipant) {
|
390
402
|
// flip
|
391
403
|
videoElm.style.transform = 'scale(-1, 1)';
|
404
|
+
} else if (!cameraPub?.videoTrack?.attachedElements.includes(videoElm)) {
|
405
|
+
const startTime = Date.now();
|
406
|
+
// measure time to render
|
407
|
+
videoElm.addEventListener('loadeddata', () => {
|
408
|
+
const elapsed = Date.now() - startTime;
|
409
|
+
appendLog(`RemoteVideoTrack ${cameraPub?.trackSid} rendered in ${elapsed}ms`);
|
410
|
+
});
|
392
411
|
}
|
412
|
+
cameraPub?.videoTrack?.attach(videoElm);
|
393
413
|
} else if (cameraPub?.videoTrack) {
|
394
414
|
// detach manually whenever possible
|
395
415
|
cameraPub.videoTrack?.detach(videoElm);
|
@@ -463,6 +483,32 @@ function renderScreenShare() {
|
|
463
483
|
}
|
464
484
|
}
|
465
485
|
|
486
|
+
function renderBitrate() {
|
487
|
+
if (!currentRoom || currentRoom.state !== RoomState.Connected) {
|
488
|
+
return;
|
489
|
+
}
|
490
|
+
const participants: Participant[] = [...currentRoom.participants.values()];
|
491
|
+
participants.push(currentRoom.localParticipant);
|
492
|
+
|
493
|
+
for (const p of participants) {
|
494
|
+
const elm = $(`bitrate-${p.sid}`);
|
495
|
+
let totalBitrate = 0;
|
496
|
+
for (const t of p.tracks.values()) {
|
497
|
+
if (t.track instanceof RemoteAudioTrack || t.track instanceof RemoteVideoTrack
|
498
|
+
|| t.track instanceof LocalTrack) {
|
499
|
+
totalBitrate += t.track.currentBitrate;
|
500
|
+
}
|
501
|
+
}
|
502
|
+
let displayText = '';
|
503
|
+
if (totalBitrate > 0) {
|
504
|
+
displayText = `${Math.round(totalBitrate / 1024).toLocaleString()} kbps`;
|
505
|
+
}
|
506
|
+
if (elm) {
|
507
|
+
elm.innerHTML = displayText;
|
508
|
+
}
|
509
|
+
}
|
510
|
+
}
|
511
|
+
|
466
512
|
function updateVideoSize(element: HTMLVideoElement, target: HTMLElement) {
|
467
513
|
target.innerHTML = `(${element.videoWidth}x${element.videoHeight})`;
|
468
514
|
}
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "livekit-client",
|
3
|
-
"version": "0.15.
|
3
|
+
"version": "0.15.1",
|
4
4
|
"description": "JavaScript/TypeScript client SDK for LiveKit",
|
5
5
|
"main": "dist/index.js",
|
6
6
|
"source": "src/index.ts",
|
@@ -11,7 +11,7 @@
|
|
11
11
|
"scripts": {
|
12
12
|
"build": "yarn exec tsc",
|
13
13
|
"build-docs": "yarn exec typedoc",
|
14
|
-
"proto": "protoc --plugin=node_modules/ts-proto/protoc-gen-ts_proto --ts_proto_opt=esModuleInterop=true --ts_proto_out=./src/proto --ts_proto_opt=outputClientImpl=false,useOptionals=true -I
|
14
|
+
"proto": "protoc --plugin=node_modules/ts-proto/protoc-gen-ts_proto --ts_proto_opt=esModuleInterop=true --ts_proto_out=./src/proto --ts_proto_opt=outputClientImpl=false,useOptionals=true -I./protocol ./protocol/livekit_rtc.proto ./protocol/livekit_models.proto",
|
15
15
|
"sample": "cd example && webpack serve",
|
16
16
|
"build-sample": "cd example && webpack && cp styles.css index.html dist/",
|
17
17
|
"lint": "yarn exec eslint src",
|