UNPKG

msc-node

Version:

mediasoup client side Node.js library

174 lines (173 loc) 4.56 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DataConsumer = void 0; const Logger_1 = require("./Logger"); const EnhancedEventEmitter_1 = require("./EnhancedEventEmitter"); const logger = new Logger_1.Logger('DataConsumer'); class DataConsumer extends EnhancedEventEmitter_1.EnhancedEventEmitter { /** * @emits transportclose * @emits open * @emits error - (error: Error) * @emits close * @emits message - (message: any) * @emits @close */ constructor({ id, dataProducerId, dataChannel, sctpStreamParameters, appData }) { super(); // Closed flag. this._closed = false; // Observer instance. this._observer = new EnhancedEventEmitter_1.EnhancedEventEmitter(); logger.debug('constructor()'); this._id = id; this._dataProducerId = dataProducerId; this._dataChannel = dataChannel; this._sctpStreamParameters = sctpStreamParameters; this._appData = appData; this._handleDataChannel(); } /** * DataConsumer id. */ get id() { return this._id; } /** * Associated DataProducer id. */ get dataProducerId() { return this._dataProducerId; } /** * Whether the DataConsumer is closed. */ get closed() { return this._closed; } /** * SCTP stream parameters. */ get sctpStreamParameters() { return this._sctpStreamParameters; } /** * DataChannel readyState. */ get readyState() { return this._dataChannel.readyState; } /** * DataChannel label. */ get label() { return this._dataChannel.label; } /** * DataChannel protocol. */ get protocol() { return this._dataChannel.protocol; } /** * DataChannel binaryType. */ get binaryType() { return this._dataChannel.binaryType; } /** * Set DataChannel binaryType. */ set binaryType(binaryType) { this._dataChannel.binaryType = binaryType; } /** * App custom data. */ get appData() { return this._appData; } /** * Invalid setter. */ set appData(appData) { throw new Error('cannot override appData object'); } /** * Observer. * * @emits close */ get observer() { return this._observer; } /** * Closes the DataConsumer. */ close() { if (this._closed) { return; } logger.debug('close()'); this._closed = true; this._dataChannel.close(); this.emit('@close'); // Emit observer event. this._observer.safeEmit('close'); } /** * Transport was closed. */ transportClosed() { if (this._closed) { return; } logger.debug('transportClosed()'); this._closed = true; this._dataChannel.close(); this.safeEmit('transportclose'); // Emit observer event. this._observer.safeEmit('close'); } _handleDataChannel() { this._dataChannel.addEventListener('open', () => { if (this._closed) { return; } logger.debug('DataChannel "open" event'); this.safeEmit('open'); }); this._dataChannel.addEventListener('error', (event) => { if (this._closed) { return; } let { error } = event; if (!error) { error = new Error('unknown DataChannel error'); } if (error.errorDetail === 'sctp-failure') { logger.error('DataChannel SCTP error [sctpCauseCode:%s]: %s', error.sctpCauseCode, error.message); } else { logger.error('DataChannel "error" event: %o', error); } this.safeEmit('error', error); }); this._dataChannel.addEventListener('close', () => { if (this._closed) { return; } logger.warn('DataChannel "close" event'); this._closed = true; this.emit('@close'); this.safeEmit('close'); }); this._dataChannel.addEventListener('message', (event) => { if (this._closed) { return; } this.safeEmit('message', event.data); }); } } exports.DataConsumer = DataConsumer;