mediasoup-client
Version:
mediasoup client side TypeScript library
210 lines (209 loc) • 5.07 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Consumer = void 0;
const Logger_1 = require("./Logger");
const enhancedEvents_1 = require("./enhancedEvents");
const errors_1 = require("./errors");
const logger = new Logger_1.Logger('Consumer');
class Consumer extends enhancedEvents_1.EnhancedEventEmitter {
// Id.
_id;
// Local id.
_localId;
// Associated Producer id.
_producerId;
// Closed flag.
_closed = false;
// Associated RTCRtpReceiver.
_rtpReceiver;
// Remote track.
_track;
// RTP parameters.
_rtpParameters;
// Paused flag.
_paused;
// App custom data.
_appData;
// Observer instance.
_observer = new enhancedEvents_1.EnhancedEventEmitter();
constructor({ id, localId, producerId, rtpReceiver, track, rtpParameters, appData, }) {
super();
logger.debug('constructor()');
this._id = id;
this._localId = localId;
this._producerId = producerId;
this._rtpReceiver = rtpReceiver;
this._track = track;
this._rtpParameters = rtpParameters;
this._paused = !track.enabled;
this._appData = appData ?? {};
this.onTrackEnded = this.onTrackEnded.bind(this);
this.handleTrack();
}
/**
* Consumer id.
*/
get id() {
return this._id;
}
/**
* Local id.
*/
get localId() {
return this._localId;
}
/**
* Associated Producer id.
*/
get producerId() {
return this._producerId;
}
/**
* Whether the Consumer is closed.
*/
get closed() {
return this._closed;
}
/**
* Media kind.
*/
get kind() {
return this._track.kind;
}
/**
* Associated RTCRtpReceiver.
*/
get rtpReceiver() {
return this._rtpReceiver;
}
/**
* The associated track.
*/
get track() {
return this._track;
}
/**
* RTP parameters.
*/
get rtpParameters() {
return this._rtpParameters;
}
/**
* Whether the Consumer is paused.
*/
get paused() {
return this._paused;
}
/**
* App custom data.
*/
get appData() {
return this._appData;
}
/**
* App custom data setter.
*/
set appData(appData) {
this._appData = appData;
}
get observer() {
return this._observer;
}
/**
* Closes the Consumer.
*/
close() {
if (this._closed) {
return;
}
logger.debug('close()');
this._closed = true;
this.destroyTrack();
this.emit('@close');
// Emit observer event.
this._observer.safeEmit('close');
// Invoke close() in EnhancedEventEmitter classes.
super.close();
this._observer.close();
}
/**
* Transport was closed.
*/
transportClosed() {
if (this._closed) {
return;
}
logger.debug('transportClosed()');
this._closed = true;
this.destroyTrack();
this.safeEmit('transportclose');
// Emit observer event.
this._observer.safeEmit('close');
}
/**
* Get associated RTCRtpReceiver stats.
*/
async getStats() {
if (this._closed) {
throw new errors_1.InvalidStateError('closed');
}
return new Promise((resolve, reject) => {
this.safeEmit('@getstats', resolve, reject);
});
}
/**
* Pauses receiving media.
*/
pause() {
logger.debug('pause()');
if (this._closed) {
logger.error('pause() | Consumer closed');
return;
}
if (this._paused) {
logger.debug('pause() | Consumer is already paused');
return;
}
this._paused = true;
this._track.enabled = false;
this.emit('@pause');
// Emit observer event.
this._observer.safeEmit('pause');
}
/**
* Resumes receiving media.
*/
resume() {
logger.debug('resume()');
if (this._closed) {
logger.error('resume() | Consumer closed');
return;
}
if (!this._paused) {
logger.debug('resume() | Consumer is already resumed');
return;
}
this._paused = false;
this._track.enabled = true;
this.emit('@resume');
// Emit observer event.
this._observer.safeEmit('resume');
}
onTrackEnded() {
logger.debug('track "ended" event');
this.safeEmit('trackended');
// Emit observer event.
this._observer.safeEmit('trackended');
}
handleTrack() {
this._track.addEventListener('ended', this.onTrackEnded);
}
destroyTrack() {
try {
this._track.removeEventListener('ended', this.onTrackEnded);
this._track.stop();
}
catch (error) { }
}
}
exports.Consumer = Consumer;