diff --git a/CHANGELOG.md b/CHANGELOG.md index e4cc3c1266..0bb31b2e6e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ * `RtpStreamSend`: Reset RTP retransmission buffer upon RTP sequence number reset ([PR #1041](https://github.com/versatica/mediasoup/pull/1041)). * `RtpRetransmissionBuffer`: Handle corner case in which received packet has lower seq than newest packet in the buffer but higher timestamp ([PR #1044](https://github.com/versatica/mediasoup/pull/1044)). +* Node: Make `appData` TS typed and writable ([PR #1046](https://github.com/versatica/mediasoup/pull/1046), credits to @mango-martin). ### 3.11.19 diff --git a/node/.eslintrc.js b/node/.eslintrc.js index f681e15d1c..ca8e7cefc4 100644 --- a/node/.eslintrc.js +++ b/node/.eslintrc.js @@ -75,10 +75,10 @@ const eslintConfig = beforeLineComment : false } ], - 'max-len' : [ 2, 90, + 'max-len' : [ 2, 100, { tabWidth : 2, - comments : 90, + comments : 84, ignoreUrls : true, ignoreStrings : true, ignoreTemplateLiterals : true, diff --git a/node/src/ActiveSpeakerObserver.ts b/node/src/ActiveSpeakerObserver.ts index f5ebd29337..a9af22c569 100644 --- a/node/src/ActiveSpeakerObserver.ts +++ b/node/src/ActiveSpeakerObserver.ts @@ -7,15 +7,16 @@ import { RtpObserverConstructorOptions } from './RtpObserver'; import { Producer } from './Producer'; +import { AppData } from './types'; -export type ActiveSpeakerObserverOptions = +export type ActiveSpeakerObserverOptions = { interval?: number; /** * Custom application data. */ - appData?: Record; + appData?: ActiveSpeakerObserverAppData; }; export type ActiveSpeakerObserverDominantSpeaker = @@ -36,16 +37,18 @@ export type ActiveSpeakerObserverObserverEvents = RtpObserverObserverEvents & dominantspeaker: [ActiveSpeakerObserverDominantSpeaker]; }; -type RtpObserverObserverConstructorOptions = RtpObserverConstructorOptions; +type RtpObserverObserverConstructorOptions = + RtpObserverConstructorOptions; const logger = new Logger('ActiveSpeakerObserver'); -export class ActiveSpeakerObserver extends RtpObserver +export class ActiveSpeakerObserver + extends RtpObserver { /** * @private */ - constructor(options: RtpObserverObserverConstructorOptions) + constructor(options: RtpObserverObserverConstructorOptions) { super(options); diff --git a/node/src/AudioLevelObserver.ts b/node/src/AudioLevelObserver.ts index 0b0f8cf6c3..597e3ed882 100644 --- a/node/src/AudioLevelObserver.ts +++ b/node/src/AudioLevelObserver.ts @@ -7,8 +7,9 @@ import { RtpObserverConstructorOptions } from './RtpObserver'; import { Producer } from './Producer'; +import { AppData } from './types'; -export type AudioLevelObserverOptions = +export type AudioLevelObserverOptions = { /** * Maximum number of entries in the 'volumes”' event. Default 1. @@ -29,7 +30,7 @@ export type AudioLevelObserverOptions = /** * Custom application data. */ - appData?: Record; + appData?: AudioLevelObserverAppData; }; export type AudioLevelObserverVolume = @@ -58,16 +59,18 @@ export type AudioLevelObserverObserverEvents = RtpObserverObserverEvents & silence: []; }; -type AudioLevelObserverConstructorOptions = RtpObserverConstructorOptions; +type AudioLevelObserverConstructorOptions = + RtpObserverConstructorOptions; const logger = new Logger('AudioLevelObserver'); -export class AudioLevelObserver extends RtpObserver +export class AudioLevelObserver + extends RtpObserver { /** * @private */ - constructor(options: AudioLevelObserverConstructorOptions) + constructor(options: AudioLevelObserverConstructorOptions) { super(options); diff --git a/node/src/Consumer.ts b/node/src/Consumer.ts index 5bf3c6d5cb..bcf09e3c20 100644 --- a/node/src/Consumer.ts +++ b/node/src/Consumer.ts @@ -9,8 +9,9 @@ import { RtpCapabilities, RtpParameters } from './RtpParameters'; +import { AppData } from './types'; -export type ConsumerOptions = +export type ConsumerOptions = { /** * The id of the Producer to consume. @@ -75,7 +76,7 @@ export type ConsumerOptions = /** * Custom application data. */ - appData?: Record; + appData?: ConsumerAppData; }; /** @@ -211,7 +212,8 @@ type ConsumerData = const logger = new Logger('Consumer'); -export class Consumer extends EnhancedEventEmitter +export class Consumer + extends EnhancedEventEmitter { // Internal data. readonly #internal: ConsumerInternal; @@ -229,7 +231,7 @@ export class Consumer extends EnhancedEventEmitter #closed = false; // Custom app data. - readonly #appData: Record; + #appData: ConsumerAppData; // Paused flag. #paused = false; @@ -272,7 +274,7 @@ export class Consumer extends EnhancedEventEmitter data: ConsumerData; channel: Channel; payloadChannel: PayloadChannel; - appData?: Record; + appData?: ConsumerAppData; paused: boolean; producerPaused: boolean; score?: ConsumerScore; @@ -287,7 +289,7 @@ export class Consumer extends EnhancedEventEmitter this.#data = data; this.#channel = channel; this.#payloadChannel = payloadChannel; - this.#appData = appData || {}; + this.#appData = appData || {} as ConsumerAppData; this.#paused = paused; this.#producerPaused = producerPaused; this.#score = score; @@ -395,17 +397,17 @@ export class Consumer extends EnhancedEventEmitter /** * App custom data. */ - get appData(): Record + get appData(): ConsumerAppData { return this.#appData; } /** - * Invalid setter. + * App custom data setter. */ - set appData(appData: Record) // eslint-disable-line no-unused-vars + set appData(appData: ConsumerAppData) { - throw new Error('cannot override appData object'); + this.#appData = appData; } /** diff --git a/node/src/DataConsumer.ts b/node/src/DataConsumer.ts index 79f1742a56..a85413c38f 100644 --- a/node/src/DataConsumer.ts +++ b/node/src/DataConsumer.ts @@ -4,8 +4,9 @@ import { Channel } from './Channel'; import { PayloadChannel } from './PayloadChannel'; import { TransportInternal } from './Transport'; import { SctpStreamParameters } from './SctpParameters'; +import { AppData } from './types'; -export type DataConsumerOptions = +export type DataConsumerOptions = { /** * The id of the DataProducer to consume. @@ -39,7 +40,7 @@ export type DataConsumerOptions = /** * Custom application data. */ - appData?: Record; + appData?: DataConsumerAppData; }; export type DataConsumerStat = @@ -91,7 +92,8 @@ type DataConsumerData = const logger = new Logger('DataConsumer'); -export class DataConsumer extends EnhancedEventEmitter +export class DataConsumer + extends EnhancedEventEmitter { // Internal data. readonly #internal: DataConsumerInternal; @@ -109,7 +111,7 @@ export class DataConsumer extends EnhancedEventEmitter #closed = false; // Custom app data. - readonly #appData: Record; + #appData: DataConsumerAppData; // Observer instance. readonly #observer = new EnhancedEventEmitter(); @@ -130,7 +132,7 @@ export class DataConsumer extends EnhancedEventEmitter data: DataConsumerData; channel: Channel; payloadChannel: PayloadChannel; - appData?: Record; + appData?: DataConsumerAppData; } ) { @@ -142,7 +144,7 @@ export class DataConsumer extends EnhancedEventEmitter this.#data = data; this.#channel = channel; this.#payloadChannel = payloadChannel; - this.#appData = appData || {}; + this.#appData = appData || {} as DataConsumerAppData; this.handleWorkerNotifications(); } @@ -206,17 +208,17 @@ export class DataConsumer extends EnhancedEventEmitter /** * App custom data. */ - get appData(): Record + get appData(): DataConsumerAppData { return this.#appData; } /** - * Invalid setter. + * App custom data setter. */ - set appData(appData: Record) // eslint-disable-line no-unused-vars + set appData(appData: DataConsumerAppData) { - throw new Error('cannot override appData object'); + this.#appData = appData; } /** diff --git a/node/src/DataProducer.ts b/node/src/DataProducer.ts index 7d48eb8eb9..94320ab26d 100644 --- a/node/src/DataProducer.ts +++ b/node/src/DataProducer.ts @@ -4,8 +4,9 @@ import { Channel } from './Channel'; import { PayloadChannel } from './PayloadChannel'; import { TransportInternal } from './Transport'; import { SctpStreamParameters } from './SctpParameters'; +import { AppData } from './types'; -export type DataProducerOptions = +export type DataProducerOptions = { /** * DataProducer id (just for Router.pipeToRouter() method). @@ -31,7 +32,7 @@ export type DataProducerOptions = /** * Custom application data. */ - appData?: Record; + appData?: DataProducerAppData; }; export type DataProducerStat = @@ -76,7 +77,8 @@ type DataProducerData = const logger = new Logger('DataProducer'); -export class DataProducer extends EnhancedEventEmitter +export class DataProducer + extends EnhancedEventEmitter { // Internal data. readonly #internal: DataProducerInternal; @@ -94,7 +96,7 @@ export class DataProducer extends EnhancedEventEmitter #closed = false; // Custom app data. - readonly #appData: Record; + #appData: DataProducerAppData; // Observer instance. readonly #observer = new EnhancedEventEmitter(); @@ -115,7 +117,7 @@ export class DataProducer extends EnhancedEventEmitter data: DataProducerData; channel: Channel; payloadChannel: PayloadChannel; - appData?: Record; + appData?: DataProducerAppData; } ) { @@ -127,7 +129,7 @@ export class DataProducer extends EnhancedEventEmitter this.#data = data; this.#channel = channel; this.#payloadChannel = payloadChannel; - this.#appData = appData || {}; + this.#appData = appData || {} as DataProducerAppData; this.handleWorkerNotifications(); } @@ -183,17 +185,17 @@ export class DataProducer extends EnhancedEventEmitter /** * App custom data. */ - get appData(): Record + get appData(): DataProducerAppData { return this.#appData; } /** - * Invalid setter. + * App custom data setter. */ - set appData(appData: Record) // eslint-disable-line no-unused-vars + set appData(appData: DataProducerAppData) { - throw new Error('cannot override appData object'); + this.#appData = appData; } /** diff --git a/node/src/DirectTransport.ts b/node/src/DirectTransport.ts index 4a6fc7bea7..f4bc0be37a 100644 --- a/node/src/DirectTransport.ts +++ b/node/src/DirectTransport.ts @@ -8,8 +8,9 @@ import { TransportConstructorOptions } from './Transport'; import { SctpParameters } from './SctpParameters'; +import { AppData } from './types'; -export type DirectTransportOptions = +export type DirectTransportOptions = { /** * Maximum allowed size for direct messages sent from DataProducers. @@ -20,7 +21,7 @@ export type DirectTransportOptions = /** * Custom application data. */ - appData?: Record; + appData?: DirectTransportAppData; }; export type DirectTransportStat = @@ -58,10 +59,11 @@ export type DirectTransportObserverEvents = TransportObserverEvents & rtcp: [Buffer]; }; -type DirectTransportConstructorOptions = TransportConstructorOptions & -{ - data: DirectTransportData; -}; +type DirectTransportConstructorOptions = + TransportConstructorOptions & + { + data: DirectTransportData; + }; export type DirectTransportData = { @@ -70,8 +72,8 @@ export type DirectTransportData = const logger = new Logger('DirectTransport'); -export class DirectTransport extends - Transport +export class DirectTransport + extends Transport { // DirectTransport data. readonly #data: DirectTransportData; @@ -79,7 +81,7 @@ export class DirectTransport extends /** * @private */ - constructor(options: DirectTransportConstructorOptions) + constructor(options: DirectTransportConstructorOptions) { super(options); diff --git a/node/src/PipeTransport.ts b/node/src/PipeTransport.ts index 3aced3c836..f312a79ec6 100644 --- a/node/src/PipeTransport.ts +++ b/node/src/PipeTransport.ts @@ -14,8 +14,9 @@ import { import { Consumer, ConsumerType } from './Consumer'; import { SctpParameters, NumSctpStreams } from './SctpParameters'; import { SrtpParameters } from './SrtpParameters'; +import { AppData } from './types'; -export type PipeTransportOptions = +export type PipeTransportOptions = { /** * Listening IP address. @@ -67,7 +68,7 @@ export type PipeTransportOptions = /** * Custom application data. */ - appData?: Record; + appData?: PipeTransportAppData; }; export type PipeTransportStat = @@ -98,7 +99,7 @@ export type PipeTransportStat = tuple: TransportTuple; }; -export type PipeConsumerOptions = +export type PipeConsumerOptions = { /** * The id of the Producer to consume. @@ -108,7 +109,7 @@ export type PipeConsumerOptions = /** * Custom application data. */ - appData?: Record; + appData?: ConsumerAppData; }; export type PipeTransportEvents = TransportEvents & @@ -121,10 +122,11 @@ export type PipeTransportObserverEvents = TransportObserverEvents & sctpstatechange: [SctpState]; }; -type PipeTransportConstructorOptions = TransportConstructorOptions & -{ - data: PipeTransportData; -}; +type PipeTransportConstructorOptions = + TransportConstructorOptions & + { + data: PipeTransportData; + }; export type PipeTransportData = { @@ -137,8 +139,8 @@ export type PipeTransportData = const logger = new Logger('PipeTransport'); -export class PipeTransport - extends Transport +export class PipeTransport + extends Transport { // PipeTransport data. readonly #data: PipeTransportData; @@ -146,7 +148,7 @@ export class PipeTransport /** * @private */ - constructor(options: PipeTransportConstructorOptions) + constructor(options: PipeTransportConstructorOptions) { super(options); @@ -285,7 +287,12 @@ export class PipeTransport * * @override */ - async consume({ producerId, appData }: PipeConsumerOptions): Promise + async consume( + { + producerId, + appData + }: PipeConsumerOptions + ): Promise> { logger.debug('consume()'); @@ -334,7 +341,7 @@ export class PipeTransport type : 'pipe' as ConsumerType }; - const consumer = new Consumer( + const consumer = new Consumer( { internal : { diff --git a/node/src/PlainTransport.ts b/node/src/PlainTransport.ts index 256d504950..23c4e266c0 100644 --- a/node/src/PlainTransport.ts +++ b/node/src/PlainTransport.ts @@ -11,8 +11,9 @@ import { } from './Transport'; import { SctpParameters, NumSctpStreams } from './SctpParameters'; import { SrtpParameters, SrtpCryptoSuite } from './SrtpParameters'; +import { AppData } from './types'; -export type PlainTransportOptions = +export type PlainTransportOptions = { /** * Listening IP address. @@ -75,7 +76,7 @@ export type PlainTransportOptions = /** * Custom application data. */ - appData?: Record; + appData?: PlainTransportAppData; }; export type PlainTransportStat = @@ -123,10 +124,11 @@ export type PlainTransportObserverEvents = TransportObserverEvents & sctpstatechange: [SctpState]; }; -type PlainTransportConstructorOptions = TransportConstructorOptions & -{ - data: PlainTransportData; -}; +type PlainTransportConstructorOptions = + TransportConstructorOptions & + { + data: PlainTransportData; + }; export type PlainTransportData = { @@ -141,8 +143,8 @@ export type PlainTransportData = const logger = new Logger('PlainTransport'); -export class PlainTransport extends - Transport +export class PlainTransport + extends Transport { // PlainTransport data. readonly #data: PlainTransportData; @@ -150,7 +152,7 @@ export class PlainTransport extends /** * @private */ - constructor(options: PlainTransportConstructorOptions) + constructor(options: PlainTransportConstructorOptions) { super(options); diff --git a/node/src/Producer.ts b/node/src/Producer.ts index 0046b6f672..2d152ffb40 100644 --- a/node/src/Producer.ts +++ b/node/src/Producer.ts @@ -4,8 +4,9 @@ import { Channel } from './Channel'; import { PayloadChannel } from './PayloadChannel'; import { TransportInternal } from './Transport'; import { MediaKind, RtpParameters } from './RtpParameters'; +import { AppData } from './types'; -export type ProducerOptions = +export type ProducerOptions = { /** * Producer id (just for Router.pipeToRouter() method). @@ -36,7 +37,7 @@ export type ProducerOptions = /** * Custom application data. */ - appData?: Record; + appData?: ProducerAppData; }; /** @@ -176,7 +177,8 @@ type ProducerData = const logger = new Logger('Producer'); -export class Producer extends EnhancedEventEmitter +export class Producer + extends EnhancedEventEmitter { // Internal data. readonly #internal: ProducerInternal; @@ -194,7 +196,7 @@ export class Producer extends EnhancedEventEmitter #closed = false; // Custom app data. - readonly #appData: Record; + #appData: ProducerAppData; // Paused flag. #paused = false; @@ -222,7 +224,7 @@ export class Producer extends EnhancedEventEmitter data: ProducerData; channel: Channel; payloadChannel: PayloadChannel; - appData?: Record; + appData?: ProducerAppData; paused: boolean; } ) @@ -235,7 +237,7 @@ export class Producer extends EnhancedEventEmitter this.#data = data; this.#channel = channel; this.#payloadChannel = payloadChannel; - this.#appData = appData || {}; + this.#appData = appData || {} as ProducerAppData; this.#paused = paused; this.handleWorkerNotifications(); @@ -310,17 +312,17 @@ export class Producer extends EnhancedEventEmitter /** * App custom data. */ - get appData(): Record + get appData(): ProducerAppData { return this.#appData; } /** - * Invalid setter. + * App custom data setter. */ - set appData(appData: Record) // eslint-disable-line no-unused-vars + set appData(appData: ProducerAppData) { - throw new Error('cannot override appData object'); + this.#appData = appData; } /** diff --git a/node/src/Router.ts b/node/src/Router.ts index 51a2e876da..21466d4c23 100644 --- a/node/src/Router.ts +++ b/node/src/Router.ts @@ -19,8 +19,9 @@ import { ActiveSpeakerObserver, ActiveSpeakerObserverOptions } from './ActiveSpe import { AudioLevelObserver, AudioLevelObserverOptions } from './AudioLevelObserver'; import { RtpCapabilities, RtpCodecCapability } from './RtpParameters'; import { NumSctpStreams } from './SctpParameters'; +import { AppData } from './types'; -export type RouterOptions = +export type RouterOptions = { /** * Router media codecs. @@ -30,7 +31,7 @@ export type RouterOptions = /** * Custom application data. */ - appData?: Record; + appData?: RouterAppData; }; export type PipeToRouterOptions = @@ -130,7 +131,8 @@ type RouterData = const logger = new Logger('Router'); -export class Router extends EnhancedEventEmitter +export class Router + extends EnhancedEventEmitter { // Internal data. readonly #internal: RouterInternal; @@ -148,7 +150,7 @@ export class Router extends EnhancedEventEmitter #closed = false; // Custom app data. - readonly #appData: Record; + #appData: RouterAppData; // Transports map. readonly #transports: Map = new Map(); @@ -186,7 +188,7 @@ export class Router extends EnhancedEventEmitter data: RouterData; channel: Channel; payloadChannel: PayloadChannel; - appData?: Record; + appData?: RouterAppData; } ) { @@ -198,7 +200,7 @@ export class Router extends EnhancedEventEmitter this.#data = data; this.#channel = channel; this.#payloadChannel = payloadChannel; - this.#appData = appData || {}; + this.#appData = appData || {} as RouterAppData; } /** @@ -228,17 +230,17 @@ export class Router extends EnhancedEventEmitter /** * App custom data. */ - get appData(): Record + get appData(): RouterAppData { return this.#appData; } /** - * Invalid setter. + * App custom data setter. */ - set appData(appData: Record) // eslint-disable-line no-unused-vars + set appData(appData: RouterAppData) { - throw new Error('cannot override appData object'); + this.#appData = appData; } /** @@ -358,7 +360,7 @@ export class Router extends EnhancedEventEmitter /** * Create a WebRtcTransport. */ - async createWebRtcTransport( + async createWebRtcTransport( { webRtcServer, listenIps, @@ -373,8 +375,8 @@ export class Router extends EnhancedEventEmitter maxSctpMessageSize = 262144, sctpSendBufferSize = 262144, appData - }: WebRtcTransportOptions - ): Promise + }: WebRtcTransportOptions + ): Promise> { logger.debug('createWebRtcTransport()'); @@ -431,7 +433,7 @@ export class Router extends EnhancedEventEmitter ? await this.#channel.request('router.createWebRtcTransportWithServer', this.#internal.routerId, reqData) : await this.#channel.request('router.createWebRtcTransport', this.#internal.routerId, reqData); - const transport = new WebRtcTransport( + const transport = new WebRtcTransport( { internal : { @@ -477,7 +479,7 @@ export class Router extends EnhancedEventEmitter /** * Create a PlainTransport. */ - async createPlainTransport( + async createPlainTransport( { listenIp, port, @@ -490,8 +492,8 @@ export class Router extends EnhancedEventEmitter enableSrtp = false, srtpCryptoSuite = 'AES_CM_128_HMAC_SHA1_80', appData - }: PlainTransportOptions - ): Promise + }: PlainTransportOptions + ): Promise> { logger.debug('createPlainTransport()'); @@ -540,7 +542,7 @@ export class Router extends EnhancedEventEmitter const data = await this.#channel.request('router.createPlainTransport', this.#internal.routerId, reqData); - const transport = new PlainTransport( + const transport = new PlainTransport( { internal : { @@ -581,7 +583,7 @@ export class Router extends EnhancedEventEmitter /** * Create a PipeTransport. */ - async createPipeTransport( + async createPipeTransport( { listenIp, port, @@ -592,8 +594,8 @@ export class Router extends EnhancedEventEmitter enableRtx = false, enableSrtp = false, appData - }: PipeTransportOptions - ): Promise + }: PipeTransportOptions + ): Promise> { logger.debug('createPipeTransport()'); @@ -640,7 +642,7 @@ export class Router extends EnhancedEventEmitter const data = await this.#channel.request('router.createPipeTransport', this.#internal.routerId, reqData); - const transport = new PipeTransport( + const transport = new PipeTransport( { internal : { @@ -681,15 +683,15 @@ export class Router extends EnhancedEventEmitter /** * Create a DirectTransport. */ - async createDirectTransport( + async createDirectTransport( { maxMessageSize = 262144, appData - }: DirectTransportOptions = + }: DirectTransportOptions = { maxMessageSize : 262144 } - ): Promise + ): Promise> { logger.debug('createDirectTransport()'); @@ -703,7 +705,7 @@ export class Router extends EnhancedEventEmitter const data = await this.#channel.request('router.createDirectTransport', this.#internal.routerId, reqData); - const transport = new DirectTransport( + const transport = new DirectTransport( { internal : { @@ -1065,12 +1067,12 @@ export class Router extends EnhancedEventEmitter /** * Create an ActiveSpeakerObserver */ - async createActiveSpeakerObserver( + async createActiveSpeakerObserver( { interval = 300, appData - }: ActiveSpeakerObserverOptions = {} - ): Promise + }: ActiveSpeakerObserverOptions = {} + ): Promise> { logger.debug('createActiveSpeakerObserver()'); @@ -1087,7 +1089,7 @@ export class Router extends EnhancedEventEmitter await this.#channel.request('router.createActiveSpeakerObserver', this.#internal.routerId, reqData); - const activeSpeakerObserver = new ActiveSpeakerObserver( + const activeSpeakerObserver = new ActiveSpeakerObserver( { internal : { @@ -1117,14 +1119,14 @@ export class Router extends EnhancedEventEmitter /** * Create an AudioLevelObserver. */ - async createAudioLevelObserver( + async createAudioLevelObserver( { maxEntries = 1, threshold = -80, interval = 1000, appData - }: AudioLevelObserverOptions = {} - ): Promise + }: AudioLevelObserverOptions = {} + ): Promise> { logger.debug('createAudioLevelObserver()'); @@ -1143,7 +1145,7 @@ export class Router extends EnhancedEventEmitter await this.#channel.request('router.createAudioLevelObserver', this.#internal.routerId, reqData); - const audioLevelObserver = new AudioLevelObserver( + const audioLevelObserver = new AudioLevelObserver( { internal : { diff --git a/node/src/RtpObserver.ts b/node/src/RtpObserver.ts index 324fc3313f..3821d728d4 100644 --- a/node/src/RtpObserver.ts +++ b/node/src/RtpObserver.ts @@ -4,6 +4,7 @@ import { Channel } from './Channel'; import { PayloadChannel } from './PayloadChannel'; import { RouterInternal } from './Router'; import { Producer } from './Producer'; +import { AppData } from './types'; export type RtpObserverEvents = { @@ -21,12 +22,12 @@ export type RtpObserverObserverEvents = removeproducer: [Producer]; }; -export type RtpObserverConstructorOptions = +export type RtpObserverConstructorOptions = { internal: RtpObserverObserverInternal; channel: Channel; payloadChannel: PayloadChannel; - appData?: Record; + appData?: RtpObserverAppData; getProducerById: (producerId: string) => Producer | undefined; }; @@ -45,8 +46,10 @@ export type RtpObserverAddRemoveProducerOptions = producerId: string; }; -export class RtpObserver - extends EnhancedEventEmitter +export class RtpObserver + + extends EnhancedEventEmitter { // Internal data. protected readonly internal: RtpObserverObserverInternal; @@ -64,7 +67,7 @@ export class RtpObserver #paused = false; // Custom app data. - readonly #appData: Record; + #appData: RtpObserverAppData; // Method to retrieve a Producer. protected readonly getProducerById: (producerId: string) => Producer | undefined; @@ -83,7 +86,7 @@ export class RtpObserver payloadChannel, appData, getProducerById - }: RtpObserverConstructorOptions + }: RtpObserverConstructorOptions ) { super(); @@ -93,7 +96,7 @@ export class RtpObserver this.internal = internal; this.channel = channel; this.payloadChannel = payloadChannel; - this.#appData = appData || {}; + this.#appData = appData || {} as RtpObserverAppData; this.getProducerById = getProducerById; } @@ -124,17 +127,17 @@ export class RtpObserver /** * App custom data. */ - get appData(): Record + get appData(): RtpObserverAppData { return this.#appData; } /** - * Invalid setter. + * App custom data setter. */ - set appData(appData: Record) // eslint-disable-line no-unused-vars + set appData(appData: RtpObserverAppData) { - throw new Error('cannot override appData object'); + this.#appData = appData; } /** diff --git a/node/src/Transport.ts b/node/src/Transport.ts index 5463b547a6..5d31e794ac 100644 --- a/node/src/Transport.ts +++ b/node/src/Transport.ts @@ -24,6 +24,7 @@ import { } from './DataConsumer'; import { RtpCapabilities } from './RtpParameters'; import { SctpStreamParameters } from './SctpParameters'; +import { AppData } from './types'; export type TransportListenIp = { @@ -110,13 +111,13 @@ export type TransportObserverEvents = trace: [TransportTraceEventData]; }; -export type TransportConstructorOptions = +export type TransportConstructorOptions = { internal: TransportInternal; data: TransportData; channel: Channel; payloadChannel: PayloadChannel; - appData?: Record; + appData?: TransportAppData; getRouterRtpCapabilities: () => RtpCapabilities; getProducerById: (producerId: string) => Producer | undefined; getDataProducerById: (dataProducerId: string) => DataProducer | undefined; @@ -135,8 +136,10 @@ type TransportData = const logger = new Logger('Transport'); -export class Transport +export class Transport + extends EnhancedEventEmitter { // Internal data. @@ -155,7 +158,7 @@ export class Transport; + #appData: TransportAppData; // Method to retrieve Router RTP capabilities. readonly #getRouterRtpCapabilities: () => RtpCapabilities; @@ -208,7 +211,7 @@ export class Transport ) { super(); @@ -219,7 +222,7 @@ export class Transport + get appData(): TransportAppData { return this.#appData; } /** - * Invalid setter. + * App custom data setter. */ - set appData(appData: Record) // eslint-disable-line no-unused-vars + set appData(appData: TransportAppData) { - throw new Error('cannot override appData object'); + this.#appData = appData; } /** @@ -539,7 +542,7 @@ export class Transport( { id = undefined, kind, @@ -547,8 +550,8 @@ export class Transport + }: ProducerOptions + ): Promise> { logger.debug('produce()'); @@ -631,7 +634,7 @@ export class Transport( { internal : { @@ -665,7 +668,7 @@ export class Transport( { producerId, rtpCapabilities, @@ -676,8 +679,8 @@ export class Transport + }: ConsumerOptions + ): Promise> { logger.debug('consume()'); @@ -766,7 +769,7 @@ export class Transport( { internal : { @@ -796,15 +799,15 @@ export class Transport( { id = undefined, sctpStreamParameters, label = '', protocol = '', appData - }: DataProducerOptions = {} - ): Promise + }: DataProducerOptions = {} + ): Promise> { logger.debug('produceData()'); @@ -851,7 +854,7 @@ export class Transport( { internal : { @@ -882,15 +885,15 @@ export class Transport( { dataProducerId, ordered, maxPacketLifeTime, maxRetransmits, appData - }: DataConsumerOptions - ): Promise + }: DataConsumerOptions + ): Promise> { logger.debug('consumeData()'); @@ -975,7 +978,7 @@ export class Transport( { internal : { diff --git a/node/src/WebRtcServer.ts b/node/src/WebRtcServer.ts index 3c0c4eb6b3..0db3346ded 100644 --- a/node/src/WebRtcServer.ts +++ b/node/src/WebRtcServer.ts @@ -3,6 +3,20 @@ import { EnhancedEventEmitter } from './EnhancedEventEmitter'; import { Channel } from './Channel'; import { TransportProtocol } from './Transport'; import { WebRtcTransport } from './WebRtcTransport'; +import { AppData } from './types'; + +export type WebRtcServerOptions = +{ + /** + * Listen infos. + */ + listenInfos: WebRtcServerListenInfo[]; + + /** + * Custom application data. + */ + appData?: WebRtcServerAppData; +}; export type WebRtcServerListenInfo = { @@ -28,19 +42,6 @@ export type WebRtcServerListenInfo = port?: number; }; -export type WebRtcServerOptions = -{ - /** - * Listen infos. - */ - listenInfos: WebRtcServerListenInfo[]; - - /** - * Custom application data. - */ - appData?: Record; -}; - export type WebRtcServerEvents = { workerclose: []; @@ -62,7 +63,8 @@ type WebRtcServerInternal = const logger = new Logger('WebRtcServer'); -export class WebRtcServer extends EnhancedEventEmitter +export class WebRtcServer + extends EnhancedEventEmitter { // Internal data. readonly #internal: WebRtcServerInternal; @@ -74,7 +76,7 @@ export class WebRtcServer extends EnhancedEventEmitter #closed = false; // Custom app data. - readonly #appData: Record; + #appData: WebRtcServerAppData; // Transports map. readonly #webRtcTransports: Map = new Map(); @@ -94,7 +96,7 @@ export class WebRtcServer extends EnhancedEventEmitter { internal: WebRtcServerInternal; channel: Channel; - appData?: Record; + appData?: WebRtcServerAppData; } ) { @@ -104,7 +106,7 @@ export class WebRtcServer extends EnhancedEventEmitter this.#internal = internal; this.#channel = channel; - this.#appData = appData || {}; + this.#appData = appData || {} as WebRtcServerAppData; } /** @@ -126,17 +128,17 @@ export class WebRtcServer extends EnhancedEventEmitter /** * App custom data. */ - get appData(): Record + get appData(): WebRtcServerAppData { return this.#appData; } /** - * Invalid setter. + * App custom data setter. */ - set appData(appData: Record) // eslint-disable-line no-unused-vars + set appData(appData: WebRtcServerAppData) { - throw new Error('cannot override appData object'); + this.#appData = appData; } /** diff --git a/node/src/WebRtcTransport.ts b/node/src/WebRtcTransport.ts index 8e364fed2e..e297a5d4a1 100644 --- a/node/src/WebRtcTransport.ts +++ b/node/src/WebRtcTransport.ts @@ -13,6 +13,10 @@ import { import { WebRtcServer } from './WebRtcServer'; import { SctpParameters, NumSctpStreams } from './SctpParameters'; import { Either } from './utils'; +import { AppData } from './types'; + +export type WebRtcTransportOptions = + WebRtcTransportOptionsBase & WebRtcTransportListen; export type WebRtcTransportListenIndividual = { @@ -40,7 +44,7 @@ export type WebRtcTransportListenServer = export type WebRtcTransportListen = Either; -export type WebRtcTransportOptionsBase = +export type WebRtcTransportOptionsBase = { /** * Listen in UDP. Default true. @@ -92,11 +96,9 @@ export type WebRtcTransportOptionsBase = /** * Custom application data. */ - appData?: Record; + appData?: WebRtcTransportAppData; }; -export type WebRtcTransportOptions = WebRtcTransportOptionsBase & WebRtcTransportListen; - export type IceParameters = { usernameFragment: string; @@ -186,10 +188,11 @@ export type WebRtcTransportObserverEvents = TransportObserverEvents & sctpstatechange: [SctpState]; }; -type WebRtcTransportConstructorOptions = TransportConstructorOptions & -{ - data: WebRtcTransportData; -}; +type WebRtcTransportConstructorOptions = + TransportConstructorOptions & + { + data: WebRtcTransportData; + }; export type WebRtcTransportData = { @@ -207,8 +210,8 @@ export type WebRtcTransportData = const logger = new Logger('WebRtcTransport'); -export class WebRtcTransport extends - Transport +export class WebRtcTransport + extends Transport { // WebRtcTransport data. readonly #data: WebRtcTransportData; @@ -216,7 +219,7 @@ export class WebRtcTransport extends /** * @private */ - constructor(options: WebRtcTransportConstructorOptions) + constructor(options: WebRtcTransportConstructorOptions) { super(options); diff --git a/node/src/Worker.ts b/node/src/Worker.ts index eefa9c8018..582a0f12b9 100644 --- a/node/src/Worker.ts +++ b/node/src/Worker.ts @@ -9,6 +9,7 @@ import { Channel } from './Channel'; import { PayloadChannel } from './PayloadChannel'; import { Router, RouterOptions } from './Router'; import { WebRtcServer, WebRtcServerOptions } from './WebRtcServer'; +import { AppData } from './types'; export type WorkerLogLevel = 'debug' | 'warn' | 'error' | 'none'; @@ -27,7 +28,7 @@ export type WorkerLogTag = | 'sctp' | 'message'; -export type WorkerSettings = +export type WorkerSettings = { /** * Logging level for logs generated by the media worker subprocesses (check @@ -77,10 +78,11 @@ export type WorkerSettings = /** * Custom application data. */ - appData?: Record; + appData?: WorkerAppData; }; -export type WorkerUpdateableSettings = Pick; +export type WorkerUpdateableSettings = + Pick, 'logLevel' | 'logTags'>; /** * An object with the fields of the uv_rusage_t struct. @@ -202,7 +204,8 @@ const workerBin = process.env.MEDIASOUP_WORKER_BIN const logger = new Logger('Worker'); const workerLogger = new Logger('Worker'); -export class Worker extends EnhancedEventEmitter +export class Worker + extends EnhancedEventEmitter { // mediasoup-worker child process. #child?: ChildProcess; @@ -223,7 +226,7 @@ export class Worker extends EnhancedEventEmitter #died = false; // Custom app data. - readonly #appData: Record; + #appData: WorkerAppData; // WebRtcServers set. readonly #webRtcServers: Set = new Set(); @@ -247,7 +250,7 @@ export class Worker extends EnhancedEventEmitter dtlsPrivateKeyFile, libwebrtcFieldTrials, appData - }: WorkerSettings) + }: WorkerSettings) { super(); @@ -356,7 +359,7 @@ export class Worker extends EnhancedEventEmitter consumerSocket : this.#child.stdio[6] }); - this.#appData = appData || {}; + this.#appData = appData || {} as WorkerAppData; let spawnDone = false; @@ -487,17 +490,17 @@ export class Worker extends EnhancedEventEmitter /** * App custom data. */ - get appData(): Record + get appData(): WorkerAppData { return this.#appData; } /** - * Invalid setter. + * App custom data setter. */ - set appData(appData: Record) // eslint-disable-line no-unused-vars + set appData(appData: WorkerAppData) { - throw new Error('cannot override appData object'); + this.#appData = appData; } /** @@ -603,7 +606,7 @@ export class Worker extends EnhancedEventEmitter { logLevel, logTags - }: WorkerUpdateableSettings = {} + }: WorkerUpdateableSettings = {} ): Promise { logger.debug('updateSettings()'); @@ -616,11 +619,12 @@ export class Worker extends EnhancedEventEmitter /** * Create a WebRtcServer. */ - async createWebRtcServer( + async createWebRtcServer( { listenInfos, appData - }: WebRtcServerOptions): Promise + }: WebRtcServerOptions + ): Promise> { logger.debug('createWebRtcServer()'); @@ -656,11 +660,11 @@ export class Worker extends EnhancedEventEmitter /** * Create a Router. */ - async createRouter( + async createRouter( { mediaCodecs, appData - }: RouterOptions = {}): Promise + }: RouterOptions = {}): Promise> { logger.debug('createRouter()'); @@ -677,7 +681,7 @@ export class Worker extends EnhancedEventEmitter await this.#channel.request('worker.createRouter', undefined, reqData); const data = { rtpCapabilities }; - const router = new Router( + const router = new Router( { internal : { diff --git a/node/src/index.ts b/node/src/index.ts index 83d7967760..c98d349e7b 100644 --- a/node/src/index.ts +++ b/node/src/index.ts @@ -5,6 +5,7 @@ import * as utils from './utils'; import { supportedRtpCapabilities } from './supportedRtpCapabilities'; import { RtpCapabilities } from './RtpParameters'; import * as types from './types'; +import { AppData } from './types'; /** * Expose all types. @@ -38,7 +39,7 @@ export { observer }; /** * Create a Worker. */ -export async function createWorker( +export async function createWorker( { logLevel = 'error', logTags, @@ -48,8 +49,8 @@ export async function createWorker( dtlsPrivateKeyFile, libwebrtcFieldTrials, appData - }: WorkerSettings = {} -): Promise + }: WorkerSettings = {} +): Promise> { logger.debug('createWorker()'); @@ -58,7 +59,7 @@ export async function createWorker( throw new TypeError('if given, appData must be an object'); } - const worker = new Worker( + const worker = new Worker( { logLevel, logTags, diff --git a/node/src/ortc.ts b/node/src/ortc.ts index 9b0995b1e3..6f229e6743 100644 --- a/node/src/ortc.ts +++ b/node/src/ortc.ts @@ -435,9 +435,8 @@ export function validateRtpCodecParameters(codec: RtpCodecParameters): void } /** - * Validates RtpHeaderExtensionParameteters. It may modify given data by adding missing - * fields with default values. - * It throws if invalid. + * Validates RtpHeaderExtensionParameteters. It may modify given data by adding + * missing fields with default values. It throws if invalid. */ export function validateRtpHeaderExtensionParameters( ext: RtpHeaderExtensionParameters diff --git a/node/src/tests/test-Router.ts b/node/src/tests/test-Router.ts index c9316ee1f4..9d9941f2b4 100644 --- a/node/src/tests/test-Router.ts +++ b/node/src/tests/test-Router.ts @@ -48,7 +48,11 @@ test('worker.createRouter() succeeds', async () => worker.observer.once('newrouter', onObserverNewRouter); - const router = await worker.createRouter({ mediaCodecs, appData: { foo: 123 } }); + const router = await worker.createRouter<{ foo: number; bar?: string }>( + { + mediaCodecs, + appData : { foo: 123 } + }); expect(onObserverNewRouter).toHaveBeenCalledTimes(1); expect(onObserverNewRouter).toHaveBeenCalledWith(router); @@ -59,6 +63,8 @@ test('worker.createRouter() succeeds', async () => expect(Array.isArray(router.rtpCapabilities.headerExtensions)).toBe(true); expect(router.appData).toEqual({ foo: 123 }); + expect(() => (router.appData = { foo: 222, bar: 'BBB' })).not.toThrow(); + await expect(worker.dump()) .resolves .toEqual( diff --git a/node/src/tests/test-WebRtcServer.ts b/node/src/tests/test-WebRtcServer.ts index febdea95bf..ff28ebe26b 100644 --- a/node/src/tests/test-WebRtcServer.ts +++ b/node/src/tests/test-WebRtcServer.ts @@ -21,7 +21,7 @@ test('worker.createWebRtcServer() succeeds', async () => const port1 = await pickPort({ ip: '127.0.0.1', reserveTimeout: 0 }); const port2 = await pickPort({ type: 'tcp', ip: '127.0.0.1', reserveTimeout: 0 }); - const webRtcServer = await worker.createWebRtcServer( + const webRtcServer = await worker.createWebRtcServer<{ foo?: number }>( { listenInfos : [ diff --git a/node/src/tests/test-Worker.ts b/node/src/tests/test-Worker.ts index feb0232fcc..15ab5ace52 100644 --- a/node/src/tests/test-Worker.ts +++ b/node/src/tests/test-Worker.ts @@ -32,7 +32,7 @@ test('createWorker() succeeds', async () => expect(worker.died).toBe(false); // eslint-disable-next-line require-atomic-updates - worker = await createWorker( + worker = await createWorker<{ foo: number; bar?: string }>( { logLevel : 'debug', logTags : [ 'info' ], @@ -41,13 +41,13 @@ test('createWorker() succeeds', async () => dtlsCertificateFile : path.join(__dirname, 'data', 'dtls-cert.pem'), dtlsPrivateKeyFile : path.join(__dirname, 'data', 'dtls-key.pem'), libwebrtcFieldTrials : 'WebRTC-Bwe-AlrLimitedBackoff/Disabled/', - appData : { bar: 456 } + appData : { foo: 456 } }); expect(worker.constructor.name).toBe('Worker'); expect(typeof worker.pid).toBe('number'); expect(worker.closed).toBe(false); expect(worker.died).toBe(false); - expect(worker.appData).toEqual({ bar: 456 }); + expect(worker.appData).toEqual({ foo: 456 }); worker.close(); diff --git a/node/src/types.ts b/node/src/types.ts index b3fe195f77..fe72cb95fb 100644 --- a/node/src/types.ts +++ b/node/src/types.ts @@ -18,3 +18,8 @@ export * from './SctpParameters'; export * from './SrtpParameters'; export * from './errors'; export { ScalabilityMode } from './scalabilityModes'; + +export type AppData = +{ + [key: string]: unknown; +}; diff --git a/worker/test/src/RTC/TestRtpRetransmissionBuffer.cpp b/worker/test/src/RTC/TestRtpRetransmissionBuffer.cpp index 74d2628b44..411db9fcac 100644 --- a/worker/test/src/RTC/TestRtpRetransmissionBuffer.cpp +++ b/worker/test/src/RTC/TestRtpRetransmissionBuffer.cpp @@ -266,8 +266,6 @@ SCENARIO("RtpRetransmissionBuffer", "[rtp][rtx]") myRetransmissionBuffer.Insert(33332, 1000000002); myRetransmissionBuffer.Insert(33330, 1000000003); - myRetransmissionBuffer.Dump(); - // clang-format off myRetransmissionBuffer.AssertBuffer( {