Skip to content

Commit

Permalink
WebRtcServer (#834)
Browse files Browse the repository at this point in the history
Co-authored-by: José Luis Millán <jmillan@aliax.net>
  • Loading branch information
ibc and jmillan authored Jun 22, 2022
1 parent 9490867 commit 5c85860
Show file tree
Hide file tree
Showing 50 changed files with 2,710 additions and 143 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
### WIP

* More SRTP crypto suites (PR #837).
* Improve `EnhancedEventEmitter` (PR #836).
* `WebRtcServer`: A new class that brings to `WebRtcTransports` the ability to listen on a single UDP/TCP port (PR #834).
* `TransportCongestionControlClient`: Allow setting max outgoing bitrate before created (PR #833).


Expand Down
11 changes: 6 additions & 5 deletions node/lib/Router.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,11 @@ export declare class Router extends EnhancedEventEmitter<RouterEvents> {
* Observer.
*/
get observer(): EnhancedEventEmitter<RouterObserverEvents>;
/**
* @private
* Just for testing purposes.
*/
get transportsForTesting(): Map<string, Transport>;
/**
* Close the Router.
*/
Expand All @@ -142,15 +147,11 @@ export declare class Router extends EnhancedEventEmitter<RouterEvents> {
/**
* Create a WebRtcTransport.
*/
createWebRtcTransport({ listenIps, port, enableUdp, enableTcp, preferUdp, preferTcp, initialAvailableOutgoingBitrate, enableSctp, numSctpStreams, maxSctpMessageSize, sctpSendBufferSize, appData }: WebRtcTransportOptions): Promise<WebRtcTransport>;
createWebRtcTransport({ webRtcServer, listenIps, port, enableUdp, enableTcp, preferUdp, preferTcp, initialAvailableOutgoingBitrate, enableSctp, numSctpStreams, maxSctpMessageSize, sctpSendBufferSize, appData }: WebRtcTransportOptions): Promise<WebRtcTransport>;
/**
* Create a PlainTransport.
*/
createPlainTransport({ listenIp, port, rtcpMux, comedia, enableSctp, numSctpStreams, maxSctpMessageSize, sctpSendBufferSize, enableSrtp, srtpCryptoSuite, appData }: PlainTransportOptions): Promise<PlainTransport>;
/**
* DEPRECATED: Use createPlainTransport().
*/
createPlainRtpTransport(options: PlainTransportOptions): Promise<PlainTransport>;
/**
* Create a PipeTransport.
*/
Expand Down
2 changes: 1 addition & 1 deletion node/lib/Router.d.ts.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

70 changes: 44 additions & 26 deletions node/lib/Router.js
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,13 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter {
get observer() {
return this.#observer;
}
/**
* @private
* Just for testing purposes.
*/
get transportsForTesting() {
return this.#transports;
}
/**
* Close the Router.
*/
Expand Down Expand Up @@ -153,27 +160,37 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter {
/**
* Create a WebRtcTransport.
*/
async createWebRtcTransport({ listenIps, port, enableUdp = true, enableTcp = false, preferUdp = false, preferTcp = false, initialAvailableOutgoingBitrate = 600000, enableSctp = false, numSctpStreams = { OS: 1024, MIS: 1024 }, maxSctpMessageSize = 262144, sctpSendBufferSize = 262144, appData }) {
async createWebRtcTransport({ webRtcServer, listenIps, port, enableUdp = true, enableTcp = false, preferUdp = false, preferTcp = false, initialAvailableOutgoingBitrate = 600000, enableSctp = false, numSctpStreams = { OS: 1024, MIS: 1024 }, maxSctpMessageSize = 262144, sctpSendBufferSize = 262144, appData }) {
logger.debug('createWebRtcTransport()');
if (!Array.isArray(listenIps))
throw new TypeError('missing listenIps');
if (!webRtcServer && !Array.isArray(listenIps))
throw new TypeError('missing webRtcServer and listenIps (one of them is mandatory)');
else if (appData && typeof appData !== 'object')
throw new TypeError('if given, appData must be an object');
listenIps = listenIps.map((listenIp) => {
if (typeof listenIp === 'string' && listenIp) {
return { ip: listenIp };
}
else if (typeof listenIp === 'object') {
return {
ip: listenIp.ip,
announcedIp: listenIp.announcedIp || undefined
};
}
else {
throw new TypeError('wrong listenIp');
}
});
const internal = { ...this.#internal, transportId: (0, uuid_1.v4)() };
if (webRtcServer) {
listenIps = undefined;
port = undefined;
}
if (listenIps) {
listenIps = listenIps.map((listenIp) => {
if (typeof listenIp === 'string' && listenIp) {
return { ip: listenIp };
}
else if (typeof listenIp === 'object') {
return {
ip: listenIp.ip,
announcedIp: listenIp.announcedIp || undefined
};
}
else {
throw new TypeError('wrong listenIp');
}
});
}
const internal = {
...this.#internal,
transportId: (0, uuid_1.v4)(),
webRtcServerId: webRtcServer ? webRtcServer.id : undefined
};
const reqData = {
listenIps,
port,
Expand All @@ -188,7 +205,9 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter {
sctpSendBufferSize,
isDataChannel: true
};
const data = await this.#channel.request('router.createWebRtcTransport', internal, reqData);
const data = webRtcServer
? await this.#channel.request('router.createWebRtcTransportWithServer', internal, reqData)
: await this.#channel.request('router.createWebRtcTransport', internal, reqData);
const transport = new WebRtcTransport_1.WebRtcTransport({
internal,
data,
Expand All @@ -201,10 +220,13 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter {
});
this.#transports.set(transport.id, transport);
transport.on('@close', () => this.#transports.delete(transport.id));
transport.on('@listenserverclose', () => this.#transports.delete(transport.id));
transport.on('@newproducer', (producer) => this.#producers.set(producer.id, producer));
transport.on('@producerclose', (producer) => this.#producers.delete(producer.id));
transport.on('@newdataproducer', (dataProducer) => (this.#dataProducers.set(dataProducer.id, dataProducer)));
transport.on('@dataproducerclose', (dataProducer) => (this.#dataProducers.delete(dataProducer.id)));
if (webRtcServer)
webRtcServer.handleWebRtcTransport(transport);
// Emit observer event.
this.#observer.safeEmit('newtransport', transport);
return transport;
Expand Down Expand Up @@ -258,6 +280,7 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter {
});
this.#transports.set(transport.id, transport);
transport.on('@close', () => this.#transports.delete(transport.id));
transport.on('@listenserverclose', () => this.#transports.delete(transport.id));
transport.on('@newproducer', (producer) => this.#producers.set(producer.id, producer));
transport.on('@producerclose', (producer) => this.#producers.delete(producer.id));
transport.on('@newdataproducer', (dataProducer) => (this.#dataProducers.set(dataProducer.id, dataProducer)));
Expand All @@ -266,13 +289,6 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter {
this.#observer.safeEmit('newtransport', transport);
return transport;
}
/**
* DEPRECATED: Use createPlainTransport().
*/
async createPlainRtpTransport(options) {
logger.warn('createPlainRtpTransport() is DEPRECATED, use createPlainTransport()');
return this.createPlainTransport(options);
}
/**
* Create a PipeTransport.
*/
Expand Down Expand Up @@ -320,6 +336,7 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter {
});
this.#transports.set(transport.id, transport);
transport.on('@close', () => this.#transports.delete(transport.id));
transport.on('@listenserverclose', () => this.#transports.delete(transport.id));
transport.on('@newproducer', (producer) => this.#producers.set(producer.id, producer));
transport.on('@producerclose', (producer) => this.#producers.delete(producer.id));
transport.on('@newdataproducer', (dataProducer) => (this.#dataProducers.set(dataProducer.id, dataProducer)));
Expand Down Expand Up @@ -350,6 +367,7 @@ class Router extends EnhancedEventEmitter_1.EnhancedEventEmitter {
});
this.#transports.set(transport.id, transport);
transport.on('@close', () => this.#transports.delete(transport.id));
transport.on('@listenserverclose', () => this.#transports.delete(transport.id));
transport.on('@newproducer', (producer) => this.#producers.set(producer.id, producer));
transport.on('@producerclose', (producer) => this.#producers.delete(producer.id));
transport.on('@newdataproducer', (dataProducer) => (this.#dataProducers.set(dataProducer.id, dataProducer)));
Expand Down
9 changes: 9 additions & 0 deletions node/lib/Transport.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,14 @@ export interface TransportTraceEventData {
export declare type SctpState = 'new' | 'connecting' | 'connected' | 'failed' | 'closed';
export declare type TransportEvents = {
routerclose: [];
listenserverclose: [];
trace: [TransportTraceEventData];
'@close': [];
'@newproducer': [Producer];
'@producerclose': [Producer];
'@newdataproducer': [DataProducer];
'@dataproducerclose': [DataProducer];
'@listenserverclose': [];
};
export declare type TransportObserverEvents = {
close: [];
Expand Down Expand Up @@ -134,6 +136,13 @@ export declare class Transport<Events extends TransportEvents = TransportEvents,
* @virtual
*/
routerClosed(): void;
/**
* Listen server was closed (this just happens in WebRtcTransports when their
* associated WebRtcServer is closed).
*
* @private
*/
listenServerClosed(): void;
/**
* Dump Transport.
*/
Expand Down
Loading

0 comments on commit 5c85860

Please sign in to comment.