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.
Files changed (74) hide show
  1. package/.gitmodules +3 -0
  2. package/README.md +21 -4
  3. package/dist/api/SignalClient.d.ts +3 -1
  4. package/dist/api/SignalClient.js +12 -1
  5. package/dist/api/SignalClient.js.map +1 -1
  6. package/dist/connect.js +3 -0
  7. package/dist/connect.js.map +1 -1
  8. package/dist/index.d.ts +1 -0
  9. package/dist/index.js +1 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/logger.js +1 -0
  12. package/dist/logger.js.map +1 -1
  13. package/dist/options.d.ts +23 -14
  14. package/dist/proto/livekit_rtc.d.ts +65 -0
  15. package/dist/proto/livekit_rtc.js +481 -3
  16. package/dist/proto/livekit_rtc.js.map +1 -1
  17. package/dist/room/RTCEngine.d.ts +2 -0
  18. package/dist/room/RTCEngine.js +25 -31
  19. package/dist/room/RTCEngine.js.map +1 -1
  20. package/dist/room/Room.d.ts +7 -0
  21. package/dist/room/Room.js +72 -54
  22. package/dist/room/Room.js.map +1 -1
  23. package/dist/room/events.d.ts +22 -6
  24. package/dist/room/events.js +21 -5
  25. package/dist/room/events.js.map +1 -1
  26. package/dist/room/participant/LocalParticipant.d.ts +2 -0
  27. package/dist/room/participant/LocalParticipant.js +26 -5
  28. package/dist/room/participant/LocalParticipant.js.map +1 -1
  29. package/dist/room/participant/RemoteParticipant.d.ts +1 -1
  30. package/dist/room/participant/RemoteParticipant.js +5 -3
  31. package/dist/room/participant/RemoteParticipant.js.map +1 -1
  32. package/dist/room/participant/publishUtils.d.ts +1 -1
  33. package/dist/room/participant/publishUtils.js +3 -3
  34. package/dist/room/participant/publishUtils.js.map +1 -1
  35. package/dist/room/participant/publishUtils.test.js +1 -1
  36. package/dist/room/participant/publishUtils.test.js.map +1 -1
  37. package/dist/room/stats.d.ts +21 -6
  38. package/dist/room/stats.js +22 -1
  39. package/dist/room/stats.js.map +1 -1
  40. package/dist/room/track/LocalAudioTrack.d.ts +5 -1
  41. package/dist/room/track/LocalAudioTrack.js +45 -1
  42. package/dist/room/track/LocalAudioTrack.js.map +1 -1
  43. package/dist/room/track/LocalTrack.d.ts +3 -0
  44. package/dist/room/track/LocalTrack.js +5 -0
  45. package/dist/room/track/LocalTrack.js.map +1 -1
  46. package/dist/room/track/LocalVideoTrack.d.ts +7 -0
  47. package/dist/room/track/LocalVideoTrack.js +111 -47
  48. package/dist/room/track/LocalVideoTrack.js.map +1 -1
  49. package/dist/room/track/RemoteAudioTrack.d.ts +7 -0
  50. package/dist/room/track/RemoteAudioTrack.js +61 -0
  51. package/dist/room/track/RemoteAudioTrack.js.map +1 -1
  52. package/dist/room/track/RemoteTrackPublication.d.ts +1 -1
  53. package/dist/room/track/RemoteTrackPublication.js +8 -8
  54. package/dist/room/track/RemoteTrackPublication.js.map +1 -1
  55. package/dist/room/track/RemoteVideoTrack.d.ts +9 -3
  56. package/dist/room/track/RemoteVideoTrack.js +71 -6
  57. package/dist/room/track/RemoteVideoTrack.js.map +1 -1
  58. package/dist/room/track/Track.d.ts +9 -0
  59. package/dist/room/track/Track.js +28 -0
  60. package/dist/room/track/Track.js.map +1 -1
  61. package/dist/room/track/create.d.ts +23 -0
  62. package/dist/room/track/create.js +125 -0
  63. package/dist/room/track/create.js.map +1 -0
  64. package/dist/room/track/defaults.d.ts +4 -0
  65. package/dist/room/track/defaults.js +21 -0
  66. package/dist/room/track/defaults.js.map +1 -0
  67. package/dist/room/utils.d.ts +1 -1
  68. package/dist/room/utils.js +5 -6
  69. package/dist/room/utils.js.map +1 -1
  70. package/dist/version.d.ts +1 -1
  71. package/dist/version.js +1 -1
  72. package/example/index.html +14 -3
  73. package/example/sample.ts +52 -6
  74. 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,4 @@
1
+ import { AudioCaptureOptions, TrackPublishDefaults, VideoCaptureOptions } from './options';
2
+ export declare const publishDefaults: TrackPublishDefaults;
3
+ export declare const audioDefaults: AudioCaptureOptions;
4
+ export declare const videoDefaults: VideoCaptureOptions;
@@ -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"}
@@ -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 {
@@ -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.sleep = exports.useLegacyAPI = exports.unpackStreamId = void 0;
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);
@@ -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,SAAgB,YAAY;IAC1B,6CAA6C;IAC7C,OAAO,OAAO,SAAS,KAAK,WAAW,IAAI,SAAS,CAAC,OAAO,KAAK,aAAa,CAAC;AACjF,CAAC;AAHD,oCAGC;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,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"}
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.0";
1
+ export declare const version = "0.15.1";
2
2
  export declare const protocolVersion = 5;
package/dist/version.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.protocolVersion = exports.version = void 0;
4
- exports.version = '0.15.0';
4
+ exports.version = '0.15.1';
5
5
  exports.protocolVersion = 5;
6
6
  //# sourceMappingURL=version.js.map
@@ -72,11 +72,22 @@
72
72
  <input
73
73
  type="checkbox"
74
74
  class="form-check-input"
75
- id="adaptive-video"
75
+ id="dynacast"
76
76
  checked
77
77
  />
78
- <label for="adaptive-video" class="form-check-label">
79
- Adaptive video
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
- RemoteParticipant, Room, RoomConnectOptions, RoomEvent,
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 adaptiveVideo = (<HTMLInputElement>$('adaptive-video')).checked;
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
- autoManageVideo: adaptiveVideo,
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 id="size-${participant.sid}" class="size">
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.0",
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../protocol ../protocol/livekit_rtc.proto ../protocol/livekit_models.proto",
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",