msc-node
Version:
mediasoup client side Node.js library
174 lines (173 loc) • 4.56 kB
JavaScript
"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;