livekit-client 0.14.3 → 0.15.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/{lint.yaml → test.yaml} +7 -4
- package/.gitmodules +3 -0
- package/README.md +46 -14
- package/dist/api/SignalClient.d.ts +12 -32
- package/dist/api/SignalClient.js +59 -8
- package/dist/api/SignalClient.js.map +1 -1
- package/dist/connect.d.ts +1 -1
- package/dist/connect.js +71 -73
- package/dist/connect.js.map +1 -1
- package/dist/index.d.ts +6 -4
- package/dist/index.js +8 -5
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +10 -0
- package/dist/logger.js +15 -0
- package/dist/logger.js.map +1 -1
- package/dist/options.d.ts +83 -19
- package/dist/options.js +0 -10
- package/dist/options.js.map +1 -1
- package/dist/proto/livekit_models.d.ts +45 -1
- package/dist/proto/livekit_models.js +333 -4
- package/dist/proto/livekit_models.js.map +1 -1
- package/dist/proto/livekit_rtc.d.ts +148 -7
- package/dist/proto/livekit_rtc.js +1047 -30
- package/dist/proto/livekit_rtc.js.map +1 -1
- package/dist/room/PCTransport.js +4 -0
- package/dist/room/PCTransport.js.map +1 -1
- package/dist/room/RTCEngine.d.ts +4 -2
- package/dist/room/RTCEngine.js +36 -38
- package/dist/room/RTCEngine.js.map +1 -1
- package/dist/room/Room.d.ts +23 -17
- package/dist/room/Room.js +205 -71
- package/dist/room/Room.js.map +1 -1
- package/dist/room/events.d.ts +143 -14
- package/dist/room/events.js +142 -13
- package/dist/room/events.js.map +1 -1
- package/dist/room/participant/LocalParticipant.d.ts +53 -13
- package/dist/room/participant/LocalParticipant.js +244 -169
- package/dist/room/participant/LocalParticipant.js.map +1 -1
- package/dist/room/participant/Participant.d.ts +3 -1
- package/dist/room/participant/Participant.js +3 -1
- package/dist/room/participant/Participant.js.map +1 -1
- package/dist/room/participant/ParticipantTrackPermission.d.ts +19 -0
- package/dist/room/participant/ParticipantTrackPermission.js +16 -0
- package/dist/room/participant/ParticipantTrackPermission.js.map +1 -0
- package/dist/room/participant/RemoteParticipant.d.ts +2 -2
- package/dist/room/participant/RemoteParticipant.js +10 -15
- package/dist/room/participant/RemoteParticipant.js.map +1 -1
- package/dist/room/participant/publishUtils.d.ts +11 -0
- package/dist/room/participant/publishUtils.js +148 -0
- package/dist/room/participant/publishUtils.js.map +1 -0
- package/dist/room/participant/publishUtils.test.d.ts +1 -0
- package/dist/room/participant/publishUtils.test.js +79 -0
- package/dist/room/participant/publishUtils.test.js.map +1 -0
- package/dist/room/stats.d.ts +21 -6
- package/dist/room/stats.js +22 -1
- package/dist/room/stats.js.map +1 -1
- package/dist/room/track/LocalAudioTrack.d.ts +8 -3
- package/dist/room/track/LocalAudioTrack.js +49 -3
- package/dist/room/track/LocalAudioTrack.js.map +1 -1
- package/dist/room/track/LocalTrack.d.ts +1 -3
- package/dist/room/track/LocalTrack.js +3 -50
- package/dist/room/track/LocalTrack.js.map +1 -1
- package/dist/room/track/LocalTrackPublication.d.ts +3 -1
- package/dist/room/track/LocalTrackPublication.js +15 -5
- package/dist/room/track/LocalTrackPublication.js.map +1 -1
- package/dist/room/track/LocalVideoTrack.d.ts +14 -5
- package/dist/room/track/LocalVideoTrack.js +156 -62
- package/dist/room/track/LocalVideoTrack.js.map +1 -1
- package/dist/room/track/LocalVideoTrack.test.d.ts +1 -0
- package/dist/room/track/LocalVideoTrack.test.js +68 -0
- package/dist/room/track/LocalVideoTrack.test.js.map +1 -0
- package/dist/room/track/RemoteAudioTrack.d.ts +6 -8
- package/dist/room/track/RemoteAudioTrack.js +55 -19
- package/dist/room/track/RemoteAudioTrack.js.map +1 -1
- package/dist/room/track/RemoteTrack.d.ts +14 -0
- package/dist/room/track/RemoteTrack.js +47 -0
- package/dist/room/track/RemoteTrack.js.map +1 -0
- package/dist/room/track/RemoteTrackPublication.d.ts +10 -4
- package/dist/room/track/RemoteTrackPublication.js +41 -15
- package/dist/room/track/RemoteTrackPublication.js.map +1 -1
- package/dist/room/track/RemoteVideoTrack.d.ts +7 -9
- package/dist/room/track/RemoteVideoTrack.js +77 -41
- package/dist/room/track/RemoteVideoTrack.js.map +1 -1
- package/dist/room/track/Track.d.ts +13 -2
- package/dist/room/track/Track.js +34 -2
- package/dist/room/track/Track.js.map +1 -1
- package/dist/room/track/TrackPublication.d.ts +14 -1
- package/dist/room/track/TrackPublication.js +24 -7
- package/dist/room/track/TrackPublication.js.map +1 -1
- package/dist/room/track/create.d.ts +4 -6
- package/dist/room/track/create.js +10 -57
- package/dist/room/track/create.js.map +1 -1
- package/dist/room/track/defaults.d.ts +4 -0
- package/dist/room/track/defaults.js +21 -0
- package/dist/room/track/defaults.js.map +1 -0
- package/dist/room/track/options.d.ts +15 -65
- package/dist/room/track/options.js +14 -13
- package/dist/room/track/options.js.map +1 -1
- package/dist/room/track/utils.d.ts +3 -0
- package/dist/room/track/utils.js +68 -0
- package/dist/room/track/utils.js.map +1 -0
- package/dist/room/track/utils.test.d.ts +1 -0
- package/dist/room/track/utils.test.js +85 -0
- package/dist/room/track/utils.test.js.map +1 -0
- package/dist/room/utils.d.ts +1 -1
- package/dist/room/utils.js +5 -6
- package/dist/room/utils.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/example/index.html +193 -178
- package/example/sample.ts +467 -327
- package/example/styles.css +144 -0
- package/example/webpack.config.js +1 -1
- package/jest.config.js +6 -0
- package/package.json +9 -6
- package/tsconfig.eslint.json +8 -1
- package/dist/room/defaults.d.ts +0 -5
- package/dist/room/defaults.js +0 -32
- package/dist/room/defaults.js.map +0 -1
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"LocalVideoTrack.test.js","sourceRoot":"","sources":["../../../src/room/track/LocalVideoTrack.test.ts"],"names":[],"mappings":"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"}
|
@@ -1,10 +1,8 @@
|
|
1
|
-
import {
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
import { AudioReceiverStats } from '../stats';
|
2
|
+
import RemoteTrack from './RemoteTrack';
|
3
|
+
export default class RemoteAudioTrack extends RemoteTrack {
|
4
|
+
private prevStats?;
|
5
5
|
constructor(mediaTrack: MediaStreamTrack, sid: string, receiver?: RTCRtpReceiver);
|
6
|
-
|
7
|
-
|
8
|
-
start(): void;
|
9
|
-
stop(): void;
|
6
|
+
protected monitorReceiver: () => Promise<void>;
|
7
|
+
protected getReceiverStats(): Promise<AudioReceiverStats | undefined>;
|
10
8
|
}
|
@@ -1,27 +1,63 @@
|
|
1
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
|
+
};
|
2
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
-
const
|
15
|
+
const stats_1 = require("../stats");
|
16
|
+
const RemoteTrack_1 = __importDefault(require("./RemoteTrack"));
|
4
17
|
const Track_1 = require("./Track");
|
5
|
-
class RemoteAudioTrack extends
|
18
|
+
class RemoteAudioTrack extends RemoteTrack_1.default {
|
6
19
|
constructor(mediaTrack, sid, receiver) {
|
7
|
-
super(mediaTrack, Track_1.Track.Kind.Audio);
|
8
|
-
this.
|
9
|
-
|
20
|
+
super(mediaTrack, sid, Track_1.Track.Kind.Audio, receiver);
|
21
|
+
this.monitorReceiver = () => __awaiter(this, void 0, void 0, function* () {
|
22
|
+
if (!this.receiver) {
|
23
|
+
this._currentBitrate = 0;
|
24
|
+
return;
|
25
|
+
}
|
26
|
+
const stats = yield this.getReceiverStats();
|
27
|
+
if (stats && this.prevStats && this.receiver) {
|
28
|
+
this._currentBitrate = stats_1.computeBitrate(stats, this.prevStats);
|
29
|
+
}
|
30
|
+
this.prevStats = stats;
|
31
|
+
setTimeout(() => {
|
32
|
+
this.monitorReceiver();
|
33
|
+
}, stats_1.monitorFrequency);
|
34
|
+
});
|
10
35
|
}
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
36
|
+
getReceiverStats() {
|
37
|
+
return __awaiter(this, void 0, void 0, function* () {
|
38
|
+
if (!this.receiver) {
|
39
|
+
return;
|
40
|
+
}
|
41
|
+
const stats = yield this.receiver.getStats();
|
42
|
+
let receiverStats;
|
43
|
+
stats.forEach((v) => {
|
44
|
+
if (v.type === 'inbound-rtp') {
|
45
|
+
receiverStats = {
|
46
|
+
type: 'audio',
|
47
|
+
timestamp: v.timestamp,
|
48
|
+
jitter: v.jitter,
|
49
|
+
bytesReceived: v.bytesReceived,
|
50
|
+
concealedSamples: v.concealedSamples,
|
51
|
+
concealmentEvents: v.concealmentEvents,
|
52
|
+
silentConcealedSamples: v.silentConcealedSamples,
|
53
|
+
silentConcealmentEvents: v.silentConcealmentEvents,
|
54
|
+
totalAudioEnergy: v.totalAudioEnergy,
|
55
|
+
totalSamplesDuration: v.totalSamplesDuration,
|
56
|
+
};
|
57
|
+
}
|
58
|
+
});
|
59
|
+
return receiverStats;
|
60
|
+
});
|
25
61
|
}
|
26
62
|
}
|
27
63
|
exports.default = RemoteAudioTrack;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"RemoteAudioTrack.js","sourceRoot":"","sources":["../../../src/room/track/RemoteAudioTrack.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"RemoteAudioTrack.js","sourceRoot":"","sources":["../../../src/room/track/RemoteAudioTrack.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,oCAAgF;AAChF,gEAAwC;AACxC,mCAAgC;AAEhC,MAAqB,gBAAiB,SAAQ,qBAAW;IAGvD,YACE,UAA4B,EAC5B,GAAW,EACX,QAAyB;QAEzB,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,aAAK,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QAG3C,oBAAe,GAAG,GAAS,EAAE;YACrC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAClB,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;gBACzB,OAAO;aACR;YACD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAE5C,IAAI,KAAK,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE;gBAC5C,IAAI,CAAC,eAAe,GAAG,sBAAc,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;aAC9D;YAED,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,UAAU,CAAC,GAAG,EAAE;gBACd,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,CAAC,EAAE,wBAAgB,CAAC,CAAC;QACvB,CAAC,CAAA,CAAC;IAjBF,CAAC;IAmBe,gBAAgB;;YAC9B,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAClB,OAAO;aACR;YAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;YAC7C,IAAI,aAA6C,CAAC;YAClD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;gBAClB,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,EAAE;oBAC5B,aAAa,GAAG;wBACd,IAAI,EAAE,OAAO;wBACb,SAAS,EAAE,CAAC,CAAC,SAAS;wBACtB,MAAM,EAAE,CAAC,CAAC,MAAM;wBAChB,aAAa,EAAE,CAAC,CAAC,aAAa;wBAC9B,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;wBACpC,iBAAiB,EAAE,CAAC,CAAC,iBAAiB;wBACtC,sBAAsB,EAAE,CAAC,CAAC,sBAAsB;wBAChD,uBAAuB,EAAE,CAAC,CAAC,uBAAuB;wBAClD,gBAAgB,EAAE,CAAC,CAAC,gBAAgB;wBACpC,oBAAoB,EAAE,CAAC,CAAC,oBAAoB;qBAC7C,CAAC;iBACH;YACH,CAAC,CAAC,CAAC;YACH,OAAO,aAAa,CAAC;QACvB,CAAC;KAAA;CACF;AArDD,mCAqDC"}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import { Track } from './Track';
|
2
|
+
export default abstract class RemoteTrack extends Track {
|
3
|
+
/** @internal */
|
4
|
+
receiver?: RTCRtpReceiver;
|
5
|
+
constructor(mediaTrack: MediaStreamTrack, sid: string, kind: Track.Kind, receiver?: RTCRtpReceiver);
|
6
|
+
/** @internal */
|
7
|
+
setMuted(muted: boolean): void;
|
8
|
+
/** @internal */
|
9
|
+
setMediaStream(stream: MediaStream): void;
|
10
|
+
start(): void;
|
11
|
+
stop(): void;
|
12
|
+
startMonitor(): void;
|
13
|
+
protected abstract monitorReceiver(): void;
|
14
|
+
}
|
@@ -0,0 +1,47 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
const events_1 = require("../events");
|
4
|
+
const stats_1 = require("../stats");
|
5
|
+
const Track_1 = require("./Track");
|
6
|
+
class RemoteTrack extends Track_1.Track {
|
7
|
+
constructor(mediaTrack, sid, kind, receiver) {
|
8
|
+
super(mediaTrack, kind);
|
9
|
+
this.sid = sid;
|
10
|
+
this.receiver = receiver;
|
11
|
+
}
|
12
|
+
/** @internal */
|
13
|
+
setMuted(muted) {
|
14
|
+
if (this.isMuted !== muted) {
|
15
|
+
this.isMuted = muted;
|
16
|
+
this.emit(muted ? events_1.TrackEvent.Muted : events_1.TrackEvent.Unmuted, this);
|
17
|
+
}
|
18
|
+
}
|
19
|
+
/** @internal */
|
20
|
+
setMediaStream(stream) {
|
21
|
+
// this is needed to determine when the track is finished
|
22
|
+
// we send each track down in its own MediaStream, so we can assume the
|
23
|
+
// current track is the only one that can be removed.
|
24
|
+
stream.onremovetrack = () => {
|
25
|
+
this.receiver = undefined;
|
26
|
+
this._currentBitrate = 0;
|
27
|
+
this.emit(events_1.TrackEvent.Ended, this);
|
28
|
+
};
|
29
|
+
}
|
30
|
+
start() {
|
31
|
+
this.startMonitor();
|
32
|
+
// use `enabled` of track to enable re-use of transceiver
|
33
|
+
super.enable();
|
34
|
+
}
|
35
|
+
stop() {
|
36
|
+
// use `enabled` of track to enable re-use of transceiver
|
37
|
+
super.disable();
|
38
|
+
}
|
39
|
+
/* @internal */
|
40
|
+
startMonitor() {
|
41
|
+
setTimeout(() => {
|
42
|
+
this.monitorReceiver();
|
43
|
+
}, stats_1.monitorFrequency);
|
44
|
+
}
|
45
|
+
}
|
46
|
+
exports.default = RemoteTrack;
|
47
|
+
//# sourceMappingURL=RemoteTrack.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"RemoteTrack.js","sourceRoot":"","sources":["../../../src/room/track/RemoteTrack.ts"],"names":[],"mappings":";;AAAA,sCAAuC;AACvC,oCAA4C;AAC5C,mCAAgC;AAEhC,MAA8B,WAAY,SAAQ,aAAK;IAIrD,YACE,UAA4B,EAC5B,GAAW,EACX,IAAgB,EAChB,QAAyB;QAEzB,KAAK,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,gBAAgB;IAChB,QAAQ,CAAC,KAAc;QACrB,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE;YAC1B,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAU,CAAC,KAAK,CAAC,CAAC,CAAC,mBAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;SAChE;IACH,CAAC;IAED,gBAAgB;IAChB,cAAc,CAAC,MAAmB;QAChC,yDAAyD;QACzD,uEAAuE;QACvE,qDAAqD;QACrD,MAAM,CAAC,aAAa,GAAG,GAAG,EAAE;YAC1B,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;YAC1B,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,mBAAU,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC,CAAC;IACJ,CAAC;IAED,KAAK;QACH,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,yDAAyD;QACzD,KAAK,CAAC,MAAM,EAAE,CAAC;IACjB,CAAC;IAED,IAAI;QACF,yDAAyD;QACzD,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;IAED,eAAe;IACf,YAAY;QACV,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC,EAAE,wBAAgB,CAAC,CAAC;IACvB,CAAC;CAGF;AAtDD,8BAsDC"}
|
@@ -1,10 +1,11 @@
|
|
1
|
-
import { TrackInfo } from '../../proto/livekit_models';
|
2
|
-
import { VideoQuality } from '../../proto/livekit_rtc';
|
1
|
+
import { TrackInfo, VideoQuality } from '../../proto/livekit_models';
|
3
2
|
import { Track } from './Track';
|
4
|
-
import TrackPublication from './TrackPublication';
|
3
|
+
import { TrackPublication } from './TrackPublication';
|
5
4
|
import { RemoteTrack } from './types';
|
6
5
|
export default class RemoteTrackPublication extends TrackPublication {
|
7
6
|
track?: RemoteTrack;
|
7
|
+
/** @internal */
|
8
|
+
_allowed: boolean;
|
8
9
|
protected subscribed?: boolean;
|
9
10
|
protected disabled: boolean;
|
10
11
|
protected currentVideoQuality?: VideoQuality;
|
@@ -14,6 +15,10 @@ export default class RemoteTrackPublication extends TrackPublication {
|
|
14
15
|
* @param subscribed true to subscribe to a track, false to unsubscribe
|
15
16
|
*/
|
16
17
|
setSubscribed(subscribed: boolean): void;
|
18
|
+
get subscriptionStatus(): TrackPublication.SubscriptionStatus;
|
19
|
+
/**
|
20
|
+
* Returns true if track is subscribed, and ready for playback
|
21
|
+
*/
|
17
22
|
get isSubscribed(): boolean;
|
18
23
|
get isEnabled(): boolean;
|
19
24
|
/**
|
@@ -36,7 +41,8 @@ export default class RemoteTrackPublication extends TrackPublication {
|
|
36
41
|
setTrack(track?: Track): void;
|
37
42
|
/** @internal */
|
38
43
|
updateInfo(info: TrackInfo): void;
|
39
|
-
protected
|
44
|
+
protected handleEnded: (track: RemoteTrack) => void;
|
45
|
+
protected get isAdaptiveStream(): boolean;
|
40
46
|
protected handleVisibilityChange: (visible: boolean) => void;
|
41
47
|
protected handleVideoDimensionsChange: (dimensions: Track.Dimensions) => void;
|
42
48
|
protected emitTrackUpdate(): void;
|
@@ -4,22 +4,28 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
4
|
};
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
6
6
|
const logger_1 = __importDefault(require("../../logger"));
|
7
|
+
const livekit_models_1 = require("../../proto/livekit_models");
|
7
8
|
const livekit_rtc_1 = require("../../proto/livekit_rtc");
|
8
9
|
const events_1 = require("../events");
|
9
10
|
const RemoteVideoTrack_1 = __importDefault(require("./RemoteVideoTrack"));
|
10
|
-
const TrackPublication_1 =
|
11
|
-
class RemoteTrackPublication extends TrackPublication_1.
|
11
|
+
const TrackPublication_1 = require("./TrackPublication");
|
12
|
+
class RemoteTrackPublication extends TrackPublication_1.TrackPublication {
|
12
13
|
constructor() {
|
13
14
|
super(...arguments);
|
15
|
+
/** @internal */
|
16
|
+
this._allowed = true;
|
14
17
|
this.disabled = false;
|
15
|
-
this.currentVideoQuality =
|
18
|
+
this.currentVideoQuality = livekit_models_1.VideoQuality.HIGH;
|
19
|
+
this.handleEnded = (track) => {
|
20
|
+
this.emit(events_1.TrackEvent.Ended, track);
|
21
|
+
};
|
16
22
|
this.handleVisibilityChange = (visible) => {
|
17
|
-
logger_1.default.debug(
|
23
|
+
logger_1.default.debug('adaptivestream video visibility', this.trackSid, `visible=${visible}`);
|
18
24
|
this.disabled = !visible;
|
19
25
|
this.emitTrackUpdate();
|
20
26
|
};
|
21
27
|
this.handleVideoDimensionsChange = (dimensions) => {
|
22
|
-
logger_1.default.debug(
|
28
|
+
logger_1.default.debug('adaptivestream video dimensions', this.trackSid, `${dimensions.width}x${dimensions.height}`);
|
23
29
|
this.videoDimensions = dimensions;
|
24
30
|
this.emitTrackUpdate();
|
25
31
|
};
|
@@ -33,13 +39,29 @@ class RemoteTrackPublication extends TrackPublication_1.default {
|
|
33
39
|
const sub = {
|
34
40
|
trackSids: [this.trackSid],
|
35
41
|
subscribe: this.subscribed,
|
42
|
+
participantTracks: [],
|
36
43
|
};
|
37
44
|
this.emit(events_1.TrackEvent.UpdateSubscription, sub);
|
38
45
|
}
|
46
|
+
get subscriptionStatus() {
|
47
|
+
if (this.subscribed === false || !super.isSubscribed) {
|
48
|
+
return TrackPublication_1.TrackPublication.SubscriptionStatus.Unsubscribed;
|
49
|
+
}
|
50
|
+
if (!this._allowed) {
|
51
|
+
return TrackPublication_1.TrackPublication.SubscriptionStatus.NotAllowed;
|
52
|
+
}
|
53
|
+
return TrackPublication_1.TrackPublication.SubscriptionStatus.Subscribed;
|
54
|
+
}
|
55
|
+
/**
|
56
|
+
* Returns true if track is subscribed, and ready for playback
|
57
|
+
*/
|
39
58
|
get isSubscribed() {
|
40
59
|
if (this.subscribed === false) {
|
41
60
|
return false;
|
42
61
|
}
|
62
|
+
if (!this._allowed) {
|
63
|
+
return false;
|
64
|
+
}
|
43
65
|
return super.isSubscribed;
|
44
66
|
}
|
45
67
|
get isEnabled() {
|
@@ -52,10 +74,10 @@ class RemoteTrackPublication extends TrackPublication_1.default {
|
|
52
74
|
* @param enabled
|
53
75
|
*/
|
54
76
|
setEnabled(enabled) {
|
55
|
-
if (this.
|
77
|
+
if (this.isAdaptiveStream || !this.isSubscribed || this.disabled === !enabled) {
|
56
78
|
return;
|
57
79
|
}
|
58
|
-
if (this.track instanceof RemoteVideoTrack_1.default && this.track.
|
80
|
+
if (this.track instanceof RemoteVideoTrack_1.default && this.track.isAdaptiveStream) {
|
59
81
|
return;
|
60
82
|
}
|
61
83
|
this.disabled = !enabled;
|
@@ -69,7 +91,7 @@ class RemoteTrackPublication extends TrackPublication_1.default {
|
|
69
91
|
* optimize for uninterrupted video
|
70
92
|
*/
|
71
93
|
setVideoQuality(quality) {
|
72
|
-
if (this.
|
94
|
+
if (this.isAdaptiveStream || !this.isSubscribed || this.currentVideoQuality === quality) {
|
73
95
|
return;
|
74
96
|
}
|
75
97
|
this.currentVideoQuality = quality;
|
@@ -78,7 +100,7 @@ class RemoteTrackPublication extends TrackPublication_1.default {
|
|
78
100
|
}
|
79
101
|
setVideoDimensions(dimensions) {
|
80
102
|
var _a, _b;
|
81
|
-
if (!this.isSubscribed || this.
|
103
|
+
if (!this.isSubscribed || this.isAdaptiveStream) {
|
82
104
|
return;
|
83
105
|
}
|
84
106
|
if (((_a = this.videoDimensions) === null || _a === void 0 ? void 0 : _a.width) === dimensions.width
|
@@ -95,15 +117,19 @@ class RemoteTrackPublication extends TrackPublication_1.default {
|
|
95
117
|
return this.currentVideoQuality;
|
96
118
|
}
|
97
119
|
setTrack(track) {
|
98
|
-
var _a, _b;
|
99
120
|
if (this.track) {
|
100
121
|
// unregister listener
|
101
122
|
this.track.off(events_1.TrackEvent.VideoDimensionsChanged, this.handleVideoDimensionsChange);
|
102
123
|
this.track.off(events_1.TrackEvent.VisibilityChanged, this.handleVisibilityChange);
|
124
|
+
this.track.off(events_1.TrackEvent.Ended, this.handleEnded);
|
103
125
|
}
|
104
126
|
super.setTrack(track);
|
105
|
-
(
|
106
|
-
|
127
|
+
if (track) {
|
128
|
+
track.sid = this.trackSid;
|
129
|
+
track.on(events_1.TrackEvent.VideoDimensionsChanged, this.handleVideoDimensionsChange);
|
130
|
+
track.on(events_1.TrackEvent.VisibilityChanged, this.handleVisibilityChange);
|
131
|
+
track.on(events_1.TrackEvent.Ended, this.handleEnded);
|
132
|
+
}
|
107
133
|
}
|
108
134
|
/** @internal */
|
109
135
|
updateInfo(info) {
|
@@ -112,8 +138,8 @@ class RemoteTrackPublication extends TrackPublication_1.default {
|
|
112
138
|
this.metadataMuted = info.muted;
|
113
139
|
(_a = this.track) === null || _a === void 0 ? void 0 : _a.setMuted(info.muted);
|
114
140
|
}
|
115
|
-
get
|
116
|
-
return this.track instanceof RemoteVideoTrack_1.default && this.track.
|
141
|
+
get isAdaptiveStream() {
|
142
|
+
return this.track instanceof RemoteVideoTrack_1.default && this.track.isAdaptiveStream;
|
117
143
|
}
|
118
144
|
emitTrackUpdate() {
|
119
145
|
const settings = livekit_rtc_1.UpdateTrackSettings.fromPartial({
|
@@ -129,7 +155,7 @@ class RemoteTrackPublication extends TrackPublication_1.default {
|
|
129
155
|
}
|
130
156
|
else {
|
131
157
|
// defaults to high quality
|
132
|
-
settings.quality =
|
158
|
+
settings.quality = livekit_models_1.VideoQuality.HIGH;
|
133
159
|
}
|
134
160
|
this.emit(events_1.TrackEvent.UpdateSettings, settings);
|
135
161
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"RemoteTrackPublication.js","sourceRoot":"","sources":["../../../src/room/track/RemoteTrackPublication.ts"],"names":[],"mappings":";;;;;AAAA,0DAA+B;
|
1
|
+
{"version":3,"file":"RemoteTrackPublication.js","sourceRoot":"","sources":["../../../src/room/track/RemoteTrackPublication.ts"],"names":[],"mappings":"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"}
|
@@ -1,26 +1,24 @@
|
|
1
|
-
import
|
2
|
-
export default class RemoteVideoTrack extends
|
1
|
+
import RemoteTrack from './RemoteTrack';
|
2
|
+
export default class RemoteVideoTrack extends RemoteTrack {
|
3
3
|
/** @internal */
|
4
4
|
receiver?: RTCRtpReceiver;
|
5
5
|
private prevStats?;
|
6
6
|
private elementInfos;
|
7
|
-
private
|
7
|
+
private adaptiveStream?;
|
8
8
|
private lastVisible?;
|
9
9
|
private lastDimensions?;
|
10
|
-
constructor(mediaTrack: MediaStreamTrack, sid: string, receiver?: RTCRtpReceiver,
|
11
|
-
get
|
10
|
+
constructor(mediaTrack: MediaStreamTrack, sid: string, receiver?: RTCRtpReceiver, adaptiveStream?: boolean);
|
11
|
+
get isAdaptiveStream(): boolean;
|
12
12
|
/** @internal */
|
13
13
|
setMuted(muted: boolean): void;
|
14
14
|
attach(): HTMLMediaElement;
|
15
15
|
attach(element: HTMLMediaElement): HTMLMediaElement;
|
16
16
|
detach(): HTMLMediaElement[];
|
17
17
|
detach(element: HTMLMediaElement): HTMLMediaElement;
|
18
|
-
|
19
|
-
|
18
|
+
protected monitorReceiver: () => Promise<void>;
|
19
|
+
private getReceiverStats;
|
20
20
|
private stopObservingElement;
|
21
21
|
private handleVisibilityChanged;
|
22
|
-
private readonly debouncedHandleVisibilityChanged;
|
23
|
-
private handleResize;
|
24
22
|
private readonly debouncedHandleResize;
|
25
23
|
private updateVisibility;
|
26
24
|
private updateDimensions;
|
@@ -1,14 +1,42 @@
|
|
1
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
|
+
};
|
2
14
|
Object.defineProperty(exports, "__esModule", { value: true });
|
3
15
|
const ts_debounce_1 = require("ts-debounce");
|
4
16
|
const events_1 = require("../events");
|
17
|
+
const stats_1 = require("../stats");
|
5
18
|
const utils_1 = require("../utils");
|
19
|
+
const RemoteTrack_1 = __importDefault(require("./RemoteTrack"));
|
6
20
|
const Track_1 = require("./Track");
|
7
|
-
const REACTION_DELAY =
|
8
|
-
class RemoteVideoTrack extends
|
9
|
-
constructor(mediaTrack, sid, receiver,
|
10
|
-
super(mediaTrack, Track_1.Track.Kind.Video);
|
21
|
+
const REACTION_DELAY = 100;
|
22
|
+
class RemoteVideoTrack extends RemoteTrack_1.default {
|
23
|
+
constructor(mediaTrack, sid, receiver, adaptiveStream) {
|
24
|
+
super(mediaTrack, sid, Track_1.Track.Kind.Video, receiver);
|
11
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
|
+
});
|
12
40
|
this.handleVisibilityChanged = (entry) => {
|
13
41
|
const { target, isIntersecting } = entry;
|
14
42
|
const elementInfo = this.elementInfos.find((info) => info.element === target);
|
@@ -18,32 +46,18 @@ class RemoteVideoTrack extends Track_1.Track {
|
|
18
46
|
}
|
19
47
|
this.updateVisibility();
|
20
48
|
};
|
21
|
-
this.
|
22
|
-
this.handleResize = (entry) => {
|
23
|
-
const { target, contentRect } = entry;
|
24
|
-
const elementInfo = this.elementInfos.find((info) => info.element === target);
|
25
|
-
if (elementInfo) {
|
26
|
-
elementInfo.width = contentRect.width;
|
27
|
-
elementInfo.height = contentRect.height;
|
28
|
-
}
|
49
|
+
this.debouncedHandleResize = ts_debounce_1.debounce(() => {
|
29
50
|
this.updateDimensions();
|
30
|
-
};
|
31
|
-
this.
|
32
|
-
// override id to parsed ID
|
33
|
-
this.sid = sid;
|
34
|
-
this.receiver = receiver;
|
35
|
-
this.autoManaged = autoManaged;
|
51
|
+
}, REACTION_DELAY);
|
52
|
+
this.adaptiveStream = adaptiveStream;
|
36
53
|
}
|
37
|
-
get
|
54
|
+
get isAdaptiveStream() {
|
38
55
|
var _a;
|
39
|
-
return (_a = this.
|
56
|
+
return (_a = this.adaptiveStream) !== null && _a !== void 0 ? _a : false;
|
40
57
|
}
|
41
58
|
/** @internal */
|
42
59
|
setMuted(muted) {
|
43
|
-
|
44
|
-
this.isMuted = muted;
|
45
|
-
this.emit(muted ? events_1.TrackEvent.Muted : events_1.TrackEvent.Unmuted, this);
|
46
|
-
}
|
60
|
+
super.setMuted(muted);
|
47
61
|
this.attachedElements.forEach((element) => {
|
48
62
|
// detach or attach
|
49
63
|
if (muted) {
|
@@ -58,18 +72,18 @@ class RemoteVideoTrack extends Track_1.Track {
|
|
58
72
|
if (!element) {
|
59
73
|
element = super.attach();
|
60
74
|
}
|
61
|
-
|
62
|
-
|
75
|
+
else {
|
76
|
+
super.attach(element);
|
77
|
+
}
|
78
|
+
if (this.adaptiveStream) {
|
63
79
|
this.elementInfos.push({
|
64
80
|
element,
|
65
|
-
visible: true,
|
66
|
-
width: element.clientWidth,
|
67
|
-
height: element.clientHeight,
|
81
|
+
visible: true, // default visible
|
68
82
|
});
|
69
83
|
element
|
70
84
|
.handleResize = this.debouncedHandleResize;
|
71
85
|
element
|
72
|
-
.handleVisibilityChanged = this.
|
86
|
+
.handleVisibilityChanged = this.handleVisibilityChanged;
|
73
87
|
utils_1.getIntersectionObserver().observe(element);
|
74
88
|
utils_1.getResizeObserver().observe(element);
|
75
89
|
}
|
@@ -78,7 +92,7 @@ class RemoteVideoTrack extends Track_1.Track {
|
|
78
92
|
detach(element) {
|
79
93
|
let detachedElements = [];
|
80
94
|
if (element) {
|
81
|
-
|
95
|
+
this.stopObservingElement(element);
|
82
96
|
return super.detach(element);
|
83
97
|
}
|
84
98
|
detachedElements = super.detach();
|
@@ -87,13 +101,35 @@ class RemoteVideoTrack extends Track_1.Track {
|
|
87
101
|
}
|
88
102
|
return detachedElements;
|
89
103
|
}
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
104
|
+
getReceiverStats() {
|
105
|
+
return __awaiter(this, void 0, void 0, function* () {
|
106
|
+
if (!this.receiver) {
|
107
|
+
return;
|
108
|
+
}
|
109
|
+
const stats = yield this.receiver.getStats();
|
110
|
+
let receiverStats;
|
111
|
+
stats.forEach((v) => {
|
112
|
+
if (v.type === 'inbound-rtp') {
|
113
|
+
receiverStats = {
|
114
|
+
type: 'video',
|
115
|
+
framesDecoded: v.framesDecoded,
|
116
|
+
framesDropped: v.framesDropped,
|
117
|
+
framesReceived: v.framesReceived,
|
118
|
+
packetsReceived: v.packetsReceived,
|
119
|
+
packetsLost: v.packetsLost,
|
120
|
+
frameWidth: v.frameWidth,
|
121
|
+
frameHeight: v.frameHeight,
|
122
|
+
pliCount: v.pliCount,
|
123
|
+
firCount: v.firCount,
|
124
|
+
nackCount: v.nackCount,
|
125
|
+
jitter: v.jitter,
|
126
|
+
timestamp: v.timestamp,
|
127
|
+
bytesReceived: v.bytesReceived,
|
128
|
+
};
|
129
|
+
}
|
130
|
+
});
|
131
|
+
return receiverStats;
|
132
|
+
});
|
97
133
|
}
|
98
134
|
stopObservingElement(element) {
|
99
135
|
var _a, _b;
|
@@ -123,9 +159,9 @@ class RemoteVideoTrack extends Track_1.Track {
|
|
123
159
|
let maxHeight = 0;
|
124
160
|
for (const info of this.elementInfos) {
|
125
161
|
if (info.visible) {
|
126
|
-
if (info.
|
127
|
-
maxWidth = info.
|
128
|
-
maxHeight = info.
|
162
|
+
if (info.element.clientWidth + info.element.clientHeight > maxWidth + maxHeight) {
|
163
|
+
maxWidth = info.element.clientWidth;
|
164
|
+
maxHeight = info.element.clientHeight;
|
129
165
|
}
|
130
166
|
}
|
131
167
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"RemoteVideoTrack.js","sourceRoot":"","sources":["../../../src/room/track/RemoteVideoTrack.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"RemoteVideoTrack.js","sourceRoot":"","sources":["../../../src/room/track/RemoteVideoTrack.ts"],"names":[],"mappings":"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"}
|