livekit-client 0.17.4 → 0.17.6-rc2

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 (155) 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 +2 -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 +12 -2
  13. package/dist/proto/livekit_models.d.ts +524 -17
  14. package/dist/proto/livekit_rtc.d.ts +3449 -31
  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/room/track/options.d.ts +1 -1
  23. package/dist/test/mocks.d.ts +11 -0
  24. package/dist/version.d.ts +1 -1
  25. package/package.json +41 -16
  26. package/.eslintrc.js +0 -17
  27. package/.gitmodules +0 -3
  28. package/dist/api/RequestQueue.js +0 -61
  29. package/dist/api/RequestQueue.js.map +0 -1
  30. package/dist/api/SignalClient.js +0 -428
  31. package/dist/api/SignalClient.js.map +0 -1
  32. package/dist/connect.js +0 -130
  33. package/dist/connect.js.map +0 -1
  34. package/dist/index.js +0 -71
  35. package/dist/index.js.map +0 -1
  36. package/dist/logger.js +0 -24
  37. package/dist/logger.js.map +0 -1
  38. package/dist/options.js +0 -3
  39. package/dist/options.js.map +0 -1
  40. package/dist/proto/google/protobuf/timestamp.js +0 -93
  41. package/dist/proto/google/protobuf/timestamp.js.map +0 -1
  42. package/dist/proto/livekit_models.js +0 -2688
  43. package/dist/proto/livekit_models.js.map +0 -1
  44. package/dist/proto/livekit_rtc.js +0 -2995
  45. package/dist/proto/livekit_rtc.js.map +0 -1
  46. package/dist/room/DeviceManager.js +0 -62
  47. package/dist/room/DeviceManager.js.map +0 -1
  48. package/dist/room/PCTransport.js +0 -91
  49. package/dist/room/PCTransport.js.map +0 -1
  50. package/dist/room/RTCEngine.js +0 -562
  51. package/dist/room/RTCEngine.js.map +0 -1
  52. package/dist/room/Room.js +0 -759
  53. package/dist/room/Room.js.map +0 -1
  54. package/dist/room/errors.js +0 -68
  55. package/dist/room/errors.js.map +0 -1
  56. package/dist/room/events.js +0 -385
  57. package/dist/room/events.js.map +0 -1
  58. package/dist/room/participant/LocalParticipant.js +0 -647
  59. package/dist/room/participant/LocalParticipant.js.map +0 -1
  60. package/dist/room/participant/Participant.js +0 -189
  61. package/dist/room/participant/Participant.js.map +0 -1
  62. package/dist/room/participant/ParticipantTrackPermission.js +0 -16
  63. package/dist/room/participant/ParticipantTrackPermission.js.map +0 -1
  64. package/dist/room/participant/RemoteParticipant.js +0 -194
  65. package/dist/room/participant/RemoteParticipant.js.map +0 -1
  66. package/dist/room/participant/publishUtils.js +0 -189
  67. package/dist/room/participant/publishUtils.js.map +0 -1
  68. package/dist/room/participant/publishUtils.test.d.ts +0 -1
  69. package/dist/room/participant/publishUtils.test.js +0 -118
  70. package/dist/room/participant/publishUtils.test.js.map +0 -1
  71. package/dist/room/stats.js +0 -26
  72. package/dist/room/stats.js.map +0 -1
  73. package/dist/room/track/LocalAudioTrack.js +0 -153
  74. package/dist/room/track/LocalAudioTrack.js.map +0 -1
  75. package/dist/room/track/LocalTrack.js +0 -158
  76. package/dist/room/track/LocalTrack.js.map +0 -1
  77. package/dist/room/track/LocalTrackPublication.js +0 -64
  78. package/dist/room/track/LocalTrackPublication.js.map +0 -1
  79. package/dist/room/track/LocalVideoTrack.js +0 -297
  80. package/dist/room/track/LocalVideoTrack.js.map +0 -1
  81. package/dist/room/track/LocalVideoTrack.test.d.ts +0 -1
  82. package/dist/room/track/LocalVideoTrack.test.js +0 -68
  83. package/dist/room/track/LocalVideoTrack.test.js.map +0 -1
  84. package/dist/room/track/RemoteAudioTrack.js +0 -64
  85. package/dist/room/track/RemoteAudioTrack.js.map +0 -1
  86. package/dist/room/track/RemoteTrack.js +0 -49
  87. package/dist/room/track/RemoteTrack.js.map +0 -1
  88. package/dist/room/track/RemoteTrackPublication.js +0 -178
  89. package/dist/room/track/RemoteTrackPublication.js.map +0 -1
  90. package/dist/room/track/RemoteVideoTrack.js +0 -201
  91. package/dist/room/track/RemoteVideoTrack.js.map +0 -1
  92. package/dist/room/track/Track.js +0 -283
  93. package/dist/room/track/Track.js.map +0 -1
  94. package/dist/room/track/TrackPublication.js +0 -92
  95. package/dist/room/track/TrackPublication.js.map +0 -1
  96. package/dist/room/track/create.js +0 -131
  97. package/dist/room/track/create.js.map +0 -1
  98. package/dist/room/track/defaults.js +0 -21
  99. package/dist/room/track/defaults.js.map +0 -1
  100. package/dist/room/track/options.js +0 -100
  101. package/dist/room/track/options.js.map +0 -1
  102. package/dist/room/track/types.js +0 -3
  103. package/dist/room/track/types.js.map +0 -1
  104. package/dist/room/track/utils.js +0 -113
  105. package/dist/room/track/utils.js.map +0 -1
  106. package/dist/room/track/utils.test.d.ts +0 -1
  107. package/dist/room/track/utils.test.js +0 -85
  108. package/dist/room/track/utils.test.js.map +0 -1
  109. package/dist/room/utils.js +0 -79
  110. package/dist/room/utils.js.map +0 -1
  111. package/dist/version.js +0 -6
  112. package/dist/version.js.map +0 -1
  113. package/jest.config.js +0 -6
  114. package/src/api/RequestQueue.ts +0 -53
  115. package/src/api/SignalClient.ts +0 -499
  116. package/src/connect.ts +0 -100
  117. package/src/index.ts +0 -47
  118. package/src/logger.ts +0 -22
  119. package/src/options.ts +0 -149
  120. package/src/proto/google/protobuf/timestamp.ts +0 -222
  121. package/src/proto/livekit_models.ts +0 -3019
  122. package/src/proto/livekit_rtc.ts +0 -3677
  123. package/src/room/DeviceManager.ts +0 -57
  124. package/src/room/PCTransport.ts +0 -86
  125. package/src/room/RTCEngine.ts +0 -652
  126. package/src/room/Room.ts +0 -943
  127. package/src/room/errors.ts +0 -65
  128. package/src/room/events.ts +0 -424
  129. package/src/room/participant/LocalParticipant.ts +0 -734
  130. package/src/room/participant/Participant.ts +0 -269
  131. package/src/room/participant/ParticipantTrackPermission.ts +0 -32
  132. package/src/room/participant/RemoteParticipant.ts +0 -243
  133. package/src/room/participant/publishUtils.test.ts +0 -145
  134. package/src/room/participant/publishUtils.ts +0 -225
  135. package/src/room/stats.ts +0 -130
  136. package/src/room/track/LocalAudioTrack.ts +0 -137
  137. package/src/room/track/LocalTrack.ts +0 -161
  138. package/src/room/track/LocalTrackPublication.ts +0 -66
  139. package/src/room/track/LocalVideoTrack.test.ts +0 -70
  140. package/src/room/track/LocalVideoTrack.ts +0 -293
  141. package/src/room/track/RemoteAudioTrack.ts +0 -58
  142. package/src/room/track/RemoteTrack.ts +0 -62
  143. package/src/room/track/RemoteTrackPublication.ts +0 -198
  144. package/src/room/track/RemoteVideoTrack.ts +0 -235
  145. package/src/room/track/Track.ts +0 -343
  146. package/src/room/track/TrackPublication.ts +0 -120
  147. package/src/room/track/create.ts +0 -121
  148. package/src/room/track/defaults.ts +0 -23
  149. package/src/room/track/options.ts +0 -281
  150. package/src/room/track/types.ts +0 -20
  151. package/src/room/track/utils.test.ts +0 -93
  152. package/src/room/track/utils.ts +0 -115
  153. package/src/room/utils.ts +0 -70
  154. package/src/version.ts +0 -2
  155. 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":";;;;;AAAA,0DAA+B;AAC/B,+DAAqE;AACrE,yDAGiC;AACjC,sCAAuC;AACvC,0EAAkD;AAElD,yDAAsD;AAGtD,MAAqB,sBAAuB,SAAQ,mCAAgB;IAApE;;QAGE,gBAAgB;QAChB,aAAQ,GAAG,IAAI,CAAC;QAKN,aAAQ,GAAY,KAAK,CAAC;QAE1B,wBAAmB,GAAkB,6BAAY,CAAC,IAAI,CAAC;QAwIvD,gBAAW,GAAG,CAAC,KAAkB,EAAE,EAAE;YAC7C,IAAI,CAAC,IAAI,CAAC,mBAAU,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACrC,CAAC,CAAC;QAMQ,2BAAsB,GAAG,CAAC,OAAgB,EAAE,EAAE;YACtD,gBAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,OAAO,EAAE,CAAC,CAAC;YAClF,IAAI,CAAC,QAAQ,GAAG,CAAC,OAAO,CAAC;YACzB,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC,CAAC;QAEQ,gCAA2B,GAAG,CAAC,UAA4B,EAAE,EAAE;YACvE,gBAAG,CAAC,KAAK,CAAC,iCAAiC,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,UAAU,CAAC,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;YACxG,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC;YAClC,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC,CAAC;IAoBJ,CAAC;IA1KC;;;OAGG;IACH,aAAa,CAAC,UAAmB;QAC/B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAE7B,MAAM,GAAG,GAAuB;YAC9B,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC1B,SAAS,EAAE,IAAI,CAAC,UAAU;YAC1B,iBAAiB,EAAE,CAAC;oBAClB,yEAAyE;oBACzE,kEAAkE;oBAClE,cAAc,EAAE,EAAE;oBAClB,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;iBAC3B,CAAC;SACH,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,mBAAU,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,IAAI,kBAAkB;QACpB,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE;YACpD,OAAO,mCAAgB,CAAC,kBAAkB,CAAC,YAAY,CAAC;SACzD;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,OAAO,mCAAgB,CAAC,kBAAkB,CAAC,UAAU,CAAC;SACvD;QACD,OAAO,mCAAgB,CAAC,kBAAkB,CAAC,UAAU,CAAC;IACxD,CAAC;IAED;;OAEG;IACH,IAAI,YAAY;QACd,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,EAAE;YAC7B,OAAO,KAAK,CAAC;SACd;QACD,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAClB,OAAO,KAAK,CAAC;SACd;QACD,OAAO,KAAK,CAAC,YAAY,CAAC;IAC5B,CAAC;IAED,IAAI,SAAS;QACX,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,OAAgB;QACzB,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,OAAO,EAAE;YAClE,OAAO;SACR;QACD,IAAI,CAAC,QAAQ,GAAG,CAAC,OAAO,CAAC;QAEzB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED;;;;;;OAMG;IACH,eAAe,CAAC,OAAqB;QACnC,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,IAAI,IAAI,CAAC,mBAAmB,KAAK,OAAO,EAAE;YAC5E,OAAO;SACR;QACD,IAAI,CAAC,mBAAmB,GAAG,OAAO,CAAC;QACnC,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC;QAEjC,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,kBAAkB,CAAC,UAA4B;;QAC7C,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE,EAAE;YACpC,OAAO;SACR;QACD,IAAI,CAAA,MAAA,IAAI,CAAC,eAAe,0CAAE,KAAK,MAAK,UAAU,CAAC,KAAK;eAC7C,CAAA,MAAA,IAAI,CAAC,eAAe,0CAAE,MAAM,MAAK,UAAU,CAAC,MAAM,EAAE;YACzD,OAAO;SACR;QACD,IAAI,IAAI,CAAC,KAAK,YAAY,0BAAgB,EAAE;YAAE,IAAI,CAAC,eAAe,GAAG,UAAU,CAAC;SAAE;QAClF,IAAI,CAAC,mBAAmB,GAAG,SAAS,CAAC;QAErC,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,mBAAmB,CAAC;IAClC,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,IAAI,CAAC,KAAK,EAAE;YACd,sBAAsB;YACtB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAU,CAAC,sBAAsB,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;YACpF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC1E,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAU,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;SACpD;QACD,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,KAAK,EAAE;YACT,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC1B,KAAK,CAAC,EAAE,CAAC,mBAAU,CAAC,sBAAsB,EAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;YAC9E,KAAK,CAAC,EAAE,CAAC,mBAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACpE,KAAK,CAAC,EAAE,CAAC,mBAAU,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;SAC9C;IACH,CAAC;IAED,gBAAgB;IAChB,UAAU,CAAC,IAAe;;QACxB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC;QAChC,MAAA,IAAI,CAAC,KAAK,0CAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnC,CAAC;IAEO,wBAAwB;QAC9B,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACzB,gBAAG,CAAC,IAAI,CAAC,0DAA0D,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpF,OAAO,KAAK,CAAC;SACd;QACD,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtB,gBAAG,CAAC,IAAI,CAAC,kDAAkD,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5E,OAAO,KAAK,CAAC;SACd;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAMD,IAAc,gBAAgB;QAC5B,OAAO,IAAI,CAAC,KAAK,YAAY,0BAAgB,IAAI,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC;IAC/E,CAAC;IAcD,eAAe;IACf,eAAe;QACb,MAAM,QAAQ,GAAwB,iCAAmB,CAAC,WAAW,CAAC;YACpE,SAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC;YAC1B,QAAQ,EAAE,IAAI,CAAC,QAAQ;SACxB,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,eAAe,EAAE;YACxB,QAAQ,CAAC,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC;YAC5C,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC;SAC/C;aAAM,IAAI,IAAI,CAAC,mBAAmB,KAAK,SAAS,EAAE;YACjD,QAAQ,CAAC,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC;SAC7C;aAAM;YACL,2BAA2B;YAC3B,QAAQ,CAAC,OAAO,GAAG,6BAAY,CAAC,IAAI,CAAC;SACtC;QAED,IAAI,CAAC,IAAI,CAAC,mBAAU,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IACjD,CAAC;CACF;AAzLD,yCAyLC"}
@@ -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