mediasoup-client 3.6.89 → 3.6.90
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.d.ts +1435 -14
- package/lib/index.js +11884 -43
- package/lib/index.js.map +1 -0
- package/lib/index.mjs +11860 -0
- package/lib/index.mjs.map +1 -0
- package/npm-scripts.mjs +17 -11
- package/package.json +12 -8
- package/lib/Consumer.d.ts +0 -115
- package/lib/Consumer.d.ts.map +0 -1
- package/lib/Consumer.js +0 -190
- package/lib/DataConsumer.d.ts +0 -93
- package/lib/DataConsumer.d.ts.map +0 -1
- package/lib/DataConsumer.js +0 -162
- package/lib/DataProducer.d.ts +0 -97
- package/lib/DataProducer.d.ts.map +0 -1
- package/lib/DataProducer.js +0 -180
- package/lib/Device.d.ts +0 -92
- package/lib/Device.d.ts.map +0 -1
- package/lib/Device.js +0 -464
- package/lib/EnhancedEventEmitter.d.ts +0 -24
- package/lib/EnhancedEventEmitter.d.ts.map +0 -1
- package/lib/EnhancedEventEmitter.js +0 -70
- package/lib/Logger.d.ts +0 -11
- package/lib/Logger.d.ts.map +0 -1
- package/lib/Logger.js +0 -37
- package/lib/Producer.d.ts +0 -169
- package/lib/Producer.d.ts.map +0 -1
- package/lib/Producer.js +0 -287
- package/lib/RtpParameters.d.ts +0 -306
- package/lib/RtpParameters.d.ts.map +0 -1
- package/lib/RtpParameters.js +0 -6
- package/lib/SctpParameters.d.ts +0 -68
- package/lib/SctpParameters.d.ts.map +0 -1
- package/lib/SctpParameters.js +0 -2
- package/lib/Transport.d.ts +0 -243
- package/lib/Transport.d.ts.map +0 -1
- package/lib/Transport.js +0 -824
- package/lib/errors.d.ts +0 -13
- package/lib/errors.d.ts.map +0 -1
- package/lib/errors.js +0 -39
- package/lib/handlers/Chrome111.d.ts +0 -49
- package/lib/handlers/Chrome111.d.ts.map +0 -1
- package/lib/handlers/Chrome111.js +0 -658
- package/lib/handlers/Chrome55.d.ts +0 -51
- package/lib/handlers/Chrome55.d.ts.map +0 -1
- package/lib/handlers/Chrome55.js +0 -542
- package/lib/handlers/Chrome67.d.ts +0 -51
- package/lib/handlers/Chrome67.d.ts.map +0 -1
- package/lib/handlers/Chrome67.js +0 -598
- package/lib/handlers/Chrome70.d.ts +0 -49
- package/lib/handlers/Chrome70.d.ts.map +0 -1
- package/lib/handlers/Chrome70.js +0 -627
- package/lib/handlers/Chrome74.d.ts +0 -49
- package/lib/handlers/Chrome74.d.ts.map +0 -1
- package/lib/handlers/Chrome74.js +0 -675
- package/lib/handlers/Edge11.d.ts +0 -55
- package/lib/handlers/Edge11.d.ts.map +0 -1
- package/lib/handlers/Edge11.js +0 -447
- package/lib/handlers/FakeHandler.d.ts +0 -49
- package/lib/handlers/FakeHandler.d.ts.map +0 -1
- package/lib/handlers/FakeHandler.js +0 -276
- package/lib/handlers/Firefox60.d.ts +0 -48
- package/lib/handlers/Firefox60.d.ts.map +0 -1
- package/lib/handlers/Firefox60.js +0 -681
- package/lib/handlers/HandlerInterface.d.ts +0 -97
- package/lib/handlers/HandlerInterface.d.ts.map +0 -1
- package/lib/handlers/HandlerInterface.js +0 -10
- package/lib/handlers/ReactNative.d.ts +0 -51
- package/lib/handlers/ReactNative.d.ts.map +0 -1
- package/lib/handlers/ReactNative.js +0 -558
- package/lib/handlers/ReactNativeUnifiedPlan.d.ts +0 -49
- package/lib/handlers/ReactNativeUnifiedPlan.d.ts.map +0 -1
- package/lib/handlers/ReactNativeUnifiedPlan.js +0 -694
- package/lib/handlers/Safari11.d.ts +0 -51
- package/lib/handlers/Safari11.d.ts.map +0 -1
- package/lib/handlers/Safari11.js +0 -592
- package/lib/handlers/Safari12.d.ts +0 -49
- package/lib/handlers/Safari12.d.ts.map +0 -1
- package/lib/handlers/Safari12.js +0 -648
- package/lib/handlers/ortc/edgeUtils.d.ts +0 -11
- package/lib/handlers/ortc/edgeUtils.d.ts.map +0 -1
- package/lib/handlers/ortc/edgeUtils.js +0 -86
- package/lib/handlers/ortc/utils.d.ts +0 -6
- package/lib/handlers/ortc/utils.d.ts.map +0 -1
- package/lib/handlers/ortc/utils.js +0 -20
- package/lib/handlers/sdp/MediaSection.d.ts +0 -68
- package/lib/handlers/sdp/MediaSection.d.ts.map +0 -1
- package/lib/handlers/sdp/MediaSection.js +0 -589
- package/lib/handlers/sdp/RemoteSdp.d.ts +0 -75
- package/lib/handlers/sdp/RemoteSdp.d.ts.map +0 -1
- package/lib/handlers/sdp/RemoteSdp.js +0 -303
- package/lib/handlers/sdp/commonUtils.d.ts +0 -24
- package/lib/handlers/sdp/commonUtils.d.ts.map +0 -1
- package/lib/handlers/sdp/commonUtils.js +0 -224
- package/lib/handlers/sdp/plainRtpUtils.d.ts +0 -14
- package/lib/handlers/sdp/plainRtpUtils.d.ts.map +0 -1
- package/lib/handlers/sdp/plainRtpUtils.js +0 -33
- package/lib/handlers/sdp/planBUtils.d.ts +0 -14
- package/lib/handlers/sdp/planBUtils.d.ts.map +0 -1
- package/lib/handlers/sdp/planBUtils.js +0 -155
- package/lib/handlers/sdp/unifiedPlanUtils.d.ts +0 -12
- package/lib/handlers/sdp/unifiedPlanUtils.d.ts.map +0 -1
- package/lib/handlers/sdp/unifiedPlanUtils.js +0 -131
- package/lib/index.d.ts.map +0 -1
- package/lib/ortc.d.ts +0 -123
- package/lib/ortc.d.ts.map +0 -1
- package/lib/ortc.js +0 -943
- package/lib/scalabilityModes.d.ts +0 -6
- package/lib/scalabilityModes.d.ts.map +0 -1
- package/lib/scalabilityModes.js +0 -20
- package/lib/tests/fakeParameters.d.ts +0 -20
- package/lib/tests/fakeParameters.d.ts.map +0 -1
- package/lib/tests/fakeParameters.js +0 -659
- package/lib/tests/test.d.ts +0 -6
- package/lib/tests/test.d.ts.map +0 -1
- package/lib/tests/test.js +0 -1297
- package/lib/tests/uaTestCases.d.ts +0 -9
- package/lib/tests/uaTestCases.d.ts.map +0 -1
- package/lib/tests/uaTestCases.js +0 -85
- package/lib/types.d.ts +0 -15
- package/lib/types.d.ts.map +0 -1
- package/lib/types.js +0 -26
- package/lib/utils.d.ts +0 -9
- package/lib/utils.d.ts.map +0 -1
- package/lib/utils.js +0 -20
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/Logger.ts","../src/EnhancedEventEmitter.ts","../src/errors.ts","../src/utils.ts","../src/ortc.ts","../src/Producer.ts","../src/Consumer.ts","../src/DataProducer.ts","../src/DataConsumer.ts","../src/Transport.ts","../src/handlers/sdp/commonUtils.ts","../src/handlers/sdp/unifiedPlanUtils.ts","../src/handlers/ortc/utils.ts","../src/handlers/HandlerInterface.ts","../src/handlers/sdp/MediaSection.ts","../src/handlers/sdp/RemoteSdp.ts","../src/scalabilityModes.ts","../src/handlers/Chrome111.ts","../src/handlers/Chrome74.ts","../src/handlers/Chrome70.ts","../src/handlers/sdp/planBUtils.ts","../src/handlers/Chrome67.ts","../src/handlers/Chrome55.ts","../src/handlers/Firefox60.ts","../src/handlers/Safari12.ts","../src/handlers/Safari11.ts","../src/handlers/ortc/edgeUtils.ts","../src/handlers/Edge11.ts","../src/handlers/ReactNativeUnifiedPlan.ts","../src/handlers/ReactNative.ts","../src/Device.ts","../src/index.ts"],"sourcesContent":["import debug from 'debug';\n\nconst APP_NAME = 'mediasoup-client';\n\nexport class Logger\n{\n\tprivate readonly _debug: debug.Debugger;\n\tprivate readonly _warn: debug.Debugger;\n\tprivate readonly _error: debug.Debugger;\n\n\tconstructor(prefix?: string)\n\t{\n\t\tif (prefix)\n\t\t{\n\t\t\tthis._debug = debug(`${APP_NAME}:${prefix}`);\n\t\t\tthis._warn = debug(`${APP_NAME}:WARN:${prefix}`);\n\t\t\tthis._error = debug(`${APP_NAME}:ERROR:${prefix}`);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._debug = debug(APP_NAME);\n\t\t\tthis._warn = debug(`${APP_NAME}:WARN`);\n\t\t\tthis._error = debug(`${APP_NAME}:ERROR`);\n\t\t}\n\n\t\t/* eslint-disable no-console */\n\t\tthis._debug.log = console.info.bind(console);\n\t\tthis._warn.log = console.warn.bind(console);\n\t\tthis._error.log = console.error.bind(console);\n\t\t/* eslint-enable no-console */\n\t}\n\n\tget debug(): debug.Debugger\n\t{\n\t\treturn this._debug;\n\t}\n\n\tget warn(): debug.Debugger\n\t{\n\t\treturn this._warn;\n\t}\n\n\tget error(): debug.Debugger\n\t{\n\t\treturn this._error;\n\t}\n}\n","import { EventEmitter } from 'events';\nimport { Logger } from './Logger';\n\nconst logger = new Logger('EnhancedEventEmitter');\n\ntype Events = Record<string, any[]>;\n\nexport class EnhancedEventEmitter<E extends Events = Events> extends EventEmitter\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\t\tthis.setMaxListeners(Infinity);\n\t}\n\n\temit<K extends keyof E & string>(eventName: K, ...args: E[K]): boolean\n\t{\n\t\treturn super.emit(eventName, ...args);\n\t}\n\n\t/**\n\t * Special addition to the EventEmitter API.\n\t */\n\tsafeEmit<K extends keyof E & string>(eventName: K, ...args: E[K]): boolean\n\t{\n\t\tconst numListeners = super.listenerCount(eventName);\n\n\t\ttry\n\t\t{\n\t\t\treturn super.emit(eventName, ...args);\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\tlogger.error(\n\t\t\t\t'safeEmit() | event listener threw an error [eventName:%s]:%o',\n\t\t\t\teventName, error);\n\n\t\t\treturn Boolean(numListeners);\n\t\t}\n\t}\n\n\ton<K extends keyof E & string>(\n\t\teventName: K,\n\t\tlistener: (...args: E[K]) => void\n\t): this\n\t{\n\t\tsuper.on(eventName, listener as (...args: any[]) => void);\n\n\t\treturn this;\n\t}\n\n\toff<K extends keyof E & string>(\n\t\teventName: K,\n\t\tlistener: (...args: E[K]) => void\n\t): this\n\t{\n\t\tsuper.off(eventName, listener as (...args: any[]) => void);\n\n\t\treturn this;\n\t}\n\n\taddListener<K extends keyof E & string>(\n\t\teventName: K,\n\t\tlistener: (...args: E[K]) => void\n\t): this\n\t{\n\t\tsuper.on(eventName, listener as (...args: any[]) => void);\n\n\t\treturn this;\n\t}\n\n\tprependListener<K extends keyof E & string>(\n\t\teventName: K,\n\t\tlistener: (...args: E[K]) => void\n\t): this\n\t{\n\t\tsuper.prependListener(eventName, listener as (...args: any[]) => void);\n\n\t\treturn this;\n\t}\n\n\tonce<K extends keyof E & string>(\n\t\teventName: K,\n\t\tlistener: (...args: E[K]) => void\n\t): this\n\t{\n\t\tsuper.once(eventName, listener as (...args: any[]) => void);\n\n\t\treturn this;\n\t}\n\n\tprependOnceListener<K extends keyof E & string>(\n\t\teventName: K,\n\t\tlistener: (...args: E[K]) => void\n\t): this\n\t{\n\t\tsuper.prependOnceListener(eventName, listener as (...args: any[]) => void);\n\n\t\treturn this;\n\t}\n\n\tremoveListener<K extends keyof E & string>(\n\t\teventName: K,\n\t\tlistener: (...args: E[K]) => void\n\t): this\n\t{\n\t\tsuper.off(eventName, listener as (...args: any[]) => void);\n\n\t\treturn this;\n\t}\n\n\tremoveAllListeners<K extends keyof E & string>(eventName?: K): this\n\t{\n\t\tsuper.removeAllListeners(eventName);\n\n\t\treturn this;\n\t}\n\n\tlistenerCount<K extends keyof E & string>(eventName: K): number\n\t{\n\t\treturn super.listenerCount(eventName);\n\t}\n\n\tlisteners<K extends keyof E & string>(eventName: K): Function[]\n\t{\n\t\treturn super.listeners(eventName);\n\t}\n\n\trawListeners<K extends keyof E & string>(eventName: K): Function[]\n\t{\n\t\treturn super.rawListeners(eventName);\n\t}\n}\n","/**\n * Error indicating not support for something.\n */\nexport class UnsupportedError extends Error\n{\n\tconstructor(message: string)\n\t{\n\t\tsuper(message);\n\n\t\tthis.name = 'UnsupportedError';\n\n\t\tif (Error.hasOwnProperty('captureStackTrace')) // Just in V8.\n\t\t{\n\t\t\t// @ts-ignore\n\t\t\tError.captureStackTrace(this, UnsupportedError);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.stack = (new Error(message)).stack;\n\t\t}\n\t}\n}\n\n/**\n * Error produced when calling a method in an invalid state.\n */\nexport class InvalidStateError extends Error\n{\n\tconstructor(message: string)\n\t{\n\t\tsuper(message);\n\n\t\tthis.name = 'InvalidStateError';\n\n\t\tif (Error.hasOwnProperty('captureStackTrace')) // Just in V8.\n\t\t{\n\t\t\t// @ts-ignore\n\t\t\tError.captureStackTrace(this, InvalidStateError);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis.stack = (new Error(message)).stack;\n\t\t}\n\t}\n}\n","/**\n * Clones the given data.\n */\nexport function clone(data: any, defaultValue: any): any\n{\n\tif (typeof data === 'undefined')\n\t{\n\t\treturn defaultValue;\n\t}\n\n\treturn JSON.parse(JSON.stringify(data));\n}\n\n/**\n * Generates a random positive integer.\n */\nexport function generateRandomNumber(): number\n{\n\treturn Math.round(Math.random() * 10000000);\n}\n","import * as h264 from 'h264-profile-level-id';\nimport {\n\tRtpCapabilities,\n\tMediaKind,\n\tRtpCodecCapability,\n\tRtpHeaderExtension,\n\tRtpParameters,\n\tRtpCodecParameters,\n\tRtcpFeedback,\n\tRtpEncodingParameters,\n\tRtpHeaderExtensionParameters,\n\tRtcpParameters\n} from './RtpParameters';\nimport {\n\tSctpCapabilities,\n\tNumSctpStreams,\n\tSctpParameters,\n\tSctpStreamParameters\n} from './SctpParameters';\nimport * as utils from './utils';\n\nconst RTP_PROBATOR_MID = 'probator';\nconst RTP_PROBATOR_SSRC = 1234;\nconst RTP_PROBATOR_CODEC_PAYLOAD_TYPE = 127;\n\n/**\n * Validates RtpCapabilities. It may modify given data by adding missing\n * fields with default values.\n * It throws if invalid.\n */\nexport function validateRtpCapabilities(caps: RtpCapabilities): void\n{\n\tif (typeof caps !== 'object')\n\t{\n\t\tthrow new TypeError('caps is not an object');\n\t}\n\n\t// codecs is optional. If unset, fill with an empty array.\n\tif (caps.codecs && !Array.isArray(caps.codecs))\n\t{\n\t\tthrow new TypeError('caps.codecs is not an array');\n\t}\n\telse if (!caps.codecs)\n\t{\n\t\tcaps.codecs = [];\n\t}\n\n\tfor (const codec of caps.codecs)\n\t{\n\t\tvalidateRtpCodecCapability(codec);\n\t}\n\n\t// headerExtensions is optional. If unset, fill with an empty array.\n\tif (caps.headerExtensions && !Array.isArray(caps.headerExtensions))\n\t{\n\t\tthrow new TypeError('caps.headerExtensions is not an array');\n\t}\n\telse if (!caps.headerExtensions)\n\t{\n\t\tcaps.headerExtensions = [];\n\t}\n\n\tfor (const ext of caps.headerExtensions)\n\t{\n\t\tvalidateRtpHeaderExtension(ext);\n\t}\n}\n\n/**\n * Validates RtpCodecCapability. It may modify given data by adding missing\n * fields with default values.\n * It throws if invalid.\n */\nexport function validateRtpCodecCapability(codec: RtpCodecCapability): void\n{\n\tconst MimeTypeRegex = new RegExp('^(audio|video)/(.+)', 'i');\n\n\tif (typeof codec !== 'object')\n\t{\n\t\tthrow new TypeError('codec is not an object');\n\t}\n\n\t// mimeType is mandatory.\n\tif (!codec.mimeType || typeof codec.mimeType !== 'string')\n\t{\n\t\tthrow new TypeError('missing codec.mimeType');\n\t}\n\n\tconst mimeTypeMatch = MimeTypeRegex.exec(codec.mimeType);\n\n\tif (!mimeTypeMatch)\n\t{\n\t\tthrow new TypeError('invalid codec.mimeType');\n\t}\n\n\t// Just override kind with media component of mimeType.\n\tcodec.kind = mimeTypeMatch[1].toLowerCase() as MediaKind;\n\n\t// preferredPayloadType is optional.\n\tif (codec.preferredPayloadType && typeof codec.preferredPayloadType !== 'number')\n\t{\n\t\tthrow new TypeError('invalid codec.preferredPayloadType');\n\t}\n\n\t// clockRate is mandatory.\n\tif (typeof codec.clockRate !== 'number')\n\t{\n\t\tthrow new TypeError('missing codec.clockRate');\n\t}\n\n\t// channels is optional. If unset, set it to 1 (just if audio).\n\tif (codec.kind === 'audio')\n\t{\n\t\tif (typeof codec.channels !== 'number')\n\t\t{\n\t\t\tcodec.channels = 1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tdelete codec.channels;\n\t}\n\n\t// parameters is optional. If unset, set it to an empty object.\n\tif (!codec.parameters || typeof codec.parameters !== 'object')\n\t{\n\t\tcodec.parameters = {};\n\t}\n\n\tfor (const key of Object.keys(codec.parameters))\n\t{\n\t\tlet value = codec.parameters[key];\n\n\t\tif (value === undefined)\n\t\t{\n\t\t\tcodec.parameters[key] = '';\n\t\t\tvalue = '';\n\t\t}\n\n\t\tif (typeof value !== 'string' && typeof value !== 'number')\n\t\t{\n\t\t\tthrow new TypeError(\n\t\t\t\t`invalid codec parameter [key:${key}s, value:${value}]`);\n\t\t}\n\n\t\t// Specific parameters validation.\n\t\tif (key === 'apt')\n\t\t{\n\t\t\tif (typeof value !== 'number')\n\t\t\t{\n\t\t\t\tthrow new TypeError('invalid codec apt parameter');\n\t\t\t}\n\t\t}\n\t}\n\n\t// rtcpFeedback is optional. If unset, set it to an empty array.\n\tif (!codec.rtcpFeedback || !Array.isArray(codec.rtcpFeedback))\n\t{\n\t\tcodec.rtcpFeedback = [];\n\t}\n\n\tfor (const fb of codec.rtcpFeedback)\n\t{\n\t\tvalidateRtcpFeedback(fb);\n\t}\n}\n\n/**\n * Validates RtcpFeedback. It may modify given data by adding missing\n * fields with default values.\n * It throws if invalid.\n */\nexport function validateRtcpFeedback(fb: RtcpFeedback): void\n{\n\tif (typeof fb !== 'object')\n\t{\n\t\tthrow new TypeError('fb is not an object');\n\t}\n\n\t// type is mandatory.\n\tif (!fb.type || typeof fb.type !== 'string')\n\t{\n\t\tthrow new TypeError('missing fb.type');\n\t}\n\n\t// parameter is optional. If unset set it to an empty string.\n\tif (!fb.parameter || typeof fb.parameter !== 'string')\n\t{\n\t\tfb.parameter = '';\n\t}\n}\n\n/**\n * Validates RtpHeaderExtension. It may modify given data by adding missing\n * fields with default values.\n * It throws if invalid.\n */\nexport function validateRtpHeaderExtension(ext: RtpHeaderExtension): void\n{\n\n\tif (typeof ext !== 'object')\n\t{\n\t\tthrow new TypeError('ext is not an object');\n\t}\n\n\t// kind is mandatory.\n\tif (ext.kind !== 'audio' && ext.kind !== 'video')\n\t{\n\t\tthrow new TypeError('invalid ext.kind');\n\t}\n\n\t// uri is mandatory.\n\tif (!ext.uri || typeof ext.uri !== 'string')\n\t{\n\t\tthrow new TypeError('missing ext.uri');\n\t}\n\n\t// preferredId is mandatory.\n\tif (typeof ext.preferredId !== 'number')\n\t{\n\t\tthrow new TypeError('missing ext.preferredId');\n\t}\n\n\t// preferredEncrypt is optional. If unset set it to false.\n\tif (ext.preferredEncrypt && typeof ext.preferredEncrypt !== 'boolean')\n\t{\n\t\tthrow new TypeError('invalid ext.preferredEncrypt');\n\t}\n\telse if (!ext.preferredEncrypt)\n\t{\n\t\text.preferredEncrypt = false;\n\t}\n\n\t// direction is optional. If unset set it to sendrecv.\n\tif (ext.direction && typeof ext.direction !== 'string')\n\t{\n\t\tthrow new TypeError('invalid ext.direction');\n\t}\n\telse if (!ext.direction)\n\t{\n\t\text.direction = 'sendrecv';\n\t}\n}\n\n/**\n * Validates RtpParameters. It may modify given data by adding missing\n * fields with default values.\n * It throws if invalid.\n */\nexport function validateRtpParameters(params: RtpParameters): void\n{\n\tif (typeof params !== 'object')\n\t{\n\t\tthrow new TypeError('params is not an object');\n\t}\n\n\t// mid is optional.\n\tif (params.mid && typeof params.mid !== 'string')\n\t{\n\t\tthrow new TypeError('params.mid is not a string');\n\t}\n\n\t// codecs is mandatory.\n\tif (!Array.isArray(params.codecs))\n\t{\n\t\tthrow new TypeError('missing params.codecs');\n\t}\n\n\tfor (const codec of params.codecs)\n\t{\n\t\tvalidateRtpCodecParameters(codec);\n\t}\n\n\t// headerExtensions is optional. If unset, fill with an empty array.\n\tif (params.headerExtensions && !Array.isArray(params.headerExtensions))\n\t{\n\t\tthrow new TypeError('params.headerExtensions is not an array');\n\t}\n\telse if (!params.headerExtensions)\n\t{\n\t\tparams.headerExtensions = [];\n\t}\n\n\tfor (const ext of params.headerExtensions)\n\t{\n\t\tvalidateRtpHeaderExtensionParameters(ext);\n\t}\n\n\t// encodings is optional. If unset, fill with an empty array.\n\tif (params.encodings && !Array.isArray(params.encodings))\n\t{\n\t\tthrow new TypeError('params.encodings is not an array');\n\t}\n\telse if (!params.encodings)\n\t{\n\t\tparams.encodings = [];\n\t}\n\n\tfor (const encoding of params.encodings)\n\t{\n\t\tvalidateRtpEncodingParameters(encoding);\n\t}\n\n\t// rtcp is optional. If unset, fill with an empty object.\n\tif (params.rtcp && typeof params.rtcp !== 'object')\n\t{\n\t\tthrow new TypeError('params.rtcp is not an object');\n\t}\n\telse if (!params.rtcp)\n\t{\n\t\tparams.rtcp = {};\n\t}\n\n\tvalidateRtcpParameters(params.rtcp);\n}\n\n/**\n * Validates RtpCodecParameters. It may modify given data by adding missing\n * fields with default values.\n * It throws if invalid.\n */\nexport function validateRtpCodecParameters(codec: RtpCodecParameters): void\n{\n\tconst MimeTypeRegex = new RegExp('^(audio|video)/(.+)', 'i');\n\n\tif (typeof codec !== 'object')\n\t{\n\t\tthrow new TypeError('codec is not an object');\n\t}\n\n\t// mimeType is mandatory.\n\tif (!codec.mimeType || typeof codec.mimeType !== 'string')\n\t{\n\t\tthrow new TypeError('missing codec.mimeType');\n\t}\n\n\tconst mimeTypeMatch = MimeTypeRegex.exec(codec.mimeType);\n\n\tif (!mimeTypeMatch)\n\t{\n\t\tthrow new TypeError('invalid codec.mimeType');\n\t}\n\n\t// payloadType is mandatory.\n\tif (typeof codec.payloadType !== 'number')\n\t{\n\t\tthrow new TypeError('missing codec.payloadType');\n\t}\n\n\t// clockRate is mandatory.\n\tif (typeof codec.clockRate !== 'number')\n\t{\n\t\tthrow new TypeError('missing codec.clockRate');\n\t}\n\n\tconst kind = mimeTypeMatch[1].toLowerCase() as MediaKind;\n\n\t// channels is optional. If unset, set it to 1 (just if audio).\n\tif (kind === 'audio')\n\t{\n\t\tif (typeof codec.channels !== 'number')\n\t\t{\n\t\t\tcodec.channels = 1;\n\t\t}\n\t}\n\telse\n\t{\n\t\tdelete codec.channels;\n\t}\n\n\t// parameters is optional. If unset, set it to an empty object.\n\tif (!codec.parameters || typeof codec.parameters !== 'object')\n\t{\n\t\tcodec.parameters = {};\n\t}\n\n\tfor (const key of Object.keys(codec.parameters))\n\t{\n\t\tlet value = codec.parameters[key];\n\n\t\tif (value === undefined)\n\t\t{\n\t\t\tcodec.parameters[key] = '';\n\t\t\tvalue = '';\n\t\t}\n\n\t\tif (typeof value !== 'string' && typeof value !== 'number')\n\t\t{\n\t\t\tthrow new TypeError(\n\t\t\t\t`invalid codec parameter [key:${key}s, value:${value}]`);\n\t\t}\n\n\t\t// Specific parameters validation.\n\t\tif (key === 'apt')\n\t\t{\n\t\t\tif (typeof value !== 'number')\n\t\t\t{\n\t\t\t\tthrow new TypeError('invalid codec apt parameter');\n\t\t\t}\n\t\t}\n\t}\n\n\t// rtcpFeedback is optional. If unset, set it to an empty array.\n\tif (!codec.rtcpFeedback || !Array.isArray(codec.rtcpFeedback))\n\t{\n\t\tcodec.rtcpFeedback = [];\n\t}\n\n\tfor (const fb of codec.rtcpFeedback)\n\t{\n\t\tvalidateRtcpFeedback(fb);\n\t}\n}\n\n/**\n * Validates RtpHeaderExtensionParameteters. It may modify given data by adding missing\n * fields with default values.\n * It throws if invalid.\n */\nexport function validateRtpHeaderExtensionParameters(\n\text: RtpHeaderExtensionParameters\n): void\n{\n\n\tif (typeof ext !== 'object')\n\t{\n\t\tthrow new TypeError('ext is not an object');\n\t}\n\n\t// uri is mandatory.\n\tif (!ext.uri || typeof ext.uri !== 'string')\n\t{\n\t\tthrow new TypeError('missing ext.uri');\n\t}\n\n\t// id is mandatory.\n\tif (typeof ext.id !== 'number')\n\t{\n\t\tthrow new TypeError('missing ext.id');\n\t}\n\n\t// encrypt is optional. If unset set it to false.\n\tif (ext.encrypt && typeof ext.encrypt !== 'boolean')\n\t{\n\t\tthrow new TypeError('invalid ext.encrypt');\n\t}\n\telse if (!ext.encrypt)\n\t{\n\t\text.encrypt = false;\n\t}\n\n\t// parameters is optional. If unset, set it to an empty object.\n\tif (!ext.parameters || typeof ext.parameters !== 'object')\n\t{\n\t\text.parameters = {};\n\t}\n\n\tfor (const key of Object.keys(ext.parameters))\n\t{\n\t\tlet value = ext.parameters[key];\n\n\t\tif (value === undefined)\n\t\t{\n\t\t\text.parameters[key] = '';\n\t\t\tvalue = '';\n\t\t}\n\n\t\tif (typeof value !== 'string' && typeof value !== 'number')\n\t\t{\n\t\t\tthrow new TypeError('invalid header extension parameter');\n\t\t}\n\t}\n}\n\n/**\n * Validates RtpEncodingParameters. It may modify given data by adding missing\n * fields with default values.\n * It throws if invalid.\n */\nexport function validateRtpEncodingParameters(encoding: RtpEncodingParameters): void\n{\n\tif (typeof encoding !== 'object')\n\t{\n\t\tthrow new TypeError('encoding is not an object');\n\t}\n\n\t// ssrc is optional.\n\tif (encoding.ssrc && typeof encoding.ssrc !== 'number')\n\t{\n\t\tthrow new TypeError('invalid encoding.ssrc');\n\t}\n\n\t// rid is optional.\n\tif (encoding.rid && typeof encoding.rid !== 'string')\n\t{\n\t\tthrow new TypeError('invalid encoding.rid');\n\t}\n\n\t// rtx is optional.\n\tif (encoding.rtx && typeof encoding.rtx !== 'object')\n\t{\n\t\tthrow new TypeError('invalid encoding.rtx');\n\t}\n\telse if (encoding.rtx)\n\t{\n\t\t// RTX ssrc is mandatory if rtx is present.\n\t\tif (typeof encoding.rtx.ssrc !== 'number')\n\t\t{\n\t\t\tthrow new TypeError('missing encoding.rtx.ssrc');\n\t\t}\n\t}\n\n\t// dtx is optional. If unset set it to false.\n\tif (!encoding.dtx || typeof encoding.dtx !== 'boolean')\n\t{\n\t\tencoding.dtx = false;\n\t}\n\n\t// scalabilityMode is optional.\n\tif (encoding.scalabilityMode && typeof encoding.scalabilityMode !== 'string')\n\t{\n\t\tthrow new TypeError('invalid encoding.scalabilityMode');\n\t}\n}\n\n/**\n * Validates RtcpParameters. It may modify given data by adding missing\n * fields with default values.\n * It throws if invalid.\n */\nexport function validateRtcpParameters(rtcp: RtcpParameters): void\n{\n\tif (typeof rtcp !== 'object')\n\t{\n\t\tthrow new TypeError('rtcp is not an object');\n\t}\n\n\t// cname is optional.\n\tif (rtcp.cname && typeof rtcp.cname !== 'string')\n\t{\n\t\tthrow new TypeError('invalid rtcp.cname');\n\t}\n\n\t// reducedSize is optional. If unset set it to true.\n\tif (!rtcp.reducedSize || typeof rtcp.reducedSize !== 'boolean')\n\t{\n\t\trtcp.reducedSize = true;\n\t}\n}\n\n/**\n * Validates SctpCapabilities. It may modify given data by adding missing\n * fields with default values.\n * It throws if invalid.\n */\nexport function validateSctpCapabilities(caps: SctpCapabilities): void\n{\n\tif (typeof caps !== 'object')\n\t{\n\t\tthrow new TypeError('caps is not an object');\n\t}\n\n\t// numStreams is mandatory.\n\tif (!caps.numStreams || typeof caps.numStreams !== 'object')\n\t{\n\t\tthrow new TypeError('missing caps.numStreams');\n\t}\n\n\tvalidateNumSctpStreams(caps.numStreams);\n}\n\n/**\n * Validates NumSctpStreams. It may modify given data by adding missing\n * fields with default values.\n * It throws if invalid.\n */\nexport function validateNumSctpStreams(numStreams: NumSctpStreams): void\n{\n\tif (typeof numStreams !== 'object')\n\t{\n\t\tthrow new TypeError('numStreams is not an object');\n\t}\n\n\t// OS is mandatory.\n\tif (typeof numStreams.OS !== 'number')\n\t{\n\t\tthrow new TypeError('missing numStreams.OS');\n\t}\n\n\t// MIS is mandatory.\n\tif (typeof numStreams.MIS !== 'number')\n\t{\n\t\tthrow new TypeError('missing numStreams.MIS');\n\t}\n}\n\n/**\n * Validates SctpParameters. It may modify given data by adding missing\n * fields with default values.\n * It throws if invalid.\n */\nexport function validateSctpParameters(params: SctpParameters): void\n{\n\tif (typeof params !== 'object')\n\t{\n\t\tthrow new TypeError('params is not an object');\n\t}\n\n\t// port is mandatory.\n\tif (typeof params.port !== 'number')\n\t{\n\t\tthrow new TypeError('missing params.port');\n\t}\n\n\t// OS is mandatory.\n\tif (typeof params.OS !== 'number')\n\t{\n\t\tthrow new TypeError('missing params.OS');\n\t}\n\n\t// MIS is mandatory.\n\tif (typeof params.MIS !== 'number')\n\t{\n\t\tthrow new TypeError('missing params.MIS');\n\t}\n\n\t// maxMessageSize is mandatory.\n\tif (typeof params.maxMessageSize !== 'number')\n\t{\n\t\tthrow new TypeError('missing params.maxMessageSize');\n\t}\n}\n\n/**\n * Validates SctpStreamParameters. It may modify given data by adding missing\n * fields with default values.\n * It throws if invalid.\n */\nexport function validateSctpStreamParameters(params: SctpStreamParameters): void\n{\n\tif (typeof params !== 'object')\n\t{\n\t\tthrow new TypeError('params is not an object');\n\t}\n\n\t// streamId is mandatory.\n\tif (typeof params.streamId !== 'number')\n\t{\n\t\tthrow new TypeError('missing params.streamId');\n\t}\n\n\t// ordered is optional.\n\tlet orderedGiven = false;\n\n\tif (typeof params.ordered === 'boolean')\n\t{\n\t\torderedGiven = true;\n\t}\n\telse\n\t{\n\t\tparams.ordered = true;\n\t}\n\n\t// maxPacketLifeTime is optional.\n\tif (params.maxPacketLifeTime && typeof params.maxPacketLifeTime !== 'number')\n\t{\n\t\tthrow new TypeError('invalid params.maxPacketLifeTime');\n\t}\n\n\t// maxRetransmits is optional.\n\tif (params.maxRetransmits && typeof params.maxRetransmits !== 'number')\n\t{\n\t\tthrow new TypeError('invalid params.maxRetransmits');\n\t}\n\n\tif (params.maxPacketLifeTime && params.maxRetransmits)\n\t{\n\t\tthrow new TypeError('cannot provide both maxPacketLifeTime and maxRetransmits');\n\t}\n\n\tif (\n\t\torderedGiven &&\n\t\tparams.ordered &&\n\t\t(params.maxPacketLifeTime || params.maxRetransmits)\n\t)\n\t{\n\t\tthrow new TypeError('cannot be ordered with maxPacketLifeTime or maxRetransmits');\n\t}\n\telse if (!orderedGiven && (params.maxPacketLifeTime || params.maxRetransmits))\n\t{\n\t\tparams.ordered = false;\n\t}\n\n\t// label is optional.\n\tif (params.label && typeof params.label !== 'string')\n\t{\n\t\tthrow new TypeError('invalid params.label');\n\t}\n\n\t// protocol is optional.\n\tif (params.protocol && typeof params.protocol !== 'string')\n\t{\n\t\tthrow new TypeError('invalid params.protocol');\n\t}\n}\n\n/**\n * Generate extended RTP capabilities for sending and receiving.\n */\nexport function getExtendedRtpCapabilities(\n\tlocalCaps: RtpCapabilities,\n\tremoteCaps: RtpCapabilities\n): any\n{\n\tconst extendedRtpCapabilities: any =\n\t{\n\t\tcodecs : [],\n\t\theaderExtensions : []\n\t};\n\n\t// Match media codecs and keep the order preferred by remoteCaps.\n\tfor (const remoteCodec of remoteCaps.codecs || [])\n\t{\n\t\tif (isRtxCodec(remoteCodec))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst matchingLocalCodec = (localCaps.codecs || [])\n\t\t\t.find((localCodec: RtpCodecCapability) => (\n\t\t\t\tmatchCodecs(localCodec, remoteCodec, { strict: true, modify: true }))\n\t\t\t);\n\n\t\tif (!matchingLocalCodec)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst extendedCodec: any =\n\t\t{\n\t\t\tmimeType : matchingLocalCodec.mimeType,\n\t\t\tkind : matchingLocalCodec.kind,\n\t\t\tclockRate : matchingLocalCodec.clockRate,\n\t\t\tchannels : matchingLocalCodec.channels,\n\t\t\tlocalPayloadType : matchingLocalCodec.preferredPayloadType,\n\t\t\tlocalRtxPayloadType : undefined,\n\t\t\tremotePayloadType : remoteCodec.preferredPayloadType,\n\t\t\tremoteRtxPayloadType : undefined,\n\t\t\tlocalParameters : matchingLocalCodec.parameters,\n\t\t\tremoteParameters : remoteCodec.parameters,\n\t\t\trtcpFeedback : reduceRtcpFeedback(matchingLocalCodec, remoteCodec)\n\t\t};\n\n\t\textendedRtpCapabilities.codecs.push(extendedCodec);\n\t}\n\n\t// Match RTX codecs.\n\tfor (const extendedCodec of extendedRtpCapabilities.codecs)\n\t{\n\t\tconst matchingLocalRtxCodec = localCaps.codecs!\n\t\t\t.find((localCodec: RtpCodecCapability) => (\n\t\t\t\tisRtxCodec(localCodec) &&\n\t\t\t\tlocalCodec.parameters.apt === extendedCodec.localPayloadType\n\t\t\t));\n\n\t\tconst matchingRemoteRtxCodec = remoteCaps.codecs!\n\t\t\t.find((remoteCodec: RtpCodecCapability) => (\n\t\t\t\tisRtxCodec(remoteCodec) &&\n\t\t\t\tremoteCodec.parameters.apt === extendedCodec.remotePayloadType\n\t\t\t));\n\n\t\tif (matchingLocalRtxCodec && matchingRemoteRtxCodec)\n\t\t{\n\t\t\textendedCodec.localRtxPayloadType = matchingLocalRtxCodec.preferredPayloadType;\n\t\t\textendedCodec.remoteRtxPayloadType = matchingRemoteRtxCodec.preferredPayloadType;\n\t\t}\n\t}\n\n\t// Match header extensions.\n\tfor (const remoteExt of remoteCaps.headerExtensions!)\n\t{\n\t\tconst matchingLocalExt = localCaps.headerExtensions!\n\t\t\t.find((localExt: RtpHeaderExtension) => (\n\t\t\t\tmatchHeaderExtensions(localExt, remoteExt)\n\t\t\t));\n\n\t\tif (!matchingLocalExt)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst extendedExt =\n\t\t{\n\t\t\tkind : remoteExt.kind,\n\t\t\turi : remoteExt.uri,\n\t\t\tsendId : matchingLocalExt.preferredId,\n\t\t\trecvId : remoteExt.preferredId,\n\t\t\tencrypt : matchingLocalExt.preferredEncrypt,\n\t\t\tdirection : 'sendrecv'\n\t\t};\n\n\t\tswitch (remoteExt.direction)\n\t\t{\n\t\t\tcase 'sendrecv':\n\t\t\t\textendedExt.direction = 'sendrecv';\n\t\t\t\tbreak;\n\t\t\tcase 'recvonly':\n\t\t\t\textendedExt.direction = 'sendonly';\n\t\t\t\tbreak;\n\t\t\tcase 'sendonly':\n\t\t\t\textendedExt.direction = 'recvonly';\n\t\t\t\tbreak;\n\t\t\tcase 'inactive':\n\t\t\t\textendedExt.direction = 'inactive';\n\t\t\t\tbreak;\n\t\t}\n\n\t\textendedRtpCapabilities.headerExtensions.push(extendedExt);\n\t}\n\n\treturn extendedRtpCapabilities;\n}\n\n/**\n * Generate RTP capabilities for receiving media based on the given extended\n * RTP capabilities.\n */\nexport function getRecvRtpCapabilities(extendedRtpCapabilities: any): RtpCapabilities\n{\n\tconst rtpCapabilities: RtpCapabilities =\n\t{\n\t\tcodecs : [],\n\t\theaderExtensions : []\n\t};\n\n\tfor (const extendedCodec of extendedRtpCapabilities.codecs)\n\t{\n\t\tconst codec =\n\t\t{\n\t\t\tmimeType : extendedCodec.mimeType,\n\t\t\tkind : extendedCodec.kind,\n\t\t\tpreferredPayloadType : extendedCodec.remotePayloadType,\n\t\t\tclockRate : extendedCodec.clockRate,\n\t\t\tchannels : extendedCodec.channels,\n\t\t\tparameters : extendedCodec.localParameters,\n\t\t\trtcpFeedback : extendedCodec.rtcpFeedback\n\t\t};\n\n\t\trtpCapabilities.codecs!.push(codec);\n\n\t\t// Add RTX codec.\n\t\tif (!extendedCodec.remoteRtxPayloadType)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst rtxCodec: RtpCodecCapability =\n\t\t{\n\t\t\tmimeType : `${extendedCodec.kind}/rtx`,\n\t\t\tkind : extendedCodec.kind,\n\t\t\tpreferredPayloadType : extendedCodec.remoteRtxPayloadType,\n\t\t\tclockRate : extendedCodec.clockRate,\n\t\t\tparameters :\n\t\t\t{\n\t\t\t\tapt : extendedCodec.remotePayloadType\n\t\t\t},\n\t\t\trtcpFeedback : []\n\t\t};\n\n\t\trtpCapabilities.codecs!.push(rtxCodec);\n\n\t\t// TODO: In the future, we need to add FEC, CN, etc, codecs.\n\t}\n\n\tfor (const extendedExtension of extendedRtpCapabilities.headerExtensions)\n\t{\n\t\t// Ignore RTP extensions not valid for receiving.\n\t\tif (\n\t\t\textendedExtension.direction !== 'sendrecv' &&\n\t\t\textendedExtension.direction !== 'recvonly'\n\t\t)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst ext: RtpHeaderExtension =\n\t\t{\n\t\t\tkind : extendedExtension.kind,\n\t\t\turi : extendedExtension.uri,\n\t\t\tpreferredId : extendedExtension.recvId,\n\t\t\tpreferredEncrypt : extendedExtension.encrypt,\n\t\t\tdirection : extendedExtension.direction\n\t\t};\n\n\t\trtpCapabilities.headerExtensions!.push(ext);\n\t}\n\n\treturn rtpCapabilities;\n}\n\n/**\n * Generate RTP parameters of the given kind for sending media.\n * NOTE: mid, encodings and rtcp fields are left empty.\n */\nexport function getSendingRtpParameters(\n\tkind: MediaKind,\n\textendedRtpCapabilities: any\n): RtpParameters\n{\n\tconst rtpParameters: RtpParameters =\n\t{\n\t\tmid : undefined,\n\t\tcodecs : [],\n\t\theaderExtensions : [],\n\t\tencodings : [],\n\t\trtcp : {}\n\t};\n\n\tfor (const extendedCodec of extendedRtpCapabilities.codecs)\n\t{\n\t\tif (extendedCodec.kind !== kind)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst codec: RtpCodecParameters =\n\t\t{\n\t\t\tmimeType : extendedCodec.mimeType,\n\t\t\tpayloadType : extendedCodec.localPayloadType,\n\t\t\tclockRate : extendedCodec.clockRate,\n\t\t\tchannels : extendedCodec.channels,\n\t\t\tparameters : extendedCodec.localParameters,\n\t\t\trtcpFeedback : extendedCodec.rtcpFeedback\n\t\t};\n\n\t\trtpParameters.codecs.push(codec);\n\n\t\t// Add RTX codec.\n\t\tif (extendedCodec.localRtxPayloadType)\n\t\t{\n\t\t\tconst rtxCodec: RtpCodecParameters =\n\t\t\t{\n\t\t\t\tmimeType : `${extendedCodec.kind}/rtx`,\n\t\t\t\tpayloadType : extendedCodec.localRtxPayloadType,\n\t\t\t\tclockRate : extendedCodec.clockRate,\n\t\t\t\tparameters :\n\t\t\t\t{\n\t\t\t\t\tapt : extendedCodec.localPayloadType\n\t\t\t\t},\n\t\t\t\trtcpFeedback : []\n\t\t\t};\n\n\t\t\trtpParameters.codecs.push(rtxCodec);\n\t\t}\n\t}\n\n\tfor (const extendedExtension of extendedRtpCapabilities.headerExtensions)\n\t{\n\t\t// Ignore RTP extensions of a different kind and those not valid for sending.\n\t\tif (\n\t\t\t(extendedExtension.kind && extendedExtension.kind !== kind) ||\n\t\t\t(\n\t\t\t\textendedExtension.direction !== 'sendrecv' &&\n\t\t\t\textendedExtension.direction !== 'sendonly'\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst ext: RtpHeaderExtensionParameters =\n\t\t{\n\t\t\turi : extendedExtension.uri,\n\t\t\tid : extendedExtension.sendId,\n\t\t\tencrypt : extendedExtension.encrypt,\n\t\t\tparameters : {}\n\t\t};\n\n\t\trtpParameters.headerExtensions!.push(ext);\n\t}\n\n\treturn rtpParameters;\n}\n\n/**\n * Generate RTP parameters of the given kind suitable for the remote SDP answer.\n */\nexport function getSendingRemoteRtpParameters(\n\tkind: MediaKind,\n\textendedRtpCapabilities: any\n): RtpParameters\n{\n\tconst rtpParameters: RtpParameters =\n\t{\n\t\tmid : undefined,\n\t\tcodecs : [],\n\t\theaderExtensions : [],\n\t\tencodings : [],\n\t\trtcp : {}\n\t};\n\n\tfor (const extendedCodec of extendedRtpCapabilities.codecs)\n\t{\n\t\tif (extendedCodec.kind !== kind)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst codec =\n\t\t{\n\t\t\tmimeType : extendedCodec.mimeType,\n\t\t\tpayloadType : extendedCodec.localPayloadType,\n\t\t\tclockRate : extendedCodec.clockRate,\n\t\t\tchannels : extendedCodec.channels,\n\t\t\tparameters : extendedCodec.remoteParameters,\n\t\t\trtcpFeedback : extendedCodec.rtcpFeedback\n\t\t};\n\n\t\trtpParameters.codecs.push(codec);\n\n\t\t// Add RTX codec.\n\t\tif (extendedCodec.localRtxPayloadType)\n\t\t{\n\t\t\tconst rtxCodec: RtpCodecParameters =\n\t\t\t{\n\t\t\t\tmimeType : `${extendedCodec.kind}/rtx`,\n\t\t\t\tpayloadType : extendedCodec.localRtxPayloadType,\n\t\t\t\tclockRate : extendedCodec.clockRate,\n\t\t\t\tparameters :\n\t\t\t\t{\n\t\t\t\t\tapt : extendedCodec.localPayloadType\n\t\t\t\t},\n\t\t\t\trtcpFeedback : []\n\t\t\t};\n\n\t\t\trtpParameters.codecs.push(rtxCodec);\n\t\t}\n\t}\n\n\tfor (const extendedExtension of extendedRtpCapabilities.headerExtensions)\n\t{\n\t\t// Ignore RTP extensions of a different kind and those not valid for sending.\n\t\tif (\n\t\t\t(extendedExtension.kind && extendedExtension.kind !== kind) ||\n\t\t\t(\n\t\t\t\textendedExtension.direction !== 'sendrecv' &&\n\t\t\t\textendedExtension.direction !== 'sendonly'\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst ext: RtpHeaderExtensionParameters =\n\t\t{\n\t\t\turi : extendedExtension.uri,\n\t\t\tid : extendedExtension.sendId,\n\t\t\tencrypt : extendedExtension.encrypt,\n\t\t\tparameters : {}\n\n\t\t};\n\n\t\trtpParameters.headerExtensions!.push(ext);\n\t}\n\n\t// Reduce codecs' RTCP feedback. Use Transport-CC if available, REMB otherwise.\n\tif (\n\t\trtpParameters.headerExtensions!.some((ext) => (\n\t\t\text.uri === 'http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01'\n\t\t))\n\t)\n\t{\n\t\tfor (const codec of rtpParameters.codecs)\n\t\t{\n\t\t\tcodec.rtcpFeedback = (codec.rtcpFeedback || [])\n\t\t\t\t.filter((fb: RtcpFeedback) => fb.type !== 'goog-remb');\n\t\t}\n\t}\n\telse if (\n\t\trtpParameters.headerExtensions!.some((ext) => (\n\t\t\text.uri === 'http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time'\n\t\t))\n\t)\n\t{\n\t\tfor (const codec of rtpParameters.codecs)\n\t\t{\n\t\t\tcodec.rtcpFeedback = (codec.rtcpFeedback || [])\n\t\t\t\t.filter((fb) => fb.type !== 'transport-cc');\n\t\t}\n\t}\n\telse\n\t{\n\t\tfor (const codec of rtpParameters.codecs)\n\t\t{\n\t\t\tcodec.rtcpFeedback = (codec.rtcpFeedback || [])\n\t\t\t\t.filter((fb: RtcpFeedback) => (\n\t\t\t\t\tfb.type !== 'transport-cc' &&\n\t\t\t\t\tfb.type !== 'goog-remb'\n\t\t\t\t));\n\t\t}\n\t}\n\n\treturn rtpParameters;\n}\n\n/**\n * Reduce given codecs by returning an array of codecs \"compatible\" with the\n * given capability codec. If no capability codec is given, take the first\n * one(s).\n *\n * Given codecs must be generated by ortc.getSendingRtpParameters() or\n * ortc.getSendingRemoteRtpParameters().\n *\n * The returned array of codecs also include a RTX codec if available.\n */\nexport function reduceCodecs(\n\tcodecs: RtpCodecParameters[],\n\tcapCodec?: RtpCodecCapability\n): RtpCodecParameters[]\n{\n\tconst filteredCodecs: RtpCodecParameters[] = [];\n\n\t// If no capability codec is given, take the first one (and RTX).\n\tif (!capCodec)\n\t{\n\t\tfilteredCodecs.push(codecs[0]);\n\n\t\tif (isRtxCodec(codecs[1]))\n\t\t{\n\t\t\tfilteredCodecs.push(codecs[1]);\n\t\t}\n\t}\n\t// Otherwise look for a compatible set of codecs.\n\telse\n\t{\n\t\tfor (let idx = 0; idx < codecs.length; ++idx)\n\t\t{\n\t\t\tif (matchCodecs(codecs[idx], capCodec))\n\t\t\t{\n\t\t\t\tfilteredCodecs.push(codecs[idx]);\n\n\t\t\t\tif (isRtxCodec(codecs[idx + 1]))\n\t\t\t\t{\n\t\t\t\t\tfilteredCodecs.push(codecs[idx + 1]);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (filteredCodecs.length === 0)\n\t\t{\n\t\t\tthrow new TypeError('no matching codec found');\n\t\t}\n\t}\n\n\treturn filteredCodecs;\n}\n\n/**\n * Create RTP parameters for a Consumer for the RTP probator.\n */\nexport function generateProbatorRtpParameters(\n\tvideoRtpParameters: RtpParameters\n): RtpParameters\n{\n\t// Clone given reference video RTP parameters.\n\tvideoRtpParameters = utils.clone(videoRtpParameters, {}) as RtpParameters;\n\n\t// This may throw.\n\tvalidateRtpParameters(videoRtpParameters);\n\n\tconst rtpParameters: RtpParameters =\n\t{\n\t\tmid : RTP_PROBATOR_MID,\n\t\tcodecs : [],\n\t\theaderExtensions : [],\n\t\tencodings : [ { ssrc: RTP_PROBATOR_SSRC } ],\n\t\trtcp : { cname: 'probator' }\n\t};\n\n\trtpParameters.codecs.push(videoRtpParameters.codecs[0]);\n\trtpParameters.codecs[0].payloadType = RTP_PROBATOR_CODEC_PAYLOAD_TYPE;\n\trtpParameters.headerExtensions = videoRtpParameters.headerExtensions;\n\n\treturn rtpParameters;\n}\n\n/**\n * Whether media can be sent based on the given RTP capabilities.\n */\nexport function canSend(kind: MediaKind, extendedRtpCapabilities: any): boolean\n{\n\treturn extendedRtpCapabilities.codecs.\n\t\tsome((codec: any) => codec.kind === kind);\n}\n\n/**\n * Whether the given RTP parameters can be received with the given RTP\n * capabilities.\n */\nexport function canReceive(\n\trtpParameters: RtpParameters,\n\textendedRtpCapabilities: any\n): boolean\n{\n\t// This may throw.\n\tvalidateRtpParameters(rtpParameters);\n\n\tif (rtpParameters.codecs.length === 0)\n\t{\n\t\treturn false;\n\t}\n\n\tconst firstMediaCodec = rtpParameters.codecs[0];\n\n\treturn extendedRtpCapabilities.codecs\n\t\t.some((codec: any) => codec.remotePayloadType === firstMediaCodec.payloadType);\n}\n\nfunction isRtxCodec(codec?: RtpCodecCapability | RtpCodecParameters): boolean\n{\n\tif (!codec)\n\t{\n\t\treturn false;\n\t}\n\n\treturn /.+\\/rtx$/i.test(codec.mimeType);\n}\n\nfunction matchCodecs(\n\taCodec: RtpCodecCapability | RtpCodecParameters,\n\tbCodec: RtpCodecCapability | RtpCodecParameters,\n\t{ strict = false, modify = false } = {}\n): boolean\n{\n\tconst aMimeType = aCodec.mimeType.toLowerCase();\n\tconst bMimeType = bCodec.mimeType.toLowerCase();\n\n\tif (aMimeType !== bMimeType)\n\t{\n\t\treturn false;\n\t}\n\n\tif (aCodec.clockRate !== bCodec.clockRate)\n\t{\n\t\treturn false;\n\t}\n\n\tif (aCodec.channels !== bCodec.channels)\n\t{\n\t\treturn false;\n\t}\n\n\t// Per codec special checks.\n\tswitch (aMimeType)\n\t{\n\t\tcase 'video/h264':\n\t\t{\n\t\t\tif (strict)\n\t\t\t{\n\t\t\t\tconst aPacketizationMode = aCodec.parameters['packetization-mode'] || 0;\n\t\t\t\tconst bPacketizationMode = bCodec.parameters['packetization-mode'] || 0;\n\n\t\t\t\tif (aPacketizationMode !== bPacketizationMode)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (!h264.isSameProfile(aCodec.parameters, bCodec.parameters))\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tlet selectedProfileLevelId;\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tselectedProfileLevelId =\n\t\t\t\t\t\th264.generateProfileLevelIdForAnswer(aCodec.parameters, bCodec.parameters);\n\t\t\t\t}\n\t\t\t\tcatch (error)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\tif (modify)\n\t\t\t\t{\n\t\t\t\t\tif (selectedProfileLevelId)\n\t\t\t\t\t{\n\t\t\t\t\t\taCodec.parameters['profile-level-id'] = selectedProfileLevelId;\n\t\t\t\t\t\tbCodec.parameters['profile-level-id'] = selectedProfileLevelId;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tdelete aCodec.parameters['profile-level-id'];\n\t\t\t\t\t\tdelete bCodec.parameters['profile-level-id'];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\n\t\tcase 'video/vp9':\n\t\t{\n\t\t\tif (strict)\n\t\t\t{\n\t\t\t\tconst aProfileId = aCodec.parameters['profile-id'] || 0;\n\t\t\t\tconst bProfileId = bCodec.parameters['profile-id'] || 0;\n\n\t\t\t\tif (aProfileId !== bProfileId)\n\t\t\t\t{\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn true;\n}\n\nfunction matchHeaderExtensions(\n\taExt: RtpHeaderExtension,\n\tbExt: RtpHeaderExtension\n): boolean\n{\n\tif (aExt.kind && bExt.kind && aExt.kind !== bExt.kind)\n\t{\n\t\treturn false;\n\t}\n\n\tif (aExt.uri !== bExt.uri)\n\t{\n\t\treturn false;\n\t}\n\n\treturn true;\n}\n\nfunction reduceRtcpFeedback(\n\tcodecA: RtpCodecCapability | RtpCodecParameters,\n\tcodecB: RtpCodecCapability | RtpCodecParameters\n): RtcpFeedback[]\n{\n\tconst reducedRtcpFeedback: RtcpFeedback[] = [];\n\n\tfor (const aFb of codecA.rtcpFeedback || [])\n\t{\n\t\tconst matchingBFb = (codecB.rtcpFeedback || [])\n\t\t\t.find((bFb: RtcpFeedback) => (\n\t\t\t\tbFb.type === aFb.type &&\n\t\t\t\t(bFb.parameter === aFb.parameter || (!bFb.parameter && !aFb.parameter))\n\t\t\t));\n\n\t\tif (matchingBFb)\n\t\t{\n\t\t\treducedRtcpFeedback.push(matchingBFb);\n\t\t}\n\t}\n\n\treturn reducedRtcpFeedback;\n}\n","import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './EnhancedEventEmitter';\nimport { UnsupportedError, InvalidStateError } from './errors';\nimport {\n\tMediaKind,\n\tRtpCodecCapability,\n\tRtpParameters,\n\tRtpEncodingParameters\n} from './RtpParameters';\nimport { AppData } from './types';\n\nconst logger = new Logger('Producer');\n\nexport type ProducerOptions<ProducerAppData extends AppData = AppData> =\n{\n\ttrack?: MediaStreamTrack;\n\tencodings?: RtpEncodingParameters[];\n\tcodecOptions?: ProducerCodecOptions;\n\tcodec?: RtpCodecCapability;\n\tstopTracks?: boolean;\n\tdisableTrackOnPause?: boolean;\n\tzeroRtpOnPause?: boolean;\n\tappData?: ProducerAppData;\n};\n\n// https://mediasoup.org/documentation/v3/mediasoup-client/api/#ProducerCodecOptions\nexport type ProducerCodecOptions =\n{\n\topusStereo?: boolean;\n\topusFec?: boolean;\n\topusDtx?: boolean;\n\topusMaxPlaybackRate?: number;\n\topusMaxAverageBitrate?: number;\n\topusPtime?: number;\n\topusNack?: boolean;\n\tvideoGoogleStartBitrate?: number;\n\tvideoGoogleMaxBitrate?: number;\n\tvideoGoogleMinBitrate?: number;\n};\n\nexport type ProducerEvents =\n{\n\ttransportclose: [];\n\ttrackended: [];\n\t// Private events.\n\t'@pause': [\n\t\t() => void,\n\t\t(error: Error) => void\n\t];\n\t'@resume': [\n\t\t() => void,\n\t\t(error: Error) => void\n\t];\n\t'@replacetrack':\n\t[\n\t\tMediaStreamTrack | null,\n\t\t() => void,\n\t\t(error: Error) => void\n\t];\n\t'@setmaxspatiallayer':\n\t[\n\t\tnumber,\n\t\t() => void,\n\t\t(error: Error) => void\n\t];\n\t'@setrtpencodingparameters':\n\t[\n\t\tRTCRtpEncodingParameters,\n\t\t() => void,\n\t\t(error: Error) => void\n\t];\n\t'@getstats': [(stats: RTCStatsReport) => void, (error: Error) => void];\n\t'@close': [];\n};\n\nexport type ProducerObserverEvents =\n{\n\tclose: [];\n\tpause: [];\n\tresume: [];\n\ttrackended: [];\n};\n\nexport class Producer<ProducerAppData extends AppData = AppData>\n\textends EnhancedEventEmitter<ProducerEvents>\n{\n\t// Id.\n\tprivate readonly _id: string;\n\t// Local id.\n\tprivate readonly _localId: string;\n\t// Closed flag.\n\tprivate _closed = false;\n\t// Associated RTCRtpSender.\n\tprivate readonly _rtpSender?: RTCRtpSender;\n\t// Local track.\n\tprivate _track: MediaStreamTrack | null;\n\t// Producer kind.\n\tprivate readonly _kind: MediaKind;\n\t// RTP parameters.\n\tprivate readonly _rtpParameters: RtpParameters;\n\t// Paused flag.\n\tprivate _paused: boolean;\n\t// Video max spatial layer.\n\tprivate _maxSpatialLayer: number | undefined;\n\t// Whether the Producer should call stop() in given tracks.\n\tprivate _stopTracks: boolean;\n\t// Whether the Producer should set track.enabled = false when paused.\n\tprivate _disableTrackOnPause: boolean;\n\t// Whether we should replace the RTCRtpSender.track with null when paused.\n\tprivate _zeroRtpOnPause: boolean;\n\t// App custom data.\n\tprivate _appData: ProducerAppData;\n\t// Observer instance.\n\tprotected readonly _observer = new EnhancedEventEmitter<ProducerObserverEvents>();\n\n\tconstructor(\n\t\t{\n\t\t\tid,\n\t\t\tlocalId,\n\t\t\trtpSender,\n\t\t\ttrack,\n\t\t\trtpParameters,\n\t\t\tstopTracks,\n\t\t\tdisableTrackOnPause,\n\t\t\tzeroRtpOnPause,\n\t\t\tappData\n\t\t}:\n\t\t{\n\t\t\tid: string;\n\t\t\tlocalId: string;\n\t\t\trtpSender?: RTCRtpSender;\n\t\t\ttrack: MediaStreamTrack;\n\t\t\trtpParameters: RtpParameters;\n\t\t\tstopTracks: boolean;\n\t\t\tdisableTrackOnPause: boolean;\n\t\t\tzeroRtpOnPause: boolean;\n\t\t\tappData?: ProducerAppData;\n\t\t}\n\t)\n\t{\n\t\tsuper();\n\n\t\tlogger.debug('constructor()');\n\n\t\tthis._id = id;\n\t\tthis._localId = localId;\n\t\tthis._rtpSender = rtpSender;\n\t\tthis._track = track;\n\t\tthis._kind = track.kind as MediaKind;\n\t\tthis._rtpParameters = rtpParameters;\n\t\tthis._paused = disableTrackOnPause ? !track.enabled : false;\n\t\tthis._maxSpatialLayer = undefined;\n\t\tthis._stopTracks = stopTracks;\n\t\tthis._disableTrackOnPause = disableTrackOnPause;\n\t\tthis._zeroRtpOnPause = zeroRtpOnPause;\n\t\tthis._appData = appData || {} as ProducerAppData;\n\t\tthis.onTrackEnded = this.onTrackEnded.bind(this);\n\n\t\t// NOTE: Minor issue. If zeroRtpOnPause is true, we cannot emit the\n\t\t// '@replacetrack' event here, so RTCRtpSender.track won't be null.\n\n\t\tthis.handleTrack();\n\t}\n\n\t/**\n\t * Producer id.\n\t */\n\tget id(): string\n\t{\n\t\treturn this._id;\n\t}\n\n\t/**\n\t * Local id.\n\t */\n\tget localId(): string\n\t{\n\t\treturn this._localId;\n\t}\n\n\t/**\n\t * Whether the Producer is closed.\n\t */\n\tget closed(): boolean\n\t{\n\t\treturn this._closed;\n\t}\n\n\t/**\n\t * Media kind.\n\t */\n\tget kind(): MediaKind\n\t{\n\t\treturn this._kind;\n\t}\n\n\t/**\n\t * Associated RTCRtpSender.\n\t */\n\tget rtpSender(): RTCRtpSender | undefined\n\t{\n\t\treturn this._rtpSender;\n\t}\n\n\t/**\n\t * The associated track.\n\t */\n\tget track(): MediaStreamTrack | null\n\t{\n\t\treturn this._track;\n\t}\n\n\t/**\n\t * RTP parameters.\n\t */\n\tget rtpParameters(): RtpParameters\n\t{\n\t\treturn this._rtpParameters;\n\t}\n\n\t/**\n\t * Whether the Producer is paused.\n\t */\n\tget paused(): boolean\n\t{\n\t\treturn this._paused;\n\t}\n\n\t/**\n\t * Max spatial layer.\n\t *\n\t * @type {Number | undefined}\n\t */\n\tget maxSpatialLayer(): number | undefined\n\t{\n\t\treturn this._maxSpatialLayer;\n\t}\n\n\t/**\n\t * App custom data.\n\t */\n\tget appData(): ProducerAppData\n\t{\n\t\treturn this._appData;\n\t}\n\n\t/**\n\t * App custom data setter.\n\t */\n\tset appData(appData: ProducerAppData)\n\t{\n\t\tthis._appData = appData;\n\t}\n\n\tget observer(): EnhancedEventEmitter\n\t{\n\t\treturn this._observer;\n\t}\n\n\t/**\n\t * Closes the Producer.\n\t */\n\tclose(): void\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.debug('close()');\n\n\t\tthis._closed = true;\n\n\t\tthis.destroyTrack();\n\n\t\tthis.emit('@close');\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('close');\n\t}\n\n\t/**\n\t * Transport was closed.\n\t */\n\ttransportClosed(): void\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.debug('transportClosed()');\n\n\t\tthis._closed = true;\n\n\t\tthis.destroyTrack();\n\n\t\tthis.safeEmit('transportclose');\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('close');\n\t}\n\n\t/**\n\t * Get associated RTCRtpSender stats.\n\t */\n\tasync getStats(): Promise<RTCStatsReport>\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\tthrow new InvalidStateError('closed');\n\t\t}\n\n\t\treturn new Promise<RTCStatsReport>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@getstats',\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Pauses sending media.\n\t */\n\tpause(): void\n\t{\n\t\tlogger.debug('pause()');\n\n\t\tif (this._closed)\n\t\t{\n\t\t\tlogger.error('pause() | Producer closed');\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis._paused = true;\n\n\t\tif (this._track && this._disableTrackOnPause)\n\t\t{\n\t\t\tthis._track.enabled = false;\n\t\t}\n\n\t\tif (this._zeroRtpOnPause)\n\t\t{\n\t\t\tnew Promise<void>((resolve, reject) =>\n\t\t\t{\n\t\t\t\tthis.safeEmit(\n\t\t\t\t\t'@pause',\n\t\t\t\t\tresolve,\n\t\t\t\t\treject\n\t\t\t\t);\n\t\t\t}).catch(() => {});\n\t\t}\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('pause');\n\t}\n\n\t/**\n\t * Resumes sending media.\n\t */\n\tresume(): void\n\t{\n\t\tlogger.debug('resume()');\n\n\t\tif (this._closed)\n\t\t{\n\t\t\tlogger.error('resume() | Producer closed');\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis._paused = false;\n\n\t\tif (this._track && this._disableTrackOnPause)\n\t\t{\n\t\t\tthis._track.enabled = true;\n\t\t}\n\n\t\tif (this._zeroRtpOnPause)\n\t\t{\n\t\t\tnew Promise<void>((resolve, reject) =>\n\t\t\t{\n\t\t\t\tthis.safeEmit(\n\t\t\t\t\t'@resume',\n\t\t\t\t\tresolve,\n\t\t\t\t\treject\n\t\t\t\t);\n\t\t\t}).catch(() => {});\n\t\t}\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('resume');\n\t}\n\n\t/**\n\t * Replaces the current track with a new one or null.\n\t */\n\tasync replaceTrack({ track }: { track: MediaStreamTrack | null }): Promise<void>\n\t{\n\t\tlogger.debug('replaceTrack() [track:%o]', track);\n\n\t\tif (this._closed)\n\t\t{\n\t\t\t// This must be done here. Otherwise there is no chance to stop the given\n\t\t\t// track.\n\t\t\tif (track && this._stopTracks)\n\t\t\t{\n\t\t\t\ttry { track.stop(); }\n\t\t\t\tcatch (error) {}\n\t\t\t}\n\n\t\t\tthrow new InvalidStateError('closed');\n\t\t}\n\t\telse if (track && track.readyState === 'ended')\n\t\t{\n\t\t\tthrow new InvalidStateError('track ended');\n\t\t}\n\n\t\t// Do nothing if this is the same track as the current handled one.\n\t\tif (track === this._track)\n\t\t{\n\t\t\tlogger.debug('replaceTrack() | same track, ignored');\n\n\t\t\treturn;\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@replacetrack',\n\t\t\t\ttrack,\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\n\t\t// Destroy the previous track.\n\t\tthis.destroyTrack();\n\n\t\t// Set the new track.\n\t\tthis._track = track;\n\n\t\t// If this Producer was paused/resumed and the state of the new\n\t\t// track does not match, fix it.\n\t\tif (this._track && this._disableTrackOnPause)\n\t\t{\n\t\t\tif (!this._paused)\n\t\t\t{\n\t\t\t\tthis._track.enabled = true;\n\t\t\t}\n\t\t\telse if (this._paused)\n\t\t\t{\n\t\t\t\tthis._track.enabled = false;\n\t\t\t}\n\t\t}\n\n\t\t// Handle the effective track.\n\t\tthis.handleTrack();\n\t}\n\n\t/**\n\t * Sets the video max spatial layer to be sent.\n\t */\n\tasync setMaxSpatialLayer(spatialLayer: number): Promise<void>\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\tthrow new InvalidStateError('closed');\n\t\t}\n\t\telse if (this._kind !== 'video')\n\t\t{\n\t\t\tthrow new UnsupportedError('not a video Producer');\n\t\t}\n\t\telse if (typeof spatialLayer !== 'number')\n\t\t{\n\t\t\tthrow new TypeError('invalid spatialLayer');\n\t\t}\n\n\t\tif (spatialLayer === this._maxSpatialLayer)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@setmaxspatiallayer',\n\t\t\t\tspatialLayer,\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t}).catch(() => {});\n\n\t\tthis._maxSpatialLayer = spatialLayer;\n\t}\n\n\tasync setRtpEncodingParameters(\n\t\tparams: RTCRtpEncodingParameters\n\t): Promise<void>\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\tthrow new InvalidStateError('closed');\n\t\t}\n\t\telse if (typeof params !== 'object')\n\t\t{\n\t\t\tthrow new TypeError('invalid params');\n\t\t}\n\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@setrtpencodingparameters',\n\t\t\t\tparams,\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\t}\n\n\tprivate onTrackEnded(): void\n\t{\n\t\tlogger.debug('track \"ended\" event');\n\n\t\tthis.safeEmit('trackended');\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('trackended');\n\t}\n\n\tprivate handleTrack(): void\n\t{\n\t\tif (!this._track)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tthis._track.addEventListener('ended', this.onTrackEnded);\n\t}\n\n\tprivate destroyTrack(): void\n\t{\n\t\tif (!this._track)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\ttry\n\t\t{\n\t\t\tthis._track.removeEventListener('ended', this.onTrackEnded);\n\n\t\t\t// Just stop the track unless the app set stopTracks: false.\n\t\t\tif (this._stopTracks)\n\t\t\t{\n\t\t\t\tthis._track.stop();\n\t\t\t}\n\t\t}\n\t\tcatch (error)\n\t\t{}\n\t}\n}\n","import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './EnhancedEventEmitter';\nimport { InvalidStateError } from './errors';\nimport { MediaKind, RtpParameters } from './RtpParameters';\nimport { AppData } from './types';\n\nconst logger = new Logger('Consumer');\n\nexport type ConsumerOptions<ConsumerAppData extends AppData = AppData> =\n{\n\tid?: string;\n\tproducerId?: string;\n\tkind?: 'audio' | 'video';\n\trtpParameters: RtpParameters;\n\tstreamId?: string;\n\tappData?: ConsumerAppData;\n};\n\nexport type ConsumerEvents =\n{\n\ttransportclose: [];\n\ttrackended: [];\n\t// Private events.\n\t'@getstats': [(stats: RTCStatsReport) => void, (error: Error) => void];\n\t'@close': [];\n\t'@pause': [];\n\t'@resume': [];\n};\n\nexport type ConsumerObserverEvents =\n{\n\tclose: [];\n\tpause: [];\n\tresume: [];\n\ttrackended: [];\n};\n\nexport class Consumer<ConsumerAppData extends AppData = AppData>\n\textends EnhancedEventEmitter<ConsumerEvents>\n{\n\t// Id.\n\tprivate readonly _id: string;\n\t// Local id.\n\tprivate readonly _localId: string;\n\t// Associated Producer id.\n\tprivate readonly _producerId: string;\n\t// Closed flag.\n\tprivate _closed = false;\n\t// Associated RTCRtpReceiver.\n\tprivate readonly _rtpReceiver?: RTCRtpReceiver;\n\t// Remote track.\n\tprivate readonly _track: MediaStreamTrack;\n\t// RTP parameters.\n\tprivate readonly _rtpParameters: RtpParameters;\n\t// Paused flag.\n\tprivate _paused: boolean;\n\t// App custom data.\n\tprivate _appData: ConsumerAppData;\n\t// Observer instance.\n\tprotected readonly _observer = new EnhancedEventEmitter<ConsumerObserverEvents>();\n\n\tconstructor(\n\t\t{\n\t\t\tid,\n\t\t\tlocalId,\n\t\t\tproducerId,\n\t\t\trtpReceiver,\n\t\t\ttrack,\n\t\t\trtpParameters,\n\t\t\tappData\n\t\t}:\n\t\t{\n\t\t\tid: string;\n\t\t\tlocalId: string;\n\t\t\tproducerId: string;\n\t\t\trtpReceiver?: RTCRtpReceiver;\n\t\t\ttrack: MediaStreamTrack;\n\t\t\trtpParameters: RtpParameters;\n\t\t\tappData?: ConsumerAppData;\n\t\t}\n\t)\n\t{\n\t\tsuper();\n\n\t\tlogger.debug('constructor()');\n\n\t\tthis._id = id;\n\t\tthis._localId = localId;\n\t\tthis._producerId = producerId;\n\t\tthis._rtpReceiver = rtpReceiver;\n\t\tthis._track = track;\n\t\tthis._rtpParameters = rtpParameters;\n\t\tthis._paused = !track.enabled;\n\t\tthis._appData = appData || {} as ConsumerAppData;\n\t\tthis.onTrackEnded = this.onTrackEnded.bind(this);\n\n\t\tthis.handleTrack();\n\t}\n\n\t/**\n\t * Consumer id.\n\t */\n\tget id(): string\n\t{\n\t\treturn this._id;\n\t}\n\n\t/**\n\t * Local id.\n\t */\n\tget localId(): string\n\t{\n\t\treturn this._localId;\n\t}\n\n\t/**\n\t * Associated Producer id.\n\t */\n\tget producerId(): string\n\t{\n\t\treturn this._producerId;\n\t}\n\n\t/**\n\t * Whether the Consumer is closed.\n\t */\n\tget closed(): boolean\n\t{\n\t\treturn this._closed;\n\t}\n\n\t/**\n\t * Media kind.\n\t */\n\tget kind(): MediaKind\n\t{\n\t\treturn this._track.kind as MediaKind;\n\t}\n\n\t/**\n\t * Associated RTCRtpReceiver.\n\t */\n\tget rtpReceiver(): RTCRtpReceiver | undefined\n\t{\n\t\treturn this._rtpReceiver;\n\t}\n\n\t/**\n\t * The associated track.\n\t */\n\tget track(): MediaStreamTrack\n\t{\n\t\treturn this._track;\n\t}\n\n\t/**\n\t * RTP parameters.\n\t */\n\tget rtpParameters(): RtpParameters\n\t{\n\t\treturn this._rtpParameters;\n\t}\n\n\t/**\n\t * Whether the Consumer is paused.\n\t */\n\tget paused(): boolean\n\t{\n\t\treturn this._paused;\n\t}\n\n\t/**\n\t * App custom data.\n\t */\n\tget appData(): ConsumerAppData\n\t{\n\t\treturn this._appData;\n\t}\n\n\t/**\n\t * App custom data setter.\n\t */\n\tset appData(appData: ConsumerAppData)\n\t{\n\t\tthis._appData = appData;\n\t}\n\n\tget observer(): EnhancedEventEmitter\n\t{\n\t\treturn this._observer;\n\t}\n\n\t/**\n\t * Closes the Consumer.\n\t */\n\tclose(): void\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.debug('close()');\n\n\t\tthis._closed = true;\n\n\t\tthis.destroyTrack();\n\n\t\tthis.emit('@close');\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('close');\n\t}\n\n\t/**\n\t * Transport was closed.\n\t */\n\ttransportClosed(): void\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.debug('transportClosed()');\n\n\t\tthis._closed = true;\n\n\t\tthis.destroyTrack();\n\n\t\tthis.safeEmit('transportclose');\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('close');\n\t}\n\n\t/**\n\t * Get associated RTCRtpReceiver stats.\n\t */\n\tasync getStats(): Promise<RTCStatsReport>\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\tthrow new InvalidStateError('closed');\n\t\t}\n\n\t\treturn new Promise<RTCStatsReport>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@getstats',\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\t}\n\n\t/**\n\t * Pauses receiving media.\n\t */\n\tpause(): void\n\t{\n\t\tlogger.debug('pause()');\n\n\t\tif (this._closed)\n\t\t{\n\t\t\tlogger.error('pause() | Consumer closed');\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._paused)\n\t\t{\n\t\t\tlogger.debug('pause() | Consumer is already paused');\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis._paused = true;\n\t\tthis._track.enabled = false;\n\n\t\tthis.emit('@pause');\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('pause');\n\t}\n\n\t/**\n\t * Resumes receiving media.\n\t */\n\tresume(): void\n\t{\n\t\tlogger.debug('resume()');\n\n\t\tif (this._closed)\n\t\t{\n\t\t\tlogger.error('resume() | Consumer closed');\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._paused)\n\t\t{\n\t\t\tlogger.debug('resume() | Consumer is already resumed');\n\n\t\t\treturn;\n\t\t}\n\n\t\tthis._paused = false;\n\t\tthis._track.enabled = true;\n\n\t\tthis.emit('@resume');\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('resume');\n\t}\n\n\tprivate onTrackEnded(): void\n\t{\n\t\tlogger.debug('track \"ended\" event');\n\n\t\tthis.safeEmit('trackended');\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('trackended');\n\t}\n\n\tprivate handleTrack(): void\n\t{\n\t\tthis._track.addEventListener('ended', this.onTrackEnded);\n\t}\n\n\tprivate destroyTrack(): void\n\t{\n\t\ttry\n\t\t{\n\t\t\tthis._track.removeEventListener('ended', this.onTrackEnded);\n\t\t\tthis._track.stop();\n\t\t}\n\t\tcatch (error)\n\t\t{}\n\t}\n}\n","import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './EnhancedEventEmitter';\nimport { InvalidStateError } from './errors';\nimport { SctpStreamParameters } from './SctpParameters';\nimport { AppData } from './types';\n\nconst logger = new Logger('DataProducer');\n\nexport type DataProducerOptions<DataProducerAppData extends AppData = AppData> =\n{\n\tordered?: boolean;\n\tmaxPacketLifeTime?: number;\n\tmaxRetransmits?: number;\n\tlabel?: string;\n\tprotocol?: string;\n\tappData?: DataProducerAppData;\n};\n\nexport type DataProducerEvents =\n{\n\ttransportclose: [];\n\topen: [];\n\terror: [Error];\n\tclose: [];\n\tbufferedamountlow: [];\n\t// Private events.\n\t'@close': [];\n};\n\nexport type DataProducerObserverEvents =\n{\n\tclose: [];\n};\n\nexport class DataProducer<DataProducerAppData extends AppData = AppData>\n\textends EnhancedEventEmitter<DataProducerEvents>\n{\n\t// Id.\n\tprivate readonly _id: string;\n\t// The underlying RTCDataChannel instance.\n\tprivate readonly _dataChannel: RTCDataChannel;\n\t// Closed flag.\n\tprivate _closed = false;\n\t// SCTP stream parameters.\n\tprivate readonly _sctpStreamParameters: SctpStreamParameters;\n\t// App custom data.\n\tprivate _appData: DataProducerAppData;\n\t// Observer instance.\n\tprotected readonly _observer = new EnhancedEventEmitter<DataProducerObserverEvents>();\n\n\tconstructor(\n\t\t{\n\t\t\tid,\n\t\t\tdataChannel,\n\t\t\tsctpStreamParameters,\n\t\t\tappData\n\t\t}:\n\t\t{\n\t\t\tid: string;\n\t\t\tdataChannel: RTCDataChannel;\n\t\t\tsctpStreamParameters: SctpStreamParameters;\n\t\t\tappData?: DataProducerAppData;\n\t\t}\n\t)\n\t{\n\t\tsuper();\n\n\t\tlogger.debug('constructor()');\n\n\t\tthis._id = id;\n\t\tthis._dataChannel = dataChannel;\n\t\tthis._sctpStreamParameters = sctpStreamParameters;\n\t\tthis._appData = appData || {} as DataProducerAppData;\n\n\t\tthis.handleDataChannel();\n\t}\n\n\t/**\n\t * DataProducer id.\n\t */\n\tget id(): string\n\t{\n\t\treturn this._id;\n\t}\n\n\t/**\n\t * Whether the DataProducer is closed.\n\t */\n\tget closed(): boolean\n\t{\n\t\treturn this._closed;\n\t}\n\n\t/**\n\t * SCTP stream parameters.\n\t */\n\tget sctpStreamParameters(): SctpStreamParameters\n\t{\n\t\treturn this._sctpStreamParameters;\n\t}\n\n\t/**\n\t * DataChannel readyState.\n\t */\n\tget readyState(): RTCDataChannelState\n\t{\n\t\treturn this._dataChannel.readyState;\n\t}\n\n\t/**\n\t * DataChannel label.\n\t */\n\tget label(): string\n\t{\n\t\treturn this._dataChannel.label;\n\t}\n\n\t/**\n\t * DataChannel protocol.\n\t */\n\tget protocol(): string\n\t{\n\t\treturn this._dataChannel.protocol;\n\t}\n\n\t/**\n\t * DataChannel bufferedAmount.\n\t */\n\tget bufferedAmount(): number\n\t{\n\t\treturn this._dataChannel.bufferedAmount;\n\t}\n\n\t/**\n\t * DataChannel bufferedAmountLowThreshold.\n\t */\n\tget bufferedAmountLowThreshold(): number\n\t{\n\t\treturn this._dataChannel.bufferedAmountLowThreshold;\n\t}\n\n\t/**\n\t * Set DataChannel bufferedAmountLowThreshold.\n\t */\n\tset bufferedAmountLowThreshold(bufferedAmountLowThreshold: number)\n\t{\n\t\tthis._dataChannel.bufferedAmountLowThreshold = bufferedAmountLowThreshold;\n\t}\n\n\t/**\n\t * App custom data.\n\t */\n\tget appData(): DataProducerAppData\n\t{\n\t\treturn this._appData;\n\t}\n\n\t/**\n\t * App custom data setter.\n\t */\n\tset appData(appData: DataProducerAppData)\n\t{\n\t\tthis._appData = appData;\n\t}\n\n\tget observer(): EnhancedEventEmitter\n\t{\n\t\treturn this._observer;\n\t}\n\n\t/**\n\t * Closes the DataProducer.\n\t */\n\tclose(): void\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.debug('close()');\n\n\t\tthis._closed = true;\n\n\t\tthis._dataChannel.close();\n\n\t\tthis.emit('@close');\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('close');\n\t}\n\n\t/**\n\t * Transport was closed.\n\t */\n\ttransportClosed(): void\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.debug('transportClosed()');\n\n\t\tthis._closed = true;\n\n\t\tthis._dataChannel.close();\n\n\t\tthis.safeEmit('transportclose');\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('close');\n\t}\n\n\t/**\n\t * Send a message.\n\t *\n\t * @param {String|Blob|ArrayBuffer|ArrayBufferView} data.\n\t */\n\tsend(data: any): void\n\t{\n\t\tlogger.debug('send()');\n\n\t\tif (this._closed)\n\t\t{\n\t\t\tthrow new InvalidStateError('closed');\n\t\t}\n\n\t\tthis._dataChannel.send(data);\n\t}\n\n\tprivate handleDataChannel(): void\n\t{\n\t\tthis._dataChannel.addEventListener('open', () =>\n\t\t{\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger.debug('DataChannel \"open\" event');\n\n\t\t\tthis.safeEmit('open');\n\t\t});\n\n\t\tthis._dataChannel.addEventListener('error', (event: any) =>\n\t\t{\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet { error } = event;\n\n\t\t\tif (!error)\n\t\t\t{\n\t\t\t\terror = new Error('unknown DataChannel error');\n\t\t\t}\n\n\t\t\tif (error.errorDetail === 'sctp-failure')\n\t\t\t{\n\t\t\t\tlogger.error(\n\t\t\t\t\t'DataChannel SCTP error [sctpCauseCode:%s]: %s',\n\t\t\t\t\terror.sctpCauseCode, error.message);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlogger.error('DataChannel \"error\" event: %o', error);\n\t\t\t}\n\n\t\t\tthis.safeEmit('error', error);\n\t\t});\n\n\t\tthis._dataChannel.addEventListener('close', () =>\n\t\t{\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger.warn('DataChannel \"close\" event');\n\n\t\t\tthis._closed = true;\n\n\t\t\tthis.emit('@close');\n\t\t\tthis.safeEmit('close');\n\n\t\t\t// Emit observer event.\n\t\t\tthis._observer.safeEmit('close');\n\t\t});\n\n\t\tthis._dataChannel.addEventListener('message', () =>\n\t\t{\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger.warn(\n\t\t\t\t'DataChannel \"message\" event in a DataProducer, message discarded');\n\t\t});\n\n\t\tthis._dataChannel.addEventListener('bufferedamountlow', () =>\n\t\t{\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.safeEmit('bufferedamountlow');\n\t\t});\n\t}\n}\n","import { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './EnhancedEventEmitter';\nimport { SctpStreamParameters } from './SctpParameters';\nimport { AppData } from './types';\n\nconst logger = new Logger('DataConsumer');\n\nexport type DataConsumerOptions<DataConsumerAppData extends AppData = AppData> =\n{\n\tid?: string;\n\tdataProducerId?: string;\n\tsctpStreamParameters: SctpStreamParameters;\n\tlabel?: string;\n\tprotocol?: string;\n\tappData?: DataConsumerAppData;\n};\n\nexport type DataConsumerEvents =\n{\n\ttransportclose: [];\n\topen: [];\n\terror: [Error];\n\tclose: [];\n\tmessage: [any];\n\t// Private events.\n\t'@close': [];\n};\n\nexport type DataConsumerObserverEvents =\n{\n\tclose: [];\n};\n\nexport class DataConsumer<DataConsumerAppData extends AppData = AppData>\n\textends EnhancedEventEmitter<DataConsumerEvents>\n{\n\t// Id.\n\tprivate readonly _id: string;\n\t// Associated DataProducer Id.\n\tprivate readonly _dataProducerId: string;\n\t// The underlying RTCDataChannel instance.\n\tprivate readonly _dataChannel: RTCDataChannel;\n\t// Closed flag.\n\tprivate _closed = false;\n\t// SCTP stream parameters.\n\tprivate readonly _sctpStreamParameters: SctpStreamParameters;\n\t// App custom data.\n\tprivate _appData: DataConsumerAppData;\n\t// Observer instance.\n\tprotected readonly _observer = new EnhancedEventEmitter<DataConsumerObserverEvents>();\n\n\tconstructor(\n\t\t{\n\t\t\tid,\n\t\t\tdataProducerId,\n\t\t\tdataChannel,\n\t\t\tsctpStreamParameters,\n\t\t\tappData\n\t\t}:\n\t\t{\n\t\t\tid: string;\n\t\t\tdataProducerId: string;\n\t\t\tdataChannel: RTCDataChannel;\n\t\t\tsctpStreamParameters: SctpStreamParameters;\n\t\t\tappData?: DataConsumerAppData;\n\t\t}\n\t)\n\t{\n\t\tsuper();\n\n\t\tlogger.debug('constructor()');\n\n\t\tthis._id = id;\n\t\tthis._dataProducerId = dataProducerId;\n\t\tthis._dataChannel = dataChannel;\n\t\tthis._sctpStreamParameters = sctpStreamParameters;\n\t\tthis._appData = appData || {} as DataConsumerAppData;\n\n\t\tthis.handleDataChannel();\n\t}\n\n\t/**\n\t * DataConsumer id.\n\t */\n\tget id(): string\n\t{\n\t\treturn this._id;\n\t}\n\n\t/**\n\t * Associated DataProducer id.\n\t */\n\tget dataProducerId(): string\n\t{\n\t\treturn this._dataProducerId;\n\t}\n\n\t/**\n\t * Whether the DataConsumer is closed.\n\t */\n\tget closed(): boolean\n\t{\n\t\treturn this._closed;\n\t}\n\n\t/**\n\t * SCTP stream parameters.\n\t */\n\tget sctpStreamParameters(): SctpStreamParameters\n\t{\n\t\treturn this._sctpStreamParameters;\n\t}\n\n\t/**\n\t * DataChannel readyState.\n\t */\n\tget readyState(): RTCDataChannelState\n\t{\n\t\treturn this._dataChannel.readyState;\n\t}\n\n\t/**\n\t * DataChannel label.\n\t */\n\tget label(): string\n\t{\n\t\treturn this._dataChannel.label;\n\t}\n\n\t/**\n\t * DataChannel protocol.\n\t */\n\tget protocol(): string\n\t{\n\t\treturn this._dataChannel.protocol;\n\t}\n\n\t/**\n\t * DataChannel binaryType.\n\t */\n\tget binaryType(): BinaryType\n\t{\n\t\treturn this._dataChannel.binaryType;\n\t}\n\n\t/**\n\t * Set DataChannel binaryType.\n\t */\n\tset binaryType(binaryType: BinaryType)\n\t{\n\t\tthis._dataChannel.binaryType = binaryType;\n\t}\n\n\t/**\n\t * App custom data.\n\t */\n\tget appData(): DataConsumerAppData\n\t{\n\t\treturn this._appData;\n\t}\n\n\t/**\n\t * App custom data setter.\n\t */\n\tset appData(appData: DataConsumerAppData)\n\t{\n\t\tthis._appData = appData;\n\t}\n\n\tget observer(): EnhancedEventEmitter\n\t{\n\t\treturn this._observer;\n\t}\n\n\t/**\n\t * Closes the DataConsumer.\n\t */\n\tclose(): void\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.debug('close()');\n\n\t\tthis._closed = true;\n\n\t\tthis._dataChannel.close();\n\n\t\tthis.emit('@close');\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('close');\n\t}\n\n\t/**\n\t * Transport was closed.\n\t */\n\ttransportClosed(): void\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.debug('transportClosed()');\n\n\t\tthis._closed = true;\n\n\t\tthis._dataChannel.close();\n\n\t\tthis.safeEmit('transportclose');\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('close');\n\t}\n\n\tprivate handleDataChannel(): void\n\t{\n\t\tthis._dataChannel.addEventListener('open', () =>\n\t\t{\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger.debug('DataChannel \"open\" event');\n\n\t\t\tthis.safeEmit('open');\n\t\t});\n\n\t\tthis._dataChannel.addEventListener('error', (event: any) =>\n\t\t{\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet { error } = event;\n\n\t\t\tif (!error)\n\t\t\t{\n\t\t\t\terror = new Error('unknown DataChannel error');\n\t\t\t}\n\n\t\t\tif (error.errorDetail === 'sctp-failure')\n\t\t\t{\n\t\t\t\tlogger.error(\n\t\t\t\t\t'DataChannel SCTP error [sctpCauseCode:%s]: %s',\n\t\t\t\t\terror.sctpCauseCode, error.message);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tlogger.error('DataChannel \"error\" event: %o', error);\n\t\t\t}\n\n\t\t\tthis.safeEmit('error', error);\n\t\t});\n\n\t\tthis._dataChannel.addEventListener('close', () =>\n\t\t{\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger.warn('DataChannel \"close\" event');\n\n\t\t\tthis._closed = true;\n\n\t\t\tthis.emit('@close');\n\t\t\tthis.safeEmit('close');\n\n\t\t\t// Emit observer event.\n\t\t\tthis._observer.safeEmit('close');\n\t\t});\n\n\t\tthis._dataChannel.addEventListener('message', (event: any) =>\n\t\t{\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.safeEmit('message', event.data);\n\t\t});\n\t}\n}\n","import { AwaitQueue } from 'awaitqueue';\nimport queueMicrotask from 'queue-microtask';\nimport { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './EnhancedEventEmitter';\nimport { UnsupportedError, InvalidStateError } from './errors';\nimport * as utils from './utils';\nimport * as ortc from './ortc';\nimport { HandlerFactory, HandlerInterface, HandlerReceiveOptions } from './handlers/HandlerInterface';\nimport { Producer, ProducerOptions } from './Producer';\nimport { Consumer, ConsumerOptions } from './Consumer';\nimport { DataProducer, DataProducerOptions } from './DataProducer';\nimport { DataConsumer, DataConsumerOptions } from './DataConsumer';\nimport { RtpParameters, MediaKind } from './RtpParameters';\nimport { SctpParameters, SctpStreamParameters } from './SctpParameters';\nimport { AppData } from './types';\n\nconst logger = new Logger('Transport');\n\nexport type TransportOptions<TransportAppData extends AppData = AppData> =\n{\n\tid: string;\n\ticeParameters: IceParameters;\n\ticeCandidates: IceCandidate[];\n\tdtlsParameters: DtlsParameters;\n\tsctpParameters?: SctpParameters;\n\ticeServers?: RTCIceServer[];\n\ticeTransportPolicy?: RTCIceTransportPolicy;\n\tadditionalSettings?: any;\n\tproprietaryConstraints?: any;\n\tappData?: TransportAppData;\n};\n\nexport type CanProduceByKind =\n{\n\taudio: boolean;\n\tvideo: boolean;\n\t[key: string]: boolean;\n};\n\nexport type IceParameters =\n{\n\t/**\n\t * ICE username fragment.\n\t * */\n\tusernameFragment: string;\n\t/**\n\t * ICE password.\n\t */\n\tpassword: string;\n\t/**\n\t * ICE Lite.\n\t */\n\ticeLite?: boolean;\n};\n\nexport type IceCandidate =\n{\n\t/**\n\t * Unique identifier that allows ICE to correlate candidates that appear on\n\t * multiple transports.\n\t */\n\tfoundation: string;\n\t/**\n\t * The assigned priority of the candidate.\n\t */\n\tpriority: number;\n\t/**\n\t * The IP address of the candidate.\n\t */\n\tip: string;\n\t/**\n\t * The protocol of the candidate.\n\t */\n\tprotocol: 'udp' | 'tcp';\n\t/**\n\t * The port for the candidate.\n\t */\n\tport: number;\n\t/**\n\t * The type of candidate.\n\t */\n\ttype: 'host' | 'srflx' | 'prflx' | 'relay';\n\t/**\n\t * The type of TCP candidate.\n\t */\n\ttcpType?: 'active' | 'passive' | 'so';\n};\n\nexport type DtlsParameters =\n{\n\t/**\n\t * Server DTLS role. Default 'auto'.\n\t */\n\trole?: DtlsRole;\n\t/**\n\t * Server DTLS fingerprints.\n\t */\n\tfingerprints: DtlsFingerprint[];\n};\n\n/**\n * The hash function algorithm (as defined in the \"Hash function Textual Names\"\n * registry initially specified in RFC 4572 Section 8) and its corresponding\n * certificate fingerprint value (in lowercase hex string as expressed utilizing\n * the syntax of \"fingerprint\" in RFC 4572 Section 5).\n */\nexport type DtlsFingerprint =\n{\n\talgorithm: string;\n\tvalue: string;\n};\n\nexport type DtlsRole = 'auto' | 'client' | 'server';\n\nexport type ConnectionState =\n\t| 'new'\n\t| 'connecting'\n\t| 'connected'\n\t| 'failed'\n\t| 'disconnected'\n\t| 'closed';\n\nexport type PlainRtpParameters =\n{\n\tip: string;\n\tipVersion: 4 | 6;\n\tport: number;\n};\n\nexport type TransportEvents =\n{\n\tconnect: [{ dtlsParameters: DtlsParameters }, () => void, (error: Error) => void];\n\tconnectionstatechange: [ConnectionState];\n\tproduce:\n\t[\n\t\t{\n\t\t\tkind: MediaKind;\n\t\t\trtpParameters: RtpParameters;\n\t\t\tappData: AppData;\n\t\t},\n\t\t({ id }: { id: string }) => void,\n\t\t(error: Error) => void\n\t];\n\tproducedata:\n\t[\n\t\t{\n\t\t\tsctpStreamParameters: SctpStreamParameters;\n\t\t\tlabel?: string;\n\t\t\tprotocol?: string;\n\t\t\tappData: AppData;\n\t\t},\n\t\t({ id }: { id: string }) => void,\n\t\t(error: Error) => void\n\t];\n};\n\nexport type TransportObserverEvents =\n{\n\tclose: [];\n\tnewproducer: [Producer];\n\tnewconsumer: [Consumer];\n\tnewdataproducer: [DataProducer];\n\tnewdataconsumer: [DataConsumer];\n};\n\nclass ConsumerCreationTask\n{\n\tconsumerOptions: ConsumerOptions;\n\tpromise: Promise<Consumer>;\n\tresolve?: (consumer: Consumer) => void;\n\treject?: (error: Error) => void;\n\n\tconstructor(consumerOptions: ConsumerOptions)\n\t{\n\t\tthis.consumerOptions = consumerOptions;\n\t\tthis.promise = new Promise((resolve, reject) =>\n\t\t{\n\t\t\tthis.resolve = resolve;\n\t\t\tthis.reject = reject;\n\t\t});\n\t}\n}\n\nexport class Transport<TransportAppData extends AppData = AppData>\n\textends EnhancedEventEmitter<TransportEvents>\n{\n\t// Id.\n\tprivate readonly _id: string;\n\t// Closed flag.\n\tprivate _closed = false;\n\t// Direction.\n\tprivate readonly _direction: 'send' | 'recv';\n\t// Extended RTP capabilities.\n\tprivate readonly _extendedRtpCapabilities: any;\n\t// Whether we can produce audio/video based on computed extended RTP\n\t// capabilities.\n\tprivate readonly _canProduceByKind: CanProduceByKind;\n\t// SCTP max message size if enabled, null otherwise.\n\tprivate readonly _maxSctpMessageSize?: number | null;\n\t// RTC handler isntance.\n\tprivate readonly _handler: HandlerInterface;\n\t// Transport connection state.\n\tprivate _connectionState: ConnectionState = 'new';\n\t// App custom data.\n\tprivate _appData: TransportAppData;\n\t// Map of Producers indexed by id.\n\tprivate readonly _producers: Map<string, Producer> = new Map();\n\t// Map of Consumers indexed by id.\n\tprivate readonly _consumers: Map<string, Consumer> = new Map();\n\t// Map of DataProducers indexed by id.\n\tprivate readonly _dataProducers: Map<string, DataProducer> = new Map();\n\t// Map of DataConsumers indexed by id.\n\tprivate readonly _dataConsumers: Map<string, DataConsumer> = new Map();\n\t// Whether the Consumer for RTP probation has been created.\n\tprivate _probatorConsumerCreated = false;\n\t// AwaitQueue instance to make async tasks happen sequentially.\n\tprivate readonly _awaitQueue = new AwaitQueue();\n\t// Consumer creation tasks awaiting to be processed.\n\tprivate _pendingConsumerTasks: ConsumerCreationTask[] = [];\n\t// Consumer creation in progress flag.\n\tprivate _consumerCreationInProgress = false;\n\t// Consumers pending to be paused.\n\tprivate _pendingPauseConsumers: Map<string, Consumer> = new Map();\n\t// Consumer pause in progress flag.\n\tprivate _consumerPauseInProgress = false;\n\t// Consumers pending to be resumed.\n\tprivate _pendingResumeConsumers: Map<string, Consumer> = new Map();\n\t// Consumer resume in progress flag.\n\tprivate _consumerResumeInProgress = false;\n\t// Consumers pending to be closed.\n\tprivate _pendingCloseConsumers: Map<string, Consumer> = new Map();\n\t// Consumer close in progress flag.\n\tprivate _consumerCloseInProgress = false;\n\t// Observer instance.\n\tprotected readonly _observer = new EnhancedEventEmitter<TransportObserverEvents>();\n\n\tconstructor(\n\t\t{\n\t\t\tdirection,\n\t\t\tid,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\tappData,\n\t\t\thandlerFactory,\n\t\t\textendedRtpCapabilities,\n\t\t\tcanProduceByKind\n\t\t}:\n\t\t{\n\t\t\tdirection: 'send' | 'recv';\n\t\t\thandlerFactory: HandlerFactory;\n\t\t\textendedRtpCapabilities: any;\n\t\t\tcanProduceByKind: CanProduceByKind;\n\t\t} & TransportOptions<TransportAppData>\n\t)\n\t{\n\t\tsuper();\n\n\t\tlogger.debug('constructor() [id:%s, direction:%s]', id, direction);\n\n\t\tthis._id = id;\n\t\tthis._direction = direction;\n\t\tthis._extendedRtpCapabilities = extendedRtpCapabilities;\n\t\tthis._canProduceByKind = canProduceByKind;\n\t\tthis._maxSctpMessageSize =\n\t\t\tsctpParameters ? sctpParameters.maxMessageSize : null;\n\n\t\t// Clone and sanitize additionalSettings.\n\t\tadditionalSettings = utils.clone(additionalSettings, {});\n\n\t\tdelete additionalSettings.iceServers;\n\t\tdelete additionalSettings.iceTransportPolicy;\n\t\tdelete additionalSettings.bundlePolicy;\n\t\tdelete additionalSettings.rtcpMuxPolicy;\n\t\tdelete additionalSettings.sdpSemantics;\n\n\t\tthis._handler = handlerFactory();\n\n\t\tthis._handler.run(\n\t\t\t{\n\t\t\t\tdirection,\n\t\t\t\ticeParameters,\n\t\t\t\ticeCandidates,\n\t\t\t\tdtlsParameters,\n\t\t\t\tsctpParameters,\n\t\t\t\ticeServers,\n\t\t\t\ticeTransportPolicy,\n\t\t\t\tadditionalSettings,\n\t\t\t\tproprietaryConstraints,\n\t\t\t\textendedRtpCapabilities\n\t\t\t});\n\n\t\tthis._appData = appData || {} as TransportAppData;\n\n\t\tthis.handleHandler();\n\t}\n\n\t/**\n\t * Transport id.\n\t */\n\tget id(): string\n\t{\n\t\treturn this._id;\n\t}\n\n\t/**\n\t * Whether the Transport is closed.\n\t */\n\tget closed(): boolean\n\t{\n\t\treturn this._closed;\n\t}\n\n\t/**\n\t * Transport direction.\n\t */\n\tget direction(): 'send' | 'recv'\n\t{\n\t\treturn this._direction;\n\t}\n\n\t/**\n\t * RTC handler instance.\n\t */\n\tget handler(): HandlerInterface\n\t{\n\t\treturn this._handler;\n\t}\n\n\t/**\n\t * Connection state.\n\t */\n\tget connectionState(): ConnectionState\n\t{\n\t\treturn this._connectionState;\n\t}\n\n\t/**\n\t * App custom data.\n\t */\n\tget appData(): TransportAppData\n\t{\n\t\treturn this._appData;\n\t}\n\n\t/**\n\t * App custom data setter.\n\t */\n\tset appData(appData: TransportAppData)\n\t{\n\t\tthis._appData = appData;\n\t}\n\n\tget observer(): EnhancedEventEmitter\n\t{\n\t\treturn this._observer;\n\t}\n\n\t/**\n\t * Close the Transport.\n\t */\n\tclose(): void\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.debug('close()');\n\n\t\tthis._closed = true;\n\n\t\t// Stop the AwaitQueue.\n\t\tthis._awaitQueue.stop();\n\n\t\t// Close the handler.\n\t\tthis._handler.close();\n\n\t\t// Close all Producers.\n\t\tfor (const producer of this._producers.values())\n\t\t{\n\t\t\tproducer.transportClosed();\n\t\t}\n\t\tthis._producers.clear();\n\n\t\t// Close all Consumers.\n\t\tfor (const consumer of this._consumers.values())\n\t\t{\n\t\t\tconsumer.transportClosed();\n\t\t}\n\t\tthis._consumers.clear();\n\n\t\t// Close all DataProducers.\n\t\tfor (const dataProducer of this._dataProducers.values())\n\t\t{\n\t\t\tdataProducer.transportClosed();\n\t\t}\n\t\tthis._dataProducers.clear();\n\n\t\t// Close all DataConsumers.\n\t\tfor (const dataConsumer of this._dataConsumers.values())\n\t\t{\n\t\t\tdataConsumer.transportClosed();\n\t\t}\n\t\tthis._dataConsumers.clear();\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('close');\n\t}\n\n\t/**\n\t * Get associated Transport (RTCPeerConnection) stats.\n\t *\n\t * @returns {RTCStatsReport}\n\t */\n\tasync getStats(): Promise<RTCStatsReport>\n\t{\n\t\tif (this._closed)\n\t\t{\n\t\t\tthrow new InvalidStateError('closed');\n\t\t}\n\n\t\treturn this._handler.getTransportStats();\n\t}\n\n\t/**\n\t * Restart ICE connection.\n\t */\n\tasync restartIce(\n\t\t{ iceParameters }:\n\t\t{ iceParameters: IceParameters }\n\t): Promise<void>\n\t{\n\t\tlogger.debug('restartIce()');\n\n\t\tif (this._closed)\n\t\t{\n\t\t\tthrow new InvalidStateError('closed');\n\t\t}\n\t\telse if (!iceParameters)\n\t\t{\n\t\t\tthrow new TypeError('missing iceParameters');\n\t\t}\n\n\t\t// Enqueue command.\n\t\treturn this._awaitQueue.push(\n\t\t\tasync () => this._handler.restartIce(iceParameters),\n\t\t\t'transport.restartIce()');\n\t}\n\n\t/**\n\t * Update ICE servers.\n\t */\n\tasync updateIceServers(\n\t\t{ iceServers }:\n\t\t{ iceServers?: RTCIceServer[] } = {}\n\t): Promise<void>\n\t{\n\t\tlogger.debug('updateIceServers()');\n\n\t\tif (this._closed)\n\t\t{\n\t\t\tthrow new InvalidStateError('closed');\n\t\t}\n\t\telse if (!Array.isArray(iceServers))\n\t\t{\n\t\t\tthrow new TypeError('missing iceServers');\n\t\t}\n\n\t\t// Enqueue command.\n\t\treturn this._awaitQueue.push(\n\t\t\tasync () => this._handler.updateIceServers(iceServers),\n\t\t\t'transport.updateIceServers()');\n\t}\n\n\t/**\n\t * Create a Producer.\n\t */\n\tasync produce<ProducerAppData extends AppData = AppData>(\n\t\t{\n\t\t\ttrack,\n\t\t\tencodings,\n\t\t\tcodecOptions,\n\t\t\tcodec,\n\t\t\tstopTracks = true,\n\t\t\tdisableTrackOnPause = true,\n\t\t\tzeroRtpOnPause = false,\n\t\t\tappData = {} as ProducerAppData\n\t\t}: ProducerOptions<ProducerAppData> = {}\n\t): Promise<Producer<ProducerAppData>>\n\t{\n\t\tlogger.debug('produce() [track:%o]', track);\n\n\t\tif (this._closed)\n\t\t{\n\t\t\tthrow new InvalidStateError('closed');\n\t\t}\n\t\telse if (!track)\n\t\t{\n\t\t\tthrow new TypeError('missing track');\n\t\t}\n\t\telse if (this._direction !== 'send')\n\t\t{\n\t\t\tthrow new UnsupportedError('not a sending Transport');\n\t\t}\n\t\telse if (!this._canProduceByKind[track.kind])\n\t\t{\n\t\t\tthrow new UnsupportedError(`cannot produce ${track.kind}`);\n\t\t}\n\t\telse if (track.readyState === 'ended')\n\t\t{\n\t\t\tthrow new InvalidStateError('track ended');\n\t\t}\n\t\telse if (this.listenerCount('connect') === 0 && this._connectionState === 'new')\n\t\t{\n\t\t\tthrow new TypeError('no \"connect\" listener set into this transport');\n\t\t}\n\t\telse if (this.listenerCount('produce') === 0)\n\t\t{\n\t\t\tthrow new TypeError('no \"produce\" listener set into this transport');\n\t\t}\n\t\telse if (appData && typeof appData !== 'object')\n\t\t{\n\t\t\tthrow new TypeError('if given, appData must be an object');\n\t\t}\n\n\t\t// Enqueue command.\n\t\treturn this._awaitQueue.push(\n\t\t\tasync () =>\n\t\t\t{\n\t\t\t\tlet normalizedEncodings;\n\n\t\t\t\tif (encodings && !Array.isArray(encodings))\n\t\t\t\t{\n\t\t\t\t\tthrow TypeError('encodings must be an array');\n\t\t\t\t}\n\t\t\t\telse if (encodings && encodings.length === 0)\n\t\t\t\t{\n\t\t\t\t\tnormalizedEncodings = undefined;\n\t\t\t\t}\n\t\t\t\telse if (encodings)\n\t\t\t\t{\n\t\t\t\t\tnormalizedEncodings = encodings\n\t\t\t\t\t\t.map((encoding: any) =>\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tconst normalizedEncoding: any = { active: true };\n\n\t\t\t\t\t\t\tif (encoding.active === false)\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnormalizedEncoding.active = false;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof encoding.dtx === 'boolean')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnormalizedEncoding.dtx = encoding.dtx;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof encoding.scalabilityMode === 'string')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnormalizedEncoding.scalabilityMode = encoding.scalabilityMode;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof encoding.scaleResolutionDownBy === 'number')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnormalizedEncoding.scaleResolutionDownBy = encoding.scaleResolutionDownBy;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof encoding.maxBitrate === 'number')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnormalizedEncoding.maxBitrate = encoding.maxBitrate;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof encoding.maxFramerate === 'number')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnormalizedEncoding.maxFramerate = encoding.maxFramerate;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof encoding.adaptivePtime === 'boolean')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnormalizedEncoding.adaptivePtime = encoding.adaptivePtime;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof encoding.priority === 'string')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnormalizedEncoding.priority = encoding.priority;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (typeof encoding.networkPriority === 'string')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tnormalizedEncoding.networkPriority = encoding.networkPriority;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn normalizedEncoding;\n\t\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tconst { localId, rtpParameters, rtpSender } = await this._handler.send(\n\t\t\t\t\t{\n\t\t\t\t\t\ttrack,\n\t\t\t\t\t\tencodings : normalizedEncodings,\n\t\t\t\t\t\tcodecOptions,\n\t\t\t\t\t\tcodec\n\t\t\t\t\t});\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\t// This will fill rtpParameters's missing fields with default values.\n\t\t\t\t\tortc.validateRtpParameters(rtpParameters);\n\n\t\t\t\t\tconst { id } = await new Promise<{ id: string }>((resolve, reject) =>\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.safeEmit(\n\t\t\t\t\t\t\t'produce',\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tkind : track.kind as MediaKind,\n\t\t\t\t\t\t\t\trtpParameters,\n\t\t\t\t\t\t\t\tappData\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tresolve,\n\t\t\t\t\t\t\treject\n\t\t\t\t\t\t);\n\t\t\t\t\t});\n\n\t\t\t\t\tconst producer = new Producer<ProducerAppData>(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\tlocalId,\n\t\t\t\t\t\t\trtpSender,\n\t\t\t\t\t\t\ttrack,\n\t\t\t\t\t\t\trtpParameters,\n\t\t\t\t\t\t\tstopTracks,\n\t\t\t\t\t\t\tdisableTrackOnPause,\n\t\t\t\t\t\t\tzeroRtpOnPause,\n\t\t\t\t\t\t\tappData\n\t\t\t\t\t\t});\n\n\t\t\t\t\tthis._producers.set(producer.id, producer);\n\t\t\t\t\tthis.handleProducer(producer);\n\n\t\t\t\t\t// Emit observer event.\n\t\t\t\t\tthis._observer.safeEmit('newproducer', producer);\n\n\t\t\t\t\treturn producer;\n\t\t\t\t}\n\t\t\t\tcatch (error)\n\t\t\t\t{\n\t\t\t\t\tthis._handler.stopSending(localId)\n\t\t\t\t\t\t.catch(() => {});\n\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t},\n\t\t\t'transport.produce()')\n\t\t\t// This catch is needed to stop the given track if the command above\n\t\t\t// failed due to closed Transport.\n\t\t\t.catch((error: Error) =>\n\t\t\t{\n\t\t\t\tif (stopTracks)\n\t\t\t\t{\n\t\t\t\t\ttry { track.stop(); }\n\t\t\t\t\tcatch (error2) {}\n\t\t\t\t}\n\n\t\t\t\tthrow error;\n\t\t\t});\n\t}\n\n\t/**\n\t * Create a Consumer to consume a remote Producer.\n\t */\n\tasync consume<ConsumerAppData extends AppData = AppData>(\n\t\t{\n\t\t\tid,\n\t\t\tproducerId,\n\t\t\tkind,\n\t\t\trtpParameters,\n\t\t\tstreamId,\n\t\t\tappData = {} as ConsumerAppData\n\t\t}: ConsumerOptions<ConsumerAppData>\n\t): Promise<Consumer<ConsumerAppData>>\n\t{\n\t\tlogger.debug('consume()');\n\n\t\trtpParameters = utils.clone(rtpParameters, undefined);\n\n\t\tif (this._closed)\n\t\t{\n\t\t\tthrow new InvalidStateError('closed');\n\t\t}\n\t\telse if (this._direction !== 'recv')\n\t\t{\n\t\t\tthrow new UnsupportedError('not a receiving Transport');\n\t\t}\n\t\telse if (typeof id !== 'string')\n\t\t{\n\t\t\tthrow new TypeError('missing id');\n\t\t}\n\t\telse if (typeof producerId !== 'string')\n\t\t{\n\t\t\tthrow new TypeError('missing producerId');\n\t\t}\n\t\telse if (kind !== 'audio' && kind !== 'video')\n\t\t{\n\t\t\tthrow new TypeError(`invalid kind '${kind}'`);\n\t\t}\n\t\telse if (this.listenerCount('connect') === 0 && this._connectionState === 'new')\n\t\t{\n\t\t\tthrow new TypeError('no \"connect\" listener set into this transport');\n\t\t}\n\t\telse if (appData && typeof appData !== 'object')\n\t\t{\n\t\t\tthrow new TypeError('if given, appData must be an object');\n\t\t}\n\n\t\t// Ensure the device can consume it.\n\t\tconst canConsume = ortc.canReceive(\n\t\t\trtpParameters, this._extendedRtpCapabilities);\n\n\t\tif (!canConsume)\n\t\t{\n\t\t\tthrow new UnsupportedError('cannot consume this Producer');\n\t\t}\n\n\t\tconst consumerCreationTask = new ConsumerCreationTask(\n\t\t\t{\n\t\t\t\tid,\n\t\t\t\tproducerId,\n\t\t\t\tkind,\n\t\t\t\trtpParameters,\n\t\t\t\tstreamId,\n\t\t\t\tappData\n\t\t\t}\n\t\t);\n\n\t\t// Store the Consumer creation task.\n\t\tthis._pendingConsumerTasks.push(consumerCreationTask);\n\n\t\t// There is no Consumer creation in progress, create it now.\n\t\tqueueMicrotask(() => \n\t\t{\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this._consumerCreationInProgress === false)\n\t\t\t{\n\t\t\t\tthis.createPendingConsumers<ConsumerAppData>();\n\t\t\t}\n\t\t});\n\n\t\treturn consumerCreationTask.promise as Promise<Consumer<ConsumerAppData>>;\n\t}\n\n\t/**\n\t * Create a DataProducer\n\t */\n\tasync produceData<DataProducerAppData extends AppData = AppData>(\n\t\t{\n\t\t\tordered = true,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tlabel = '',\n\t\t\tprotocol = '',\n\t\t\tappData = {} as DataProducerAppData\n\t\t}: DataProducerOptions<DataProducerAppData> = {}\n\t): Promise<DataProducer<DataProducerAppData>>\n\t{\n\t\tlogger.debug('produceData()');\n\n\t\tif (this._closed)\n\t\t{\n\t\t\tthrow new InvalidStateError('closed');\n\t\t}\n\t\telse if (this._direction !== 'send')\n\t\t{\n\t\t\tthrow new UnsupportedError('not a sending Transport');\n\t\t}\n\t\telse if (!this._maxSctpMessageSize)\n\t\t{\n\t\t\tthrow new UnsupportedError('SCTP not enabled by remote Transport');\n\t\t}\n\t\telse if (this.listenerCount('connect') === 0 && this._connectionState === 'new')\n\t\t{\n\t\t\tthrow new TypeError('no \"connect\" listener set into this transport');\n\t\t}\n\t\telse if (this.listenerCount('producedata') === 0)\n\t\t{\n\t\t\tthrow new TypeError('no \"producedata\" listener set into this transport');\n\t\t}\n\t\telse if (appData && typeof appData !== 'object')\n\t\t{\n\t\t\tthrow new TypeError('if given, appData must be an object');\n\t\t}\n\n\t\tif (maxPacketLifeTime || maxRetransmits)\n\t\t{\n\t\t\tordered = false;\n\t\t}\n\n\t\t// Enqueue command.\n\t\treturn this._awaitQueue.push(\n\t\t\tasync () =>\n\t\t\t{\n\t\t\t\tconst {\n\t\t\t\t\tdataChannel,\n\t\t\t\t\tsctpStreamParameters\n\t\t\t\t} = await this._handler.sendDataChannel(\n\t\t\t\t\t{\n\t\t\t\t\t\tordered,\n\t\t\t\t\t\tmaxPacketLifeTime,\n\t\t\t\t\t\tmaxRetransmits,\n\t\t\t\t\t\tlabel,\n\t\t\t\t\t\tprotocol\n\t\t\t\t\t});\n\n\t\t\t\t// This will fill sctpStreamParameters's missing fields with default values.\n\t\t\t\tortc.validateSctpStreamParameters(sctpStreamParameters);\n\n\t\t\t\tconst { id } = await new Promise<{ id: string }>((resolve, reject) =>\n\t\t\t\t{\n\t\t\t\t\tthis.safeEmit(\n\t\t\t\t\t\t'producedata',\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsctpStreamParameters,\n\t\t\t\t\t\t\tlabel,\n\t\t\t\t\t\t\tprotocol,\n\t\t\t\t\t\t\tappData\n\t\t\t\t\t\t},\n\t\t\t\t\t\tresolve,\n\t\t\t\t\t\treject\n\t\t\t\t\t);\n\t\t\t\t});\n\n\t\t\t\tconst dataProducer = new DataProducer<DataProducerAppData>(\n\t\t\t\t\t{\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tdataChannel,\n\t\t\t\t\t\tsctpStreamParameters,\n\t\t\t\t\t\tappData\n\t\t\t\t\t});\n\n\t\t\t\tthis._dataProducers.set(dataProducer.id, dataProducer);\n\t\t\t\tthis.handleDataProducer(dataProducer);\n\n\t\t\t\t// Emit observer event.\n\t\t\t\tthis._observer.safeEmit('newdataproducer', dataProducer);\n\n\t\t\t\treturn dataProducer;\n\t\t\t},\n\t\t\t'transport.produceData()');\n\t}\n\n\t/**\n\t * Create a DataConsumer\n\t */\n\tasync consumeData<ConsumerAppData extends AppData = AppData>(\n\t\t{\n\t\t\tid,\n\t\t\tdataProducerId,\n\t\t\tsctpStreamParameters,\n\t\t\tlabel = '',\n\t\t\tprotocol = '',\n\t\t\tappData = {} as ConsumerAppData\n\t\t}: DataConsumerOptions<ConsumerAppData>\n\t): Promise<DataConsumer<ConsumerAppData>>\n\t{\n\t\tlogger.debug('consumeData()');\n\n\t\tsctpStreamParameters = utils.clone(sctpStreamParameters, undefined);\n\n\t\tif (this._closed)\n\t\t{\n\t\t\tthrow new InvalidStateError('closed');\n\t\t}\n\t\telse if (this._direction !== 'recv')\n\t\t{\n\t\t\tthrow new UnsupportedError('not a receiving Transport');\n\t\t}\n\t\telse if (!this._maxSctpMessageSize)\n\t\t{\n\t\t\tthrow new UnsupportedError('SCTP not enabled by remote Transport');\n\t\t}\n\t\telse if (typeof id !== 'string')\n\t\t{\n\t\t\tthrow new TypeError('missing id');\n\t\t}\n\t\telse if (typeof dataProducerId !== 'string')\n\t\t{\n\t\t\tthrow new TypeError('missing dataProducerId');\n\t\t}\n\t\telse if (this.listenerCount('connect') === 0 && this._connectionState === 'new')\n\t\t{\n\t\t\tthrow new TypeError('no \"connect\" listener set into this transport');\n\t\t}\n\t\telse if (appData && typeof appData !== 'object')\n\t\t{\n\t\t\tthrow new TypeError('if given, appData must be an object');\n\t\t}\n\n\t\t// This may throw.\n\t\tortc.validateSctpStreamParameters(sctpStreamParameters);\n\n\t\t// Enqueue command.\n\t\treturn this._awaitQueue.push(\n\t\t\tasync () =>\n\t\t\t{\n\t\t\t\tconst {\n\t\t\t\t\tdataChannel\n\t\t\t\t} = await this._handler.receiveDataChannel(\n\t\t\t\t\t{\n\t\t\t\t\t\tsctpStreamParameters,\n\t\t\t\t\t\tlabel,\n\t\t\t\t\t\tprotocol\n\t\t\t\t\t});\n\n\t\t\t\tconst dataConsumer = new DataConsumer<ConsumerAppData>(\n\t\t\t\t\t{\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tdataProducerId,\n\t\t\t\t\t\tdataChannel,\n\t\t\t\t\t\tsctpStreamParameters,\n\t\t\t\t\t\tappData\n\t\t\t\t\t});\n\n\t\t\t\tthis._dataConsumers.set(dataConsumer.id, dataConsumer);\n\t\t\t\tthis.handleDataConsumer(dataConsumer);\n\n\t\t\t\t// Emit observer event.\n\t\t\t\tthis._observer.safeEmit('newdataconsumer', dataConsumer);\n\n\t\t\t\treturn dataConsumer;\n\t\t\t},\n\t\t\t'transport.consumeData()');\n\t}\n\n\t// This method is guaranteed to never throw.\n\tprivate async createPendingConsumers<ConsumerAppData extends AppData>(): Promise<void>\n\t{\n\t\tthis._consumerCreationInProgress = true;\n\n\t\tthis._awaitQueue.push(\n\t\t\tasync () =>\n\t\t\t{\n\t\t\t\tif (this._pendingConsumerTasks.length === 0)\n\t\t\t\t{\n\t\t\t\t\tlogger.debug('createPendingConsumers() | there is no Consumer to be created');\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst pendingConsumerTasks = [ ...this._pendingConsumerTasks ];\n\n\t\t\t\t// Clear pending Consumer tasks.\n\t\t\t\tthis._pendingConsumerTasks = [];\n\n\t\t\t\t// Video Consumer in order to create the probator.\n\t\t\t\tlet videoConsumerForProbator: Consumer | undefined = undefined;\n\n\t\t\t\t// Fill options list.\n\t\t\t\tconst optionsList: HandlerReceiveOptions[] = [];\n\n\t\t\t\tfor (const task of pendingConsumerTasks)\n\t\t\t\t{\n\t\t\t\t\tconst { id, kind, rtpParameters, streamId } = task.consumerOptions;\n\n\t\t\t\t\toptionsList.push(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttrackId : id!,\n\t\t\t\t\t\t\tkind : kind as MediaKind,\n\t\t\t\t\t\t\trtpParameters,\n\t\t\t\t\t\t\tstreamId\n\t\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tconst results = await this._handler.receive(optionsList);\n\n\t\t\t\t\tfor (let idx = 0; idx < results.length; ++idx)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst task = pendingConsumerTasks[idx];\n\t\t\t\t\t\tconst result = results[idx];\n\t\t\t\t\t\tconst { id, producerId, kind, rtpParameters, appData } = task.consumerOptions;\n\t\t\t\t\t\tconst { localId, rtpReceiver, track } = result;\n\t\t\t\t\t\tconst consumer = new Consumer<ConsumerAppData>(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid : id!,\n\t\t\t\t\t\t\t\tlocalId,\n\t\t\t\t\t\t\t\tproducerId : producerId!,\n\t\t\t\t\t\t\t\trtpReceiver,\n\t\t\t\t\t\t\t\ttrack,\n\t\t\t\t\t\t\t\trtpParameters,\n\t\t\t\t\t\t\t\tappData : appData as ConsumerAppData\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\tthis._consumers.set(consumer.id, consumer);\n\t\t\t\t\t\tthis.handleConsumer(consumer);\n\n\t\t\t\t\t\t// If this is the first video Consumer and the Consumer for RTP probation\n\t\t\t\t\t\t// has not yet been created, it's time to create it.\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t!this._probatorConsumerCreated &&\n\t\t\t\t\t\t\t!videoConsumerForProbator && kind === 'video'\n\t\t\t\t\t\t)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tvideoConsumerForProbator = consumer;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Emit observer event.\n\t\t\t\t\t\tthis._observer.safeEmit('newconsumer', consumer);\n\n\t\t\t\t\t\ttask.resolve!(consumer);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcatch (error)\n\t\t\t\t{\n\t\t\t\t\tfor (const task of pendingConsumerTasks)\n\t\t\t\t\t{\n\t\t\t\t\t\ttask.reject!(error as Error);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// If RTP probation must be handled, do it now.\n\t\t\t\tif (videoConsumerForProbator)\n\t\t\t\t{\n\t\t\t\t\ttry\n\t\t\t\t\t{\n\t\t\t\t\t\tconst probatorRtpParameters =\n\t\t\t\t\t\t\tortc.generateProbatorRtpParameters(videoConsumerForProbator!.rtpParameters);\n\n\t\t\t\t\t\tawait this._handler.receive(\n\t\t\t\t\t\t\t[ {\n\t\t\t\t\t\t\t\ttrackId : 'probator',\n\t\t\t\t\t\t\t\tkind : 'video',\n\t\t\t\t\t\t\t\trtpParameters : probatorRtpParameters\n\t\t\t\t\t\t\t} ]);\n\n\t\t\t\t\t\tlogger.debug('createPendingConsumers() | Consumer for RTP probation created');\n\n\t\t\t\t\t\tthis._probatorConsumerCreated = true;\n\t\t\t\t\t}\n\t\t\t\t\tcatch (error)\n\t\t\t\t\t{\n\t\t\t\t\t\tlogger.error(\n\t\t\t\t\t\t\t'createPendingConsumers() | failed to create Consumer for RTP probation:%o',\n\t\t\t\t\t\t\terror);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\t'transport.createPendingConsumers()')\n\t\t\t.then(() =>\n\t\t\t{\n\t\t\t\tthis._consumerCreationInProgress = false;\n\n\t\t\t\t// There are pending Consumer tasks, enqueue their creation.\n\t\t\t\tif (this._pendingConsumerTasks.length > 0)\n\t\t\t\t{\n\t\t\t\t\tthis.createPendingConsumers<ConsumerAppData>();\n\t\t\t\t}\n\t\t\t})\n\t\t\t// NOTE: We only get here when the await queue is closed.\n\t\t\t.catch(() => {});\n\t}\n\n\tprivate pausePendingConsumers()\n\t{\n\t\tthis._consumerPauseInProgress = true;\n\n\t\tthis._awaitQueue.push(\n\t\t\tasync () =>\n\t\t\t{\n\t\t\t\tif (this._pendingPauseConsumers.size === 0)\n\t\t\t\t{\n\t\t\t\t\tlogger.debug('pausePendingConsumers() | there is no Consumer to be paused');\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst pendingPauseConsumers = Array.from(this._pendingPauseConsumers.values());\n\n\t\t\t\t// Clear pending pause Consumer map.\n\t\t\t\tthis._pendingPauseConsumers.clear();\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tconst localIds = pendingPauseConsumers\n\t\t\t\t\t\t.map((consumer) => consumer.localId);\n\n\t\t\t\t\tawait this._handler.pauseReceiving(localIds);\n\t\t\t\t}\n\t\t\t\tcatch (error)\n\t\t\t\t{\n\t\t\t\t\tlogger.error('pausePendingConsumers() | failed to pause Consumers:', error);\n\t\t\t\t}\n\t\t\t},\n\t\t\t'transport.pausePendingConsumers')\n\t\t\t.then(() =>\n\t\t\t{\n\t\t\t\tthis._consumerPauseInProgress = false;\n\n\t\t\t\t// There are pending Consumers to be paused, do it.\n\t\t\t\tif (this._pendingPauseConsumers.size > 0)\n\t\t\t\t{\n\t\t\t\t\tthis.pausePendingConsumers();\n\t\t\t\t}\n\t\t\t})\n\t\t\t// NOTE: We only get here when the await queue is closed.\n\t\t\t.catch(() => { });\n\t}\n\n\tprivate resumePendingConsumers()\n\t{\n\t\tthis._consumerResumeInProgress = true;\n\n\t\tthis._awaitQueue.push(\n\t\t\tasync () =>\n\t\t\t{\n\t\t\t\tif (this._pendingResumeConsumers.size === 0)\n\t\t\t\t{\n\t\t\t\t\tlogger.debug('resumePendingConsumers() | there is no Consumer to be resumed');\n\t\t\t\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst pendingResumeConsumers = Array.from(this._pendingResumeConsumers.values());\n\n\t\t\t\t// Clear pending resume Consumer map.\n\t\t\t\tthis._pendingResumeConsumers.clear();\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tconst localIds = pendingResumeConsumers\n\t\t\t\t\t\t.map((consumer) => consumer.localId);\n\n\t\t\t\t\tawait this._handler.resumeReceiving(localIds);\n\t\t\t\t}\n\t\t\t\tcatch (error)\n\t\t\t\t{\n\t\t\t\t\tlogger.error('resumePendingConsumers() | failed to resume Consumers:', error);\n\t\t\t\t}\n\t\t\t},\n\t\t\t'transport.resumePendingConsumers')\n\t\t\t.then(() =>\n\t\t\t{\n\t\t\t\tthis._consumerResumeInProgress = false;\n\n\t\t\t\t// There are pending Consumer to be resumed, do it.\n\t\t\t\tif (this._pendingResumeConsumers.size > 0)\n\t\t\t\t{\n\t\t\t\t\tthis.resumePendingConsumers();\n\t\t\t\t}\n\t\t\t})\n\t\t\t// NOTE: We only get here when the await queue is closed.\n\t\t\t.catch(() => { });\n\t}\n\n\tprivate closePendingConsumers()\n\t{\n\t\tthis._consumerCloseInProgress = true;\n\n\t\tthis._awaitQueue.push(\n\t\t\tasync () =>\n\t\t\t{\n\t\t\t\tif (this._pendingCloseConsumers.size === 0)\n\t\t\t\t{\n\t\t\t\t\tlogger.debug('closePendingConsumers() | there is no Consumer to be closed');\n\t\t\t\t\t\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst pendingCloseConsumers = Array.from(this._pendingCloseConsumers.values());\n\n\t\t\t\t// Clear pending close Consumer map.\n\t\t\t\tthis._pendingCloseConsumers.clear();\n\n\t\t\t\ttry\n\t\t\t\t{\n\t\t\t\t\tawait this._handler.stopReceiving(\n\t\t\t\t\t\tpendingCloseConsumers.map((consumer) => consumer.localId)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tcatch (error)\n\t\t\t\t{\n\t\t\t\t\tlogger.error('closePendingConsumers() | failed to close Consumers:', error);\n\t\t\t\t}\n\t\t\t},\n\t\t\t'transport.closePendingConsumers')\n\t\t\t.then(() =>\n\t\t\t{\n\t\t\t\tthis._consumerCloseInProgress = false;\n\n\t\t\t\t// There are pending Consumer to be resumed, do it.\n\t\t\t\tif (this._pendingCloseConsumers.size > 0)\n\t\t\t\t{\n\t\t\t\t\tthis.closePendingConsumers();\n\t\t\t\t}\n\t\t\t})\n\t\t\t// NOTE: We only get here when the await queue is closed.\n\t\t\t.catch(() => { });\n\t}\n\n\tprivate handleHandler(): void\n\t{\n\t\tconst handler = this._handler;\n\n\t\thandler.on('@connect', (\n\t\t\t{ dtlsParameters }: { dtlsParameters: DtlsParameters },\n\t\t\tcallback: () => void,\n\t\t\terrback: (error: Error) => void\n\t\t) =>\n\t\t{\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\terrback(new InvalidStateError('closed'));\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.safeEmit('connect', { dtlsParameters }, callback, errback);\n\t\t});\n\n\t\thandler.on('@connectionstatechange', (connectionState: ConnectionState) =>\n\t\t{\n\t\t\tif (connectionState === this._connectionState)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger.debug('connection state changed to %s', connectionState);\n\n\t\t\tthis._connectionState = connectionState;\n\n\t\t\tif (!this._closed)\n\t\t\t{\n\t\t\t\tthis.safeEmit('connectionstatechange', connectionState);\n\t\t\t}\n\t\t});\n\t}\n\n\tprivate handleProducer(producer: Producer): void\n\t{\n\t\tproducer.on('@close', () =>\n\t\t{\n\t\t\tthis._producers.delete(producer.id);\n\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._awaitQueue.push(\n\t\t\t\tasync () => this._handler.stopSending(producer.localId),\n\t\t\t\t'producer @close event')\n\t\t\t\t.catch((error: Error) => logger.warn('producer.close() failed:%o', error));\n\t\t});\n\n\t\tproducer.on('@pause', (callback, errback) =>\n\t\t{\n\t\t\tthis._awaitQueue.push(\n\t\t\t\tasync () => this._handler.pauseSending(producer.localId),\n\t\t\t\t'producer @pause event')\n\t\t\t\t.then(callback)\n\t\t\t\t.catch(errback);\n\t\t});\n\n\t\tproducer.on('@resume', (callback, errback) =>\n\t\t{\n\t\t\tthis._awaitQueue.push(\n\t\t\t\tasync () => this._handler.resumeSending(producer.localId),\n\t\t\t\t'producer @resume event')\n\t\t\t\t.then(callback)\n\t\t\t\t.catch(errback);\n\t\t});\n\n\t\tproducer.on('@replacetrack', (track, callback, errback) =>\n\t\t{\n\t\t\tthis._awaitQueue.push(\n\t\t\t\tasync () => this._handler.replaceTrack(producer.localId, track),\n\t\t\t\t'producer @replacetrack event')\n\t\t\t\t.then(callback)\n\t\t\t\t.catch(errback);\n\t\t});\n\n\t\tproducer.on('@setmaxspatiallayer', (spatialLayer, callback, errback) =>\n\t\t{\n\t\t\tthis._awaitQueue.push(\n\t\t\t\tasync () => (\n\t\t\t\t\tthis._handler.setMaxSpatialLayer(producer.localId, spatialLayer)\n\t\t\t\t), 'producer @setmaxspatiallayer event')\n\t\t\t\t.then(callback)\n\t\t\t\t.catch(errback);\n\t\t});\n\n\t\tproducer.on('@setrtpencodingparameters', (params, callback, errback) =>\n\t\t{\n\t\t\tthis._awaitQueue.push(\n\t\t\t\tasync () => (\n\t\t\t\t\tthis._handler.setRtpEncodingParameters(producer.localId, params)\n\t\t\t\t), 'producer @setrtpencodingparameters event')\n\t\t\t\t.then(callback)\n\t\t\t\t.catch(errback);\n\t\t});\n\n\t\tproducer.on('@getstats', (callback, errback) =>\n\t\t{\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn errback!(new InvalidStateError('closed'));\n\t\t\t}\n\n\t\t\tthis._handler.getSenderStats(producer.localId)\n\t\t\t\t.then(callback)\n\t\t\t\t.catch(errback);\n\t\t});\n\t}\n\n\tprivate handleConsumer(consumer: Consumer): void\n\t{\n\t\tconsumer.on('@close', () =>\n\t\t{\n\t\t\tthis._consumers.delete(consumer.id);\n\t\t\tthis._pendingPauseConsumers.delete(consumer.id);\n\t\t\tthis._pendingResumeConsumers.delete(consumer.id);\n\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Store the Consumer into the close list.\n\t\t\tthis._pendingCloseConsumers.set(consumer.id, consumer);\n\n\t\t\t// There is no Consumer close in progress, do it now.\n\t\t\tif (this._consumerCloseInProgress === false)\n\t\t\t{\n\t\t\t\tthis.closePendingConsumers();\n\t\t\t}\n\t\t});\n\n\t\tconsumer.on('@pause', () =>\n\t\t{\n\t\t\t// If Consumer is pending to be resumed, remove from pending resume list.\n\t\t\tif (this._pendingResumeConsumers.has(consumer.id))\n\t\t\t{\n\t\t\t\tthis._pendingResumeConsumers.delete(consumer.id);\n\t\t\t}\n\n\t\t\t// Store the Consumer into the pending list.\n\t\t\tthis._pendingPauseConsumers.set(consumer.id, consumer);\n\n\t\t\t// There is no Consumer pause in progress, do it now.\n\t\t\tqueueMicrotask(() => \n\t\t\t{\n\t\t\t\tif (this._closed)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (this._consumerPauseInProgress === false)\n\t\t\t\t{\n\t\t\t\t\tthis.pausePendingConsumers();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tconsumer.on('@resume', () =>\n\t\t{\n\t\t\t// If Consumer is pending to be paused, remove from pending pause list.\n\t\t\tif (this._pendingPauseConsumers.has(consumer.id))\n\t\t\t{\n\t\t\t\tthis._pendingPauseConsumers.delete(consumer.id);\n\t\t\t}\n\n\t\t\t// Store the Consumer into the pending list.\n\t\t\tthis._pendingResumeConsumers.set(consumer.id, consumer);\n\n\t\t\t// There is no Consumer resume in progress, do it now.\n\t\t\tqueueMicrotask(() => \n\t\t\t{\n\t\t\t\tif (this._closed)\n\t\t\t\t{\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (this._consumerResumeInProgress === false)\n\t\t\t\t{\n\t\t\t\t\tthis.resumePendingConsumers();\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\tconsumer.on('@getstats', (callback, errback) =>\n\t\t{\n\t\t\tif (this._closed)\n\t\t\t{\n\t\t\t\treturn errback!(new InvalidStateError('closed'));\n\t\t\t}\n\n\t\t\tthis._handler.getReceiverStats(consumer.localId)\n\t\t\t\t.then(callback)\n\t\t\t\t.catch(errback);\n\t\t});\n\t}\n\n\tprivate handleDataProducer(dataProducer: DataProducer): void\n\t{\n\t\tdataProducer.on('@close', () =>\n\t\t{\n\t\t\tthis._dataProducers.delete(dataProducer.id);\n\t\t});\n\t}\n\n\tprivate handleDataConsumer(dataConsumer: DataConsumer): void\n\t{\n\t\tdataConsumer.on('@close', () =>\n\t\t{\n\t\t\tthis._dataConsumers.delete(dataConsumer.id);\n\t\t});\n\t}\n}\n","import * as sdpTransform from 'sdp-transform';\nimport { DtlsParameters, DtlsRole } from '../../Transport';\nimport {\n\tRtpCapabilities,\n\tRtpCodecCapability,\n\tRtpHeaderExtension,\n\tRtpParameters,\n\tRtcpFeedback\n} from '../../RtpParameters';\n\n/**\n * This function must be called with an SDP with 1 m=audio and 1 m=video\n * sections.\n */\nexport function extractRtpCapabilities(\n\t{ sdpObject }:\n\t{ sdpObject: any }\n): RtpCapabilities\n{\n\t// Map of RtpCodecParameters indexed by payload type.\n\tconst codecsMap: Map<number, RtpCodecCapability> = new Map();\n\t// Array of RtpHeaderExtensions.\n\tconst headerExtensions: RtpHeaderExtension[] = [];\n\t// Whether a m=audio/video section has been already found.\n\tlet gotAudio = false;\n\tlet gotVideo = false;\n\n\tfor (const m of sdpObject.media)\n\t{\n\t\tconst kind = m.type;\n\n\t\tswitch (kind)\n\t\t{\n\t\t\tcase 'audio':\n\t\t\t{\n\t\t\t\tif (gotAudio)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tgotAudio = true;\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'video':\n\t\t\t{\n\t\t\t\tif (gotVideo)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tgotVideo = true;\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\n\t\t// Get codecs.\n\t\tfor (const rtp of m.rtp)\n\t\t{\n\t\t\tconst codec: RtpCodecCapability =\n\t\t\t{\n\t\t\t\tkind : kind,\n\t\t\t\tmimeType : `${kind}/${rtp.codec}`,\n\t\t\t\tpreferredPayloadType : rtp.payload,\n\t\t\t\tclockRate : rtp.rate,\n\t\t\t\tchannels : rtp.encoding,\n\t\t\t\tparameters : {},\n\t\t\t\trtcpFeedback : []\n\t\t\t};\n\n\t\t\tcodecsMap.set(codec.preferredPayloadType!, codec);\n\t\t}\n\n\t\t// Get codec parameters.\n\t\tfor (const fmtp of m.fmtp || [])\n\t\t{\n\t\t\tconst parameters = sdpTransform.parseParams(fmtp.config);\n\t\t\tconst codec = codecsMap.get(fmtp.payload);\n\n\t\t\tif (!codec)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Specials case to convert parameter value to string.\n\t\t\tif (parameters && parameters.hasOwnProperty('profile-level-id'))\n\t\t\t{\n\t\t\t\tparameters['profile-level-id'] = String(parameters['profile-level-id']);\n\t\t\t}\n\n\t\t\tcodec.parameters = parameters;\n\t\t}\n\n\t\t// Get RTCP feedback for each codec.\n\t\tfor (const fb of m.rtcpFb || [])\n\t\t{\n\t\t\tconst feedback: RtcpFeedback =\n\t\t\t{\n\t\t\t\ttype : fb.type,\n\t\t\t\tparameter : fb.subtype\n\t\t\t};\n\n\t\t\tif (!feedback.parameter)\n\t\t\t{\n\t\t\t\tdelete feedback.parameter;\n\t\t\t}\n\n\t\t\t// rtcp-fb payload is not '*', so just apply it to its corresponding\n\t\t\t// codec.\n\t\t\tif (fb.payload !== '*')\n\t\t\t{\n\t\t\t\tconst codec = codecsMap.get(fb.payload);\n\n\t\t\t\tif (!codec)\n\t\t\t\t{\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tcodec.rtcpFeedback!.push(feedback);\n\t\t\t}\n\t\t\t// If rtcp-fb payload is '*' it must be applied to all codecs with same\n\t\t\t// kind (with some exceptions such as RTX codec).\n\t\t\telse\n\t\t\t{\n\t\t\t\tfor (const codec of codecsMap.values())\n\t\t\t\t{\n\t\t\t\t\tif (codec.kind === kind && !/.+\\/rtx$/i.test(codec.mimeType))\n\t\t\t\t\t{\n\t\t\t\t\t\tcodec.rtcpFeedback!.push(feedback);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Get RTP header extensions.\n\t\tfor (const ext of m.ext || [])\n\t\t{\n\t\t\t// Ignore encrypted extensions (not yet supported in mediasoup).\n\t\t\tif (ext['encrypt-uri'])\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst headerExtension: RtpHeaderExtension =\n\t\t\t{\n\t\t\t\tkind : kind,\n\t\t\t\turi : ext.uri,\n\t\t\t\tpreferredId : ext.value\n\t\t\t};\n\n\t\t\theaderExtensions.push(headerExtension);\n\t\t}\n\t}\n\n\tconst rtpCapabilities: RtpCapabilities =\n\t{\n\t\tcodecs : Array.from(codecsMap.values()),\n\t\theaderExtensions : headerExtensions\n\t};\n\n\treturn rtpCapabilities;\n}\n\nexport function extractDtlsParameters(\n\t{ sdpObject }:\n\t{ sdpObject: any }\n): DtlsParameters\n{\n\tconst mediaObject = (sdpObject.media || [])\n\t\t.find((m: { iceUfrag: string; port: number }) => (\n\t\t\tm.iceUfrag && m.port !== 0\n\t\t));\n\n\tif (!mediaObject)\n\t{\n\t\tthrow new Error('no active media section found');\n\t}\n\n\tconst fingerprint = mediaObject.fingerprint || sdpObject.fingerprint;\n\tlet role: DtlsRole | undefined;\n\n\tswitch (mediaObject.setup)\n\t{\n\t\tcase 'active':\n\t\t\trole = 'client';\n\t\t\tbreak;\n\t\tcase 'passive':\n\t\t\trole = 'server';\n\t\t\tbreak;\n\t\tcase 'actpass':\n\t\t\trole = 'auto';\n\t\t\tbreak;\n\t}\n\n\tconst dtlsParameters: DtlsParameters =\n\t{\n\t\trole,\n\t\tfingerprints :\n\t\t[\n\t\t\t{\n\t\t\t\talgorithm : fingerprint.type,\n\t\t\t\tvalue : fingerprint.hash\n\t\t\t}\n\t\t]\n\t};\n\n\treturn dtlsParameters;\n}\n\nexport function getCname(\n\t{ offerMediaObject }:\n\t{ offerMediaObject: any }\n): string\n{\n\tconst ssrcCnameLine = (offerMediaObject.ssrcs || [])\n\t\t.find((line: { attribute: string }) => line.attribute === 'cname');\n\n\tif (!ssrcCnameLine)\n\t{\n\t\treturn '';\n\t}\n\n\treturn ssrcCnameLine.value;\n}\n\n/**\n * Apply codec parameters in the given SDP m= section answer based on the\n * given RTP parameters of an offer.\n */\nexport function applyCodecParameters(\n\t{\n\t\tofferRtpParameters,\n\t\tanswerMediaObject\n\t}:\n\t{\n\t\tofferRtpParameters: RtpParameters;\n\t\tanswerMediaObject: any;\n\t}\n): void\n{\n\tfor (const codec of offerRtpParameters.codecs)\n\t{\n\t\tconst mimeType = codec.mimeType.toLowerCase();\n\n\t\t// Avoid parsing codec parameters for unhandled codecs.\n\t\tif (mimeType !== 'audio/opus')\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst rtp = (answerMediaObject.rtp || [])\n\t\t\t.find((r: { payload: number }) => r.payload === codec.payloadType);\n\n\t\tif (!rtp)\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Just in case.\n\t\tanswerMediaObject.fmtp = answerMediaObject.fmtp || [];\n\n\t\tlet fmtp = answerMediaObject.fmtp\n\t\t\t.find((f: { payload: number }) => f.payload === codec.payloadType);\n\n\t\tif (!fmtp)\n\t\t{\n\t\t\tfmtp = { payload: codec.payloadType, config: '' };\n\t\t\tanswerMediaObject.fmtp.push(fmtp);\n\t\t}\n\n\t\tconst parameters = sdpTransform.parseParams(fmtp.config);\n\n\t\tswitch (mimeType)\n\t\t{\n\t\t\tcase 'audio/opus':\n\t\t\t{\n\t\t\t\tconst spropStereo = codec.parameters['sprop-stereo'];\n\n\t\t\t\tif (spropStereo !== undefined)\n\t\t\t\t{\n\t\t\t\t\tparameters.stereo = spropStereo ? 1 : 0;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Write the codec fmtp.config back.\n\t\tfmtp.config = '';\n\n\t\tfor (const key of Object.keys(parameters))\n\t\t{\n\t\t\tif (fmtp.config)\n\t\t\t{\n\t\t\t\tfmtp.config += ';';\n\t\t\t}\n\n\t\t\tfmtp.config += `${key}=${parameters[key]}`;\n\t\t}\n\t}\n}\n","import { RtpEncodingParameters } from '../../RtpParameters';\n\nexport function getRtpEncodings(\n\t{ offerMediaObject }:\n\t{ offerMediaObject: any }\n): RtpEncodingParameters[]\n{\n\tconst ssrcs = new Set();\n\n\tfor (const line of offerMediaObject.ssrcs || [])\n\t{\n\t\tconst ssrc = line.id;\n\n\t\tssrcs.add(ssrc);\n\t}\n\n\tif (ssrcs.size === 0)\n\t{\n\t\tthrow new Error('no a=ssrc lines found');\n\t}\n\n\tconst ssrcToRtxSsrc = new Map();\n\n\t// First assume RTX is used.\n\tfor (const line of offerMediaObject.ssrcGroups || [])\n\t{\n\t\tif (line.semantics !== 'FID')\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet [ ssrc, rtxSsrc ] = line.ssrcs.split(/\\s+/);\n\n\t\tssrc = Number(ssrc);\n\t\trtxSsrc = Number(rtxSsrc);\n\n\t\tif (ssrcs.has(ssrc))\n\t\t{\n\t\t\t// Remove both the SSRC and RTX SSRC from the set so later we know\n\t\t\t// that they are already handled.\n\t\t\tssrcs.delete(ssrc);\n\t\t\tssrcs.delete(rtxSsrc);\n\n\t\t\t// Add to the map.\n\t\t\tssrcToRtxSsrc.set(ssrc, rtxSsrc);\n\t\t}\n\t}\n\n\t// If the set of SSRCs is not empty it means that RTX is not being used, so\n\t// take media SSRCs from there.\n\tfor (const ssrc of ssrcs)\n\t{\n\t\t// Add to the map.\n\t\tssrcToRtxSsrc.set(ssrc, null);\n\t}\n\n\tconst encodings: RtpEncodingParameters[] = [];\n\n\tfor (const [ ssrc, rtxSsrc ] of ssrcToRtxSsrc)\n\t{\n\t\tconst encoding: RtpEncodingParameters = { ssrc };\n\n\t\tif (rtxSsrc)\n\t\t{\n\t\t\tencoding.rtx = { ssrc: rtxSsrc };\n\t\t}\n\n\t\tencodings.push(encoding);\n\t}\n\n\treturn encodings;\n}\n\n/**\n * Adds multi-ssrc based simulcast into the given SDP media section offer.\n */\nexport function addLegacySimulcast(\n\t{\n\t\tofferMediaObject,\n\t\tnumStreams\n\t}:\n\t{\n\t\tofferMediaObject: any;\n\t\tnumStreams: number;\n\t}\n): void\n{\n\tif (numStreams <= 1)\n\t{\n\t\tthrow new TypeError('numStreams must be greater than 1');\n\t}\n\n\t// Get the SSRC.\n\tconst ssrcMsidLine = (offerMediaObject.ssrcs || [])\n\t\t.find((line: any) => line.attribute === 'msid');\n\n\tif (!ssrcMsidLine)\n\t{\n\t\tthrow new Error('a=ssrc line with msid information not found');\n\t}\n\n\tconst [ streamId, trackId ] = ssrcMsidLine.value.split(' ');\n\tconst firstSsrc = ssrcMsidLine.id;\n\tlet firstRtxSsrc;\n\n\t// Get the SSRC for RTX.\n\t(offerMediaObject.ssrcGroups || [])\n\t\t.some((line: any) =>\n\t\t{\n\t\t\tif (line.semantics !== 'FID')\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst ssrcs = line.ssrcs.split(/\\s+/);\n\n\t\t\tif (Number(ssrcs[0]) === firstSsrc)\n\t\t\t{\n\t\t\t\tfirstRtxSsrc = Number(ssrcs[1]);\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\tconst ssrcCnameLine = offerMediaObject.ssrcs\n\t\t.find((line: any) => line.attribute === 'cname');\n\n\tif (!ssrcCnameLine)\n\t{\n\t\tthrow new Error('a=ssrc line with cname information not found');\n\t}\n\n\tconst cname = ssrcCnameLine.value;\n\tconst ssrcs = [];\n\tconst rtxSsrcs = [];\n\n\tfor (let i = 0; i < numStreams; ++i)\n\t{\n\t\tssrcs.push(firstSsrc + i);\n\n\t\tif (firstRtxSsrc)\n\t\t{\n\t\t\trtxSsrcs.push(firstRtxSsrc + i);\n\t\t}\n\t}\n\n\tofferMediaObject.ssrcGroups = [];\n\tofferMediaObject.ssrcs = [];\n\n\tofferMediaObject.ssrcGroups.push(\n\t\t{\n\t\t\tsemantics : 'SIM',\n\t\t\tssrcs : ssrcs.join(' ')\n\t\t});\n\n\tfor (let i = 0; i < ssrcs.length; ++i)\n\t{\n\t\tconst ssrc = ssrcs[i];\n\n\t\tofferMediaObject.ssrcs.push(\n\t\t\t{\n\t\t\t\tid : ssrc,\n\t\t\t\tattribute : 'cname',\n\t\t\t\tvalue : cname\n\t\t\t});\n\n\t\tofferMediaObject.ssrcs.push(\n\t\t\t{\n\t\t\t\tid : ssrc,\n\t\t\t\tattribute : 'msid',\n\t\t\t\tvalue : `${streamId} ${trackId}`\n\t\t\t});\n\t}\n\n\tfor (let i = 0; i < rtxSsrcs.length; ++i)\n\t{\n\t\tconst ssrc = ssrcs[i];\n\t\tconst rtxSsrc = rtxSsrcs[i];\n\n\t\tofferMediaObject.ssrcs.push(\n\t\t\t{\n\t\t\t\tid : rtxSsrc,\n\t\t\t\tattribute : 'cname',\n\t\t\t\tvalue : cname\n\t\t\t});\n\n\t\tofferMediaObject.ssrcs.push(\n\t\t\t{\n\t\t\t\tid : rtxSsrc,\n\t\t\t\tattribute : 'msid',\n\t\t\t\tvalue : `${streamId} ${trackId}`\n\t\t\t});\n\n\t\tofferMediaObject.ssrcGroups.push(\n\t\t\t{\n\t\t\t\tsemantics : 'FID',\n\t\t\t\tssrcs : `${ssrc} ${rtxSsrc}`\n\t\t\t});\n\t}\n}\n","import { RtpCapabilities } from '../../RtpParameters';\n\n/**\n * This function adds RTCP NACK support for OPUS codec in given capabilities.\n */\nexport function addNackSuppportForOpus(rtpCapabilities: RtpCapabilities): void\n{\n\tfor (const codec of (rtpCapabilities.codecs || []))\n\t{\n\t\tif (\n\t\t\t(\n\t\t\t\tcodec.mimeType.toLowerCase() === 'audio/opus' ||\n\t\t\t\tcodec.mimeType.toLowerCase() === 'audio/multiopus'\n\t\t\t) &&\n\t\t\t!codec.rtcpFeedback?.some((fb) => fb.type === 'nack' && !fb.parameter)\n\t\t)\n\t\t{\n\t\t\tif (!codec.rtcpFeedback)\n\t\t\t{\n\t\t\t\tcodec.rtcpFeedback = [];\n\t\t\t}\n\n\t\t\tcodec.rtcpFeedback.push({ type: 'nack' });\n\t\t}\n\t}\n}\n","import { EnhancedEventEmitter } from '../EnhancedEventEmitter';\nimport { ProducerCodecOptions } from '../Producer';\nimport {\n\tIceParameters,\n\tIceCandidate,\n\tDtlsParameters,\n\tConnectionState\n} from '../Transport';\nimport {\n\tRtpCapabilities,\n\tRtpCodecCapability,\n\tRtpParameters,\n\tRtpEncodingParameters\n} from '../RtpParameters';\nimport {\n\tSctpCapabilities,\n\tSctpParameters,\n\tSctpStreamParameters\n} from '../SctpParameters';\n\nexport type HandlerFactory = () => HandlerInterface;\n\nexport type HandlerRunOptions =\n{\n\tdirection: 'send' | 'recv';\n\ticeParameters: IceParameters;\n\ticeCandidates: IceCandidate[];\n\tdtlsParameters: DtlsParameters;\n\tsctpParameters?: SctpParameters;\n\ticeServers?: RTCIceServer[];\n\ticeTransportPolicy?: RTCIceTransportPolicy;\n\tadditionalSettings?: any;\n\tproprietaryConstraints?: any;\n\textendedRtpCapabilities: any;\n};\n\nexport type HandlerSendOptions =\n{\n\ttrack: MediaStreamTrack;\n\tencodings?: RtpEncodingParameters[];\n\tcodecOptions?: ProducerCodecOptions;\n\tcodec?: RtpCodecCapability;\n};\n\nexport type HandlerSendResult =\n{\n\tlocalId: string;\n\trtpParameters: RtpParameters;\n\trtpSender?: RTCRtpSender;\n};\n\nexport type HandlerReceiveOptions =\n{\n\ttrackId: string;\n\tkind: 'audio' | 'video';\n\trtpParameters: RtpParameters;\n\t/**\n\t * Stream id. WebRTC based devices try to synchronize inbound streams with\n\t * same streamId. If not given, the consuming device will be told to\n\t * synchronize all streams produced by the same endpoint. However libwebrtc\n\t * can just synchronize up to one audio stream with one video stream.\n\t */\n\tstreamId?: string;\n};\n\nexport type HandlerReceiveResult =\n{\n\tlocalId: string;\n\ttrack: MediaStreamTrack;\n\trtpReceiver?: RTCRtpReceiver;\n};\n\nexport type HandlerSendDataChannelOptions = SctpStreamParameters;\n\nexport type HandlerSendDataChannelResult =\n{\n\tdataChannel: RTCDataChannel;\n\tsctpStreamParameters: SctpStreamParameters;\n};\n\nexport type HandlerReceiveDataChannelOptions =\n{\n\tsctpStreamParameters: SctpStreamParameters;\n\tlabel?: string;\n\tprotocol?: string;\n};\n\nexport type HandlerReceiveDataChannelResult =\n{\n\tdataChannel: RTCDataChannel;\n};\n\nexport type HandlerEvents =\n{\n\t'@close': [];\n\t'@connect':\n\t[\n\t\t{ dtlsParameters: DtlsParameters },\n\t\t() => void,\n\t\t(error: Error) => void\n\t];\n\t'@connectionstatechange': [ConnectionState];\n};\n\nexport abstract class HandlerInterface extends EnhancedEventEmitter<HandlerEvents>\n{\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tabstract get name(): string;\n\n\tabstract close(): void;\n\n\tabstract getNativeRtpCapabilities(): Promise<RtpCapabilities>;\n\n\tabstract getNativeSctpCapabilities(): Promise<SctpCapabilities>;\n\n\tabstract run(options: HandlerRunOptions): void;\n\n\tabstract updateIceServers(iceServers: RTCIceServer[]): Promise<void>;\n\n\tabstract restartIce(iceParameters: IceParameters): Promise<void>;\n\n\tabstract getTransportStats(): Promise<RTCStatsReport>;\n\n\tabstract send(options: HandlerSendOptions): Promise<HandlerSendResult>;\n\n\tabstract stopSending(localId: string): Promise<void>;\n\n\tabstract pauseSending(localId: string): Promise<void>;\n\n\tabstract resumeSending(localId: string): Promise<void>;\n\n\tabstract replaceTrack(\n\t\tlocalId: string, track: MediaStreamTrack | null\n\t): Promise<void>;\n\n\tabstract setMaxSpatialLayer(\n\t\tlocalId: string, spatialLayer: number\n\t): Promise<void>;\n\n\tabstract setRtpEncodingParameters(\n\t\tlocalId: string, params: any\n\t): Promise<void>;\n\n\tabstract getSenderStats(localId: string): Promise<RTCStatsReport>;\n\n\tabstract sendDataChannel(\n\t\toptions: HandlerSendDataChannelOptions\n\t): Promise<HandlerSendDataChannelResult>;\n\n\tabstract receive(\n\t\toptionsList: HandlerReceiveOptions[]\n\t) : Promise<HandlerReceiveResult[]>;\n\n\tabstract stopReceiving(localIds: string[]): Promise<void>;\n\n\tabstract pauseReceiving(localIds: string[]): Promise<void>;\n\n\tabstract resumeReceiving(localIds: string[]): Promise<void>;\n\n\tabstract getReceiverStats(localId: string): Promise<RTCStatsReport>;\n\n\tabstract receiveDataChannel(\n\t\toptions: HandlerReceiveDataChannelOptions\n\t): Promise<HandlerReceiveDataChannelResult>;\n}\n","import * as sdpTransform from 'sdp-transform';\nimport * as utils from '../../utils';\nimport {\n\tIceParameters,\n\tIceCandidate,\n\tDtlsParameters,\n\tDtlsRole,\n\tPlainRtpParameters\n} from '../../Transport';\nimport { ProducerCodecOptions } from '../../Producer';\nimport {\n\tMediaKind,\n\tRtpParameters,\n\tRtpCodecParameters,\n\tRtcpFeedback,\n\tRtpHeaderExtensionParameters\n} from '../../RtpParameters';\nimport { SctpParameters } from '../../SctpParameters';\n\nexport abstract class MediaSection\n{\n\t// SDP media object.\n\tprotected readonly _mediaObject: any;\n\t// Whether this is Plan-B SDP.\n\tprotected readonly _planB: boolean;\n\n\tconstructor(\n\t\t{\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tplanB = false\n\t\t}:\n\t\t{\n\t\t\ticeParameters?: IceParameters;\n\t\t\ticeCandidates?: IceCandidate[];\n\t\t\tdtlsParameters?: DtlsParameters;\n\t\t\tplanB: boolean;\n\t\t}\n\t)\n\t{\n\t\tthis._mediaObject = {};\n\t\tthis._planB = planB;\n\n\t\tif (iceParameters)\n\t\t{\n\t\t\tthis.setIceParameters(iceParameters);\n\t\t}\n\n\t\tif (iceCandidates)\n\t\t{\n\t\t\tthis._mediaObject.candidates = [];\n\n\t\t\tfor (const candidate of iceCandidates)\n\t\t\t{\n\t\t\t\tconst candidateObject: any = {};\n\n\t\t\t\t// mediasoup does mandates rtcp-mux so candidates component is always\n\t\t\t\t// RTP (1).\n\t\t\t\tcandidateObject.component = 1;\n\t\t\t\tcandidateObject.foundation = candidate.foundation;\n\t\t\t\tcandidateObject.ip = candidate.ip;\n\t\t\t\tcandidateObject.port = candidate.port;\n\t\t\t\tcandidateObject.priority = candidate.priority;\n\t\t\t\tcandidateObject.transport = candidate.protocol;\n\t\t\t\tcandidateObject.type = candidate.type;\n\n\t\t\t\tif (candidate.tcpType)\n\t\t\t\t{\n\t\t\t\t\tcandidateObject.tcptype = candidate.tcpType;\n\t\t\t\t}\n\n\t\t\t\tthis._mediaObject.candidates.push(candidateObject);\n\t\t\t}\n\n\t\t\tthis._mediaObject.endOfCandidates = 'end-of-candidates';\n\t\t\tthis._mediaObject.iceOptions = 'renomination';\n\t\t}\n\n\t\tif (dtlsParameters)\n\t\t{\n\t\t\tthis.setDtlsRole(dtlsParameters.role!);\n\t\t}\n\t}\n\n\tabstract setDtlsRole(role: DtlsRole): void;\n\n\tget mid(): string\n\t{\n\t\treturn String(this._mediaObject.mid);\n\t}\n\n\tget closed(): boolean\n\t{\n\t\treturn this._mediaObject.port === 0;\n\t}\n\n\tgetObject(): object\n\t{\n\t\treturn this._mediaObject;\n\t}\n\n\tsetIceParameters(iceParameters: IceParameters): void\n\t{\n\t\tthis._mediaObject.iceUfrag = iceParameters.usernameFragment;\n\t\tthis._mediaObject.icePwd = iceParameters.password;\n\t}\n\n\tpause(): void\n\t{\n\t\tthis._mediaObject.direction = 'inactive';\n\t}\n\n\tabstract resume(): void;\n\n\tdisable(): void\n\t{\n\t\tthis.pause();\n\n\t\tdelete this._mediaObject.ext;\n\t\tdelete this._mediaObject.ssrcs;\n\t\tdelete this._mediaObject.ssrcGroups;\n\t\tdelete this._mediaObject.simulcast;\n\t\tdelete this._mediaObject.simulcast_03;\n\t\tdelete this._mediaObject.rids;\n\t\tdelete this._mediaObject.extmapAllowMixed;\n\t}\n\n\tclose(): void\n\t{\n\t\tthis.disable();\n\n\t\tthis._mediaObject.port = 0;\n\t}\n}\n\nexport class AnswerMediaSection extends MediaSection\n{\n\tconstructor(\n\t\t{\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\tplainRtpParameters,\n\t\t\tplanB = false,\n\t\t\tofferMediaObject,\n\t\t\tofferRtpParameters,\n\t\t\tanswerRtpParameters,\n\t\t\tcodecOptions,\n\t\t\textmapAllowMixed = false\n\t\t}:\n\t\t{\n\t\t\ticeParameters?: IceParameters;\n\t\t\ticeCandidates?: IceCandidate[];\n\t\t\tdtlsParameters?: DtlsParameters;\n\t\t\tsctpParameters?: SctpParameters;\n\t\t\tplainRtpParameters?: PlainRtpParameters;\n\t\t\tplanB?: boolean;\n\t\t\tofferMediaObject: any;\n\t\t\tofferRtpParameters?: RtpParameters;\n\t\t\tanswerRtpParameters?: RtpParameters;\n\t\t\tcodecOptions?: ProducerCodecOptions;\n\t\t\textmapAllowMixed?: boolean;\n\t\t}\n\t)\n\t{\n\t\tsuper({ iceParameters, iceCandidates, dtlsParameters, planB });\n\n\t\tthis._mediaObject.mid = String(offerMediaObject.mid);\n\t\tthis._mediaObject.type = offerMediaObject.type;\n\t\tthis._mediaObject.protocol = offerMediaObject.protocol;\n\n\t\tif (!plainRtpParameters)\n\t\t{\n\t\t\tthis._mediaObject.connection = { ip: '127.0.0.1', version: 4 };\n\t\t\tthis._mediaObject.port = 7;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._mediaObject.connection =\n\t\t\t{\n\t\t\t\tip : plainRtpParameters.ip,\n\t\t\t\tversion : plainRtpParameters.ipVersion\n\t\t\t};\n\t\t\tthis._mediaObject.port = plainRtpParameters.port;\n\t\t}\n\n\t\tswitch (offerMediaObject.type)\n\t\t{\n\t\t\tcase 'audio':\n\t\t\tcase 'video':\n\t\t\t{\n\t\t\t\tthis._mediaObject.direction = 'recvonly';\n\t\t\t\tthis._mediaObject.rtp = [];\n\t\t\t\tthis._mediaObject.rtcpFb = [];\n\t\t\t\tthis._mediaObject.fmtp = [];\n\n\t\t\t\tfor (const codec of answerRtpParameters!.codecs)\n\t\t\t\t{\n\t\t\t\t\tconst rtp: any =\n\t\t\t\t\t{\n\t\t\t\t\t\tpayload : codec.payloadType,\n\t\t\t\t\t\tcodec : getCodecName(codec),\n\t\t\t\t\t\trate : codec.clockRate\n\t\t\t\t\t};\n\n\t\t\t\t\tif (codec.channels! > 1)\n\t\t\t\t\t{\n\t\t\t\t\t\trtp.encoding = codec.channels;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._mediaObject.rtp.push(rtp);\n\n\t\t\t\t\tconst codecParameters = utils.clone(codec.parameters, {});\n\t\t\t\t\tlet codecRtcpFeedback: RtcpFeedback[] = utils.clone(codec.rtcpFeedback, []);\n\n\t\t\t\t\tif (codecOptions)\n\t\t\t\t\t{\n\t\t\t\t\t\tconst {\n\t\t\t\t\t\t\topusStereo,\n\t\t\t\t\t\t\topusFec,\n\t\t\t\t\t\t\topusDtx,\n\t\t\t\t\t\t\topusMaxPlaybackRate,\n\t\t\t\t\t\t\topusMaxAverageBitrate,\n\t\t\t\t\t\t\topusPtime,\n\t\t\t\t\t\t\topusNack,\n\t\t\t\t\t\t\tvideoGoogleStartBitrate,\n\t\t\t\t\t\t\tvideoGoogleMaxBitrate,\n\t\t\t\t\t\t\tvideoGoogleMinBitrate\n\t\t\t\t\t\t} = codecOptions;\n\n\t\t\t\t\t\tconst offerCodec = offerRtpParameters!.codecs\n\t\t\t\t\t\t\t.find((c: RtpCodecParameters) => (\n\t\t\t\t\t\t\t\tc.payloadType === codec.payloadType\n\t\t\t\t\t\t\t));\n\n\t\t\t\t\t\tswitch (codec.mimeType.toLowerCase())\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcase 'audio/opus':\n\t\t\t\t\t\t\tcase 'audio/multiopus':\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (opusStereo !== undefined)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tofferCodec!.parameters['sprop-stereo'] = opusStereo ? 1 : 0;\n\t\t\t\t\t\t\t\t\tcodecParameters.stereo = opusStereo ? 1 : 0;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (opusFec !== undefined)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tofferCodec!.parameters.useinbandfec = opusFec ? 1 : 0;\n\t\t\t\t\t\t\t\t\tcodecParameters.useinbandfec = opusFec ? 1 : 0;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (opusDtx !== undefined)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tofferCodec!.parameters.usedtx = opusDtx ? 1 : 0;\n\t\t\t\t\t\t\t\t\tcodecParameters.usedtx = opusDtx ? 1 : 0;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (opusMaxPlaybackRate !== undefined)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcodecParameters.maxplaybackrate = opusMaxPlaybackRate;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (opusMaxAverageBitrate !== undefined)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcodecParameters.maxaveragebitrate = opusMaxAverageBitrate;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (opusPtime !== undefined)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tofferCodec!.parameters.ptime = opusPtime;\n\t\t\t\t\t\t\t\t\tcodecParameters.ptime = opusPtime;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// If opusNack is not set, we must remove NACK support for OPUS.\n\t\t\t\t\t\t\t\t// Otherwise it would be enabled for those handlers that artificially\n\t\t\t\t\t\t\t\t// announce it in their RTP capabilities.\n\t\t\t\t\t\t\t\tif (!opusNack)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tofferCodec!.rtcpFeedback = offerCodec!\n\t\t\t\t\t\t\t\t\t\t.rtcpFeedback!\n\t\t\t\t\t\t\t\t\t\t.filter((fb) => fb.type !== 'nack' || fb.parameter);\n\n\t\t\t\t\t\t\t\t\tcodecRtcpFeedback = codecRtcpFeedback\n\t\t\t\t\t\t\t\t\t\t.filter((fb) => fb.type !== 'nack' || fb.parameter);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tcase 'video/vp8':\n\t\t\t\t\t\t\tcase 'video/vp9':\n\t\t\t\t\t\t\tcase 'video/h264':\n\t\t\t\t\t\t\tcase 'video/h265':\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (videoGoogleStartBitrate !== undefined)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcodecParameters['x-google-start-bitrate'] = videoGoogleStartBitrate;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (videoGoogleMaxBitrate !== undefined)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcodecParameters['x-google-max-bitrate'] = videoGoogleMaxBitrate;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (videoGoogleMinBitrate !== undefined)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tcodecParameters['x-google-min-bitrate'] = videoGoogleMinBitrate;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tconst fmtp =\n\t\t\t\t\t{\n\t\t\t\t\t\tpayload : codec.payloadType,\n\t\t\t\t\t\tconfig : ''\n\t\t\t\t\t};\n\n\t\t\t\t\tfor (const key of Object.keys(codecParameters))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (fmtp.config)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfmtp.config += ';';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfmtp.config += `${key}=${codecParameters[key]}`;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (fmtp.config)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._mediaObject.fmtp.push(fmtp);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const fb of codecRtcpFeedback)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._mediaObject.rtcpFb.push(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpayload : codec.payloadType,\n\t\t\t\t\t\t\t\ttype : fb.type,\n\t\t\t\t\t\t\t\tsubtype : fb.parameter\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._mediaObject.payloads = answerRtpParameters!.codecs\n\t\t\t\t\t.map((codec: RtpCodecParameters) => codec.payloadType)\n\t\t\t\t\t.join(' ');\n\n\t\t\t\tthis._mediaObject.ext = [];\n\n\t\t\t\tfor (const ext of answerRtpParameters!.headerExtensions!)\n\t\t\t\t{\n\t\t\t\t\t// Don't add a header extension if not present in the offer.\n\t\t\t\t\tconst found = (offerMediaObject.ext || [])\n\t\t\t\t\t\t.some((localExt: RtpHeaderExtensionParameters) => localExt.uri === ext.uri);\n\n\t\t\t\t\tif (!found)\n\t\t\t\t\t{\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._mediaObject.ext.push(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\turi : ext.uri,\n\t\t\t\t\t\t\tvalue : ext.id\n\t\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// Allow both 1 byte and 2 bytes length header extensions.\n\t\t\t\tif (\n\t\t\t\t\textmapAllowMixed &&\n\t\t\t\t\tofferMediaObject.extmapAllowMixed === 'extmap-allow-mixed'\n\t\t\t\t)\n\t\t\t\t{\n\t\t\t\t\tthis._mediaObject.extmapAllowMixed = 'extmap-allow-mixed';\n\t\t\t\t}\n\n\t\t\t\t// Simulcast.\n\t\t\t\tif (offerMediaObject.simulcast)\n\t\t\t\t{\n\t\t\t\t\tthis._mediaObject.simulcast =\n\t\t\t\t\t{\n\t\t\t\t\t\tdir1 : 'recv',\n\t\t\t\t\t\tlist1 : offerMediaObject.simulcast.list1\n\t\t\t\t\t};\n\n\t\t\t\t\tthis._mediaObject.rids = [];\n\n\t\t\t\t\tfor (const rid of offerMediaObject.rids || [])\n\t\t\t\t\t{\n\t\t\t\t\t\tif (rid.direction !== 'send')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._mediaObject.rids.push(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid : rid.id,\n\t\t\t\t\t\t\t\tdirection : 'recv'\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Simulcast (draft version 03).\n\t\t\t\telse if (offerMediaObject.simulcast_03)\n\t\t\t\t{\n\t\t\t\t\t// eslint-disable-next-line camelcase\n\t\t\t\t\tthis._mediaObject.simulcast_03 =\n\t\t\t\t\t{\n\t\t\t\t\t\tvalue : offerMediaObject.simulcast_03.value.replace(/send/g, 'recv')\n\t\t\t\t\t};\n\n\t\t\t\t\tthis._mediaObject.rids = [];\n\n\t\t\t\t\tfor (const rid of offerMediaObject.rids || [])\n\t\t\t\t\t{\n\t\t\t\t\t\tif (rid.direction !== 'send')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._mediaObject.rids.push(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid : rid.id,\n\t\t\t\t\t\t\t\tdirection : 'recv'\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._mediaObject.rtcpMux = 'rtcp-mux';\n\t\t\t\tthis._mediaObject.rtcpRsize = 'rtcp-rsize';\n\n\t\t\t\tif (this._planB && this._mediaObject.type === 'video')\n\t\t\t\t{\n\t\t\t\t\tthis._mediaObject.xGoogleFlag = 'conference';\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'application':\n\t\t\t{\n\t\t\t\t// New spec.\n\t\t\t\tif (typeof offerMediaObject.sctpPort === 'number')\n\t\t\t\t{\n\t\t\t\t\tthis._mediaObject.payloads = 'webrtc-datachannel';\n\t\t\t\t\tthis._mediaObject.sctpPort = sctpParameters!.port;\n\t\t\t\t\tthis._mediaObject.maxMessageSize = sctpParameters!.maxMessageSize;\n\t\t\t\t}\n\t\t\t\t// Old spec.\n\t\t\t\telse if (offerMediaObject.sctpmap)\n\t\t\t\t{\n\t\t\t\t\tthis._mediaObject.payloads = sctpParameters!.port;\n\t\t\t\t\tthis._mediaObject.sctpmap =\n\t\t\t\t\t{\n\t\t\t\t\t\tapp : 'webrtc-datachannel',\n\t\t\t\t\t\tsctpmapNumber : sctpParameters!.port,\n\t\t\t\t\t\tmaxMessageSize : sctpParameters!.maxMessageSize\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tsetDtlsRole(role: DtlsRole): void\n\t{\n\t\tswitch (role)\n\t\t{\n\t\t\tcase 'client':\n\t\t\t\tthis._mediaObject.setup = 'active';\n\t\t\t\tbreak;\n\t\t\tcase 'server':\n\t\t\t\tthis._mediaObject.setup = 'passive';\n\t\t\t\tbreak;\n\t\t\tcase 'auto':\n\t\t\t\tthis._mediaObject.setup = 'actpass';\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tresume(): void\n\t{\n\t\tthis._mediaObject.direction = 'recvonly';\n\t}\n\n\tmuxSimulcastStreams(encodings: RTCRtpEncodingParameters[]): void\n\t{\n\t\tif (!this._mediaObject.simulcast || !this._mediaObject.simulcast.list1)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst layers: {[rid: string | number]: RTCRtpEncodingParameters} = {};\n\n\t\tfor (const encoding of encodings)\n\t\t{\n\t\t\tif (encoding.rid)\n\t\t\t{\n\t\t\t\tlayers[encoding.rid] = encoding;\n\t\t\t}\n\t\t}\n\n\t\tconst raw = this._mediaObject.simulcast.list1;\n\n\t\tconst simulcastStreams =\n\t\t\tsdpTransform.parseSimulcastStreamList(raw);\n\n\t\tfor (const simulcastStream of simulcastStreams)\n\t\t{\n\t\t\tfor (const simulcastFormat of simulcastStream)\n\t\t\t{\n\t\t\t\tsimulcastFormat.paused = !layers[simulcastFormat.scid]?.active;\n\t\t\t}\n\t\t}\n\n\t\tthis._mediaObject.simulcast.list1 = simulcastStreams.map((simulcastFormats) =>\n\t\t\tsimulcastFormats.map((f) =>\n\t\t\t\t`${f.paused ? '~' : ''}${f.scid}`\n\t\t\t).join(',')\n\t\t).join(';');\n\t}\n}\n\nexport class OfferMediaSection extends MediaSection\n{\n\tconstructor(\n\t\t{\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\tplainRtpParameters,\n\t\t\tplanB = false,\n\t\t\tmid,\n\t\t\tkind,\n\t\t\tofferRtpParameters,\n\t\t\tstreamId,\n\t\t\ttrackId,\n\t\t\toldDataChannelSpec = false\n\t\t}:\n\t\t{\n\t\t\ticeParameters?: IceParameters;\n\t\t\ticeCandidates?: IceCandidate[];\n\t\t\tdtlsParameters?: DtlsParameters;\n\t\t\tsctpParameters?: SctpParameters;\n\t\t\tplainRtpParameters?: PlainRtpParameters;\n\t\t\tplanB?: boolean;\n\t\t\tmid: string;\n\t\t\tkind: MediaKind | 'application';\n\t\t\tofferRtpParameters?: RtpParameters;\n\t\t\tstreamId?: string;\n\t\t\ttrackId?: string;\n\t\t\toldDataChannelSpec?: boolean;\n\t\t}\n\t)\n\t{\n\t\tsuper({ iceParameters, iceCandidates, dtlsParameters, planB });\n\n\t\tthis._mediaObject.mid = String(mid);\n\t\tthis._mediaObject.type = kind;\n\n\t\tif (!plainRtpParameters)\n\t\t{\n\t\t\tthis._mediaObject.connection = { ip: '127.0.0.1', version: 4 };\n\n\t\t\tif (!sctpParameters)\n\t\t\t{\n\t\t\t\tthis._mediaObject.protocol = 'UDP/TLS/RTP/SAVPF';\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis._mediaObject.protocol = 'UDP/DTLS/SCTP';\n\t\t\t}\n\n\t\t\tthis._mediaObject.port = 7;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._mediaObject.connection =\n\t\t\t{\n\t\t\t\tip : plainRtpParameters.ip,\n\t\t\t\tversion : plainRtpParameters.ipVersion\n\t\t\t};\n\t\t\tthis._mediaObject.protocol = 'RTP/AVP';\n\t\t\tthis._mediaObject.port = plainRtpParameters.port;\n\t\t}\n\n\t\tswitch (kind)\n\t\t{\n\t\t\tcase 'audio':\n\t\t\tcase 'video':\n\t\t\t{\n\t\t\t\tthis._mediaObject.direction = 'sendonly';\n\t\t\t\tthis._mediaObject.rtp = [];\n\t\t\t\tthis._mediaObject.rtcpFb = [];\n\t\t\t\tthis._mediaObject.fmtp = [];\n\n\t\t\t\tif (!this._planB)\n\t\t\t\t{\n\t\t\t\t\tthis._mediaObject.msid = `${streamId || '-'} ${trackId}`;\n\t\t\t\t}\n\n\t\t\t\tfor (const codec of offerRtpParameters!.codecs)\n\t\t\t\t{\n\t\t\t\t\tconst rtp: any =\n\t\t\t\t\t{\n\t\t\t\t\t\tpayload : codec.payloadType,\n\t\t\t\t\t\tcodec : getCodecName(codec),\n\t\t\t\t\t\trate : codec.clockRate\n\t\t\t\t\t};\n\n\t\t\t\t\tif (codec.channels! > 1)\n\t\t\t\t\t{\n\t\t\t\t\t\trtp.encoding = codec.channels;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._mediaObject.rtp.push(rtp);\n\n\t\t\t\t\tconst fmtp =\n\t\t\t\t\t{\n\t\t\t\t\t\tpayload : codec.payloadType,\n\t\t\t\t\t\tconfig : ''\n\t\t\t\t\t};\n\n\t\t\t\t\tfor (const key of Object.keys(codec.parameters))\n\t\t\t\t\t{\n\t\t\t\t\t\tif (fmtp.config)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfmtp.config += ';';\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfmtp.config += `${key}=${codec.parameters[key]}`;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (fmtp.config)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._mediaObject.fmtp.push(fmtp);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const fb of codec.rtcpFeedback!)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._mediaObject.rtcpFb.push(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tpayload : codec.payloadType,\n\t\t\t\t\t\t\t\ttype : fb.type,\n\t\t\t\t\t\t\t\tsubtype : fb.parameter\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis._mediaObject.payloads = offerRtpParameters!.codecs\n\t\t\t\t\t.map((codec: RtpCodecParameters) => codec.payloadType)\n\t\t\t\t\t.join(' ');\n\n\t\t\t\tthis._mediaObject.ext = [];\n\n\t\t\t\tfor (const ext of offerRtpParameters!.headerExtensions!)\n\t\t\t\t{\n\t\t\t\t\tthis._mediaObject.ext.push(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\turi : ext.uri,\n\t\t\t\t\t\t\tvalue : ext.id\n\t\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis._mediaObject.rtcpMux = 'rtcp-mux';\n\t\t\t\tthis._mediaObject.rtcpRsize = 'rtcp-rsize';\n\n\t\t\t\tconst encoding = offerRtpParameters!.encodings![0];\n\t\t\t\tconst ssrc = encoding.ssrc;\n\t\t\t\tconst rtxSsrc = (encoding.rtx && encoding.rtx.ssrc)\n\t\t\t\t\t? encoding.rtx.ssrc\n\t\t\t\t\t: undefined;\n\n\t\t\t\tthis._mediaObject.ssrcs = [];\n\t\t\t\tthis._mediaObject.ssrcGroups = [];\n\n\t\t\t\tif (offerRtpParameters!.rtcp!.cname)\n\t\t\t\t{\n\t\t\t\t\tthis._mediaObject.ssrcs.push(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid : ssrc,\n\t\t\t\t\t\t\tattribute : 'cname',\n\t\t\t\t\t\t\tvalue : offerRtpParameters!.rtcp!.cname\n\t\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (this._planB)\n\t\t\t\t{\n\t\t\t\t\tthis._mediaObject.ssrcs.push(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tid : ssrc,\n\t\t\t\t\t\t\tattribute : 'msid',\n\t\t\t\t\t\t\tvalue : `${streamId || '-'} ${trackId}`\n\t\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (rtxSsrc)\n\t\t\t\t{\n\t\t\t\t\tif (offerRtpParameters!.rtcp!.cname)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._mediaObject.ssrcs.push(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid : rtxSsrc,\n\t\t\t\t\t\t\t\tattribute : 'cname',\n\t\t\t\t\t\t\t\tvalue : offerRtpParameters!.rtcp!.cname\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (this._planB)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis._mediaObject.ssrcs.push(\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid : rtxSsrc,\n\t\t\t\t\t\t\t\tattribute : 'msid',\n\t\t\t\t\t\t\t\tvalue : `${streamId || '-'} ${trackId}`\n\t\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\t// Associate original and retransmission SSRCs.\n\t\t\t\t\tthis._mediaObject.ssrcGroups.push(\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tsemantics : 'FID',\n\t\t\t\t\t\t\tssrcs : `${ssrc} ${rtxSsrc}`\n\t\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tcase 'application':\n\t\t\t{\n\t\t\t\t// New spec.\n\t\t\t\tif (!oldDataChannelSpec)\n\t\t\t\t{\n\t\t\t\t\tthis._mediaObject.payloads = 'webrtc-datachannel';\n\t\t\t\t\tthis._mediaObject.sctpPort = sctpParameters!.port;\n\t\t\t\t\tthis._mediaObject.maxMessageSize = sctpParameters!.maxMessageSize;\n\t\t\t\t}\n\t\t\t\t// Old spec.\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis._mediaObject.payloads = sctpParameters!.port;\n\t\t\t\t\tthis._mediaObject.sctpmap =\n\t\t\t\t\t{\n\t\t\t\t\t\tapp : 'webrtc-datachannel',\n\t\t\t\t\t\tsctpmapNumber : sctpParameters!.port,\n\t\t\t\t\t\tmaxMessageSize : sctpParameters!.maxMessageSize\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tsetDtlsRole(role: DtlsRole): void\n\t{\n\t\t// Always 'actpass'.\n\t\tthis._mediaObject.setup = 'actpass';\n\t}\n\n\tresume(): void\n\t{\n\t\tthis._mediaObject.direction = 'sendonly';\n\t}\n\n\tplanBReceive(\n\t\t{\n\t\t\tofferRtpParameters,\n\t\t\tstreamId,\n\t\t\ttrackId\n\t\t}:\n\t\t{\n\t\t\tofferRtpParameters: RtpParameters;\n\t\t\tstreamId: string;\n\t\t\ttrackId: string;\n\t\t}\n\t): void\n\t{\n\t\tconst encoding = offerRtpParameters.encodings![0];\n\t\tconst ssrc = encoding.ssrc;\n\t\tconst rtxSsrc = (encoding.rtx && encoding.rtx.ssrc)\n\t\t\t? encoding.rtx.ssrc\n\t\t\t: undefined;\n\t\tconst payloads = this._mediaObject.payloads.split(' ');\n\n\t\tfor (const codec of offerRtpParameters.codecs)\n\t\t{\n\t\t\tif (payloads.includes(String(codec.payloadType)))\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst rtp: any =\n\t\t\t{\n\t\t\t\tpayload : codec.payloadType,\n\t\t\t\tcodec : getCodecName(codec),\n\t\t\t\trate : codec.clockRate\n\t\t\t};\n\n\t\t\tif (codec.channels! > 1)\n\t\t\t{\n\t\t\t\trtp.encoding = codec.channels;\n\t\t\t}\n\n\t\t\tthis._mediaObject.rtp.push(rtp);\n\n\t\t\tconst fmtp =\n\t\t\t{\n\t\t\t\tpayload : codec.payloadType,\n\t\t\t\tconfig : ''\n\t\t\t};\n\n\t\t\tfor (const key of Object.keys(codec.parameters))\n\t\t\t{\n\t\t\t\tif (fmtp.config)\n\t\t\t\t{\n\t\t\t\t\tfmtp.config += ';';\n\t\t\t\t}\n\n\t\t\t\tfmtp.config += `${key}=${codec.parameters[key]}`;\n\t\t\t}\n\n\t\t\tif (fmtp.config)\n\t\t\t{\n\t\t\t\tthis._mediaObject.fmtp.push(fmtp);\n\t\t\t}\n\n\t\t\tfor (const fb of codec.rtcpFeedback!)\n\t\t\t{\n\t\t\t\tthis._mediaObject.rtcpFb.push(\n\t\t\t\t\t{\n\t\t\t\t\t\tpayload : codec.payloadType,\n\t\t\t\t\t\ttype : fb.type,\n\t\t\t\t\t\tsubtype : fb.parameter\n\t\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tthis._mediaObject.payloads += ` ${offerRtpParameters\n\t\t\t.codecs\n\t\t\t.filter((codec: RtpCodecParameters) =>\n\t\t\t\t!this._mediaObject.payloads.includes(codec.payloadType))\n\t\t\t.map((codec: RtpCodecParameters) => codec.payloadType)\n\t\t\t.join(' ')}`;\n\n\t\tthis._mediaObject.payloads = this._mediaObject.payloads.trim();\n\n\t\tif (offerRtpParameters.rtcp!.cname)\n\t\t{\n\t\t\tthis._mediaObject.ssrcs.push(\n\t\t\t\t{\n\t\t\t\t\tid : ssrc,\n\t\t\t\t\tattribute : 'cname',\n\t\t\t\t\tvalue : offerRtpParameters.rtcp!.cname\n\t\t\t\t});\n\t\t}\n\n\t\tthis._mediaObject.ssrcs.push(\n\t\t\t{\n\t\t\t\tid : ssrc,\n\t\t\t\tattribute : 'msid',\n\t\t\t\tvalue : `${streamId || '-'} ${trackId}`\n\t\t\t});\n\n\t\tif (rtxSsrc)\n\t\t{\n\t\t\tif (offerRtpParameters.rtcp!.cname)\n\t\t\t{\n\t\t\t\tthis._mediaObject.ssrcs.push(\n\t\t\t\t\t{\n\t\t\t\t\t\tid : rtxSsrc,\n\t\t\t\t\t\tattribute : 'cname',\n\t\t\t\t\t\tvalue : offerRtpParameters.rtcp!.cname\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tthis._mediaObject.ssrcs.push(\n\t\t\t\t{\n\t\t\t\t\tid : rtxSsrc,\n\t\t\t\t\tattribute : 'msid',\n\t\t\t\t\tvalue : `${streamId || '-'} ${trackId}`\n\t\t\t\t});\n\n\t\t\t// Associate original and retransmission SSRCs.\n\t\t\tthis._mediaObject.ssrcGroups.push(\n\t\t\t\t{\n\t\t\t\t\tsemantics : 'FID',\n\t\t\t\t\tssrcs : `${ssrc} ${rtxSsrc}`\n\t\t\t\t});\n\t\t}\n\t}\n\n\tplanBStopReceiving(\n\t\t{ offerRtpParameters }: { offerRtpParameters: RtpParameters }\n\t): void\n\t{\n\t\tconst encoding = offerRtpParameters.encodings![0];\n\t\tconst ssrc = encoding.ssrc;\n\t\tconst rtxSsrc = (encoding.rtx && encoding.rtx.ssrc)\n\t\t\t? encoding.rtx.ssrc\n\t\t\t: undefined;\n\n\t\tthis._mediaObject.ssrcs = this._mediaObject.ssrcs\n\t\t\t.filter((s: any) => s.id !== ssrc && s.id !== rtxSsrc);\n\n\t\tif (rtxSsrc)\n\t\t{\n\t\t\tthis._mediaObject.ssrcGroups = this._mediaObject.ssrcGroups\n\t\t\t\t.filter((group: any) => group.ssrcs !== `${ssrc} ${rtxSsrc}`);\n\t\t}\n\t}\n}\n\nfunction getCodecName(codec: RtpCodecParameters): string\n{\n\tconst MimeTypeRegex = new RegExp('^(audio|video)/(.+)', 'i');\n\tconst mimeTypeMatch = MimeTypeRegex.exec(codec.mimeType);\n\n\tif (!mimeTypeMatch)\n\t{\n\t\tthrow new TypeError('invalid codec.mimeType');\n\t}\n\n\treturn mimeTypeMatch[2];\n}\n","import * as sdpTransform from 'sdp-transform';\nimport { Logger } from '../../Logger';\nimport {\n\tMediaSection,\n\tAnswerMediaSection,\n\tOfferMediaSection\n} from './MediaSection';\nimport {\n\tIceParameters,\n\tIceCandidate,\n\tDtlsParameters,\n\tDtlsRole,\n\tPlainRtpParameters\n} from '../../Transport';\nimport { ProducerCodecOptions } from '../../Producer';\nimport { MediaKind, RtpParameters } from '../../RtpParameters';\nimport { SctpParameters } from '../../SctpParameters';\n\nconst logger = new Logger('RemoteSdp');\n\nexport class RemoteSdp\n{\n\t// Remote ICE parameters.\n\tprivate _iceParameters?: IceParameters;\n\t// Remote ICE candidates.\n\tprivate readonly _iceCandidates?: IceCandidate[];\n\t// Remote DTLS parameters.\n\tprivate readonly _dtlsParameters?: DtlsParameters;\n\t// Remote SCTP parameters.\n\tprivate readonly _sctpParameters?: SctpParameters;\n\t// Parameters for plain RTP (no SRTP nor DTLS no BUNDLE).\n\tprivate readonly _plainRtpParameters?: PlainRtpParameters;\n\t// Whether this is Plan-B SDP.\n\tprivate readonly _planB: boolean;\n\t// MediaSection instances with same order as in the SDP.\n\tprivate readonly _mediaSections: MediaSection[] = [];\n\t// MediaSection indices indexed by MID.\n\tprivate readonly _midToIndex: Map<string, number> = new Map();\n\t// First MID.\n\tprivate _firstMid?: string;\n\t// SDP object.\n\tprivate readonly _sdpObject: any;\n\n\tconstructor(\n\t\t{\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\tplainRtpParameters,\n\t\t\tplanB = false\n\t\t}:\n\t\t{\n\t\t\ticeParameters?: IceParameters;\n\t\t\ticeCandidates?: IceCandidate[];\n\t\t\tdtlsParameters?: DtlsParameters;\n\t\t\tsctpParameters?: SctpParameters;\n\t\t\tplainRtpParameters?: PlainRtpParameters;\n\t\t\tplanB?: boolean;\n\t\t}\n\t)\n\t{\n\t\tthis._iceParameters = iceParameters;\n\t\tthis._iceCandidates = iceCandidates;\n\t\tthis._dtlsParameters = dtlsParameters;\n\t\tthis._sctpParameters = sctpParameters;\n\t\tthis._plainRtpParameters = plainRtpParameters;\n\t\tthis._planB = planB;\n\t\tthis._sdpObject =\n\t\t{\n\t\t\tversion : 0,\n\t\t\torigin :\n\t\t\t{\n\t\t\t\taddress : '0.0.0.0',\n\t\t\t\tipVer : 4,\n\t\t\t\tnetType : 'IN',\n\t\t\t\tsessionId : 10000,\n\t\t\t\tsessionVersion : 0,\n\t\t\t\tusername : 'mediasoup-client'\n\t\t\t},\n\t\t\tname : '-',\n\t\t\ttiming : { start: 0, stop: 0 },\n\t\t\tmedia : []\n\t\t};\n\n\t\t// If ICE parameters are given, add ICE-Lite indicator.\n\t\tif (iceParameters && iceParameters.iceLite)\n\t\t{\n\t\t\tthis._sdpObject.icelite = 'ice-lite';\n\t\t}\n\n\t\t// If DTLS parameters are given, assume WebRTC and BUNDLE.\n\t\tif (dtlsParameters)\n\t\t{\n\t\t\tthis._sdpObject.msidSemantic = { semantic: 'WMS', token: '*' };\n\n\t\t\t// NOTE: We take the latest fingerprint.\n\t\t\tconst numFingerprints = this._dtlsParameters!.fingerprints.length;\n\n\t\t\tthis._sdpObject.fingerprint =\n\t\t\t{\n\t\t\t\ttype : dtlsParameters.fingerprints[numFingerprints - 1].algorithm,\n\t\t\t\thash : dtlsParameters.fingerprints[numFingerprints - 1].value\n\t\t\t};\n\n\t\t\tthis._sdpObject.groups = [ { type: 'BUNDLE', mids: '' } ];\n\t\t}\n\n\t\t// If there are plain RPT parameters, override SDP origin.\n\t\tif (plainRtpParameters)\n\t\t{\n\t\t\tthis._sdpObject.origin.address = plainRtpParameters.ip;\n\t\t\tthis._sdpObject.origin.ipVer = plainRtpParameters.ipVersion;\n\t\t}\n\t}\n\n\tupdateIceParameters(iceParameters: IceParameters): void\n\t{\n\t\tlogger.debug(\n\t\t\t'updateIceParameters() [iceParameters:%o]',\n\t\t\ticeParameters);\n\n\t\tthis._iceParameters = iceParameters;\n\t\tthis._sdpObject.icelite = iceParameters.iceLite ? 'ice-lite' : undefined;\n\n\t\tfor (const mediaSection of this._mediaSections)\n\t\t{\n\t\t\tmediaSection.setIceParameters(iceParameters);\n\t\t}\n\t}\n\n\tupdateDtlsRole(role: DtlsRole): void\n\t{\n\t\tlogger.debug('updateDtlsRole() [role:%s]', role);\n\n\t\tthis._dtlsParameters!.role = role;\n\n\t\tfor (const mediaSection of this._mediaSections)\n\t\t{\n\t\t\tmediaSection.setDtlsRole(role);\n\t\t}\n\t}\n\n\tgetNextMediaSectionIdx(): { idx: number; reuseMid?: string }\n\t{\n\t\t// If a closed media section is found, return its index.\n\t\tfor (let idx = 0; idx < this._mediaSections.length; ++idx)\n\t\t{\n\t\t\tconst mediaSection = this._mediaSections[idx];\n\n\t\t\tif (mediaSection.closed)\n\t\t\t{\n\t\t\t\treturn { idx, reuseMid: mediaSection.mid };\n\t\t\t}\n\t\t}\n\n\t\t// If no closed media section is found, return next one.\n\t\treturn { idx: this._mediaSections.length };\n\t}\n\n\tsend(\n\t\t{\n\t\t\tofferMediaObject,\n\t\t\treuseMid,\n\t\t\tofferRtpParameters,\n\t\t\tanswerRtpParameters,\n\t\t\tcodecOptions,\n\t\t\textmapAllowMixed = false\n\t\t}:\n\t\t{\n\t\t\tofferMediaObject: any;\n\t\t\treuseMid?: string;\n\t\t\tofferRtpParameters: RtpParameters;\n\t\t\tanswerRtpParameters: RtpParameters;\n\t\t\tcodecOptions?: ProducerCodecOptions;\n\t\t\textmapAllowMixed? : boolean;\n\t\t}\n\t): void\n\t{\n\t\tconst mediaSection = new AnswerMediaSection(\n\t\t\t{\n\t\t\t\ticeParameters : this._iceParameters,\n\t\t\t\ticeCandidates : this._iceCandidates,\n\t\t\t\tdtlsParameters : this._dtlsParameters,\n\t\t\t\tplainRtpParameters : this._plainRtpParameters,\n\t\t\t\tplanB : this._planB,\n\t\t\t\tofferMediaObject,\n\t\t\t\tofferRtpParameters,\n\t\t\t\tanswerRtpParameters,\n\t\t\t\tcodecOptions,\n\t\t\t\textmapAllowMixed\n\t\t\t});\n\n\t\t// Unified-Plan with closed media section replacement.\n\t\tif (reuseMid)\n\t\t{\n\t\t\tthis._replaceMediaSection(mediaSection, reuseMid);\n\t\t}\n\t\t// Unified-Plan or Plan-B with different media kind.\n\t\telse if (!this._midToIndex.has(mediaSection.mid))\n\t\t{\n\t\t\tthis._addMediaSection(mediaSection);\n\t\t}\n\t\t// Plan-B with same media kind.\n\t\telse\n\t\t{\n\t\t\tthis._replaceMediaSection(mediaSection);\n\t\t}\n\t}\n\n\treceive(\n\t\t{\n\t\t\tmid,\n\t\t\tkind,\n\t\t\tofferRtpParameters,\n\t\t\tstreamId,\n\t\t\ttrackId\n\t\t}:\n\t\t{\n\t\t\tmid: string;\n\t\t\tkind: MediaKind;\n\t\t\tofferRtpParameters: RtpParameters;\n\t\t\tstreamId: string;\n\t\t\ttrackId: string;\n\t\t}\n\t): void\n\t{\n\t\tconst idx = this._midToIndex.get(mid);\n\t\tlet mediaSection: OfferMediaSection | undefined;\n\n\t\tif (idx !== undefined)\n\t\t{\n\t\t\tmediaSection = this._mediaSections[idx] as OfferMediaSection;\n\t\t}\n\n\t\t// Unified-Plan or different media kind.\n\t\tif (!mediaSection)\n\t\t{\n\t\t\tmediaSection = new OfferMediaSection(\n\t\t\t\t{\n\t\t\t\t\ticeParameters : this._iceParameters,\n\t\t\t\t\ticeCandidates : this._iceCandidates,\n\t\t\t\t\tdtlsParameters : this._dtlsParameters,\n\t\t\t\t\tplainRtpParameters : this._plainRtpParameters,\n\t\t\t\t\tplanB : this._planB,\n\t\t\t\t\tmid,\n\t\t\t\t\tkind,\n\t\t\t\t\tofferRtpParameters,\n\t\t\t\t\tstreamId,\n\t\t\t\t\ttrackId\n\t\t\t\t});\n\n\t\t\t// Let's try to recycle a closed media section (if any).\n\t\t\t// NOTE: Yes, we can recycle a closed m=audio section with a new m=video.\n\t\t\tconst oldMediaSection = this._mediaSections.find((m) => (m.closed));\n\n\t\t\tif (oldMediaSection)\n\t\t\t{\n\t\t\t\tthis._replaceMediaSection(mediaSection, oldMediaSection.mid);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis._addMediaSection(mediaSection);\n\t\t\t}\n\t\t}\n\t\t// Plan-B.\n\t\telse\n\t\t{\n\t\t\tmediaSection.planBReceive({ offerRtpParameters, streamId, trackId });\n\n\t\t\tthis._replaceMediaSection(mediaSection);\n\t\t}\n\t}\n\n\tpauseMediaSection(mid: string): void\n\t{\n\t\tconst mediaSection = this._findMediaSection(mid);\n\n\t\tmediaSection.pause();\n\t}\n\n\tresumeSendingMediaSection(mid: string): void\n\t{\n\t\tconst mediaSection = this._findMediaSection(mid);\n\n\t\tmediaSection.resume();\n\t}\n\n\tresumeReceivingMediaSection(mid: string): void\n\t{\n\t\tconst mediaSection = this._findMediaSection(mid);\n\n\t\tmediaSection.resume();\n\t}\n\n\tdisableMediaSection(mid: string): void\n\t{\n\t\tconst mediaSection = this._findMediaSection(mid);\n\n\t\tmediaSection.disable();\n\t}\n\n\t/**\n\t * Closes media section. Returns true if the given MID corresponds to a m\n\t * section that has been indeed closed. False otherwise.\n\t *\n\t * NOTE: Closing the first m section is a pain since it invalidates the bundled\n\t * transport, so instead closing it we just disable it.\n\t */\n\tcloseMediaSection(mid: string): boolean\n\t{\n\t\tconst mediaSection = this._findMediaSection(mid);\n\n\t\t// NOTE: Closing the first m section is a pain since it invalidates the\n\t\t// bundled transport, so let's avoid it.\n\t\tif (mid === this._firstMid)\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'closeMediaSection() | cannot close first media section, disabling it instead [mid:%s]',\n\t\t\t\tmid);\n\n\t\t\tthis.disableMediaSection(mid);\n\n\t\t\treturn false;\n\t\t}\n\n\t\tmediaSection.close();\n\n\t\t// Regenerate BUNDLE mids.\n\t\tthis._regenerateBundleMids();\n\n\t\treturn true;\n\t}\n\n\tmuxMediaSectionSimulcast(\n\t\tmid: string, encodings: RTCRtpEncodingParameters[]\n\t): void\n\t{\n\t\tconst mediaSection = this._findMediaSection(mid) as AnswerMediaSection;\n\n\t\tmediaSection.muxSimulcastStreams(encodings);\n\n\t\tthis._replaceMediaSection(mediaSection);\n\t}\n\n\tplanBStopReceiving(\n\t\t{\n\t\t\tmid,\n\t\t\tofferRtpParameters\n\t\t}:\n\t\t{\n\t\t\tmid: string;\n\t\t\tofferRtpParameters: RtpParameters;\n\t\t}\n\t): void\n\t{\n\t\tconst mediaSection = this._findMediaSection(mid) as OfferMediaSection;\n\n\t\tmediaSection.planBStopReceiving({ offerRtpParameters });\n\n\t\tthis._replaceMediaSection(mediaSection);\n\t}\n\n\tsendSctpAssociation({ offerMediaObject }: { offerMediaObject: any }): void\n\t{\n\t\tconst mediaSection = new AnswerMediaSection(\n\t\t\t{\n\t\t\t\ticeParameters : this._iceParameters,\n\t\t\t\ticeCandidates : this._iceCandidates,\n\t\t\t\tdtlsParameters : this._dtlsParameters,\n\t\t\t\tsctpParameters : this._sctpParameters,\n\t\t\t\tplainRtpParameters : this._plainRtpParameters,\n\t\t\t\tofferMediaObject\n\t\t\t});\n\n\t\tthis._addMediaSection(mediaSection);\n\t}\n\n\treceiveSctpAssociation(\n\t\t{ oldDataChannelSpec = false }:\n\t\t{ oldDataChannelSpec?: boolean } = {}\n\t): void\n\t{\n\t\tconst mediaSection = new OfferMediaSection(\n\t\t\t{\n\t\t\t\ticeParameters : this._iceParameters,\n\t\t\t\ticeCandidates : this._iceCandidates,\n\t\t\t\tdtlsParameters : this._dtlsParameters,\n\t\t\t\tsctpParameters : this._sctpParameters,\n\t\t\t\tplainRtpParameters : this._plainRtpParameters,\n\t\t\t\tmid : 'datachannel',\n\t\t\t\tkind : 'application',\n\t\t\t\toldDataChannelSpec\n\t\t\t});\n\n\t\tthis._addMediaSection(mediaSection);\n\t}\n\n\tgetSdp(): string\n\t{\n\t\t// Increase SDP version.\n\t\tthis._sdpObject.origin.sessionVersion++;\n\n\t\treturn sdpTransform.write(this._sdpObject);\n\t}\n\n\t_addMediaSection(newMediaSection: MediaSection): void\n\t{\n\t\tif (!this._firstMid)\n\t\t{\n\t\t\tthis._firstMid = newMediaSection.mid;\n\t\t}\n\n\t\t// Add to the vector.\n\t\tthis._mediaSections.push(newMediaSection);\n\n\t\t// Add to the map.\n\t\tthis._midToIndex.set(newMediaSection.mid, this._mediaSections.length - 1);\n\n\t\t// Add to the SDP object.\n\t\tthis._sdpObject.media.push(newMediaSection.getObject());\n\n\t\t// Regenerate BUNDLE mids.\n\t\tthis._regenerateBundleMids();\n\t}\n\n\t_replaceMediaSection(newMediaSection: MediaSection, reuseMid?: string): void\n\t{\n\t\t// Store it in the map.\n\t\tif (typeof reuseMid === 'string')\n\t\t{\n\t\t\tconst idx = this._midToIndex.get(reuseMid);\n\n\t\t\tif (idx === undefined)\n\t\t\t{\n\t\t\t\tthrow new Error(`no media section found for reuseMid '${reuseMid}'`);\n\t\t\t}\n\n\t\t\tconst oldMediaSection = this._mediaSections[idx];\n\n\t\t\t// Replace the index in the vector with the new media section.\n\t\t\tthis._mediaSections[idx] = newMediaSection;\n\n\t\t\t// Update the map.\n\t\t\tthis._midToIndex.delete(oldMediaSection.mid);\n\t\t\tthis._midToIndex.set(newMediaSection.mid, idx);\n\n\t\t\t// Update the SDP object.\n\t\t\tthis._sdpObject.media[idx] = newMediaSection.getObject();\n\n\t\t\t// Regenerate BUNDLE mids.\n\t\t\tthis._regenerateBundleMids();\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst idx = this._midToIndex.get(newMediaSection.mid);\n\n\t\t\tif (idx === undefined)\n\t\t\t{\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`no media section found with mid '${newMediaSection.mid}'`);\n\t\t\t}\n\n\t\t\t// Replace the index in the vector with the new media section.\n\t\t\tthis._mediaSections[idx] = newMediaSection;\n\n\t\t\t// Update the SDP object.\n\t\t\tthis._sdpObject.media[idx] = newMediaSection.getObject();\n\t\t}\n\t}\n\n\t_findMediaSection(mid: string): MediaSection\n\t{\n\t\tconst idx = this._midToIndex.get(mid);\n\n\t\tif (idx === undefined)\n\t\t{\n\t\t\tthrow new Error(`no media section found with mid '${mid}'`);\n\t\t}\n\n\t\treturn this._mediaSections[idx];\n\t}\n\n\t_regenerateBundleMids(): void\n\t{\n\t\tif (!this._dtlsParameters)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tthis._sdpObject.groups[0].mids = this._mediaSections\n\t\t\t.filter((mediaSection: MediaSection) => !mediaSection.closed)\n\t\t\t.map((mediaSection: MediaSection) => mediaSection.mid)\n\t\t\t.join(' ');\n\t}\n}\n","const ScalabilityModeRegex = new RegExp('^[LS]([1-9]\\\\d{0,1})T([1-9]\\\\d{0,1})');\n\nexport type ScalabilityMode =\n{\n\tspatialLayers: number;\n\ttemporalLayers: number;\n};\n\nexport function parse(scalabilityMode?: string): ScalabilityMode\n{\n\tconst match = ScalabilityModeRegex.exec(scalabilityMode || '');\n\n\tif (match)\n\t{\n\t\treturn {\n\t\t\tspatialLayers : Number(match[1]),\n\t\t\ttemporalLayers : Number(match[2])\n\t\t};\n\t}\n\telse\n\t{\n\t\treturn {\n\t\t\tspatialLayers : 1,\n\t\t\ttemporalLayers : 1\n\t\t};\n\t}\n}\n","import * as sdpTransform from 'sdp-transform';\nimport { Logger } from '../Logger';\nimport * as utils from '../utils';\nimport * as ortc from '../ortc';\nimport * as sdpCommonUtils from './sdp/commonUtils';\nimport * as sdpUnifiedPlanUtils from './sdp/unifiedPlanUtils';\nimport * as ortcUtils from './ortc/utils';\nimport {\n\tHandlerFactory,\n\tHandlerInterface,\n\tHandlerRunOptions,\n\tHandlerSendOptions,\n\tHandlerSendResult,\n\tHandlerReceiveOptions,\n\tHandlerReceiveResult,\n\tHandlerSendDataChannelOptions,\n\tHandlerSendDataChannelResult,\n\tHandlerReceiveDataChannelOptions,\n\tHandlerReceiveDataChannelResult\n} from './HandlerInterface';\nimport { RemoteSdp } from './sdp/RemoteSdp';\nimport { parse as parseScalabilityMode } from '../scalabilityModes';\nimport { IceParameters, DtlsRole } from '../Transport';\nimport { RtpCapabilities, RtpParameters } from '../RtpParameters';\nimport { SctpCapabilities, SctpStreamParameters } from '../SctpParameters';\n\nconst logger = new Logger('Chrome111');\n\nconst SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };\n\nexport class Chrome111 extends HandlerInterface\n{\n\t// Handler direction.\n\tprivate _direction?: 'send' | 'recv';\n\t// Remote SDP handler.\n\tprivate _remoteSdp?: RemoteSdp;\n\t// Generic sending RTP parameters for audio and video.\n\tprivate _sendingRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Generic sending RTP parameters for audio and video suitable for the SDP\n\t// remote answer.\n\tprivate _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Initial server side DTLS role. If not 'auto', it will force the opposite\n\t// value in client side.\n\tprivate _forcedLocalDtlsRole?: DtlsRole;\n\t// RTCPeerConnection instance.\n\tprivate _pc: any;\n\t// Map of RTCTransceivers indexed by MID.\n\tprivate readonly _mapMidTransceiver: Map<string, RTCRtpTransceiver> =\n\t\tnew Map();\n\t// Local stream for sending.\n\tprivate readonly _sendStream = new MediaStream();\n\t// Whether a DataChannel m=application section has been created.\n\tprivate _hasDataChannelMediaSection = false;\n\t// Sending DataChannel id value counter. Incremented for each new DataChannel.\n\tprivate _nextSendSctpStreamId = 0;\n\t// Got transport local and remote parameters.\n\tprivate _transportReady = false;\n\n\t/**\n\t * Creates a factory function.\n\t */\n\tstatic createFactory(): HandlerFactory\n\t{\n\t\treturn (): Chrome111 => new Chrome111();\n\t}\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tget name(): string\n\t{\n\t\treturn 'Chrome111';\n\t}\n\n\tclose(): void\n\t{\n\t\tlogger.debug('close()');\n\n\t\t// Close RTCPeerConnection.\n\t\tif (this._pc)\n\t\t{\n\t\t\ttry { this._pc.close(); }\n\t\t\tcatch (error) {}\n\t\t}\n\n\t\tthis.emit('@close');\n\t}\n\n\tasync getNativeRtpCapabilities(): Promise<RtpCapabilities>\n\t{\n\t\tlogger.debug('getNativeRtpCapabilities()');\n\n\t\tconst pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : [],\n\t\t\t\ticeTransportPolicy : 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'unified-plan'\n\t\t\t});\n\n\t\ttry\n\t\t{\n\t\t\tpc.addTransceiver('audio');\n\t\t\tpc.addTransceiver('video');\n\n\t\t\tconst offer = await pc.createOffer();\n\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error) {}\n\n\t\t\tconst sdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst nativeRtpCapabilities =\n\t\t\t\tsdpCommonUtils.extractRtpCapabilities({ sdpObject });\n\n\t\t\t// libwebrtc supports NACK for OPUS but doesn't announce it.\n\t\t\tortcUtils.addNackSuppportForOpus(nativeRtpCapabilities);\n\n\t\t\treturn nativeRtpCapabilities;\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error2) {}\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync getNativeSctpCapabilities(): Promise<SctpCapabilities>\n\t{\n\t\tlogger.debug('getNativeSctpCapabilities()');\n\n\t\treturn {\n\t\t\tnumStreams : SCTP_NUM_STREAMS\n\t\t};\n\t}\n\n\trun(\n\t\t{\n\t\t\tdirection,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\textendedRtpCapabilities\n\t\t}: HandlerRunOptions\n\t): void\n\t{\n\t\tlogger.debug('run()');\n\n\t\tthis._direction = direction;\n\n\t\tthis._remoteSdp = new RemoteSdp(\n\t\t\t{\n\t\t\t\ticeParameters,\n\t\t\t\ticeCandidates,\n\t\t\t\tdtlsParameters,\n\t\t\t\tsctpParameters\n\t\t\t});\n\n\t\tthis._sendingRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tthis._sendingRemoteRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tif (dtlsParameters.role && dtlsParameters.role !== 'auto')\n\t\t{\n\t\t\tthis._forcedLocalDtlsRole = dtlsParameters.role === 'server'\n\t\t\t\t? 'client'\n\t\t\t\t: 'server';\n\t\t}\n\n\t\tthis._pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : iceServers || [],\n\t\t\t\ticeTransportPolicy : iceTransportPolicy || 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'unified-plan',\n\t\t\t\t...additionalSettings\n\t\t\t},\n\t\t\tproprietaryConstraints);\n\n\t\tif (this._pc.connectionState)\n\t\t{\n\t\t\tthis._pc.addEventListener('connectionstatechange', () =>\n\t\t\t{\n\t\t\t\tthis.emit('@connectionstatechange', this._pc.connectionState);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.warn(\n\t\t\t\t'run() | pc.connectionState not supported, using pc.iceConnectionState');\n\n\t\t\tthis._pc.addEventListener('iceconnectionstatechange', () =>\n\t\t\t{\n\t\t\t\tswitch (this._pc.iceConnectionState)\n\t\t\t\t{\n\t\t\t\t\tcase 'checking':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connecting');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'connected':\n\t\t\t\t\tcase 'completed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'failed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'failed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'disconnected':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'disconnected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'closed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync updateIceServers(iceServers: RTCIceServer[]): Promise<void>\n\t{\n\t\tlogger.debug('updateIceServers()');\n\n\t\tconst configuration = this._pc.getConfiguration();\n\n\t\tconfiguration.iceServers = iceServers;\n\n\t\tthis._pc.setConfiguration(configuration);\n\t}\n\n\tasync restartIce(iceParameters: IceParameters): Promise<void>\n\t{\n\t\tlogger.debug('restartIce()');\n\n\t\t// Provide the remote SDP handler with new remote ICE parameters.\n\t\tthis._remoteSdp!.updateIceParameters(iceParameters);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._direction === 'send')\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer({ iceRestart: true });\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\t\t}\n\t}\n\n\tasync getTransportStats(): Promise<RTCStatsReport>\n\t{\n\t\treturn this._pc.getStats();\n\t}\n\n\tasync send(\n\t\t{ track, encodings, codecOptions, codec }: HandlerSendOptions\n\t): Promise<HandlerSendResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);\n\n\t\tif (encodings && encodings.length > 1)\n\t\t{\n\t\t\tencodings.forEach((encoding, idx: number) =>\n\t\t\t{\n\t\t\t\tencoding.rid = `r${idx}`;\n\t\t\t});\n\n\t\t\t// Set rid and verify scalabilityMode in each encoding.\n\t\t\t// NOTE: Even if WebRTC allows different scalabilityMode (different number\n\t\t\t// of temporal layers) per simulcast stream, we need that those are the\n\t\t\t// same in all them, so let's pick up the highest value.\n\t\t\t// NOTE: If scalabilityMode is not given, Chrome will use L1T3.\n\n\t\t\tlet nextRid = 1;\n\t\t\tlet maxTemporalLayers = 1;\n\n\t\t\tfor (const encoding of encodings)\n\t\t\t{\n\t\t\t\tconst temporalLayers = encoding.scalabilityMode\n\t\t\t\t\t? parseScalabilityMode(encoding.scalabilityMode).temporalLayers\n\t\t\t\t\t: 3;\n\n\t\t\t\tif (temporalLayers > maxTemporalLayers)\n\t\t\t\t{\n\t\t\t\t\tmaxTemporalLayers = temporalLayers;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor (const encoding of encodings)\n\t\t\t{\n\t\t\t\tencoding.rid = `r${nextRid++}`;\n\t\t\t\tencoding.scalabilityMode = `L1T${maxTemporalLayers}`;\n\t\t\t}\n\t\t}\n\n\t\tconst sendingRtpParameters: RtpParameters =\n\t\t\tutils.clone(this._sendingRtpParametersByKind![track.kind], {});\n\n\t\t// This may throw.\n\t\tsendingRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRtpParameters.codecs, codec);\n\n\t\tconst sendingRemoteRtpParameters: RtpParameters =\n\t\t\tutils.clone(this._sendingRemoteRtpParametersByKind![track.kind], {});\n\n\t\t// This may throw.\n\t\tsendingRemoteRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec);\n\n\t\tconst mediaSectionIdx = this._remoteSdp!.getNextMediaSectionIdx();\n\t\tconst transceiver = this._pc.addTransceiver(\n\t\t\ttrack,\n\t\t\t{\n\t\t\t\tdirection : 'sendonly',\n\t\t\t\tstreams : [ this._sendStream ],\n\t\t\t\tsendEncodings : encodings\n\t\t\t});\n\t\tconst offer = await this._pc.createOffer();\n\t\tlet localSdpObject = sdpTransform.parse(offer.sdp);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t// We can now get the transceiver.mid.\n\t\tconst localId = transceiver.mid;\n\n\t\t// Set MID.\n\t\tsendingRtpParameters.mid = localId;\n\n\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\n\t\tconst offerMediaObject = localSdpObject.media[mediaSectionIdx.idx];\n\n\t\t// Set RTCP CNAME.\n\t\tsendingRtpParameters.rtcp!.cname =\n\t\t\tsdpCommonUtils.getCname({ offerMediaObject });\n\n\t\t// Set RTP encodings by parsing the SDP offer if no encodings are given.\n\t\tif (!encodings)\n\t\t{\n\t\t\tsendingRtpParameters.encodings =\n\t\t\t\tsdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject });\n\t\t}\n\t\t// Set RTP encodings by parsing the SDP offer and complete them with given\n\t\t// one if just a single encoding has been given.\n\t\telse if (encodings.length === 1)\n\t\t{\n\t\t\tconst newEncodings =\n\t\t\t\tsdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject });\n\n\t\t\tObject.assign(newEncodings[0], encodings[0]);\n\n\t\t\tsendingRtpParameters.encodings = newEncodings;\n\t\t}\n\t\t// Otherwise if more than 1 encoding are given use them verbatim.\n\t\telse\n\t\t{\n\t\t\tsendingRtpParameters.encodings = encodings;\n\t\t}\n\n\t\tthis._remoteSdp!.send(\n\t\t\t{\n\t\t\t\tofferMediaObject,\n\t\t\t\treuseMid : mediaSectionIdx.reuseMid,\n\t\t\t\tofferRtpParameters : sendingRtpParameters,\n\t\t\t\tanswerRtpParameters : sendingRemoteRtpParameters,\n\t\t\t\tcodecOptions,\n\t\t\t\textmapAllowMixed : true\n\t\t\t});\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t// Store in the map.\n\t\tthis._mapMidTransceiver.set(localId, transceiver);\n\n\t\treturn {\n\t\t\tlocalId,\n\t\t\trtpParameters : sendingRtpParameters,\n\t\t\trtpSender : transceiver.sender\n\t\t};\n\t}\n\n\tasync stopSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('stopSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.sender.replaceTrack(null);\n\n\t\tthis._pc.removeTrack(transceiver.sender);\n\n\t\tconst mediaSectionClosed =\n\t\t\tthis._remoteSdp!.closeMediaSection(transceiver.mid!);\n\n\t\tif (mediaSectionClosed)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\ttransceiver.stop();\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{}\n\t\t}\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\tthis._mapMidTransceiver.delete(localId);\n\t}\n\n\tasync pauseSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('pauseSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.direction = 'inactive';\n\t\tthis._remoteSdp!.pauseMediaSection(localId);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'pauseSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'pauseSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync resumeSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('resumeSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tthis._remoteSdp!.resumeSendingMediaSection(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.direction = 'sendonly';\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'resumeSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'resumeSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync replaceTrack(\n\t\tlocalId: string, track: MediaStreamTrack | null\n\t): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tif (track)\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'replaceTrack() [localId:%s, track.id:%s]', localId, track.id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.debug('replaceTrack() [localId:%s, no track]', localId);\n\t\t}\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tawait transceiver.sender.replaceTrack(track);\n\t}\n\n\tasync setMaxSpatialLayer(localId: string, spatialLayer: number): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() [localId:%s, spatialLayer:%s]',\n\t\t\tlocalId, spatialLayer);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tif (idx <= spatialLayer)\n\t\t\t{\n\t\t\t\tencoding.active = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tencoding.active = false;\n\t\t\t}\n\t\t});\n\n\t\tawait transceiver.sender.setParameters(parameters);\n\n\t\tthis._remoteSdp!.muxMediaSectionSimulcast(localId, parameters.encodings);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync setRtpEncodingParameters(localId: string, params: any): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() [localId:%s, params:%o]',\n\t\t\tlocalId, params);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tparameters.encodings[idx] = { ...encoding, ...params };\n\t\t});\n\n\t\tawait transceiver.sender.setParameters(parameters);\n\n\t\tthis._remoteSdp!.muxMediaSectionSimulcast(localId, parameters.encodings);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync getSenderStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\treturn transceiver.sender.getStats();\n\t}\n\n\tasync sendDataChannel(\n\t\t{\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tlabel,\n\t\t\tprotocol\n\t\t}: HandlerSendDataChannelOptions\n\t): Promise<HandlerSendDataChannelResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : this._nextSendSctpStreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('sendDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// Increase next id.\n\t\tthis._nextSendSctpStreamId =\n\t\t\t++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS;\n\n\t\t// If this is the first DataChannel we need to create the SDP answer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer();\n\t\t\tconst localSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst offerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => m.type === 'application');\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tthis._remoteSdp!.sendSctpAssociation({ offerMediaObject });\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\tconst sctpStreamParameters: SctpStreamParameters =\n\t\t{\n\t\t\tstreamId : options.id,\n\t\t\tordered : options.ordered,\n\t\t\tmaxPacketLifeTime : options.maxPacketLifeTime,\n\t\t\tmaxRetransmits : options.maxRetransmits\n\t\t};\n\n\t\treturn { dataChannel, sctpStreamParameters };\n\t}\n\n\tasync receive(\n\t\toptionsList: HandlerReceiveOptions[]\n\t) : Promise<HandlerReceiveResult[]>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst results: HandlerReceiveResult[] = [];\n\t\tconst mapLocalId: Map<string, string> = new Map();\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, kind, rtpParameters, streamId } = options;\n\n\t\t\tlogger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);\n\n\t\t\tconst localId = rtpParameters.mid || String(this._mapMidTransceiver.size);\n\n\t\t\tmapLocalId.set(trackId, localId);\n\n\t\t\tthis._remoteSdp!.receive(\n\t\t\t\t{\n\t\t\t\t\tmid : localId,\n\t\t\t\t\tkind,\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tstreamId : streamId || rtpParameters.rtcp!.cname!,\n\t\t\t\t\ttrackId\n\t\t\t\t});\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tlet answer = await this._pc.createAnswer();\n\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, rtpParameters } = options;\n\t\t\tconst localId = mapLocalId.get(trackId);\n\t\t\tconst answerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => String(m.mid) === localId);\n\n\t\t\t// May need to modify codec parameters in the answer based on codec\n\t\t\t// parameters in the offer.\n\t\t\tsdpCommonUtils.applyCodecParameters(\n\t\t\t\t{\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tanswerMediaObject\n\t\t\t\t});\n\t\t}\n\n\t\tanswer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId } = options;\n\t\t\tconst localId = mapLocalId.get(trackId)!;\n\t\t\tconst transceiver = this._pc.getTransceivers()\n\t\t\t\t.find((t: RTCRtpTransceiver) => t.mid === localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('new RTCRtpTransceiver not found');\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Store in the map.\n\t\t\t\tthis._mapMidTransceiver.set(localId, transceiver);\n\n\t\t\t\tresults.push({\n\t\t\t\t\tlocalId,\n\t\t\t\t\ttrack : transceiver.receiver.track,\n\t\t\t\t\trtpReceiver : transceiver.receiver\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stopReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('stopReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\tthis._remoteSdp!.closeMediaSection(transceiver.mid!);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tthis._mapMidTransceiver.delete(localId);\n\t\t}\n\t}\n\n\tasync pauseReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('pauseReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\ttransceiver.direction = 'inactive';\n\t\t\tthis._remoteSdp!.pauseMediaSection(localId);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'pauseReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync resumeReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('resumeReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\ttransceiver.direction = 'recvonly';\n\t\t\tthis._remoteSdp!.resumeReceivingMediaSection(localId);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'resumeReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync getReceiverStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\treturn transceiver.receiver.getStats();\n\t}\n\n\tasync receiveDataChannel(\n\t\t{ sctpStreamParameters, label, protocol }: HandlerReceiveDataChannelOptions\n\t): Promise<HandlerReceiveDataChannelResult>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst {\n\t\t\tstreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits\n\t\t}: SctpStreamParameters = sctpStreamParameters;\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : streamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('receiveDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// If this is the first DataChannel we need to create the SDP offer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tthis._remoteSdp!.receiveSctpAssociation();\n\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\treturn { dataChannel };\n\t}\n\n\tprivate async setupTransport(\n\t\t{\n\t\t\tlocalDtlsRole,\n\t\t\tlocalSdpObject\n\t\t}:\n\t\t{\n\t\t\tlocalDtlsRole: DtlsRole;\n\t\t\tlocalSdpObject?: any;\n\t\t}\n\t): Promise<void>\n\t{\n\t\tif (!localSdpObject)\n\t\t{\n\t\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\t}\n\n\t\t// Get our local DTLS parameters.\n\t\tconst dtlsParameters =\n\t\t\tsdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject });\n\n\t\t// Set our DTLS role.\n\t\tdtlsParameters.role = localDtlsRole;\n\n\t\t// Update the remote DTLS role in the SDP.\n\t\tthis._remoteSdp!.updateDtlsRole(\n\t\t\tlocalDtlsRole === 'client' ? 'server' : 'client');\n\n\t\t// Need to tell the remote transport about our parameters.\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@connect',\n\t\t\t\t{ dtlsParameters },\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\n\t\tthis._transportReady = true;\n\t}\n\n\tprivate assertSendDirection(): void\n\t{\n\t\tif (this._direction !== 'send')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"send\" direction');\n\t\t}\n\t}\n\n\tprivate assertRecvDirection(): void\n\t{\n\t\tif (this._direction !== 'recv')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"recv\" direction');\n\t\t}\n\t}\n}\n","import * as sdpTransform from 'sdp-transform';\nimport { Logger } from '../Logger';\nimport * as utils from '../utils';\nimport * as ortc from '../ortc';\nimport * as sdpCommonUtils from './sdp/commonUtils';\nimport * as sdpUnifiedPlanUtils from './sdp/unifiedPlanUtils';\nimport * as ortcUtils from './ortc/utils';\nimport {\n\tHandlerFactory,\n\tHandlerInterface,\n\tHandlerRunOptions,\n\tHandlerSendOptions,\n\tHandlerSendResult,\n\tHandlerReceiveOptions,\n\tHandlerReceiveResult,\n\tHandlerSendDataChannelOptions,\n\tHandlerSendDataChannelResult,\n\tHandlerReceiveDataChannelOptions,\n\tHandlerReceiveDataChannelResult\n} from './HandlerInterface';\nimport { RemoteSdp } from './sdp/RemoteSdp';\nimport { parse as parseScalabilityMode } from '../scalabilityModes';\nimport { IceParameters, DtlsRole } from '../Transport';\nimport {\n\tRtpCapabilities,\n\tRtpParameters,\n\tRtpEncodingParameters\n} from '../RtpParameters';\nimport { SctpCapabilities, SctpStreamParameters } from '../SctpParameters';\n\nconst logger = new Logger('Chrome74');\n\nconst SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };\n\nexport class Chrome74 extends HandlerInterface\n{\n\t// Handler direction.\n\tprivate _direction?: 'send' | 'recv';\n\t// Remote SDP handler.\n\tprivate _remoteSdp?: RemoteSdp;\n\t// Generic sending RTP parameters for audio and video.\n\tprivate _sendingRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Generic sending RTP parameters for audio and video suitable for the SDP\n\t// remote answer.\n\tprivate _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Initial server side DTLS role. If not 'auto', it will force the opposite\n\t// value in client side.\n\tprivate _forcedLocalDtlsRole?: DtlsRole;\n\t// RTCPeerConnection instance.\n\tprivate _pc: any;\n\t// Map of RTCTransceivers indexed by MID.\n\tprivate readonly _mapMidTransceiver: Map<string, RTCRtpTransceiver> =\n\t\tnew Map();\n\t// Local stream for sending.\n\tprivate readonly _sendStream = new MediaStream();\n\t// Whether a DataChannel m=application section has been created.\n\tprivate _hasDataChannelMediaSection = false;\n\t// Sending DataChannel id value counter. Incremented for each new DataChannel.\n\tprivate _nextSendSctpStreamId = 0;\n\t// Got transport local and remote parameters.\n\tprivate _transportReady = false;\n\n\t/**\n\t * Creates a factory function.\n\t */\n\tstatic createFactory(): HandlerFactory\n\t{\n\t\treturn (): Chrome74 => new Chrome74();\n\t}\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tget name(): string\n\t{\n\t\treturn 'Chrome74';\n\t}\n\n\tclose(): void\n\t{\n\t\tlogger.debug('close()');\n\n\t\t// Close RTCPeerConnection.\n\t\tif (this._pc)\n\t\t{\n\t\t\ttry { this._pc.close(); }\n\t\t\tcatch (error) {}\n\t\t}\n\n\t\tthis.emit('@close');\n\t}\n\n\tasync getNativeRtpCapabilities(): Promise<RtpCapabilities>\n\t{\n\t\tlogger.debug('getNativeRtpCapabilities()');\n\n\t\tconst pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : [],\n\t\t\t\ticeTransportPolicy : 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'unified-plan'\n\t\t\t});\n\n\t\ttry\n\t\t{\n\t\t\tpc.addTransceiver('audio');\n\t\t\tpc.addTransceiver('video');\n\n\t\t\tconst offer = await pc.createOffer();\n\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error) {}\n\n\t\t\tconst sdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst nativeRtpCapabilities =\n\t\t\t\tsdpCommonUtils.extractRtpCapabilities({ sdpObject });\n\n\t\t\t// libwebrtc supports NACK for OPUS but doesn't announce it.\n\t\t\tortcUtils.addNackSuppportForOpus(nativeRtpCapabilities);\n\n\t\t\treturn nativeRtpCapabilities;\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error2) {}\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync getNativeSctpCapabilities(): Promise<SctpCapabilities>\n\t{\n\t\tlogger.debug('getNativeSctpCapabilities()');\n\n\t\treturn {\n\t\t\tnumStreams : SCTP_NUM_STREAMS\n\t\t};\n\t}\n\n\trun(\n\t\t{\n\t\t\tdirection,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\textendedRtpCapabilities\n\t\t}: HandlerRunOptions\n\t): void\n\t{\n\t\tlogger.debug('run()');\n\n\t\tthis._direction = direction;\n\n\t\tthis._remoteSdp = new RemoteSdp(\n\t\t\t{\n\t\t\t\ticeParameters,\n\t\t\t\ticeCandidates,\n\t\t\t\tdtlsParameters,\n\t\t\t\tsctpParameters\n\t\t\t});\n\n\t\tthis._sendingRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tthis._sendingRemoteRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tif (dtlsParameters.role && dtlsParameters.role !== 'auto')\n\t\t{\n\t\t\tthis._forcedLocalDtlsRole = dtlsParameters.role === 'server'\n\t\t\t\t? 'client'\n\t\t\t\t: 'server';\n\t\t}\n\n\t\tthis._pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : iceServers || [],\n\t\t\t\ticeTransportPolicy : iceTransportPolicy || 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'unified-plan',\n\t\t\t\t...additionalSettings\n\t\t\t},\n\t\t\tproprietaryConstraints);\n\n\t\tif (this._pc.connectionState)\n\t\t{\n\t\t\tthis._pc.addEventListener('connectionstatechange', () =>\n\t\t\t{\n\t\t\t\tthis.emit('@connectionstatechange', this._pc.connectionState);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.warn(\n\t\t\t\t'run() | pc.connectionState not supported, using pc.iceConnectionState');\n\n\t\t\tthis._pc.addEventListener('iceconnectionstatechange', () =>\n\t\t\t{\n\t\t\t\tswitch (this._pc.iceConnectionState)\n\t\t\t\t{\n\t\t\t\t\tcase 'checking':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connecting');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'connected':\n\t\t\t\t\tcase 'completed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'failed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'failed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'disconnected':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'disconnected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'closed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync updateIceServers(iceServers: RTCIceServer[]): Promise<void>\n\t{\n\t\tlogger.debug('updateIceServers()');\n\n\t\tconst configuration = this._pc.getConfiguration();\n\n\t\tconfiguration.iceServers = iceServers;\n\n\t\tthis._pc.setConfiguration(configuration);\n\t}\n\n\tasync restartIce(iceParameters: IceParameters): Promise<void>\n\t{\n\t\tlogger.debug('restartIce()');\n\n\t\t// Provide the remote SDP handler with new remote ICE parameters.\n\t\tthis._remoteSdp!.updateIceParameters(iceParameters);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._direction === 'send')\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer({ iceRestart: true });\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\t\t}\n\t}\n\n\tasync getTransportStats(): Promise<RTCStatsReport>\n\t{\n\t\treturn this._pc.getStats();\n\t}\n\n\tasync send(\n\t\t{ track, encodings, codecOptions, codec }: HandlerSendOptions\n\t): Promise<HandlerSendResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);\n\n\t\tif (encodings && encodings.length > 1)\n\t\t{\n\t\t\tencodings.forEach((encoding: RtpEncodingParameters, idx: number) =>\n\t\t\t{\n\t\t\t\tencoding.rid = `r${idx}`;\n\t\t\t});\n\t\t}\n\n\t\tconst sendingRtpParameters =\n\t\t\tutils.clone(this._sendingRtpParametersByKind![track.kind], {});\n\n\t\t// This may throw.\n\t\tsendingRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRtpParameters.codecs, codec);\n\n\t\tconst sendingRemoteRtpParameters =\n\t\t\tutils.clone(this._sendingRemoteRtpParametersByKind![track.kind], {});\n\n\t\t// This may throw.\n\t\tsendingRemoteRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec);\n\n\t\tconst mediaSectionIdx = this._remoteSdp!.getNextMediaSectionIdx();\n\t\tconst transceiver = this._pc.addTransceiver(\n\t\t\ttrack,\n\t\t\t{\n\t\t\t\tdirection : 'sendonly',\n\t\t\t\tstreams : [ this._sendStream ],\n\t\t\t\tsendEncodings : encodings\n\t\t\t});\n\t\tlet offer = await this._pc.createOffer();\n\t\tlet localSdpObject = sdpTransform.parse(offer.sdp);\n\t\tlet offerMediaObject;\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\t// Special case for VP9 with SVC.\n\t\tlet hackVp9Svc = false;\n\n\t\tconst layers =\n\t\t\tparseScalabilityMode((encodings || [ {} ])[0].scalabilityMode);\n\n\t\tif (\n\t\t\tencodings &&\n\t\t\tencodings.length === 1 &&\n\t\t\tlayers.spatialLayers > 1 &&\n\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp9'\n\t\t)\n\t\t{\n\t\t\tlogger.debug('send() | enabling legacy simulcast for VP9 SVC');\n\n\t\t\thackVp9Svc = true;\n\t\t\tlocalSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tofferMediaObject = localSdpObject.media[mediaSectionIdx.idx];\n\n\t\t\tsdpUnifiedPlanUtils.addLegacySimulcast(\n\t\t\t\t{\n\t\t\t\t\tofferMediaObject,\n\t\t\t\t\tnumStreams : layers.spatialLayers\n\t\t\t\t});\n\n\t\t\toffer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) };\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t// We can now get the transceiver.mid.\n\t\tconst localId = transceiver.mid;\n\n\t\t// Set MID.\n\t\tsendingRtpParameters.mid = localId;\n\n\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\tofferMediaObject = localSdpObject.media[mediaSectionIdx.idx];\n\n\t\t// Set RTCP CNAME.\n\t\tsendingRtpParameters.rtcp.cname =\n\t\t\tsdpCommonUtils.getCname({ offerMediaObject });\n\n\t\t// Set RTP encodings by parsing the SDP offer if no encodings are given.\n\t\tif (!encodings)\n\t\t{\n\t\t\tsendingRtpParameters.encodings =\n\t\t\t\tsdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject });\n\t\t}\n\t\t// Set RTP encodings by parsing the SDP offer and complete them with given\n\t\t// one if just a single encoding has been given.\n\t\telse if (encodings.length === 1)\n\t\t{\n\t\t\tlet newEncodings =\n\t\t\t\tsdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject });\n\n\t\t\tObject.assign(newEncodings[0], encodings[0]);\n\n\t\t\t// Hack for VP9 SVC.\n\t\t\tif (hackVp9Svc)\n\t\t\t{\n\t\t\t\tnewEncodings = [ newEncodings[0] ];\n\t\t\t}\n\n\t\t\tsendingRtpParameters.encodings = newEncodings;\n\t\t}\n\t\t// Otherwise if more than 1 encoding are given use them verbatim.\n\t\telse\n\t\t{\n\t\t\tsendingRtpParameters.encodings = encodings;\n\t\t}\n\n\t\t// If VP8 or H264 and there is effective simulcast, add scalabilityMode to\n\t\t// each encoding.\n\t\tif (\n\t\t\tsendingRtpParameters.encodings.length > 1 &&\n\t\t\t(\n\t\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' ||\n\t\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/h264'\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\tfor (const encoding of sendingRtpParameters.encodings)\n\t\t\t{\n\t\t\t\tif (encoding.scalabilityMode)\n\t\t\t\t{\n\t\t\t\t\tencoding.scalabilityMode = `L1T${layers.temporalLayers}`;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tencoding.scalabilityMode = 'L1T3';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._remoteSdp!.send(\n\t\t\t{\n\t\t\t\tofferMediaObject,\n\t\t\t\treuseMid : mediaSectionIdx.reuseMid,\n\t\t\t\tofferRtpParameters : sendingRtpParameters,\n\t\t\t\tanswerRtpParameters : sendingRemoteRtpParameters,\n\t\t\t\tcodecOptions,\n\t\t\t\textmapAllowMixed : true\n\t\t\t});\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t// Store in the map.\n\t\tthis._mapMidTransceiver.set(localId, transceiver);\n\n\t\treturn {\n\t\t\tlocalId,\n\t\t\trtpParameters : sendingRtpParameters,\n\t\t\trtpSender : transceiver.sender\n\t\t};\n\t}\n\n\tasync stopSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('stopSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.sender.replaceTrack(null);\n\n\t\tthis._pc.removeTrack(transceiver.sender);\n\n\t\tconst mediaSectionClosed =\n\t\t\tthis._remoteSdp!.closeMediaSection(transceiver.mid!);\n\n\t\tif (mediaSectionClosed)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\ttransceiver.stop();\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{}\n\t\t}\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\tthis._mapMidTransceiver.delete(localId);\n\t}\n\n\tasync pauseSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('pauseSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.direction = 'inactive';\n\t\tthis._remoteSdp!.pauseMediaSection(localId);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'pauseSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'pauseSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync resumeSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('resumeSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tthis._remoteSdp!.resumeSendingMediaSection(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.direction = 'sendonly';\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'resumeSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'resumeSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync replaceTrack(\n\t\tlocalId: string, track: MediaStreamTrack | null\n\t): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tif (track)\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'replaceTrack() [localId:%s, track.id:%s]', localId, track.id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.debug('replaceTrack() [localId:%s, no track]', localId);\n\t\t}\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tawait transceiver.sender.replaceTrack(track);\n\t}\n\n\tasync setMaxSpatialLayer(localId: string, spatialLayer: number): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() [localId:%s, spatialLayer:%s]',\n\t\t\tlocalId, spatialLayer);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tif (idx <= spatialLayer)\n\t\t\t{\n\t\t\t\tencoding.active = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tencoding.active = false;\n\t\t\t}\n\t\t});\n\n\t\tawait transceiver.sender.setParameters(parameters);\n\n\t\tthis._remoteSdp!.muxMediaSectionSimulcast(localId, parameters.encodings);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync setRtpEncodingParameters(localId: string, params: any): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() [localId:%s, params:%o]',\n\t\t\tlocalId, params);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tparameters.encodings[idx] = { ...encoding, ...params };\n\t\t});\n\n\t\tawait transceiver.sender.setParameters(parameters);\n\n\t\tthis._remoteSdp!.muxMediaSectionSimulcast(localId, parameters.encodings);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync getSenderStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\treturn transceiver.sender.getStats();\n\t}\n\n\tasync sendDataChannel(\n\t\t{\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tlabel,\n\t\t\tprotocol\n\t\t}: HandlerSendDataChannelOptions\n\t): Promise<HandlerSendDataChannelResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : this._nextSendSctpStreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('sendDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// Increase next id.\n\t\tthis._nextSendSctpStreamId =\n\t\t\t++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS;\n\n\t\t// If this is the first DataChannel we need to create the SDP answer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer();\n\t\t\tconst localSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst offerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => m.type === 'application');\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tthis._remoteSdp!.sendSctpAssociation({ offerMediaObject });\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\tconst sctpStreamParameters: SctpStreamParameters =\n\t\t{\n\t\t\tstreamId : options.id,\n\t\t\tordered : options.ordered,\n\t\t\tmaxPacketLifeTime : options.maxPacketLifeTime,\n\t\t\tmaxRetransmits : options.maxRetransmits\n\t\t};\n\n\t\treturn { dataChannel, sctpStreamParameters };\n\t}\n\n\tasync receive(\n\t\toptionsList: HandlerReceiveOptions[]\n\t) : Promise<HandlerReceiveResult[]>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst results: HandlerReceiveResult[] = [];\n\t\tconst mapLocalId: Map<string, string> = new Map();\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, kind, rtpParameters, streamId } = options;\n\n\t\t\tlogger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);\n\n\t\t\tconst localId = rtpParameters.mid || String(this._mapMidTransceiver.size);\n\n\t\t\tmapLocalId.set(trackId, localId);\n\n\t\t\tthis._remoteSdp!.receive(\n\t\t\t\t{\n\t\t\t\t\tmid : localId,\n\t\t\t\t\tkind,\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tstreamId : streamId || rtpParameters.rtcp!.cname!,\n\t\t\t\t\ttrackId\n\t\t\t\t});\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tlet answer = await this._pc.createAnswer();\n\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, rtpParameters } = options;\n\t\t\tconst localId = mapLocalId.get(trackId);\n\t\t\tconst answerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => String(m.mid) === localId);\n\n\t\t\t// May need to modify codec parameters in the answer based on codec\n\t\t\t// parameters in the offer.\n\t\t\tsdpCommonUtils.applyCodecParameters(\n\t\t\t\t{\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tanswerMediaObject\n\t\t\t\t});\n\t\t}\n\n\t\tanswer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId } = options;\n\t\t\tconst localId = mapLocalId.get(trackId)!;\n\t\t\tconst transceiver = this._pc.getTransceivers()\n\t\t\t\t.find((t: RTCRtpTransceiver) => t.mid === localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('new RTCRtpTransceiver not found');\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Store in the map.\n\t\t\t\tthis._mapMidTransceiver.set(localId, transceiver);\n\n\t\t\t\tresults.push({\n\t\t\t\t\tlocalId,\n\t\t\t\t\ttrack : transceiver.receiver.track,\n\t\t\t\t\trtpReceiver : transceiver.receiver\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stopReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('stopReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\tthis._remoteSdp!.closeMediaSection(transceiver.mid!);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tthis._mapMidTransceiver.delete(localId);\n\t\t}\n\t}\n\n\tasync pauseReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('pauseReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\ttransceiver.direction = 'inactive';\n\t\t\tthis._remoteSdp!.pauseMediaSection(localId);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'pauseReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync resumeReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('resumeReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\ttransceiver.direction = 'recvonly';\n\t\t\tthis._remoteSdp!.resumeReceivingMediaSection(localId);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'resumeReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync getReceiverStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\treturn transceiver.receiver.getStats();\n\t}\n\n\tasync receiveDataChannel(\n\t\t{ sctpStreamParameters, label, protocol }: HandlerReceiveDataChannelOptions\n\t): Promise<HandlerReceiveDataChannelResult>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst {\n\t\t\tstreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits\n\t\t}: SctpStreamParameters = sctpStreamParameters;\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : streamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('receiveDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// If this is the first DataChannel we need to create the SDP offer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tthis._remoteSdp!.receiveSctpAssociation();\n\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\treturn { dataChannel };\n\t}\n\n\tprivate async setupTransport(\n\t\t{\n\t\t\tlocalDtlsRole,\n\t\t\tlocalSdpObject\n\t\t}:\n\t\t{\n\t\t\tlocalDtlsRole: DtlsRole;\n\t\t\tlocalSdpObject?: any;\n\t\t}\n\t): Promise<void>\n\t{\n\t\tif (!localSdpObject)\n\t\t{\n\t\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\t}\n\n\t\t// Get our local DTLS parameters.\n\t\tconst dtlsParameters =\n\t\t\tsdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject });\n\n\t\t// Set our DTLS role.\n\t\tdtlsParameters.role = localDtlsRole;\n\n\t\t// Update the remote DTLS role in the SDP.\n\t\tthis._remoteSdp!.updateDtlsRole(\n\t\t\tlocalDtlsRole === 'client' ? 'server' : 'client');\n\n\t\t// Need to tell the remote transport about our parameters.\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@connect',\n\t\t\t\t{ dtlsParameters },\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\n\t\tthis._transportReady = true;\n\t}\n\n\tprivate assertSendDirection(): void\n\t{\n\t\tif (this._direction !== 'send')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"send\" direction');\n\t\t}\n\t}\n\n\tprivate assertRecvDirection(): void\n\t{\n\t\tif (this._direction !== 'recv')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"recv\" direction');\n\t\t}\n\t}\n}\n","import * as sdpTransform from 'sdp-transform';\nimport { Logger } from '../Logger';\nimport * as utils from '../utils';\nimport * as ortc from '../ortc';\nimport * as sdpCommonUtils from './sdp/commonUtils';\nimport * as sdpUnifiedPlanUtils from './sdp/unifiedPlanUtils';\nimport {\n\tHandlerFactory,\n\tHandlerInterface,\n\tHandlerRunOptions,\n\tHandlerSendOptions,\n\tHandlerSendResult,\n\tHandlerReceiveOptions,\n\tHandlerReceiveResult,\n\tHandlerSendDataChannelOptions,\n\tHandlerSendDataChannelResult,\n\tHandlerReceiveDataChannelOptions,\n\tHandlerReceiveDataChannelResult\n} from './HandlerInterface';\nimport { RemoteSdp } from './sdp/RemoteSdp';\nimport { parse as parseScalabilityMode } from '../scalabilityModes';\nimport { IceParameters, DtlsRole } from '../Transport';\nimport { RtpCapabilities, RtpParameters } from '../RtpParameters';\nimport { SctpCapabilities, SctpStreamParameters } from '../SctpParameters';\n\nconst logger = new Logger('Chrome70');\n\nconst SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };\n\nexport class Chrome70 extends HandlerInterface\n{\n\t// Handler direction.\n\tprivate _direction?: 'send' | 'recv';\n\t// Remote SDP handler.\n\tprivate _remoteSdp?: RemoteSdp;\n\t// Generic sending RTP parameters for audio and video.\n\tprivate _sendingRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Generic sending RTP parameters for audio and video suitable for the SDP\n\t// remote answer.\n\tprivate _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Initial server side DTLS role. If not 'auto', it will force the opposite\n\t// value in client side.\n\tprivate _forcedLocalDtlsRole?: DtlsRole;\n\t// RTCPeerConnection instance.\n\tprivate _pc: any;\n\t// Map of RTCTransceivers indexed by MID.\n\tprivate readonly _mapMidTransceiver: Map<string, RTCRtpTransceiver> =\n\t\tnew Map();\n\t// Local stream for sending.\n\tprivate readonly _sendStream = new MediaStream();\n\t// Whether a DataChannel m=application section has been created.\n\tprivate _hasDataChannelMediaSection = false;\n\t// Sending DataChannel id value counter. Incremented for each new DataChannel.\n\tprivate _nextSendSctpStreamId = 0;\n\t// Got transport local and remote parameters.\n\tprivate _transportReady = false;\n\n\t/**\n\t * Creates a factory function.\n\t */\n\tstatic createFactory(): HandlerFactory\n\t{\n\t\treturn (): Chrome70 => new Chrome70();\n\t}\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tget name(): string\n\t{\n\t\treturn 'Chrome70';\n\t}\n\n\tclose(): void\n\t{\n\t\tlogger.debug('close()');\n\n\t\t// Close RTCPeerConnection.\n\t\tif (this._pc)\n\t\t{\n\t\t\ttry { this._pc.close(); }\n\t\t\tcatch (error) {}\n\t\t}\n\n\t\tthis.emit('@close');\n\t}\n\n\tasync getNativeRtpCapabilities(): Promise<RtpCapabilities>\n\t{\n\t\tlogger.debug('getNativeRtpCapabilities()');\n\n\t\tconst pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : [],\n\t\t\t\ticeTransportPolicy : 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'unified-plan'\n\t\t\t});\n\n\t\ttry\n\t\t{\n\t\t\tpc.addTransceiver('audio');\n\t\t\tpc.addTransceiver('video');\n\n\t\t\tconst offer = await pc.createOffer();\n\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error) {}\n\n\t\t\tconst sdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst nativeRtpCapabilities =\n\t\t\t\tsdpCommonUtils.extractRtpCapabilities({ sdpObject });\n\n\t\t\treturn nativeRtpCapabilities;\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error2) {}\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync getNativeSctpCapabilities(): Promise<SctpCapabilities>\n\t{\n\t\tlogger.debug('getNativeSctpCapabilities()');\n\n\t\treturn {\n\t\t\tnumStreams : SCTP_NUM_STREAMS\n\t\t};\n\t}\n\n\trun(\n\t\t{\n\t\t\tdirection,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\textendedRtpCapabilities\n\t\t}: HandlerRunOptions\n\t): void\n\t{\n\t\tlogger.debug('run()');\n\n\t\tthis._direction = direction;\n\n\t\tthis._remoteSdp = new RemoteSdp(\n\t\t\t{\n\t\t\t\ticeParameters,\n\t\t\t\ticeCandidates,\n\t\t\t\tdtlsParameters,\n\t\t\t\tsctpParameters\n\t\t\t});\n\n\t\tthis._sendingRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tthis._sendingRemoteRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tif (dtlsParameters.role && dtlsParameters.role !== 'auto')\n\t\t{\n\t\t\tthis._forcedLocalDtlsRole = dtlsParameters.role === 'server'\n\t\t\t\t? 'client'\n\t\t\t\t: 'server';\n\t\t}\n\n\t\tthis._pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : iceServers || [],\n\t\t\t\ticeTransportPolicy : iceTransportPolicy || 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'unified-plan',\n\t\t\t\t...additionalSettings\n\t\t\t},\n\t\t\tproprietaryConstraints);\n\n\t\tif (this._pc.connectionState)\n\t\t{\n\t\t\tthis._pc.addEventListener('connectionstatechange', () =>\n\t\t\t{\n\t\t\t\tthis.emit('@connectionstatechange', this._pc.connectionState);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._pc.addEventListener('iceconnectionstatechange', () =>\n\t\t\t{\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'run() | pc.connectionState not supported, using pc.iceConnectionState');\n\n\t\t\t\tswitch (this._pc.iceConnectionState)\n\t\t\t\t{\n\t\t\t\t\tcase 'checking':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connecting');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'connected':\n\t\t\t\t\tcase 'completed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'failed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'failed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'disconnected':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'disconnected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'closed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync updateIceServers(iceServers: RTCIceServer[]): Promise<void>\n\t{\n\t\tlogger.debug('updateIceServers()');\n\n\t\tconst configuration = this._pc.getConfiguration();\n\n\t\tconfiguration.iceServers = iceServers;\n\n\t\tthis._pc.setConfiguration(configuration);\n\t}\n\n\tasync restartIce(iceParameters: IceParameters): Promise<void>\n\t{\n\t\tlogger.debug('restartIce()');\n\n\t\t// Provide the remote SDP handler with new remote ICE parameters.\n\t\tthis._remoteSdp!.updateIceParameters(iceParameters);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._direction === 'send')\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer({ iceRestart: true });\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\t\t}\n\t}\n\n\tasync getTransportStats(): Promise<RTCStatsReport>\n\t{\n\t\treturn this._pc.getStats();\n\t}\n\n\tasync send(\n\t\t{ track, encodings, codecOptions, codec }: HandlerSendOptions\n\t): Promise<HandlerSendResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);\n\n\t\tconst sendingRtpParameters =\n\t\t\tutils.clone(this._sendingRtpParametersByKind![track.kind], {});\n\n\t\t// This may throw.\n\t\tsendingRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRtpParameters.codecs, codec);\n\n\t\tconst sendingRemoteRtpParameters =\n\t\t\tutils.clone(this._sendingRemoteRtpParametersByKind![track.kind], {});\n\n\t\t// This may throw.\n\t\tsendingRemoteRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec);\n\n\t\tconst mediaSectionIdx = this._remoteSdp!.getNextMediaSectionIdx();\n\t\tconst transceiver = this._pc.addTransceiver(\n\t\t\ttrack, { direction: 'sendonly', streams: [ this._sendStream ] });\n\t\tlet offer = await this._pc.createOffer();\n\t\tlet localSdpObject = sdpTransform.parse(offer.sdp);\n\t\tlet offerMediaObject;\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tif (encodings && encodings.length > 1)\n\t\t{\n\t\t\tlogger.debug('send() | enabling legacy simulcast');\n\n\t\t\tlocalSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tofferMediaObject = localSdpObject.media[mediaSectionIdx.idx];\n\n\t\t\tsdpUnifiedPlanUtils.addLegacySimulcast(\n\t\t\t\t{\n\t\t\t\t\tofferMediaObject,\n\t\t\t\t\tnumStreams : encodings.length\n\t\t\t\t});\n\n\t\t\toffer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) };\n\t\t}\n\n\t\t// Special case for VP9 with SVC.\n\t\tlet hackVp9Svc = false;\n\n\t\tconst layers =\n\t\t\tparseScalabilityMode((encodings || [ {} ])[0].scalabilityMode);\n\n\t\tif (\n\t\t\tencodings &&\n\t\t\tencodings.length === 1 &&\n\t\t\tlayers.spatialLayers > 1 &&\n\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp9'\n\t\t)\n\t\t{\n\t\t\tlogger.debug('send() | enabling legacy simulcast for VP9 SVC');\n\n\t\t\thackVp9Svc = true;\n\t\t\tlocalSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tofferMediaObject = localSdpObject.media[mediaSectionIdx.idx];\n\n\t\t\tsdpUnifiedPlanUtils.addLegacySimulcast(\n\t\t\t\t{\n\t\t\t\t\tofferMediaObject,\n\t\t\t\t\tnumStreams : layers.spatialLayers\n\t\t\t\t});\n\n\t\t\toffer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) };\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t// If encodings are given, apply them now.\n\t\tif (encodings)\n\t\t{\n\t\t\tlogger.debug('send() | applying given encodings');\n\n\t\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\t\tfor (let idx = 0; idx < (parameters.encodings || []).length; ++idx)\n\t\t\t{\n\t\t\t\tconst encoding = parameters.encodings[idx];\n\t\t\t\tconst desiredEncoding = encodings[idx];\n\n\t\t\t\t// Should not happen but just in case.\n\t\t\t\tif (!desiredEncoding)\n\t\t\t\t{\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tparameters.encodings[idx] = Object.assign(encoding, desiredEncoding);\n\t\t\t}\n\n\t\t\tawait transceiver.sender.setParameters(parameters);\n\t\t}\n\n\t\t// We can now get the transceiver.mid.\n\t\tconst localId = transceiver.mid;\n\n\t\t// Set MID.\n\t\tsendingRtpParameters.mid = localId;\n\n\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\tofferMediaObject = localSdpObject.media[mediaSectionIdx.idx];\n\n\t\t// Set RTCP CNAME.\n\t\tsendingRtpParameters.rtcp.cname =\n\t\t\tsdpCommonUtils.getCname({ offerMediaObject });\n\n\t\t// Set RTP encodings.\n\t\tsendingRtpParameters.encodings =\n\t\t\tsdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject });\n\n\t\t// Complete encodings with given values.\n\t\tif (encodings)\n\t\t{\n\t\t\tfor (let idx = 0; idx < sendingRtpParameters.encodings.length; ++idx)\n\t\t\t{\n\t\t\t\tif (encodings[idx])\n\t\t\t\t{\n\t\t\t\t\tObject.assign(sendingRtpParameters.encodings[idx], encodings[idx]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Hack for VP9 SVC.\n\t\tif (hackVp9Svc)\n\t\t{\n\t\t\tsendingRtpParameters.encodings = [ sendingRtpParameters.encodings[0] ];\n\t\t}\n\n\t\t// If VP8 or H264 and there is effective simulcast, add scalabilityMode to\n\t\t// each encoding.\n\t\tif (\n\t\t\tsendingRtpParameters.encodings.length > 1 &&\n\t\t\t(\n\t\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' ||\n\t\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/h264'\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\tfor (const encoding of sendingRtpParameters.encodings)\n\t\t\t{\n\t\t\t\tencoding.scalabilityMode = 'L1T3';\n\t\t\t}\n\t\t}\n\n\t\tthis._remoteSdp!.send(\n\t\t\t{\n\t\t\t\tofferMediaObject,\n\t\t\t\treuseMid : mediaSectionIdx.reuseMid,\n\t\t\t\tofferRtpParameters : sendingRtpParameters,\n\t\t\t\tanswerRtpParameters : sendingRemoteRtpParameters,\n\t\t\t\tcodecOptions\n\t\t\t});\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t// Store in the map.\n\t\tthis._mapMidTransceiver.set(localId, transceiver);\n\n\t\treturn {\n\t\t\tlocalId,\n\t\t\trtpParameters : sendingRtpParameters,\n\t\t\trtpSender : transceiver.sender\n\t\t};\n\t}\n\n\tasync stopSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('stopSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.sender.replaceTrack(null);\n\n\t\tthis._pc.removeTrack(transceiver.sender);\n\n\t\tconst mediaSectionClosed =\n\t\t\tthis._remoteSdp!.closeMediaSection(transceiver.mid!);\n\n\t\tif (mediaSectionClosed)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\ttransceiver.stop();\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{}\n\t\t}\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\tthis._mapMidTransceiver.delete(localId);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync pauseSending(localId: string): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync resumeSending(localId: string): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync replaceTrack(\n\t\tlocalId: string, track: MediaStreamTrack | null\n\t): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tif (track)\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'replaceTrack() [localId:%s, track.id:%s]', localId, track.id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.debug('replaceTrack() [localId:%s, no track]', localId);\n\t\t}\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tawait transceiver.sender.replaceTrack(track);\n\t}\n\n\tasync setMaxSpatialLayer(localId: string, spatialLayer: number): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() [localId:%s, spatialLayer:%s]',\n\t\t\tlocalId, spatialLayer);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tif (idx <= spatialLayer)\n\t\t\t{\n\t\t\t\tencoding.active = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tencoding.active = false;\n\t\t\t}\n\t\t});\n\n\t\tawait transceiver.sender.setParameters(parameters);\n\n\t\tthis._remoteSdp!.muxMediaSectionSimulcast(localId, parameters.encodings);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync setRtpEncodingParameters(localId: string, params: any): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() [localId:%s, params:%o]',\n\t\t\tlocalId, params);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tparameters.encodings[idx] = { ...encoding, ...params };\n\t\t});\n\n\t\tawait transceiver.sender.setParameters(parameters);\n\n\t\tthis._remoteSdp!.muxMediaSectionSimulcast(localId, parameters.encodings);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync getSenderStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\treturn transceiver.sender.getStats();\n\t}\n\n\tasync sendDataChannel(\n\t\t{\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tlabel,\n\t\t\tprotocol\n\t\t}: HandlerSendDataChannelOptions\n\t): Promise<HandlerSendDataChannelResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : this._nextSendSctpStreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmitTime : maxPacketLifeTime, // NOTE: Old spec.\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('sendDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// Increase next id.\n\t\tthis._nextSendSctpStreamId =\n\t\t\t++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS;\n\n\t\t// If this is the first DataChannel we need to create the SDP answer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer();\n\t\t\tconst localSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst offerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => m.type === 'application');\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tthis._remoteSdp!.sendSctpAssociation({ offerMediaObject });\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\tconst sctpStreamParameters: SctpStreamParameters =\n\t\t{\n\t\t\tstreamId : options.id,\n\t\t\tordered : options.ordered,\n\t\t\tmaxPacketLifeTime : options.maxPacketLifeTime,\n\t\t\tmaxRetransmits : options.maxRetransmits\n\t\t};\n\n\t\treturn { dataChannel, sctpStreamParameters };\n\t}\n\n\tasync receive(\n\t\toptionsList: HandlerReceiveOptions[]\n\t) : Promise<HandlerReceiveResult[]>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst results: HandlerReceiveResult[] = [];\n\t\tconst mapLocalId: Map<string, string> = new Map();\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, kind, rtpParameters, streamId } = options;\n\n\t\t\tlogger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);\n\n\t\t\tconst localId = rtpParameters.mid || String(this._mapMidTransceiver.size);\n\n\t\t\tmapLocalId.set(trackId, localId);\n\n\t\t\tthis._remoteSdp!.receive(\n\t\t\t\t{\n\t\t\t\t\tmid : localId,\n\t\t\t\t\tkind,\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tstreamId : streamId || rtpParameters.rtcp!.cname!,\n\t\t\t\t\ttrackId\n\t\t\t\t});\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tlet answer = await this._pc.createAnswer();\n\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, rtpParameters } = options;\n\t\t\tconst localId = mapLocalId.get(trackId);\n\t\t\tconst answerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => String(m.mid) === localId);\n\n\t\t\t// May need to modify codec parameters in the answer based on codec\n\t\t\t// parameters in the offer.\n\t\t\tsdpCommonUtils.applyCodecParameters(\n\t\t\t\t{\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tanswerMediaObject\n\t\t\t\t});\n\t\t}\n\n\t\tanswer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId } = options;\n\t\t\tconst localId = mapLocalId.get(trackId)!;\n\t\t\tconst transceiver = this._pc.getTransceivers()\n\t\t\t\t.find((t: RTCRtpTransceiver) => t.mid === localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('new RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\t// Store in the map.\n\t\t\tthis._mapMidTransceiver.set(localId, transceiver);\n\n\t\t\tresults.push({\n\t\t\t\tlocalId,\n\t\t\t\ttrack : transceiver.receiver.track,\n\t\t\t\trtpReceiver : transceiver.receiver\n\t\t\t});\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stopReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('stopReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\tthis._remoteSdp!.closeMediaSection(transceiver.mid!);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tthis._mapMidTransceiver.delete(localId);\n\t\t}\n\t}\n\n\tasync pauseReceiving(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalIds: string[]): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync resumeReceiving(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalIds: string[]): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync getReceiverStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\treturn transceiver.receiver.getStats();\n\t}\n\n\tasync receiveDataChannel(\n\t\t{ sctpStreamParameters, label, protocol }: HandlerReceiveDataChannelOptions\n\t): Promise<HandlerReceiveDataChannelResult>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst {\n\t\t\tstreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits\n\t\t}: SctpStreamParameters = sctpStreamParameters;\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : streamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmitTime : maxPacketLifeTime, // NOTE: Old spec.\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('receiveDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// If this is the first DataChannel we need to create the SDP offer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tthis._remoteSdp!.receiveSctpAssociation();\n\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\treturn { dataChannel };\n\t}\n\n\tprivate async setupTransport(\n\t\t{\n\t\t\tlocalDtlsRole,\n\t\t\tlocalSdpObject\n\t\t}:\n\t\t{\n\t\t\tlocalDtlsRole: DtlsRole;\n\t\t\tlocalSdpObject?: any;\n\t\t}\n\t): Promise<void>\n\t{\n\t\tif (!localSdpObject)\n\t\t{\n\t\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\t}\n\n\t\t// Get our local DTLS parameters.\n\t\tconst dtlsParameters =\n\t\t\tsdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject });\n\n\t\t// Set our DTLS role.\n\t\tdtlsParameters.role = localDtlsRole;\n\n\t\t// Update the remote DTLS role in the SDP.\n\t\tthis._remoteSdp!.updateDtlsRole(\n\t\t\tlocalDtlsRole === 'client' ? 'server' : 'client');\n\n\t\t// Need to tell the remote transport about our parameters.\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@connect',\n\t\t\t\t{ dtlsParameters },\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\n\t\tthis._transportReady = true;\n\t}\n\n\tprivate assertSendDirection(): void\n\t{\n\t\tif (this._direction !== 'send')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"send\" direction');\n\t\t}\n\t}\n\n\tprivate assertRecvDirection(): void\n\t{\n\t\tif (this._direction !== 'recv')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"recv\" direction');\n\t\t}\n\t}\n}\n","import { RtpEncodingParameters } from '../../RtpParameters';\n\nexport function getRtpEncodings(\n\t{\n\t\tofferMediaObject,\n\t\ttrack\n\t}:\n\t{\n\t\tofferMediaObject: any;\n\t\ttrack: MediaStreamTrack;\n\t}\n): RtpEncodingParameters[]\n{\n\t// First media SSRC (or the only one).\n\tlet firstSsrc;\n\tconst ssrcs = new Set();\n\n\tfor (const line of offerMediaObject.ssrcs || [])\n\t{\n\t\tif (line.attribute !== 'msid')\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst trackId = line.value.split(' ')[1];\n\n\t\tif (trackId === track.id)\n\t\t{\n\t\t\tconst ssrc = line.id;\n\n\t\t\tssrcs.add(ssrc);\n\n\t\t\tif (!firstSsrc)\n\t\t\t{\n\t\t\t\tfirstSsrc = ssrc;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (ssrcs.size === 0)\n\t{\n\t\tthrow new Error(`a=ssrc line with msid information not found [track.id:${track.id}]`);\n\t}\n\n\tconst ssrcToRtxSsrc = new Map();\n\n\t// First assume RTX is used.\n\tfor (const line of offerMediaObject.ssrcGroups || [])\n\t{\n\t\tif (line.semantics !== 'FID')\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet [ ssrc, rtxSsrc ] = line.ssrcs.split(/\\s+/);\n\n\t\tssrc = Number(ssrc);\n\t\trtxSsrc = Number(rtxSsrc);\n\n\t\tif (ssrcs.has(ssrc))\n\t\t{\n\t\t\t// Remove both the SSRC and RTX SSRC from the set so later we know that they\n\t\t\t// are already handled.\n\t\t\tssrcs.delete(ssrc);\n\t\t\tssrcs.delete(rtxSsrc);\n\n\t\t\t// Add to the map.\n\t\t\tssrcToRtxSsrc.set(ssrc, rtxSsrc);\n\t\t}\n\t}\n\n\t// If the set of SSRCs is not empty it means that RTX is not being used, so take\n\t// media SSRCs from there.\n\tfor (const ssrc of ssrcs)\n\t{\n\t\t// Add to the map.\n\t\tssrcToRtxSsrc.set(ssrc, null);\n\t}\n\n\tconst encodings: RtpEncodingParameters[] = [];\n\n\tfor (const [ ssrc, rtxSsrc ] of ssrcToRtxSsrc)\n\t{\n\t\tconst encoding: any = { ssrc };\n\n\t\tif (rtxSsrc)\n\t\t{\n\t\t\tencoding.rtx = { ssrc: rtxSsrc };\n\t\t}\n\n\t\tencodings.push(encoding);\n\t}\n\n\treturn encodings;\n}\n\n/**\n * Adds multi-ssrc based simulcast into the given SDP media section offer.\n */\nexport function addLegacySimulcast(\n\t{\n\t\tofferMediaObject,\n\t\ttrack,\n\t\tnumStreams\n\t}:\n\t{\n\t\tofferMediaObject: any;\n\t\ttrack: MediaStreamTrack;\n\t\tnumStreams: number;\n\t}\n): void\n{\n\tif (numStreams <= 1)\n\t{\n\t\tthrow new TypeError('numStreams must be greater than 1');\n\t}\n\n\tlet firstSsrc: any;\n\tlet firstRtxSsrc: any;\n\tlet streamId: any;\n\n\t// Get the SSRC.\n\tconst ssrcMsidLine = (offerMediaObject.ssrcs || [])\n\t\t.find((line: any) =>\n\t\t{\n\t\t\tif (line.attribute !== 'msid')\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst trackId = line.value.split(' ')[1];\n\n\t\t\tif (trackId === track.id)\n\t\t\t{\n\t\t\t\tfirstSsrc = line.id;\n\t\t\t\tstreamId = line.value.split(' ')[0];\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\tif (!ssrcMsidLine)\n\t{\n\t\tthrow new Error(`a=ssrc line with msid information not found [track.id:${track.id}]`);\n\t}\n\n\t// Get the SSRC for RTX.\n\t(offerMediaObject.ssrcGroups || [])\n\t\t.some((line: any) =>\n\t\t{\n\t\t\tif (line.semantics !== 'FID')\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst ssrcs = line.ssrcs.split(/\\s+/);\n\n\t\t\tif (Number(ssrcs[0]) === firstSsrc)\n\t\t\t{\n\t\t\t\tfirstRtxSsrc = Number(ssrcs[1]);\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\n\tconst ssrcCnameLine = offerMediaObject.ssrcs\n\t\t.find((line: any) => (line.attribute === 'cname' && line.id === firstSsrc));\n\n\tif (!ssrcCnameLine)\n\t{\n\t\tthrow new Error(`a=ssrc line with cname information not found [track.id:${track.id}]`);\n\t}\n\n\tconst cname = ssrcCnameLine.value;\n\tconst ssrcs = [];\n\tconst rtxSsrcs = [];\n\n\tfor (let i = 0; i < numStreams; ++i)\n\t{\n\t\tssrcs.push(firstSsrc + i);\n\n\t\tif (firstRtxSsrc)\n\t\t{\n\t\t\trtxSsrcs.push(firstRtxSsrc + i);\n\t\t}\n\t}\n\n\tofferMediaObject.ssrcGroups = offerMediaObject.ssrcGroups || [];\n\tofferMediaObject.ssrcs = offerMediaObject.ssrcs || [];\n\n\tofferMediaObject.ssrcGroups.push(\n\t\t{\n\t\t\tsemantics : 'SIM',\n\t\t\tssrcs : ssrcs.join(' ')\n\t\t});\n\n\tfor (let i = 0; i < ssrcs.length; ++i)\n\t{\n\t\tconst ssrc = ssrcs[i];\n\n\t\tofferMediaObject.ssrcs.push(\n\t\t\t{\n\t\t\t\tid : ssrc,\n\t\t\t\tattribute : 'cname',\n\t\t\t\tvalue : cname\n\t\t\t});\n\n\t\tofferMediaObject.ssrcs.push(\n\t\t\t{\n\t\t\t\tid : ssrc,\n\t\t\t\tattribute : 'msid',\n\t\t\t\tvalue : `${streamId} ${track.id}`\n\t\t\t});\n\t}\n\n\tfor (let i = 0; i < rtxSsrcs.length; ++i)\n\t{\n\t\tconst ssrc = ssrcs[i];\n\t\tconst rtxSsrc = rtxSsrcs[i];\n\n\t\tofferMediaObject.ssrcs.push(\n\t\t\t{\n\t\t\t\tid : rtxSsrc,\n\t\t\t\tattribute : 'cname',\n\t\t\t\tvalue : cname\n\t\t\t});\n\n\t\tofferMediaObject.ssrcs.push(\n\t\t\t{\n\t\t\t\tid : rtxSsrc,\n\t\t\t\tattribute : 'msid',\n\t\t\t\tvalue : `${streamId} ${track.id}`\n\t\t\t});\n\n\t\tofferMediaObject.ssrcGroups.push(\n\t\t\t{\n\t\t\t\tsemantics : 'FID',\n\t\t\t\tssrcs : `${ssrc} ${rtxSsrc}`\n\t\t\t});\n\t}\n}\n","import * as sdpTransform from 'sdp-transform';\nimport { Logger } from '../Logger';\nimport * as utils from '../utils';\nimport * as ortc from '../ortc';\nimport * as sdpCommonUtils from './sdp/commonUtils';\nimport * as sdpPlanBUtils from './sdp/planBUtils';\nimport {\n\tHandlerFactory,\n\tHandlerInterface,\n\tHandlerRunOptions,\n\tHandlerSendOptions,\n\tHandlerSendResult,\n\tHandlerReceiveOptions,\n\tHandlerReceiveResult,\n\tHandlerSendDataChannelOptions,\n\tHandlerSendDataChannelResult,\n\tHandlerReceiveDataChannelOptions,\n\tHandlerReceiveDataChannelResult\n} from './HandlerInterface';\nimport { RemoteSdp } from './sdp/RemoteSdp';\nimport { IceParameters, DtlsRole } from '../Transport';\nimport { RtpCapabilities, RtpParameters } from '../RtpParameters';\nimport { SctpCapabilities, SctpStreamParameters } from '../SctpParameters';\n\nconst logger = new Logger('Chrome67');\n\nconst SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };\n\nexport class Chrome67 extends HandlerInterface\n{\n\t// Handler direction.\n\tprivate _direction?: 'send' | 'recv';\n\t// Remote SDP handler.\n\tprivate _remoteSdp?: RemoteSdp;\n\t// Generic sending RTP parameters for audio and video.\n\tprivate _sendingRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Generic sending RTP parameters for audio and video suitable for the SDP\n\t// remote answer.\n\tprivate _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Initial server side DTLS role. If not 'auto', it will force the opposite\n\t// value in client side.\n\tprivate _forcedLocalDtlsRole?: DtlsRole;\n\t// RTCPeerConnection instance.\n\tprivate _pc: any;\n\t// Local stream for sending.\n\tprivate readonly _sendStream = new MediaStream();\n\t// Map of RTCRtpSender indexed by localId.\n\tprivate readonly _mapSendLocalIdRtpSender: Map<string, RTCRtpSender> =\n\t\tnew Map();\n\t// Next sending localId.\n\tprivate _nextSendLocalId = 0;\n\t// Map of MID, RTP parameters and RTCRtpReceiver indexed by local id.\n\t// Value is an Object with mid, rtpParameters and rtpReceiver.\n\tprivate readonly _mapRecvLocalIdInfo:\n\t\tMap<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tmid: string;\n\t\t\t\trtpParameters: RtpParameters;\n\t\t\t\trtpReceiver: RTCRtpReceiver;\n\t\t\t}\n\t\t> = new Map();\n\t// Whether a DataChannel m=application section has been created.\n\tprivate _hasDataChannelMediaSection = false;\n\t// Sending DataChannel id value counter. Incremented for each new DataChannel.\n\tprivate _nextSendSctpStreamId = 0;\n\t// Got transport local and remote parameters.\n\tprivate _transportReady = false;\n\n\t/**\n\t * Creates a factory function.\n\t */\n\tstatic createFactory(): HandlerFactory\n\t{\n\t\treturn (): Chrome67 => new Chrome67();\n\t}\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tget name(): string\n\t{\n\t\treturn 'Chrome67';\n\t}\n\n\tclose(): void\n\t{\n\t\tlogger.debug('close()');\n\n\t\t// Close RTCPeerConnection.\n\t\tif (this._pc)\n\t\t{\n\t\t\ttry { this._pc.close(); }\n\t\t\tcatch (error) {}\n\t\t}\n\n\t\tthis.emit('@close');\n\t}\n\n\tasync getNativeRtpCapabilities(): Promise<RtpCapabilities>\n\t{\n\t\tlogger.debug('getNativeRtpCapabilities()');\n\n\t\tconst pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : [],\n\t\t\t\ticeTransportPolicy : 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'plan-b'\n\t\t\t});\n\n\t\ttry\n\t\t{\n\t\t\tconst offer = await pc.createOffer(\n\t\t\t\t{\n\t\t\t\t\tofferToReceiveAudio : true,\n\t\t\t\t\tofferToReceiveVideo : true\n\t\t\t\t});\n\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error) {}\n\n\t\t\tconst sdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst nativeRtpCapabilities =\n\t\t\t\tsdpCommonUtils.extractRtpCapabilities({ sdpObject });\n\n\t\t\treturn nativeRtpCapabilities;\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error2) {}\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync getNativeSctpCapabilities(): Promise<SctpCapabilities>\n\t{\n\t\tlogger.debug('getNativeSctpCapabilities()');\n\n\t\treturn {\n\t\t\tnumStreams : SCTP_NUM_STREAMS\n\t\t};\n\t}\n\n\trun(\n\t\t{\n\t\t\tdirection,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\textendedRtpCapabilities\n\t\t}: HandlerRunOptions\n\t): void\n\t{\n\t\tlogger.debug('run()');\n\n\t\tthis._direction = direction;\n\n\t\tthis._remoteSdp = new RemoteSdp(\n\t\t\t{\n\t\t\t\ticeParameters,\n\t\t\t\ticeCandidates,\n\t\t\t\tdtlsParameters,\n\t\t\t\tsctpParameters,\n\t\t\t\tplanB : true\n\t\t\t});\n\n\t\tthis._sendingRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tthis._sendingRemoteRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tif (dtlsParameters.role && dtlsParameters.role !== 'auto')\n\t\t{\n\t\t\tthis._forcedLocalDtlsRole = dtlsParameters.role === 'server'\n\t\t\t\t? 'client'\n\t\t\t\t: 'server';\n\t\t}\n\n\t\tthis._pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : iceServers || [],\n\t\t\t\ticeTransportPolicy : iceTransportPolicy || 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'plan-b',\n\t\t\t\t...additionalSettings\n\t\t\t},\n\t\t\tproprietaryConstraints);\n\n\t\tif (this._pc.connectionState)\n\t\t{\n\t\t\tthis._pc.addEventListener('connectionstatechange', () =>\n\t\t\t{\n\t\t\t\tthis.emit('@connectionstatechange', this._pc.connectionState);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._pc.addEventListener('iceconnectionstatechange', () =>\n\t\t\t{\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'run() | pc.connectionState not supported, using pc.iceConnectionState');\n\n\t\t\t\tswitch (this._pc.iceConnectionState)\n\t\t\t\t{\n\t\t\t\t\tcase 'checking':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connecting');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'connected':\n\t\t\t\t\tcase 'completed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'failed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'failed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'disconnected':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'disconnected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'closed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync updateIceServers(iceServers: RTCIceServer[]): Promise<void>\n\t{\n\t\tlogger.debug('updateIceServers()');\n\n\t\tconst configuration = this._pc.getConfiguration();\n\n\t\tconfiguration.iceServers = iceServers;\n\n\t\tthis._pc.setConfiguration(configuration);\n\t}\n\n\tasync restartIce(iceParameters: IceParameters): Promise<void>\n\t{\n\t\tlogger.debug('restartIce()');\n\n\t\t// Provide the remote SDP handler with new remote ICE parameters.\n\t\tthis._remoteSdp!.updateIceParameters(iceParameters);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._direction === 'send')\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer({ iceRestart: true });\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\t\t}\n\t}\n\n\tasync getTransportStats(): Promise<RTCStatsReport>\n\t{\n\t\treturn this._pc.getStats();\n\t}\n\n\tasync send(\n\t\t{ track, encodings, codecOptions, codec }: HandlerSendOptions\n\t): Promise<HandlerSendResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);\n\n\t\tif (codec)\n\t\t{\n\t\t\tlogger.warn(\n\t\t\t\t'send() | codec selection is not available in %s handler',\n\t\t\t\tthis.name);\n\t\t}\n\n\t\tthis._sendStream.addTrack(track);\n\t\tthis._pc.addTrack(track, this._sendStream);\n\n\t\tlet offer = await this._pc.createOffer();\n\t\tlet localSdpObject = sdpTransform.parse(offer.sdp);\n\t\tlet offerMediaObject;\n\t\tconst sendingRtpParameters =\n\t\t\tutils.clone(this._sendingRtpParametersByKind![track.kind], {});\n\n\t\tsendingRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRtpParameters.codecs);\n\n\t\tconst sendingRemoteRtpParameters =\n\t\t\tutils.clone(this._sendingRemoteRtpParametersByKind![track.kind], {});\n\n\t\tsendingRemoteRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRemoteRtpParameters.codecs);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tif (track.kind === 'video' && encodings && encodings.length > 1)\n\t\t{\n\t\t\tlogger.debug('send() | enabling simulcast');\n\n\t\t\tlocalSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tofferMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => m.type === 'video');\n\n\t\t\tsdpPlanBUtils.addLegacySimulcast(\n\t\t\t\t{\n\t\t\t\t\tofferMediaObject,\n\t\t\t\t\ttrack,\n\t\t\t\t\tnumStreams : encodings.length\n\t\t\t\t});\n\n\t\t\toffer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) };\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\tofferMediaObject = localSdpObject.media\n\t\t\t.find((m: any) => m.type === track.kind);\n\n\t\t// Set RTCP CNAME.\n\t\tsendingRtpParameters.rtcp.cname =\n\t\t\tsdpCommonUtils.getCname({ offerMediaObject });\n\n\t\t// Set RTP encodings.\n\t\tsendingRtpParameters.encodings =\n\t\t\tsdpPlanBUtils.getRtpEncodings({ offerMediaObject, track });\n\n\t\t// Complete encodings with given values.\n\t\tif (encodings)\n\t\t{\n\t\t\tfor (let idx = 0; idx < sendingRtpParameters.encodings.length; ++idx)\n\t\t\t{\n\t\t\t\tif (encodings[idx])\n\t\t\t\t{\n\t\t\t\t\tObject.assign(sendingRtpParameters.encodings[idx], encodings[idx]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If VP8 and there is effective simulcast, add scalabilityMode to each\n\t\t// encoding.\n\t\tif (\n\t\t\tsendingRtpParameters.encodings.length > 1 &&\n\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8'\n\t\t)\n\t\t{\n\t\t\tfor (const encoding of sendingRtpParameters.encodings)\n\t\t\t{\n\t\t\t\tencoding.scalabilityMode = 'L1T3';\n\t\t\t}\n\t\t}\n\n\t\tthis._remoteSdp!.send(\n\t\t\t{\n\t\t\t\tofferMediaObject,\n\t\t\t\tofferRtpParameters : sendingRtpParameters,\n\t\t\t\tanswerRtpParameters : sendingRemoteRtpParameters,\n\t\t\t\tcodecOptions\n\t\t\t});\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\tconst localId = String(this._nextSendLocalId);\n\n\t\tthis._nextSendLocalId++;\n\n\t\tconst rtpSender = this._pc.getSenders()\n\t\t\t.find((s: RTCRtpSender) => s.track === track);\n\n\t\t// Insert into the map.\n\t\tthis._mapSendLocalIdRtpSender.set(localId, rtpSender);\n\n\t\treturn {\n\t\t\tlocalId : localId,\n\t\t\trtpParameters : sendingRtpParameters,\n\t\t\trtpSender\n\t\t};\n\t}\n\n\tasync stopSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('stopSending() [localId:%s]', localId);\n\n\t\tconst rtpSender = this._mapSendLocalIdRtpSender.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpSender not found');\n\t\t}\n\n\t\tthis._pc.removeTrack(rtpSender);\n\n\t\tif (rtpSender.track)\n\t\t{\n\t\t\tthis._sendStream.removeTrack(rtpSender.track);\n\t\t}\n\n\t\tthis._mapSendLocalIdRtpSender.delete(localId);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\ttry\n\t\t{\n\t\t\tawait this._pc.setLocalDescription(offer);\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\t// NOTE: If there are no sending tracks, setLocalDescription() will fail with\n\t\t\t// \"Failed to create channels\". If so, ignore it.\n\t\t\tif (this._sendStream.getTracks().length === 0)\n\t\t\t{\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'stopSending() | ignoring expected error due no sending tracks: %s',\n\t\t\t\t\t(error as Error).toString());\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (this._pc.signalingState === 'stable')\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync pauseSending(localId: string): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync resumeSending(localId: string): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync replaceTrack(\n\t\tlocalId: string, track: MediaStreamTrack | null\n\t): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tif (track)\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'replaceTrack() [localId:%s, track.id:%s]', localId, track.id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.debug('replaceTrack() [localId:%s, no track]', localId);\n\t\t}\n\n\t\tconst rtpSender = this._mapSendLocalIdRtpSender.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpSender not found');\n\t\t}\n\n\t\tconst oldTrack = rtpSender.track;\n\n\t\tawait rtpSender.replaceTrack(track);\n\n\t\t// Remove the old track from the local stream.\n\t\tif (oldTrack)\n\t\t{\n\t\t\tthis._sendStream.removeTrack(oldTrack);\n\t\t}\n\n\t\t// Add the new track to the local stream.\n\t\tif (track)\n\t\t{\n\t\t\tthis._sendStream.addTrack(track);\n\t\t}\n\t}\n\n\tasync setMaxSpatialLayer(localId: string, spatialLayer: number): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() [localId:%s, spatialLayer:%s]',\n\t\t\tlocalId, spatialLayer);\n\n\t\tconst rtpSender = this._mapSendLocalIdRtpSender.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpSender not found');\n\t\t}\n\n\t\tconst parameters = rtpSender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tif (idx <= spatialLayer)\n\t\t\t{\n\t\t\t\tencoding.active = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tencoding.active = false;\n\t\t\t}\n\t\t});\n\n\t\tawait rtpSender.setParameters(parameters);\n\t}\n\n\tasync setRtpEncodingParameters(localId: string, params: any): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() [localId:%s, params:%o]',\n\t\t\tlocalId, params);\n\n\t\tconst rtpSender = this._mapSendLocalIdRtpSender.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpSender not found');\n\t\t}\n\n\t\tconst parameters = rtpSender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tparameters.encodings[idx] = { ...encoding, ...params };\n\t\t});\n\n\t\tawait rtpSender.setParameters(parameters);\n\t}\n\n\tasync getSenderStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst rtpSender = this._mapSendLocalIdRtpSender.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpSender not found');\n\t\t}\n\n\t\treturn rtpSender.getStats();\n\t}\n\n\tasync sendDataChannel(\n\t\t{\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tlabel,\n\t\t\tprotocol\n\t\t}: HandlerSendDataChannelOptions\n\t): Promise<HandlerSendDataChannelResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : this._nextSendSctpStreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmitTime : maxPacketLifeTime, // NOTE: Old spec.\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('sendDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// Increase next id.\n\t\tthis._nextSendSctpStreamId =\n\t\t\t++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS;\n\n\t\t// If this is the first DataChannel we need to create the SDP answer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer();\n\t\t\tconst localSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst offerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => m.type === 'application');\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tthis._remoteSdp!.sendSctpAssociation({ offerMediaObject });\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\tconst sctpStreamParameters: SctpStreamParameters =\n\t\t{\n\t\t\tstreamId : options.id,\n\t\t\tordered : options.ordered,\n\t\t\tmaxPacketLifeTime : options.maxPacketLifeTime,\n\t\t\tmaxRetransmits : options.maxRetransmits\n\t\t};\n\n\t\treturn { dataChannel, sctpStreamParameters };\n\t}\n\n\tasync receive(\n\t\toptionsList: HandlerReceiveOptions[]\n\t) : Promise<HandlerReceiveResult[]>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst results: HandlerReceiveResult[] = [];\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, kind, rtpParameters, streamId } = options;\n\n\t\t\tlogger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);\n\n\t\t\tconst mid = kind;\n\n\t\t\tthis._remoteSdp!.receive(\n\t\t\t\t{\n\t\t\t\t\tmid,\n\t\t\t\t\tkind,\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tstreamId : streamId || rtpParameters.rtcp!.cname!,\n\t\t\t\t\ttrackId\n\t\t\t\t});\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tlet answer = await this._pc.createAnswer();\n\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { kind, rtpParameters } = options;\n\t\t\tconst mid = kind;\n\t\t\tconst answerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => String(m.mid) === mid);\n\n\t\t\t// May need to modify codec parameters in the answer based on codec\n\t\t\t// parameters in the offer.\n\t\t\tsdpCommonUtils.applyCodecParameters(\n\t\t\t\t{\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tanswerMediaObject\n\t\t\t\t});\n\t\t}\n\n\t\tanswer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { kind, trackId, rtpParameters } = options;\n\t\t\tconst localId = trackId;\n\t\t\tconst mid = kind;\n\t\t\tconst rtpReceiver = this._pc.getReceivers()\n\t\t\t\t.find((r: RTCRtpReceiver) => r.track && r.track.id === localId);\n\n\t\t\tif (!rtpReceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('new RTCRtpReceiver not');\n\t\t\t}\n\n\t\t\t// Insert into the map.\n\t\t\tthis._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters, rtpReceiver });\n\n\t\t\tresults.push({\n\t\t\t\tlocalId,\n\t\t\t\ttrack : rtpReceiver.track,\n\t\t\t\trtpReceiver\n\t\t\t});\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stopReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('stopReceiving() [localId:%s]', localId);\n\n\t\t\tconst { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) || {};\n\n\t\t\t// Remove from the map.\n\t\t\tthis._mapRecvLocalIdInfo.delete(localId);\n\n\t\t\tthis._remoteSdp!.planBStopReceiving(\n\t\t\t\t{ mid: mid!, offerRtpParameters: rtpParameters! });\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync pauseReceiving(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalIds: string[]): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync resumeReceiving(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalIds: string[]): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync getReceiverStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst { rtpReceiver } = this._mapRecvLocalIdInfo.get(localId) || {};\n\n\t\tif (!rtpReceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpReceiver not found');\n\t\t}\n\n\t\treturn rtpReceiver.getStats();\n\t}\n\n\tasync receiveDataChannel(\n\t\t{ sctpStreamParameters, label, protocol }: HandlerReceiveDataChannelOptions\n\t): Promise<HandlerReceiveDataChannelResult>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst {\n\t\t\tstreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits\n\t\t} = sctpStreamParameters;\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : streamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmitTime : maxPacketLifeTime, // NOTE: Old spec.\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('receiveDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// If this is the first DataChannel we need to create the SDP offer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tthis._remoteSdp!.receiveSctpAssociation({ oldDataChannelSpec: true });\n\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\treturn { dataChannel };\n\t}\n\n\tprivate async setupTransport(\n\t\t{\n\t\t\tlocalDtlsRole,\n\t\t\tlocalSdpObject\n\t\t}:\n\t\t{\n\t\t\tlocalDtlsRole: DtlsRole;\n\t\t\tlocalSdpObject?: any;\n\t\t}\n\t): Promise<void>\n\t{\n\t\tif (!localSdpObject)\n\t\t{\n\t\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\t}\n\n\t\t// Get our local DTLS parameters.\n\t\tconst dtlsParameters =\n\t\t\tsdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject });\n\n\t\t// Set our DTLS role.\n\t\tdtlsParameters.role = localDtlsRole;\n\n\t\t// Update the remote DTLS role in the SDP.\n\t\tthis._remoteSdp!.updateDtlsRole(\n\t\t\tlocalDtlsRole === 'client' ? 'server' : 'client');\n\n\t\t// Need to tell the remote transport about our parameters.\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@connect',\n\t\t\t\t{ dtlsParameters },\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\n\t\tthis._transportReady = true;\n\t}\n\n\tprivate assertSendDirection(): void\n\t{\n\t\tif (this._direction !== 'send')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"send\" direction');\n\t\t}\n\t}\n\n\tprivate assertRecvDirection(): void\n\t{\n\t\tif (this._direction !== 'recv')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"recv\" direction');\n\t\t}\n\t}\n}\n","import * as sdpTransform from 'sdp-transform';\nimport { Logger } from '../Logger';\nimport { UnsupportedError } from '../errors';\nimport * as utils from '../utils';\nimport * as ortc from '../ortc';\nimport * as sdpCommonUtils from './sdp/commonUtils';\nimport * as sdpPlanBUtils from './sdp/planBUtils';\nimport {\n\tHandlerFactory,\n\tHandlerInterface,\n\tHandlerRunOptions,\n\tHandlerSendOptions,\n\tHandlerSendResult,\n\tHandlerReceiveOptions,\n\tHandlerReceiveResult,\n\tHandlerSendDataChannelOptions,\n\tHandlerSendDataChannelResult,\n\tHandlerReceiveDataChannelOptions,\n\tHandlerReceiveDataChannelResult\n} from './HandlerInterface';\nimport { RemoteSdp } from './sdp/RemoteSdp';\nimport { IceParameters, DtlsRole } from '../Transport';\nimport { RtpCapabilities, RtpParameters } from '../RtpParameters';\nimport { SctpCapabilities, SctpStreamParameters } from '../SctpParameters';\n\nconst logger = new Logger('Chrome55');\n\nconst SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };\n\nexport class Chrome55 extends HandlerInterface\n{\n\t// Handler direction.\n\tprivate _direction?: 'send' | 'recv';\n\t// Remote SDP handler.\n\tprivate _remoteSdp?: RemoteSdp;\n\t// Generic sending RTP parameters for audio and video.\n\tprivate _sendingRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Generic sending RTP parameters for audio and video suitable for the SDP\n\t// remote answer.\n\tprivate _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Initial server side DTLS role. If not 'auto', it will force the opposite\n\t// value in client side.\n\tprivate _forcedLocalDtlsRole?: DtlsRole;\n\t// RTCPeerConnection instance.\n\tprivate _pc: any;\n\t// Local stream for sending.\n\tprivate readonly _sendStream = new MediaStream();\n\t// Map of sending MediaStreamTracks indexed by localId.\n\tprivate readonly _mapSendLocalIdTrack: Map<string, MediaStreamTrack> = new Map();\n\t// Next sending localId.\n\tprivate _nextSendLocalId = 0;\n\t// Map of MID, RTP parameters and RTCRtpReceiver indexed by local id.\n\t// Value is an Object with mid, rtpParameters and rtpReceiver.\n\tprivate readonly _mapRecvLocalIdInfo:\n\t\tMap<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tmid: string;\n\t\t\t\trtpParameters: RtpParameters;\n\t\t\t}\n\t\t> = new Map();\n\t// Whether a DataChannel m=application section has been created.\n\tprivate _hasDataChannelMediaSection = false;\n\t// Sending DataChannel id value counter. Incremented for each new DataChannel.\n\tprivate _nextSendSctpStreamId = 0;\n\t// Got transport local and remote parameters.\n\tprivate _transportReady = false;\n\n\t/**\n\t * Creates a factory function.\n\t */\n\tstatic createFactory(): HandlerFactory\n\t{\n\t\treturn (): Chrome55 => new Chrome55();\n\t}\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tget name(): string\n\t{\n\t\treturn 'Chrome55';\n\t}\n\n\tclose(): void\n\t{\n\t\tlogger.debug('close()');\n\n\t\t// Close RTCPeerConnection.\n\t\tif (this._pc)\n\t\t{\n\t\t\ttry { this._pc.close(); }\n\t\t\tcatch (error) {}\n\t\t}\n\n\t\tthis.emit('@close');\n\t}\n\n\tasync getNativeRtpCapabilities(): Promise<RtpCapabilities>\n\t{\n\t\tlogger.debug('getNativeRtpCapabilities()');\n\n\t\tconst pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : [],\n\t\t\t\ticeTransportPolicy : 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'plan-b'\n\t\t\t});\n\n\t\ttry\n\t\t{\n\t\t\tconst offer = await pc.createOffer(\n\t\t\t\t{\n\t\t\t\t\tofferToReceiveAudio : true,\n\t\t\t\t\tofferToReceiveVideo : true\n\t\t\t\t});\n\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error) {}\n\n\t\t\tconst sdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst nativeRtpCapabilities =\n\t\t\t\tsdpCommonUtils.extractRtpCapabilities({ sdpObject });\n\n\t\t\treturn nativeRtpCapabilities;\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error2) {}\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync getNativeSctpCapabilities(): Promise<SctpCapabilities>\n\t{\n\t\tlogger.debug('getNativeSctpCapabilities()');\n\n\t\treturn {\n\t\t\tnumStreams : SCTP_NUM_STREAMS\n\t\t};\n\t}\n\n\trun(\n\t\t{\n\t\t\tdirection,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\textendedRtpCapabilities\n\t\t}: HandlerRunOptions\n\t): void\n\t{\n\t\tlogger.debug('run()');\n\n\t\tthis._direction = direction;\n\n\t\tthis._remoteSdp = new RemoteSdp(\n\t\t\t{\n\t\t\t\ticeParameters,\n\t\t\t\ticeCandidates,\n\t\t\t\tdtlsParameters,\n\t\t\t\tsctpParameters,\n\t\t\t\tplanB : true\n\t\t\t});\n\n\t\tthis._sendingRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tthis._sendingRemoteRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tif (dtlsParameters.role && dtlsParameters.role !== 'auto')\n\t\t{\n\t\t\tthis._forcedLocalDtlsRole = dtlsParameters.role === 'server'\n\t\t\t\t? 'client'\n\t\t\t\t: 'server';\n\t\t}\n\n\t\tthis._pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : iceServers || [],\n\t\t\t\ticeTransportPolicy : iceTransportPolicy || 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'plan-b',\n\t\t\t\t...additionalSettings\n\t\t\t},\n\t\t\tproprietaryConstraints);\n\n\t\tif (this._pc.connectionState)\n\t\t{\n\t\t\tthis._pc.addEventListener('connectionstatechange', () =>\n\t\t\t{\n\t\t\t\tthis.emit('@connectionstatechange', this._pc.connectionState);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._pc.addEventListener('iceconnectionstatechange', () =>\n\t\t\t{\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'run() | pc.connectionState not supported, using pc.iceConnectionState');\n\n\t\t\t\tswitch (this._pc.iceConnectionState)\n\t\t\t\t{\n\t\t\t\t\tcase 'checking':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connecting');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'connected':\n\t\t\t\t\tcase 'completed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'failed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'failed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'disconnected':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'disconnected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'closed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync updateIceServers(iceServers: RTCIceServer[]): Promise<void>\n\t{\n\t\tlogger.debug('updateIceServers()');\n\n\t\tconst configuration = this._pc.getConfiguration();\n\n\t\tconfiguration.iceServers = iceServers;\n\n\t\tthis._pc.setConfiguration(configuration);\n\t}\n\n\tasync restartIce(iceParameters: IceParameters): Promise<void>\n\t{\n\t\tlogger.debug('restartIce()');\n\n\t\t// Provide the remote SDP handler with new remote ICE parameters.\n\t\tthis._remoteSdp!.updateIceParameters(iceParameters);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._direction === 'send')\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer({ iceRestart: true });\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\t\t}\n\t}\n\n\tasync getTransportStats(): Promise<RTCStatsReport>\n\t{\n\t\treturn this._pc.getStats();\n\t}\n\n\tasync send(\n\t\t{ track, encodings, codecOptions, codec }: HandlerSendOptions\n\t): Promise<HandlerSendResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);\n\n\t\tif (codec)\n\t\t{\n\t\t\tlogger.warn(\n\t\t\t\t'send() | codec selection is not available in %s handler',\n\t\t\t\tthis.name);\n\t\t}\n\n\t\tthis._sendStream.addTrack(track);\n\t\tthis._pc.addStream(this._sendStream);\n\n\t\tlet offer = await this._pc.createOffer();\n\t\tlet localSdpObject = sdpTransform.parse(offer.sdp);\n\t\tlet offerMediaObject;\n\t\tconst sendingRtpParameters =\n\t\t\tutils.clone(this._sendingRtpParametersByKind![track.kind], {});\n\n\t\tsendingRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRtpParameters.codecs);\n\n\t\tconst sendingRemoteRtpParameters =\n\t\t\tutils.clone(this._sendingRemoteRtpParametersByKind![track.kind], {});\n\n\t\tsendingRemoteRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRemoteRtpParameters.codecs);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tif (track.kind === 'video' && encodings && encodings.length > 1)\n\t\t{\n\t\t\tlogger.debug('send() | enabling simulcast');\n\n\t\t\tlocalSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tofferMediaObject = localSdpObject.media.find(\n\t\t\t\t(m: any) => m.type === 'video');\n\n\t\t\tsdpPlanBUtils.addLegacySimulcast(\n\t\t\t\t{\n\t\t\t\t\tofferMediaObject,\n\t\t\t\t\ttrack,\n\t\t\t\t\tnumStreams : encodings.length\n\t\t\t\t});\n\n\t\t\toffer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) };\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\tofferMediaObject = localSdpObject.media\n\t\t\t.find((m: any) => m.type === track.kind);\n\n\t\t// Set RTCP CNAME.\n\t\tsendingRtpParameters.rtcp.cname =\n\t\t\tsdpCommonUtils.getCname({ offerMediaObject });\n\n\t\t// Set RTP encodings.\n\t\tsendingRtpParameters.encodings =\n\t\t\tsdpPlanBUtils.getRtpEncodings({ offerMediaObject, track });\n\n\t\t// Complete encodings with given values.\n\t\tif (encodings)\n\t\t{\n\t\t\tfor (let idx = 0; idx < sendingRtpParameters.encodings.length; ++idx)\n\t\t\t{\n\t\t\t\tif (encodings[idx])\n\t\t\t\t{\n\t\t\t\t\tObject.assign(sendingRtpParameters.encodings[idx], encodings[idx]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If VP8 and there is effective simulcast, add scalabilityMode to each\n\t\t// encoding.\n\t\tif (\n\t\t\tsendingRtpParameters.encodings.length > 1 &&\n\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8'\n\t\t)\n\t\t{\n\t\t\tfor (const encoding of sendingRtpParameters.encodings)\n\t\t\t{\n\t\t\t\tencoding.scalabilityMode = 'L1T3';\n\t\t\t}\n\t\t}\n\n\t\tthis._remoteSdp!.send(\n\t\t\t{\n\t\t\t\tofferMediaObject,\n\t\t\t\tofferRtpParameters : sendingRtpParameters,\n\t\t\t\tanswerRtpParameters : sendingRemoteRtpParameters,\n\t\t\t\tcodecOptions\n\t\t\t});\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\tconst localId = String(this._nextSendLocalId);\n\n\t\tthis._nextSendLocalId++;\n\n\t\t// Insert into the map.\n\t\tthis._mapSendLocalIdTrack.set(localId, track);\n\n\t\treturn {\n\t\t\tlocalId : localId,\n\t\t\trtpParameters : sendingRtpParameters\n\t\t};\n\t}\n\n\tasync stopSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('stopSending() [localId:%s]', localId);\n\n\t\tconst track = this._mapSendLocalIdTrack.get(localId);\n\n\t\tif (!track)\n\t\t{\n\t\t\tthrow new Error('track not found');\n\t\t}\n\n\t\tthis._mapSendLocalIdTrack.delete(localId);\n\t\tthis._sendStream.removeTrack(track);\n\t\tthis._pc.addStream(this._sendStream);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\ttry\n\t\t{\n\t\t\tawait this._pc.setLocalDescription(offer);\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\t// NOTE: If there are no sending tracks, setLocalDescription() will fail with\n\t\t\t// \"Failed to create channels\". If so, ignore it.\n\t\t\tif (this._sendStream.getTracks().length === 0)\n\t\t\t{\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'stopSending() | ignoring expected error due no sending tracks: %s',\n\t\t\t\t\t(error as Error).toString());\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (this._pc.signalingState === 'stable')\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync pauseSending(localId: string): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync resumeSending(localId: string): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync replaceTrack(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalId: string, track: MediaStreamTrack | null\n\t): Promise<void>\n\t{\n\t\tthrow new UnsupportedError('not implemented');\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync setMaxSpatialLayer(localId: string, spatialLayer: number): Promise<void>\n\t{\n\t\tthrow new UnsupportedError(' not implemented');\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync setRtpEncodingParameters(localId: string, params: any): Promise<void>\n\t{\n\t\tthrow new UnsupportedError('not supported');\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync getSenderStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthrow new UnsupportedError('not implemented');\n\t}\n\n\tasync sendDataChannel(\n\t\t{\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tlabel,\n\t\t\tprotocol\n\t\t}: HandlerSendDataChannelOptions\n\t): Promise<HandlerSendDataChannelResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : this._nextSendSctpStreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmitTime : maxPacketLifeTime, // NOTE: Old spec.\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('sendDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// Increase next id.\n\t\tthis._nextSendSctpStreamId =\n\t\t\t++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS;\n\n\t\t// If this is the first DataChannel we need to create the SDP answer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer();\n\t\t\tconst localSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst offerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => m.type === 'application');\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tthis._remoteSdp!.sendSctpAssociation({ offerMediaObject });\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\tconst sctpStreamParameters: SctpStreamParameters =\n\t\t{\n\t\t\tstreamId : options.id,\n\t\t\tordered : options.ordered,\n\t\t\tmaxPacketLifeTime : options.maxPacketLifeTime,\n\t\t\tmaxRetransmits : options.maxRetransmits\n\t\t};\n\n\t\treturn { dataChannel, sctpStreamParameters };\n\t}\n\n\tasync receive(\n\t\toptionsList: HandlerReceiveOptions[]\n\t) : Promise<HandlerReceiveResult[]>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst results: HandlerReceiveResult[] = [];\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, kind, rtpParameters, streamId } = options;\n\n\t\t\tlogger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);\n\n\t\t\tconst mid = kind;\n\n\t\t\tthis._remoteSdp!.receive(\n\t\t\t\t{\n\t\t\t\t\tmid,\n\t\t\t\t\tkind,\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tstreamId : streamId || rtpParameters.rtcp!.cname!,\n\t\t\t\t\ttrackId\n\t\t\t\t});\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tlet answer = await this._pc.createAnswer();\n\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { kind, rtpParameters } = options;\n\t\t\tconst mid = kind;\n\t\t\tconst answerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => String(m.mid) === mid);\n\n\t\t\t// May need to modify codec parameters in the answer based on codec\n\t\t\t// parameters in the offer.\n\t\t\tsdpCommonUtils.applyCodecParameters(\n\t\t\t\t{\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tanswerMediaObject\n\t\t\t\t});\n\t\t}\n\n\t\tanswer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { kind, trackId, rtpParameters } = options;\n\t\t\tconst mid = kind;\n\t\t\tconst localId = trackId;\n\t\t\tconst streamId = options.streamId || rtpParameters.rtcp!.cname!;\n\t\t\tconst stream = this._pc.getRemoteStreams()\n\t\t\t\t.find((s: any) => s.id === streamId);\n\t\t\tconst track = stream.getTrackById(localId);\n\n\t\t\tif (!track)\n\t\t\t{\n\t\t\t\tthrow new Error('remote track not found');\n\t\t\t}\n\n\t\t\t// Insert into the map.\n\t\t\tthis._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters });\n\n\t\t\tresults.push({ localId, track });\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stopReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('stopReceiving() [localId:%s]', localId);\n\n\t\t\tconst { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) || {};\n\n\t\t\t// Remove from the map.\n\t\t\tthis._mapRecvLocalIdInfo.delete(localId);\n\n\t\t\tthis._remoteSdp!.planBStopReceiving(\n\t\t\t\t{ mid: mid!, offerRtpParameters: rtpParameters! });\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync pauseReceiving(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalIds: string[]): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync resumeReceiving(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalIds: string[]): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync getReceiverStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthrow new UnsupportedError('not implemented');\n\t}\n\n\tasync receiveDataChannel(\n\t\t{ sctpStreamParameters, label, protocol }: HandlerReceiveDataChannelOptions\n\t): Promise<HandlerReceiveDataChannelResult>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst {\n\t\t\tstreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits\n\t\t} = sctpStreamParameters;\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : streamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmitTime : maxPacketLifeTime, // NOTE: Old spec.\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('receiveDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// If this is the first DataChannel we need to create the SDP offer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tthis._remoteSdp!.receiveSctpAssociation({ oldDataChannelSpec: true });\n\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\treturn { dataChannel };\n\t}\n\n\tprivate async setupTransport(\n\t\t{\n\t\t\tlocalDtlsRole,\n\t\t\tlocalSdpObject\n\t\t}:\n\t\t{\n\t\t\tlocalDtlsRole: DtlsRole;\n\t\t\tlocalSdpObject?: any;\n\t\t}\n\t): Promise<void>\n\t{\n\t\tif (!localSdpObject)\n\t\t{\n\t\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\t}\n\n\t\t// Get our local DTLS parameters.\n\t\tconst dtlsParameters =\n\t\t\tsdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject });\n\n\t\t// Set our DTLS role.\n\t\tdtlsParameters.role = localDtlsRole;\n\n\t\t// Update the remote DTLS role in the SDP.\n\t\tthis._remoteSdp!.updateDtlsRole(\n\t\t\tlocalDtlsRole === 'client' ? 'server' : 'client');\n\n\t\t// Need to tell the remote transport about our parameters.\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@connect',\n\t\t\t\t{ dtlsParameters },\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\n\t\tthis._transportReady = true;\n\t}\n\n\tprivate assertSendDirection(): void\n\t{\n\t\tif (this._direction !== 'send')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"send\" direction');\n\t\t}\n\t}\n\n\tprivate assertRecvDirection(): void\n\t{\n\t\tif (this._direction !== 'recv')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"recv\" direction');\n\t\t}\n\t}\n}\n","import * as sdpTransform from 'sdp-transform';\nimport { Logger } from '../Logger';\nimport { UnsupportedError } from '../errors';\nimport * as utils from '../utils';\nimport * as ortc from '../ortc';\nimport * as sdpCommonUtils from './sdp/commonUtils';\nimport * as sdpUnifiedPlanUtils from './sdp/unifiedPlanUtils';\nimport {\n\tHandlerFactory,\n\tHandlerInterface,\n\tHandlerRunOptions,\n\tHandlerSendOptions,\n\tHandlerSendResult,\n\tHandlerReceiveOptions,\n\tHandlerReceiveResult,\n\tHandlerSendDataChannelOptions,\n\tHandlerSendDataChannelResult,\n\tHandlerReceiveDataChannelOptions,\n\tHandlerReceiveDataChannelResult\n} from './HandlerInterface';\nimport { RemoteSdp } from './sdp/RemoteSdp';\nimport { parse as parseScalabilityMode } from '../scalabilityModes';\nimport { IceParameters, DtlsRole } from '../Transport';\nimport { RtpCapabilities, RtpParameters } from '../RtpParameters';\nimport { SctpCapabilities, SctpStreamParameters } from '../SctpParameters';\n\nconst logger = new Logger('Firefox60');\n\nconst SCTP_NUM_STREAMS = { OS: 16, MIS: 2048 };\n\nexport class Firefox60 extends HandlerInterface\n{\n\t// Handler direction.\n\tprivate _direction?: 'send' | 'recv';\n\t// Remote SDP handler.\n\tprivate _remoteSdp?: RemoteSdp;\n\t// Generic sending RTP parameters for audio and video.\n\tprivate _sendingRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Generic sending RTP parameters for audio and video suitable for the SDP\n\t// remote answer.\n\tprivate _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// RTCPeerConnection instance.\n\tprivate _pc: any;\n\t// Map of RTCTransceivers indexed by MID.\n\tprivate readonly _mapMidTransceiver: Map<string, RTCRtpTransceiver> =\n\t\tnew Map();\n\t// Local stream for sending.\n\tprivate readonly _sendStream = new MediaStream();\n\t// Whether a DataChannel m=application section has been created.\n\tprivate _hasDataChannelMediaSection = false;\n\t// Sending DataChannel id value counter. Incremented for each new DataChannel.\n\tprivate _nextSendSctpStreamId = 0;\n\t// Got transport local and remote parameters.\n\tprivate _transportReady = false;\n\n\t/**\n\t * Creates a factory function.\n\t */\n\tstatic createFactory(): HandlerFactory\n\t{\n\t\treturn (): Firefox60 => new Firefox60();\n\t}\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tget name(): string\n\t{\n\t\treturn 'Firefox60';\n\t}\n\n\tclose(): void\n\t{\n\t\tlogger.debug('close()');\n\n\t\t// Close RTCPeerConnection.\n\t\tif (this._pc)\n\t\t{\n\t\t\ttry { this._pc.close(); }\n\t\t\tcatch (error) {}\n\t\t}\n\n\t\tthis.emit('@close');\n\t}\n\n\tasync getNativeRtpCapabilities(): Promise<RtpCapabilities>\n\t{\n\t\tlogger.debug('getNativeRtpCapabilities()');\n\n\t\tconst pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : [],\n\t\t\t\ticeTransportPolicy : 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require'\n\t\t\t});\n\n\t\t// NOTE: We need to add a real video track to get the RID extension mapping.\n\t\tconst canvas = document.createElement('canvas');\n\n\t\t// NOTE: Otherwise Firefox fails in next line.\n\t\tcanvas.getContext('2d');\n\n\t\tconst fakeStream = (canvas as any).captureStream();\n\t\tconst fakeVideoTrack = fakeStream.getVideoTracks()[0];\n\n\t\ttry\n\t\t{\n\t\t\tpc.addTransceiver('audio', { direction: 'sendrecv' });\n\n\t\t\tconst videoTransceiver =\n\t\t\t\tpc.addTransceiver(fakeVideoTrack, { direction: 'sendrecv' });\n\t\t\tconst parameters = videoTransceiver.sender.getParameters();\n\t\t\tconst encodings =\n\t\t\t[\n\t\t\t\t{ rid: 'r0', maxBitrate: 100000 },\n\t\t\t\t{ rid: 'r1', maxBitrate: 500000 }\n\t\t\t];\n\n\t\t\tparameters.encodings = encodings;\n\t\t\tawait videoTransceiver.sender.setParameters(parameters);\n\n\t\t\tconst offer = await pc.createOffer();\n\n\t\t\ttry { canvas.remove(); }\n\t\t\tcatch (error) {}\n\n\t\t\ttry { fakeVideoTrack.stop(); }\n\t\t\tcatch (error) {}\n\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error) {}\n\n\t\t\tconst sdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst nativeRtpCapabilities =\n\t\t\t\tsdpCommonUtils.extractRtpCapabilities({ sdpObject });\n\n\t\t\treturn nativeRtpCapabilities;\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\ttry { canvas.remove(); }\n\t\t\tcatch (error2) {}\n\n\t\t\ttry { fakeVideoTrack.stop(); }\n\t\t\tcatch (error2) {}\n\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error2) {}\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync getNativeSctpCapabilities(): Promise<SctpCapabilities>\n\t{\n\t\tlogger.debug('getNativeSctpCapabilities()');\n\n\t\treturn {\n\t\t\tnumStreams : SCTP_NUM_STREAMS\n\t\t};\n\t}\n\n\trun(\n\t\t{\n\t\t\tdirection,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\textendedRtpCapabilities\n\t\t}: HandlerRunOptions\n\t): void\n\t{\n\t\tlogger.debug('run()');\n\n\t\tthis._direction = direction;\n\n\t\tthis._remoteSdp = new RemoteSdp(\n\t\t\t{\n\t\t\t\ticeParameters,\n\t\t\t\ticeCandidates,\n\t\t\t\tdtlsParameters,\n\t\t\t\tsctpParameters\n\t\t\t});\n\n\t\tthis._sendingRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tthis._sendingRemoteRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tthis._pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : iceServers || [],\n\t\t\t\ticeTransportPolicy : iceTransportPolicy || 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\t...additionalSettings\n\t\t\t},\n\t\t\tproprietaryConstraints);\n\n\t\tif (this._pc.connectionState)\n\t\t{\n\t\t\tthis._pc.addEventListener('connectionstatechange', () =>\n\t\t\t{\n\t\t\t\tthis.emit('@connectionstatechange', this._pc.connectionState);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._pc.addEventListener('iceconnectionstatechange', () =>\n\t\t\t{\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'run() | pc.connectionState not supported, using pc.iceConnectionState');\n\n\t\t\t\tswitch (this._pc.iceConnectionState)\n\t\t\t\t{\n\t\t\t\t\tcase 'checking':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connecting');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'connected':\n\t\t\t\t\tcase 'completed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'failed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'failed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'disconnected':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'disconnected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'closed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync updateIceServers(iceServers: RTCIceServer[]): Promise<void>\n\t{\n\t\t// NOTE: Firefox does not implement pc.setConfiguration().\n\t\tthrow new UnsupportedError('not supported');\n\t}\n\n\tasync restartIce(iceParameters: IceParameters): Promise<void>\n\t{\n\t\tlogger.debug('restartIce()');\n\n\t\t// Provide the remote SDP handler with new remote ICE parameters.\n\t\tthis._remoteSdp!.updateIceParameters(iceParameters);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._direction === 'send')\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer({ iceRestart: true });\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\t\t}\n\t}\n\n\tasync getTransportStats(): Promise<RTCStatsReport>\n\t{\n\t\treturn this._pc.getStats();\n\t}\n\n\tasync send(\n\t\t{ track, encodings, codecOptions, codec }: HandlerSendOptions\n\t): Promise<HandlerSendResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);\n\n\t\tif (encodings)\n\t\t{\n\t\t\tencodings = utils.clone(encodings, []);\n\n\t\t\tif (encodings!.length > 1)\n\t\t\t{\n\t\t\t\tencodings!.forEach((encoding, idx) =>\n\t\t\t\t{\n\t\t\t\t\tencoding.rid = `r${idx}`;\n\t\t\t\t});\n\n\t\t\t\t// Clone the encodings and reverse them because Firefox likes them\n\t\t\t\t// from high to low.\n\t\t\t\tencodings!.reverse();\n\t\t\t}\n\t\t}\n\n\t\tconst sendingRtpParameters =\n\t\t\tutils.clone(this._sendingRtpParametersByKind![track.kind], {});\n\n\t\t// This may throw.\n\t\tsendingRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRtpParameters.codecs, codec);\n\n\t\tconst sendingRemoteRtpParameters =\n\t\t\tutils.clone(this._sendingRemoteRtpParametersByKind![track.kind], {});\n\n\t\t// This may throw.\n\t\tsendingRemoteRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec);\n\n\t\t// NOTE: Firefox fails sometimes to properly anticipate the closed media\n\t\t// section that it should use, so don't reuse closed media sections.\n\t\t// https://github.com/versatica/mediasoup-client/issues/104\n\t\t//\n\t\t// const mediaSectionIdx = this._remoteSdp!.getNextMediaSectionIdx();\n\t\tconst transceiver = this._pc.addTransceiver(\n\t\t\ttrack, { direction: 'sendonly', streams: [ this._sendStream ] });\n\n\t\t// NOTE: This is not spec compliants. Encodings should be given in addTransceiver\n\t\t// second argument, but Firefox does not support it.\n\t\tif (encodings)\n\t\t{\n\t\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\t\tparameters.encodings = encodings;\n\t\t\tawait transceiver.sender.setParameters(parameters);\n\t\t}\n\n\t\tconst offer = await this._pc.createOffer();\n\t\tlet localSdpObject = sdpTransform.parse(offer.sdp);\n\n\t\t// In Firefox use DTLS role client even if we are the \"offerer\" since\n\t\t// Firefox does not respect ICE-Lite.\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport({ localDtlsRole: 'client', localSdpObject });\n\t\t}\n\n\t\tconst layers =\n\t\t\tparseScalabilityMode((encodings || [ {} ])[0].scalabilityMode);\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t// We can now get the transceiver.mid.\n\t\tconst localId = transceiver.mid;\n\n\t\t// Set MID.\n\t\tsendingRtpParameters.mid = localId;\n\n\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\n\t\tconst offerMediaObject = localSdpObject.media[localSdpObject.media.length - 1];\n\n\t\t// Set RTCP CNAME.\n\t\tsendingRtpParameters.rtcp.cname =\n\t\t\tsdpCommonUtils.getCname({ offerMediaObject });\n\n\t\t// Set RTP encodings by parsing the SDP offer if no encodings are given.\n\t\tif (!encodings)\n\t\t{\n\t\t\tsendingRtpParameters.encodings =\n\t\t\t\tsdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject });\n\t\t}\n\t\t// Set RTP encodings by parsing the SDP offer and complete them with given\n\t\t// one if just a single encoding has been given.\n\t\telse if (encodings.length === 1)\n\t\t{\n\t\t\tconst newEncodings =\n\t\t\t\tsdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject });\n\n\t\t\tObject.assign(newEncodings[0], encodings[0]);\n\n\t\t\tsendingRtpParameters.encodings = newEncodings;\n\t\t}\n\t\t// Otherwise if more than 1 encoding are given use them verbatim (but\n\t\t// reverse them back since we reversed them above to satisfy Firefox).\n\t\telse\n\t\t{\n\t\t\tsendingRtpParameters.encodings = encodings.reverse();\n\t\t}\n\n\t\t// If VP8 or H264 and there is effective simulcast, add scalabilityMode to\n\t\t// each encoding.\n\t\tif (\n\t\t\tsendingRtpParameters.encodings.length > 1 &&\n\t\t\t(\n\t\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' ||\n\t\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/h264'\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\tfor (const encoding of sendingRtpParameters.encodings)\n\t\t\t{\n\t\t\t\tif (encoding.scalabilityMode)\n\t\t\t\t{\n\t\t\t\t\tencoding.scalabilityMode = `L1T${layers.temporalLayers}`;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tencoding.scalabilityMode = 'L1T3';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._remoteSdp!.send(\n\t\t\t{\n\t\t\t\tofferMediaObject,\n\t\t\t\tofferRtpParameters : sendingRtpParameters,\n\t\t\t\tanswerRtpParameters : sendingRemoteRtpParameters,\n\t\t\t\tcodecOptions,\n\t\t\t\textmapAllowMixed : true\n\t\t\t});\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t// Store in the map.\n\t\tthis._mapMidTransceiver.set(localId, transceiver);\n\n\t\treturn {\n\t\t\tlocalId,\n\t\t\trtpParameters : sendingRtpParameters,\n\t\t\trtpSender : transceiver.sender\n\t\t};\n\t}\n\n\tasync stopSending(localId: string): Promise<void>\n\t{\n\t\tlogger.debug('stopSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated transceiver not found');\n\t\t}\n\n\t\ttransceiver.sender.replaceTrack(null);\n\n\t\t// NOTE: Cannot use stop() the transceiver due to the the note above in\n\t\t// send() method.\n\t\t// try\n\t\t// {\n\t\t// \ttransceiver.stop();\n\t\t// }\n\t\t// catch (error)\n\t\t// {}\n\n\t\tthis._pc.removeTrack(transceiver.sender);\n\t\t// NOTE: Cannot use closeMediaSection() due to the the note above in send()\n\t\t// method.\n\t\t// this._remoteSdp!.closeMediaSection(transceiver.mid);\n\t\tthis._remoteSdp!.disableMediaSection(transceiver.mid!);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\tthis._mapMidTransceiver.delete(localId);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync pauseSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('pauseSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.direction = 'inactive';\n\t\tthis._remoteSdp!.pauseMediaSection(localId);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'pauseSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'pauseSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync resumeSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('resumeSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.direction = 'sendonly';\n\t\tthis._remoteSdp!.resumeSendingMediaSection(localId);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'resumeSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'resumeSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync replaceTrack(\n\t\tlocalId: string, track: MediaStreamTrack | null\n\t): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tif (track)\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'replaceTrack() [localId:%s, track.id:%s]', localId, track.id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.debug('replaceTrack() [localId:%s, no track]', localId);\n\t\t}\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tawait transceiver.sender.replaceTrack(track);\n\t}\n\n\tasync setMaxSpatialLayer(localId: string, spatialLayer: number): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() [localId:%s, spatialLayer:%s]',\n\t\t\tlocalId, spatialLayer);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated transceiver not found');\n\t\t}\n\n\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\t// NOTE: We require encodings given from low to high, however Firefox\n\t\t// requires them in reverse order, so do magic here.\n\t\tspatialLayer = parameters.encodings.length - 1 - spatialLayer;\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tif (idx >= spatialLayer)\n\t\t\t{\n\t\t\t\tencoding.active = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tencoding.active = false;\n\t\t\t}\n\t\t});\n\n\t\tawait transceiver.sender.setParameters(parameters);\n\n\t\tthis._remoteSdp!.muxMediaSectionSimulcast(localId, parameters.encodings);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync setRtpEncodingParameters(localId: string, params: any): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() [localId:%s, params:%o]',\n\t\t\tlocalId, params);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tparameters.encodings[idx] = { ...encoding, ...params };\n\t\t});\n\n\t\tawait transceiver.sender.setParameters(parameters);\n\n\t\tthis._remoteSdp!.muxMediaSectionSimulcast(localId, parameters.encodings);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync getSenderStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\treturn transceiver.sender.getStats();\n\t}\n\n\tasync sendDataChannel(\n\t\t{\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tlabel,\n\t\t\tprotocol\n\t\t}: HandlerSendDataChannelOptions\n\t): Promise<HandlerSendDataChannelResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : this._nextSendSctpStreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('sendDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// Increase next id.\n\t\tthis._nextSendSctpStreamId =\n\t\t\t++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS;\n\n\t\t// If this is the first DataChannel we need to create the SDP answer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer();\n\t\t\tconst localSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst offerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => m.type === 'application');\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tawait this.setupTransport({ localDtlsRole: 'client', localSdpObject });\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tthis._remoteSdp!.sendSctpAssociation({ offerMediaObject });\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\tconst sctpStreamParameters: SctpStreamParameters =\n\t\t{\n\t\t\tstreamId : options.id,\n\t\t\tordered : options.ordered,\n\t\t\tmaxPacketLifeTime : options.maxPacketLifeTime,\n\t\t\tmaxRetransmits : options.maxRetransmits\n\t\t};\n\n\t\treturn { dataChannel, sctpStreamParameters };\n\t}\n\n\tasync receive(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\toptionsList: HandlerReceiveOptions[]\n\t) : Promise<HandlerReceiveResult[]>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst results: HandlerReceiveResult[] = [];\n\t\tconst mapLocalId: Map<string, string> = new Map();\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, kind, rtpParameters, streamId } = options;\n\n\t\t\tlogger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);\n\n\t\t\tconst localId = rtpParameters.mid || String(this._mapMidTransceiver.size);\n\n\t\t\tmapLocalId.set(trackId, localId);\n\n\t\t\tthis._remoteSdp!.receive(\n\t\t\t\t{\n\t\t\t\t\tmid : localId,\n\t\t\t\t\tkind,\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tstreamId : streamId || rtpParameters.rtcp!.cname!,\n\t\t\t\t\ttrackId\n\t\t\t\t});\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tlet answer = await this._pc.createAnswer();\n\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, rtpParameters } = options;\n\t\t\tconst localId = mapLocalId.get(trackId);\n\t\t\tconst answerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => String(m.mid) === localId);\n\n\t\t\t// May need to modify codec parameters in the answer based on codec\n\t\t\t// parameters in the offer.\n\t\t\tsdpCommonUtils.applyCodecParameters(\n\t\t\t\t{\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tanswerMediaObject\n\t\t\t\t});\n\n\t\t\tanswer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };\n\t\t}\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport({ localDtlsRole: 'client', localSdpObject });\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId } = options;\n\t\t\tconst localId = mapLocalId.get(trackId)!;\n\t\t\tconst transceiver = this._pc.getTransceivers()\n\t\t\t\t.find((t: RTCRtpTransceiver) => t.mid === localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('new RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\t// Store in the map.\n\t\t\tthis._mapMidTransceiver.set(localId, transceiver);\n\n\t\t\tresults.push({\n\t\t\t\tlocalId,\n\t\t\t\ttrack : transceiver.receiver.track,\n\t\t\t\trtpReceiver : transceiver.receiver\n\t\t\t});\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stopReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('stopReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\tthis._remoteSdp!.closeMediaSection(transceiver.mid!);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tthis._mapMidTransceiver.delete(localId);\n\t\t}\n\t}\n\n\tasync pauseReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('pauseReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\ttransceiver.direction = 'inactive';\n\t\t\tthis._remoteSdp!.pauseMediaSection(localId);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'pauseReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync resumeReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('resumeReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\ttransceiver.direction = 'recvonly';\n\t\t\tthis._remoteSdp!.resumeReceivingMediaSection(localId);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'resumeReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync getReceiverStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\treturn transceiver.receiver.getStats();\n\t}\n\n\tasync receiveDataChannel(\n\t\t{ sctpStreamParameters, label, protocol }: HandlerReceiveDataChannelOptions\n\t): Promise<HandlerReceiveDataChannelResult>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst {\n\t\t\tstreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits\n\t\t}: SctpStreamParameters = sctpStreamParameters;\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : streamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('receiveDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// If this is the first DataChannel we need to create the SDP offer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tthis._remoteSdp!.receiveSctpAssociation();\n\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\t\t\tawait this.setupTransport({ localDtlsRole: 'client', localSdpObject });\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\treturn { dataChannel };\n\t}\n\n\tprivate async setupTransport(\n\t\t{\n\t\t\tlocalDtlsRole,\n\t\t\tlocalSdpObject\n\t\t}:\n\t\t{\n\t\t\tlocalDtlsRole: DtlsRole;\n\t\t\tlocalSdpObject?: any;\n\t\t}\n\t): Promise<void>\n\t{\n\t\tif (!localSdpObject)\n\t\t{\n\t\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\t}\n\n\t\t// Get our local DTLS parameters.\n\t\tconst dtlsParameters =\n\t\t\tsdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject });\n\n\t\t// Set our DTLS role.\n\t\tdtlsParameters.role = localDtlsRole;\n\n\t\t// Update the remote DTLS role in the SDP.\n\t\tthis._remoteSdp!.updateDtlsRole(\n\t\t\tlocalDtlsRole === 'client' ? 'server' : 'client');\n\n\t\t// Need to tell the remote transport about our parameters.\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@connect',\n\t\t\t\t{ dtlsParameters },\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\n\t\tthis._transportReady = true;\n\t}\n\n\tprivate assertSendDirection(): void\n\t{\n\t\tif (this._direction !== 'send')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"send\" direction');\n\t\t}\n\t}\n\n\tprivate assertRecvDirection(): void\n\t{\n\t\tif (this._direction !== 'recv')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"recv\" direction');\n\t\t}\n\t}\n}\n","import * as sdpTransform from 'sdp-transform';\nimport { Logger } from '../Logger';\nimport * as utils from '../utils';\nimport * as ortc from '../ortc';\nimport * as sdpCommonUtils from './sdp/commonUtils';\nimport * as sdpUnifiedPlanUtils from './sdp/unifiedPlanUtils';\nimport * as ortcUtils from './ortc/utils';\nimport {\n\tHandlerFactory,\n\tHandlerInterface,\n\tHandlerRunOptions,\n\tHandlerSendOptions,\n\tHandlerSendResult,\n\tHandlerReceiveOptions,\n\tHandlerReceiveResult,\n\tHandlerSendDataChannelOptions,\n\tHandlerSendDataChannelResult,\n\tHandlerReceiveDataChannelOptions,\n\tHandlerReceiveDataChannelResult\n} from './HandlerInterface';\nimport { RemoteSdp } from './sdp/RemoteSdp';\nimport { parse as parseScalabilityMode } from '../scalabilityModes';\nimport { IceParameters, DtlsRole } from '../Transport';\nimport { RtpCapabilities, RtpParameters } from '../RtpParameters';\nimport { SctpCapabilities, SctpStreamParameters } from '../SctpParameters';\n\nconst logger = new Logger('Safari12');\n\nconst SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };\n\nexport class Safari12 extends HandlerInterface\n{\n\t// Handler direction.\n\tprivate _direction?: 'send' | 'recv';\n\t// Remote SDP handler.\n\tprivate _remoteSdp?: RemoteSdp;\n\t// Generic sending RTP parameters for audio and video.\n\tprivate _sendingRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Generic sending RTP parameters for audio and video suitable for the SDP\n\t// remote answer.\n\tprivate _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Initial server side DTLS role. If not 'auto', it will force the opposite\n\t// value in client side.\n\tprivate _forcedLocalDtlsRole?: DtlsRole;\n\t// RTCPeerConnection instance.\n\tprivate _pc: any;\n\t// Map of RTCTransceivers indexed by MID.\n\tprivate readonly _mapMidTransceiver: Map<string, RTCRtpTransceiver> =\n\t\tnew Map();\n\t// Local stream for sending.\n\tprivate readonly _sendStream = new MediaStream();\n\t// Whether a DataChannel m=application section has been created.\n\tprivate _hasDataChannelMediaSection = false;\n\t// Sending DataChannel id value counter. Incremented for each new DataChannel.\n\tprivate _nextSendSctpStreamId = 0;\n\t// Got transport local and remote parameters.\n\tprivate _transportReady = false;\n\n\t/**\n\t * Creates a factory function.\n\t */\n\tstatic createFactory(): HandlerFactory\n\t{\n\t\treturn (): Safari12 => new Safari12();\n\t}\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tget name(): string\n\t{\n\t\treturn 'Safari12';\n\t}\n\n\tclose(): void\n\t{\n\t\tlogger.debug('close()');\n\n\t\t// Close RTCPeerConnection.\n\t\tif (this._pc)\n\t\t{\n\t\t\ttry { this._pc.close(); }\n\t\t\tcatch (error) {}\n\t\t}\n\n\t\tthis.emit('@close');\n\t}\n\n\tasync getNativeRtpCapabilities(): Promise<RtpCapabilities>\n\t{\n\t\tlogger.debug('getNativeRtpCapabilities()');\n\n\t\tconst pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : [],\n\t\t\t\ticeTransportPolicy : 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require'\n\t\t\t});\n\n\t\ttry\n\t\t{\n\t\t\tpc.addTransceiver('audio');\n\t\t\tpc.addTransceiver('video');\n\n\t\t\tconst offer = await pc.createOffer();\n\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error) {}\n\n\t\t\tconst sdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst nativeRtpCapabilities =\n\t\t\t\tsdpCommonUtils.extractRtpCapabilities({ sdpObject });\n\n\t\t\t// libwebrtc supports NACK for OPUS but doesn't announce it.\n\t\t\tortcUtils.addNackSuppportForOpus(nativeRtpCapabilities);\n\n\t\t\treturn nativeRtpCapabilities;\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error2) {}\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync getNativeSctpCapabilities(): Promise<SctpCapabilities>\n\t{\n\t\tlogger.debug('getNativeSctpCapabilities()');\n\n\t\treturn {\n\t\t\tnumStreams : SCTP_NUM_STREAMS\n\t\t};\n\t}\n\n\trun(\n\t\t{\n\t\t\tdirection,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\textendedRtpCapabilities\n\t\t}: HandlerRunOptions\n\t): void\n\t{\n\t\tlogger.debug('run()');\n\n\t\tthis._direction = direction;\n\n\t\tthis._remoteSdp = new RemoteSdp(\n\t\t\t{\n\t\t\t\ticeParameters,\n\t\t\t\ticeCandidates,\n\t\t\t\tdtlsParameters,\n\t\t\t\tsctpParameters\n\t\t\t});\n\n\t\tthis._sendingRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tthis._sendingRemoteRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tif (dtlsParameters.role && dtlsParameters.role !== 'auto')\n\t\t{\n\t\t\tthis._forcedLocalDtlsRole = dtlsParameters.role === 'server'\n\t\t\t\t? 'client'\n\t\t\t\t: 'server';\n\t\t}\n\n\t\tthis._pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : iceServers || [],\n\t\t\t\ticeTransportPolicy : iceTransportPolicy || 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\t...additionalSettings\n\t\t\t},\n\t\t\tproprietaryConstraints);\n\n\t\tif (this._pc.connectionState)\n\t\t{\n\t\t\tthis._pc.addEventListener('connectionstatechange', () =>\n\t\t\t{\n\t\t\t\tthis.emit('@connectionstatechange', this._pc.connectionState);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._pc.addEventListener('iceconnectionstatechange', () =>\n\t\t\t{\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'run() | pc.connectionState not supported, using pc.iceConnectionState');\n\n\t\t\t\tswitch (this._pc.iceConnectionState)\n\t\t\t\t{\n\t\t\t\t\tcase 'checking':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connecting');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'connected':\n\t\t\t\t\tcase 'completed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'failed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'failed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'disconnected':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'disconnected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'closed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync updateIceServers(iceServers: RTCIceServer[]): Promise<void>\n\t{\n\t\tlogger.debug('updateIceServers()');\n\n\t\tconst configuration = this._pc.getConfiguration();\n\n\t\tconfiguration.iceServers = iceServers;\n\n\t\tthis._pc.setConfiguration(configuration);\n\t}\n\n\tasync restartIce(iceParameters: IceParameters): Promise<void>\n\t{\n\t\tlogger.debug('restartIce()');\n\n\t\t// Provide the remote SDP handler with new remote ICE parameters.\n\t\tthis._remoteSdp!.updateIceParameters(iceParameters);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._direction === 'send')\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer({ iceRestart: true });\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\t\t}\n\t}\n\n\tasync getTransportStats(): Promise<RTCStatsReport>\n\t{\n\t\treturn this._pc.getStats();\n\t}\n\n\tasync send(\n\t\t{ track, encodings, codecOptions, codec }: HandlerSendOptions\n\t): Promise<HandlerSendResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);\n\n\t\tconst sendingRtpParameters =\n\t\t\tutils.clone(this._sendingRtpParametersByKind![track.kind], {});\n\n\t\t// This may throw.\n\t\tsendingRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRtpParameters.codecs, codec);\n\n\t\tconst sendingRemoteRtpParameters =\n\t\t\tutils.clone(this._sendingRemoteRtpParametersByKind![track.kind], {});\n\n\t\t// This may throw.\n\t\tsendingRemoteRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec);\n\n\t\tconst mediaSectionIdx = this._remoteSdp!.getNextMediaSectionIdx();\n\t\tconst transceiver = this._pc.addTransceiver(\n\t\t\ttrack, { direction: 'sendonly', streams: [ this._sendStream ] });\n\t\tlet offer = await this._pc.createOffer();\n\t\tlet localSdpObject = sdpTransform.parse(offer.sdp);\n\t\tlet offerMediaObject;\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tconst layers =\n\t\t\tparseScalabilityMode((encodings || [ {} ])[0].scalabilityMode);\n\n\t\tif (encodings && encodings.length > 1)\n\t\t{\n\t\t\tlogger.debug('send() | enabling legacy simulcast');\n\n\t\t\tlocalSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tofferMediaObject = localSdpObject.media[mediaSectionIdx.idx];\n\n\t\t\tsdpUnifiedPlanUtils.addLegacySimulcast(\n\t\t\t\t{\n\t\t\t\t\tofferMediaObject,\n\t\t\t\t\tnumStreams : encodings.length\n\t\t\t\t});\n\n\t\t\toffer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) };\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t// We can now get the transceiver.mid.\n\t\tconst localId = transceiver.mid;\n\n\t\t// Set MID.\n\t\tsendingRtpParameters.mid = localId;\n\n\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\tofferMediaObject = localSdpObject.media[mediaSectionIdx.idx];\n\n\t\t// Set RTCP CNAME.\n\t\tsendingRtpParameters.rtcp.cname =\n\t\t\tsdpCommonUtils.getCname({ offerMediaObject });\n\n\t\t// Set RTP encodings.\n\t\tsendingRtpParameters.encodings =\n\t\t\tsdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject });\n\n\t\t// Complete encodings with given values.\n\t\tif (encodings)\n\t\t{\n\t\t\tfor (let idx = 0; idx < sendingRtpParameters.encodings.length; ++idx)\n\t\t\t{\n\t\t\t\tif (encodings[idx])\n\t\t\t\t{\n\t\t\t\t\tObject.assign(sendingRtpParameters.encodings[idx], encodings[idx]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If VP8 or H264 and there is effective simulcast, add scalabilityMode to\n\t\t// each encoding.\n\t\tif (\n\t\t\tsendingRtpParameters.encodings.length > 1 &&\n\t\t\t(\n\t\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' ||\n\t\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/h264'\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\tfor (const encoding of sendingRtpParameters.encodings)\n\t\t\t{\n\t\t\t\tif (encoding.scalabilityMode)\n\t\t\t\t{\n\t\t\t\t\tencoding.scalabilityMode = `L1T${layers.temporalLayers}`;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tencoding.scalabilityMode = 'L1T3';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._remoteSdp!.send(\n\t\t\t{\n\t\t\t\tofferMediaObject,\n\t\t\t\treuseMid : mediaSectionIdx.reuseMid,\n\t\t\t\tofferRtpParameters : sendingRtpParameters,\n\t\t\t\tanswerRtpParameters : sendingRemoteRtpParameters,\n\t\t\t\tcodecOptions\n\t\t\t});\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t// Store in the map.\n\t\tthis._mapMidTransceiver.set(localId, transceiver);\n\n\t\treturn {\n\t\t\tlocalId,\n\t\t\trtpParameters : sendingRtpParameters,\n\t\t\trtpSender : transceiver.sender\n\t\t};\n\t}\n\n\tasync stopSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('stopSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.sender.replaceTrack(null);\n\n\t\tthis._pc.removeTrack(transceiver.sender);\n\n\t\tconst mediaSectionClosed =\n\t\t\tthis._remoteSdp!.closeMediaSection(transceiver.mid!);\n\n\t\tif (mediaSectionClosed)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\ttransceiver.stop();\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{}\n\t\t}\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\tthis._mapMidTransceiver.delete(localId);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync pauseSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('pauseSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.direction = 'inactive';\n\t\tthis._remoteSdp!.pauseMediaSection(localId);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'pauseSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'pauseSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync resumeSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('resumeSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.direction = 'sendonly';\n\t\tthis._remoteSdp!.resumeSendingMediaSection(localId);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'resumeSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'resumeSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync replaceTrack(\n\t\tlocalId: string, track: MediaStreamTrack | null\n\t): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tif (track)\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'replaceTrack() [localId:%s, track.id:%s]', localId, track.id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.debug('replaceTrack() [localId:%s, no track]', localId);\n\t\t}\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tawait transceiver.sender.replaceTrack(track);\n\t}\n\n\tasync setMaxSpatialLayer(localId: string, spatialLayer: number): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() [localId:%s, spatialLayer:%s]',\n\t\t\tlocalId, spatialLayer);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tif (idx <= spatialLayer)\n\t\t\t{\n\t\t\t\tencoding.active = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tencoding.active = false;\n\t\t\t}\n\t\t});\n\n\t\tawait transceiver.sender.setParameters(parameters);\n\n\t\tthis._remoteSdp!.muxMediaSectionSimulcast(localId, parameters.encodings);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync setRtpEncodingParameters(localId: string, params: any): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() [localId:%s, params:%o]',\n\t\t\tlocalId, params);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tparameters.encodings[idx] = { ...encoding, ...params };\n\t\t});\n\n\t\tawait transceiver.sender.setParameters(parameters);\n\n\t\tthis._remoteSdp!.muxMediaSectionSimulcast(localId, parameters.encodings);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync getSenderStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\treturn transceiver.sender.getStats();\n\t}\n\n\tasync sendDataChannel(\n\t\t{\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tlabel,\n\t\t\tprotocol\n\t\t}: HandlerSendDataChannelOptions\n\t): Promise<HandlerSendDataChannelResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : this._nextSendSctpStreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('sendDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// Increase next id.\n\t\tthis._nextSendSctpStreamId =\n\t\t\t++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS;\n\n\t\t// If this is the first DataChannel we need to create the SDP answer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer();\n\t\t\tconst localSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst offerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => m.type === 'application');\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tthis._remoteSdp!.sendSctpAssociation({ offerMediaObject });\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\tconst sctpStreamParameters: SctpStreamParameters =\n\t\t{\n\t\t\tstreamId : options.id,\n\t\t\tordered : options.ordered,\n\t\t\tmaxPacketLifeTime : options.maxPacketLifeTime,\n\t\t\tmaxRetransmits : options.maxRetransmits\n\t\t};\n\n\t\treturn { dataChannel, sctpStreamParameters };\n\t}\n\n\tasync receive(\n\t\toptionsList: HandlerReceiveOptions[]\n\t) : Promise<HandlerReceiveResult[]>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst results: HandlerReceiveResult[] = [];\n\t\tconst mapLocalId: Map<string, string> = new Map();\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, kind, rtpParameters, streamId } = options;\n\n\t\t\tlogger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);\n\n\t\t\tconst localId = rtpParameters.mid || String(this._mapMidTransceiver.size);\n\n\t\t\tmapLocalId.set(trackId, localId);\n\n\t\t\tthis._remoteSdp!.receive(\n\t\t\t\t{\n\t\t\t\t\tmid : localId,\n\t\t\t\t\tkind,\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tstreamId : streamId || rtpParameters.rtcp!.cname!,\n\t\t\t\t\ttrackId\n\t\t\t\t});\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tlet answer = await this._pc.createAnswer();\n\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, rtpParameters } = options;\n\t\t\tconst localId = mapLocalId.get(trackId);\n\t\t\tconst answerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => String(m.mid) === localId);\n\n\t\t\t// May need to modify codec parameters in the answer based on codec\n\t\t\t// parameters in the offer.\n\t\t\tsdpCommonUtils.applyCodecParameters(\n\t\t\t\t{\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tanswerMediaObject\n\t\t\t\t});\n\t\t}\n\n\t\tanswer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId } = options;\n\t\t\tconst localId = mapLocalId.get(trackId)!;\n\t\t\tconst transceiver = this._pc.getTransceivers()\n\t\t\t\t.find((t: RTCRtpTransceiver) => t.mid === localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('new RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\t// Store in the map.\n\t\t\tthis._mapMidTransceiver.set(localId, transceiver);\n\n\t\t\tresults.push({\n\t\t\t\tlocalId,\n\t\t\t\ttrack : transceiver.receiver.track,\n\t\t\t\trtpReceiver : transceiver.receiver\n\t\t\t});\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stopReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('stopReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\tthis._remoteSdp!.closeMediaSection(transceiver.mid!);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tthis._mapMidTransceiver.delete(localId);\n\t\t}\n\t}\n\n\tasync pauseReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('pauseReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\ttransceiver.direction = 'inactive';\n\t\t\tthis._remoteSdp!.pauseMediaSection(localId);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'pauseReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync resumeReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('resumeReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\ttransceiver.direction = 'recvonly';\n\t\t\tthis._remoteSdp!.resumeReceivingMediaSection(localId);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'resumeReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync getReceiverStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\treturn transceiver.receiver.getStats();\n\t}\n\n\tasync receiveDataChannel(\n\t\t{ sctpStreamParameters, label, protocol }: HandlerReceiveDataChannelOptions\n\t): Promise<HandlerReceiveDataChannelResult>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst {\n\t\t\tstreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits\n\t\t}: SctpStreamParameters = sctpStreamParameters;\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : streamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('receiveDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// If this is the first DataChannel we need to create the SDP offer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tthis._remoteSdp!.receiveSctpAssociation();\n\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\treturn { dataChannel };\n\t}\n\n\tprivate async setupTransport(\n\t\t{\n\t\t\tlocalDtlsRole,\n\t\t\tlocalSdpObject\n\t\t}:\n\t\t{\n\t\t\tlocalDtlsRole: DtlsRole;\n\t\t\tlocalSdpObject?: any;\n\t\t}\n\t): Promise<void>\n\t{\n\t\tif (!localSdpObject)\n\t\t{\n\t\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\t}\n\n\t\t// Get our local DTLS parameters.\n\t\tconst dtlsParameters =\n\t\t\tsdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject });\n\n\t\t// Set our DTLS role.\n\t\tdtlsParameters.role = localDtlsRole;\n\n\t\t// Update the remote DTLS role in the SDP.\n\t\tthis._remoteSdp!.updateDtlsRole(\n\t\t\tlocalDtlsRole === 'client' ? 'server' : 'client');\n\n\t\t// Need to tell the remote transport about our parameters.\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@connect',\n\t\t\t\t{ dtlsParameters },\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\n\t\tthis._transportReady = true;\n\t}\n\n\tprivate assertSendDirection(): void\n\t{\n\t\tif (this._direction !== 'send')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"send\" direction');\n\t\t}\n\t}\n\n\tprivate assertRecvDirection(): void\n\t{\n\t\tif (this._direction !== 'recv')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"recv\" direction');\n\t\t}\n\t}\n}\n","import * as sdpTransform from 'sdp-transform';\nimport { Logger } from '../Logger';\nimport * as utils from '../utils';\nimport * as ortc from '../ortc';\nimport * as sdpCommonUtils from './sdp/commonUtils';\nimport * as sdpPlanBUtils from './sdp/planBUtils';\nimport {\n\tHandlerFactory,\n\tHandlerInterface,\n\tHandlerRunOptions,\n\tHandlerSendOptions,\n\tHandlerSendResult,\n\tHandlerReceiveOptions,\n\tHandlerReceiveResult,\n\tHandlerSendDataChannelOptions,\n\tHandlerSendDataChannelResult,\n\tHandlerReceiveDataChannelOptions,\n\tHandlerReceiveDataChannelResult\n} from './HandlerInterface';\nimport { RemoteSdp } from './sdp/RemoteSdp';\nimport { IceParameters, DtlsRole } from '../Transport';\nimport { RtpCapabilities, RtpParameters } from '../RtpParameters';\nimport { SctpCapabilities, SctpStreamParameters } from '../SctpParameters';\n\nconst logger = new Logger('Safari11');\n\nconst SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };\n\nexport class Safari11 extends HandlerInterface\n{\n\t// Handler direction.\n\tprivate _direction?: 'send' | 'recv';\n\t// Remote SDP handler.\n\tprivate _remoteSdp?: RemoteSdp;\n\t// Generic sending RTP parameters for audio and video.\n\tprivate _sendingRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Generic sending RTP parameters for audio and video suitable for the SDP\n\t// remote answer.\n\tprivate _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Initial server side DTLS role. If not 'auto', it will force the opposite\n\t// value in client side.\n\tprivate _forcedLocalDtlsRole?: DtlsRole;\n\t// RTCPeerConnection instance.\n\tprivate _pc: any;\n\t// Local stream for sending.\n\tprivate readonly _sendStream = new MediaStream();\n\t// Map of RTCRtpSender indexed by localId.\n\tprivate readonly _mapSendLocalIdRtpSender: Map<string, RTCRtpSender> =\n\t\tnew Map();\n\t// Next sending localId.\n\tprivate _nextSendLocalId = 0;\n\t// Map of MID, RTP parameters and RTCRtpReceiver indexed by local id.\n\t// Value is an Object with mid, rtpParameters and rtpReceiver.\n\tprivate readonly _mapRecvLocalIdInfo:\n\t\tMap<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tmid: string;\n\t\t\t\trtpParameters: RtpParameters;\n\t\t\t\trtpReceiver: RTCRtpReceiver;\n\t\t\t}\n\t\t> = new Map();\n\t// Whether a DataChannel m=application section has been created.\n\tprivate _hasDataChannelMediaSection = false;\n\t// Sending DataChannel id value counter. Incremented for each new DataChannel.\n\tprivate _nextSendSctpStreamId = 0;\n\t// Got transport local and remote parameters.\n\tprivate _transportReady = false;\n\n\t/**\n\t * Creates a factory function.\n\t */\n\tstatic createFactory(): HandlerFactory\n\t{\n\t\treturn (): Safari11 => new Safari11();\n\t}\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tget name(): string\n\t{\n\t\treturn 'Safari11';\n\t}\n\n\tclose(): void\n\t{\n\t\tlogger.debug('close()');\n\n\t\t// Close RTCPeerConnection.\n\t\tif (this._pc)\n\t\t{\n\t\t\ttry { this._pc.close(); }\n\t\t\tcatch (error) {}\n\t\t}\n\n\t\tthis.emit('@close');\n\t}\n\n\tasync getNativeRtpCapabilities(): Promise<RtpCapabilities>\n\t{\n\t\tlogger.debug('getNativeRtpCapabilities()');\n\n\t\tconst pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : [],\n\t\t\t\ticeTransportPolicy : 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'plan-b'\n\t\t\t});\n\n\t\ttry\n\t\t{\n\t\t\tconst offer = await pc.createOffer(\n\t\t\t\t{\n\t\t\t\t\tofferToReceiveAudio : true,\n\t\t\t\t\tofferToReceiveVideo : true\n\t\t\t\t});\n\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error) {}\n\n\t\t\tconst sdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst nativeRtpCapabilities =\n\t\t\t\tsdpCommonUtils.extractRtpCapabilities({ sdpObject });\n\n\t\t\treturn nativeRtpCapabilities;\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error2) {}\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync getNativeSctpCapabilities(): Promise<SctpCapabilities>\n\t{\n\t\tlogger.debug('getNativeSctpCapabilities()');\n\n\t\treturn {\n\t\t\tnumStreams : SCTP_NUM_STREAMS\n\t\t};\n\t}\n\n\trun(\n\t\t{\n\t\t\tdirection,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\textendedRtpCapabilities\n\t\t}: HandlerRunOptions\n\t): void\n\t{\n\t\tlogger.debug('run()');\n\n\t\tthis._direction = direction;\n\n\t\tthis._remoteSdp = new RemoteSdp(\n\t\t\t{\n\t\t\t\ticeParameters,\n\t\t\t\ticeCandidates,\n\t\t\t\tdtlsParameters,\n\t\t\t\tsctpParameters,\n\t\t\t\tplanB : true\n\t\t\t});\n\n\t\tthis._sendingRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tthis._sendingRemoteRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tif (dtlsParameters.role && dtlsParameters.role !== 'auto')\n\t\t{\n\t\t\tthis._forcedLocalDtlsRole = dtlsParameters.role === 'server'\n\t\t\t\t? 'client'\n\t\t\t\t: 'server';\n\t\t}\n\n\t\tthis._pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : iceServers || [],\n\t\t\t\ticeTransportPolicy : iceTransportPolicy || 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\t...additionalSettings\n\t\t\t},\n\t\t\tproprietaryConstraints);\n\n\t\tif (this._pc.connectionState)\n\t\t{\n\t\t\tthis._pc.addEventListener('connectionstatechange', () =>\n\t\t\t{\n\t\t\t\tthis.emit('@connectionstatechange', this._pc.connectionState);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._pc.addEventListener('iceconnectionstatechange', () =>\n\t\t\t{\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'run() | pc.connectionState not supported, using pc.iceConnectionState');\n\n\t\t\t\tswitch (this._pc.iceConnectionState)\n\t\t\t\t{\n\t\t\t\t\tcase 'checking':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connecting');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'connected':\n\t\t\t\t\tcase 'completed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'failed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'failed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'disconnected':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'disconnected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'closed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync updateIceServers(iceServers: RTCIceServer[]): Promise<void>\n\t{\n\t\tlogger.debug('updateIceServers()');\n\n\t\tconst configuration = this._pc.getConfiguration();\n\n\t\tconfiguration.iceServers = iceServers;\n\n\t\tthis._pc.setConfiguration(configuration);\n\t}\n\n\tasync restartIce(iceParameters: IceParameters): Promise<void>\n\t{\n\t\tlogger.debug('restartIce()');\n\n\t\t// Provide the remote SDP handler with new remote ICE parameters.\n\t\tthis._remoteSdp!.updateIceParameters(iceParameters);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._direction === 'send')\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer({ iceRestart: true });\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\t\t}\n\t}\n\n\tasync getTransportStats(): Promise<RTCStatsReport>\n\t{\n\t\treturn this._pc.getStats();\n\t}\n\n\tasync send(\n\t\t{ track, encodings, codecOptions, codec }: HandlerSendOptions\n\t): Promise<HandlerSendResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);\n\n\t\tif (codec)\n\t\t{\n\t\t\tlogger.warn(\n\t\t\t\t'send() | codec selection is not available in %s handler',\n\t\t\t\tthis.name);\n\t\t}\n\n\t\tthis._sendStream.addTrack(track);\n\t\tthis._pc.addTrack(track, this._sendStream);\n\n\t\tlet offer = await this._pc.createOffer();\n\t\tlet localSdpObject = sdpTransform.parse(offer.sdp);\n\t\tlet offerMediaObject;\n\t\tconst sendingRtpParameters =\n\t\t\tutils.clone(this._sendingRtpParametersByKind![track.kind], {});\n\n\t\tsendingRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRtpParameters.codecs);\n\n\t\tconst sendingRemoteRtpParameters =\n\t\t\tutils.clone(this._sendingRemoteRtpParametersByKind![track.kind], {});\n\n\t\tsendingRemoteRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRemoteRtpParameters.codecs);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tif (track.kind === 'video' && encodings && encodings.length > 1)\n\t\t{\n\t\t\tlogger.debug('send() | enabling simulcast');\n\n\t\t\tlocalSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tofferMediaObject = localSdpObject.media.find(\n\t\t\t\t(m: any) => m.type === 'video');\n\n\t\t\tsdpPlanBUtils.addLegacySimulcast(\n\t\t\t\t{\n\t\t\t\t\tofferMediaObject,\n\t\t\t\t\ttrack,\n\t\t\t\t\tnumStreams : encodings.length\n\t\t\t\t});\n\n\t\t\toffer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) };\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\tofferMediaObject = localSdpObject.media\n\t\t\t.find((m: any) => m.type === track.kind);\n\n\t\t// Set RTCP CNAME.\n\t\tsendingRtpParameters.rtcp.cname =\n\t\t\tsdpCommonUtils.getCname({ offerMediaObject });\n\n\t\t// Set RTP encodings.\n\t\tsendingRtpParameters.encodings =\n\t\t\tsdpPlanBUtils.getRtpEncodings({ offerMediaObject, track });\n\n\t\t// Complete encodings with given values.\n\t\tif (encodings)\n\t\t{\n\t\t\tfor (let idx = 0; idx < sendingRtpParameters.encodings.length; ++idx)\n\t\t\t{\n\t\t\t\tif (encodings[idx])\n\t\t\t\t{\n\t\t\t\t\tObject.assign(sendingRtpParameters.encodings[idx], encodings[idx]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If VP8 and there is effective simulcast, add scalabilityMode to each\n\t\t// encoding.\n\t\tif (\n\t\t\tsendingRtpParameters.encodings.length > 1 &&\n\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8'\n\t\t)\n\t\t{\n\t\t\tfor (const encoding of sendingRtpParameters.encodings)\n\t\t\t{\n\t\t\t\tencoding.scalabilityMode = 'L1T3';\n\t\t\t}\n\t\t}\n\n\t\tthis._remoteSdp!.send(\n\t\t\t{\n\t\t\t\tofferMediaObject,\n\t\t\t\tofferRtpParameters : sendingRtpParameters,\n\t\t\t\tanswerRtpParameters : sendingRemoteRtpParameters,\n\t\t\t\tcodecOptions\n\t\t\t});\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\tconst localId = String(this._nextSendLocalId);\n\n\t\tthis._nextSendLocalId++;\n\n\t\tconst rtpSender = this._pc.getSenders()\n\t\t\t.find((s: RTCRtpSender) => s.track === track);\n\n\t\t// Insert into the map.\n\t\tthis._mapSendLocalIdRtpSender.set(localId, rtpSender);\n\n\t\treturn {\n\t\t\tlocalId : localId,\n\t\t\trtpParameters : sendingRtpParameters,\n\t\t\trtpSender\n\t\t};\n\t}\n\n\tasync stopSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst rtpSender = this._mapSendLocalIdRtpSender.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpSender not found');\n\t\t}\n\n\t\tif (rtpSender.track)\n\t\t{\n\t\t\tthis._sendStream.removeTrack(rtpSender.track);\n\t\t}\n\n\t\tthis._mapSendLocalIdRtpSender.delete(localId);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\ttry\n\t\t{\n\t\t\tawait this._pc.setLocalDescription(offer);\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\t// NOTE: If there are no sending tracks, setLocalDescription() will fail with\n\t\t\t// \"Failed to create channels\". If so, ignore it.\n\t\t\tif (this._sendStream.getTracks().length === 0)\n\t\t\t{\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'stopSending() | ignoring expected error due no sending tracks: %s',\n\t\t\t\t\t(error as Error).toString());\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (this._pc.signalingState === 'stable')\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync pauseSending(localId: string): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync resumeSending(localId: string): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync replaceTrack(\n\t\tlocalId: string, track: MediaStreamTrack | null\n\t): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tif (track)\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'replaceTrack() [localId:%s, track.id:%s]', localId, track.id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.debug('replaceTrack() [localId:%s, no track]', localId);\n\t\t}\n\n\t\tconst rtpSender = this._mapSendLocalIdRtpSender.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpSender not found');\n\t\t}\n\n\t\tconst oldTrack = rtpSender.track;\n\n\t\tawait rtpSender.replaceTrack(track);\n\n\t\t// Remove the old track from the local stream.\n\t\tif (oldTrack)\n\t\t{\n\t\t\tthis._sendStream.removeTrack(oldTrack);\n\t\t}\n\n\t\t// Add the new track to the local stream.\n\t\tif (track)\n\t\t{\n\t\t\tthis._sendStream.addTrack(track);\n\t\t}\n\t}\n\n\tasync setMaxSpatialLayer(localId: string, spatialLayer: number): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() [localId:%s, spatialLayer:%s]',\n\t\t\tlocalId, spatialLayer);\n\n\t\tconst rtpSender = this._mapSendLocalIdRtpSender.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpSender not found');\n\t\t}\n\n\t\tconst parameters = rtpSender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tif (idx <= spatialLayer)\n\t\t\t{\n\t\t\t\tencoding.active = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tencoding.active = false;\n\t\t\t}\n\t\t});\n\n\t\tawait rtpSender.setParameters(parameters);\n\t}\n\n\tasync setRtpEncodingParameters(localId: string, params: any): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() [localId:%s, params:%o]',\n\t\t\tlocalId, params);\n\n\t\tconst rtpSender = this._mapSendLocalIdRtpSender.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpSender not found');\n\t\t}\n\n\t\tconst parameters = rtpSender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tparameters.encodings[idx] = { ...encoding, ...params };\n\t\t});\n\n\t\tawait rtpSender.setParameters(parameters);\n\t}\n\n\tasync getSenderStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst rtpSender = this._mapSendLocalIdRtpSender.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpSender not found');\n\t\t}\n\n\t\treturn rtpSender.getStats();\n\t}\n\n\tasync sendDataChannel(\n\t\t{\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tlabel,\n\t\t\tprotocol\n\t\t}: HandlerSendDataChannelOptions\n\t): Promise<HandlerSendDataChannelResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : this._nextSendSctpStreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('sendDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// Increase next id.\n\t\tthis._nextSendSctpStreamId =\n\t\t\t++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS;\n\n\t\t// If this is the first DataChannel we need to create the SDP answer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer();\n\t\t\tconst localSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst offerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => m.type === 'application');\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tthis._remoteSdp!.sendSctpAssociation({ offerMediaObject });\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\tconst sctpStreamParameters: SctpStreamParameters =\n\t\t{\n\t\t\tstreamId : options.id,\n\t\t\tordered : options.ordered,\n\t\t\tmaxPacketLifeTime : options.maxPacketLifeTime,\n\t\t\tmaxRetransmits : options.maxRetransmits\n\t\t};\n\n\t\treturn { dataChannel, sctpStreamParameters };\n\t}\n\n\tasync receive(\n\t\toptionsList: HandlerReceiveOptions[]\n\t) : Promise<HandlerReceiveResult[]>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst results: HandlerReceiveResult[] = [];\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, kind, rtpParameters, streamId } = options;\n\n\t\t\tlogger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);\n\n\t\t\tconst mid = kind;\n\n\t\t\tthis._remoteSdp!.receive(\n\t\t\t\t{\n\t\t\t\t\tmid,\n\t\t\t\t\tkind,\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tstreamId : streamId || rtpParameters.rtcp!.cname!,\n\t\t\t\t\ttrackId\n\t\t\t\t});\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tlet answer = await this._pc.createAnswer();\n\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { kind, rtpParameters } = options;\n\t\t\tconst mid = kind;\n\t\t\tconst answerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => String(m.mid) === mid);\n\n\t\t\t// May need to modify codec parameters in the answer based on codec\n\t\t\t// parameters in the offer.\n\t\t\tsdpCommonUtils.applyCodecParameters(\n\t\t\t\t{\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tanswerMediaObject\n\t\t\t\t});\n\t\t}\n\n\t\tanswer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { kind, trackId, rtpParameters } = options;\n\t\t\tconst mid = kind;\n\t\t\tconst localId = trackId;\n\n\t\t\tconst rtpReceiver = this._pc.getReceivers()\n\t\t\t\t.find((r: RTCRtpReceiver) => r.track && r.track.id === localId);\n\n\t\t\tif (!rtpReceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('new RTCRtpReceiver not');\n\t\t\t}\n\n\t\t\t// Insert into the map.\n\t\t\tthis._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters, rtpReceiver });\n\n\t\t\tresults.push({\n\t\t\t\tlocalId,\n\t\t\t\ttrack : rtpReceiver.track,\n\t\t\t\trtpReceiver\n\t\t\t});\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stopReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('stopReceiving() [localId:%s]', localId);\n\n\t\t\tconst { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) || {};\n\n\t\t\t// Remove from the map.\n\t\t\tthis._mapRecvLocalIdInfo.delete(localId);\n\n\t\t\tthis._remoteSdp!.planBStopReceiving(\n\t\t\t\t{ mid: mid!, offerRtpParameters: rtpParameters! });\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync getReceiverStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst { rtpReceiver } = this._mapRecvLocalIdInfo.get(localId) || {};\n\n\t\tif (!rtpReceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpReceiver not found');\n\t\t}\n\n\t\treturn rtpReceiver.getStats();\n\t}\n\n\tasync pauseReceiving(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalIds: string[]): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync resumeReceiving(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalIds: string[]): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync receiveDataChannel(\n\t\t{ sctpStreamParameters, label, protocol }: HandlerReceiveDataChannelOptions\n\t): Promise<HandlerReceiveDataChannelResult>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst {\n\t\t\tstreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits\n\t\t} = sctpStreamParameters;\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : streamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('receiveDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// If this is the first DataChannel we need to create the SDP offer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tthis._remoteSdp!.receiveSctpAssociation({ oldDataChannelSpec: true });\n\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\treturn { dataChannel };\n\t}\n\n\tprivate async setupTransport(\n\t\t{\n\t\t\tlocalDtlsRole,\n\t\t\tlocalSdpObject\n\t\t}:\n\t\t{\n\t\t\tlocalDtlsRole: DtlsRole;\n\t\t\tlocalSdpObject?: any;\n\t\t}\n\t): Promise<void>\n\t{\n\t\tif (!localSdpObject)\n\t\t{\n\t\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\t}\n\n\t\t// Get our local DTLS parameters.\n\t\tconst dtlsParameters =\n\t\t\tsdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject });\n\n\t\t// Set our DTLS role.\n\t\tdtlsParameters.role = localDtlsRole;\n\n\t\t// Update the remote DTLS role in the SDP.\n\t\tthis._remoteSdp!.updateDtlsRole(\n\t\t\tlocalDtlsRole === 'client' ? 'server' : 'client');\n\n\t\t// Need to tell the remote transport about our parameters.\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@connect',\n\t\t\t\t{ dtlsParameters },\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\n\t\tthis._transportReady = true;\n\t}\n\n\tprivate assertSendDirection(): void\n\t{\n\t\tif (this._direction !== 'send')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"send\" direction');\n\t\t}\n\t}\n\n\tprivate assertRecvDirection(): void\n\t{\n\t\tif (this._direction !== 'recv')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"recv\" direction');\n\t\t}\n\t}\n}\n","import * as utils from '../../utils';\nimport { RtpCapabilities, RtpParameters } from '../../RtpParameters';\n\n/**\n * Normalize ORTC based Edge's RTCRtpReceiver.getCapabilities() to produce a full\n * compliant ORTC RTCRtpCapabilities.\n */\nexport function getCapabilities(): RtpCapabilities\n{\n\tconst nativeCaps = (RTCRtpReceiver as any).getCapabilities();\n\tconst caps = utils.clone(nativeCaps, {});\n\n\tfor (const codec of caps.codecs)\n\t{\n\t\t// Rename numChannels to channels.\n\t\tcodec.channels = codec.numChannels;\n\t\tdelete codec.numChannels;\n\n\t\t// Add mimeType.\n\t\tcodec.mimeType = codec.mimeType || `${codec.kind}/${codec.name}`;\n\n\t\t// NOTE: Edge sets some numeric parameters as string rather than number. Fix them.\n\t\tif (codec.parameters)\n\t\t{\n\t\t\tconst parameters = codec.parameters;\n\n\t\t\tif (parameters.apt)\n\t\t\t{\n\t\t\t\tparameters.apt = Number(parameters.apt);\n\t\t\t}\n\n\t\t\tif (parameters['packetization-mode'])\n\t\t\t{\n\t\t\t\tparameters['packetization-mode'] = Number(parameters['packetization-mode']);\n\t\t\t}\n\t\t}\n\n\t\t// Delete emty parameter String in rtcpFeedback.\n\t\tfor (const feedback of codec.rtcpFeedback || [])\n\t\t{\n\t\t\tif (!feedback.parameter)\n\t\t\t{\n\t\t\t\tfeedback.parameter = '';\n\t\t\t}\n\t\t}\n\t}\n\n\treturn caps;\n}\n\n/**\n * Generate RTCRtpParameters as ORTC based Edge likes.\n */\nexport function mangleRtpParameters(rtpParameters: RtpParameters): RtpParameters\n{\n\tconst params = utils.clone(rtpParameters, {});\n\n\t// Rename mid to muxId.\n\tif (params.mid)\n\t{\n\t\tparams.muxId = params.mid;\n\t\tdelete params.mid;\n\t}\n\n\tfor (const codec of params.codecs)\n\t{\n\t\t// Rename channels to numChannels.\n\t\tif (codec.channels)\n\t\t{\n\t\t\tcodec.numChannels = codec.channels;\n\t\t\tdelete codec.channels;\n\t\t}\n\n\t\t// Add codec.name (requried by Edge).\n\t\tif (codec.mimeType && !codec.name)\n\t\t{\n\t\t\tcodec.name = codec.mimeType.split('/')[1];\n\t\t}\n\n\t\t// Remove mimeType.\n\t\tdelete codec.mimeType;\n\t}\n\n\treturn params;\n}\n","import { Logger } from '../Logger';\nimport { UnsupportedError } from '../errors';\nimport * as utils from '../utils';\nimport * as ortc from '../ortc';\nimport * as edgeUtils from './ortc/edgeUtils';\nimport {\n\tHandlerFactory,\n\tHandlerInterface,\n\tHandlerRunOptions,\n\tHandlerSendOptions,\n\tHandlerSendResult,\n\tHandlerReceiveOptions,\n\tHandlerReceiveResult,\n\tHandlerSendDataChannelOptions,\n\tHandlerSendDataChannelResult,\n\tHandlerReceiveDataChannelOptions,\n\tHandlerReceiveDataChannelResult\n} from './HandlerInterface';\nimport {\n\tIceParameters,\n\tIceCandidate,\n\tDtlsParameters,\n\tDtlsRole\n} from '../Transport';\nimport { RtpCapabilities, RtpParameters } from '../RtpParameters';\nimport { SctpCapabilities } from '../SctpParameters';\n\nconst logger = new Logger('Edge11');\n\nexport class Edge11 extends HandlerInterface\n{\n\t// Generic sending RTP parameters for audio and video.\n\tprivate _sendingRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Transport remote ICE parameters.\n\tprivate _remoteIceParameters?: IceParameters;\n\t// Transport remote ICE candidates.\n\tprivate _remoteIceCandidates?: IceCandidate[];\n\t// Transport remote DTLS parameters.\n\tprivate _remoteDtlsParameters?: DtlsParameters;\n\t// ICE gatherer.\n\tprivate _iceGatherer?: any;\n\t// ICE transport.\n\tprivate _iceTransport?: any;\n\t// DTLS transport.\n\tprivate _dtlsTransport?: any;\n\t// Map of RTCRtpSenders indexed by id.\n\tprivate readonly _rtpSenders: Map<string, RTCRtpSender> = new Map();\n\t// Map of RTCRtpReceivers indexed by id.\n\tprivate readonly _rtpReceivers: Map<string, RTCRtpReceiver> = new Map();\n\t// Next localId for sending tracks.\n\tprivate _nextSendLocalId = 0;\n\t// Local RTCP CNAME.\n\tprivate _cname?: string;\n\t// Got transport local and remote parameters.\n\tprivate _transportReady = false;\n\n\t/**\n\t * Creates a factory function.\n\t */\n\tstatic createFactory(): HandlerFactory\n\t{\n\t\treturn (): Edge11 => new Edge11();\n\t}\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tget name(): string\n\t{\n\t\treturn 'Edge11';\n\t}\n\n\tclose(): void\n\t{\n\t\tlogger.debug('close()');\n\n\t\t// Close the ICE gatherer.\n\t\t// NOTE: Not yet implemented by Edge.\n\t\ttry { this._iceGatherer.close(); }\n\t\tcatch (error) {}\n\n\t\t// Close the ICE transport.\n\t\ttry { this._iceTransport.stop(); }\n\t\tcatch (error) {}\n\n\t\t// Close the DTLS transport.\n\t\ttry { this._dtlsTransport.stop(); }\n\t\tcatch (error) {}\n\n\t\t// Close RTCRtpSenders.\n\t\tfor (const rtpSender of this._rtpSenders.values())\n\t\t{\n\t\t\ttry { (rtpSender as any).stop(); }\n\t\t\tcatch (error) {}\n\t\t}\n\n\t\t// Close RTCRtpReceivers.\n\t\tfor (const rtpReceiver of this._rtpReceivers.values())\n\t\t{\n\t\t\ttry { (rtpReceiver as any).stop(); }\n\t\t\tcatch (error) {}\n\t\t}\n\n\t\tthis.emit('@close');\n\t}\n\n\tasync getNativeRtpCapabilities(): Promise<RtpCapabilities>\n\t{\n\t\tlogger.debug('getNativeRtpCapabilities()');\n\n\t\treturn edgeUtils.getCapabilities();\n\t}\n\n\tasync getNativeSctpCapabilities(): Promise<SctpCapabilities>\n\t{\n\t\tlogger.debug('getNativeSctpCapabilities()');\n\n\t\treturn {\n\t\t\tnumStreams : { OS: 0, MIS: 0 }\n\t\t};\n\t}\n\n\trun(\n\t\t{\n\t\t\tdirection, // eslint-disable-line @typescript-eslint/no-unused-vars\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters, // eslint-disable-line @typescript-eslint/no-unused-vars\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings, // eslint-disable-line @typescript-eslint/no-unused-vars\n\t\t\tproprietaryConstraints, // eslint-disable-line @typescript-eslint/no-unused-vars\n\t\t\textendedRtpCapabilities\n\t\t}: HandlerRunOptions\n\t): void\n\t{\n\t\tlogger.debug('run()');\n\n\t\tthis._sendingRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tthis._remoteIceParameters = iceParameters;\n\t\tthis._remoteIceCandidates = iceCandidates;\n\t\tthis._remoteDtlsParameters = dtlsParameters;\n\t\tthis._cname = `CNAME-${utils.generateRandomNumber()}`;\n\n\t\tthis.setIceGatherer({ iceServers, iceTransportPolicy });\n\t\tthis.setIceTransport();\n\t\tthis.setDtlsTransport();\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync updateIceServers(iceServers: RTCIceServer[]): Promise<void>\n\t{\n\t\t// NOTE: Edge 11 does not implement iceGatherer.gater().\n\t\tthrow new UnsupportedError('not supported');\n\t}\n\n\tasync restartIce(iceParameters: IceParameters): Promise<void>\n\t{\n\t\tlogger.debug('restartIce()');\n\n\t\tthis._remoteIceParameters = iceParameters;\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.debug('restartIce() | calling iceTransport.start()');\n\n\t\tthis._iceTransport.start(\n\t\t\tthis._iceGatherer, iceParameters, 'controlling');\n\n\t\tfor (const candidate of this._remoteIceCandidates!)\n\t\t{\n\t\t\tthis._iceTransport.addRemoteCandidate(candidate);\n\t\t}\n\n\t\tthis._iceTransport.addRemoteCandidate({});\n\t}\n\n\tasync getTransportStats(): Promise<RTCStatsReport>\n\t{\n\t\treturn this._iceTransport.getStats();\n\t}\n\n\tasync send(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\t{ track, encodings, codecOptions, codec }: HandlerSendOptions\n\t): Promise<HandlerSendResult>\n\t{\n\t\tlogger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport({ localDtlsRole: 'server' });\n\t\t}\n\n\t\tlogger.debug('send() | calling new RTCRtpSender()');\n\n\t\tconst rtpSender = new (RTCRtpSender as any)(track, this._dtlsTransport);\n\t\tconst rtpParameters =\n\t\t\tutils.clone(this._sendingRtpParametersByKind![track.kind], {});\n\n\t\trtpParameters.codecs = ortc.reduceCodecs(rtpParameters.codecs, codec);\n\n\t\tconst useRtx = rtpParameters.codecs\n\t\t\t.some((_codec: any) => /.+\\/rtx$/i.test(_codec.mimeType));\n\n\t\tif (!encodings)\n\t\t{\n\t\t\tencodings = [ {} ];\n\t\t}\n\n\t\tfor (const encoding of encodings)\n\t\t{\n\t\t\tencoding.ssrc = utils.generateRandomNumber();\n\n\t\t\tif (useRtx)\n\t\t\t{\n\t\t\t\tencoding.rtx = { ssrc: utils.generateRandomNumber() };\n\t\t\t}\n\t\t}\n\n\t\trtpParameters.encodings = encodings;\n\n\t\t// Fill RTCRtpParameters.rtcp.\n\t\trtpParameters.rtcp =\n\t\t{\n\t\t\tcname : this._cname!,\n\t\t\treducedSize : true,\n\t\t\tmux : true\n\t\t};\n\n\t\t// NOTE: Convert our standard RTCRtpParameters into those that Edge\n\t\t// expects.\n\t\tconst edgeRtpParameters = edgeUtils.mangleRtpParameters(rtpParameters);\n\n\t\tlogger.debug(\n\t\t\t'send() | calling rtpSender.send() [params:%o]',\n\t\t\tedgeRtpParameters);\n\n\t\tawait rtpSender.send(edgeRtpParameters);\n\n\t\tconst localId = String(this._nextSendLocalId);\n\n\t\tthis._nextSendLocalId++;\n\n\t\t// Store it.\n\t\tthis._rtpSenders.set(localId, rtpSender);\n\n\t\treturn { localId, rtpParameters, rtpSender };\n\t}\n\n\tasync stopSending(localId: string): Promise<void>\n\t{\n\t\tlogger.debug('stopSending() [localId:%s]', localId);\n\n\t\tconst rtpSender = this._rtpSenders.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('RTCRtpSender not found');\n\t\t}\n\n\t\tthis._rtpSenders.delete(localId);\n\n\t\ttry\n\t\t{\n\t\t\tlogger.debug('stopSending() | calling rtpSender.stop()');\n\n\t\t\t(rtpSender as any).stop();\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\tlogger.warn('stopSending() | rtpSender.stop() failed:%o', error);\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync pauseSending(localId: string): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync resumeSending(localId: string): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync replaceTrack(\n\t\tlocalId: string, track: MediaStreamTrack | null\n\t): Promise<void>\n\t{\n\t\tif (track)\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'replaceTrack() [localId:%s, track.id:%s]', localId, track.id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.debug('replaceTrack() [localId:%s, no track]', localId);\n\t\t}\n\n\t\tconst rtpSender = this._rtpSenders.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('RTCRtpSender not found');\n\t\t}\n\n\t\t(rtpSender as any).setTrack(track);\n\t}\n\n\tasync setMaxSpatialLayer(localId: string, spatialLayer: number): Promise<void>\n\t{\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() [localId:%s, spatialLayer:%s]',\n\t\t\tlocalId, spatialLayer);\n\n\t\tconst rtpSender = this._rtpSenders.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('RTCRtpSender not found');\n\t\t}\n\n\t\tconst parameters = rtpSender.getParameters();\n\n\t\tparameters.encodings\n\t\t\t.forEach((encoding, idx) =>\n\t\t\t{\n\t\t\t\tif (idx <= spatialLayer)\n\t\t\t\t{\n\t\t\t\t\tencoding.active = true;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tencoding.active = false;\n\t\t\t\t}\n\t\t\t});\n\n\t\tawait rtpSender.setParameters(parameters);\n\t}\n\n\tasync setRtpEncodingParameters(localId: string, params: any): Promise<void>\n\t{\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() [localId:%s, params:%o]',\n\t\t\tlocalId, params);\n\n\t\tconst rtpSender = this._rtpSenders.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('RTCRtpSender not found');\n\t\t}\n\n\t\tconst parameters = rtpSender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: any, idx: number) =>\n\t\t{\n\t\t\tparameters.encodings[idx] = { ...encoding, ...params };\n\t\t});\n\n\t\tawait rtpSender.setParameters(parameters);\n\t}\n\n\tasync getSenderStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tconst rtpSender = this._rtpSenders.get(localId);\n\n\t\tif (!rtpSender)\n\t\t{\n\t\t\tthrow new Error('RTCRtpSender not found');\n\t\t}\n\n\t\treturn rtpSender.getStats();\n\t}\n\n\tasync sendDataChannel(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\toptions: HandlerSendDataChannelOptions\n\t): Promise<HandlerSendDataChannelResult>\n\t{\n\t\tthrow new UnsupportedError('not implemented');\n\t}\n\n\tasync receive(\n\t\toptionsList: HandlerReceiveOptions[]\n\t) : Promise<HandlerReceiveResult[]>\n\t{\n\t\tconst results: HandlerReceiveResult[] = [];\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, kind } = options;\n\n\t\t\tlogger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);\n\t\t}\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport({ localDtlsRole: 'server' });\n\t\t}\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, kind, rtpParameters } = options;\n\n\t\t\tlogger.debug('receive() | calling new RTCRtpReceiver()');\n\n\t\t\tconst rtpReceiver = new (RTCRtpReceiver as any)(this._dtlsTransport, kind);\n\n\t\t\trtpReceiver.addEventListener('error', (event: any) =>\n\t\t\t{\n\t\t\t\tlogger.error('rtpReceiver \"error\" event [event:%o]', event);\n\t\t\t});\n\n\t\t\t// NOTE: Convert our standard RTCRtpParameters into those that Edge\n\t\t\t// expects.\n\t\t\tconst edgeRtpParameters =\n\t\t\t\tedgeUtils.mangleRtpParameters(rtpParameters);\n\n\t\t\tlogger.debug(\n\t\t\t\t'receive() | calling rtpReceiver.receive() [params:%o]',\n\t\t\t\tedgeRtpParameters);\n\n\t\t\tawait rtpReceiver.receive(edgeRtpParameters);\n\n\t\t\tconst localId = trackId;\n\n\t\t\t// Store it.\n\t\t\tthis._rtpReceivers.set(localId, rtpReceiver);\n\n\t\t\tresults.push({\n\t\t\t\tlocalId,\n\t\t\t\ttrack : rtpReceiver.track,\n\t\t\t\trtpReceiver\n\t\t\t});\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stopReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('stopReceiving() [localId:%s]', localId);\n\n\t\t\tconst rtpReceiver = this._rtpReceivers.get(localId);\n\n\t\t\tif (!rtpReceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('RTCRtpReceiver not found');\n\t\t\t}\n\n\t\t\tthis._rtpReceivers.delete(localId);\n\n\t\t\ttry\n\t\t\t{\n\t\t\t\tlogger.debug('stopReceiving() | calling rtpReceiver.stop()');\n\n\t\t\t\t(rtpReceiver as any).stop();\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{\n\t\t\t\tlogger.warn('stopReceiving() | rtpReceiver.stop() failed:%o', error);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync pauseReceiving(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalIds: string[]): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync resumeReceiving(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalIds: string[]): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync getReceiverStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tconst rtpReceiver = this._rtpReceivers.get(localId);\n\n\t\tif (!rtpReceiver)\n\t\t{\n\t\t\tthrow new Error('RTCRtpReceiver not found');\n\t\t}\n\n\t\treturn rtpReceiver.getStats();\n\t}\n\n\tasync receiveDataChannel(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\toptions: HandlerReceiveDataChannelOptions\n\t): Promise<HandlerReceiveDataChannelResult>\n\t{\n\t\tthrow new UnsupportedError('not implemented');\n\t}\n\n\tprivate setIceGatherer(\n\t\t{ iceServers, iceTransportPolicy }:\n\t\t{ iceServers?: any[]; iceTransportPolicy?: RTCIceTransportPolicy }\n\t): void\n\t{\n\t\t// @ts-ignore\n\t\tconst iceGatherer = new (RTCIceGatherer as any)(\n\t\t\t{\n\t\t\t\ticeServers : iceServers || [],\n\t\t\t\tgatherPolicy : iceTransportPolicy || 'all'\n\t\t\t});\n\n\t\ticeGatherer.addEventListener('error', (event: any) =>\n\t\t{\n\t\t\tlogger.error('iceGatherer \"error\" event [event:%o]', event);\n\t\t});\n\n\t\t// NOTE: Not yet implemented by Edge, which starts gathering automatically.\n\t\ttry\n\t\t{\n\t\t\ticeGatherer.gather();\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'setIceGatherer() | iceGatherer.gather() failed: %s',\n\t\t\t\t(error as Error).toString());\n\t\t}\n\n\t\tthis._iceGatherer = iceGatherer;\n\t}\n\n\tprivate setIceTransport(): void\n\t{\n\t\tconst iceTransport = new (RTCIceTransport as any)(this._iceGatherer);\n\n\t\t// NOTE: Not yet implemented by Edge.\n\t\ticeTransport.addEventListener('statechange', () =>\n\t\t{\n\t\t\tswitch (iceTransport.state)\n\t\t\t{\n\t\t\t\tcase 'checking':\n\t\t\t\t\tthis.emit('@connectionstatechange', 'connecting');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'connected':\n\t\t\t\tcase 'completed':\n\t\t\t\t\tthis.emit('@connectionstatechange', 'connected');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'failed':\n\t\t\t\t\tthis.emit('@connectionstatechange', 'failed');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'disconnected':\n\t\t\t\t\tthis.emit('@connectionstatechange', 'disconnected');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'closed':\n\t\t\t\t\tthis.emit('@connectionstatechange', 'closed');\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\n\t\t// NOTE: Not standard, but implemented by Edge.\n\t\ticeTransport.addEventListener('icestatechange', () =>\n\t\t{\n\t\t\tswitch (iceTransport.state)\n\t\t\t{\n\t\t\t\tcase 'checking':\n\t\t\t\t\tthis.emit('@connectionstatechange', 'connecting');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'connected':\n\t\t\t\tcase 'completed':\n\t\t\t\t\tthis.emit('@connectionstatechange', 'connected');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'failed':\n\t\t\t\t\tthis.emit('@connectionstatechange', 'failed');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'disconnected':\n\t\t\t\t\tthis.emit('@connectionstatechange', 'disconnected');\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'closed':\n\t\t\t\t\tthis.emit('@connectionstatechange', 'closed');\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\n\t\ticeTransport.addEventListener('candidatepairchange', (event: any) =>\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'iceTransport \"candidatepairchange\" event [pair:%o]', event.pair);\n\t\t});\n\n\t\tthis._iceTransport = iceTransport;\n\t}\n\n\tprivate setDtlsTransport(): void\n\t{\n\t\tconst dtlsTransport = new (RTCDtlsTransport as any)(this._iceTransport);\n\n\t\t// NOTE: Not yet implemented by Edge.\n\t\tdtlsTransport.addEventListener('statechange', () =>\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'dtlsTransport \"statechange\" event [state:%s]', dtlsTransport.state);\n\t\t});\n\n\t\t// NOTE: Not standard, but implemented by Edge.\n\t\tdtlsTransport.addEventListener('dtlsstatechange', () =>\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'dtlsTransport \"dtlsstatechange\" event [state:%s]', dtlsTransport.state);\n\n\t\t\tif (dtlsTransport.state === 'closed')\n\t\t\t{\n\t\t\t\tthis.emit('@connectionstatechange', 'closed');\n\t\t\t}\n\t\t});\n\n\t\tdtlsTransport.addEventListener('error', (event: any) =>\n\t\t{\n\t\t\tlogger.error('dtlsTransport \"error\" event [event:%o]', event);\n\t\t});\n\n\t\tthis._dtlsTransport = dtlsTransport;\n\t}\n\n\tprivate async setupTransport(\n\t\t{ localDtlsRole }:\n\t\t{ localDtlsRole: DtlsRole }\n\t): Promise<void>\n\t{\n\t\tlogger.debug('setupTransport()');\n\n\t\t// Get our local DTLS parameters.\n\t\tconst dtlsParameters = this._dtlsTransport.getLocalParameters();\n\n\t\tdtlsParameters.role = localDtlsRole;\n\n\t\t// Need to tell the remote transport about our parameters.\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@connect',\n\t\t\t\t{ dtlsParameters },\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\n\t\t// Start the RTCIceTransport.\n\t\tthis._iceTransport.start(\n\t\t\tthis._iceGatherer, this._remoteIceParameters, 'controlling');\n\n\t\t// Add remote ICE candidates.\n\t\tfor (const candidate of this._remoteIceCandidates!)\n\t\t{\n\t\t\tthis._iceTransport.addRemoteCandidate(candidate);\n\t\t}\n\n\t\t// Also signal a 'complete' candidate as per spec.\n\t\t// NOTE: It should be {complete: true} but Edge prefers {}.\n\t\t// NOTE: If we don't signal end of candidates, the Edge RTCIceTransport\n\t\t// won't enter the 'completed' state.\n\t\tthis._iceTransport.addRemoteCandidate({});\n\n\t\t// NOTE: Edge does not like SHA less than 256.\n\t\tthis._remoteDtlsParameters!.fingerprints = this._remoteDtlsParameters!.fingerprints\n\t\t\t.filter((fingerprint: any) =>\n\t\t\t{\n\t\t\t\treturn (\n\t\t\t\t\tfingerprint.algorithm === 'sha-256' ||\n\t\t\t\t\tfingerprint.algorithm === 'sha-384' ||\n\t\t\t\t\tfingerprint.algorithm === 'sha-512'\n\t\t\t\t);\n\t\t\t});\n\n\t\t// Start the RTCDtlsTransport.\n\t\tthis._dtlsTransport.start(this._remoteDtlsParameters);\n\n\t\tthis._transportReady = true;\n\t}\n}\n","import * as sdpTransform from 'sdp-transform';\nimport { Logger } from '../Logger';\nimport * as utils from '../utils';\nimport * as ortc from '../ortc';\nimport * as sdpCommonUtils from './sdp/commonUtils';\nimport * as sdpUnifiedPlanUtils from './sdp/unifiedPlanUtils';\nimport * as ortcUtils from './ortc/utils';\nimport {\n\tHandlerFactory,\n\tHandlerInterface,\n\tHandlerRunOptions,\n\tHandlerSendOptions,\n\tHandlerSendResult,\n\tHandlerReceiveOptions,\n\tHandlerReceiveResult,\n\tHandlerSendDataChannelOptions,\n\tHandlerSendDataChannelResult,\n\tHandlerReceiveDataChannelOptions,\n\tHandlerReceiveDataChannelResult\n} from './HandlerInterface';\nimport { RemoteSdp } from './sdp/RemoteSdp';\nimport { parse as parseScalabilityMode } from '../scalabilityModes';\nimport { IceParameters, DtlsRole } from '../Transport';\nimport {\n\tRtpCapabilities,\n\tRtpParameters,\n\tRtpEncodingParameters\n} from '../RtpParameters';\nimport { SctpCapabilities, SctpStreamParameters } from '../SctpParameters';\n\nconst logger = new Logger('ReactNativeUnifiedPlan');\n\nconst SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };\n\nexport class ReactNativeUnifiedPlan extends HandlerInterface\n{\n\t// Handler direction.\n\tprivate _direction?: 'send' | 'recv';\n\t// Remote SDP handler.\n\tprivate _remoteSdp?: RemoteSdp;\n\t// Generic sending RTP parameters for audio and video.\n\tprivate _sendingRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Generic sending RTP parameters for audio and video suitable for the SDP\n\t// remote answer.\n\tprivate _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Initial server side DTLS role. If not 'auto', it will force the opposite\n\t// value in client side.\n\tprivate _forcedLocalDtlsRole?: DtlsRole;\n\t// RTCPeerConnection instance.\n\tprivate _pc: any;\n\t// Map of RTCTransceivers indexed by MID.\n\tprivate readonly _mapMidTransceiver: Map<string, RTCRtpTransceiver> =\n\t\tnew Map();\n\t// Local stream for sending.\n\tprivate readonly _sendStream = new MediaStream();\n\t// Whether a DataChannel m=application section has been created.\n\tprivate _hasDataChannelMediaSection = false;\n\t// Sending DataChannel id value counter. Incremented for each new DataChannel.\n\tprivate _nextSendSctpStreamId = 0;\n\t// Got transport local and remote parameters.\n\tprivate _transportReady = false;\n\n\t/**\n\t * Creates a factory function.\n\t */\n\tstatic createFactory(): HandlerFactory\n\t{\n\t\treturn (): ReactNativeUnifiedPlan => new ReactNativeUnifiedPlan();\n\t}\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tget name(): string\n\t{\n\t\treturn 'ReactNativeUnifiedPlan';\n\t}\n\n\tclose(): void\n\t{\n\t\tlogger.debug('close()');\n\n\t\t// Free/dispose native MediaStream but DO NOT free/dispose native\n\t\t// MediaStreamTracks (that is parent's business).\n\t\t// @ts-ignore (proprietary API in react-native-webrtc).\n\t\tthis._sendStream.release(/* releaseTracks */ false);\n\n\t\t// Close RTCPeerConnection.\n\t\tif (this._pc)\n\t\t{\n\t\t\ttry { this._pc.close(); }\n\t\t\tcatch (error) {}\n\t\t}\n\n\t\tthis.emit('@close');\n\t}\n\n\tasync getNativeRtpCapabilities(): Promise<RtpCapabilities>\n\t{\n\t\tlogger.debug('getNativeRtpCapabilities()');\n\n\t\tconst pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : [],\n\t\t\t\ticeTransportPolicy : 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'unified-plan'\n\t\t\t});\n\n\t\ttry\n\t\t{\n\t\t\tpc.addTransceiver('audio');\n\t\t\tpc.addTransceiver('video');\n\n\t\t\tconst offer = await pc.createOffer();\n\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error) {}\n\n\t\t\tconst sdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst nativeRtpCapabilities =\n\t\t\t\tsdpCommonUtils.extractRtpCapabilities({ sdpObject });\n\n\t\t\t// libwebrtc supports NACK for OPUS but doesn't announce it.\n\t\t\tortcUtils.addNackSuppportForOpus(nativeRtpCapabilities);\n\n\t\t\treturn nativeRtpCapabilities;\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error2) {}\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync getNativeSctpCapabilities(): Promise<SctpCapabilities>\n\t{\n\t\tlogger.debug('getNativeSctpCapabilities()');\n\n\t\treturn {\n\t\t\tnumStreams : SCTP_NUM_STREAMS\n\t\t};\n\t}\n\n\trun(\n\t\t{\n\t\t\tdirection,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\textendedRtpCapabilities\n\t\t}: HandlerRunOptions\n\t): void\n\t{\n\t\tlogger.debug('run()');\n\n\t\tthis._direction = direction;\n\n\t\tthis._remoteSdp = new RemoteSdp(\n\t\t\t{\n\t\t\t\ticeParameters,\n\t\t\t\ticeCandidates,\n\t\t\t\tdtlsParameters,\n\t\t\t\tsctpParameters\n\t\t\t});\n\n\t\tthis._sendingRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tthis._sendingRemoteRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tif (dtlsParameters.role && dtlsParameters.role !== 'auto')\n\t\t{\n\t\t\tthis._forcedLocalDtlsRole = dtlsParameters.role === 'server'\n\t\t\t\t? 'client'\n\t\t\t\t: 'server';\n\t\t}\n\n\t\tthis._pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : iceServers || [],\n\t\t\t\ticeTransportPolicy : iceTransportPolicy || 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'unified-plan',\n\t\t\t\t...additionalSettings\n\t\t\t},\n\t\t\tproprietaryConstraints);\n\n\t\tif (this._pc.connectionState)\n\t\t{\n\t\t\tthis._pc.addEventListener('connectionstatechange', () =>\n\t\t\t{\n\t\t\t\tthis.emit('@connectionstatechange', this._pc.connectionState);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._pc.addEventListener('iceconnectionstatechange', () =>\n\t\t\t{\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'run() | pc.connectionState not supported, using pc.iceConnectionState');\n\n\t\t\t\tswitch (this._pc.iceConnectionState)\n\t\t\t\t{\n\t\t\t\t\tcase 'checking':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connecting');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'connected':\n\t\t\t\t\tcase 'completed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'failed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'failed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'disconnected':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'disconnected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'closed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync updateIceServers(iceServers: RTCIceServer[]): Promise<void>\n\t{\n\t\tlogger.debug('updateIceServers()');\n\n\t\tconst configuration = this._pc.getConfiguration();\n\n\t\tconfiguration.iceServers = iceServers;\n\n\t\tthis._pc.setConfiguration(configuration);\n\t}\n\n\tasync restartIce(iceParameters: IceParameters): Promise<void>\n\t{\n\t\tlogger.debug('restartIce()');\n\n\t\t// Provide the remote SDP handler with new remote ICE parameters.\n\t\tthis._remoteSdp!.updateIceParameters(iceParameters);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._direction === 'send')\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer({ iceRestart: true });\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\t\t}\n\t}\n\n\tasync getTransportStats(): Promise<RTCStatsReport>\n\t{\n\t\treturn this._pc.getStats();\n\t}\n\n\tasync send(\n\t\t{ track, encodings, codecOptions, codec }: HandlerSendOptions\n\t): Promise<HandlerSendResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);\n\n\t\tif (encodings && encodings.length > 1)\n\t\t{\n\t\t\tencodings.forEach((encoding: RtpEncodingParameters, idx: number) =>\n\t\t\t{\n\t\t\t\tencoding.rid = `r${idx}`;\n\t\t\t});\n\t\t}\n\n\t\tconst sendingRtpParameters =\n\t\t\tutils.clone(this._sendingRtpParametersByKind![track.kind], {});\n\n\t\t// This may throw.\n\t\tsendingRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRtpParameters.codecs, codec);\n\n\t\tconst sendingRemoteRtpParameters =\n\t\t\tutils.clone(this._sendingRemoteRtpParametersByKind![track.kind], {});\n\n\t\t// This may throw.\n\t\tsendingRemoteRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRemoteRtpParameters.codecs, codec);\n\n\t\tconst mediaSectionIdx = this._remoteSdp!.getNextMediaSectionIdx();\n\t\tconst transceiver = this._pc.addTransceiver(\n\t\t\ttrack,\n\t\t\t{\n\t\t\t\tdirection : 'sendonly',\n\t\t\t\tstreams : [ this._sendStream ],\n\t\t\t\tsendEncodings : encodings\n\t\t\t});\n\t\tlet offer = await this._pc.createOffer();\n\t\tlet localSdpObject = sdpTransform.parse(offer.sdp);\n\t\tlet offerMediaObject;\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\t// Special case for VP9 with SVC.\n\t\tlet hackVp9Svc = false;\n\n\t\tconst layers =\n\t\t\tparseScalabilityMode((encodings || [ {} ])[0].scalabilityMode);\n\n\t\tif (\n\t\t\tencodings &&\n\t\t\tencodings.length === 1 &&\n\t\t\tlayers.spatialLayers > 1 &&\n\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp9'\n\t\t)\n\t\t{\n\t\t\tlogger.debug('send() | enabling legacy simulcast for VP9 SVC');\n\n\t\t\thackVp9Svc = true;\n\t\t\tlocalSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tofferMediaObject = localSdpObject.media[mediaSectionIdx.idx];\n\n\t\t\tsdpUnifiedPlanUtils.addLegacySimulcast(\n\t\t\t\t{\n\t\t\t\t\tofferMediaObject,\n\t\t\t\t\tnumStreams : layers.spatialLayers\n\t\t\t\t});\n\n\t\t\toffer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) };\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t// We can now get the transceiver.mid.\n\t\t// NOTE: We cannot read generated MID on iOS react-native-webrtc 111.0.0\n\t\t// because transceiver.mid is not available until setRemoteDescription()\n\t\t// is called, so this is best effort.\n\t\t// Issue: https://github.com/react-native-webrtc/react-native-webrtc/issues/1404\n\t\t// NOTE: So let's fill MID in sendingRtpParameters later.\n\t\tlet localId = transceiver.mid ?? undefined;\n\n\t\tif (!localId)\n\t\t{\n\t\t\tlogger.warn(\n\t\t\t\t'send() | missing transceiver.mid (bug in react-native-webrtc, using a workaround'\n\t\t\t);\n\t\t}\n\n\t\t// Set MID.\n\t\t// NOTE: As per above, it could be unset yet.\n\t\tsendingRtpParameters.mid = localId;\n\n\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\tofferMediaObject = localSdpObject.media[mediaSectionIdx.idx];\n\n\t\t// Set RTCP CNAME.\n\t\tsendingRtpParameters.rtcp.cname =\n\t\t\tsdpCommonUtils.getCname({ offerMediaObject });\n\n\t\t// Set RTP encodings by parsing the SDP offer if no encodings are given.\n\t\tif (!encodings)\n\t\t{\n\t\t\tsendingRtpParameters.encodings =\n\t\t\t\tsdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject });\n\t\t}\n\t\t// Set RTP encodings by parsing the SDP offer and complete them with given\n\t\t// one if just a single encoding has been given.\n\t\telse if (encodings.length === 1)\n\t\t{\n\t\t\tlet newEncodings =\n\t\t\t\tsdpUnifiedPlanUtils.getRtpEncodings({ offerMediaObject });\n\n\t\t\tObject.assign(newEncodings[0], encodings[0]);\n\n\t\t\t// Hack for VP9 SVC.\n\t\t\tif (hackVp9Svc)\n\t\t\t{\n\t\t\t\tnewEncodings = [ newEncodings[0] ];\n\t\t\t}\n\n\t\t\tsendingRtpParameters.encodings = newEncodings;\n\t\t}\n\t\t// Otherwise if more than 1 encoding are given use them verbatim.\n\t\telse\n\t\t{\n\t\t\tsendingRtpParameters.encodings = encodings;\n\t\t}\n\n\t\t// If VP8 or H264 and there is effective simulcast, add scalabilityMode to\n\t\t// each encoding.\n\t\tif (\n\t\t\tsendingRtpParameters.encodings.length > 1 &&\n\t\t\t(\n\t\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' ||\n\t\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/h264'\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\tfor (const encoding of sendingRtpParameters.encodings)\n\t\t\t{\n\t\t\t\tif (encoding.scalabilityMode)\n\t\t\t\t{\n\t\t\t\t\tencoding.scalabilityMode = `L1T${layers.temporalLayers}`;\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tencoding.scalabilityMode = 'L1T3';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis._remoteSdp!.send(\n\t\t\t{\n\t\t\t\tofferMediaObject,\n\t\t\t\treuseMid : mediaSectionIdx.reuseMid,\n\t\t\t\tofferRtpParameters : sendingRtpParameters,\n\t\t\t\tanswerRtpParameters : sendingRemoteRtpParameters,\n\t\t\t\tcodecOptions,\n\t\t\t\textmapAllowMixed : true\n\t\t\t});\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t// Follow up of iOS react-native-webrtc 111.0.0 issue told above. Now yes,\n\t\t// we can read generated MID (if not done above) and fill sendingRtpParameters.\n\t\tif (!localId)\n\t\t{\n\t\t\tlocalId = transceiver.mid;\n\t\t\tsendingRtpParameters.mid = localId;\n\t\t}\n\n\t\t// Store in the map.\n\t\tthis._mapMidTransceiver.set(localId, transceiver);\n\n\t\treturn {\n\t\t\tlocalId,\n\t\t\trtpParameters : sendingRtpParameters,\n\t\t\trtpSender : transceiver.sender\n\t\t};\n\t}\n\n\tasync stopSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('stopSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.sender.replaceTrack(null);\n\n\t\tthis._pc.removeTrack(transceiver.sender);\n\n\t\tconst mediaSectionClosed =\n\t\t\tthis._remoteSdp!.closeMediaSection(transceiver.mid!);\n\n\t\tif (mediaSectionClosed)\n\t\t{\n\t\t\ttry\n\t\t\t{\n\t\t\t\ttransceiver.stop();\n\t\t\t}\n\t\t\tcatch (error)\n\t\t\t{}\n\t\t}\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\tthis._mapMidTransceiver.delete(localId);\n\t}\n\n\tasync pauseSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('pauseSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.direction = 'inactive';\n\t\tthis._remoteSdp!.pauseMediaSection(localId);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'pauseSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'pauseSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync resumeSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('resumeSending() [localId:%s]', localId);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tthis._remoteSdp!.resumeSendingMediaSection(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\ttransceiver.direction = 'sendonly';\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'resumeSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'resumeSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync replaceTrack(\n\t\tlocalId: string, track: MediaStreamTrack | null\n\t): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tif (track)\n\t\t{\n\t\t\tlogger.debug(\n\t\t\t\t'replaceTrack() [localId:%s, track.id:%s]', localId, track.id);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.debug('replaceTrack() [localId:%s, no track]', localId);\n\t\t}\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tawait transceiver.sender.replaceTrack(track);\n\t}\n\n\tasync setMaxSpatialLayer(localId: string, spatialLayer: number): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() [localId:%s, spatialLayer:%s]',\n\t\t\tlocalId, spatialLayer);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tif (idx <= spatialLayer)\n\t\t\t{\n\t\t\t\tencoding.active = true;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tencoding.active = false;\n\t\t\t}\n\t\t});\n\n\t\tawait transceiver.sender.setParameters(parameters);\n\n\t\tthis._remoteSdp!.muxMediaSectionSimulcast(localId, parameters.encodings);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'setMaxSpatialLayer() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync setRtpEncodingParameters(localId: string, params: any): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() [localId:%s, params:%o]',\n\t\t\tlocalId, params);\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\tconst parameters = transceiver.sender.getParameters();\n\n\t\tparameters.encodings.forEach((encoding: RTCRtpEncodingParameters, idx: number) =>\n\t\t{\n\t\t\tparameters.encodings[idx] = { ...encoding, ...params };\n\t\t});\n\n\t\tawait transceiver.sender.setParameters(parameters);\n\n\t\tthis._remoteSdp!.muxMediaSectionSimulcast(localId, parameters.encodings);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'setRtpEncodingParameters() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\tasync getSenderStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\treturn transceiver.sender.getStats();\n\t}\n\n\tasync sendDataChannel(\n\t\t{\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tlabel,\n\t\t\tprotocol\n\t\t}: HandlerSendDataChannelOptions\n\t): Promise<HandlerSendDataChannelResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : this._nextSendSctpStreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('sendDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// Increase next id.\n\t\tthis._nextSendSctpStreamId =\n\t\t\t++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS;\n\n\t\t// If this is the first DataChannel we need to create the SDP answer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer();\n\t\t\tconst localSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst offerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => m.type === 'application');\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tthis._remoteSdp!.sendSctpAssociation({ offerMediaObject });\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\tconst sctpStreamParameters: SctpStreamParameters =\n\t\t{\n\t\t\tstreamId : options.id,\n\t\t\tordered : options.ordered,\n\t\t\tmaxPacketLifeTime : options.maxPacketLifeTime,\n\t\t\tmaxRetransmits : options.maxRetransmits\n\t\t};\n\n\t\treturn { dataChannel, sctpStreamParameters };\n\t}\n\n\tasync receive(\n\t\toptionsList: HandlerReceiveOptions[]\n\t) : Promise<HandlerReceiveResult[]>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst results: HandlerReceiveResult[] = [];\n\t\tconst mapLocalId: Map<string, string> = new Map();\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, kind, rtpParameters, streamId } = options;\n\n\t\t\tlogger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);\n\n\t\t\tconst localId = rtpParameters.mid || String(this._mapMidTransceiver.size);\n\n\t\t\tmapLocalId.set(trackId, localId);\n\n\t\t\tthis._remoteSdp!.receive(\n\t\t\t\t{\n\t\t\t\t\tmid : localId,\n\t\t\t\t\tkind,\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tstreamId : streamId || rtpParameters.rtcp!.cname!,\n\t\t\t\t\ttrackId\n\t\t\t\t});\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tlet answer = await this._pc.createAnswer();\n\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, rtpParameters } = options;\n\t\t\tconst localId = mapLocalId.get(trackId);\n\t\t\tconst answerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => String(m.mid) === localId);\n\n\t\t\t// May need to modify codec parameters in the answer based on codec\n\t\t\t// parameters in the offer.\n\t\t\tsdpCommonUtils.applyCodecParameters(\n\t\t\t\t{\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tanswerMediaObject\n\t\t\t\t});\n\t\t}\n\n\t\tanswer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId } = options;\n\t\t\tconst localId = mapLocalId.get(trackId)!;\n\t\t\tconst transceiver = this._pc.getTransceivers()\n\t\t\t\t.find((t: RTCRtpTransceiver) => t.mid === localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('new RTCRtpTransceiver not found');\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t// Store in the map.\n\t\t\t\tthis._mapMidTransceiver.set(localId, transceiver);\n\n\t\t\t\tresults.push({\n\t\t\t\t\tlocalId,\n\t\t\t\t\ttrack : transceiver.receiver.track,\n\t\t\t\t\trtpReceiver : transceiver.receiver\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stopReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('stopReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\tthis._remoteSdp!.closeMediaSection(transceiver.mid!);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tthis._mapMidTransceiver.delete(localId);\n\t\t}\n\t}\n\n\tasync pauseReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('pauseReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\ttransceiver.direction = 'inactive';\n\t\t\tthis._remoteSdp!.pauseMediaSection(localId);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'pauseReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'pauseReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync resumeReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('resumeReceiving() [localId:%s]', localId);\n\n\t\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\t\tif (!transceiver)\n\t\t\t{\n\t\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t\t}\n\n\t\t\ttransceiver.direction = 'recvonly';\n\t\t\tthis._remoteSdp!.resumeReceivingMediaSection(localId);\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'resumeReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'resumeReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync getReceiverStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst transceiver = this._mapMidTransceiver.get(localId);\n\n\t\tif (!transceiver)\n\t\t{\n\t\t\tthrow new Error('associated RTCRtpTransceiver not found');\n\t\t}\n\n\t\treturn transceiver.receiver.getStats();\n\t}\n\n\tasync receiveDataChannel(\n\t\t{ sctpStreamParameters, label, protocol }: HandlerReceiveDataChannelOptions\n\t): Promise<HandlerReceiveDataChannelResult>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst {\n\t\t\tstreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits\n\t\t}: SctpStreamParameters = sctpStreamParameters;\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : streamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('receiveDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// If this is the first DataChannel we need to create the SDP offer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tthis._remoteSdp!.receiveSctpAssociation();\n\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\treturn { dataChannel };\n\t}\n\n\tprivate async setupTransport(\n\t\t{\n\t\t\tlocalDtlsRole,\n\t\t\tlocalSdpObject\n\t\t}:\n\t\t{\n\t\t\tlocalDtlsRole: DtlsRole;\n\t\t\tlocalSdpObject?: any;\n\t\t}\n\t): Promise<void>\n\t{\n\t\tif (!localSdpObject)\n\t\t{\n\t\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\t}\n\n\t\t// Get our local DTLS parameters.\n\t\tconst dtlsParameters =\n\t\t\tsdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject });\n\n\t\t// Set our DTLS role.\n\t\tdtlsParameters.role = localDtlsRole;\n\n\t\t// Update the remote DTLS role in the SDP.\n\t\tthis._remoteSdp!.updateDtlsRole(\n\t\t\tlocalDtlsRole === 'client' ? 'server' : 'client');\n\n\t\t// Need to tell the remote transport about our parameters.\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@connect',\n\t\t\t\t{ dtlsParameters },\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\n\t\tthis._transportReady = true;\n\t}\n\n\tprivate assertSendDirection(): void\n\t{\n\t\tif (this._direction !== 'send')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"send\" direction');\n\t\t}\n\t}\n\n\tprivate assertRecvDirection(): void\n\t{\n\t\tif (this._direction !== 'recv')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"recv\" direction');\n\t\t}\n\t}\n}\n","import * as sdpTransform from 'sdp-transform';\nimport { Logger } from '../Logger';\nimport { UnsupportedError } from '../errors';\nimport * as utils from '../utils';\nimport * as ortc from '../ortc';\nimport * as sdpCommonUtils from './sdp/commonUtils';\nimport * as sdpPlanBUtils from './sdp/planBUtils';\nimport {\n\tHandlerFactory,\n\tHandlerInterface,\n\tHandlerRunOptions,\n\tHandlerSendOptions,\n\tHandlerSendResult,\n\tHandlerReceiveOptions,\n\tHandlerReceiveResult,\n\tHandlerSendDataChannelOptions,\n\tHandlerSendDataChannelResult,\n\tHandlerReceiveDataChannelOptions,\n\tHandlerReceiveDataChannelResult\n} from './HandlerInterface';\nimport { RemoteSdp } from './sdp/RemoteSdp';\nimport { IceParameters, DtlsRole } from '../Transport';\nimport { RtpCapabilities, RtpParameters } from '../RtpParameters';\nimport { SctpCapabilities, SctpStreamParameters } from '../SctpParameters';\n\nconst logger = new Logger('ReactNative');\n\nconst SCTP_NUM_STREAMS = { OS: 1024, MIS: 1024 };\n\nexport class ReactNative extends HandlerInterface\n{\n\t// Handler direction.\n\tprivate _direction?: 'send' | 'recv';\n\t// Remote SDP handler.\n\tprivate _remoteSdp?: RemoteSdp;\n\t// Generic sending RTP parameters for audio and video.\n\tprivate _sendingRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Generic sending RTP parameters for audio and video suitable for the SDP\n\t// remote answer.\n\tprivate _sendingRemoteRtpParametersByKind?: { [key: string]: RtpParameters };\n\t// Initial server side DTLS role. If not 'auto', it will force the opposite\n\t// value in client side.\n\tprivate _forcedLocalDtlsRole?: DtlsRole;\n\t// RTCPeerConnection instance.\n\tprivate _pc: any;\n\t// Local stream for sending.\n\tprivate readonly _sendStream = new MediaStream();\n\t// Map of sending MediaStreamTracks indexed by localId.\n\tprivate readonly _mapSendLocalIdTrack: Map<string, MediaStreamTrack> = new Map();\n\t// Next sending localId.\n\tprivate _nextSendLocalId = 0;\n\t// Map of MID, RTP parameters and RTCRtpReceiver indexed by local id.\n\t// Value is an Object with mid, rtpParameters and rtpReceiver.\n\tprivate readonly _mapRecvLocalIdInfo:\n\t\tMap<\n\t\t\tstring,\n\t\t\t{\n\t\t\t\tmid: string;\n\t\t\t\trtpParameters: RtpParameters;\n\t\t\t}\n\t\t> = new Map();\n\t// Whether a DataChannel m=application section has been created.\n\tprivate _hasDataChannelMediaSection = false;\n\t// Sending DataChannel id value counter. Incremented for each new DataChannel.\n\tprivate _nextSendSctpStreamId = 0;\n\t// Got transport local and remote parameters.\n\tprivate _transportReady = false;\n\n\t/**\n\t * Creates a factory function.\n\t */\n\tstatic createFactory(): HandlerFactory\n\t{\n\t\treturn (): ReactNative => new ReactNative();\n\t}\n\n\tconstructor()\n\t{\n\t\tsuper();\n\t}\n\n\tget name(): string\n\t{\n\t\treturn 'ReactNative';\n\t}\n\n\tclose(): void\n\t{\n\t\tlogger.debug('close()');\n\n\t\t// Free/dispose native MediaStream but DO NOT free/dispose native\n\t\t// MediaStreamTracks (that is parent's business).\n\t\t// @ts-ignore (proprietary API in react-native-webrtc).\n\t\tthis._sendStream.release(/* releaseTracks */ false);\n\n\t\t// Close RTCPeerConnection.\n\t\tif (this._pc)\n\t\t{\n\t\t\ttry { this._pc.close(); }\n\t\t\tcatch (error) {}\n\t\t}\n\n\t\tthis.emit('@close');\n\t}\n\n\tasync getNativeRtpCapabilities(): Promise<RtpCapabilities>\n\t{\n\t\tlogger.debug('getNativeRtpCapabilities()');\n\n\t\tconst pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : [],\n\t\t\t\ticeTransportPolicy : 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'plan-b'\n\t\t\t});\n\n\t\ttry\n\t\t{\n\t\t\tconst offer = await pc.createOffer(\n\t\t\t\t{\n\t\t\t\t\tofferToReceiveAudio : true,\n\t\t\t\t\tofferToReceiveVideo : true\n\t\t\t\t});\n\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error) {}\n\n\t\t\tconst sdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst nativeRtpCapabilities =\n\t\t\t\tsdpCommonUtils.extractRtpCapabilities({ sdpObject });\n\n\t\t\treturn nativeRtpCapabilities;\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\ttry { pc.close(); }\n\t\t\tcatch (error2) {}\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\tasync getNativeSctpCapabilities(): Promise<SctpCapabilities>\n\t{\n\t\tlogger.debug('getNativeSctpCapabilities()');\n\n\t\treturn {\n\t\t\tnumStreams : SCTP_NUM_STREAMS\n\t\t};\n\t}\n\n\trun(\n\t\t{\n\t\t\tdirection,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\textendedRtpCapabilities\n\t\t}: HandlerRunOptions\n\t): void\n\t{\n\t\tlogger.debug('run()');\n\n\t\tthis._direction = direction;\n\n\t\tthis._remoteSdp = new RemoteSdp(\n\t\t\t{\n\t\t\t\ticeParameters,\n\t\t\t\ticeCandidates,\n\t\t\t\tdtlsParameters,\n\t\t\t\tsctpParameters,\n\t\t\t\tplanB : true\n\t\t\t});\n\n\t\tthis._sendingRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tthis._sendingRemoteRtpParametersByKind =\n\t\t{\n\t\t\taudio : ortc.getSendingRemoteRtpParameters('audio', extendedRtpCapabilities),\n\t\t\tvideo : ortc.getSendingRemoteRtpParameters('video', extendedRtpCapabilities)\n\t\t};\n\n\t\tif (dtlsParameters.role && dtlsParameters.role !== 'auto')\n\t\t{\n\t\t\tthis._forcedLocalDtlsRole = dtlsParameters.role === 'server'\n\t\t\t\t? 'client'\n\t\t\t\t: 'server';\n\t\t}\n\n\t\tthis._pc = new (RTCPeerConnection as any)(\n\t\t\t{\n\t\t\t\ticeServers : iceServers || [],\n\t\t\t\ticeTransportPolicy : iceTransportPolicy || 'all',\n\t\t\t\tbundlePolicy : 'max-bundle',\n\t\t\t\trtcpMuxPolicy : 'require',\n\t\t\t\tsdpSemantics : 'plan-b',\n\t\t\t\t...additionalSettings\n\t\t\t},\n\t\t\tproprietaryConstraints);\n\n\t\tif (this._pc.connectionState)\n\t\t{\n\t\t\tthis._pc.addEventListener('connectionstatechange', () =>\n\t\t\t{\n\t\t\t\tthis.emit('@connectionstatechange', this._pc.connectionState);\n\t\t\t});\n\t\t}\n\t\telse\n\t\t{\n\t\t\tthis._pc.addEventListener('iceconnectionstatechange', () =>\n\t\t\t{\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'run() | pc.connectionState not supported, using pc.iceConnectionState');\n\n\t\t\t\tswitch (this._pc.iceConnectionState)\n\t\t\t\t{\n\t\t\t\t\tcase 'checking':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connecting');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'connected':\n\t\t\t\t\tcase 'completed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'connected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'failed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'failed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'disconnected':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'disconnected');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'closed':\n\t\t\t\t\t\tthis.emit('@connectionstatechange', 'closed');\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync updateIceServers(iceServers: RTCIceServer[]): Promise<void>\n\t{\n\t\tlogger.debug('updateIceServers()');\n\n\t\tconst configuration = this._pc.getConfiguration();\n\n\t\tconfiguration.iceServers = iceServers;\n\n\t\tthis._pc.setConfiguration(configuration);\n\t}\n\n\tasync restartIce(iceParameters: IceParameters): Promise<void>\n\t{\n\t\tlogger.debug('restartIce()');\n\n\t\t// Provide the remote SDP handler with new remote ICE parameters.\n\t\tthis._remoteSdp!.updateIceParameters(iceParameters);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._direction === 'send')\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer({ iceRestart: true });\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tlogger.debug(\n\t\t\t\t'restartIce() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\t\t}\n\t}\n\n\tasync getTransportStats(): Promise<RTCStatsReport>\n\t{\n\t\treturn this._pc.getStats();\n\t}\n\n\tasync send(\n\t\t{ track, encodings, codecOptions, codec }: HandlerSendOptions\n\t): Promise<HandlerSendResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('send() [kind:%s, track.id:%s]', track.kind, track.id);\n\n\t\tif (codec)\n\t\t{\n\t\t\tlogger.warn(\n\t\t\t\t'send() | codec selection is not available in %s handler',\n\t\t\t\tthis.name);\n\t\t}\n\n\t\tthis._sendStream.addTrack(track);\n\t\tthis._pc.addStream(this._sendStream);\n\n\t\tlet offer = await this._pc.createOffer();\n\t\tlet localSdpObject = sdpTransform.parse(offer.sdp);\n\t\tlet offerMediaObject;\n\t\tconst sendingRtpParameters =\n\t\t\tutils.clone(this._sendingRtpParametersByKind![track.kind], {});\n\n\t\tsendingRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRtpParameters.codecs);\n\n\t\tconst sendingRemoteRtpParameters =\n\t\t\tutils.clone(this._sendingRemoteRtpParametersByKind![track.kind], {});\n\n\t\tsendingRemoteRtpParameters.codecs =\n\t\t\tortc.reduceCodecs(sendingRemoteRtpParameters.codecs);\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tif (track.kind === 'video' && encodings && encodings.length > 1)\n\t\t{\n\t\t\tlogger.debug('send() | enabling simulcast');\n\n\t\t\tlocalSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tofferMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => m.type === 'video');\n\n\t\t\tsdpPlanBUtils.addLegacySimulcast(\n\t\t\t\t{\n\t\t\t\t\tofferMediaObject,\n\t\t\t\t\ttrack,\n\t\t\t\t\tnumStreams : encodings.length\n\t\t\t\t});\n\n\t\t\toffer = { type: 'offer', sdp: sdpTransform.write(localSdpObject) };\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setLocalDescription(offer);\n\n\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\tofferMediaObject = localSdpObject.media\n\t\t\t.find((m: any) => m.type === track.kind);\n\n\t\t// Set RTCP CNAME.\n\t\tsendingRtpParameters.rtcp.cname =\n\t\t\tsdpCommonUtils.getCname({ offerMediaObject });\n\n\t\t// Set RTP encodings.\n\t\tsendingRtpParameters.encodings =\n\t\t\tsdpPlanBUtils.getRtpEncodings({ offerMediaObject, track });\n\n\t\t// Complete encodings with given values.\n\t\tif (encodings)\n\t\t{\n\t\t\tfor (let idx = 0; idx < sendingRtpParameters.encodings.length; ++idx)\n\t\t\t{\n\t\t\t\tif (encodings[idx])\n\t\t\t\t{\n\t\t\t\t\tObject.assign(sendingRtpParameters.encodings[idx], encodings[idx]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If VP8 or H264 and there is effective simulcast, add scalabilityMode to\n\t\t// each encoding.\n\t\tif (\n\t\t\tsendingRtpParameters.encodings.length > 1 &&\n\t\t\t(\n\t\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/vp8' ||\n\t\t\t\tsendingRtpParameters.codecs[0].mimeType.toLowerCase() === 'video/h264'\n\t\t\t)\n\t\t)\n\t\t{\n\t\t\tfor (const encoding of sendingRtpParameters.encodings)\n\t\t\t{\n\t\t\t\tencoding.scalabilityMode = 'L1T3';\n\t\t\t}\n\t\t}\n\n\t\tthis._remoteSdp!.send(\n\t\t\t{\n\t\t\t\tofferMediaObject,\n\t\t\t\tofferRtpParameters : sendingRtpParameters,\n\t\t\t\tanswerRtpParameters : sendingRemoteRtpParameters,\n\t\t\t\tcodecOptions\n\t\t\t});\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'send() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\tconst localId = String(this._nextSendLocalId);\n\n\t\tthis._nextSendLocalId++;\n\n\t\t// Insert into the map.\n\t\tthis._mapSendLocalIdTrack.set(localId, track);\n\n\t\treturn {\n\t\t\tlocalId : localId,\n\t\t\trtpParameters : sendingRtpParameters\n\t\t};\n\t}\n\n\tasync stopSending(localId: string): Promise<void>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tlogger.debug('stopSending() [localId:%s]', localId);\n\n\t\tconst track = this._mapSendLocalIdTrack.get(localId);\n\n\t\tif (!track)\n\t\t{\n\t\t\tthrow new Error('track not found');\n\t\t}\n\n\t\tthis._mapSendLocalIdTrack.delete(localId);\n\t\tthis._sendStream.removeTrack(track);\n\t\tthis._pc.addStream(this._sendStream);\n\n\t\tconst offer = await this._pc.createOffer();\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\ttry\n\t\t{\n\t\t\tawait this._pc.setLocalDescription(offer);\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\t// NOTE: If there are no sending tracks, setLocalDescription() will fail with\n\t\t\t// \"Failed to create channels\". If so, ignore it.\n\t\t\tif (this._sendStream.getTracks().length === 0)\n\t\t\t{\n\t\t\t\tlogger.warn(\n\t\t\t\t\t'stopSending() | ignoring expected error due no sending tracks: %s',\n\t\t\t\t\t(error as Error).toString());\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\n\t\tif (this._pc.signalingState === 'stable')\n\t\t{\n\t\t\treturn;\n\t\t}\n\n\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopSending() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setRemoteDescription(answer);\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync pauseSending(localId: string): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync resumeSending(localId: string): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync replaceTrack(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalId: string, track: MediaStreamTrack | null\n\t): Promise<void>\n\t{\n\t\tthrow new UnsupportedError('not implemented');\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync setMaxSpatialLayer(localId: string, spatialLayer: number): Promise<void>\n\t{\n\t\tthrow new UnsupportedError('not implemented');\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync setRtpEncodingParameters(localId: string, params: any): Promise<void>\n\t{\n\t\tthrow new UnsupportedError('not implemented');\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync getSenderStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthrow new UnsupportedError('not implemented');\n\t}\n\n\tasync sendDataChannel(\n\t\t{\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits,\n\t\t\tlabel,\n\t\t\tprotocol\n\t\t}: HandlerSendDataChannelOptions\n\t): Promise<HandlerSendDataChannelResult>\n\t{\n\t\tthis.assertSendDirection();\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : this._nextSendSctpStreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmitTime : maxPacketLifeTime, // NOTE: Old spec.\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('sendDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// Increase next id.\n\t\tthis._nextSendSctpStreamId =\n\t\t\t++this._nextSendSctpStreamId % SCTP_NUM_STREAMS.MIS;\n\n\t\t// If this is the first DataChannel we need to create the SDP answer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tconst offer = await this._pc.createOffer();\n\t\t\tconst localSdpObject = sdpTransform.parse(offer.sdp);\n\t\t\tconst offerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => m.type === 'application');\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setLocalDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setLocalDescription(offer);\n\n\t\t\tthis._remoteSdp!.sendSctpAssociation({ offerMediaObject });\n\n\t\t\tconst answer = { type: 'answer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'sendDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setRemoteDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\tconst sctpStreamParameters: SctpStreamParameters =\n\t\t{\n\t\t\tstreamId : options.id,\n\t\t\tordered : options.ordered,\n\t\t\tmaxPacketLifeTime : options.maxPacketLifeTime,\n\t\t\tmaxRetransmits : options.maxRetransmits\n\t\t};\n\n\t\treturn { dataChannel, sctpStreamParameters };\n\t}\n\n\tasync receive(\n\t\toptionsList: HandlerReceiveOptions[]\n\t) : Promise<HandlerReceiveResult[]>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst results: HandlerReceiveResult[] = [];\n\t\tconst mapStreamId: Map<string, string> = new Map();\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { trackId, kind, rtpParameters } = options;\n\n\t\t\tlogger.debug('receive() [trackId:%s, kind:%s]', trackId, kind);\n\n\t\t\tconst mid = kind;\n\t\t\tlet streamId = options.streamId || rtpParameters.rtcp!.cname!;\n\n\t\t\t// NOTE: In React-Native we cannot reuse the same remote MediaStream for new\n\t\t\t// remote tracks. This is because react-native-webrtc does not react on new\n\t\t\t// tracks generated within already existing streams, so force the streamId\n\t\t\t// to be different. See:\n\t\t\t// https://github.com/react-native-webrtc/react-native-webrtc/issues/401\n\t\t\tlogger.debug(\n\t\t\t\t'receive() | forcing a random remote streamId to avoid well known bug in react-native-webrtc');\n\n\t\t\tstreamId += `-hack-${utils.generateRandomNumber()}`;\n\n\t\t\tmapStreamId.set(trackId, streamId);\n\n\t\t\tthis._remoteSdp!.receive(\n\t\t\t\t{\n\t\t\t\t\tmid,\n\t\t\t\t\tkind,\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tstreamId,\n\t\t\t\t\ttrackId\n\t\t\t\t});\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tlet answer = await this._pc.createAnswer();\n\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { kind, rtpParameters } = options;\n\t\t\tconst mid = kind;\n\t\t\tconst answerMediaObject = localSdpObject.media\n\t\t\t\t.find((m: any) => String(m.mid) === mid);\n\n\t\t\t// May need to modify codec parameters in the answer based on codec\n\t\t\t// parameters in the offer.\n\t\t\tsdpCommonUtils.applyCodecParameters(\n\t\t\t\t{\n\t\t\t\t\tofferRtpParameters : rtpParameters,\n\t\t\t\t\tanswerMediaObject\n\t\t\t\t});\n\t\t}\n\n\t\tanswer = { type: 'answer', sdp: sdpTransform.write(localSdpObject) };\n\n\t\tif (!this._transportReady)\n\t\t{\n\t\t\tawait this.setupTransport(\n\t\t\t\t{\n\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\tlocalSdpObject\n\t\t\t\t});\n\t\t}\n\n\t\tlogger.debug(\n\t\t\t'receive() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\n\t\tfor (const options of optionsList)\n\t\t{\n\t\t\tconst { kind, trackId, rtpParameters } = options;\n\t\t\tconst localId = trackId;\n\t\t\tconst mid = kind;\n\t\t\tconst streamId = mapStreamId.get(trackId);\n\t\t\tconst stream = this._pc.getRemoteStreams()\n\t\t\t\t.find((s: MediaStream) => s.id === streamId);\n\t\t\tconst track = stream.getTrackById(localId);\n\n\t\t\tif (!track)\n\t\t\t{\n\t\t\t\tthrow new Error('remote track not found');\n\t\t\t}\n\n\t\t\t// Insert into the map.\n\t\t\tthis._mapRecvLocalIdInfo.set(localId, { mid, rtpParameters });\n\n\t\t\tresults.push({ localId, track });\n\t\t}\n\n\t\treturn results;\n\t}\n\n\tasync stopReceiving(localIds: string[]): Promise<void>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tfor (const localId of localIds)\n\t\t{\n\t\t\tlogger.debug('stopReceiving() [localId:%s]', localId);\n\n\t\t\tconst { mid, rtpParameters } = this._mapRecvLocalIdInfo.get(localId) || {};\n\n\t\t\t// Remove from the map.\n\t\t\tthis._mapRecvLocalIdInfo.delete(localId);\n\n\t\t\tthis._remoteSdp!.planBStopReceiving(\n\t\t\t\t{ mid: mid!, offerRtpParameters: rtpParameters! });\n\t\t}\n\n\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\toffer);\n\n\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\tconst answer = await this._pc.createAnswer();\n\n\t\tlogger.debug(\n\t\t\t'stopReceiving() | calling pc.setLocalDescription() [answer:%o]',\n\t\t\tanswer);\n\n\t\tawait this._pc.setLocalDescription(answer);\n\t}\n\n\tasync pauseReceiving(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalIds: string[]): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\tasync resumeReceiving(\n\t\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\t\tlocalIds: string[]): Promise<void>\n\t{\n\t\t// Unimplemented.\n\t}\n\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tasync getReceiverStats(localId: string): Promise<RTCStatsReport>\n\t{\n\t\tthrow new UnsupportedError('not implemented');\n\t}\n\n\tasync receiveDataChannel(\n\t\t{ sctpStreamParameters, label, protocol }: HandlerReceiveDataChannelOptions\n\t): Promise<HandlerReceiveDataChannelResult>\n\t{\n\t\tthis.assertRecvDirection();\n\n\t\tconst {\n\t\t\tstreamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmits\n\t\t} = sctpStreamParameters;\n\n\t\tconst options =\n\t\t{\n\t\t\tnegotiated : true,\n\t\t\tid : streamId,\n\t\t\tordered,\n\t\t\tmaxPacketLifeTime,\n\t\t\tmaxRetransmitTime : maxPacketLifeTime, // NOTE: Old spec.\n\t\t\tmaxRetransmits,\n\t\t\tprotocol\n\t\t};\n\n\t\tlogger.debug('receiveDataChannel() [options:%o]', options);\n\n\t\tconst dataChannel = this._pc.createDataChannel(label, options);\n\n\t\t// If this is the first DataChannel we need to create the SDP offer with\n\t\t// m=application section.\n\t\tif (!this._hasDataChannelMediaSection)\n\t\t{\n\t\t\tthis._remoteSdp!.receiveSctpAssociation({ oldDataChannelSpec: true });\n\n\t\t\tconst offer = { type: 'offer', sdp: this._remoteSdp!.getSdp() };\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [offer:%o]',\n\t\t\t\toffer);\n\n\t\t\tawait this._pc.setRemoteDescription(offer);\n\n\t\t\tconst answer = await this._pc.createAnswer();\n\n\t\t\tif (!this._transportReady)\n\t\t\t{\n\t\t\t\tconst localSdpObject = sdpTransform.parse(answer.sdp);\n\n\t\t\t\tawait this.setupTransport(\n\t\t\t\t\t{\n\t\t\t\t\t\tlocalDtlsRole : this._forcedLocalDtlsRole ?? 'client',\n\t\t\t\t\t\tlocalSdpObject\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tlogger.debug(\n\t\t\t\t'receiveDataChannel() | calling pc.setRemoteDescription() [answer:%o]',\n\t\t\t\tanswer);\n\n\t\t\tawait this._pc.setLocalDescription(answer);\n\n\t\t\tthis._hasDataChannelMediaSection = true;\n\t\t}\n\n\t\treturn { dataChannel };\n\t}\n\n\tprivate async setupTransport(\n\t\t{\n\t\t\tlocalDtlsRole,\n\t\t\tlocalSdpObject\n\t\t}:\n\t\t{\n\t\t\tlocalDtlsRole: DtlsRole;\n\t\t\tlocalSdpObject?: any;\n\t\t}\n\t): Promise<void>\n\t{\n\t\tif (!localSdpObject)\n\t\t{\n\t\t\tlocalSdpObject = sdpTransform.parse(this._pc.localDescription.sdp);\n\t\t}\n\n\t\t// Get our local DTLS parameters.\n\t\tconst dtlsParameters =\n\t\t\tsdpCommonUtils.extractDtlsParameters({ sdpObject: localSdpObject });\n\n\t\t// Set our DTLS role.\n\t\tdtlsParameters.role = localDtlsRole;\n\n\t\t// Update the remote DTLS role in the SDP.\n\t\tthis._remoteSdp!.updateDtlsRole(\n\t\t\tlocalDtlsRole === 'client' ? 'server' : 'client');\n\n\t\t// Need to tell the remote transport about our parameters.\n\t\tawait new Promise<void>((resolve, reject) =>\n\t\t{\n\t\t\tthis.safeEmit(\n\t\t\t\t'@connect',\n\t\t\t\t{ dtlsParameters },\n\t\t\t\tresolve,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\n\t\tthis._transportReady = true;\n\t}\n\n\tprivate assertSendDirection(): void\n\t{\n\t\tif (this._direction !== 'send')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"send\" direction');\n\t\t}\n\t}\n\n\tprivate assertRecvDirection(): void\n\t{\n\t\tif (this._direction !== 'recv')\n\t\t{\n\t\t\tthrow new Error(\n\t\t\t\t'method can just be called for handlers with \"recv\" direction');\n\t\t}\n\t}\n}\n","import { UAParser } from 'ua-parser-js';\nimport { Logger } from './Logger';\nimport { EnhancedEventEmitter } from './EnhancedEventEmitter';\nimport { UnsupportedError, InvalidStateError } from './errors';\nimport * as utils from './utils';\nimport * as ortc from './ortc';\nimport { Transport, TransportOptions, CanProduceByKind } from './Transport';\nimport { HandlerFactory, HandlerInterface } from './handlers/HandlerInterface';\nimport { Chrome111 } from './handlers/Chrome111';\nimport { Chrome74 } from './handlers/Chrome74';\nimport { Chrome70 } from './handlers/Chrome70';\nimport { Chrome67 } from './handlers/Chrome67';\nimport { Chrome55 } from './handlers/Chrome55';\nimport { Firefox60 } from './handlers/Firefox60';\nimport { Safari12 } from './handlers/Safari12';\nimport { Safari11 } from './handlers/Safari11';\nimport { Edge11 } from './handlers/Edge11';\nimport { ReactNativeUnifiedPlan } from './handlers/ReactNativeUnifiedPlan';\nimport { ReactNative } from './handlers/ReactNative';\nimport { RtpCapabilities, MediaKind } from './RtpParameters';\nimport { SctpCapabilities } from './SctpParameters';\nimport { AppData } from './types';\n\nconst logger = new Logger('Device');\n\nexport type BuiltinHandlerName =\n\t| 'Chrome111'\n\t| 'Chrome74'\n\t| 'Chrome70'\n\t| 'Chrome67'\n\t| 'Chrome55'\n\t| 'Firefox60'\n\t| 'Safari12'\n\t| 'Safari11'\n\t| 'Edge11'\n\t| 'ReactNativeUnifiedPlan'\n\t| 'ReactNative';\n\nexport type DeviceOptions =\n{\n\t/**\n\t * The name of one of the builtin handlers.\n\t */\n\thandlerName?: BuiltinHandlerName;\n\t/**\n\t * Custom handler factory.\n\t */\n\thandlerFactory?: HandlerFactory;\n\t/**\n\t * DEPRECATED!\n\t * The name of one of the builtin handlers.\n\t */\n\tHandler?: string;\n};\n\nexport function detectDevice(): BuiltinHandlerName | undefined\n{\n\t// React-Native.\n\t// NOTE: react-native-webrtc >= 1.75.0 is required.\n\t// NOTE: react-native-webrtc with Unified Plan requires version >= 106.0.0.\n\tif (typeof navigator === 'object' && navigator.product === 'ReactNative')\n\t{\n\t\tlogger.debug('detectDevice() | React-Native detected');\n\n\t\tif (typeof RTCPeerConnection === 'undefined')\n\t\t{\n\t\t\tlogger.warn(\n\t\t\t\t'detectDevice() | unsupported react-native-webrtc without RTCPeerConnection, forgot to call registerGlobals()?');\n\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (typeof RTCRtpTransceiver !== 'undefined')\n\t\t{\n\t\t\tlogger.debug('detectDevice() | ReactNative UnifiedPlan handler chosen');\n\n\t\t\treturn 'ReactNativeUnifiedPlan';\n\t\t}\n\t\telse\n\t\t{\n\t\t\tlogger.debug('detectDevice() | ReactNative PlanB handler chosen');\n\n\t\t\treturn 'ReactNative';\n\t\t}\n\t}\n\t// Browser.\n\telse if (typeof navigator === 'object' && typeof navigator.userAgent === 'string')\n\t{\n\t\tconst ua = navigator.userAgent;\n\n\t\tconst uaParser = new UAParser(ua);\n\n\t\tlogger.debug(\n\t\t\t'detectDevice() | browser detected [ua:%s, parsed:%o]',\n\t\t\tua, uaParser.getResult()\n\t\t);\n\n\t\tconst browser = uaParser.getBrowser();\n\t\tconst browserName = browser.name?.toLowerCase() ?? '';\n\t\tconst browserVersion = parseInt(browser.major ?? '0');\n\t\tconst engine = uaParser.getEngine();\n\t\tconst engineName = engine.name?.toLowerCase() ?? '';\n\t\tconst os = uaParser.getOS();\n\t\tconst osName = os.name?.toLowerCase() ?? '';\n\t\tconst osVersion = parseFloat(os.version ?? '0');\n\n\t\tconst isIOS = osName === 'ios';\n\n\t\tconst isChrome =\n\t\t[\n\t\t\t'chrome',\n\t\t\t'chromium',\n\t\t\t'mobile chrome',\n\t\t\t'chrome webview',\n\t\t\t'chrome headless'\n\t\t].includes(browserName);\n\n\t\tconst isFirefox =\n\t\t[\n\t\t\t'firefox',\n\t\t\t'mobile firefox',\n\t\t\t'mobile focus'\n\t\t].includes(browserName);\n\n\t\tconst isSafari =\n\t\t[\n\t\t\t'safari',\n\t\t\t'mobile safari'\n\t\t].includes(browserName);\n\n\t\tconst isEdge = [ 'edge' ].includes(browserName);\n\n\t\t// Chrome, Chromium, and Edge.\n\t\tif ((isChrome || isEdge) && !isIOS && browserVersion >= 111)\n\t\t{\n\t\t\treturn 'Chrome111';\n\t\t}\n\t\telse if (\n\t\t\t(isChrome && !isIOS && browserVersion >= 74) ||\n\t\t\t(isEdge && !isIOS && browserVersion >= 88)\n\t\t)\n\t\t{\n\t\t\treturn 'Chrome74';\n\t\t}\n\t\telse if (isChrome && !isIOS && browserVersion >= 70)\n\t\t{\n\t\t\treturn 'Chrome70';\n\t\t}\n\t\telse if (isChrome && !isIOS && browserVersion >= 67)\n\t\t{\n\t\t\treturn 'Chrome67';\n\t\t}\n\t\telse if (isChrome && !isIOS && browserVersion >= 55)\n\t\t{\n\t\t\treturn 'Chrome55';\n\t\t}\n\t\t// Firefox.\n\t\telse if (isFirefox && !isIOS && browserVersion >= 60)\n\t\t{\n\t\t\treturn 'Firefox60';\n\t\t}\n\t\t// Firefox on iOS (so Safari).\n\t\telse if (isFirefox && isIOS && osVersion >= 14.3)\n\t\t{\n\t\t\treturn 'Safari12';\n\t\t}\n\t\t// Safari with Unified-Plan support enabled.\n\t\telse if (\n\t\t\tisSafari &&\n\t\t\tbrowserVersion >= 12 &&\n\t\t\ttypeof RTCRtpTransceiver !== 'undefined' &&\n\t\t\tRTCRtpTransceiver.prototype.hasOwnProperty('currentDirection')\n\t\t)\n\t\t{\n\t\t\treturn 'Safari12';\n\t\t}\n\t\t// Safari with Plab-B support.\n\t\telse if (isSafari && browserVersion >= 11)\n\t\t{\n\t\t\treturn 'Safari11';\n\t\t}\n\t\t// Old Edge with ORTC support.\n\t\telse if (isEdge && !isIOS && browserVersion >= 11 && browserVersion <= 18)\n\t\t{\n\t\t\treturn 'Edge11';\n\t\t}\n\t\t// Best effort for WebKit based browsers in iOS.\n\t\telse if (\n\t\t\tengineName === 'webkit' &&\n\t\t\tisIOS &&\n\t\t\tosVersion >= 14.3 &&\n\t\t\ttypeof RTCRtpTransceiver !== 'undefined' &&\n\t\t\tRTCRtpTransceiver.prototype.hasOwnProperty('currentDirection'))\n\t\t{\n\t\t\treturn 'Safari12';\n\t\t}\n\t\t// Best effort for Chromium based browsers.\n\t\telse if (engineName === 'blink')\n\t\t{\n\t\t\tconst match = ua.match(/(?:(?:Chrome|Chromium))[ /](\\w+)/i);\n\n\t\t\tif (match)\n\t\t\t{\n\t\t\t\tconst version = Number(match[1]);\n\n\t\t\t\tif (version >= 111)\n\t\t\t\t{\n\t\t\t\t\treturn 'Chrome111';\n\t\t\t\t}\n\t\t\t\telse if (version >= 74)\n\t\t\t\t{\n\t\t\t\t\treturn 'Chrome74';\n\t\t\t\t}\n\t\t\t\telse if (version >= 70)\n\t\t\t\t{\n\t\t\t\t\treturn 'Chrome70';\n\t\t\t\t}\n\t\t\t\telse if (version >= 67)\n\t\t\t\t{\n\t\t\t\t\treturn 'Chrome67';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\treturn 'Chrome55';\n\t\t\t\t}\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn 'Chrome111';\n\t\t\t}\n\t\t}\n\t\t// Unsupported browser.\n\t\telse\n\t\t{\n\t\t\tlogger.warn(\n\t\t\t\t'detectDevice() | browser not supported [name:%s, version:%s]',\n\t\t\t\tbrowserName, browserVersion);\n\n\t\t\treturn undefined;\n\t\t}\n\t}\n\t// Unknown device.\n\telse\n\t{\n\t\tlogger.warn('detectDevice() | unknown device');\n\n\t\treturn undefined;\n\t}\n}\n\nexport type DeviceObserverEvents =\n{\n\tnewtransport: [Transport];\n};\n\nexport class Device\n{\n\t// RTC handler factory.\n\tprivate readonly _handlerFactory: HandlerFactory;\n\t// Handler name.\n\tprivate readonly _handlerName: string;\n\t// Loaded flag.\n\tprivate _loaded = false;\n\t// Extended RTP capabilities.\n\tprivate _extendedRtpCapabilities?: any;\n\t// Local RTP capabilities for receiving media.\n\tprivate _recvRtpCapabilities?: RtpCapabilities;\n\t// Whether we can produce audio/video based on computed extended RTP\n\t// capabilities.\n\tprivate readonly _canProduceByKind: CanProduceByKind;\n\t// Local SCTP capabilities.\n\tprivate _sctpCapabilities?: SctpCapabilities;\n\t// Observer instance.\n\tprotected readonly _observer = new EnhancedEventEmitter<DeviceObserverEvents>();\n\n\t/**\n\t * Create a new Device to connect to mediasoup server.\n\t *\n\t * @throws {UnsupportedError} if device is not supported.\n\t */\n\tconstructor({ handlerName, handlerFactory, Handler }: DeviceOptions = {})\n\t{\n\t\tlogger.debug('constructor()');\n\n\t\t// Handle deprecated option.\n\t\tif (Handler)\n\t\t{\n\t\t\tlogger.warn(\n\t\t\t\t'constructor() | Handler option is DEPRECATED, use handlerName or handlerFactory instead');\n\n\t\t\tif (typeof Handler === 'string')\n\t\t\t{\n\t\t\t\thandlerName = Handler as BuiltinHandlerName;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthrow new TypeError(\n\t\t\t\t\t'non string Handler option no longer supported, use handlerFactory instead');\n\t\t\t}\n\t\t}\n\n\t\tif (handlerName && handlerFactory)\n\t\t{\n\t\t\tthrow new TypeError('just one of handlerName or handlerInterface can be given');\n\t\t}\n\n\t\tif (handlerFactory)\n\t\t{\n\t\t\tthis._handlerFactory = handlerFactory;\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (handlerName)\n\t\t\t{\n\t\t\t\tlogger.debug('constructor() | handler given: %s', handlerName);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\thandlerName = detectDevice();\n\n\t\t\t\tif (handlerName)\n\t\t\t\t{\n\t\t\t\t\tlogger.debug('constructor() | detected handler: %s', handlerName);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthrow new UnsupportedError('device not supported');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tswitch (handlerName)\n\t\t\t{\n\t\t\t\tcase 'Chrome111':\n\t\t\t\t\tthis._handlerFactory = Chrome111.createFactory();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Chrome74':\n\t\t\t\t\tthis._handlerFactory = Chrome74.createFactory();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Chrome70':\n\t\t\t\t\tthis._handlerFactory = Chrome70.createFactory();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Chrome67':\n\t\t\t\t\tthis._handlerFactory = Chrome67.createFactory();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Chrome55':\n\t\t\t\t\tthis._handlerFactory = Chrome55.createFactory();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Firefox60':\n\t\t\t\t\tthis._handlerFactory = Firefox60.createFactory();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Safari12':\n\t\t\t\t\tthis._handlerFactory = Safari12.createFactory();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Safari11':\n\t\t\t\t\tthis._handlerFactory = Safari11.createFactory();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Edge11':\n\t\t\t\t\tthis._handlerFactory = Edge11.createFactory();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ReactNativeUnifiedPlan':\n\t\t\t\t\tthis._handlerFactory = ReactNativeUnifiedPlan.createFactory();\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'ReactNative':\n\t\t\t\t\tthis._handlerFactory = ReactNative.createFactory();\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new TypeError(`unknown handlerName \"${handlerName}\"`);\n\t\t\t}\n\t\t}\n\n\t\t// Create a temporal handler to get its name.\n\t\tconst handler = this._handlerFactory();\n\n\t\tthis._handlerName = handler.name;\n\n\t\thandler.close();\n\n\t\tthis._extendedRtpCapabilities = undefined;\n\t\tthis._recvRtpCapabilities = undefined;\n\t\tthis._canProduceByKind =\n\t\t{\n\t\t\taudio : false,\n\t\t\tvideo : false\n\t\t};\n\t\tthis._sctpCapabilities = undefined;\n\t}\n\n\t/**\n\t * The RTC handler name.\n\t */\n\tget handlerName(): string\n\t{\n\t\treturn this._handlerName;\n\t}\n\n\t/**\n\t * Whether the Device is loaded.\n\t */\n\tget loaded(): boolean\n\t{\n\t\treturn this._loaded;\n\t}\n\n\t/**\n\t * RTP capabilities of the Device for receiving media.\n\t *\n\t * @throws {InvalidStateError} if not loaded.\n\t */\n\tget rtpCapabilities(): RtpCapabilities\n\t{\n\t\tif (!this._loaded)\n\t\t{\n\t\t\tthrow new InvalidStateError('not loaded');\n\t\t}\n\n\t\treturn this._recvRtpCapabilities!;\n\t}\n\n\t/**\n\t * SCTP capabilities of the Device.\n\t *\n\t * @throws {InvalidStateError} if not loaded.\n\t */\n\tget sctpCapabilities(): SctpCapabilities\n\t{\n\t\tif (!this._loaded)\n\t\t{\n\t\t\tthrow new InvalidStateError('not loaded');\n\t\t}\n\n\t\treturn this._sctpCapabilities!;\n\t}\n\n\tget observer(): EnhancedEventEmitter\n\t{\n\t\treturn this._observer;\n\t}\n\n\t/**\n\t * Initialize the Device.\n\t */\n\tasync load(\n\t\t{ routerRtpCapabilities }:\n\t\t{ routerRtpCapabilities: RtpCapabilities }\n\t): Promise<void>\n\t{\n\t\tlogger.debug('load() [routerRtpCapabilities:%o]', routerRtpCapabilities);\n\n\t\trouterRtpCapabilities = utils.clone(routerRtpCapabilities, undefined);\n\n\t\t// Temporal handler to get its capabilities.\n\t\tlet handler: HandlerInterface | undefined;\n\n\t\ttry\n\t\t{\n\t\t\tif (this._loaded)\n\t\t\t{\n\t\t\t\tthrow new InvalidStateError('already loaded');\n\t\t\t}\n\n\t\t\t// This may throw.\n\t\t\tortc.validateRtpCapabilities(routerRtpCapabilities);\n\n\t\t\thandler = this._handlerFactory();\n\n\t\t\tconst nativeRtpCapabilities = await handler.getNativeRtpCapabilities();\n\n\t\t\tlogger.debug(\n\t\t\t\t'load() | got native RTP capabilities:%o', nativeRtpCapabilities);\n\n\t\t\t// This may throw.\n\t\t\tortc.validateRtpCapabilities(nativeRtpCapabilities);\n\n\t\t\t// Get extended RTP capabilities.\n\t\t\tthis._extendedRtpCapabilities = ortc.getExtendedRtpCapabilities(\n\t\t\t\tnativeRtpCapabilities, routerRtpCapabilities);\n\n\t\t\tlogger.debug(\n\t\t\t\t'load() | got extended RTP capabilities:%o',\n\t\t\t\tthis._extendedRtpCapabilities);\n\n\t\t\t// Check whether we can produce audio/video.\n\t\t\tthis._canProduceByKind.audio =\n\t\t\t\tortc.canSend('audio', this._extendedRtpCapabilities);\n\t\t\tthis._canProduceByKind.video =\n\t\t\t\tortc.canSend('video', this._extendedRtpCapabilities);\n\n\t\t\t// Generate our receiving RTP capabilities for receiving media.\n\t\t\tthis._recvRtpCapabilities =\n\t\t\t\tortc.getRecvRtpCapabilities(this._extendedRtpCapabilities);\n\n\t\t\t// This may throw.\n\t\t\tortc.validateRtpCapabilities(this._recvRtpCapabilities);\n\n\t\t\tlogger.debug(\n\t\t\t\t'load() | got receiving RTP capabilities:%o',\n\t\t\t\tthis._recvRtpCapabilities);\n\n\t\t\t// Generate our SCTP capabilities.\n\t\t\tthis._sctpCapabilities = await handler.getNativeSctpCapabilities();\n\n\t\t\tlogger.debug(\n\t\t\t\t'load() | got native SCTP capabilities:%o', this._sctpCapabilities);\n\n\t\t\t// This may throw.\n\t\t\tortc.validateSctpCapabilities(this._sctpCapabilities);\n\n\t\t\tlogger.debug('load() succeeded');\n\n\t\t\tthis._loaded = true;\n\n\t\t\thandler.close();\n\t\t}\n\t\tcatch (error)\n\t\t{\n\t\t\tif (handler)\n\t\t\t{\n\t\t\t\thandler.close();\n\t\t\t}\n\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Whether we can produce audio/video.\n\t *\n\t * @throws {InvalidStateError} if not loaded.\n\t * @throws {TypeError} if wrong arguments.\n\t */\n\tcanProduce(kind: MediaKind): boolean\n\t{\n\t\tif (!this._loaded)\n\t\t{\n\t\t\tthrow new InvalidStateError('not loaded');\n\t\t}\n\t\telse if (kind !== 'audio' && kind !== 'video')\n\t\t{\n\t\t\tthrow new TypeError(`invalid kind \"${kind}\"`);\n\t\t}\n\n\t\treturn this._canProduceByKind[kind];\n\t}\n\n\t/**\n\t * Creates a Transport for sending media.\n\t *\n\t * @throws {InvalidStateError} if not loaded.\n\t * @throws {TypeError} if wrong arguments.\n\t */\n\tcreateSendTransport<TransportAppData extends AppData = AppData>(\n\t\t{\n\t\t\tid,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\tappData\n\t\t}: TransportOptions<TransportAppData>\n\t): Transport<TransportAppData>\n\t{\n\t\tlogger.debug('createSendTransport()');\n\n\t\treturn this.createTransport<TransportAppData>(\n\t\t\t{\n\t\t\t\tdirection : 'send',\n\t\t\t\tid : id,\n\t\t\t\ticeParameters : iceParameters,\n\t\t\t\ticeCandidates : iceCandidates,\n\t\t\t\tdtlsParameters : dtlsParameters,\n\t\t\t\tsctpParameters : sctpParameters,\n\t\t\t\ticeServers : iceServers,\n\t\t\t\ticeTransportPolicy : iceTransportPolicy,\n\t\t\t\tadditionalSettings : additionalSettings,\n\t\t\t\tproprietaryConstraints : proprietaryConstraints,\n\t\t\t\tappData : appData\n\t\t\t});\n\t}\n\n\t/**\n\t * Creates a Transport for receiving media.\n\t *\n\t * @throws {InvalidStateError} if not loaded.\n\t * @throws {TypeError} if wrong arguments.\n\t */\n\tcreateRecvTransport<TransportAppData extends AppData = AppData>(\n\t\t{\n\t\t\tid,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\tappData\n\t\t}: TransportOptions<TransportAppData>\n\t): Transport<TransportAppData>\n\t{\n\t\tlogger.debug('createRecvTransport()');\n\n\t\treturn this.createTransport<TransportAppData>(\n\t\t\t{\n\t\t\t\tdirection : 'recv',\n\t\t\t\tid : id,\n\t\t\t\ticeParameters : iceParameters,\n\t\t\t\ticeCandidates : iceCandidates,\n\t\t\t\tdtlsParameters : dtlsParameters,\n\t\t\t\tsctpParameters : sctpParameters,\n\t\t\t\ticeServers : iceServers,\n\t\t\t\ticeTransportPolicy : iceTransportPolicy,\n\t\t\t\tadditionalSettings : additionalSettings,\n\t\t\t\tproprietaryConstraints : proprietaryConstraints,\n\t\t\t\tappData : appData\n\t\t\t});\n\t}\n\n\tprivate createTransport<TransportAppData extends AppData>(\n\t\t{\n\t\t\tdirection,\n\t\t\tid,\n\t\t\ticeParameters,\n\t\t\ticeCandidates,\n\t\t\tdtlsParameters,\n\t\t\tsctpParameters,\n\t\t\ticeServers,\n\t\t\ticeTransportPolicy,\n\t\t\tadditionalSettings,\n\t\t\tproprietaryConstraints,\n\t\t\tappData\n\t\t}:\n\t\t{\n\t\t\tdirection: 'send' | 'recv';\n\t\t} & TransportOptions<TransportAppData>\n\t): Transport<TransportAppData>\n\t{\n\t\tif (!this._loaded)\n\t\t{\n\t\t\tthrow new InvalidStateError('not loaded');\n\t\t}\n\t\telse if (typeof id !== 'string')\n\t\t{\n\t\t\tthrow new TypeError('missing id');\n\t\t}\n\t\telse if (typeof iceParameters !== 'object')\n\t\t{\n\t\t\tthrow new TypeError('missing iceParameters');\n\t\t}\n\t\telse if (!Array.isArray(iceCandidates))\n\t\t{\n\t\t\tthrow new TypeError('missing iceCandidates');\n\t\t}\n\t\telse if (typeof dtlsParameters !== 'object')\n\t\t{\n\t\t\tthrow new TypeError('missing dtlsParameters');\n\t\t}\n\t\telse if (sctpParameters && typeof sctpParameters !== 'object')\n\t\t{\n\t\t\tthrow new TypeError('wrong sctpParameters');\n\t\t}\n\t\telse if (appData && typeof appData !== 'object')\n\t\t{\n\t\t\tthrow new TypeError('if given, appData must be an object');\n\t\t}\n\n\t\t// Create a new Transport.\n\t\tconst transport = new Transport<TransportAppData>(\n\t\t\t{\n\t\t\t\tdirection,\n\t\t\t\tid,\n\t\t\t\ticeParameters,\n\t\t\t\ticeCandidates,\n\t\t\t\tdtlsParameters,\n\t\t\t\tsctpParameters,\n\t\t\t\ticeServers,\n\t\t\t\ticeTransportPolicy,\n\t\t\t\tadditionalSettings,\n\t\t\t\tproprietaryConstraints,\n\t\t\t\tappData,\n\t\t\t\thandlerFactory : this._handlerFactory,\n\t\t\t\textendedRtpCapabilities : this._extendedRtpCapabilities,\n\t\t\t\tcanProduceByKind : this._canProduceByKind\n\t\t\t});\n\n\t\t// Emit observer event.\n\t\tthis._observer.safeEmit('newtransport', transport);\n\n\t\treturn transport;\n\t}\n}\n","import debug from 'debug';\nimport { Device, detectDevice } from './Device';\nimport * as types from './types';\n\n/**\n * Expose all types.\n */\nexport { types };\n\n/**\n * Expose mediasoup-client version.\n */\nexport const version = '3.6.90';\n\n/**\n * Expose Device class and detectDevice() helper.\n */\nexport { Device, detectDevice };\n\n/**\n * Expose parseScalabilityMode() function.\n */\nexport { parse as parseScalabilityMode } from './scalabilityModes';\n\n/**\n * Expose the debug module.\n */\nexport { debug };\n"],"names":["__publicField","logger","utils.clone","ortc.validateRtpParameters","ortc.canReceive","ortc.validateSctpStreamParameters","ortc.generateProbatorRtpParameters","getRtpEncodings","addLegacySimulcast","ssrcs","SCTP_NUM_STREAMS","sdpCommonUtils.extractRtpCapabilities","ortcUtils.addNackSuppportForOpus","ortc.getSendingRtpParameters","ortc.getSendingRemoteRtpParameters","parseScalabilityMode","ortc.reduceCodecs","sdpCommonUtils.getCname","sdpUnifiedPlanUtils.getRtpEncodings","sdpCommonUtils.applyCodecParameters","sdpCommonUtils.extractDtlsParameters","sdpUnifiedPlanUtils.addLegacySimulcast","sdpPlanBUtils.addLegacySimulcast","sdpPlanBUtils.getRtpEncodings","edgeUtils.getCapabilities","utils.generateRandomNumber","edgeUtils.mangleRtpParameters","ortc.validateRtpCapabilities","ortc.getExtendedRtpCapabilities","ortc.canSend","ortc.getRecvRtpCapabilities","ortc.validateSctpCapabilities"],"mappings":"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"}
|