livekit-client 0.14.1 → 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 (104) hide show
  1. package/.github/workflows/{lint.yaml → test.yaml} +7 -4
  2. package/.gitmodules +3 -0
  3. package/README.md +46 -14
  4. package/dist/api/SignalClient.d.ts +7 -32
  5. package/dist/api/SignalClient.js +37 -8
  6. package/dist/api/SignalClient.js.map +1 -1
  7. package/dist/connect.d.ts +1 -1
  8. package/dist/connect.js +73 -59
  9. package/dist/connect.js.map +1 -1
  10. package/dist/index.d.ts +3 -3
  11. package/dist/index.js +4 -3
  12. package/dist/index.js.map +1 -1
  13. package/dist/logger.d.ts +10 -0
  14. package/dist/logger.js +15 -0
  15. package/dist/logger.js.map +1 -1
  16. package/dist/options.d.ts +83 -19
  17. package/dist/options.js +0 -10
  18. package/dist/options.js.map +1 -1
  19. package/dist/proto/livekit_models.d.ts +27 -1
  20. package/dist/proto/livekit_models.js +188 -3
  21. package/dist/proto/livekit_models.js.map +1 -1
  22. package/dist/proto/livekit_rtc.d.ts +114 -7
  23. package/dist/proto/livekit_rtc.js +783 -30
  24. package/dist/proto/livekit_rtc.js.map +1 -1
  25. package/dist/room/RTCEngine.d.ts +4 -2
  26. package/dist/room/RTCEngine.js +31 -35
  27. package/dist/room/RTCEngine.js.map +1 -1
  28. package/dist/room/Room.d.ts +16 -17
  29. package/dist/room/Room.js +125 -77
  30. package/dist/room/Room.js.map +1 -1
  31. package/dist/room/events.d.ts +115 -6
  32. package/dist/room/events.js +114 -5
  33. package/dist/room/events.js.map +1 -1
  34. package/dist/room/participant/LocalParticipant.d.ts +29 -9
  35. package/dist/room/participant/LocalParticipant.js +220 -160
  36. package/dist/room/participant/LocalParticipant.js.map +1 -1
  37. package/dist/room/participant/Participant.js +2 -1
  38. package/dist/room/participant/Participant.js.map +1 -1
  39. package/dist/room/participant/RemoteParticipant.d.ts +1 -1
  40. package/dist/room/participant/RemoteParticipant.js +8 -5
  41. package/dist/room/participant/RemoteParticipant.js.map +1 -1
  42. package/dist/room/participant/publishUtils.d.ts +11 -0
  43. package/dist/room/participant/publishUtils.js +148 -0
  44. package/dist/room/participant/publishUtils.js.map +1 -0
  45. package/dist/room/participant/publishUtils.test.d.ts +1 -0
  46. package/dist/room/participant/publishUtils.test.js +79 -0
  47. package/dist/room/participant/publishUtils.test.js.map +1 -0
  48. package/dist/room/stats.d.ts +21 -6
  49. package/dist/room/stats.js +22 -1
  50. package/dist/room/stats.js.map +1 -1
  51. package/dist/room/track/LocalAudioTrack.d.ts +8 -3
  52. package/dist/room/track/LocalAudioTrack.js +49 -3
  53. package/dist/room/track/LocalAudioTrack.js.map +1 -1
  54. package/dist/room/track/LocalTrack.d.ts +4 -3
  55. package/dist/room/track/LocalTrack.js +6 -48
  56. package/dist/room/track/LocalTrack.js.map +1 -1
  57. package/dist/room/track/LocalVideoTrack.d.ts +13 -4
  58. package/dist/room/track/LocalVideoTrack.js +150 -57
  59. package/dist/room/track/LocalVideoTrack.js.map +1 -1
  60. package/dist/room/track/LocalVideoTrack.test.d.ts +1 -0
  61. package/dist/room/track/LocalVideoTrack.test.js +68 -0
  62. package/dist/room/track/LocalVideoTrack.test.js.map +1 -0
  63. package/dist/room/track/RemoteAudioTrack.d.ts +7 -0
  64. package/dist/room/track/RemoteAudioTrack.js +61 -0
  65. package/dist/room/track/RemoteAudioTrack.js.map +1 -1
  66. package/dist/room/track/RemoteTrackPublication.d.ts +2 -3
  67. package/dist/room/track/RemoteTrackPublication.js +11 -10
  68. package/dist/room/track/RemoteTrackPublication.js.map +1 -1
  69. package/dist/room/track/RemoteVideoTrack.d.ts +10 -6
  70. package/dist/room/track/RemoteVideoTrack.js +97 -44
  71. package/dist/room/track/RemoteVideoTrack.js.map +1 -1
  72. package/dist/room/track/Track.d.ts +10 -2
  73. package/dist/room/track/Track.js +29 -2
  74. package/dist/room/track/Track.js.map +1 -1
  75. package/dist/room/track/create.d.ts +4 -6
  76. package/dist/room/track/create.js +10 -57
  77. package/dist/room/track/create.js.map +1 -1
  78. package/dist/room/track/defaults.d.ts +4 -0
  79. package/dist/room/track/defaults.js +21 -0
  80. package/dist/room/track/defaults.js.map +1 -0
  81. package/dist/room/track/options.d.ts +15 -65
  82. package/dist/room/track/options.js +14 -13
  83. package/dist/room/track/options.js.map +1 -1
  84. package/dist/room/track/utils.d.ts +3 -0
  85. package/dist/room/track/utils.js +68 -0
  86. package/dist/room/track/utils.js.map +1 -0
  87. package/dist/room/track/utils.test.d.ts +1 -0
  88. package/dist/room/track/utils.test.js +85 -0
  89. package/dist/room/track/utils.test.js.map +1 -0
  90. package/dist/room/utils.d.ts +7 -1
  91. package/dist/room/utils.js +29 -6
  92. package/dist/room/utils.js.map +1 -1
  93. package/dist/version.d.ts +1 -1
  94. package/dist/version.js +1 -1
  95. package/example/index.html +194 -178
  96. package/example/sample.ts +454 -325
  97. package/example/styles.css +144 -0
  98. package/example/webpack.config.js +1 -1
  99. package/jest.config.js +6 -0
  100. package/package.json +10 -7
  101. package/tsconfig.eslint.json +8 -1
  102. package/dist/room/defaults.d.ts +0 -5
  103. package/dist/room/defaults.js +0 -32
  104. package/dist/room/defaults.js.map +0 -1
@@ -48,7 +48,7 @@ class RemoteParticipant extends Participant_1.default {
48
48
  }
49
49
  }
50
50
  /** @internal */
51
- addSubscribedMediaTrack(mediaTrack, sid, receiver, autoManageVideo, triesLeft) {
51
+ addSubscribedMediaTrack(mediaTrack, sid, receiver, adaptiveStream, triesLeft) {
52
52
  // find the track publication
53
53
  // it's possible for the media track to arrive before participant info
54
54
  let publication = this.getTrackPublication(sid);
@@ -75,32 +75,34 @@ class RemoteParticipant extends Participant_1.default {
75
75
  if (triesLeft === undefined)
76
76
  triesLeft = 20;
77
77
  setTimeout(() => {
78
- this.addSubscribedMediaTrack(mediaTrack, sid, receiver, autoManageVideo, triesLeft - 1);
78
+ this.addSubscribedMediaTrack(mediaTrack, sid, receiver, adaptiveStream, triesLeft - 1);
79
79
  }, 150);
80
80
  return;
81
81
  }
82
82
  const isVideo = mediaTrack.kind === 'video';
83
83
  let track;
84
84
  if (isVideo) {
85
- track = new RemoteVideoTrack_1.default(mediaTrack, sid, receiver, autoManageVideo);
85
+ track = new RemoteVideoTrack_1.default(mediaTrack, sid, receiver, adaptiveStream);
86
86
  }
87
87
  else {
88
88
  track = new RemoteAudioTrack_1.default(mediaTrack, sid, receiver);
89
89
  }
90
90
  track.start();
91
91
  publication.setTrack(track);
92
- // set track name etc
93
- track.name = publication.trackName;
92
+ // set track info
94
93
  track.sid = publication.trackSid;
95
94
  track.source = publication.source;
96
95
  // keep publication's muted status
97
96
  track.isMuted = publication.isMuted;
97
+ track.receiver = receiver;
98
+ track.startMonitor();
98
99
  // when media track is ended, fire the event
99
100
  mediaTrack.onended = () => {
100
101
  if (publication) {
101
102
  publication.track = undefined;
102
103
  }
103
104
  this.emit(events_1.ParticipantEvent.TrackUnsubscribed, track, publication);
105
+ this.removeAllListeners(events_1.ParticipantEvent.TrackUnsubscribed);
104
106
  };
105
107
  this.emit(events_1.ParticipantEvent.TrackSubscribed, track, publication);
106
108
  return publication;
@@ -180,6 +182,7 @@ class RemoteParticipant extends Participant_1.default {
180
182
  // always send unsubscribed, since apps may rely on this
181
183
  if (isSubscribed) {
182
184
  this.emit(events_1.ParticipantEvent.TrackUnsubscribed, track, publication);
185
+ this.removeAllListeners(events_1.ParticipantEvent.TrackUnsubscribed);
183
186
  }
184
187
  }
185
188
  if (sendUnpublish) {
@@ -1 +1 @@
1
- {"version":3,"file":"RemoteParticipant.js","sourceRoot":"","sources":["../../../src/room/participant/RemoteParticipant.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RemoteParticipant.js","sourceRoot":"","sources":["../../../src/room/participant/RemoteParticipant.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import LocalAudioTrack from '../track/LocalAudioTrack';
2
+ import LocalVideoTrack from '../track/LocalVideoTrack';
3
+ import { TrackPublishOptions, VideoEncoding, VideoPreset } from '../track/options';
4
+ /** @internal */
5
+ export declare function mediaTrackToLocalTrack(mediaStreamTrack: MediaStreamTrack, constraints?: MediaTrackConstraints): LocalVideoTrack | LocalAudioTrack;
6
+ export declare const presets169: VideoPreset[];
7
+ export declare const presets43: VideoPreset[];
8
+ export declare const presetsScreenShare: VideoPreset[];
9
+ export declare function computeVideoEncodings(isScreenShare: boolean, width?: number, height?: number, options?: TrackPublishOptions): RTCRtpEncodingParameters[];
10
+ export declare function determineAppropriateEncoding(isScreenShare: boolean, width: number, height: number): VideoEncoding;
11
+ export declare function presetsForResolution(isScreenShare: boolean, width: number, height: number): VideoPreset[];
@@ -0,0 +1,148 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.presetsForResolution = exports.determineAppropriateEncoding = exports.computeVideoEncodings = exports.presetsScreenShare = exports.presets43 = exports.presets169 = exports.mediaTrackToLocalTrack = void 0;
7
+ const logger_1 = __importDefault(require("../../logger"));
8
+ const errors_1 = require("../errors");
9
+ const LocalAudioTrack_1 = __importDefault(require("../track/LocalAudioTrack"));
10
+ const LocalVideoTrack_1 = __importDefault(require("../track/LocalVideoTrack"));
11
+ const options_1 = require("../track/options");
12
+ /** @internal */
13
+ function mediaTrackToLocalTrack(mediaStreamTrack, constraints) {
14
+ switch (mediaStreamTrack.kind) {
15
+ case 'audio':
16
+ return new LocalAudioTrack_1.default(mediaStreamTrack, constraints);
17
+ case 'video':
18
+ return new LocalVideoTrack_1.default(mediaStreamTrack, constraints);
19
+ default:
20
+ throw new errors_1.TrackInvalidError(`unsupported track type: ${mediaStreamTrack.kind}`);
21
+ }
22
+ }
23
+ exports.mediaTrackToLocalTrack = mediaTrackToLocalTrack;
24
+ /* @internal */
25
+ exports.presets169 = [
26
+ options_1.VideoPresets.qvga,
27
+ options_1.VideoPresets.vga,
28
+ options_1.VideoPresets.qhd,
29
+ options_1.VideoPresets.hd,
30
+ options_1.VideoPresets.fhd,
31
+ ];
32
+ /* @internal */
33
+ exports.presets43 = [
34
+ options_1.VideoPresets43.qvga,
35
+ options_1.VideoPresets43.vga,
36
+ options_1.VideoPresets43.qhd,
37
+ options_1.VideoPresets43.hd,
38
+ options_1.VideoPresets43.fhd,
39
+ ];
40
+ /* @internal */
41
+ exports.presetsScreenShare = [
42
+ options_1.ScreenSharePresets.vga,
43
+ options_1.ScreenSharePresets.hd_8,
44
+ options_1.ScreenSharePresets.hd_15,
45
+ options_1.ScreenSharePresets.fhd_15,
46
+ options_1.ScreenSharePresets.fhd_30,
47
+ ];
48
+ const videoRids = ['q', 'h', 'f'];
49
+ /* @internal */
50
+ function computeVideoEncodings(isScreenShare, width, height, options) {
51
+ let videoEncoding = options === null || options === void 0 ? void 0 : options.videoEncoding;
52
+ if (isScreenShare) {
53
+ videoEncoding = options === null || options === void 0 ? void 0 : options.screenShareEncoding;
54
+ }
55
+ const useSimulcast = !isScreenShare && (options === null || options === void 0 ? void 0 : options.simulcast);
56
+ if ((!videoEncoding && !useSimulcast) || !width || !height) {
57
+ // when we aren't simulcasting, will need to return a single encoding without
58
+ // capping bandwidth. we always require a encoding for dynacast
59
+ return [{}];
60
+ }
61
+ if (!videoEncoding) {
62
+ // find the right encoding based on width/height
63
+ videoEncoding = determineAppropriateEncoding(isScreenShare, width, height);
64
+ logger_1.default.debug('using video encoding', videoEncoding);
65
+ }
66
+ if (!useSimulcast) {
67
+ return [videoEncoding];
68
+ }
69
+ const presets = presetsForResolution(isScreenShare, width, height);
70
+ let midPreset;
71
+ const lowPreset = presets[0];
72
+ if (presets.length > 1) {
73
+ [, midPreset] = presets;
74
+ }
75
+ const original = new options_1.VideoPreset(width, height, videoEncoding.maxBitrate, videoEncoding.maxFramerate);
76
+ // NOTE:
77
+ // 1. Ordering of these encodings is important. Chrome seems
78
+ // to use the index into encodings to decide which layer
79
+ // to disable when CPU constrained.
80
+ // So encodings should be ordered in increasing spatial
81
+ // resolution order.
82
+ // 2. ion-sfu translates rids into layers. So, all encodings
83
+ // should have the base layer `q` and then more added
84
+ // based on other conditions.
85
+ const size = Math.max(width, height);
86
+ if (size >= 960 && midPreset) {
87
+ return encodingsFromPresets(width, height, [
88
+ lowPreset, midPreset, original,
89
+ ]);
90
+ }
91
+ if (size >= 500) {
92
+ return encodingsFromPresets(width, height, [
93
+ lowPreset, original,
94
+ ]);
95
+ }
96
+ return encodingsFromPresets(width, height, [
97
+ original,
98
+ ]);
99
+ }
100
+ exports.computeVideoEncodings = computeVideoEncodings;
101
+ /* @internal */
102
+ function determineAppropriateEncoding(isScreenShare, width, height) {
103
+ const presets = presetsForResolution(isScreenShare, width, height);
104
+ let { encoding } = presets[0];
105
+ // handle portrait by swapping dimensions
106
+ const size = Math.max(width, height);
107
+ for (let i = 0; i < presets.length; i += 1) {
108
+ const preset = presets[i];
109
+ encoding = preset.encoding;
110
+ if (preset.width >= size) {
111
+ break;
112
+ }
113
+ }
114
+ return encoding;
115
+ }
116
+ exports.determineAppropriateEncoding = determineAppropriateEncoding;
117
+ /* @internal */
118
+ function presetsForResolution(isScreenShare, width, height) {
119
+ if (isScreenShare) {
120
+ return exports.presetsScreenShare;
121
+ }
122
+ const aspect = width > height ? width / height : height / width;
123
+ if (Math.abs(aspect - 16.0 / 9) < Math.abs(aspect - 4.0 / 3)) {
124
+ return exports.presets169;
125
+ }
126
+ return exports.presets43;
127
+ }
128
+ exports.presetsForResolution = presetsForResolution;
129
+ // presets should be ordered by low, medium, high
130
+ function encodingsFromPresets(width, height, presets) {
131
+ const encodings = [];
132
+ presets.forEach((preset, idx) => {
133
+ if (idx >= videoRids.length) {
134
+ return;
135
+ }
136
+ const size = Math.min(width, height);
137
+ const rid = videoRids[idx];
138
+ encodings.push({
139
+ rid,
140
+ scaleResolutionDownBy: size / preset.height,
141
+ maxBitrate: preset.encoding.maxBitrate,
142
+ /* @ts-ignore */
143
+ maxFramerate: preset.encoding.maxFramerate,
144
+ });
145
+ });
146
+ return encodings;
147
+ }
148
+ //# sourceMappingURL=publishUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishUtils.js","sourceRoot":"","sources":["../../../src/room/participant/publishUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const options_1 = require("../track/options");
4
+ const publishUtils_1 = require("./publishUtils");
5
+ describe('presetsForResolution', () => {
6
+ it('handles screenshare', () => {
7
+ expect(publishUtils_1.presetsForResolution(true, 600, 300)).toEqual(publishUtils_1.presetsScreenShare);
8
+ });
9
+ it('handles landscape', () => {
10
+ expect(publishUtils_1.presetsForResolution(false, 600, 300)).toEqual(publishUtils_1.presets169);
11
+ expect(publishUtils_1.presetsForResolution(false, 500, 500)).toEqual(publishUtils_1.presets43);
12
+ });
13
+ it('handles portrait', () => {
14
+ expect(publishUtils_1.presetsForResolution(false, 300, 600)).toEqual(publishUtils_1.presets169);
15
+ expect(publishUtils_1.presetsForResolution(false, 500, 500)).toEqual(publishUtils_1.presets43);
16
+ });
17
+ });
18
+ describe('determineAppropriateEncoding', () => {
19
+ it('uses higher encoding', () => {
20
+ expect(publishUtils_1.determineAppropriateEncoding(false, 600, 300))
21
+ .toEqual(options_1.VideoPresets.vga.encoding);
22
+ });
23
+ it('handles portrait', () => {
24
+ expect(publishUtils_1.determineAppropriateEncoding(false, 300, 600))
25
+ .toEqual(options_1.VideoPresets.vga.encoding);
26
+ });
27
+ });
28
+ describe('computeVideoEncodings', () => {
29
+ it('handles non-simulcast', () => {
30
+ const encodings = publishUtils_1.computeVideoEncodings(false, 640, 480, {
31
+ simulcast: false,
32
+ });
33
+ expect(encodings).toEqual([{}]);
34
+ });
35
+ it('respects client defined bitrate', () => {
36
+ const encodings = publishUtils_1.computeVideoEncodings(false, 640, 480, {
37
+ simulcast: false,
38
+ videoEncoding: {
39
+ maxBitrate: 1024,
40
+ },
41
+ });
42
+ expect(encodings).toHaveLength(1);
43
+ expect(encodings[0].maxBitrate).toBe(1024);
44
+ });
45
+ it('returns three encodings for high-res simulcast', () => {
46
+ const encodings = publishUtils_1.computeVideoEncodings(false, 960, 540, {
47
+ simulcast: true,
48
+ });
49
+ expect(encodings).toHaveLength(3);
50
+ // ensure they are what we expect
51
+ expect(encodings[0].rid).toBe('q');
52
+ expect(encodings[0].maxBitrate).toBe(options_1.VideoPresets.qvga.encoding.maxBitrate);
53
+ expect(encodings[0].scaleResolutionDownBy).toBe(3);
54
+ expect(encodings[1].rid).toBe('h');
55
+ expect(encodings[1].scaleResolutionDownBy).toBe(1.5);
56
+ expect(encodings[2].rid).toBe('f');
57
+ });
58
+ it('handles portrait simulcast', () => {
59
+ const encodings = publishUtils_1.computeVideoEncodings(false, 540, 960, {
60
+ simulcast: true,
61
+ });
62
+ expect(encodings).toHaveLength(3);
63
+ expect(encodings[0].scaleResolutionDownBy).toBe(3);
64
+ expect(encodings[1].scaleResolutionDownBy).toBe(1.5);
65
+ expect(encodings[2].maxBitrate).toBe(options_1.VideoPresets.qhd.encoding.maxBitrate);
66
+ });
67
+ it('returns two encodings for lower-res simulcast', () => {
68
+ const encodings = publishUtils_1.computeVideoEncodings(false, 640, 360, {
69
+ simulcast: true,
70
+ });
71
+ expect(encodings).toHaveLength(2);
72
+ // ensure they are what we expect
73
+ expect(encodings[0].rid).toBe('q');
74
+ expect(encodings[0].maxBitrate).toBe(options_1.VideoPresets.qvga.encoding.maxBitrate);
75
+ expect(encodings[1].rid).toBe('h');
76
+ expect(encodings[1].maxBitrate).toBe(options_1.VideoPresets.vga.encoding.maxBitrate);
77
+ });
78
+ });
79
+ //# sourceMappingURL=publishUtils.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publishUtils.test.js","sourceRoot":"","sources":["../../../src/room/participant/publishUtils.test.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,8 @@ export declare const monitorFrequency = 2000;
2
2
  interface SenderStats {
3
3
  /** number of packets sent */
4
4
  packetsSent?: number;
5
+ /** number of bytes sent */
6
+ bytesSent?: number;
5
7
  /** jitter as perceived by remote */
6
8
  jitter?: number;
7
9
  /** packets reported lost by remote */
@@ -10,6 +12,7 @@ interface SenderStats {
10
12
  roundTripTime?: number;
11
13
  /** ID of the outbound stream */
12
14
  streamId?: string;
15
+ timestamp: number;
13
16
  }
14
17
  export interface AudioSenderStats extends SenderStats {
15
18
  type: 'audio';
@@ -26,7 +29,6 @@ export interface VideoSenderStats extends SenderStats {
26
29
  qualityLimitationReason: string;
27
30
  qualityLimitationResolutionChanges: number;
28
31
  retransmittedPacketsSent: number;
29
- timestamp: number;
30
32
  }
31
33
  interface ReceiverStats {
32
34
  jitterBufferDelay?: number;
@@ -34,17 +36,30 @@ interface ReceiverStats {
34
36
  packetsLost?: number;
35
37
  /** number of packets sent */
36
38
  packetsReceived?: number;
39
+ bytesReceived?: number;
37
40
  streamId?: string;
41
+ jitter?: number;
42
+ timestamp: number;
43
+ }
44
+ export interface AudioReceiverStats extends ReceiverStats {
45
+ type: 'audio';
46
+ concealedSamples?: number;
47
+ concealmentEvents?: number;
48
+ silentConcealedSamples?: number;
49
+ silentConcealmentEvents?: number;
50
+ totalAudioEnergy?: number;
51
+ totalSamplesDuration?: number;
38
52
  }
39
53
  export interface VideoReceiverStats extends ReceiverStats {
40
54
  type: 'video';
41
55
  framesDecoded: number;
42
56
  framesDropped: number;
43
57
  framesReceived: number;
44
- frameWidth: number;
45
- frameHeight: number;
46
- firCount: number;
47
- pliCount: number;
48
- nackCount: number;
58
+ frameWidth?: number;
59
+ frameHeight?: number;
60
+ firCount?: number;
61
+ pliCount?: number;
62
+ nackCount?: number;
49
63
  }
64
+ export declare function computeBitrate<T extends ReceiverStats | SenderStats>(currentStats: T, prevStats?: T): number;
50
65
  export {};
@@ -1,5 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.monitorFrequency = void 0;
3
+ exports.computeBitrate = exports.monitorFrequency = void 0;
4
4
  exports.monitorFrequency = 2000;
5
+ function computeBitrate(currentStats, prevStats) {
6
+ if (!prevStats) {
7
+ return 0;
8
+ }
9
+ let bytesNow;
10
+ let bytesPrev;
11
+ if ('bytesReceived' in currentStats) {
12
+ bytesNow = currentStats.bytesReceived;
13
+ bytesPrev = prevStats.bytesReceived;
14
+ }
15
+ else if ('bytesSent' in currentStats) {
16
+ bytesNow = currentStats.bytesSent;
17
+ bytesPrev = prevStats.bytesSent;
18
+ }
19
+ if (bytesNow === undefined || bytesPrev === undefined
20
+ || currentStats.timestamp === undefined || prevStats.timestamp === undefined) {
21
+ return 0;
22
+ }
23
+ return ((bytesNow - bytesPrev) * 8 * 1000) / (currentStats.timestamp - prevStats.timestamp);
24
+ }
25
+ exports.computeBitrate = computeBitrate;
5
26
  //# sourceMappingURL=stats.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/room/stats.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG,IAAI,CAAC"}
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/room/stats.ts"],"names":[],"mappings":";;;AAAa,QAAA,gBAAgB,GAAG,IAAI,CAAC;AA4GrC,SAAgB,cAAc,CAC5B,YAAe,EACf,SAAa;IAEb,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,CAAC,CAAC;KACV;IACD,IAAI,QAA4B,CAAC;IACjC,IAAI,SAA6B,CAAC;IAClC,IAAI,eAAe,IAAI,YAAY,EAAE;QACnC,QAAQ,GAAI,YAA8B,CAAC,aAAa,CAAC;QACzD,SAAS,GAAI,SAA2B,CAAC,aAAa,CAAC;KACxD;SAAM,IAAI,WAAW,IAAI,YAAY,EAAE;QACtC,QAAQ,GAAI,YAA4B,CAAC,SAAS,CAAC;QACnD,SAAS,GAAI,SAAyB,CAAC,SAAS,CAAC;KAClD;IACD,IAAI,QAAQ,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS;WAChD,YAAY,CAAC,SAAS,KAAK,SAAS,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,EAAE;QAC9E,OAAO,CAAC,CAAC;KACV;IACD,OAAO,CAAC,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;AAC9F,CAAC;AArBD,wCAqBC"}
@@ -1,12 +1,17 @@
1
+ import { AudioSenderStats } from '../stats';
1
2
  import LocalTrack from './LocalTrack';
2
- import { CreateAudioTrackOptions } from './options';
3
+ import { AudioCaptureOptions } from './options';
3
4
  export default class LocalAudioTrack extends LocalTrack {
4
5
  sender?: RTCRtpSender;
5
6
  /** @internal */
6
7
  stopOnMute: boolean;
7
- constructor(mediaTrack: MediaStreamTrack, name?: string, constraints?: MediaTrackConstraints);
8
+ private prevStats?;
9
+ constructor(mediaTrack: MediaStreamTrack, constraints?: MediaTrackConstraints);
8
10
  setDeviceId(deviceId: string): Promise<void>;
9
11
  mute(): Promise<LocalAudioTrack>;
10
12
  unmute(): Promise<LocalAudioTrack>;
11
- restartTrack(options?: CreateAudioTrackOptions): Promise<void>;
13
+ restartTrack(options?: AudioCaptureOptions): Promise<void>;
14
+ startMonitor(): void;
15
+ private monitorSender;
16
+ getSenderStats(): Promise<AudioSenderStats | undefined>;
12
17
  }
@@ -13,13 +13,29 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  const logger_1 = __importDefault(require("../../logger"));
16
+ const stats_1 = require("../stats");
16
17
  const LocalTrack_1 = __importDefault(require("./LocalTrack"));
17
18
  const Track_1 = require("./Track");
19
+ const utils_1 = require("./utils");
18
20
  class LocalAudioTrack extends LocalTrack_1.default {
19
- constructor(mediaTrack, name, constraints) {
20
- super(mediaTrack, Track_1.Track.Kind.Audio, name, constraints);
21
+ constructor(mediaTrack, constraints) {
22
+ super(mediaTrack, Track_1.Track.Kind.Audio, constraints);
21
23
  /** @internal */
22
24
  this.stopOnMute = false;
25
+ this.monitorSender = () => __awaiter(this, void 0, void 0, function* () {
26
+ if (!this.sender) {
27
+ this._currentBitrate = 0;
28
+ return;
29
+ }
30
+ const stats = yield this.getSenderStats();
31
+ if (stats && this.prevStats) {
32
+ this._currentBitrate = stats_1.computeBitrate(stats, this.prevStats);
33
+ }
34
+ this.prevStats = stats;
35
+ setTimeout(() => {
36
+ this.monitorSender();
37
+ }, stats_1.monitorFrequency);
38
+ });
23
39
  }
24
40
  setDeviceId(deviceId) {
25
41
  return __awaiter(this, void 0, void 0, function* () {
@@ -64,7 +80,7 @@ class LocalAudioTrack extends LocalTrack_1.default {
64
80
  return __awaiter(this, void 0, void 0, function* () {
65
81
  let constraints;
66
82
  if (options) {
67
- const streamConstraints = LocalTrack_1.default.constraintsForOptions({ audio: options });
83
+ const streamConstraints = utils_1.constraintsForOptions({ audio: options });
68
84
  if (typeof streamConstraints.audio !== 'boolean') {
69
85
  constraints = streamConstraints.audio;
70
86
  }
@@ -72,6 +88,36 @@ class LocalAudioTrack extends LocalTrack_1.default {
72
88
  yield this.restart(constraints);
73
89
  });
74
90
  }
91
+ /* @internal */
92
+ startMonitor() {
93
+ setTimeout(() => {
94
+ this.monitorSender();
95
+ }, stats_1.monitorFrequency);
96
+ }
97
+ getSenderStats() {
98
+ return __awaiter(this, void 0, void 0, function* () {
99
+ if (!this.sender) {
100
+ return undefined;
101
+ }
102
+ const stats = yield this.sender.getStats();
103
+ let audioStats;
104
+ stats.forEach((v) => {
105
+ if (v.type === 'outbound-rtp') {
106
+ audioStats = {
107
+ type: 'audio',
108
+ streamId: v.id,
109
+ packetsSent: v.packetsSent,
110
+ packetsLost: v.packetsLost,
111
+ bytesSent: v.bytesSent,
112
+ timestamp: v.timestamp,
113
+ roundTripTime: v.roundTripTime,
114
+ jitter: v.jitter,
115
+ };
116
+ }
117
+ });
118
+ return audioStats;
119
+ });
120
+ }
75
121
  }
76
122
  exports.default = LocalAudioTrack;
77
123
  //# sourceMappingURL=LocalAudioTrack.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LocalAudioTrack.js","sourceRoot":"","sources":["../../../src/room/track/LocalAudioTrack.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,0DAA+B;AAC/B,8DAAsC;AAEtC,mCAAgC;AAEhC,MAAqB,eAAgB,SAAQ,oBAAU;IAMrD,YACE,UAA4B,EAC5B,IAAa,EACb,WAAmC;QAEnC,KAAK,CAAC,UAAU,EAAE,aAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC;QARzD,gBAAgB;QAChB,eAAU,GAAY,KAAK,CAAC;IAQ5B,CAAC;IAEK,WAAW,CAAC,QAAgB;;YAChC,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,KAAK,QAAQ,EAAE;gBAC1C,OAAO;aACR;YACD,IAAI,CAAC,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC;YACrC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;gBACjB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;aAC3B;QACH,CAAC;KAAA;IAEK,IAAI;;;;;YACR,uFAAuF;YACvF,IAAI,IAAI,CAAC,MAAM,KAAK,aAAK,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE;gBAC9D,gBAAG,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBAChC,kEAAkE;gBAClE,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;aAC9B;YACD,MAAM,OAAM,IAAI,WAAE,CAAC;YACnB,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;IAEK,MAAM;;;;;YACV,IAAI,IAAI,CAAC,MAAM,KAAK,aAAK,CAAC,MAAM,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE;gBAC9D,gBAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;gBACnC,MAAM,IAAI,CAAC,YAAY,EAAE,CAAC;aAC3B;YACD,MAAM,OAAM,MAAM,WAAE,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;KAAA;IAEK,YAAY,CAAC,OAAiC;;YAClD,IAAI,WAA8C,CAAC;YACnD,IAAI,OAAO,EAAE;gBACX,MAAM,iBAAiB,GAAG,oBAAU,CAAC,qBAAqB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC/E,IAAI,OAAO,iBAAiB,CAAC,KAAK,KAAK,SAAS,EAAE;oBAChD,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC;iBACvC;aACF;YACD,MAAM,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAClC,CAAC;KAAA;CACF;AAtDD,kCAsDC"}
1
+ {"version":3,"file":"LocalAudioTrack.js","sourceRoot":"","sources":["../../../src/room/track/LocalAudioTrack.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,14 @@
1
- import { CreateLocalTracksOptions } from './options';
2
1
  import { Track } from './Track';
3
2
  export default class LocalTrack extends Track {
4
3
  /** @internal */
5
4
  sender?: RTCRtpSender;
6
5
  protected constraints: MediaTrackConstraints;
7
- protected constructor(mediaTrack: MediaStreamTrack, kind: Track.Kind, name?: string, constraints?: MediaTrackConstraints);
6
+ protected _currentBitrate: number;
7
+ protected constructor(mediaTrack: MediaStreamTrack, kind: Track.Kind, constraints?: MediaTrackConstraints);
8
8
  get id(): string;
9
9
  get dimensions(): Track.Dimensions | undefined;
10
- static constraintsForOptions(options: CreateLocalTracksOptions): MediaStreamConstraints;
10
+ /** current send bits per second */
11
+ get currentBitrate(): number;
11
12
  /**
12
13
  * @returns DeviceID of the device that is currently being used for this track
13
14
  */
@@ -13,14 +13,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  const logger_1 = __importDefault(require("../../logger"));
16
- const defaults_1 = require("../defaults");
17
16
  const DeviceManager_1 = __importDefault(require("../DeviceManager"));
18
17
  const errors_1 = require("../errors");
19
18
  const events_1 = require("../events");
20
19
  const Track_1 = require("./Track");
21
20
  class LocalTrack extends Track_1.Track {
22
- constructor(mediaTrack, kind, name, constraints) {
23
- super(mediaTrack, kind, name);
21
+ constructor(mediaTrack, kind, constraints) {
22
+ super(mediaTrack, kind);
23
+ this._currentBitrate = 0;
24
24
  this.handleEnded = () => {
25
25
  this.emit(events_1.TrackEvent.Ended);
26
26
  };
@@ -43,51 +43,9 @@ class LocalTrack extends Track_1.Track {
43
43
  }
44
44
  return undefined;
45
45
  }
46
- static constraintsForOptions(options) {
47
- const constraints = {};
48
- // default video options
49
- const defaults = defaults_1.getTrackCaptureDefaults();
50
- const videoOptions = {
51
- deviceId: defaults.videoDeviceId,
52
- };
53
- if (defaults.videoResolution) {
54
- videoOptions.width = defaults.videoResolution.width;
55
- videoOptions.height = defaults.videoResolution.height;
56
- videoOptions.frameRate = defaults.videoResolution.frameRate;
57
- }
58
- if (typeof options.video === 'object' && options.video) {
59
- Object.assign(videoOptions, options.video);
60
- if (options.video.resolution) {
61
- Object.assign(videoOptions, options.video.resolution);
62
- }
63
- }
64
- if (options.video === false) {
65
- constraints.video = false;
66
- }
67
- else {
68
- // use defaults
69
- constraints.video = videoOptions;
70
- }
71
- // default audio options
72
- const audioOptions = {
73
- deviceId: defaults.audioDeviceId,
74
- echoCancellation: defaults.echoCancellation,
75
- /* @ts-ignore */
76
- autoGainControl: defaults.autoGainControl,
77
- /* @ts-ignore */
78
- noiseSuppression: defaults.noiseSuppression,
79
- channelCount: defaults.channelCount,
80
- };
81
- if (typeof options.audio === 'object' && options.audio) {
82
- Object.assign(audioOptions, options.audio);
83
- }
84
- if (options.audio === false) {
85
- constraints.audio = false;
86
- }
87
- else {
88
- constraints.audio = audioOptions;
89
- }
90
- return constraints;
46
+ /** current send bits per second */
47
+ get currentBitrate() {
48
+ return this._currentBitrate;
91
49
  }
92
50
  /**
93
51
  * @returns DeviceID of the device that is currently being used for this track