UNPKG

mediasoup-client

Version:

mediasoup client side TypeScript library

190 lines (189 loc) 5.31 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DataProducer = void 0; const Logger_1 = require("./Logger"); const enhancedEvents_1 = require("./enhancedEvents"); const errors_1 = require("./errors"); const logger = new Logger_1.Logger('DataProducer'); class DataProducer extends enhancedEvents_1.EnhancedEventEmitter { // Id. _id; // The underlying RTCDataChannel instance. _dataChannel; // Closed flag. _closed = false; // SCTP stream parameters. _sctpStreamParameters; // App custom data. _appData; // Observer instance. _observer = new enhancedEvents_1.EnhancedEventEmitter(); constructor({ id, dataChannel, sctpStreamParameters, appData, }) { super(); logger.debug('constructor()'); this._id = id; this._dataChannel = dataChannel; this._sctpStreamParameters = sctpStreamParameters; this._appData = appData ?? {}; this.handleDataChannel(); } /** * DataProducer id. */ get id() { return this._id; } /** * Whether the DataProducer 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 bufferedAmount. */ get bufferedAmount() { return this._dataChannel.bufferedAmount; } /** * DataChannel bufferedAmountLowThreshold. */ get bufferedAmountLowThreshold() { return this._dataChannel.bufferedAmountLowThreshold; } /** * Set DataChannel bufferedAmountLowThreshold. */ set bufferedAmountLowThreshold(bufferedAmountLowThreshold) { this._dataChannel.bufferedAmountLowThreshold = bufferedAmountLowThreshold; } /** * 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 DataProducer. */ close() { if (this._closed) { return; } logger.debug('close()'); this._closed = true; this._dataChannel.close(); 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._dataChannel.close(); this.safeEmit('transportclose'); // Emit observer event. this._observer.safeEmit('close'); } /** * Send a message. * * @param {String|Blob|ArrayBuffer|ArrayBufferView} data. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any send(data) { logger.debug('send()'); if (this._closed) { throw new errors_1.InvalidStateError('closed'); } this._dataChannel.send(data); } 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; } const error = event.error ?? new Error('unknown DataChannel error'); if (event.error?.errorDetail === 'sctp-failure') { logger.error('DataChannel SCTP error [sctpCauseCode:%s]: %s', event.error?.sctpCauseCode, event.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'); // Emit observer event. this._observer.safeEmit('close'); }); this._dataChannel.addEventListener('message', () => { if (this._closed) { return; } logger.warn('DataChannel "message" event in a DataProducer, message discarded'); }); this._dataChannel.addEventListener('bufferedamountlow', () => { if (this._closed) { return; } this.safeEmit('bufferedamountlow'); }); } } exports.DataProducer = DataProducer;