mediasoup-client
Version:
mediasoup client side TypeScript library
190 lines (189 loc) • 5.31 kB
JavaScript
"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;