UNPKG

mediasoup-client

Version:

mediasoup client side TypeScript library

210 lines (209 loc) 5.07 kB
"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;