Skip to content

Commit

Permalink
Merge branch 'v3' into issue_989
Browse files Browse the repository at this point in the history
  • Loading branch information
jmillan authored Jan 29, 2025
2 parents d08035f + 4638d83 commit a94d677
Show file tree
Hide file tree
Showing 20 changed files with 568 additions and 698 deletions.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,6 @@
/.cache
# Packaged module.
*.tgz

## Text editors' config files.
/.zed
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

### NEXT

### 3.15.3

- Node: Expose `Index` interface in `types.indexTypes` or via `import { Index as MediasoupIndex } from 'mediasoup/lib/indexTypes'` ([PR #1485](https://github.com/versatica/mediasoup/pull/1485)).

### 3.15.2

- `Worker`: Fix crash when using colliding `portRange` values in different transports ([PR #1469](https://github.com/versatica/mediasoup/pull/1469)).
Expand Down
6 changes: 3 additions & 3 deletions Cargo.lock

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

6 changes: 6 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,12 @@ const config = tsEslint.config(
],
// We want to use `type` instead of `interface`.
'@typescript-eslint/consistent-type-definitions': 0,
'@typescript-eslint/prefer-nullish-coalescing': [
0,
{
ignorePrimitives: { string: true },
},
],
// Sorry, we need many `any` usage.
'@typescript-eslint/no-explicit-any': 0,
'@typescript-eslint/explicit-function-return-type': 2,
Expand Down
1 change: 0 additions & 1 deletion node/src/ConsumerTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,6 @@ export type ConsumerEvents = {
layerschange: [ConsumerLayers?];
trace: [ConsumerTraceEventData];
rtp: [Buffer];
listenererror: [string, Error];
// Private events.
'@close': [];
'@producerclose': [];
Expand Down
1 change: 0 additions & 1 deletion node/src/DataConsumerTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,6 @@ export type DataConsumerEvents = {
message: [Buffer, number];
sctpsendbufferfull: [];
bufferedamountlow: [number];
listenererror: [string, Error];
// Private events.
'@close': [];
'@dataproducerclose': [];
Expand Down
1 change: 0 additions & 1 deletion node/src/DataProducerTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,6 @@ export type DataProducerStat = {

export type DataProducerEvents = {
transportclose: [];
listenererror: [string, Error];
// Private events.
'@close': [];
};
Expand Down
1 change: 0 additions & 1 deletion node/src/ProducerTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,6 @@ export type ProducerEvents = {
score: [ProducerScore[]];
videoorientationchange: [ProducerVideoOrientation];
trace: [ProducerTraceEventData];
listenererror: [string, Error];
// Private events.
'@close': [];
};
Expand Down
1 change: 0 additions & 1 deletion node/src/RouterTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,6 @@ export type RouterDump = {

export type RouterEvents = {
workerclose: [];
listenererror: [string, Error];
// Private events.
'@close': [];
};
Expand Down
1 change: 0 additions & 1 deletion node/src/RtpObserverTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ export type RtpObserverType = 'audiolevel' | 'activespeaker';

export type RtpObserverEvents = {
routerclose: [];
listenererror: [string, Error];
// Private events.
'@close': [];
};
Expand Down
1 change: 0 additions & 1 deletion node/src/TransportTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,6 @@ export type TransportEvents = {
routerclose: [];
listenserverclose: [];
trace: [TransportTraceEventData];
listenererror: [string, Error];
// Private events.
'@close': [];
'@newproducer': [Producer];
Expand Down
1 change: 0 additions & 1 deletion node/src/WebRtcServerTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@ export type WebRtcServerDump = {

export type WebRtcServerEvents = {
workerclose: [];
listenererror: [string, Error];
// Private events.
'@close': [];
};
Expand Down
1 change: 0 additions & 1 deletion node/src/WorkerTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,6 @@ export type WorkerDump = {
export type WorkerEvents = {
died: [Error];
subprocessclose: [];
listenererror: [string, Error];
// Private events.
'@success': [];
'@failure': [Error];
Expand Down
46 changes: 25 additions & 21 deletions node/src/enhancedEvents.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,21 +4,25 @@ type Events = Record<string, any[]>;

export class EnhancedEventEmitter<
E extends Events = Events,
BuiltInEvents extends Events = {
listenererror: [keyof E, Error];
},
E2 extends Events = E & BuiltInEvents,
> extends EventEmitter {
constructor() {
super();

this.setMaxListeners(Infinity);
}

emit<K extends keyof E & string>(eventName: K, ...args: E[K]): boolean {
emit<K extends keyof E2 & string>(eventName: K, ...args: E2[K]): boolean {
return super.emit(eventName, ...args);
}

/**
* Special addition to the EventEmitter API.
*/
safeEmit<K extends keyof E & string>(eventName: K, ...args: E[K]): boolean {
safeEmit<K extends keyof E2 & string>(eventName: K, ...args: E2[K]): boolean {
try {
return super.emit(eventName, ...args);
} catch (error) {
Expand All @@ -32,86 +36,86 @@ export class EnhancedEventEmitter<
}
}

on<K extends keyof E & string>(
on<K extends keyof E2 & string>(
eventName: K,
listener: (...args: E[K]) => void
listener: (...args: E2[K]) => void
): this {
super.on(eventName, listener as (...args: any[]) => void);

return this;
}

off<K extends keyof E & string>(
off<K extends keyof E2 & string>(
eventName: K,
listener: (...args: E[K]) => void
listener: (...args: E2[K]) => void
): this {
super.off(eventName, listener as (...args: any[]) => void);

return this;
}

addListener<K extends keyof E & string>(
addListener<K extends keyof E2 & string>(
eventName: K,
listener: (...args: E[K]) => void
listener: (...args: E2[K]) => void
): this {
super.on(eventName, listener as (...args: any[]) => void);

return this;
}

prependListener<K extends keyof E & string>(
prependListener<K extends keyof E2 & string>(
eventName: K,
listener: (...args: E[K]) => void
listener: (...args: E2[K]) => void
): this {
super.prependListener(eventName, listener as (...args: any[]) => void);

return this;
}

once<K extends keyof E & string>(
once<K extends keyof E2 & string>(
eventName: K,
listener: (...args: E[K]) => void
listener: (...args: E2[K]) => void
): this {
super.once(eventName, listener as (...args: any[]) => void);

return this;
}

prependOnceListener<K extends keyof E & string>(
prependOnceListener<K extends keyof E2 & string>(
eventName: K,
listener: (...args: E[K]) => void
listener: (...args: E2[K]) => void
): this {
super.prependOnceListener(eventName, listener as (...args: any[]) => void);

return this;
}

removeListener<K extends keyof E & string>(
removeListener<K extends keyof E2 & string>(
eventName: K,
listener: (...args: E[K]) => void
listener: (...args: E2[K]) => void
): this {
super.off(eventName, listener as (...args: any[]) => void);

return this;
}

removeAllListeners<K extends keyof E & string>(eventName?: K): this {
removeAllListeners<K extends keyof E2 & string>(eventName?: K): this {
super.removeAllListeners(eventName);

return this;
}

listenerCount<K extends keyof E & string>(eventName: K): number {
listenerCount<K extends keyof E2 & string>(eventName: K): number {
return super.listenerCount(eventName);
}

// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
listeners<K extends keyof E & string>(eventName: K): Function[] {
listeners<K extends keyof E2 & string>(eventName: K): Function[] {
return super.listeners(eventName);
}

// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
rawListeners<K extends keyof E & string>(eventName: K): Function[] {
rawListeners<K extends keyof E2 & string>(eventName: K): Function[] {
return super.rawListeners(eventName);
}
}
Expand All @@ -123,7 +127,7 @@ export class EnhancedEventEmitter<
* Usage example:
* ```ts
* await enhancedOnce<ConsumerEvents>(videoConsumer, 'producerpause');
* ````
* ```
*/
export async function enhancedOnce<E extends Events = Events>(
emmiter: EnhancedEventEmitter<E>,
Expand Down
42 changes: 27 additions & 15 deletions node/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,29 +1,30 @@
import { Logger, LoggerEmitter } from './Logger';
import { EnhancedEventEmitter } from './enhancedEvents';
import type {
Observer,
ObserverEvents,
LogEventListeners,
Index,
} from './indexTypes';
import type { Worker, WorkerSettings } from './WorkerTypes';
import { WorkerImpl, workerBin } from './Worker';
import { supportedRtpCapabilities } from './supportedRtpCapabilities';
import type { RtpCapabilities } from './rtpParametersTypes';
import type * as types from './types';
import { parseScalabilityMode } from './scalabilityModesUtils';
import type { AppData } from './types';
import * as utils from './utils';

/**
* Expose all types.
*/
export { types };
export type * as types from './types';

/**
* Expose mediasoup version.
*/
// eslint-disable-next-line @typescript-eslint/no-require-imports
export const version: string = require('../../package.json').version;

export type Observer = EnhancedEventEmitter<ObserverEvents>;

export type ObserverEvents = {
newworker: [Worker];
};

const observer: Observer = new EnhancedEventEmitter<ObserverEvents>();

/**
Expand Down Expand Up @@ -59,9 +60,7 @@ const logger = new Logger();
* });
* ```
*/
export function setLogEventListeners(
listeners?: types.LogEventListeners
): void {
export function setLogEventListeners(listeners?: LogEventListeners): void {
logger.debug('setLogEventListeners()');

let debugLogEmitter: LoggerEmitter | undefined;
Expand Down Expand Up @@ -92,9 +91,7 @@ export function setLogEventListeners(
/**
* Create a Worker.
*/
export async function createWorker<
WorkerAppData extends types.AppData = types.AppData,
>({
export async function createWorker<WorkerAppData extends AppData = AppData>({
logLevel = 'error',
logTags,
rtcMinPort = 10000,
Expand Down Expand Up @@ -145,9 +142,24 @@ export function getSupportedRtpCapabilities(): RtpCapabilities {
/**
* Expose parseScalabilityMode() function.
*/
export { parseScalabilityMode } from './scalabilityModesUtils';
export { parseScalabilityMode };

/**
* Expose extras module.
*/
export * as extras from './extras';

// NOTE: This constant of type Index is created just to check at TypeScript
// level that everything exported here (all but TS types) matches the Index
// interface exposed by indexTypes.ts.
//
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const indexImpl: Index = {
version,
observer,
workerBin,
setLogEventListeners,
createWorker,
getSupportedRtpCapabilities,
parseScalabilityMode,
};
32 changes: 32 additions & 0 deletions node/src/indexTypes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import type { EnhancedEventEmitter } from './enhancedEvents';
import type { Worker, WorkerSettings } from './WorkerTypes';
import type { RtpCapabilities } from './rtpParametersTypes';
import type { parseScalabilityMode } from './scalabilityModesUtils';
import type { AppData } from './types';

export type ObserverEvents = {
newworker: [Worker];
};

export type Observer = EnhancedEventEmitter<ObserverEvents>;

/**
* Event listeners for mediasoup generated logs.
*/
export type LogEventListeners = {
ondebug?: (namespace: string, log: string) => void;
onwarn?: (namespace: string, log: string) => void;
onerror?: (namespace: string, log: string, error?: Error) => void;
};

export interface Index {
version: string;
observer: EnhancedEventEmitter<ObserverEvents>;
workerBin: string;
setLogEventListeners: (listeners?: LogEventListeners) => void;
createWorker: <WorkerAppData extends AppData = AppData>(
options?: WorkerSettings<WorkerAppData>
) => Promise<Worker<WorkerAppData>>;
getSupportedRtpCapabilities: () => RtpCapabilities;
parseScalabilityMode: typeof parseScalabilityMode;
}
Loading

0 comments on commit a94d677

Please sign in to comment.