livekit-client 0.17.5 → 0.17.6-rc1

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 (153) hide show
  1. package/CHANGELOG.md +1 -1
  2. package/README.md +26 -20
  3. package/dist/api/SignalClient.d.ts +1 -0
  4. package/dist/connect.d.ts +2 -0
  5. package/dist/index.d.ts +2 -2
  6. package/dist/livekit-client.esm.js +17344 -0
  7. package/dist/livekit-client.esm.js.map +1 -0
  8. package/dist/livekit-client.umd.js +17388 -0
  9. package/dist/livekit-client.umd.js.map +1 -0
  10. package/dist/logger.d.ts +22 -11
  11. package/dist/options.d.ts +4 -2
  12. package/dist/proto/google/protobuf/timestamp.d.ts +1 -1
  13. package/dist/proto/livekit_models.d.ts +4 -1
  14. package/dist/proto/livekit_rtc.d.ts +45 -2
  15. package/dist/room/DeviceManager.d.ts +1 -1
  16. package/dist/room/RTCEngine.d.ts +1 -1
  17. package/dist/room/Room.d.ts +2 -2
  18. package/dist/room/events.d.ts +1 -1
  19. package/dist/room/participant/LocalParticipant.d.ts +9 -5
  20. package/dist/room/participant/RemoteParticipant.d.ts +9 -0
  21. package/dist/room/track/RemoteAudioTrack.d.ts +11 -0
  22. package/dist/test/mocks.d.ts +11 -0
  23. package/package.json +40 -15
  24. package/.eslintrc.js +0 -17
  25. package/.gitmodules +0 -3
  26. package/dist/api/RequestQueue.js +0 -61
  27. package/dist/api/RequestQueue.js.map +0 -1
  28. package/dist/api/SignalClient.js +0 -428
  29. package/dist/api/SignalClient.js.map +0 -1
  30. package/dist/connect.js +0 -130
  31. package/dist/connect.js.map +0 -1
  32. package/dist/index.js +0 -71
  33. package/dist/index.js.map +0 -1
  34. package/dist/logger.js +0 -24
  35. package/dist/logger.js.map +0 -1
  36. package/dist/options.js +0 -3
  37. package/dist/options.js.map +0 -1
  38. package/dist/proto/google/protobuf/timestamp.js +0 -108
  39. package/dist/proto/google/protobuf/timestamp.js.map +0 -1
  40. package/dist/proto/livekit_models.js +0 -2262
  41. package/dist/proto/livekit_models.js.map +0 -1
  42. package/dist/proto/livekit_rtc.js +0 -2544
  43. package/dist/proto/livekit_rtc.js.map +0 -1
  44. package/dist/room/DeviceManager.js +0 -62
  45. package/dist/room/DeviceManager.js.map +0 -1
  46. package/dist/room/PCTransport.js +0 -91
  47. package/dist/room/PCTransport.js.map +0 -1
  48. package/dist/room/RTCEngine.js +0 -562
  49. package/dist/room/RTCEngine.js.map +0 -1
  50. package/dist/room/Room.js +0 -767
  51. package/dist/room/Room.js.map +0 -1
  52. package/dist/room/errors.js +0 -68
  53. package/dist/room/errors.js.map +0 -1
  54. package/dist/room/events.js +0 -385
  55. package/dist/room/events.js.map +0 -1
  56. package/dist/room/participant/LocalParticipant.js +0 -647
  57. package/dist/room/participant/LocalParticipant.js.map +0 -1
  58. package/dist/room/participant/Participant.js +0 -189
  59. package/dist/room/participant/Participant.js.map +0 -1
  60. package/dist/room/participant/ParticipantTrackPermission.js +0 -16
  61. package/dist/room/participant/ParticipantTrackPermission.js.map +0 -1
  62. package/dist/room/participant/RemoteParticipant.js +0 -194
  63. package/dist/room/participant/RemoteParticipant.js.map +0 -1
  64. package/dist/room/participant/publishUtils.js +0 -189
  65. package/dist/room/participant/publishUtils.js.map +0 -1
  66. package/dist/room/participant/publishUtils.test.d.ts +0 -1
  67. package/dist/room/participant/publishUtils.test.js +0 -118
  68. package/dist/room/participant/publishUtils.test.js.map +0 -1
  69. package/dist/room/stats.js +0 -26
  70. package/dist/room/stats.js.map +0 -1
  71. package/dist/room/track/LocalAudioTrack.js +0 -153
  72. package/dist/room/track/LocalAudioTrack.js.map +0 -1
  73. package/dist/room/track/LocalTrack.js +0 -158
  74. package/dist/room/track/LocalTrack.js.map +0 -1
  75. package/dist/room/track/LocalTrackPublication.js +0 -64
  76. package/dist/room/track/LocalTrackPublication.js.map +0 -1
  77. package/dist/room/track/LocalVideoTrack.js +0 -297
  78. package/dist/room/track/LocalVideoTrack.js.map +0 -1
  79. package/dist/room/track/LocalVideoTrack.test.d.ts +0 -1
  80. package/dist/room/track/LocalVideoTrack.test.js +0 -68
  81. package/dist/room/track/LocalVideoTrack.test.js.map +0 -1
  82. package/dist/room/track/RemoteAudioTrack.js +0 -64
  83. package/dist/room/track/RemoteAudioTrack.js.map +0 -1
  84. package/dist/room/track/RemoteTrack.js +0 -49
  85. package/dist/room/track/RemoteTrack.js.map +0 -1
  86. package/dist/room/track/RemoteTrackPublication.js +0 -178
  87. package/dist/room/track/RemoteTrackPublication.js.map +0 -1
  88. package/dist/room/track/RemoteVideoTrack.js +0 -201
  89. package/dist/room/track/RemoteVideoTrack.js.map +0 -1
  90. package/dist/room/track/Track.js +0 -283
  91. package/dist/room/track/Track.js.map +0 -1
  92. package/dist/room/track/TrackPublication.js +0 -92
  93. package/dist/room/track/TrackPublication.js.map +0 -1
  94. package/dist/room/track/create.js +0 -131
  95. package/dist/room/track/create.js.map +0 -1
  96. package/dist/room/track/defaults.js +0 -21
  97. package/dist/room/track/defaults.js.map +0 -1
  98. package/dist/room/track/options.js +0 -100
  99. package/dist/room/track/options.js.map +0 -1
  100. package/dist/room/track/types.js +0 -3
  101. package/dist/room/track/types.js.map +0 -1
  102. package/dist/room/track/utils.js +0 -113
  103. package/dist/room/track/utils.js.map +0 -1
  104. package/dist/room/track/utils.test.d.ts +0 -1
  105. package/dist/room/track/utils.test.js +0 -85
  106. package/dist/room/track/utils.test.js.map +0 -1
  107. package/dist/room/utils.js +0 -79
  108. package/dist/room/utils.js.map +0 -1
  109. package/dist/version.js +0 -6
  110. package/dist/version.js.map +0 -1
  111. package/jest.config.js +0 -6
  112. package/src/api/RequestQueue.ts +0 -53
  113. package/src/api/SignalClient.ts +0 -499
  114. package/src/connect.ts +0 -100
  115. package/src/index.ts +0 -47
  116. package/src/logger.ts +0 -22
  117. package/src/options.ts +0 -149
  118. package/src/proto/google/protobuf/timestamp.ts +0 -232
  119. package/src/proto/livekit_models.ts +0 -2676
  120. package/src/proto/livekit_rtc.ts +0 -3269
  121. package/src/room/DeviceManager.ts +0 -57
  122. package/src/room/PCTransport.ts +0 -86
  123. package/src/room/RTCEngine.ts +0 -652
  124. package/src/room/Room.ts +0 -951
  125. package/src/room/errors.ts +0 -65
  126. package/src/room/events.ts +0 -424
  127. package/src/room/participant/LocalParticipant.ts +0 -734
  128. package/src/room/participant/Participant.ts +0 -269
  129. package/src/room/participant/ParticipantTrackPermission.ts +0 -32
  130. package/src/room/participant/RemoteParticipant.ts +0 -243
  131. package/src/room/participant/publishUtils.test.ts +0 -145
  132. package/src/room/participant/publishUtils.ts +0 -225
  133. package/src/room/stats.ts +0 -130
  134. package/src/room/track/LocalAudioTrack.ts +0 -137
  135. package/src/room/track/LocalTrack.ts +0 -161
  136. package/src/room/track/LocalTrackPublication.ts +0 -66
  137. package/src/room/track/LocalVideoTrack.test.ts +0 -70
  138. package/src/room/track/LocalVideoTrack.ts +0 -293
  139. package/src/room/track/RemoteAudioTrack.ts +0 -58
  140. package/src/room/track/RemoteTrack.ts +0 -62
  141. package/src/room/track/RemoteTrackPublication.ts +0 -198
  142. package/src/room/track/RemoteVideoTrack.ts +0 -235
  143. package/src/room/track/Track.ts +0 -343
  144. package/src/room/track/TrackPublication.ts +0 -120
  145. package/src/room/track/create.ts +0 -121
  146. package/src/room/track/defaults.ts +0 -23
  147. package/src/room/track/options.ts +0 -281
  148. package/src/room/track/types.ts +0 -20
  149. package/src/room/track/utils.test.ts +0 -93
  150. package/src/room/track/utils.ts +0 -115
  151. package/src/room/utils.ts +0 -70
  152. package/src/version.ts +0 -2
  153. package/tsconfig.eslint.json +0 -11
@@ -1,178 +0,0 @@
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
- const logger_1 = __importDefault(require("../../logger"));
7
- const livekit_models_1 = require("../../proto/livekit_models");
8
- const livekit_rtc_1 = require("../../proto/livekit_rtc");
9
- const events_1 = require("../events");
10
- const RemoteVideoTrack_1 = __importDefault(require("./RemoteVideoTrack"));
11
- const TrackPublication_1 = require("./TrackPublication");
12
- class RemoteTrackPublication extends TrackPublication_1.TrackPublication {
13
- constructor() {
14
- super(...arguments);
15
- /** @internal */
16
- this._allowed = true;
17
- this.disabled = false;
18
- this.currentVideoQuality = livekit_models_1.VideoQuality.HIGH;
19
- this.handleEnded = (track) => {
20
- this.emit(events_1.TrackEvent.Ended, track);
21
- };
22
- this.handleVisibilityChange = (visible) => {
23
- logger_1.default.debug('adaptivestream video visibility', this.trackSid, `visible=${visible}`);
24
- this.disabled = !visible;
25
- this.emitTrackUpdate();
26
- };
27
- this.handleVideoDimensionsChange = (dimensions) => {
28
- logger_1.default.debug('adaptivestream video dimensions', this.trackSid, `${dimensions.width}x${dimensions.height}`);
29
- this.videoDimensions = dimensions;
30
- this.emitTrackUpdate();
31
- };
32
- }
33
- /**
34
- * Subscribe or unsubscribe to this remote track
35
- * @param subscribed true to subscribe to a track, false to unsubscribe
36
- */
37
- setSubscribed(subscribed) {
38
- this.subscribed = subscribed;
39
- const sub = {
40
- trackSids: [this.trackSid],
41
- subscribe: this.subscribed,
42
- participantTracks: [{
43
- // sending an empty participant id since TrackPublication doesn't keep it
44
- // this is filled in by the participant that receives this message
45
- participantSid: '',
46
- trackSids: [this.trackSid],
47
- }],
48
- };
49
- this.emit(events_1.TrackEvent.UpdateSubscription, sub);
50
- }
51
- get subscriptionStatus() {
52
- if (this.subscribed === false || !super.isSubscribed) {
53
- return TrackPublication_1.TrackPublication.SubscriptionStatus.Unsubscribed;
54
- }
55
- if (!this._allowed) {
56
- return TrackPublication_1.TrackPublication.SubscriptionStatus.NotAllowed;
57
- }
58
- return TrackPublication_1.TrackPublication.SubscriptionStatus.Subscribed;
59
- }
60
- /**
61
- * Returns true if track is subscribed, and ready for playback
62
- */
63
- get isSubscribed() {
64
- if (this.subscribed === false) {
65
- return false;
66
- }
67
- if (!this._allowed) {
68
- return false;
69
- }
70
- return super.isSubscribed;
71
- }
72
- get isEnabled() {
73
- return !this.disabled;
74
- }
75
- /**
76
- * disable server from sending down data for this track. this is useful when
77
- * the participant is off screen, you may disable streaming down their video
78
- * to reduce bandwidth requirements
79
- * @param enabled
80
- */
81
- setEnabled(enabled) {
82
- if (!this.isManualOperationAllowed() || this.disabled === !enabled) {
83
- return;
84
- }
85
- this.disabled = !enabled;
86
- this.emitTrackUpdate();
87
- }
88
- /**
89
- * for tracks that support simulcasting, adjust subscribed quality
90
- *
91
- * This indicates the highest quality the client can accept. if network
92
- * bandwidth does not allow, server will automatically reduce quality to
93
- * optimize for uninterrupted video
94
- */
95
- setVideoQuality(quality) {
96
- if (!this.isManualOperationAllowed() || this.currentVideoQuality === quality) {
97
- return;
98
- }
99
- this.currentVideoQuality = quality;
100
- this.videoDimensions = undefined;
101
- this.emitTrackUpdate();
102
- }
103
- setVideoDimensions(dimensions) {
104
- var _a, _b;
105
- if (!this.isManualOperationAllowed()) {
106
- return;
107
- }
108
- if (((_a = this.videoDimensions) === null || _a === void 0 ? void 0 : _a.width) === dimensions.width
109
- && ((_b = this.videoDimensions) === null || _b === void 0 ? void 0 : _b.height) === dimensions.height) {
110
- return;
111
- }
112
- if (this.track instanceof RemoteVideoTrack_1.default) {
113
- this.videoDimensions = dimensions;
114
- }
115
- this.currentVideoQuality = undefined;
116
- this.emitTrackUpdate();
117
- }
118
- get videoQuality() {
119
- return this.currentVideoQuality;
120
- }
121
- setTrack(track) {
122
- if (this.track) {
123
- // unregister listener
124
- this.track.off(events_1.TrackEvent.VideoDimensionsChanged, this.handleVideoDimensionsChange);
125
- this.track.off(events_1.TrackEvent.VisibilityChanged, this.handleVisibilityChange);
126
- this.track.off(events_1.TrackEvent.Ended, this.handleEnded);
127
- }
128
- super.setTrack(track);
129
- if (track) {
130
- track.sid = this.trackSid;
131
- track.on(events_1.TrackEvent.VideoDimensionsChanged, this.handleVideoDimensionsChange);
132
- track.on(events_1.TrackEvent.VisibilityChanged, this.handleVisibilityChange);
133
- track.on(events_1.TrackEvent.Ended, this.handleEnded);
134
- }
135
- }
136
- /** @internal */
137
- updateInfo(info) {
138
- var _a;
139
- super.updateInfo(info);
140
- this.metadataMuted = info.muted;
141
- (_a = this.track) === null || _a === void 0 ? void 0 : _a.setMuted(info.muted);
142
- }
143
- isManualOperationAllowed() {
144
- if (this.isAdaptiveStream) {
145
- logger_1.default.warn('adaptive stream is enabled, cannot change track settings', this.trackSid);
146
- return false;
147
- }
148
- if (!this.isSubscribed) {
149
- logger_1.default.warn('cannot update track settings when not subscribed', this.trackSid);
150
- return false;
151
- }
152
- return true;
153
- }
154
- get isAdaptiveStream() {
155
- return this.track instanceof RemoteVideoTrack_1.default && this.track.isAdaptiveStream;
156
- }
157
- /* @internal */
158
- emitTrackUpdate() {
159
- const settings = livekit_rtc_1.UpdateTrackSettings.fromPartial({
160
- trackSids: [this.trackSid],
161
- disabled: this.disabled,
162
- });
163
- if (this.videoDimensions) {
164
- settings.width = this.videoDimensions.width;
165
- settings.height = this.videoDimensions.height;
166
- }
167
- else if (this.currentVideoQuality !== undefined) {
168
- settings.quality = this.currentVideoQuality;
169
- }
170
- else {
171
- // defaults to high quality
172
- settings.quality = livekit_models_1.VideoQuality.HIGH;
173
- }
174
- this.emit(events_1.TrackEvent.UpdateSettings, settings);
175
- }
176
- }
177
- exports.default = RemoteTrackPublication;
178
- //# sourceMappingURL=RemoteTrackPublication.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RemoteTrackPublication.js","sourceRoot":"","sources":["../../../src/room/track/RemoteTrackPublication.ts"],"names":[],"mappings":"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"}
@@ -1,201 +0,0 @@
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
- const ts_debounce_1 = require("ts-debounce");
16
- const events_1 = require("../events");
17
- const stats_1 = require("../stats");
18
- const utils_1 = require("../utils");
19
- const RemoteTrack_1 = __importDefault(require("./RemoteTrack"));
20
- const Track_1 = require("./Track");
21
- const REACTION_DELAY = 100;
22
- class RemoteVideoTrack extends RemoteTrack_1.default {
23
- constructor(mediaTrack, sid, receiver, adaptiveStreamSettings) {
24
- super(mediaTrack, sid, Track_1.Track.Kind.Video, receiver);
25
- this.elementInfos = [];
26
- this.monitorReceiver = () => __awaiter(this, void 0, void 0, function* () {
27
- if (!this.receiver) {
28
- this._currentBitrate = 0;
29
- return;
30
- }
31
- const stats = yield this.getReceiverStats();
32
- if (stats && this.prevStats && this.receiver) {
33
- this._currentBitrate = stats_1.computeBitrate(stats, this.prevStats);
34
- }
35
- this.prevStats = stats;
36
- setTimeout(() => {
37
- this.monitorReceiver();
38
- }, stats_1.monitorFrequency);
39
- });
40
- this.handleVisibilityChanged = (entry) => {
41
- const { target, isIntersecting } = entry;
42
- const elementInfo = this.elementInfos.find((info) => info.element === target);
43
- if (elementInfo) {
44
- elementInfo.visible = isIntersecting;
45
- elementInfo.visibilityChangedAt = Date.now();
46
- }
47
- this.updateVisibility();
48
- };
49
- this.debouncedHandleResize = ts_debounce_1.debounce(() => {
50
- this.updateDimensions();
51
- }, REACTION_DELAY);
52
- this.adaptiveStreamSettings = adaptiveStreamSettings;
53
- }
54
- get isAdaptiveStream() {
55
- return this.adaptiveStreamSettings !== undefined;
56
- }
57
- /** @internal */
58
- setMuted(muted) {
59
- super.setMuted(muted);
60
- this.attachedElements.forEach((element) => {
61
- // detach or attach
62
- if (muted) {
63
- Track_1.detachTrack(this.mediaStreamTrack, element);
64
- }
65
- else {
66
- Track_1.attachToElement(this.mediaStreamTrack, element);
67
- }
68
- });
69
- }
70
- attach(element) {
71
- if (!element) {
72
- element = super.attach();
73
- }
74
- else {
75
- super.attach(element);
76
- }
77
- // It's possible attach is called multiple times on an element. When that's
78
- // the case, we'd want to avoid adding duplicate elementInfos
79
- if (this.adaptiveStreamSettings
80
- && this.elementInfos.find((info) => info.element === element) === undefined) {
81
- this.elementInfos.push({
82
- element,
83
- visible: true, // default visible
84
- });
85
- element
86
- .handleResize = this.debouncedHandleResize;
87
- element
88
- .handleVisibilityChanged = this.handleVisibilityChanged;
89
- utils_1.getIntersectionObserver().observe(element);
90
- utils_1.getResizeObserver().observe(element);
91
- // trigger the first resize update cycle
92
- // if the tab is backgrounded, the initial resize event does not fire until
93
- // the tab comes into focus for the first time.
94
- this.debouncedHandleResize();
95
- }
96
- return element;
97
- }
98
- detach(element) {
99
- let detachedElements = [];
100
- if (element) {
101
- this.stopObservingElement(element);
102
- return super.detach(element);
103
- }
104
- detachedElements = super.detach();
105
- for (const e of detachedElements) {
106
- this.stopObservingElement(e);
107
- }
108
- return detachedElements;
109
- }
110
- getReceiverStats() {
111
- return __awaiter(this, void 0, void 0, function* () {
112
- if (!this.receiver) {
113
- return;
114
- }
115
- const stats = yield this.receiver.getStats();
116
- let receiverStats;
117
- stats.forEach((v) => {
118
- if (v.type === 'inbound-rtp') {
119
- receiverStats = {
120
- type: 'video',
121
- framesDecoded: v.framesDecoded,
122
- framesDropped: v.framesDropped,
123
- framesReceived: v.framesReceived,
124
- packetsReceived: v.packetsReceived,
125
- packetsLost: v.packetsLost,
126
- frameWidth: v.frameWidth,
127
- frameHeight: v.frameHeight,
128
- pliCount: v.pliCount,
129
- firCount: v.firCount,
130
- nackCount: v.nackCount,
131
- jitter: v.jitter,
132
- timestamp: v.timestamp,
133
- bytesReceived: v.bytesReceived,
134
- };
135
- }
136
- });
137
- return receiverStats;
138
- });
139
- }
140
- stopObservingElement(element) {
141
- var _a, _b;
142
- (_a = utils_1.getIntersectionObserver()) === null || _a === void 0 ? void 0 : _a.unobserve(element);
143
- (_b = utils_1.getResizeObserver()) === null || _b === void 0 ? void 0 : _b.unobserve(element);
144
- this.elementInfos = this.elementInfos.filter((info) => info.element !== element);
145
- }
146
- handleAppVisibilityChanged() {
147
- const _super = Object.create(null, {
148
- handleAppVisibilityChanged: { get: () => super.handleAppVisibilityChanged }
149
- });
150
- return __awaiter(this, void 0, void 0, function* () {
151
- yield _super.handleAppVisibilityChanged.call(this);
152
- if (!this.isAdaptiveStream)
153
- return;
154
- // on desktop don't pause when tab is backgrounded
155
- if (!utils_1.isMobile())
156
- return;
157
- this.updateVisibility();
158
- });
159
- }
160
- updateVisibility() {
161
- const lastVisibilityChange = this.elementInfos.reduce((prev, info) => Math.max(prev, info.visibilityChangedAt || 0), 0);
162
- const isVisible = this.elementInfos.some((info) => info.visible) && !this.isInBackground;
163
- if (this.lastVisible === isVisible) {
164
- return;
165
- }
166
- if (!isVisible && Date.now() - lastVisibilityChange < REACTION_DELAY) {
167
- // delay hidden events
168
- setTimeout(() => {
169
- this.updateVisibility();
170
- }, REACTION_DELAY);
171
- return;
172
- }
173
- this.lastVisible = isVisible;
174
- this.emit(events_1.TrackEvent.VisibilityChanged, isVisible, this);
175
- }
176
- updateDimensions() {
177
- var _a, _b, _c, _d;
178
- let maxWidth = 0;
179
- let maxHeight = 0;
180
- for (const info of this.elementInfos) {
181
- const pixelDensity = (_b = (_a = this.adaptiveStreamSettings) === null || _a === void 0 ? void 0 : _a.pixelDensity) !== null && _b !== void 0 ? _b : 1;
182
- const pixelDensityValue = pixelDensity === 'screen' ? window.devicePixelRatio : pixelDensity;
183
- const currentElementWidth = info.element.clientWidth * pixelDensityValue;
184
- const currentElementHeight = info.element.clientHeight * pixelDensityValue;
185
- if (currentElementWidth + currentElementHeight > maxWidth + maxHeight) {
186
- maxWidth = currentElementWidth;
187
- maxHeight = currentElementHeight;
188
- }
189
- }
190
- if (((_c = this.lastDimensions) === null || _c === void 0 ? void 0 : _c.width) === maxWidth && ((_d = this.lastDimensions) === null || _d === void 0 ? void 0 : _d.height) === maxHeight) {
191
- return;
192
- }
193
- this.lastDimensions = {
194
- width: maxWidth,
195
- height: maxHeight,
196
- };
197
- this.emit(events_1.TrackEvent.VideoDimensionsChanged, this.lastDimensions, this);
198
- }
199
- }
200
- exports.default = RemoteVideoTrack;
201
- //# sourceMappingURL=RemoteVideoTrack.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RemoteVideoTrack.js","sourceRoot":"","sources":["../../../src/room/track/RemoteVideoTrack.ts"],"names":[],"mappings":"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"}
@@ -1,283 +0,0 @@
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
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.detachTrack = exports.attachToElement = exports.Track = void 0;
13
- const events_1 = require("events");
14
- const livekit_models_1 = require("../../proto/livekit_models");
15
- const livekit_rtc_1 = require("../../proto/livekit_rtc");
16
- const events_2 = require("../events");
17
- const utils_1 = require("../utils");
18
- // keep old audio elements when detached, we would re-use them since on iOS
19
- // Safari tracks which audio elements have been "blessed" by the user.
20
- const recycledElements = [];
21
- class Track extends events_1.EventEmitter {
22
- constructor(mediaTrack, kind) {
23
- super();
24
- this.attachedElements = [];
25
- this.isMuted = false;
26
- this._currentBitrate = 0;
27
- this.appVisibilityChangedListener = () => {
28
- this.handleAppVisibilityChanged();
29
- };
30
- this.kind = kind;
31
- this.mediaStreamTrack = mediaTrack;
32
- this.source = Track.Source.Unknown;
33
- if (utils_1.isWeb()) {
34
- this.isInBackground = document.visibilityState === 'hidden';
35
- document.addEventListener('visibilitychange', this.appVisibilityChangedListener);
36
- }
37
- else {
38
- this.isInBackground = false;
39
- }
40
- }
41
- /** current receive bits per second */
42
- get currentBitrate() {
43
- return this._currentBitrate;
44
- }
45
- attach(element) {
46
- let elementType = 'audio';
47
- if (this.kind === Track.Kind.Video) {
48
- elementType = 'video';
49
- }
50
- if (!element) {
51
- if (elementType === 'audio') {
52
- recycledElements.forEach((e) => {
53
- if (e.parentElement === null && !element) {
54
- element = e;
55
- }
56
- });
57
- if (element) {
58
- // remove it from pool
59
- recycledElements.splice(recycledElements.indexOf(element), 1);
60
- }
61
- }
62
- if (!element) {
63
- element = document.createElement(elementType);
64
- }
65
- }
66
- if (!this.attachedElements.includes(element)) {
67
- this.attachedElements.push(element);
68
- }
69
- // even if we believe it's already attached to the element, it's possible
70
- // the element's srcObject was set to something else out of band.
71
- // we'll want to re-attach it in that case
72
- attachToElement(this.mediaStreamTrack, element);
73
- if (element instanceof HTMLAudioElement) {
74
- // manually play audio to detect audio playback status
75
- element.play()
76
- .then(() => {
77
- this.emit(events_2.TrackEvent.AudioPlaybackStarted);
78
- })
79
- .catch((e) => {
80
- this.emit(events_2.TrackEvent.AudioPlaybackFailed, e);
81
- });
82
- }
83
- return element;
84
- }
85
- detach(element) {
86
- // detach from a single element
87
- if (element) {
88
- detachTrack(this.mediaStreamTrack, element);
89
- const idx = this.attachedElements.indexOf(element);
90
- if (idx >= 0) {
91
- this.attachedElements.splice(idx, 1);
92
- this.recycleElement(element);
93
- }
94
- return element;
95
- }
96
- const detached = [];
97
- this.attachedElements.forEach((elm) => {
98
- detachTrack(this.mediaStreamTrack, elm);
99
- detached.push(elm);
100
- this.recycleElement(elm);
101
- });
102
- // remove all tracks
103
- this.attachedElements = [];
104
- return detached;
105
- }
106
- stop() {
107
- this.mediaStreamTrack.stop();
108
- if (utils_1.isWeb()) {
109
- document.removeEventListener('visibilitychange', this.appVisibilityChangedListener);
110
- }
111
- }
112
- enable() {
113
- this.mediaStreamTrack.enabled = true;
114
- }
115
- disable() {
116
- this.mediaStreamTrack.enabled = false;
117
- }
118
- recycleElement(element) {
119
- if (element instanceof HTMLAudioElement) {
120
- // we only need to re-use a single element
121
- let shouldCache = true;
122
- element.pause();
123
- recycledElements.forEach((e) => {
124
- if (!e.parentElement) {
125
- shouldCache = false;
126
- }
127
- });
128
- if (shouldCache) {
129
- recycledElements.push(element);
130
- }
131
- }
132
- }
133
- handleAppVisibilityChanged() {
134
- return __awaiter(this, void 0, void 0, function* () {
135
- this.isInBackground = document.visibilityState === 'hidden';
136
- });
137
- }
138
- }
139
- exports.Track = Track;
140
- /** @internal */
141
- function attachToElement(track, element) {
142
- let mediaStream;
143
- if (element.srcObject instanceof MediaStream) {
144
- mediaStream = element.srcObject;
145
- }
146
- else {
147
- mediaStream = new MediaStream();
148
- }
149
- // check if track matches existing track
150
- let existingTracks;
151
- if (track.kind === 'audio') {
152
- existingTracks = mediaStream.getAudioTracks();
153
- }
154
- else {
155
- existingTracks = mediaStream.getVideoTracks();
156
- }
157
- if (!existingTracks.includes(track)) {
158
- existingTracks.forEach((et) => {
159
- mediaStream.removeTrack(et);
160
- });
161
- mediaStream.addTrack(track);
162
- }
163
- // avoid flicker
164
- if (element.srcObject !== mediaStream) {
165
- element.srcObject = mediaStream;
166
- if ((utils_1.isSafari() || utils_1.isFireFox()) && element instanceof HTMLVideoElement) {
167
- // Firefox also has a timing issue where video doesn't actually get attached unless
168
- // performed out-of-band
169
- // Safari 15 has a bug where in certain layouts, video element renders
170
- // black until the page is resized or other changes take place.
171
- // Resetting the src triggers it to render.
172
- // https://developer.apple.com/forums/thread/690523
173
- setTimeout(() => {
174
- element.srcObject = mediaStream;
175
- }, 0);
176
- }
177
- }
178
- element.autoplay = true;
179
- if (element instanceof HTMLVideoElement) {
180
- element.playsInline = true;
181
- }
182
- }
183
- exports.attachToElement = attachToElement;
184
- /** @internal */
185
- function detachTrack(track, element) {
186
- if (element.srcObject instanceof MediaStream) {
187
- const mediaStream = element.srcObject;
188
- mediaStream.removeTrack(track);
189
- element.srcObject = null;
190
- }
191
- }
192
- exports.detachTrack = detachTrack;
193
- (function (Track) {
194
- let Kind;
195
- (function (Kind) {
196
- Kind["Audio"] = "audio";
197
- Kind["Video"] = "video";
198
- Kind["Unknown"] = "unknown";
199
- })(Kind = Track.Kind || (Track.Kind = {}));
200
- let Source;
201
- (function (Source) {
202
- Source["Camera"] = "camera";
203
- Source["Microphone"] = "microphone";
204
- Source["ScreenShare"] = "screen_share";
205
- Source["ScreenShareAudio"] = "screen_share_audio";
206
- Source["Unknown"] = "unknown";
207
- })(Source = Track.Source || (Track.Source = {}));
208
- let StreamState;
209
- (function (StreamState) {
210
- StreamState["Active"] = "active";
211
- StreamState["Paused"] = "paused";
212
- StreamState["Unknown"] = "unknown";
213
- })(StreamState = Track.StreamState || (Track.StreamState = {}));
214
- /** @internal */
215
- function kindToProto(k) {
216
- switch (k) {
217
- case Kind.Audio:
218
- return livekit_models_1.TrackType.AUDIO;
219
- case Kind.Video:
220
- return livekit_models_1.TrackType.VIDEO;
221
- default:
222
- return livekit_models_1.TrackType.UNRECOGNIZED;
223
- }
224
- }
225
- Track.kindToProto = kindToProto;
226
- /** @internal */
227
- function kindFromProto(t) {
228
- switch (t) {
229
- case livekit_models_1.TrackType.AUDIO:
230
- return Kind.Audio;
231
- case livekit_models_1.TrackType.VIDEO:
232
- return Kind.Video;
233
- default:
234
- return Kind.Unknown;
235
- }
236
- }
237
- Track.kindFromProto = kindFromProto;
238
- /** @internal */
239
- function sourceToProto(s) {
240
- switch (s) {
241
- case Source.Camera:
242
- return livekit_models_1.TrackSource.CAMERA;
243
- case Source.Microphone:
244
- return livekit_models_1.TrackSource.MICROPHONE;
245
- case Source.ScreenShare:
246
- return livekit_models_1.TrackSource.SCREEN_SHARE;
247
- case Source.ScreenShareAudio:
248
- return livekit_models_1.TrackSource.SCREEN_SHARE_AUDIO;
249
- default:
250
- return livekit_models_1.TrackSource.UNRECOGNIZED;
251
- }
252
- }
253
- Track.sourceToProto = sourceToProto;
254
- /** @internal */
255
- function sourceFromProto(s) {
256
- switch (s) {
257
- case livekit_models_1.TrackSource.CAMERA:
258
- return Source.Camera;
259
- case livekit_models_1.TrackSource.MICROPHONE:
260
- return Source.Microphone;
261
- case livekit_models_1.TrackSource.SCREEN_SHARE:
262
- return Source.ScreenShare;
263
- case livekit_models_1.TrackSource.SCREEN_SHARE_AUDIO:
264
- return Source.ScreenShareAudio;
265
- default:
266
- return Source.Unknown;
267
- }
268
- }
269
- Track.sourceFromProto = sourceFromProto;
270
- /** @internal */
271
- function streamStateFromProto(s) {
272
- switch (s) {
273
- case livekit_rtc_1.StreamState.ACTIVE:
274
- return StreamState.Active;
275
- case livekit_rtc_1.StreamState.PAUSED:
276
- return StreamState.Paused;
277
- default:
278
- return StreamState.Unknown;
279
- }
280
- }
281
- Track.streamStateFromProto = streamStateFromProto;
282
- })(Track = exports.Track || (exports.Track = {}));
283
- //# sourceMappingURL=Track.js.map