mediasoup
Version:
Cutting Edge WebRTC Video Conferencing
266 lines (265 loc) • 9.21 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.PlainTransport = void 0;
exports.parsePlainTransportDumpResponse = parsePlainTransportDumpResponse;
const Logger_1 = require("./Logger");
const enhancedEvents_1 = require("./enhancedEvents");
const Transport_1 = require("./Transport");
const SrtpParameters_1 = require("./SrtpParameters");
const notification_1 = require("./fbs/notification");
const FbsRequest = require("./fbs/request");
const FbsTransport = require("./fbs/transport");
const FbsPlainTransport = require("./fbs/plain-transport");
const logger = new Logger_1.Logger('PlainTransport');
class PlainTransport extends Transport_1.Transport {
// PlainTransport data.
#data;
/**
* @private
*/
constructor(options) {
const observer = new enhancedEvents_1.EnhancedEventEmitter();
super(options, observer);
logger.debug('constructor()');
const { data } = options;
this.#data = {
rtcpMux: data.rtcpMux,
comedia: data.comedia,
tuple: data.tuple,
rtcpTuple: data.rtcpTuple,
sctpParameters: data.sctpParameters,
sctpState: data.sctpState,
srtpParameters: data.srtpParameters,
};
this.handleWorkerNotifications();
}
/**
* Observer.
*
* @override
*/
get observer() {
return super.observer;
}
/**
* Transport tuple.
*/
get tuple() {
return this.#data.tuple;
}
/**
* Transport RTCP tuple.
*/
get rtcpTuple() {
return this.#data.rtcpTuple;
}
/**
* SCTP parameters.
*/
get sctpParameters() {
return this.#data.sctpParameters;
}
/**
* SCTP state.
*/
get sctpState() {
return this.#data.sctpState;
}
/**
* SRTP parameters.
*/
get srtpParameters() {
return this.#data.srtpParameters;
}
/**
* Close the PlainTransport.
*
* @override
*/
close() {
if (this.closed) {
return;
}
if (this.#data.sctpState) {
this.#data.sctpState = 'closed';
}
super.close();
}
/**
* Router was closed.
*
* @private
* @override
*/
routerClosed() {
if (this.closed) {
return;
}
if (this.#data.sctpState) {
this.#data.sctpState = 'closed';
}
super.routerClosed();
}
/**
* Dump Transport.
*/
async dump() {
logger.debug('dump()');
const response = await this.channel.request(FbsRequest.Method.TRANSPORT_DUMP, undefined, undefined, this.internal.transportId);
/* Decode Response. */
const data = new FbsPlainTransport.DumpResponse();
response.body(data);
return parsePlainTransportDumpResponse(data);
}
/**
* Get PlainTransport stats.
*
* @override
*/
async getStats() {
logger.debug('getStats()');
const response = await this.channel.request(FbsRequest.Method.TRANSPORT_GET_STATS, undefined, undefined, this.internal.transportId);
/* Decode Response. */
const data = new FbsPlainTransport.GetStatsResponse();
response.body(data);
return [parseGetStatsResponse(data)];
}
/**
* Provide the PlainTransport remote parameters.
*
* @override
*/
async connect({ ip, port, rtcpPort, srtpParameters, }) {
logger.debug('connect()');
const requestOffset = createConnectRequest({
builder: this.channel.bufferBuilder,
ip,
port,
rtcpPort,
srtpParameters,
});
// Wait for response.
const response = await this.channel.request(FbsRequest.Method.PLAINTRANSPORT_CONNECT, FbsRequest.Body.PlainTransport_ConnectRequest, requestOffset, this.internal.transportId);
/* Decode Response. */
const data = new FbsPlainTransport.ConnectResponse();
response.body(data);
// Update data.
if (data.tuple()) {
this.#data.tuple = (0, Transport_1.parseTuple)(data.tuple());
}
if (data.rtcpTuple()) {
this.#data.rtcpTuple = (0, Transport_1.parseTuple)(data.rtcpTuple());
}
if (data.srtpParameters()) {
this.#data.srtpParameters = (0, SrtpParameters_1.parseSrtpParameters)(data.srtpParameters());
}
}
handleWorkerNotifications() {
this.channel.on(this.internal.transportId, (event, data) => {
switch (event) {
case notification_1.Event.PLAINTRANSPORT_TUPLE: {
const notification = new FbsPlainTransport.TupleNotification();
data.body(notification);
const tuple = (0, Transport_1.parseTuple)(notification.tuple());
this.#data.tuple = tuple;
this.safeEmit('tuple', tuple);
// Emit observer event.
this.observer.safeEmit('tuple', tuple);
break;
}
case notification_1.Event.PLAINTRANSPORT_RTCP_TUPLE: {
const notification = new FbsPlainTransport.RtcpTupleNotification();
data.body(notification);
const rtcpTuple = (0, Transport_1.parseTuple)(notification.tuple());
this.#data.rtcpTuple = rtcpTuple;
this.safeEmit('rtcptuple', rtcpTuple);
// Emit observer event.
this.observer.safeEmit('rtcptuple', rtcpTuple);
break;
}
case notification_1.Event.TRANSPORT_SCTP_STATE_CHANGE: {
const notification = new FbsTransport.SctpStateChangeNotification();
data.body(notification);
const sctpState = (0, Transport_1.parseSctpState)(notification.sctpState());
this.#data.sctpState = sctpState;
this.safeEmit('sctpstatechange', sctpState);
// Emit observer event.
this.observer.safeEmit('sctpstatechange', sctpState);
break;
}
case notification_1.Event.TRANSPORT_TRACE: {
const notification = new FbsTransport.TraceNotification();
data.body(notification);
const trace = (0, Transport_1.parseTransportTraceEventData)(notification);
this.safeEmit('trace', trace);
// Emit observer event.
this.observer.safeEmit('trace', trace);
break;
}
default: {
logger.error('ignoring unknown event "%s"', event);
}
}
});
}
}
exports.PlainTransport = PlainTransport;
function parsePlainTransportDumpResponse(binary) {
// Retrieve BaseTransportDump.
const baseTransportDump = (0, Transport_1.parseBaseTransportDump)(binary.base());
// Retrieve RTP Tuple.
const tuple = (0, Transport_1.parseTuple)(binary.tuple());
// Retrieve RTCP Tuple.
let rtcpTuple;
if (binary.rtcpTuple()) {
rtcpTuple = (0, Transport_1.parseTuple)(binary.rtcpTuple());
}
// Retrieve SRTP Parameters.
let srtpParameters;
if (binary.srtpParameters()) {
srtpParameters = (0, SrtpParameters_1.parseSrtpParameters)(binary.srtpParameters());
}
return {
...baseTransportDump,
rtcpMux: binary.rtcpMux(),
comedia: binary.comedia(),
tuple: tuple,
rtcpTuple: rtcpTuple,
srtpParameters: srtpParameters,
};
}
function parseGetStatsResponse(binary) {
const base = (0, Transport_1.parseBaseTransportStats)(binary.base());
return {
...base,
type: 'plain-rtp-transport',
rtcpMux: binary.rtcpMux(),
comedia: binary.comedia(),
tuple: (0, Transport_1.parseTuple)(binary.tuple()),
rtcpTuple: binary.rtcpTuple() ? (0, Transport_1.parseTuple)(binary.rtcpTuple()) : undefined,
};
}
function createConnectRequest({ builder, ip, port, rtcpPort, srtpParameters, }) {
let ipOffset = 0;
let srtpParametersOffset = 0;
if (ip) {
ipOffset = builder.createString(ip);
}
// Serialize SrtpParameters.
if (srtpParameters) {
srtpParametersOffset = (0, SrtpParameters_1.serializeSrtpParameters)(builder, srtpParameters);
}
// Create PlainTransportConnectData.
FbsPlainTransport.ConnectRequest.startConnectRequest(builder);
FbsPlainTransport.ConnectRequest.addIp(builder, ipOffset);
if (typeof port === 'number') {
FbsPlainTransport.ConnectRequest.addPort(builder, port);
}
if (typeof rtcpPort === 'number') {
FbsPlainTransport.ConnectRequest.addRtcpPort(builder, rtcpPort);
}
if (srtpParameters) {
FbsPlainTransport.ConnectRequest.addSrtpParameters(builder, srtpParametersOffset);
}
return FbsPlainTransport.ConnectRequest.endConnectRequest(builder);
}