node-rtc-connection 1.0.14 → 1.0.15

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/foundation/ByteBufferQueue.js","../src/foundation/RTCError.js","../src/ice/RTCIceCandidate.js","../src/stun/stun-client.js","../src/ice/RTCIceTransport.js","../src/dtls/RTCCertificate.js","../src/dtls/RTCDtlsTransport.js","../src/sctp/RTCSctpTransport.js","../src/datachannel/RTCDataChannel.js","../src/sdp/RTCSessionDescription.js","../src/sdp/sdp-utils.js","../src/network/network-transport.js","../src/peerconnection/RTCPeerConnection.js","../src/index.js","../src/index.js?commonjs-entry"],"sourcesContent":["/**\n * @fileoverview ByteBufferQueue - Efficient byte buffer with O(1) append and O(n) read.\n * \n * Ported from Chromium's WebRTC implementation:\n * chromium/src/third_party/blink/renderer/modules/peerconnection/byte_buffer_queue.{h,cc}\n * \n * This class provides efficient management of byte buffers with O(1) append operations\n * and O(n) read operations. Clients can append entire buffers then copy data out across\n * buffer boundaries.\n * \n * @license BSD-3-Clause\n * @author nmhung1210\n */\n\n'use strict';\n\n/**\n * A ByteBufferQueue manages a queue of byte buffers with efficient operations.\n * \n * Invariants maintained:\n * - size_ = sum of all buffer sizes - frontBufferOffset_\n * - No buffer in the queue is empty\n * - If queue is empty, frontBufferOffset_ = 0\n * - Otherwise, frontBufferOffset_ < front buffer size\n */\nclass ByteBufferQueue {\n constructor() {\n /**\n * Total number of bytes available to read.\n * @private {number}\n */\n this._size = 0;\n\n /**\n * Double-ended queue of byte buffers.\n * Append() pushes to the back, ReadInto() consumes from the front.\n * @private {Buffer[]}\n */\n this._buffers = [];\n\n /**\n * Offset from which to start reading the front buffer.\n * @private {number}\n */\n this._frontBufferOffset = 0;\n }\n\n /**\n * Number of bytes that can be read.\n * @returns {number}\n */\n get size() {\n return this._size;\n }\n\n /**\n * Returns true if no bytes are available to read.\n * @returns {boolean}\n */\n get empty() {\n return this._size === 0;\n }\n\n /**\n * Copies data into the given buffer. Consumes bytes from the queue.\n * Returns the number of bytes written to bufferOut.\n * \n * @param {Buffer} bufferOut - Destination buffer to read into\n * @returns {number} Number of bytes actually read\n * @throws {TypeError} If bufferOut is not a Buffer\n */\n readInto(bufferOut) {\n if (!Buffer.isBuffer(bufferOut)) {\n throw new TypeError('bufferOut must be a Buffer');\n }\n\n let readAmount = 0;\n let outputOffset = 0;\n\n while (outputOffset < bufferOut.length && this._buffers.length > 0) {\n const frontBuffer = this._buffers[0];\n const availableInFront = frontBuffer.length - this._frontBufferOffset;\n const remainingOutput = bufferOut.length - outputOffset;\n const toCopy = Math.min(availableInFront, remainingOutput);\n\n // Copy data from front buffer to output\n frontBuffer.copy(\n bufferOut,\n outputOffset,\n this._frontBufferOffset,\n this._frontBufferOffset + toCopy\n );\n\n readAmount += toCopy;\n outputOffset += toCopy;\n\n if (toCopy < availableInFront) {\n // Partial read, update offset\n this._frontBufferOffset += toCopy;\n } else {\n // Consumed entire front buffer, remove it\n this._buffers.shift();\n this._frontBufferOffset = 0;\n }\n }\n\n this._size -= readAmount;\n this._checkInvariants();\n return readAmount;\n }\n\n /**\n * Appends a buffer to the queue. Takes ownership of the buffer.\n * Empty buffers are ignored.\n * \n * @param {Buffer} buffer - Buffer to append\n * @throws {TypeError} If buffer is not a Buffer\n */\n append(buffer) {\n if (!Buffer.isBuffer(buffer)) {\n throw new TypeError('buffer must be a Buffer');\n }\n\n if (buffer.length === 0) {\n return; // Ignore empty buffers\n }\n\n this._size += buffer.length;\n this._buffers.push(buffer);\n this._checkInvariants();\n }\n\n /**\n * Clears all stored buffers.\n */\n clear() {\n this._buffers = [];\n this._frontBufferOffset = 0;\n this._size = 0;\n this._checkInvariants();\n }\n\n /**\n * Reads and consumes exactly n bytes.\n * \n * @param {number} n - Number of bytes to read\n * @returns {Buffer} Buffer containing exactly n bytes\n * @throws {RangeError} If fewer than n bytes are available\n */\n read(n) {\n if (n > this._size) {\n throw new RangeError(`Cannot read ${n} bytes, only ${this._size} available`);\n }\n if (n === 0) {\n return Buffer.allocUnsafe(0);\n }\n\n const result = Buffer.allocUnsafe(n);\n const bytesRead = this.readInto(result);\n\n if (bytesRead !== n) {\n throw new Error(`Internal error: read ${bytesRead} bytes, expected ${n}`);\n }\n\n return result;\n }\n\n /**\n * Peeks at data without consuming it.\n * \n * @param {number} [n=this._size] - Number of bytes to peek\n * @returns {Buffer} Buffer containing up to n bytes (not consumed)\n */\n peek(n = this._size) {\n const peekAmount = Math.min(n, this._size);\n if (peekAmount === 0) {\n return Buffer.allocUnsafe(0);\n }\n\n const result = Buffer.allocUnsafe(peekAmount);\n let written = 0;\n let bufferIndex = 0;\n let offset = this._frontBufferOffset;\n\n while (written < peekAmount && bufferIndex < this._buffers.length) {\n const buffer = this._buffers[bufferIndex];\n const available = buffer.length - offset;\n const toCopy = Math.min(available, peekAmount - written);\n\n buffer.copy(result, written, offset, offset + toCopy);\n written += toCopy;\n\n bufferIndex++;\n offset = 0; // Reset offset for subsequent buffers\n }\n\n return result;\n }\n\n /**\n * Checks internal invariants (development mode only).\n * @private\n * @throws {Error} If invariants are violated\n */\n _checkInvariants() {\n if (process.env.NODE_ENV !== 'production') {\n let bufferSizeSum = 0;\n for (const buffer of this._buffers) {\n if (buffer.length === 0) {\n throw new Error('Invariant violation: empty buffer in queue');\n }\n bufferSizeSum += buffer.length;\n }\n\n const expectedSize = bufferSizeSum - this._frontBufferOffset;\n if (this._size !== expectedSize) {\n throw new Error(\n `Invariant violation: size=${this._size}, expected=${expectedSize}`\n );\n }\n\n if (this._buffers.length === 0) {\n if (this._frontBufferOffset !== 0) {\n throw new Error('Invariant violation: offset non-zero with empty queue');\n }\n } else {\n if (this._frontBufferOffset >= this._buffers[0].length) {\n throw new Error('Invariant violation: offset >= front buffer size');\n }\n }\n }\n }\n}\n\nmodule.exports = ByteBufferQueue;\n","/**\n * @fileoverview RTCError - WebRTC-specific error types.\n * \n * Ported from Chromium's WebRTC implementation:\n * chromium/src/third_party/blink/renderer/modules/peerconnection/rtc_error.{h,cc}\n * \n * Provides WebRTC-specific error types extending the standard Error class\n * with additional error detail types and metadata fields.\n * \n * @license BSD-3-Clause\n * @author nmhung1210\n */\n\n'use strict';\n\n/**\n * RTCErrorDetailType enum - Standardized WebRTC error details.\n * Maps to RTCErrorDetailType from the WebRTC spec.\n * \n * @readonly\n * @enum {string}\n */\nconst RTCErrorDetailType = Object.freeze({\n NONE: 'none',\n DATA_CHANNEL_FAILURE: 'data-channel-failure',\n DTLS_FAILURE: 'dtls-failure',\n FINGERPRINT_FAILURE: 'fingerprint-failure',\n SCTP_FAILURE: 'sctp-failure',\n SDP_SYNTAX_ERROR: 'sdp-syntax-error',\n HARDWARE_ENCODER_NOT_AVAILABLE: 'hardware-encoder-not-available',\n HARDWARE_ENCODER_ERROR: 'hardware-encoder-error',\n INVALID_STATE: 'invalid-state',\n INVALID_MODIFICATION: 'invalid-modification',\n INVALID_ACCESS_ERROR: 'invalid-access-error',\n OPERATION_ERROR: 'operation-error'\n});\n\n/**\n * RTCError extends Error with WebRTC-specific error details.\n * \n * @extends Error\n */\nclass RTCError extends Error {\n /**\n * Creates a new RTCError.\n * \n * @param {RTCErrorInit} [init={}] - Error initialization dictionary\n * @param {string} [init.errorDetail='none'] - Error detail type\n * @param {number} [init.sdpLineNumber] - SDP line number where error occurred\n * @param {number} [init.httpRequestStatusCode] - HTTP status code if relevant\n * @param {number} [init.sctpCauseCode] - SCTP cause code\n * @param {number} [init.receivedAlert] - TLS alert received\n * @param {number} [init.sentAlert] - TLS alert sent\n * @param {string} [message=''] - Error message\n */\n constructor(init = {}, message = '') {\n super(message);\n \n this.name = 'RTCError';\n \n // Maintain stack trace in V8\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, RTCError);\n }\n\n // Validate and set errorDetail\n const errorDetail = init.errorDetail || RTCErrorDetailType.NONE;\n if (typeof errorDetail !== 'string') {\n throw new TypeError('errorDetail must be a string');\n }\n \n /**\n * Specific error category.\n * @private {string}\n */\n this._errorDetail = errorDetail;\n\n // Optional numeric fields with validation\n this._sdpLineNumber = this._validateInteger(init.sdpLineNumber, 'sdpLineNumber');\n this._httpRequestStatusCode = this._validateInteger(init.httpRequestStatusCode, 'httpRequestStatusCode');\n this._sctpCauseCode = this._validateInteger(init.sctpCauseCode, 'sctpCauseCode');\n this._receivedAlert = this._validateUnsignedInteger(init.receivedAlert, 'receivedAlert');\n this._sentAlert = this._validateUnsignedInteger(init.sentAlert, 'sentAlert');\n }\n\n /**\n * Validates that a value is an integer or null/undefined.\n * @private\n * @param {*} value - Value to validate\n * @param {string} fieldName - Field name for error messages\n * @returns {number|null}\n * @throws {TypeError} If value is not an integer\n */\n _validateInteger(value, fieldName) {\n if (value === undefined || value === null) {\n return null;\n }\n const num = Number(value);\n if (!Number.isInteger(num)) {\n throw new TypeError(`${fieldName} must be an integer`);\n }\n return num;\n }\n\n /**\n * Validates that a value is an unsigned integer or null/undefined.\n * @private\n * @param {*} value - Value to validate\n * @param {string} fieldName - Field name for error messages\n * @returns {number|null}\n * @throws {TypeError} If value is not an unsigned integer\n */\n _validateUnsignedInteger(value, fieldName) {\n if (value === undefined || value === null) {\n return null;\n }\n const num = Number(value);\n if (!Number.isInteger(num) || num < 0) {\n throw new TypeError(`${fieldName} must be an unsigned integer`);\n }\n return num;\n }\n\n /**\n * RTCErrorDetailType - specific error category.\n * @type {string}\n */\n get errorDetail() {\n return this._errorDetail;\n }\n\n /**\n * SDP line number where the error occurred (if applicable).\n * @type {number|null}\n */\n get sdpLineNumber() {\n return this._sdpLineNumber;\n }\n\n /**\n * HTTP request status code (if applicable).\n * @type {number|null}\n */\n get httpRequestStatusCode() {\n return this._httpRequestStatusCode;\n }\n\n /**\n * SCTP cause code (if applicable).\n * @type {number|null}\n */\n get sctpCauseCode() {\n return this._sctpCauseCode;\n }\n\n /**\n * TLS alert value received (if applicable).\n * @type {number|null}\n */\n get receivedAlert() {\n return this._receivedAlert;\n }\n\n /**\n * TLS alert value sent (if applicable).\n * @type {number|null}\n */\n get sentAlert() {\n return this._sentAlert;\n }\n\n /**\n * Converts error to JSON representation.\n * @returns {Object} JSON representation of the error\n */\n toJSON() {\n const json = {\n name: this.name,\n message: this.message,\n errorDetail: this._errorDetail\n };\n\n if (this._sdpLineNumber !== null) {\n json.sdpLineNumber = this._sdpLineNumber;\n }\n if (this._httpRequestStatusCode !== null) {\n json.httpRequestStatusCode = this._httpRequestStatusCode;\n }\n if (this._sctpCauseCode !== null) {\n json.sctpCauseCode = this._sctpCauseCode;\n }\n if (this._receivedAlert !== null) {\n json.receivedAlert = this._receivedAlert;\n }\n if (this._sentAlert !== null) {\n json.sentAlert = this._sentAlert;\n }\n\n return json;\n }\n\n /**\n * Creates RTCError from a native WebRTC error object.\n * @param {Object} nativeError - Native error object\n * @param {string} [nativeError.error_detail] - Error detail type\n * @param {number} [nativeError.sctp_cause_code] - SCTP cause code\n * @param {string} [nativeError.message] - Error message\n * @returns {RTCError}\n */\n static fromNative(nativeError) {\n const init = {\n errorDetail: nativeError.error_detail || RTCErrorDetailType.NONE\n };\n\n if (nativeError.sctp_cause_code !== undefined) {\n init.sctpCauseCode = nativeError.sctp_cause_code;\n }\n\n return new RTCError(init, nativeError.message || 'Unknown error');\n }\n}\n\n// Export error detail types as static property\nRTCError.DetailType = RTCErrorDetailType;\n\nmodule.exports = RTCError;\n","/**\n * @fileoverview RTCIceCandidate - ICE candidate representation.\n * \n * Ported from Chromium's WebRTC implementation:\n * chromium/src/third_party/blink/renderer/modules/peerconnection/rtc_ice_candidate.{h,cc}\n * \n * Represents an ICE (Interactive Connectivity Establishment) candidate that\n * describes a potential way to establish a connection with a peer.\n * \n * @license BSD-3-Clause\n * @author nmhung1210\n */\n\n'use strict';\n\n/**\n * RTCIceCandidate represents a potential method for establishing connectivity.\n * \n * ICE candidates are described using SDP (Session Description Protocol) syntax.\n * Each candidate describes a single address/port combination and transport protocol.\n */\nclass RTCIceCandidate {\n /**\n * Creates a new RTCIceCandidate.\n * \n * @param {RTCIceCandidateInit} [candidateInit={}] - Initialization dictionary\n * @param {string} [candidateInit.candidate=''] - SDP candidate string\n * @param {string|null} [candidateInit.sdpMid] - Media stream ID\n * @param {number|null} [candidateInit.sdpMLineIndex] - M-line index\n * @param {string} [candidateInit.usernameFragment] - ICE username fragment\n * @throws {TypeError} If both sdpMid and sdpMLineIndex are null\n */\n constructor(candidateInit = {}) {\n // Validate that at least one of sdpMid or sdpMLineIndex is present\n if (candidateInit.sdpMid === null && candidateInit.sdpMLineIndex === null) {\n throw new TypeError('sdpMid and sdpMLineIndex are both null');\n }\n\n /**\n * SDP candidate string.\n * @private {string}\n */\n this._candidate = candidateInit.candidate || '';\n\n /**\n * Media stream identification.\n * @private {string|null}\n */\n this._sdpMid = candidateInit.sdpMid !== undefined ? candidateInit.sdpMid : null;\n\n /**\n * Media line index (zero-based).\n * @private {number|null}\n */\n this._sdpMLineIndex = candidateInit.sdpMLineIndex !== undefined ? \n candidateInit.sdpMLineIndex : null;\n\n /**\n * ICE username fragment.\n * @private {string|null}\n */\n this._usernameFragment = candidateInit.usernameFragment || null;\n\n // Parse candidate string for detailed attributes\n this._parsedAttributes = this._parseCandidate(this._candidate);\n }\n\n /**\n * Parses an ICE candidate string to extract attributes.\n * Format: \"candidate:foundation component protocol priority address port typ type [raddr reladdr] [rport relport]\"\n * \n * @private\n * @param {string} candidateStr - Candidate string to parse\n * @returns {Object} Parsed attributes\n */\n _parseCandidate(candidateStr) {\n const attrs = {\n foundation: null,\n component: null,\n protocol: null,\n priority: null,\n address: null,\n port: null,\n type: null,\n tcpType: null,\n relatedAddress: null,\n relatedPort: null\n };\n\n if (!candidateStr || !candidateStr.startsWith('candidate:')) {\n return attrs;\n }\n\n // Remove \"candidate:\" prefix\n const parts = candidateStr.substring(10).trim().split(/\\s+/);\n \n if (parts.length < 8) {\n return attrs;\n }\n\n // Parse fixed fields\n attrs.foundation = parts[0];\n attrs.component = parts[1];\n attrs.protocol = parts[2].toLowerCase();\n attrs.priority = parseInt(parts[3], 10);\n attrs.address = parts[4];\n attrs.port = parseInt(parts[5], 10);\n \n // parts[6] should be \"typ\"\n if (parts[6] === 'typ') {\n attrs.type = parts[7];\n }\n\n // Parse optional attributes\n for (let i = 8; i < parts.length; i += 2) {\n const key = parts[i];\n const value = parts[i + 1];\n \n if (key === 'raddr') {\n attrs.relatedAddress = value;\n } else if (key === 'rport') {\n attrs.relatedPort = parseInt(value, 10);\n } else if (key === 'tcptype') {\n attrs.tcpType = value;\n }\n }\n\n return attrs;\n }\n\n /**\n * SDP candidate attribute containing the candidate description.\n * @type {string}\n */\n get candidate() {\n return this._candidate;\n }\n\n /**\n * Media stream identification tag.\n * @type {string|null}\n */\n get sdpMid() {\n return this._sdpMid;\n }\n\n /**\n * Index of the m-line in the SDP this candidate is associated with.\n * @type {number|null}\n */\n get sdpMLineIndex() {\n return this._sdpMLineIndex;\n }\n\n /**\n * ICE username fragment.\n * @type {string|null}\n */\n get usernameFragment() {\n return this._usernameFragment;\n }\n\n /**\n * Unique identifier for this candidate.\n * @type {string|null}\n */\n get foundation() {\n return this._parsedAttributes.foundation;\n }\n\n /**\n * Component identifier (rtp=1, rtcp=2).\n * @type {string|null}\n */\n get component() {\n return this._parsedAttributes.component;\n }\n\n /**\n * Priority value for this candidate.\n * Higher priority candidates are preferred.\n * @type {number|null}\n */\n get priority() {\n return this._parsedAttributes.priority;\n }\n\n /**\n * IP address of this candidate.\n * @type {string|null}\n */\n get address() {\n return this._parsedAttributes.address;\n }\n\n /**\n * Transport protocol (udp/tcp).\n * @type {string|null}\n */\n get protocol() {\n return this._parsedAttributes.protocol;\n }\n\n /**\n * Port number.\n * @type {number|null}\n */\n get port() {\n return this._parsedAttributes.port;\n }\n\n /**\n * Type of candidate (host, srflx, prflx, relay).\n * @type {string|null}\n */\n get type() {\n return this._parsedAttributes.type;\n }\n\n /**\n * TCP candidate type (active, passive, so).\n * Only applicable for TCP candidates.\n * @type {string|null}\n */\n get tcpType() {\n return this._parsedAttributes.tcpType;\n }\n\n /**\n * Related address for reflexive/relay candidates.\n * @type {string|null}\n */\n get relatedAddress() {\n return this._parsedAttributes.relatedAddress;\n }\n\n /**\n * Related port for reflexive/relay candidates.\n * @type {number|null}\n */\n get relatedPort() {\n return this._parsedAttributes.relatedPort;\n }\n\n /**\n * Converts candidate to JSON representation.\n * @returns {Object} JSON representation\n */\n toJSON() {\n const json = {\n candidate: this._candidate,\n sdpMid: this._sdpMid,\n sdpMLineIndex: this._sdpMLineIndex\n };\n\n if (this._usernameFragment) {\n json.usernameFragment = this._usernameFragment;\n }\n\n return json;\n }\n\n /**\n * Creates an RTCIceCandidate from a candidate string.\n * \n * @param {string} candidateStr - ICE candidate string\n * @param {string|null} [sdpMid=null] - Media stream ID\n * @param {number|null} [sdpMLineIndex=0] - M-line index\n * @returns {RTCIceCandidate}\n */\n static fromString(candidateStr, sdpMid = null, sdpMLineIndex = 0) {\n return new RTCIceCandidate({\n candidate: candidateStr,\n sdpMid,\n sdpMLineIndex\n });\n }\n\n /**\n * Validates if a string is a valid candidate format.\n * \n * @param {string} candidateStr - String to validate\n * @returns {boolean} True if valid candidate format\n */\n static isValid(candidateStr) {\n if (!candidateStr || typeof candidateStr !== 'string') {\n return false;\n }\n \n // Must start with \"candidate:\"\n if (!candidateStr.startsWith('candidate:')) {\n return false;\n }\n\n // Must have at least the minimum required fields\n const parts = candidateStr.substring(10).trim().split(/\\s+/);\n return parts.length >= 8;\n }\n}\n\nmodule.exports = RTCIceCandidate;\n","/**\n * @file stun-client.js\n * @description STUN (Session Traversal Utilities for NAT) client implementation\n * @module stun/stun-client\n * \n * STUN Protocol: RFC 5389\n * TURN Protocol: RFC 5766\n */\n\n'use strict';\n\nconst dgram = require('dgram');\nconst crypto = require('crypto');\n\n/**\n * STUN message types\n */\nconst STUN_MESSAGE_TYPES = {\n BINDING_REQUEST: 0x0001,\n BINDING_RESPONSE: 0x0101,\n BINDING_ERROR_RESPONSE: 0x0111,\n \n // TURN\n ALLOCATE_REQUEST: 0x0003,\n ALLOCATE_RESPONSE: 0x0103,\n ALLOCATE_ERROR_RESPONSE: 0x0113,\n \n REFRESH_REQUEST: 0x0004,\n REFRESH_RESPONSE: 0x0104,\n \n SEND_INDICATION: 0x0016,\n DATA_INDICATION: 0x0017,\n \n CREATE_PERMISSION_REQUEST: 0x0008,\n CREATE_PERMISSION_RESPONSE: 0x0108,\n \n CHANNEL_BIND_REQUEST: 0x0009,\n CHANNEL_BIND_RESPONSE: 0x0109\n};\n\n/**\n * STUN attribute types\n */\nconst STUN_ATTRIBUTES = {\n MAPPED_ADDRESS: 0x0001,\n USERNAME: 0x0006,\n MESSAGE_INTEGRITY: 0x0008,\n ERROR_CODE: 0x0009,\n UNKNOWN_ATTRIBUTES: 0x000A,\n REALM: 0x0014,\n NONCE: 0x0015,\n XOR_MAPPED_ADDRESS: 0x0020,\n \n // TURN\n CHANNEL_NUMBER: 0x000C,\n LIFETIME: 0x000D,\n XOR_PEER_ADDRESS: 0x0012,\n DATA: 0x0013,\n XOR_RELAYED_ADDRESS: 0x0016,\n REQUESTED_TRANSPORT: 0x0019,\n \n SOFTWARE: 0x8022,\n FINGERPRINT: 0x8028\n};\n\nconst MAGIC_COOKIE = 0x2112A442;\n\n/**\n * @class STUNClient\n * @description STUN/TURN client for NAT traversal\n */\nclass STUNClient {\n /**\n * Create a STUN client\n * @param {Object} options - Client options\n * @param {string} options.server - STUN/TURN server address\n * @param {number} options.port - Server port\n * @param {string} [options.username] - TURN username\n * @param {string} [options.credential] - TURN password\n * @param {string} [options.transport='udp'] - Transport protocol (udp/tcp)\n * @param {Object} [options.params={}] - Additional query parameters from URL\n */\n constructor(options) {\n this.server = options.server;\n this.port = options.port;\n this.username = options.username;\n this.credential = options.credential;\n this.transport = options.transport || 'udp';\n this.params = options.params || {};\n \n this.socket = null;\n this.transactions = new Map();\n this.realm = null;\n this.nonce = null;\n }\n\n /**\n * Connect to the STUN/TURN server\n * @returns {Promise<void>}\n */\n async connect() {\n if (this.socket) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n this.socket = dgram.createSocket('udp4');\n \n this.socket.on('message', (msg, rinfo) => {\n this._handleMessage(msg, rinfo);\n });\n\n this.socket.on('error', (err) => {\n console.error('STUN socket error:', err);\n reject(err);\n });\n\n this.socket.bind(() => {\n resolve();\n });\n });\n }\n\n /**\n * Send a STUN Binding Request to get reflexive address\n * @returns {Promise<Object>} Reflexive address info\n */\n async getReflexiveAddress() {\n await this.connect();\n\n const transactionId = crypto.randomBytes(12);\n const request = this._createBindingRequest(transactionId);\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.transactions.delete(transactionId.toString('hex'));\n reject(new Error('STUN request timeout'));\n }, 5000);\n\n this.transactions.set(transactionId.toString('hex'), {\n resolve: (result) => {\n clearTimeout(timeout);\n resolve(result);\n },\n reject: (error) => {\n clearTimeout(timeout);\n reject(error);\n }\n });\n\n this.socket.send(request, this.port, this.server, (err) => {\n if (err) {\n clearTimeout(timeout);\n this.transactions.delete(transactionId.toString('hex'));\n reject(err);\n }\n });\n });\n }\n\n /**\n * Send a TURN Allocate Request to get relay address\n * @param {number} [lifetime=600] - Allocation lifetime in seconds\n * @returns {Promise<Object>} Relay address info\n */\n async allocateRelay(lifetime = 600) {\n if (!this.username || !this.credential) {\n throw new Error('TURN requires username and credential');\n }\n\n await this.connect();\n\n let transactionId = crypto.randomBytes(12);\n let request = this._createAllocateRequest(transactionId, lifetime);\n\n // First attempt without credentials to get realm and nonce\n try {\n return await this._sendRequest(request, transactionId, 'allocate');\n } catch (error) {\n // If we get 401 Unauthorized, retry with credentials\n if (error.message.includes('401') && this.realm && this.nonce) {\n // Create new transaction ID for retry\n transactionId = crypto.randomBytes(12);\n request = this._createAllocateRequest(transactionId, lifetime, true);\n return await this._sendRequest(request, transactionId, 'allocate');\n }\n throw error;\n }\n }\n\n /**\n * Send a TURN Refresh Request to keep allocation alive\n * @param {number} [lifetime=600] - Allocation lifetime in seconds\n * @returns {Promise<Object>} Updated allocation info\n */\n async refreshAllocation(lifetime = 600) {\n if (!this.username || !this.credential) {\n throw new Error('TURN requires username and credential');\n }\n\n const transactionId = crypto.randomBytes(12);\n const request = this._createRefreshRequest(transactionId, lifetime);\n\n return this._sendRequest(request, transactionId, 'refresh');\n }\n\n /**\n * Send a TURN request\n * @param {Buffer} request - Request message\n * @param {Buffer} transactionId - Transaction ID\n * @param {string} requestType - Type of request\n * @returns {Promise<Object>}\n * @private\n */\n _sendRequest(request, transactionId, requestType) {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.transactions.delete(transactionId.toString('hex'));\n reject(new Error(`${requestType} request timeout`));\n }, 5000);\n\n this.transactions.set(transactionId.toString('hex'), {\n type: requestType,\n resolve: (result) => {\n clearTimeout(timeout);\n resolve(result);\n },\n reject: (error) => {\n clearTimeout(timeout);\n reject(error);\n }\n });\n\n this.socket.send(request, this.port, this.server, (err) => {\n if (err) {\n clearTimeout(timeout);\n this.transactions.delete(transactionId.toString('hex'));\n reject(err);\n }\n });\n });\n }\n\n /**\n * Create a STUN Binding Request\n * @param {Buffer} transactionId - Transaction ID\n * @returns {Buffer} STUN message\n * @private\n */\n _createBindingRequest(transactionId) {\n const header = Buffer.alloc(20);\n \n // Message Type (2 bytes)\n header.writeUInt16BE(STUN_MESSAGE_TYPES.BINDING_REQUEST, 0);\n \n // Message Length (2 bytes) - 0 for now, no attributes\n header.writeUInt16BE(0, 2);\n \n // Magic Cookie (4 bytes)\n header.writeUInt32BE(MAGIC_COOKIE, 4);\n \n // Transaction ID (12 bytes)\n transactionId.copy(header, 8);\n \n return header;\n }\n\n /**\n * Create a TURN Allocate Request\n * @param {Buffer} transactionId - Transaction ID\n * @param {number} lifetime - Allocation lifetime in seconds\n * @param {boolean} withAuth - Include authentication\n * @returns {Buffer} STUN message\n * @private\n */\n _createAllocateRequest(transactionId, lifetime, withAuth = false) {\n const attributes = [];\n\n // REQUESTED-TRANSPORT (UDP = 17)\n const transport = Buffer.alloc(8);\n transport.writeUInt16BE(STUN_ATTRIBUTES.REQUESTED_TRANSPORT, 0);\n transport.writeUInt16BE(4, 2);\n transport.writeUInt8(17, 4); // UDP\n attributes.push(transport);\n\n // LIFETIME\n const lifetimeAttr = Buffer.alloc(8);\n lifetimeAttr.writeUInt16BE(STUN_ATTRIBUTES.LIFETIME, 0);\n lifetimeAttr.writeUInt16BE(4, 2);\n lifetimeAttr.writeUInt32BE(lifetime, 4);\n attributes.push(lifetimeAttr);\n\n if (withAuth && this.realm && this.nonce) {\n // USERNAME\n const usernameAttr = this._createStringAttribute(STUN_ATTRIBUTES.USERNAME, this.username);\n attributes.push(usernameAttr);\n\n // REALM\n const realmAttr = this._createStringAttribute(STUN_ATTRIBUTES.REALM, this.realm);\n attributes.push(realmAttr);\n\n // NONCE\n const nonceAttr = this._createStringAttribute(STUN_ATTRIBUTES.NONCE, this.nonce);\n attributes.push(nonceAttr);\n }\n\n return this._createMessage(STUN_MESSAGE_TYPES.ALLOCATE_REQUEST, transactionId, attributes, withAuth);\n }\n\n /**\n * Create a TURN Refresh Request\n * @param {Buffer} transactionId - Transaction ID\n * @param {number} lifetime - Allocation lifetime in seconds\n * @returns {Buffer} STUN message\n * @private\n */\n _createRefreshRequest(transactionId, lifetime) {\n const attributes = [];\n\n // LIFETIME\n const lifetimeAttr = Buffer.alloc(8);\n lifetimeAttr.writeUInt16BE(STUN_ATTRIBUTES.LIFETIME, 0);\n lifetimeAttr.writeUInt16BE(4, 2);\n lifetimeAttr.writeUInt32BE(lifetime, 4);\n attributes.push(lifetimeAttr);\n\n // USERNAME\n const usernameAttr = this._createStringAttribute(STUN_ATTRIBUTES.USERNAME, this.username);\n attributes.push(usernameAttr);\n\n // REALM\n if (this.realm) {\n const realmAttr = this._createStringAttribute(STUN_ATTRIBUTES.REALM, this.realm);\n attributes.push(realmAttr);\n }\n\n // NONCE\n if (this.nonce) {\n const nonceAttr = this._createStringAttribute(STUN_ATTRIBUTES.NONCE, this.nonce);\n attributes.push(nonceAttr);\n }\n\n return this._createMessage(STUN_MESSAGE_TYPES.REFRESH_REQUEST, transactionId, attributes, true);\n }\n\n /**\n * Create a STUN message with attributes\n * @param {number} messageType - Message type\n * @param {Buffer} transactionId - Transaction ID\n * @param {Array<Buffer>} attributes - Attribute buffers\n * @param {boolean} withIntegrity - Add MESSAGE-INTEGRITY\n * @returns {Buffer} Complete STUN message\n * @private\n */\n _createMessage(messageType, transactionId, attributes, withIntegrity = false) {\n let attributesBuffer = Buffer.concat(attributes);\n\n // Add MESSAGE-INTEGRITY if needed\n if (withIntegrity && this.credential) {\n const tempHeader = Buffer.alloc(20);\n tempHeader.writeUInt16BE(messageType, 0);\n tempHeader.writeUInt16BE(attributesBuffer.length + 24, 2); // +24 for MESSAGE-INTEGRITY\n tempHeader.writeUInt32BE(MAGIC_COOKIE, 4);\n transactionId.copy(tempHeader, 8);\n\n const tempMessage = Buffer.concat([tempHeader, attributesBuffer]);\n \n // For TURN, compute key as MD5(username:realm:password) per RFC 5766\n let key = this.credential;\n if (this.username && this.realm) {\n const keyString = `${this.username}:${this.realm}:${this.credential}`;\n key = crypto.createHash('md5').update(keyString).digest();\n }\n \n const hmac = crypto.createHmac('sha1', key);\n hmac.update(tempMessage);\n const integrity = hmac.digest();\n\n const integrityAttr = Buffer.alloc(4 + integrity.length);\n integrityAttr.writeUInt16BE(STUN_ATTRIBUTES.MESSAGE_INTEGRITY, 0);\n integrityAttr.writeUInt16BE(integrity.length, 2);\n integrity.copy(integrityAttr, 4);\n\n attributesBuffer = Buffer.concat([attributesBuffer, integrityAttr]);\n }\n\n // Create final message\n const header = Buffer.alloc(20);\n header.writeUInt16BE(messageType, 0);\n header.writeUInt16BE(attributesBuffer.length, 2);\n header.writeUInt32BE(MAGIC_COOKIE, 4);\n transactionId.copy(header, 8);\n\n return Buffer.concat([header, attributesBuffer]);\n }\n\n /**\n * Create a string attribute\n * @param {number} type - Attribute type\n * @param {string} value - String value\n * @returns {Buffer} Attribute buffer\n * @private\n */\n _createStringAttribute(type, value) {\n const valueBuffer = Buffer.from(value, 'utf8');\n const length = valueBuffer.length;\n const padding = (4 - (length % 4)) % 4;\n const buffer = Buffer.alloc(4 + length + padding);\n \n buffer.writeUInt16BE(type, 0);\n buffer.writeUInt16BE(length, 2);\n valueBuffer.copy(buffer, 4);\n \n return buffer;\n }\n\n /**\n * Handle incoming STUN message\n * @param {Buffer} msg - Message buffer\n * @param {Object} rinfo - Remote info\n * @private\n */\n _handleMessage(msg, rinfo) {\n if (msg.length < 20) {\n return; // Invalid STUN message\n }\n\n const messageType = msg.readUInt16BE(0);\n const messageLength = msg.readUInt16BE(2);\n const magicCookie = msg.readUInt32BE(4);\n const transactionId = msg.slice(8, 20);\n\n if (magicCookie !== MAGIC_COOKIE) {\n return; // Not a STUN message\n }\n\n const transactionKey = transactionId.toString('hex');\n const transaction = this.transactions.get(transactionKey);\n\n if (!transaction) {\n return; // Unknown transaction\n }\n\n const attributes = this._parseAttributes(msg.slice(20, 20 + messageLength), transactionId);\n\n // Handle STUN Binding responses\n if (messageType === STUN_MESSAGE_TYPES.BINDING_RESPONSE) {\n if (attributes.xorMappedAddress) {\n transaction.resolve({\n address: attributes.xorMappedAddress.address,\n port: attributes.xorMappedAddress.port,\n family: attributes.xorMappedAddress.family\n });\n } else if (attributes.mappedAddress) {\n transaction.resolve({\n address: attributes.mappedAddress.address,\n port: attributes.mappedAddress.port,\n family: attributes.mappedAddress.family\n });\n } else {\n transaction.reject(new Error('No mapped address in STUN response'));\n }\n this.transactions.delete(transactionKey);\n }\n // Handle TURN Allocate responses\n else if (messageType === STUN_MESSAGE_TYPES.ALLOCATE_RESPONSE) {\n if (attributes.xorRelayedAddress) {\n transaction.resolve({\n relayedAddress: attributes.xorRelayedAddress.address,\n relayedPort: attributes.xorRelayedAddress.port,\n lifetime: attributes.lifetime || 600,\n type: 'relay'\n });\n } else {\n transaction.reject(new Error('No relayed address in ALLOCATE response'));\n }\n this.transactions.delete(transactionKey);\n }\n // Handle TURN Refresh responses\n else if (messageType === STUN_MESSAGE_TYPES.REFRESH_RESPONSE) {\n transaction.resolve({\n lifetime: attributes.lifetime || 600\n });\n this.transactions.delete(transactionKey);\n }\n // Handle error responses\n else if (messageType === STUN_MESSAGE_TYPES.BINDING_ERROR_RESPONSE ||\n messageType === STUN_MESSAGE_TYPES.ALLOCATE_ERROR_RESPONSE) {\n \n // Store realm and nonce for subsequent requests\n if (attributes.realm) {\n this.realm = attributes.realm;\n }\n if (attributes.nonce) {\n this.nonce = attributes.nonce;\n }\n\n const errorMsg = attributes.errorCode || 'Unknown error';\n transaction.reject(new Error(`STUN error: ${errorMsg}`));\n this.transactions.delete(transactionKey);\n }\n }\n\n /**\n * Parse STUN attributes\n * @param {Buffer} data - Attributes data\n * @param {Buffer} transactionId - Transaction ID\n * @returns {Object} Parsed attributes\n * @private\n */\n _parseAttributes(data, transactionId) {\n const attributes = {};\n let offset = 0;\n\n while (offset < data.length) {\n if (offset + 4 > data.length) break;\n\n const type = data.readUInt16BE(offset);\n const length = data.readUInt16BE(offset + 2);\n offset += 4;\n\n if (offset + length > data.length) break;\n\n const value = data.slice(offset, offset + length);\n\n switch (type) {\n case STUN_ATTRIBUTES.XOR_MAPPED_ADDRESS:\n attributes.xorMappedAddress = this._parseXorAddress(value, transactionId);\n break;\n case STUN_ATTRIBUTES.XOR_RELAYED_ADDRESS:\n attributes.xorRelayedAddress = this._parseXorAddress(value, transactionId);\n break;\n case STUN_ATTRIBUTES.MAPPED_ADDRESS:\n attributes.mappedAddress = this._parseAddress(value);\n break;\n case STUN_ATTRIBUTES.LIFETIME:\n attributes.lifetime = value.readUInt32BE(0);\n break;\n case STUN_ATTRIBUTES.ERROR_CODE:\n attributes.errorCode = this._parseErrorCode(value);\n break;\n case STUN_ATTRIBUTES.REALM:\n attributes.realm = value.toString('utf8');\n this.realm = attributes.realm;\n break;\n case STUN_ATTRIBUTES.NONCE:\n attributes.nonce = value.toString('utf8');\n this.nonce = attributes.nonce;\n break;\n }\n\n // Pad to 4-byte boundary\n offset += length;\n const padding = (4 - (length % 4)) % 4;\n offset += padding;\n }\n\n return attributes;\n }\n\n /**\n * Parse XOR-MAPPED-ADDRESS attribute\n * @param {Buffer} data - Attribute data\n * @param {Buffer} transactionId - Transaction ID\n * @returns {Object} Address info\n * @private\n */\n _parseXorAddress(data, transactionId) {\n const family = data.readUInt8(1);\n const xorPort = data.readUInt16BE(2);\n \n // XOR port with magic cookie high 16 bits\n const port = xorPort ^ (MAGIC_COOKIE >> 16);\n\n if (family === 0x01) { // IPv4\n const xorAddress = data.readUInt32BE(4);\n const address = xorAddress ^ MAGIC_COOKIE;\n \n return {\n family: 'IPv4',\n port,\n address: [\n (address >> 24) & 0xFF,\n (address >> 16) & 0xFF,\n (address >> 8) & 0xFF,\n address & 0xFF\n ].join('.')\n };\n }\n\n return null;\n }\n\n /**\n * Parse MAPPED-ADDRESS attribute\n * @param {Buffer} data - Attribute data\n * @returns {Object} Address info\n * @private\n */\n _parseAddress(data) {\n const family = data.readUInt8(1);\n const port = data.readUInt16BE(2);\n\n if (family === 0x01) { // IPv4\n const address = data.slice(4, 8);\n return {\n family: 'IPv4',\n port,\n address: Array.from(address).join('.')\n };\n }\n\n return null;\n }\n\n /**\n * Parse ERROR-CODE attribute\n * @param {Buffer} data - Attribute data\n * @returns {string} Error message\n * @private\n */\n _parseErrorCode(data) {\n const errorClass = data.readUInt8(2) & 0x07;\n const errorNumber = data.readUInt8(3);\n const errorCode = errorClass * 100 + errorNumber;\n const reason = data.slice(4).toString('utf8');\n \n return `${errorCode} ${reason}`;\n }\n\n /**\n * Close the client\n */\n close() {\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n this.transactions.clear();\n }\n}\n\nmodule.exports = STUNClient;\n","/**\n * @file RTCIceTransport.js\n * @description ICE transport implementation for establishing connectivity.\n * @module ice/RTCIceTransport\n * \n * Ported from Chromium's RTCIceTransport implementation:\n * - cc/rtc_ice_transport.h\n * - cc/rtc_ice_transport.cc\n * - cc/rtc_ice_transport.idl\n */\n\nconst EventEmitter = require('events');\nconst STUNClient = require('../stun/stun-client');\nconst dgram = require('dgram');\nconst crypto = require('crypto');\n\n/**\n * RTCIceRole - The role in the ICE process\n * @readonly\n * @enum {string}\n */\nconst RTCIceRole = Object.freeze({\n CONTROLLING: 'controlling',\n CONTROLLED: 'controlled'\n});\n\n/**\n * RTCIceTransportState - Current state of the ICE transport\n * @readonly\n * @enum {string}\n */\nconst RTCIceTransportState = Object.freeze({\n NEW: 'new',\n CHECKING: 'checking',\n CONNECTED: 'connected',\n COMPLETED: 'completed',\n DISCONNECTED: 'disconnected',\n FAILED: 'failed',\n CLOSED: 'closed'\n});\n\n/**\n * RTCIceGatheringState - ICE candidate gathering state\n * @readonly\n * @enum {string}\n */\nconst RTCIceGatheringState = Object.freeze({\n NEW: 'new',\n GATHERING: 'gathering',\n COMPLETE: 'complete'\n});\n\n/**\n * RTCIceParameters - ICE username fragment and password\n * @typedef {Object} RTCIceParameters\n * @property {string} usernameFragment - ICE username fragment\n * @property {string} password - ICE password\n */\n\n/**\n * RTCIceCandidatePair - A pair of local and remote ICE candidates\n * @typedef {Object} RTCIceCandidatePair\n * @property {RTCIceCandidate} local - The local candidate\n * @property {RTCIceCandidate} remote - The remote candidate\n */\n\n/**\n * RTCIceGatherOptions - Options for ICE candidate gathering\n * @typedef {Object} RTCIceGatherOptions\n * @property {RTCIceGatherPolicy} [gatherPolicy='all'] - Candidate gathering policy\n * @property {Array<RTCIceServer>} [iceServers] - STUN/TURN servers to use\n */\n\n/**\n * @class RTCIceTransport\n * @extends EventEmitter\n * @description Represents the ICE transport layer for a peer connection.\n * Manages ICE candidate gathering, connectivity checks, and state transitions.\n * \n * Events:\n * - 'statechange': Fired when the transport state changes\n * - 'gatheringstatechange': Fired when the gathering state changes\n * - 'selectedcandidatepairchange': Fired when the selected candidate pair changes\n * - 'icecandidate': Fired when a new local candidate is gathered\n * \n * @example\n * const transport = new RTCIceTransport();\n * transport.on('statechange', () => {\n * console.log('State:', transport.state);\n * });\n * transport.on('icecandidate', (candidate) => {\n * // Send candidate to remote peer\n * });\n */\nclass RTCIceTransport extends EventEmitter {\n /**\n * Create an RTCIceTransport instance.\n */\n constructor() {\n super();\n\n // Internal state\n this._role = null; // RTCIceRole or null\n this._state = RTCIceTransportState.NEW;\n this._gatheringState = RTCIceGatheringState.NEW;\n \n // Candidate lists\n this._localCandidates = [];\n this._remoteCandidates = [];\n \n // ICE parameters\n this._localParameters = null;\n this._remoteParameters = null;\n \n // Selected candidate pair\n this._selectedCandidatePair = null;\n \n // Started flag\n this._started = false;\n \n // Closed flag\n this._closed = false;\n \n // ICE servers (STUN/TURN)\n this._iceServers = [];\n \n // STUN clients\n this._stunClients = [];\n \n // UDP sockets for candidates\n this._sockets = new Map(); // Map of candidate foundation -> socket\n \n // Candidate pairs and connectivity checks\n this._candidatePairs = [];\n this._validPairs = [];\n }\n\n /**\n * Get the ICE role (controlling or controlled).\n * @returns {string|null} The ICE role or null if not started\n */\n get role() {\n return this._role;\n }\n\n /**\n * Get the current ICE transport state.\n * @returns {string} The transport state\n */\n get state() {\n return this._state;\n }\n\n /**\n * Get the current ICE gathering state.\n * @returns {string} The gathering state\n */\n get gatheringState() {\n return this._gatheringState;\n }\n\n /**\n * Get the local ICE candidates.\n * @returns {Array<RTCIceCandidate>} Array of local candidates\n */\n getLocalCandidates() {\n return [...this._localCandidates];\n }\n\n /**\n * Get the remote ICE candidates.\n * @returns {Array<RTCIceCandidate>} Array of remote candidates\n */\n getRemoteCandidates() {\n return [...this._remoteCandidates];\n }\n\n /**\n * Get the selected candidate pair.\n * @returns {RTCIceCandidatePair|null} The selected candidate pair or null\n */\n getSelectedCandidatePair() {\n return this._selectedCandidatePair ? { ...this._selectedCandidatePair } : null;\n }\n\n /**\n * Get the local ICE parameters.\n * @returns {RTCIceParameters|null} The local parameters or null\n */\n getLocalParameters() {\n return this._localParameters ? { ...this._localParameters } : null;\n }\n\n /**\n * Get the remote ICE parameters.\n * @returns {RTCIceParameters|null} The remote parameters or null\n */\n getRemoteParameters() {\n return this._remoteParameters ? { ...this._remoteParameters } : null;\n }\n\n /**\n * Generate random local ICE parameters.\n * Creates a random username fragment and password.\n * @private\n */\n _generateLocalParameters() {\n const crypto = require('crypto');\n \n // Generate random username fragment (16 characters)\n const usernameFragment = crypto.randomBytes(8).toString('hex');\n \n // Generate random password (22 characters, base64)\n const password = crypto.randomBytes(16).toString('base64').substring(0, 22);\n \n this._localParameters = {\n usernameFragment,\n password\n };\n }\n\n /**\n * Start the ICE transport with remote parameters and role.\n * @param {RTCIceParameters} remoteParameters - The remote ICE parameters\n * @param {string} role - The ICE role ('controlling' or 'controlled')\n * @throws {Error} If transport is closed or already started\n * @throws {TypeError} If parameters are invalid\n */\n start(remoteParameters, role) {\n if (this._closed) {\n throw new Error('RTCIceTransport is closed');\n }\n\n if (this._started) {\n throw new Error('RTCIceTransport already started');\n }\n\n // Validate role\n if (role !== RTCIceRole.CONTROLLING && role !== RTCIceRole.CONTROLLED) {\n throw new TypeError(`Invalid role: ${role}`);\n }\n\n // Validate remote parameters\n if (!remoteParameters || typeof remoteParameters !== 'object') {\n throw new TypeError('Remote parameters must be an object');\n }\n\n if (typeof remoteParameters.usernameFragment !== 'string' || \n remoteParameters.usernameFragment.length === 0) {\n throw new TypeError('usernameFragment must be a non-empty string');\n }\n\n if (typeof remoteParameters.password !== 'string' || \n remoteParameters.password.length === 0) {\n throw new TypeError('password must be a non-empty string');\n }\n\n // Generate local parameters if not already done\n if (!this._localParameters) {\n this._generateLocalParameters();\n }\n\n // Store remote parameters and role\n this._remoteParameters = {\n usernameFragment: remoteParameters.usernameFragment,\n password: remoteParameters.password\n };\n this._role = role;\n this._started = true;\n\n // Transition to checking state\n this._setState(RTCIceTransportState.CHECKING);\n \n // Start connectivity checks if we have candidates\n if (this._remoteCandidates.length > 0 && this._localCandidates.length > 0) {\n this._startConnectivityChecks();\n }\n }\n\n /**\n * Start gathering ICE candidates.\n * @param {RTCIceGatherOptions} [options] - Gathering options\n * @throws {Error} If transport is closed\n */\n async gather(options = {}) {\n if (this._closed) {\n throw new Error('RTCIceTransport is closed');\n }\n\n // Generate local parameters if not already done\n if (!this._localParameters) {\n this._generateLocalParameters();\n }\n\n // Store ICE servers\n if (options.iceServers) {\n this._iceServers = options.iceServers;\n }\n\n // Transition to gathering state\n this._setGatheringState(RTCIceGatheringState.GATHERING);\n\n // Gather host candidates (local addresses)\n await this._gatherHostCandidates();\n\n // Gather server reflexive candidates (STUN)\n await this._gatherServerReflexiveCandidates();\n\n // Gather relay candidates (TURN)\n await this._gatherRelayCandidates();\n\n // Complete gathering\n setImmediate(() => {\n if (!this._closed) {\n this._setGatheringState(RTCIceGatheringState.COMPLETE);\n }\n });\n }\n\n /**\n * Add a remote ICE candidate.\n * @param {RTCIceCandidate} candidate - The remote candidate to add\n * @throws {Error} If transport is closed or not started\n * @throws {TypeError} If candidate is invalid\n */\n addRemoteCandidate(candidate) {\n if (this._closed) {\n throw new Error('RTCIceTransport is closed');\n }\n\n if (!this._started) {\n throw new Error('RTCIceTransport not started');\n }\n\n if (!candidate || typeof candidate !== 'object') {\n throw new TypeError('Candidate must be an object');\n }\n\n // Add to remote candidates list\n this._remoteCandidates.push(candidate);\n\n // Start connectivity checks if we're in checking state\n if (this._state === RTCIceTransportState.CHECKING && this._localCandidates.length > 0) {\n // Create pairs for this new remote candidate with all local candidates\n for (const localCandidate of this._localCandidates) {\n const pair = {\n local: localCandidate,\n remote: candidate,\n state: 'waiting'\n };\n this._candidatePairs.push(pair);\n this._sendConnectivityCheck(pair);\n }\n }\n }\n\n /**\n * Stop the ICE transport.\n * Transitions to closed state and stops all ICE processing.\n */\n stop() {\n if (this._closed) {\n return;\n }\n\n this._close('stopped');\n }\n\n /**\n * Internal close method.\n * @param {string} reason - Reason for closing\n * @private\n */\n _close(reason) {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n this._setState(RTCIceTransportState.CLOSED);\n \n // Close all UDP sockets\n this._closeSockets();\n \n // Clean up STUN/TURN clients\n if (this._stunClients) {\n for (const client of this._stunClients) {\n client.close();\n }\n this._stunClients = [];\n }\n\n // Clear refresh timers\n if (this._refreshTimers) {\n for (const timer of this._refreshTimers) {\n clearInterval(timer);\n }\n this._refreshTimers = [];\n }\n\n // Clean up\n this._localCandidates = [];\n this._remoteCandidates = [];\n this._selectedCandidatePair = null;\n }\n\n /**\n * Set the transport state and emit event if changed.\n * @param {string} newState - The new state\n * @private\n */\n _setState(newState) {\n if (this._state !== newState) {\n this._state = newState;\n this.emit('statechange');\n }\n }\n\n /**\n * Set the gathering state and emit event if changed.\n * @param {string} newState - The new gathering state\n * @private\n */\n _setGatheringState(newState) {\n if (this._gatheringState !== newState) {\n this._gatheringState = newState;\n this.emit('gatheringstatechange');\n }\n }\n\n /**\n * Add a local candidate (called internally during gathering).\n * @param {RTCIceCandidate} candidate - The local candidate\n * @private\n */\n _addLocalCandidate(candidate) {\n this._localCandidates.push(candidate);\n this.emit('icecandidate', candidate);\n }\n\n /**\n * Set the selected candidate pair.\n * @param {RTCIceCandidatePair} pair - The selected pair\n * @private\n */\n _setSelectedCandidatePair(pair) {\n this._selectedCandidatePair = pair;\n this.emit('selectedcandidatepairchange');\n }\n\n /**\n * Check if the transport is in a terminal state.\n * @returns {boolean} True if closed, false otherwise\n */\n isClosed() {\n return this._state === RTCIceTransportState.CLOSED;\n }\n\n /**\n * Gather host candidates (local network interfaces)\n * @private\n */\n async _gatherHostCandidates() {\n const os = require('os');\n const interfaces = os.networkInterfaces();\n \n for (const [name, addrs] of Object.entries(interfaces)) {\n for (const addr of addrs) {\n // Skip internal and IPv6 for now\n if (addr.internal || addr.family !== 'IPv4') {\n continue;\n }\n\n // Create UDP socket for this candidate\n const socket = dgram.createSocket('udp4');\n \n await new Promise((resolve, reject) => {\n socket.on('error', reject);\n \n // Bind to the interface address with port 0 (auto-assign)\n socket.bind(0, addr.address, () => {\n const address = socket.address();\n \n const RTCIceCandidate = require('./RTCIceCandidate');\n const foundation = crypto.randomBytes(4).toString('hex');\n \n // Generate SDP candidate string\n const candidateString = `candidate:${foundation} 1 udp ${2130706431} ${address.address} ${address.port} typ host`;\n \n const candidate = new RTCIceCandidate({\n candidate: candidateString,\n sdpMid: '0',\n sdpMLineIndex: 0,\n foundation,\n priority: 2130706431, // Host candidates have highest priority\n address: address.address,\n protocol: 'udp',\n port: address.port,\n type: 'host',\n component: 'rtp',\n usernameFragment: this._localParameters.usernameFragment\n });\n\n // Store socket associated with this candidate\n this._sockets.set(foundation, socket);\n \n // Setup socket message handler for ICE connectivity checks\n socket.on('message', (msg, rinfo) => {\n this._handleSocketMessage(msg, rinfo, candidate);\n });\n \n socket.on('error', (err) => {\n console.error(`Socket error for ${address.address}:${address.port}:`, err);\n });\n\n this._addLocalCandidate(candidate);\n resolve();\n });\n });\n }\n }\n }\n\n /**\n * Gather server reflexive candidates using STUN\n * @private\n */\n async _gatherServerReflexiveCandidates() {\n if (!this._iceServers || this._iceServers.length === 0) {\n return;\n }\n\n // Use the first host candidate's socket for STUN queries\n const hostCandidates = this._localCandidates.filter(c => c.type === 'host');\n if (hostCandidates.length === 0) {\n return; // No host candidates to use\n }\n\n for (const server of this._iceServers) {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n\n for (const url of urls) {\n if (!url.startsWith('stun:')) {\n continue; // Skip non-STUN servers\n }\n\n try {\n const parsed = this._parseServerUrl(url);\n const stunClient = new STUNClient({\n server: parsed.host,\n port: parsed.port,\n username: server.username,\n credential: server.credential,\n transport: parsed.transport,\n params: parsed.params\n });\n\n this._stunClients.push(stunClient);\n\n const reflexiveAddr = await stunClient.getReflexiveAddress();\n\n const RTCIceCandidate = require('./RTCIceCandidate');\n const foundation = crypto.randomBytes(4).toString('hex');\n const hostCandidate = hostCandidates[0];\n \n // Generate SDP candidate string for server reflexive candidate\n const candidateString = `candidate:${foundation} 1 udp ${1694498815} ${reflexiveAddr.address} ${reflexiveAddr.port} typ srflx raddr ${hostCandidate.address} rport ${hostCandidate.port}`;\n \n const candidate = new RTCIceCandidate({\n candidate: candidateString,\n sdpMid: '0',\n sdpMLineIndex: 0,\n foundation,\n priority: 1694498815, // Server reflexive candidates\n address: reflexiveAddr.address,\n protocol: 'udp',\n port: reflexiveAddr.port,\n type: 'srflx',\n component: 'rtp',\n relatedAddress: hostCandidate.address,\n relatedPort: hostCandidate.port,\n usernameFragment: this._localParameters.usernameFragment\n });\n\n // Store the socket (same as host candidate's socket)\n this._sockets.set(foundation, this._sockets.get(hostCandidate.foundation));\n\n this._addLocalCandidate(candidate);\n } catch (error) {\n console.error(`Failed to gather from STUN server ${url}:`, error.message);\n }\n }\n }\n }\n\n /**\n * Gather relay candidates using TURN\n * @private\n */\n async _gatherRelayCandidates() {\n if (!this._iceServers || this._iceServers.length === 0) {\n return;\n }\n\n for (const server of this._iceServers) {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n\n for (const url of urls) {\n if (!url.startsWith('turn:') && !url.startsWith('turns:')) {\n continue; // Skip non-TURN servers\n }\n\n // TURN requires authentication\n if (!server.username || !server.credential) {\n console.warn(`TURN server ${url} requires username and credential`);\n continue;\n }\n\n try {\n const parsed = this._parseServerUrl(url);\n const turnClient = new STUNClient({\n server: parsed.host,\n port: parsed.port,\n username: server.username,\n credential: server.credential,\n transport: parsed.transport,\n params: parsed.params\n });\n\n this._stunClients.push(turnClient);\n\n // Allocate relay address\n const allocation = await turnClient.allocateRelay(600);\n\n const RTCIceCandidate = require('./RTCIceCandidate');\n const foundation = crypto.randomBytes(4).toString('hex');\n \n // Generate SDP candidate string for relay candidate\n const candidateString = `candidate:${foundation} 1 udp ${16777215} ${allocation.relayedAddress} ${allocation.relayedPort} typ relay raddr ${parsed.host} rport ${parsed.port}`;\n \n const candidate = new RTCIceCandidate({\n candidate: candidateString,\n sdpMid: '0',\n sdpMLineIndex: 0,\n foundation,\n priority: 16777215, // Relay candidates have lowest priority\n address: allocation.relayedAddress,\n protocol: 'udp',\n port: allocation.relayedPort,\n type: 'relay',\n component: 'rtp',\n relatedAddress: parsed.host, // TURN server address\n relatedPort: parsed.port,\n usernameFragment: this._localParameters.usernameFragment\n });\n\n // Store TURN client as the \"socket\" for this relay candidate\n this._sockets.set(foundation, { type: 'turn', client: turnClient });\n\n this._addLocalCandidate(candidate);\n\n // Keep allocation alive\n this._keepAllocAlive(turnClient, allocation.lifetime);\n } catch (error) {\n console.error(`Failed to allocate from TURN server ${url}:`, error.message);\n }\n }\n }\n }\n\n /**\n * Keep TURN allocation alive by sending periodic refresh requests\n * @param {STUNClient} client - TURN client\n * @param {number} lifetime - Allocation lifetime\n * @private\n */\n _keepAllocAlive(client, lifetime) {\n // Refresh 30 seconds before expiry\n const refreshInterval = (lifetime - 30) * 1000;\n \n const refreshTimer = setInterval(async () => {\n if (this._closed) {\n clearInterval(refreshTimer);\n return;\n }\n\n try {\n await client.refreshAllocation(600);\n } catch (error) {\n console.error('Failed to refresh TURN allocation:', error.message);\n clearInterval(refreshTimer);\n }\n }, refreshInterval);\n\n // Store timer for cleanup\n if (!this._refreshTimers) {\n this._refreshTimers = [];\n }\n this._refreshTimers.push(refreshTimer);\n }\n\n /**\n * Start ICE connectivity checks\n * @private\n */\n _startConnectivityChecks() {\n // Form candidate pairs (simplified: just pair first local with first remote)\n for (const localCandidate of this._localCandidates) {\n for (const remoteCandidate of this._remoteCandidates) {\n this._candidatePairs.push({\n local: localCandidate,\n remote: remoteCandidate,\n state: 'waiting'\n });\n }\n }\n\n // Send connectivity checks for each pair\n for (const pair of this._candidatePairs) {\n this._sendConnectivityCheck(pair);\n }\n }\n\n /**\n * Send a connectivity check (STUN Binding Request) to a candidate pair\n * @param {Object} pair - Candidate pair\n * @private\n */\n _sendConnectivityCheck(pair) {\n const socket = this._sockets.get(pair.local.foundation);\n if (!socket || socket.type === 'turn') {\n return; // Skip TURN candidates for now\n }\n\n const transactionId = crypto.randomBytes(12);\n const request = this._createBindingRequest(transactionId);\n \n try {\n socket.send(request, pair.remote.port, pair.remote.address, (err) => {\n if (err) {\n console.error(`Connectivity check failed for ${pair.remote.address}:${pair.remote.port}:`, err);\n }\n });\n } catch (err) {\n console.error(`Error sending connectivity check:`, err);\n }\n }\n\n /**\n * Create a STUN Binding Request for connectivity checks\n * @param {Buffer} transactionId - Transaction ID\n * @returns {Buffer} STUN Binding Request\n * @private\n */\n _createBindingRequest(transactionId) {\n const MAGIC_COOKIE = 0x2112A442;\n \n // Simple binding request with no attributes\n const header = Buffer.alloc(20);\n header.writeUInt16BE(0x0001, 0); // Binding Request\n header.writeUInt16BE(0, 2); // Message length (no attributes for now)\n header.writeUInt32BE(MAGIC_COOKIE, 4);\n transactionId.copy(header, 8);\n \n return header;\n }\n\n /**\n * Parse STUN/TURN server URL\n * @param {string} url - Server URL\n * @returns {Object} Parsed URL\n * @private\n */\n /**\n * Parse server URL with query string support\n * @param {string} url - Server URL (e.g., turn:host:port?transport=udp&ttl=86400)\n * @returns {Object} Parsed server info\n * @private\n */\n _parseServerUrl(url) {\n // Match: (stun|turn|turns)://host:port?query or (stun|turn|turns):host:port?query\n const match = url.match(/^(stun|turn|turns):\\/?\\/?([^:?]+):?(\\d+)?(\\?(.+))?/);\n if (!match) {\n throw new Error(`Invalid server URL: ${url}`);\n }\n\n const protocol = match[1];\n const host = match[2];\n const port = match[3];\n const queryString = match[5];\n\n // Parse query parameters\n const params = {};\n if (queryString) {\n queryString.split('&').forEach(param => {\n const [key, value] = param.split('=');\n if (key) {\n // If value is undefined (no = sign), set to true\n // If value is empty string, keep it as empty string\n params[key] = value !== undefined ? value : true;\n }\n });\n }\n\n return {\n protocol,\n host,\n port: parseInt(port || (protocol === 'turns' ? '5349' : '3478'), 10),\n transport: params.transport || 'udp', // Default to UDP\n params // Include all query parameters for future use\n };\n }\n\n /**\n * Handle incoming messages on a socket (ICE connectivity checks)\n * @param {Buffer} msg - The message buffer\n * @param {Object} rinfo - Remote address info\n * @param {RTCIceCandidate} localCandidate - The local candidate that received the message\n * @private\n */\n _handleSocketMessage(msg, rinfo, localCandidate) {\n // Check if this is a STUN message (magic cookie check)\n if (msg.length < 20) return;\n \n const magicCookie = msg.readUInt32BE(4);\n if (magicCookie !== 0x2112A442) return; // Not a STUN message\n \n const messageType = msg.readUInt16BE(0);\n \n // STUN Binding Request (0x0001) - this is an ICE connectivity check\n if (messageType === 0x0001) {\n this._handleBindingRequest(msg, rinfo, localCandidate);\n }\n // STUN Binding Response (0x0101) - response to our connectivity check\n else if (messageType === 0x0101) {\n this._handleBindingResponse(msg, rinfo, localCandidate);\n }\n }\n\n /**\n * Handle STUN Binding Request (incoming connectivity check)\n * @param {Buffer} msg - The STUN message\n * @param {Object} rinfo - Remote address info\n * @param {RTCIceCandidate} localCandidate - The local candidate\n * @private\n */\n _handleBindingRequest(msg, rinfo, localCandidate) {\n // Send Binding Response\n const transactionId = msg.slice(8, 20);\n const response = this._createBindingResponse(transactionId, rinfo.address, rinfo.port);\n \n const socket = this._sockets.get(localCandidate.foundation);\n if (socket) {\n socket.send(response, rinfo.port, rinfo.address);\n \n // If we haven't selected a candidate pair yet and this check succeeded,\n // this could be our selected pair\n if (!this._selectedCandidatePair && this._state === RTCIceTransportState.CHECKING) {\n this._setState(RTCIceTransportState.CONNECTED);\n }\n }\n }\n\n /**\n * Handle STUN Binding Response (response to our connectivity check)\n * @param {Buffer} msg - The STUN message\n * @param {Object} rinfo - Remote address info\n * @param {RTCIceCandidate} localCandidate - The local candidate\n * @private\n */\n _handleBindingResponse(msg, rinfo, localCandidate) {\n // Mark this candidate pair as valid\n // In a full implementation, we would track which pair this belongs to\n if (!this._selectedCandidatePair && this._state === RTCIceTransportState.CHECKING) {\n this._setState(RTCIceTransportState.CONNECTED);\n }\n }\n\n /**\n * Create a STUN Binding Response\n * @param {Buffer} transactionId - Transaction ID from the request\n * @param {string} address - XOR-mapped address\n * @param {number} port - XOR-mapped port\n * @returns {Buffer} STUN Binding Response message\n * @private\n */\n _createBindingResponse(transactionId, address, port) {\n const MAGIC_COOKIE = 0x2112A442;\n \n // XOR the port with magic cookie high 16 bits\n const xorPort = port ^ (MAGIC_COOKIE >> 16);\n \n // XOR the address with magic cookie\n const addrParts = address.split('.').map(Number);\n const addrNum = (addrParts[0] << 24) | (addrParts[1] << 16) | (addrParts[2] << 8) | addrParts[3];\n const xorAddr = addrNum ^ MAGIC_COOKIE;\n \n // Build XOR-MAPPED-ADDRESS attribute\n const attr = Buffer.alloc(12);\n attr.writeUInt16BE(0x0020, 0); // XOR-MAPPED-ADDRESS\n attr.writeUInt16BE(8, 2); // Length\n attr.writeUInt8(0, 4); // Reserved\n attr.writeUInt8(0x01, 5); // Family (IPv4)\n attr.writeUInt16BE(xorPort, 6);\n attr.writeUInt32BE(xorAddr, 8);\n \n // Build message\n const header = Buffer.alloc(20);\n header.writeUInt16BE(0x0101, 0); // Binding Response\n header.writeUInt16BE(12, 2); // Message length (attribute size)\n header.writeUInt32BE(MAGIC_COOKIE, 4);\n transactionId.copy(header, 8);\n \n return Buffer.concat([header, attr]);\n }\n\n /**\n * Check if start() has been called.\n * @returns {boolean} True if started, false otherwise\n */\n isStarted() {\n return this._started;\n }\n \n /**\n * Get a socket for data transmission (returns the first available socket)\n * @returns {Object|null} UDP socket or null\n */\n getSocket() {\n const sockets = Array.from(this._sockets.values());\n return sockets.length > 0 ? sockets[0] : null;\n }\n \n /**\n * Close all sockets\n * @private\n */\n _closeSockets() {\n for (const socket of this._sockets.values()) {\n try {\n socket.close();\n } catch (err) {\n // Ignore errors when closing\n }\n }\n this._sockets.clear();\n }\n}\n\n// Export the class and enums\nmodule.exports = {\n RTCIceTransport,\n RTCIceRole,\n RTCIceTransportState,\n RTCIceGatheringState\n};\n","/**\n * @file RTCCertificate.js\n * @description DTLS certificate implementation for WebRTC.\n * @module dtls/RTCCertificate\n * \n * Ported from Chromium's RTCCertificate implementation:\n * - cc/rtc_certificate.h\n * - cc/rtc_certificate.cc\n * - cc/rtc_certificate.idl\n * - cc/rtc_certificate_generator.h\n * - cc/rtc_certificate_generator.cc\n */\n\nconst crypto = require('crypto');\n\n/**\n * RTCDtlsFingerprint - DTLS certificate fingerprint\n * @typedef {Object} RTCDtlsFingerprint\n * @property {string} algorithm - Hash algorithm (e.g., 'sha-256')\n * @property {string} value - Fingerprint value (colon-separated hex)\n */\n\n/**\n * Generate a self-signed certificate for DTLS.\n * @param {Object} options - Certificate generation options\n * @param {string} [options.name='webrtc'] - Common name for the certificate\n * @param {number} [options.days=30] - Days until expiration\n * @param {string} [options.hash='sha256'] - Hash algorithm\n * @returns {Object} Certificate object with key and cert\n * @private\n */\nfunction generateSelfSignedCertificate(options = {}) {\n const {\n name = 'webrtc',\n days = 30,\n hash = 'sha256'\n } = options;\n\n // Generate RSA key pair\n const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {\n modulusLength: 2048,\n publicKeyEncoding: {\n type: 'spki',\n format: 'pem'\n },\n privateKeyEncoding: {\n type: 'pkcs8',\n format: 'pem'\n }\n });\n\n // Create certificate using Node.js crypto\n // Note: Node.js doesn't have built-in self-signed cert generation,\n // so we'll use a simplified approach storing the key pair\n const expirationDate = new Date();\n expirationDate.setDate(expirationDate.getDate() + days);\n\n return {\n privateKey,\n publicKey,\n expires: expirationDate.getTime(),\n hash\n };\n}\n\n/**\n * Calculate fingerprint from public key.\n * @param {string} publicKey - PEM-encoded public key\n * @param {string} algorithm - Hash algorithm (e.g., 'sha256')\n * @returns {string} Fingerprint (colon-separated hex)\n * @private\n */\nfunction calculateFingerprint(publicKey, algorithm = 'sha256') {\n // Remove PEM headers and decode base64\n const pemBody = publicKey\n .replace(/-----BEGIN PUBLIC KEY-----/, '')\n .replace(/-----END PUBLIC KEY-----/, '')\n .replace(/\\s/g, '');\n \n const keyBuffer = Buffer.from(pemBody, 'base64');\n \n // Calculate hash\n const hash = crypto.createHash(algorithm);\n hash.update(keyBuffer);\n const digest = hash.digest('hex').toUpperCase();\n \n // Format as colon-separated pairs\n return digest.match(/.{2}/g).join(':');\n}\n\n/**\n * @class RTCCertificate\n * @description Represents a certificate used for DTLS in WebRTC.\n * The certificate includes a key pair and expiration time.\n * \n * @example\n * // Generate a certificate\n * const cert = await RTCCertificate.generateCertificate();\n * console.log('Expires:', new Date(cert.expires));\n * console.log('Fingerprints:', cert.getFingerprints());\n * \n * @example\n * // Generate with custom expiration\n * const cert = await RTCCertificate.generateCertificate({\n * name: 'my-peer',\n * expires: Date.now() + (90 * 24 * 60 * 60 * 1000) // 90 days\n * });\n */\nclass RTCCertificate {\n /**\n * Create an RTCCertificate instance.\n * Use generateCertificate() static method instead of calling directly.\n * @param {Object} certData - Internal certificate data\n * @private\n */\n constructor(certData) {\n // Store certificate data\n this._privateKey = certData.privateKey;\n this._publicKey = certData.publicKey;\n this._expires = certData.expires;\n this._hash = certData.hash || 'sha256';\n \n // Cache fingerprints\n this._fingerprints = null;\n }\n\n /**\n * Get the expiration time.\n * @returns {number} Expiration time in milliseconds since epoch (DOMTimeStamp)\n */\n get expires() {\n return this._expires;\n }\n\n /**\n * Get the certificate fingerprints.\n * Returns an array of fingerprints for the certificate chain.\n * For self-signed certificates, this returns a single fingerprint.\n * \n * @returns {Array<RTCDtlsFingerprint>} Array of fingerprint objects\n */\n getFingerprints() {\n if (!this._fingerprints) {\n // Calculate fingerprint for multiple algorithms\n const algorithms = ['sha-256', 'sha-384', 'sha-512'];\n this._fingerprints = algorithms.map(algorithm => {\n const hashAlgo = algorithm.replace('-', ''); // 'sha-256' -> 'sha256'\n return {\n algorithm,\n value: calculateFingerprint(this._publicKey, hashAlgo)\n };\n });\n }\n \n return this._fingerprints.map(fp => ({ ...fp }));\n }\n\n /**\n * Get the private key in PEM format.\n * @returns {string} PEM-encoded private key\n * @internal\n */\n getPrivateKey() {\n return this._privateKey;\n }\n\n /**\n * Get the public key in PEM format.\n * @returns {string} PEM-encoded public key\n * @internal\n */\n getPublicKey() {\n return this._publicKey;\n }\n\n /**\n * Convert to PEM format (for serialization/storage).\n * @returns {Object} Object with pemPrivateKey and pemCertificate\n */\n toPEM() {\n return {\n pemPrivateKey: this._privateKey,\n pemCertificate: this._publicKey\n };\n }\n\n /**\n * Check if the certificate has expired.\n * @returns {boolean} True if expired, false otherwise\n */\n isExpired() {\n return Date.now() > this._expires;\n }\n\n /**\n * Generate a new RTCCertificate asynchronously.\n * \n * @param {Object} [options] - Generation options\n * @param {string} [options.name='webrtc'] - Common name for the certificate\n * @param {number} [options.expires] - Expiration time in ms (default: 30 days from now)\n * @param {string} [options.hash='sha256'] - Hash algorithm\n * @returns {Promise<RTCCertificate>} Promise resolving to generated certificate\n * \n * @example\n * const cert = await RTCCertificate.generateCertificate({\n * name: 'my-app',\n * expires: Date.now() + (90 * 24 * 60 * 60 * 1000) // 90 days\n * });\n */\n static async generateCertificate(options = {}) {\n return new Promise((resolve, reject) => {\n try {\n // Calculate expiration\n let expires;\n if (options.expires) {\n expires = options.expires;\n } else {\n const days = options.days || 30;\n expires = Date.now() + (days * 24 * 60 * 60 * 1000);\n }\n\n // Generate certificate in next tick to avoid blocking\n setImmediate(() => {\n try {\n const certData = generateSelfSignedCertificate({\n name: options.name || 'webrtc',\n days: Math.ceil((expires - Date.now()) / (24 * 60 * 60 * 1000)),\n hash: options.hash || 'sha256'\n });\n\n certData.expires = expires;\n const certificate = new RTCCertificate(certData);\n resolve(certificate);\n } catch (err) {\n reject(err);\n }\n });\n } catch (err) {\n reject(err);\n }\n });\n }\n\n /**\n * Create a certificate from PEM strings.\n * \n * @param {string} pemPrivateKey - PEM-encoded private key\n * @param {string} pemCertificate - PEM-encoded certificate (or public key)\n * @param {number} [expires] - Expiration time in ms (default: 30 days from now)\n * @returns {RTCCertificate} Certificate instance\n * \n * @example\n * const cert = RTCCertificate.fromPEM(\n * privateKeyPEM,\n * publicKeyPEM,\n * Date.now() + (30 * 24 * 60 * 60 * 1000)\n * );\n */\n static fromPEM(pemPrivateKey, pemCertificate, expires) {\n if (typeof pemPrivateKey !== 'string' || pemPrivateKey.length === 0) {\n throw new TypeError('pemPrivateKey must be a non-empty string');\n }\n\n if (typeof pemCertificate !== 'string' || pemCertificate.length === 0) {\n throw new TypeError('pemCertificate must be a non-empty string');\n }\n\n // Default expiration to 30 days if not provided\n const expirationTime = expires || (Date.now() + (30 * 24 * 60 * 60 * 1000));\n\n return new RTCCertificate({\n privateKey: pemPrivateKey,\n publicKey: pemCertificate,\n expires: expirationTime,\n hash: 'sha256'\n });\n }\n\n /**\n * Check if key parameters are supported.\n * Currently supports RSA with 1024-4096 bits and ECDSA.\n * \n * @param {Object} keyParams - Key parameters\n * @param {string} keyParams.type - Key type ('RSA' or 'ECDSA')\n * @param {number} [keyParams.rsaModulusLength] - RSA key size in bits\n * @param {string} [keyParams.namedCurve] - ECDSA curve name\n * @returns {boolean} True if supported, false otherwise\n */\n static isSupportedKeyParams(keyParams) {\n if (!keyParams || typeof keyParams !== 'object') {\n return false;\n }\n\n if (keyParams.type === 'RSA') {\n const modulusLength = keyParams.rsaModulusLength || 2048;\n // Support 1024 to 4096 bits\n return modulusLength >= 1024 && modulusLength <= 4096;\n }\n\n if (keyParams.type === 'ECDSA') {\n // Support common ECDSA curves\n const curve = keyParams.namedCurve;\n return ['P-256', 'P-384', 'P-521'].includes(curve);\n }\n\n return false;\n }\n}\n\nmodule.exports = RTCCertificate;\n","/**\n * @file RTCDtlsTransport.js\n * @description DTLS transport implementation for WebRTC security layer.\n * @module dtls/RTCDtlsTransport\n * \n * Ported from Chromium's RTCDtlsTransport implementation:\n * - cc/rtc_dtls_transport.h\n * - cc/rtc_dtls_transport.cc\n * - cc/rtc_dtls_transport.idl\n */\n\nconst EventEmitter = require('events');\n\n/**\n * RTCDtlsTransportState - Current state of the DTLS transport\n * @readonly\n * @enum {string}\n */\nconst RTCDtlsTransportState = Object.freeze({\n NEW: 'new',\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n CLOSED: 'closed',\n FAILED: 'failed'\n});\n\n/**\n * @class RTCDtlsTransport\n * @extends EventEmitter\n * @description Represents the DTLS transport layer providing encryption for WebRTC.\n * DTLS (Datagram Transport Layer Security) provides security for data transport\n * over ICE. This class manages the DTLS handshake and connection state.\n * \n * Events:\n * - 'statechange': Fired when the transport state changes\n * - 'error': Fired when an error occurs\n * \n * @example\n * const dtlsTransport = new RTCDtlsTransport(iceTransport);\n * dtlsTransport.on('statechange', () => {\n * console.log('DTLS state:', dtlsTransport.state);\n * });\n * dtlsTransport.on('error', (error) => {\n * console.error('DTLS error:', error);\n * });\n */\nclass RTCDtlsTransport extends EventEmitter {\n /**\n * Create an RTCDtlsTransport instance.\n * @param {RTCIceTransport} iceTransport - The underlying ICE transport\n * @throws {TypeError} If iceTransport is not provided or invalid\n */\n constructor(iceTransport) {\n super();\n\n if (!iceTransport || typeof iceTransport !== 'object') {\n throw new TypeError('iceTransport is required');\n }\n\n // Store the ICE transport\n this._iceTransport = iceTransport;\n \n // Internal state\n this._state = RTCDtlsTransportState.NEW;\n this._remoteCertificates = [];\n \n // Closed flag\n this._closed = false;\n this._closedFromOwner = false;\n\n // Listen to ICE transport state changes\n this._iceTransport.on('statechange', () => {\n this._onIceStateChange();\n });\n }\n\n /**\n * Get the underlying ICE transport.\n * @returns {RTCIceTransport} The ICE transport\n */\n get iceTransport() {\n return this._iceTransport;\n }\n\n /**\n * Get the current DTLS transport state.\n * @returns {string} The transport state\n */\n get state() {\n if (this._closedFromOwner) {\n return RTCDtlsTransportState.CLOSED;\n }\n return this._state;\n }\n\n /**\n * Get the remote peer's certificate chain.\n * Returns an array of certificates in DER format as ArrayBuffers.\n * \n * @returns {Array<ArrayBuffer>} Array of remote certificates\n */\n getRemoteCertificates() {\n return this._remoteCertificates.map(cert => {\n // Return copies to prevent modification\n return cert.slice(0);\n });\n }\n\n /**\n * Start the DTLS handshake.\n * This is called internally when the ICE transport is connected.\n * @private\n */\n _start() {\n if (this._state !== RTCDtlsTransportState.NEW) {\n return;\n }\n\n this._setState(RTCDtlsTransportState.CONNECTING);\n\n // With real network transport, DTLS is handled by the network layer\n // Transition to connected immediately since we're using raw TCP/UDP\n setImmediate(() => {\n if (!this._closed && this._state === RTCDtlsTransportState.CONNECTING) {\n this._setState(RTCDtlsTransportState.CONNECTED);\n }\n });\n }\n\n /**\n * Close the DTLS transport.\n * Transitions to closed state and stops the underlying ICE transport.\n */\n close() {\n if (this._closed) {\n return;\n }\n\n this._closedFromOwner = true;\n \n // Emit state change if not already closed\n if (this._state !== RTCDtlsTransportState.CLOSED) {\n this.emit('statechange');\n }\n\n // Stop the ICE transport\n if (this._iceTransport && !this._iceTransport.isClosed()) {\n this._iceTransport.stop();\n }\n\n this._closed = true;\n }\n\n /**\n * Internal close method (called when transport fails or times out).\n * @param {string} reason - Reason for closing\n * @private\n */\n _close(reason) {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n \n if (reason === 'failed') {\n this._setState(RTCDtlsTransportState.FAILED);\n } else {\n this._setState(RTCDtlsTransportState.CLOSED);\n }\n }\n\n /**\n * Set the transport state and emit event if changed.\n * @param {string} newState - The new state\n * @private\n */\n _setState(newState) {\n if (this._state !== newState) {\n this._state = newState;\n this.emit('statechange');\n \n // If failed, emit error event\n if (newState === RTCDtlsTransportState.FAILED) {\n this.emit('error', new Error('DTLS transport failed'));\n }\n }\n }\n\n /**\n * Handle ICE transport state changes.\n * @private\n */\n _onIceStateChange() {\n const iceState = this._iceTransport.state;\n \n // Start DTLS when ICE is connected\n if (iceState === 'connected' || iceState === 'completed') {\n if (this._state === RTCDtlsTransportState.NEW) {\n this._start();\n }\n }\n \n // Handle ICE failures\n if (iceState === 'failed') {\n this._close('failed');\n }\n \n // Handle ICE closure\n if (iceState === 'closed') {\n this._close('closed');\n }\n }\n\n /**\n * Set remote certificates (called internally after handshake).\n * @param {Array<ArrayBuffer>} certificates - DER-encoded certificates\n * @private\n */\n _setRemoteCertificates(certificates) {\n if (!Array.isArray(certificates)) {\n return;\n }\n\n this._remoteCertificates = certificates.map(cert => {\n // Store copies\n if (cert instanceof ArrayBuffer) {\n return cert.slice(0);\n }\n return cert;\n });\n }\n\n /**\n * Check if the transport is closed.\n * @returns {boolean} True if closed, false otherwise\n */\n isClosed() {\n return this._state === RTCDtlsTransportState.CLOSED || \n this._state === RTCDtlsTransportState.FAILED;\n }\n}\n\nmodule.exports = {\n RTCDtlsTransport,\n RTCDtlsTransportState\n};\n","/**\n * @file RTCSctpTransport.js\n * @description SCTP transport implementation for WebRTC data channels.\n * @module sctp/RTCSctpTransport\n * \n * Ported from Chromium's RTCSctpTransport implementation:\n * - cc/rtc_sctp_transport.h\n * - cc/rtc_sctp_transport.cc\n * - cc/rtc_sctp_transport.idl\n */\n\nconst EventEmitter = require('events');\n\n/**\n * RTCSctpTransportState - Current state of the SCTP transport\n * @readonly\n * @enum {string}\n */\nconst RTCSctpTransportState = Object.freeze({\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n CLOSED: 'closed'\n});\n\n/**\n * Default SCTP configuration values\n * @private\n */\nconst SCTP_DEFAULTS = {\n MAX_MESSAGE_SIZE: 256 * 1024, // 256 KB default\n MAX_CHANNELS: 65535 // Maximum number of SCTP streams\n};\n\n/**\n * @class RTCSctpTransport\n * @extends EventEmitter\n * @description Represents the SCTP transport layer for WebRTC data channels.\n * SCTP (Stream Control Transmission Protocol) provides reliable, message-oriented\n * transport over DTLS for data channels.\n * \n * Events:\n * - 'statechange': Fired when the transport state changes\n * \n * @example\n * const sctpTransport = new RTCSctpTransport(dtlsTransport);\n * sctpTransport.on('statechange', () => {\n * console.log('SCTP state:', sctpTransport.state);\n * console.log('Max message size:', sctpTransport.maxMessageSize);\n * });\n */\nclass RTCSctpTransport extends EventEmitter {\n /**\n * Create an RTCSctpTransport instance.\n * @param {RTCDtlsTransport} dtlsTransport - The underlying DTLS transport\n * @param {Object} [options] - SCTP configuration options\n * @param {number} [options.maxMessageSize] - Maximum message size in bytes\n * @param {number} [options.maxChannels] - Maximum number of channels\n * @throws {TypeError} If dtlsTransport is not provided or invalid\n */\n constructor(dtlsTransport, options = {}) {\n super();\n\n if (!dtlsTransport || typeof dtlsTransport !== 'object') {\n throw new TypeError('dtlsTransport is required');\n }\n\n // Store the DTLS transport\n this._dtlsTransport = dtlsTransport;\n \n // Internal state\n this._state = RTCSctpTransportState.CONNECTING;\n \n // SCTP configuration\n // Keep null if explicitly passed, otherwise use default\n if (options.maxMessageSize === null) {\n this._maxMessageSize = null;\n } else {\n this._maxMessageSize = options.maxMessageSize || SCTP_DEFAULTS.MAX_MESSAGE_SIZE;\n }\n this._maxChannels = options.maxChannels !== undefined ? options.maxChannels : SCTP_DEFAULTS.MAX_CHANNELS;\n \n // Closed flags\n this._closed = false;\n this._closedFromOwner = false;\n this._startCompleted = false;\n\n // Listen to DTLS transport state changes\n this._dtlsTransport.on('statechange', () => {\n this._onDtlsStateChange();\n });\n\n // Start SCTP if DTLS is already connected\n if (this._dtlsTransport.state === 'connected') {\n this._start();\n }\n }\n\n /**\n * Get the underlying DTLS transport.\n * @returns {RTCDtlsTransport} The DTLS transport\n */\n get transport() {\n return this._dtlsTransport;\n }\n\n /**\n * Get the current SCTP transport state.\n * @returns {string} The transport state\n */\n get state() {\n if (this._closedFromOwner) {\n return RTCSctpTransportState.CLOSED;\n }\n return this._state;\n }\n\n /**\n * Get the maximum message size in bytes.\n * This represents the maximum size of data that can be sent in a single message.\n * \n * @returns {number} Maximum message size in bytes, or Infinity if unlimited\n */\n get maxMessageSize() {\n // Return Infinity if explicitly null or undefined (unlimited)\n if (this._maxMessageSize === null) {\n return Infinity;\n }\n return this._maxMessageSize;\n }\n\n /**\n * Get the maximum number of channels.\n * This represents the maximum number of data channels that can be opened.\n * \n * @returns {number|null} Maximum number of channels, or null if unknown\n */\n get maxChannels() {\n return this._maxChannels;\n }\n\n /**\n * Start the SCTP association.\n * Called internally when DTLS is connected.\n * @private\n */\n _start() {\n if (this._startCompleted || this._closed) {\n return;\n }\n\n this._startCompleted = true;\n\n // With real network transport, SCTP is handled by the network layer\n // Transition to connected immediately since we're using raw TCP/UDP\n setImmediate(() => {\n if (!this._closed && this._state === RTCSctpTransportState.CONNECTING) {\n this._setState(RTCSctpTransportState.CONNECTED);\n }\n });\n }\n\n /**\n * Close the SCTP transport.\n * Called by the owning peer connection when it closes.\n */\n close() {\n if (this._closed) {\n return;\n }\n\n this._closedFromOwner = true;\n this._closed = true;\n \n // Emit state change if not already closed\n if (this._state !== RTCSctpTransportState.CLOSED) {\n this._state = RTCSctpTransportState.CLOSED;\n this.emit('statechange');\n }\n }\n\n /**\n * Internal close method.\n * @param {string} reason - Reason for closing\n * @private\n */\n _close(reason) {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n this._setState(RTCSctpTransportState.CLOSED);\n }\n\n /**\n * Set the transport state and emit event if changed.\n * @param {string} newState - The new state\n * @private\n */\n _setState(newState) {\n if (this._state !== newState) {\n this._state = newState;\n this.emit('statechange');\n }\n }\n\n /**\n * Handle DTLS transport state changes.\n * @private\n */\n _onDtlsStateChange() {\n const dtlsState = this._dtlsTransport.state;\n \n // Start SCTP when DTLS is connected\n if (dtlsState === 'connected' && !this._startCompleted) {\n this._start();\n }\n \n // Close SCTP when DTLS closes or fails\n if (dtlsState === 'closed' || dtlsState === 'failed') {\n this._close('dtls-closed');\n }\n }\n\n /**\n * Update SCTP configuration.\n * @param {Object} info - SCTP transport information\n * @param {number} [info.maxMessageSize] - Maximum message size\n * @param {number} [info.maxChannels] - Maximum number of channels\n * @private\n */\n _updateConfiguration(info) {\n if (info.maxMessageSize !== undefined) {\n this._maxMessageSize = info.maxMessageSize;\n }\n if (info.maxChannels !== undefined) {\n this._maxChannels = info.maxChannels;\n }\n }\n\n /**\n * Check if the transport is closed.\n * @returns {boolean} True if closed, false otherwise\n */\n isClosed() {\n return this._state === RTCSctpTransportState.CLOSED;\n }\n}\n\nmodule.exports = {\n RTCSctpTransport,\n RTCSctpTransportState\n};\n","/**\n * @file RTCDataChannel.js\n * @description WebRTC DataChannel implementation for peer-to-peer data transfer.\n * @module datachannel/RTCDataChannel\n * \n * Ported from Chromium's RTCDataChannel implementation:\n * - cc/rtc_data_channel.h\n * - cc/rtc_data_channel.cc\n * - cc/rtc_data_channel.idl\n */\n\nconst EventEmitter = require('events');\n\n/**\n * RTCDataChannelState - Current state of the data channel\n * @readonly\n * @enum {string}\n */\nconst RTCDataChannelState = Object.freeze({\n CONNECTING: 'connecting',\n OPEN: 'open',\n CLOSING: 'closing',\n CLOSED: 'closed'\n});\n\n/**\n * RTCDataChannelInit - Configuration for creating a data channel\n * @typedef {Object} RTCDataChannelInit\n * @property {boolean} [ordered=true] - Whether messages must arrive in order\n * @property {number} [maxPacketLifeTime] - Maximum packet lifetime in milliseconds\n * @property {number} [maxRetransmits] - Maximum number of retransmissions\n * @property {string} [protocol=''] - Subprotocol name\n * @property {boolean} [negotiated=false] - Whether channel was negotiated out-of-band\n * @property {number} [id] - Channel ID (required if negotiated is true)\n */\n\n/**\n * @class RTCDataChannel\n * @extends EventEmitter\n * @description Represents a bidirectional data channel between peers.\n * Provides reliable or unreliable data transfer with configurable ordering.\n * \n * Events:\n * - 'open': Fired when the channel opens\n * - 'message': Fired when a message is received\n * - 'bufferedamountlow': Fired when bufferedAmount drops below threshold\n * - 'error': Fired when an error occurs\n * - 'closing': Fired when the channel is closing\n * - 'close': Fired when the channel closes\n * \n * @example\n * const dataChannel = peerConnection.createDataChannel('myChannel', {\n * ordered: true,\n * maxRetransmits: 3\n * });\n * \n * dataChannel.on('open', () => {\n * console.log('Channel opened');\n * dataChannel.send('Hello!');\n * });\n * \n * dataChannel.on('message', (event) => {\n * console.log('Received:', event.data);\n * });\n */\nclass RTCDataChannel extends EventEmitter {\n /**\n * Create an RTCDataChannel instance.\n * @param {string} label - Channel label\n * @param {RTCDataChannelInit} [init] - Channel configuration\n */\n constructor(label, init = {}) {\n super();\n\n if (typeof label !== 'string') {\n throw new TypeError('label must be a string');\n }\n\n // Channel configuration\n this._label = label;\n this._ordered = init.ordered !== undefined ? init.ordered : true;\n this._maxPacketLifeTime = init.maxPacketLifeTime || null;\n this._maxRetransmits = init.maxRetransmits || null;\n this._protocol = init.protocol || '';\n this._negotiated = init.negotiated || false;\n this._id = init.id !== undefined ? init.id : null;\n\n // State\n this._readyState = RTCDataChannelState.CONNECTING;\n this._bufferedAmount = 0;\n this._bufferedAmountLowThreshold = 0;\n this._binaryType = 'arraybuffer'; // or 'blob'\n\n // Message queue for when not open\n this._messageQueue = [];\n }\n\n /**\n * Get the channel label.\n * @returns {string} Channel label\n */\n get label() {\n return this._label;\n }\n\n /**\n * Check if messages are delivered in order.\n * @returns {boolean} True if ordered\n */\n get ordered() {\n return this._ordered;\n }\n\n /**\n * Get the maximum packet lifetime in milliseconds.\n * @returns {number|null} Maximum lifetime or null if not set\n */\n get maxPacketLifeTime() {\n return this._maxPacketLifeTime;\n }\n\n /**\n * Get the maximum number of retransmissions.\n * @returns {number|null} Maximum retransmits or null if not set\n */\n get maxRetransmits() {\n return this._maxRetransmits;\n }\n\n /**\n * Get the subprotocol name.\n * @returns {string} Protocol name\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * Check if the channel was negotiated out-of-band.\n * @returns {boolean} True if negotiated\n */\n get negotiated() {\n return this._negotiated;\n }\n\n /**\n * Get the channel ID.\n * @returns {number|null} Channel ID or null if not assigned\n */\n get id() {\n return this._id;\n }\n\n /**\n * Get the current state of the channel.\n * @returns {string} Channel state\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * Get the number of bytes queued to send.\n * @returns {number} Buffered amount in bytes\n */\n get bufferedAmount() {\n return this._bufferedAmount;\n }\n\n /**\n * Get the threshold for bufferedamountlow event.\n * @returns {number} Threshold in bytes\n */\n get bufferedAmountLowThreshold() {\n return this._bufferedAmountLowThreshold;\n }\n\n /**\n * Set the threshold for bufferedamountlow event.\n * @param {number} value - Threshold in bytes\n */\n set bufferedAmountLowThreshold(value) {\n this._bufferedAmountLowThreshold = value;\n }\n\n /**\n * Get the binary data type.\n * @returns {string} 'arraybuffer' or 'blob'\n */\n get binaryType() {\n return this._binaryType;\n }\n\n /**\n * Set the binary data type.\n * @param {string} value - 'arraybuffer' or 'blob'\n * @throws {TypeError} If value is invalid\n */\n set binaryType(value) {\n if (value !== 'arraybuffer' && value !== 'blob') {\n throw new TypeError('binaryType must be \"arraybuffer\" or \"blob\"');\n }\n this._binaryType = value;\n }\n\n /**\n * Check if the channel is reliable (deprecated).\n * @returns {boolean} True if ordered and no packet lifetime/retransmit limits\n * @deprecated Use ordered, maxPacketLifeTime, and maxRetransmits instead\n */\n get reliable() {\n return this._ordered && \n this._maxPacketLifeTime === null && \n this._maxRetransmits === null;\n }\n\n /**\n * Send a message through the channel.\n * @param {string|ArrayBuffer|ArrayBufferView|Blob} data - Data to send\n * @throws {Error} If channel is not open or data is invalid\n */\n send(data) {\n if (this._readyState !== RTCDataChannelState.OPEN) {\n throw new Error('RTCDataChannel.readyState is not \"open\"');\n }\n\n let dataToSend;\n let byteLength = 0;\n\n if (typeof data === 'string') {\n dataToSend = Buffer.from(data, 'utf8');\n byteLength = dataToSend.length;\n } else if (data instanceof ArrayBuffer) {\n dataToSend = Buffer.from(data);\n byteLength = data.byteLength;\n } else if (ArrayBuffer.isView(data)) {\n dataToSend = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n byteLength = data.byteLength;\n } else if (data && typeof data.arrayBuffer === 'function') {\n // Blob-like object\n throw new Error('Blob sending not yet implemented');\n } else {\n throw new TypeError('Invalid data type');\n }\n\n // Update buffered amount\n this._bufferedAmount += byteLength;\n\n // Use real network transport\n if (!this._send) {\n throw new Error('Data channel not connected to network transport');\n }\n \n this._send(data).catch(err => {\n console.error('Send error:', err);\n this.emit('error', err);\n });\n }\n\n /**\n * Emit bufferedamountlow if appropriate\n * @private\n */\n _emitBufferedAmountLow() {\n if (this._bufferedAmount <= this._bufferedAmountLowThreshold) {\n this.emit('bufferedamountlow');\n }\n }\n\n /**\n * Close the data channel.\n */\n close() {\n if (this._readyState === RTCDataChannelState.CLOSING || \n this._readyState === RTCDataChannelState.CLOSED) {\n return;\n }\n\n this._setState(RTCDataChannelState.CLOSING);\n \n // Transition to closed asynchronously\n setImmediate(() => {\n if (this._readyState === RTCDataChannelState.CLOSING) {\n this._setState(RTCDataChannelState.CLOSED);\n }\n });\n }\n\n /**\n * Set the channel state and emit appropriate events.\n * @param {string} newState - New state\n * @private\n */\n _setState(newState) {\n const oldState = this._readyState;\n if (oldState === newState) {\n return;\n }\n\n this._readyState = newState;\n\n // Emit state-specific events\n if (newState === RTCDataChannelState.OPEN) {\n this.emit('open');\n } else if (newState === RTCDataChannelState.CLOSING) {\n this.emit('closing');\n } else if (newState === RTCDataChannelState.CLOSED) {\n this.emit('close');\n }\n }\n\n /**\n * Set channel to open state (internal use).\n * @private\n */\n _setStateToOpen() {\n this._setState(RTCDataChannelState.OPEN);\n }\n\n /**\n * Handle received message (internal use).\n * @param {Buffer|string} data - Received data\n * @private\n */\n _onMessage(data) {\n const event = {\n data: data\n };\n this.emit('message', event);\n }\n\n /**\n * Receive message from network transport (internal use).\n * @param {any} data - Received data\n * @private\n */\n _receiveMessage(data) {\n this._onMessage(data);\n }\n\n /**\n * Set the channel ID (internal use).\n * @param {number} id - Channel ID\n * @private\n */\n _setId(id) {\n this._id = id;\n }\n}\n\nmodule.exports = {\n RTCDataChannel,\n RTCDataChannelState\n};\n","/**\n * @file RTCSessionDescription.js\n * @description Session Description Protocol (SDP) representation\n * @module sdp/RTCSessionDescription\n * \n * Ported from Chromium's RTCSessionDescription implementation:\n * - cc/rtc_session_description.idl\n * - cc/rtc_session_description.h\n */\n\n'use strict';\n\n/**\n * RTCSdpType - Types of session descriptions\n * @readonly\n * @enum {string}\n */\nconst RTCSdpType = Object.freeze({\n OFFER: 'offer',\n PRANSWER: 'pranswer',\n ANSWER: 'answer',\n ROLLBACK: 'rollback'\n});\n\n/**\n * @class RTCSessionDescription\n * @description Represents a WebRTC session description (offer/answer)\n * \n * @example\n * const desc = new RTCSessionDescription({\n * type: 'offer',\n * sdp: 'v=0\\r\\no=- 123456 2 IN IP4 127.0.0.1\\r\\n...'\n * });\n */\nclass RTCSessionDescription {\n /**\n * Create an RTCSessionDescription instance.\n * @param {Object} [init] - Session description init\n * @param {string} [init.type] - SDP type (offer/answer/pranswer/rollback)\n * @param {string} [init.sdp] - SDP string\n */\n constructor(init = {}) {\n this._type = init.type || null;\n this._sdp = init.sdp || null;\n\n // Validate type if provided\n if (this._type && !Object.values(RTCSdpType).includes(this._type)) {\n throw new TypeError(`Invalid SDP type: ${this._type}`);\n }\n }\n\n /**\n * Get the SDP type.\n * @returns {string|null} SDP type\n */\n get type() {\n return this._type;\n }\n\n /**\n * Set the SDP type.\n * @param {string} value - SDP type\n */\n set type(value) {\n if (value && !Object.values(RTCSdpType).includes(value)) {\n throw new TypeError(`Invalid SDP type: ${value}`);\n }\n this._type = value;\n }\n\n /**\n * Get the SDP string.\n * @returns {string|null} SDP string\n */\n get sdp() {\n return this._sdp;\n }\n\n /**\n * Set the SDP string.\n * @param {string} value - SDP string\n */\n set sdp(value) {\n this._sdp = value;\n }\n\n /**\n * Convert to JSON representation.\n * @returns {Object} JSON representation\n */\n toJSON() {\n return {\n type: this._type,\n sdp: this._sdp\n };\n }\n}\n\nmodule.exports = {\n RTCSessionDescription,\n RTCSdpType\n};\n","/**\n * @file sdp-utils.js\n * @description SDP parsing and generation utilities\n * @module sdp/sdp-utils\n */\n\n'use strict';\n\n/**\n * Generate a simple SDP offer for data channel only\n * @param {Object} options - Generation options\n * @param {string} options.iceUfrag - ICE username fragment\n * @param {string} options.icePwd - ICE password\n * @param {Array<Object>} options.fingerprints - DTLS fingerprints\n * @param {Array<Object>} options.candidates - ICE candidates\n * @param {string} [options.setup='actpass'] - DTLS setup role\n * @param {string} [options.connectionAddress] - Connection IP address\n * @param {number} [options.connectionPort] - Connection port\n * @returns {string} SDP offer\n */\nfunction generateOffer(options) {\n const {\n iceUfrag,\n icePwd,\n fingerprints = [],\n candidates = [],\n setup = 'actpass',\n connectionAddress = '0.0.0.0',\n connectionPort = 9\n } = options;\n\n const sessionId = Date.now();\n const sessionVersion = 2;\n \n // Get primary fingerprint (SHA-256)\n const fingerprint = fingerprints.find(fp => fp.algorithm === 'sha-256') || fingerprints[0];\n \n let sdp = '';\n \n // Session description\n sdp += 'v=0\\r\\n';\n sdp += `o=- ${sessionId} ${sessionVersion} IN IP4 ${connectionAddress}\\r\\n`;\n sdp += 's=-\\r\\n';\n sdp += 't=0 0\\r\\n';\n \n // Bundle group (data channel only)\n sdp += 'a=group:BUNDLE 0\\r\\n';\n sdp += 'a=msid-semantic: WMS\\r\\n';\n \n // Media description for data channel (application)\n sdp += `m=application ${connectionPort} UDP/DTLS/SCTP webrtc-datachannel\\r\\n`;\n sdp += `c=IN IP4 ${connectionAddress}\\r\\n`;\n sdp += 'a=ice-ufrag:' + iceUfrag + '\\r\\n';\n sdp += 'a=ice-pwd:' + icePwd + '\\r\\n';\n sdp += 'a=ice-options:trickle\\r\\n';\n \n // DTLS fingerprint\n if (fingerprint) {\n sdp += `a=fingerprint:${fingerprint.algorithm.toUpperCase()} ${fingerprint.value}\\r\\n`;\n }\n sdp += `a=setup:${setup}\\r\\n`;\n \n // SCTP\n sdp += 'a=mid:0\\r\\n';\n sdp += 'a=sctp-port:5000\\r\\n';\n sdp += 'a=max-message-size:262144\\r\\n';\n \n // ICE candidates\n for (const candidate of candidates) {\n if (candidate.candidate) {\n sdp += `a=${candidate.candidate}\\r\\n`;\n }\n }\n \n return sdp;\n}\n\n/**\n * Generate a simple SDP answer for data channel only\n * @param {Object} options - Generation options\n * @param {string} options.iceUfrag - ICE username fragment\n * @param {string} options.icePwd - ICE password\n * @param {Array<Object>} options.fingerprints - DTLS fingerprints\n * @param {Array<Object>} options.candidates - ICE candidates\n * @param {string} [options.setup='active'] - DTLS setup role\n * @returns {string} SDP answer\n */\nfunction generateAnswer(options) {\n // Answer is similar to offer but with different setup role\n return generateOffer({\n ...options,\n setup: options.setup || 'active'\n });\n}\n\n/**\n * Parse SDP string to extract ICE candidates\n * @param {string} sdp - SDP string\n * @returns {Array<Object>} Array of candidate objects\n */\nfunction parseCandidates(sdp) {\n const candidates = [];\n const lines = sdp.split('\\r\\n');\n \n for (const line of lines) {\n if (line.startsWith('a=candidate:')) {\n candidates.push({\n candidate: line,\n sdpMid: '0',\n sdpMLineIndex: 0\n });\n }\n }\n \n return candidates;\n}\n\n/**\n * Parse SDP to extract ICE parameters\n * @param {string} sdp - SDP string\n * @returns {Object} ICE parameters\n */\nfunction parseIceParameters(sdp) {\n const lines = sdp.split('\\r\\n');\n const params = {\n usernameFragment: null,\n password: null\n };\n \n for (const line of lines) {\n if (line.startsWith('a=ice-ufrag:')) {\n params.usernameFragment = line.substring(12);\n } else if (line.startsWith('a=ice-pwd:')) {\n params.password = line.substring(10);\n }\n }\n \n return params;\n}\n\n/**\n * Parse SDP to extract DTLS parameters\n * @param {string} sdp - SDP string\n * @returns {Object} DTLS parameters\n */\nfunction parseDtlsParameters(sdp) {\n const lines = sdp.split('\\r\\n');\n const params = {\n role: 'auto',\n fingerprints: []\n };\n \n for (const line of lines) {\n if (line.startsWith('a=setup:')) {\n const setup = line.substring(8);\n if (setup === 'active') params.role = 'client';\n else if (setup === 'passive') params.role = 'server';\n else params.role = 'auto';\n } else if (line.startsWith('a=fingerprint:')) {\n const parts = line.substring(14).split(' ');\n if (parts.length === 2) {\n params.fingerprints.push({\n algorithm: parts[0].toLowerCase(),\n value: parts[1]\n });\n }\n }\n }\n \n return params;\n}\n\n/**\n * Parse SDP to extract SCTP parameters\n * @param {string} sdp - SDP string\n * @returns {Object} SCTP parameters\n */\nfunction parseSctpParameters(sdp) {\n const lines = sdp.split('\\r\\n');\n const params = {\n port: 5000,\n maxMessageSize: 262144\n };\n \n for (const line of lines) {\n if (line.startsWith('a=sctp-port:')) {\n params.port = parseInt(line.substring(12), 10);\n } else if (line.startsWith('a=max-message-size:')) {\n params.maxMessageSize = parseInt(line.substring(19), 10);\n }\n }\n \n return params;\n}\n\n/**\n * Generate random ICE credentials\n * @returns {Object} ICE credentials\n */\nfunction generateIceCredentials() {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n const randomString = (length) => {\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n };\n \n return {\n usernameFragment: randomString(4),\n password: randomString(24)\n };\n}\n\nmodule.exports = {\n generateOffer,\n generateAnswer,\n parseCandidates,\n parseIceParameters,\n parseDtlsParameters,\n parseSctpParameters,\n generateIceCredentials\n};\n","/**\n * @file network-transport.js\n * @description Real UDP/TCP network transport implementation\n * @module network/network-transport\n * \n * Provides real networking capabilities using Node.js net and dgram packages\n */\n\n'use strict';\n\nconst dgram = require('dgram');\nconst net = require('net');\nconst EventEmitter = require('events');\nconst crypto = require('crypto');\n\n/**\n * Transport protocol types\n */\nconst TransportProtocol = Object.freeze({\n UDP: 'udp',\n TCP: 'tcp'\n});\n\n/**\n * @class NetworkTransport\n * @extends EventEmitter\n * @description Base class for network transport\n * \n * Events:\n * - 'data': (data, rinfo) - Data received\n * - 'error': (error) - Error occurred\n * - 'listening': () - Socket is listening\n * - 'close': () - Socket closed\n */\nclass NetworkTransport extends EventEmitter {\n constructor(protocol = TransportProtocol.UDP) {\n super();\n this.protocol = protocol;\n this.socket = null;\n this.localAddress = null;\n this.localPort = null;\n this.isListening = false;\n }\n\n /**\n * Bind to a local address and port\n * @param {number} [port=0] - Port to bind (0 for random)\n * @param {string} [address='0.0.0.0'] - Address to bind\n * @returns {Promise<{address: string, port: number}>}\n */\n async bind(port = 0, address = '0.0.0.0') {\n throw new Error('Must be implemented by subclass');\n }\n\n /**\n * Send data to remote address\n * @param {Buffer} data - Data to send\n * @param {string} address - Remote address\n * @param {number} port - Remote port\n * @returns {Promise<void>}\n */\n async send(data, address, port) {\n throw new Error('Must be implemented by subclass');\n }\n\n /**\n * Close the transport\n */\n close() {\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n this.isListening = false;\n }\n}\n\n/**\n * @class UDPTransport\n * @extends NetworkTransport\n * @description UDP transport implementation using dgram\n */\nclass UDPTransport extends NetworkTransport {\n constructor() {\n super(TransportProtocol.UDP);\n }\n\n /**\n * Bind to a local address and port\n * @param {number} [port=0] - Port to bind (0 for random)\n * @param {string} [address='0.0.0.0'] - Address to bind\n * @returns {Promise<{address: string, port: number}>}\n */\n async bind(port = 0, address = '0.0.0.0') {\n if (this.socket) {\n throw new Error('Already bound');\n }\n\n return new Promise((resolve, reject) => {\n this.socket = dgram.createSocket('udp4');\n\n this.socket.on('message', (msg, rinfo) => {\n this.emit('data', msg, rinfo);\n });\n\n this.socket.on('error', (error) => {\n this.emit('error', error);\n });\n\n this.socket.on('close', () => {\n this.isListening = false;\n this.emit('close');\n });\n\n this.socket.bind(port, address, () => {\n const addr = this.socket.address();\n this.localAddress = addr.address;\n this.localPort = addr.port;\n this.isListening = true;\n this.emit('listening');\n resolve({ address: addr.address, port: addr.port });\n });\n });\n }\n\n /**\n * Send data to remote address\n * @param {Buffer} data - Data to send\n * @param {string} address - Remote address\n * @param {number} port - Remote port\n * @returns {Promise<void>}\n */\n async send(data, address, port) {\n if (!this.socket) {\n throw new Error('Socket not bound');\n }\n\n return new Promise((resolve, reject) => {\n this.socket.send(data, port, address, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n }\n}\n\n/**\n * @class TCPTransport\n * @extends NetworkTransport\n * @description TCP transport implementation using net\n * Supports both server (listening) and client (connecting) modes\n */\nclass TCPTransport extends NetworkTransport {\n constructor() {\n super(TransportProtocol.TCP);\n this.server = null;\n this.connections = new Map(); // connection id -> socket\n this.mode = null; // 'server' or 'client'\n }\n\n /**\n * Start listening for connections (server mode)\n * @param {number} [port=0] - Port to listen on (0 for random)\n * @param {string} [address='0.0.0.0'] - Address to bind\n * @returns {Promise<{address: string, port: number}>}\n */\n async listen(port = 0, address = '0.0.0.0') {\n if (this.server) {\n throw new Error('Already listening');\n }\n\n this.mode = 'server';\n\n return new Promise((resolve, reject) => {\n this.server = net.createServer((socket) => {\n this._handleConnection(socket);\n });\n\n this.server.on('error', (error) => {\n this.emit('error', error);\n });\n\n this.server.on('close', () => {\n this.isListening = false;\n this.emit('close');\n });\n\n this.server.listen(port, address, () => {\n const addr = this.server.address();\n this.localAddress = addr.address;\n this.localPort = addr.port;\n this.isListening = true;\n this.emit('listening');\n resolve({ address: addr.address, port: addr.port });\n });\n });\n }\n\n /**\n * Connect to remote server (client mode)\n * @param {string} address - Remote address\n * @param {number} port - Remote port\n * @returns {Promise<void>}\n */\n async connect(address, port) {\n if (this.mode === 'server') {\n throw new Error('Cannot connect in server mode');\n }\n\n this.mode = 'client';\n\n return new Promise((resolve, reject) => {\n const socket = net.connect(port, address, () => {\n this._handleConnection(socket);\n resolve();\n });\n\n socket.on('error', (error) => {\n reject(error);\n });\n });\n }\n\n /**\n * Handle new connection\n * @param {net.Socket} socket - TCP socket\n * @private\n */\n _handleConnection(socket) {\n const connectionId = crypto.randomBytes(8).toString('hex');\n this.connections.set(connectionId, socket);\n\n const rinfo = {\n address: socket.remoteAddress,\n port: socket.remotePort,\n connectionId\n };\n\n // Handle incoming data\n socket.on('data', (data) => {\n this.emit('data', data, rinfo);\n });\n\n // Handle socket close\n socket.on('close', () => {\n this.connections.delete(connectionId);\n this.emit('connectionClosed', connectionId);\n });\n\n // Handle errors\n socket.on('error', (error) => {\n this.emit('error', error);\n });\n\n // Emit connection event\n this.emit('connection', connectionId, rinfo);\n }\n\n /**\n * Send data to specific connection or address\n * @param {Buffer} data - Data to send\n * @param {string} addressOrConnectionId - Remote address or connection ID\n * @param {number} [port] - Remote port (not needed if using connection ID)\n * @returns {Promise<void>}\n */\n async send(data, addressOrConnectionId, port) {\n // If in server mode or already have connection, use connection ID\n if (this.connections.has(addressOrConnectionId)) {\n const socket = this.connections.get(addressOrConnectionId);\n return new Promise((resolve, reject) => {\n socket.write(data, (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n // Otherwise, send to all connections (broadcast)\n if (this.connections.size > 0) {\n const promises = [];\n for (const socket of this.connections.values()) {\n promises.push(\n new Promise((resolve, reject) => {\n socket.write(data, (error) => {\n if (error) reject(error);\n else resolve();\n });\n })\n );\n }\n await Promise.all(promises);\n } else {\n throw new Error('No active connections');\n }\n }\n\n /**\n * Close specific connection or all connections\n * @param {string} [connectionId] - Connection ID to close (omit to close all)\n */\n closeConnection(connectionId) {\n if (connectionId) {\n const socket = this.connections.get(connectionId);\n if (socket) {\n socket.end();\n this.connections.delete(connectionId);\n }\n } else {\n // Close all connections\n for (const socket of this.connections.values()) {\n socket.end();\n }\n this.connections.clear();\n }\n }\n\n /**\n * Close the transport and all connections\n */\n close() {\n // Close all connections\n this.closeConnection();\n\n // Close server\n if (this.server) {\n this.server.close();\n this.server = null;\n }\n\n this.isListening = false;\n this.mode = null;\n }\n\n /**\n * Bind is an alias for listen in TCP\n */\n async bind(port, address) {\n return this.listen(port, address);\n }\n}\n\n/**\n * @class DataChannelTransport\n * @description High-level transport for data channels using TCP\n * Implements message framing with length prefix\n */\nclass DataChannelTransport extends EventEmitter {\n constructor() {\n super();\n this.tcpTransport = new TCPTransport();\n this.messageBuffers = new Map(); // connection -> incomplete message buffer\n\n // Forward events\n this.tcpTransport.on('connection', (connectionId, rinfo) => {\n this.messageBuffers.set(connectionId, Buffer.alloc(0));\n this.emit('connection', connectionId, rinfo);\n });\n\n this.tcpTransport.on('connectionClosed', (connectionId) => {\n this.messageBuffers.delete(connectionId);\n this.emit('connectionClosed', connectionId);\n });\n\n this.tcpTransport.on('data', (data, rinfo) => {\n this._handleData(data, rinfo);\n });\n\n this.tcpTransport.on('error', (error) => {\n this.emit('error', error);\n });\n\n this.tcpTransport.on('listening', () => {\n this.emit('listening');\n });\n\n this.tcpTransport.on('close', () => {\n this.emit('close');\n });\n }\n\n /**\n * Handle incoming data with message framing\n * Message format: [4 bytes length][message data]\n * @private\n */\n _handleData(data, rinfo) {\n const connectionId = rinfo.connectionId || 'default';\n \n // Get existing buffer or create new\n let buffer = this.messageBuffers.get(connectionId) || Buffer.alloc(0);\n buffer = Buffer.concat([buffer, data]);\n this.messageBuffers.set(connectionId, buffer);\n\n // Process complete messages\n while (buffer.length >= 4) {\n const messageLength = buffer.readUInt32BE(0);\n \n if (buffer.length >= 4 + messageLength) {\n // Extract complete message\n const message = buffer.slice(4, 4 + messageLength);\n buffer = buffer.slice(4 + messageLength);\n this.messageBuffers.set(connectionId, buffer);\n\n // Emit message event\n this.emit('message', message, rinfo);\n } else {\n // Incomplete message, wait for more data\n break;\n }\n }\n }\n\n /**\n * Send message with length prefix\n * @param {Buffer|string} message - Message to send\n * @param {string} [connectionId] - Connection ID (for server mode)\n * @returns {Promise<void>}\n */\n async sendMessage(message, connectionId) {\n const messageBuffer = Buffer.isBuffer(message) ? message : Buffer.from(message);\n \n // Create framed message: [length][data]\n const frame = Buffer.alloc(4 + messageBuffer.length);\n frame.writeUInt32BE(messageBuffer.length, 0);\n messageBuffer.copy(frame, 4);\n\n if (connectionId) {\n await this.tcpTransport.send(frame, connectionId);\n } else {\n // Broadcast to all connections\n await this.tcpTransport.send(frame);\n }\n }\n\n /**\n * Start listening (server mode)\n */\n async listen(port, address) {\n return this.tcpTransport.listen(port, address);\n }\n\n /**\n * Connect to remote (client mode)\n */\n async connect(address, port) {\n return this.tcpTransport.connect(address, port);\n }\n\n /**\n * Get local address info\n */\n get localAddress() {\n return this.tcpTransport.localAddress;\n }\n\n get localPort() {\n return this.tcpTransport.localPort;\n }\n\n /**\n * Close transport\n */\n close() {\n this.messageBuffers.clear();\n this.tcpTransport.close();\n }\n}\n\nmodule.exports = {\n NetworkTransport,\n UDPTransport,\n TCPTransport,\n DataChannelTransport,\n TransportProtocol\n};\n","/**\n * @file RTCPeerConnection.js\n * @description WebRTC Peer Connection implementation\n * @module peerconnection/RTCPeerConnection\n * \n * Ported from Chromium's RTCPeerConnection implementation:\n * - cc/rtc_peer_connection.idl\n * - cc/rtc_peer_connection.h\n */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst { RTCIceTransport } = require('../ice/RTCIceTransport');\nconst { RTCDtlsTransport } = require('../dtls/RTCDtlsTransport');\nconst { RTCSctpTransport } = require('../sctp/RTCSctpTransport');\nconst { RTCDataChannel } = require('../datachannel/RTCDataChannel');\nconst RTCCertificate = require('../dtls/RTCCertificate');\nconst { RTCSessionDescription, RTCSdpType } = require('../sdp/RTCSessionDescription');\nconst sdpUtils = require('../sdp/sdp-utils');\nconst { DataChannelTransport } = require('../network/network-transport');\n\n/**\n * RTCSignalingState - Signaling state of the peer connection\n * @readonly\n * @enum {string}\n */\nconst RTCSignalingState = Object.freeze({\n STABLE: 'stable',\n HAVE_LOCAL_OFFER: 'have-local-offer',\n HAVE_REMOTE_OFFER: 'have-remote-offer',\n HAVE_LOCAL_PRANSWER: 'have-local-pranswer',\n HAVE_REMOTE_PRANSWER: 'have-remote-pranswer',\n CLOSED: 'closed'\n});\n\n/**\n * RTCIceGatheringState - ICE gathering state\n * @readonly\n * @enum {string}\n */\nconst RTCIceGatheringState = Object.freeze({\n NEW: 'new',\n GATHERING: 'gathering',\n COMPLETE: 'complete'\n});\n\n/**\n * RTCPeerConnectionState - Overall connection state\n * @readonly\n * @enum {string}\n */\nconst RTCPeerConnectionState = Object.freeze({\n NEW: 'new',\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n DISCONNECTED: 'disconnected',\n FAILED: 'failed',\n CLOSED: 'closed'\n});\n\n/**\n * @class RTCPeerConnection\n * @extends EventEmitter\n * @description Main class for WebRTC peer-to-peer connections\n * \n * Events:\n * - 'negotiationneeded': Negotiation is needed\n * - 'icecandidate': New ICE candidate gathered\n * - 'icegatheringstatechange': ICE gathering state changed\n * - 'iceconnectionstatechange': ICE connection state changed\n * - 'connectionstatechange': Overall connection state changed\n * - 'signalingstatechange': Signaling state changed\n * - 'datachannel': New data channel received\n * \n * @example\n * const pc = new RTCPeerConnection({\n * iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]\n * });\n * \n * const channel = pc.createDataChannel('myChannel');\n * const offer = await pc.createOffer();\n * await pc.setLocalDescription(offer);\n */\nclass RTCPeerConnection extends EventEmitter {\n /**\n * Create an RTCPeerConnection instance.\n * @param {Object} [configuration] - Configuration options\n * @param {Array<Object>} [configuration.iceServers] - STUN/TURN servers\n * @param {string} [configuration.iceTransportPolicy='all'] - ICE transport policy\n * @param {string} [configuration.bundlePolicy='balanced'] - Bundle policy\n */\n constructor(configuration = {}) {\n super();\n\n this._configuration = configuration;\n this._signalingState = RTCSignalingState.STABLE;\n this._iceGatheringState = RTCIceGatheringState.NEW;\n this._connectionState = RTCPeerConnectionState.NEW;\n \n this._localDescription = null;\n this._remoteDescription = null;\n this._pendingLocalDescription = null;\n this._pendingRemoteDescription = null;\n \n this._dataChannels = new Map();\n this._nextChannelId = 0;\n \n // Transport components\n this._certificate = null;\n this._iceTransport = null;\n this._dtlsTransport = null;\n this._sctpTransport = null;\n this._networkTransport = null;\n \n this._isClosed = false;\n this._localIceCandidates = [];\n this._remoteIceCandidates = [];\n \n // Network state\n this._isOfferer = false;\n this._remoteConnectionInfo = null;\n \n // Initialize transports lazily\n this._initializePromise = null;\n }\n\n /**\n * Initialize transports (lazy initialization)\n * @private\n */\n async _initialize() {\n if (this._initializePromise) {\n return this._initializePromise;\n }\n\n this._initializePromise = (async () => {\n // Generate certificate if not provided\n if (!this._certificate) {\n this._certificate = await RTCCertificate.generateCertificate({\n name: 'RSASSA-PKCS1-v1_5',\n modulusLength: 2048,\n hash: 'SHA-256'\n });\n }\n\n // Create transport stack\n this._iceTransport = new RTCIceTransport();\n this._dtlsTransport = new RTCDtlsTransport(this._iceTransport, [this._certificate]);\n this._sctpTransport = new RTCSctpTransport(this._dtlsTransport);\n \n // Create network transport\n this._networkTransport = new DataChannelTransport();\n\n // Setup event handlers\n this._setupTransportEvents();\n this._setupNetworkTransport();\n })();\n\n return this._initializePromise;\n }\n\n /**\n * Setup transport event handlers\n * @private\n */\n _setupTransportEvents() {\n // ICE events\n this._iceTransport.on('icecandidate', (candidate) => {\n const candidateInit = {\n candidate: candidate.candidate,\n sdpMid: '0',\n sdpMLineIndex: 0,\n usernameFragment: candidate.usernameFragment\n };\n this._localIceCandidates.push(candidateInit);\n this.emit('icecandidate', { candidate: candidateInit });\n });\n\n this._iceTransport.on('gatheringstatechange', () => {\n const state = this._iceTransport.gatheringState;\n this._iceGatheringState = state;\n this.emit('icegatheringstatechange');\n });\n\n this._iceTransport.on('statechange', () => {\n this._updateConnectionState();\n this.emit('iceconnectionstatechange');\n });\n\n // DTLS events\n this._dtlsTransport.on('statechange', () => {\n this._updateConnectionState();\n });\n\n // SCTP events\n this._sctpTransport.on('statechange', () => {\n this._updateConnectionState();\n });\n }\n\n /**\n * Setup network transport event handlers\n * @private\n */\n _setupNetworkTransport() {\n this._networkTransport.on('message', (message, rinfo) => {\n this._handleIncomingMessage(message, rinfo);\n });\n\n this._networkTransport.on('connection', (connectionId, rinfo) => {\n // Connection established - open data channels\n setImmediate(() => {\n this._openDataChannels();\n });\n });\n\n this._networkTransport.on('error', (error) => {\n console.error('Network transport error:', error);\n });\n }\n\n /**\n * Open all data channels\n * @private\n */\n _openDataChannels() {\n for (const channel of this._dataChannels.values()) {\n if (channel.readyState === 'connecting') {\n this._connectChannelToNetwork(channel);\n channel._setStateToOpen();\n }\n }\n }\n\n /**\n * Handle incoming network message\n * @private\n */\n _handleIncomingMessage(message, rinfo) {\n try {\n // Try to parse as JSON first (for data channel messages)\n const data = JSON.parse(message.toString());\n \n if (data.type === 'datachannel') {\n const channelLabel = data.label;\n const channelData = data.data;\n\n // Find or create data channel\n let channel = Array.from(this._dataChannels.values())\n .find(ch => ch.label === channelLabel);\n\n if (!channel) {\n // Remote peer created a new data channel\n channel = new RTCDataChannel(channelLabel, {\n id: data.id || this._nextChannelId++\n });\n this._dataChannels.set(channel.id, channel);\n \n // Connect channel to network before opening\n this._connectChannelToNetwork(channel);\n \n channel._setStateToOpen();\n this.emit('datachannel', { channel });\n }\n\n // Deliver message to channel\n if (channel.readyState === 'open') {\n channel._receiveMessage(channelData);\n }\n }\n } catch (error) {\n // Not JSON, might be raw binary data\n console.error('Error parsing network message:', error);\n }\n }\n\n /**\n * Update overall connection state based on transport states\n * @private\n */\n _updateConnectionState() {\n if (this._isClosed) {\n this._connectionState = RTCPeerConnectionState.CLOSED;\n this.emit('connectionstatechange');\n return;\n }\n\n const iceState = this._iceTransport?.state || 'new';\n const dtlsState = this._dtlsTransport?.state || 'new';\n const sctpState = this._sctpTransport?.state || 'connecting';\n\n let newState;\n\n if (iceState === 'failed' || dtlsState === 'failed') {\n newState = RTCPeerConnectionState.FAILED;\n } else if (iceState === 'connected' && dtlsState === 'connected' && sctpState === 'connected') {\n newState = RTCPeerConnectionState.CONNECTED;\n } else if (iceState === 'checking' || dtlsState === 'connecting' || sctpState === 'connecting') {\n newState = RTCPeerConnectionState.CONNECTING;\n } else if (iceState === 'disconnected') {\n newState = RTCPeerConnectionState.DISCONNECTED;\n } else {\n newState = RTCPeerConnectionState.NEW;\n }\n\n if (newState !== this._connectionState) {\n this._connectionState = newState;\n this.emit('connectionstatechange');\n }\n }\n\n /**\n * Create a data channel.\n * @param {string} label - Channel label\n * @param {Object} [options] - Channel options\n * @returns {RTCDataChannel} Data channel\n */\n createDataChannel(label, options = {}) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n\n const channelOptions = {\n ...options,\n negotiated: options.negotiated || false\n };\n\n if (!channelOptions.negotiated) {\n channelOptions.id = this._nextChannelId++;\n }\n\n const channel = new RTCDataChannel(label, channelOptions);\n this._dataChannels.set(channelOptions.id, channel);\n\n // Emit negotiation needed\n setImmediate(() => {\n if (!this._isClosed) {\n this.emit('negotiationneeded');\n }\n });\n\n return channel;\n }\n\n /**\n * Create an SDP offer.\n * @param {Object} [options] - Offer options\n * @returns {Promise<RTCSessionDescription>} Offer description\n */\n async createOffer(options = {}) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n\n await this._initialize();\n\n // Start listening to get actual port\n const { address, port } = await this._networkTransport.listen(0, '0.0.0.0');\n \n // Get local address (try to find non-localhost)\n const os = require('os');\n const interfaces = os.networkInterfaces();\n let localAddress = '127.0.0.1';\n \n for (const [name, addrs] of Object.entries(interfaces)) {\n for (const addr of addrs) {\n if (addr.family === 'IPv4' && !addr.internal) {\n localAddress = addr.address;\n break;\n }\n }\n if (localAddress !== '127.0.0.1') break;\n }\n\n // Generate ICE credentials\n const iceCredentials = sdpUtils.generateIceCredentials();\n\n // Get fingerprints\n const fingerprints = this._certificate.getFingerprints();\n\n // Generate SDP offer with actual connection info\n const sdp = sdpUtils.generateOffer({\n iceUfrag: iceCredentials.usernameFragment,\n icePwd: iceCredentials.password,\n fingerprints,\n candidates: this._localIceCandidates,\n setup: 'actpass',\n connectionAddress: localAddress,\n connectionPort: port\n });\n\n return new RTCSessionDescription({\n type: RTCSdpType.OFFER,\n sdp\n });\n }\n\n /**\n * Create an SDP answer.\n * @param {Object} [options] - Answer options\n * @returns {Promise<RTCSessionDescription>} Answer description\n */\n async createAnswer(options = {}) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n\n if (!this._remoteDescription || this._remoteDescription.type !== 'offer') {\n throw new Error('Cannot create answer without remote offer');\n }\n\n await this._initialize();\n\n // Generate ICE credentials\n const iceCredentials = sdpUtils.generateIceCredentials();\n\n // Get fingerprints\n const fingerprints = this._certificate.getFingerprints();\n\n // Generate SDP answer\n const sdp = sdpUtils.generateAnswer({\n iceUfrag: iceCredentials.usernameFragment,\n icePwd: iceCredentials.password,\n fingerprints,\n candidates: this._localIceCandidates,\n setup: 'active'\n });\n\n return new RTCSessionDescription({\n type: RTCSdpType.ANSWER,\n sdp\n });\n }\n\n /**\n * Set the local description.\n * @param {RTCSessionDescription} [description] - Local description\n * @returns {Promise<void>}\n */\n async setLocalDescription(description) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n\n // If no description provided, create one based on signaling state\n if (!description) {\n if (this._signalingState === RTCSignalingState.HAVE_REMOTE_OFFER) {\n description = await this.createAnswer();\n } else {\n description = await this.createOffer();\n }\n }\n\n await this._initialize();\n\n this._localDescription = new RTCSessionDescription(description);\n this._pendingLocalDescription = this._localDescription;\n\n // Update signaling state\n if (description.type === 'offer') {\n this._signalingState = RTCSignalingState.HAVE_LOCAL_OFFER;\n } else if (description.type === 'answer') {\n this._signalingState = RTCSignalingState.STABLE;\n this._pendingLocalDescription = null;\n \n // Answerer: start connection when setting local answer\n if (this._remoteDescription) {\n const iceParams = sdpUtils.parseIceParameters(this._remoteDescription.sdp);\n const dtlsParams = sdpUtils.parseDtlsParameters(this._remoteDescription.sdp);\n const sctpParams = sdpUtils.parseSctpParameters(this._remoteDescription.sdp);\n await this._startConnection(iceParams, dtlsParams, sctpParams);\n }\n }\n\n // Parse and apply ICE parameters\n const iceParams = sdpUtils.parseIceParameters(description.sdp);\n \n // Start ICE gathering with configured servers\n this._iceGatheringState = RTCIceGatheringState.GATHERING;\n this.emit('icegatheringstatechange');\n \n // Gather candidates with ICE servers\n if (this._iceTransport) {\n await this._iceTransport.gather({\n iceServers: this._configuration.iceServers || []\n });\n }\n\n this.emit('signalingstatechange');\n }\n\n /**\n * Set the remote description.\n * @param {RTCSessionDescription} description - Remote description\n * @returns {Promise<void>}\n */\n async setRemoteDescription(description) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n\n if (!description || !description.sdp) {\n throw new Error('Invalid session description');\n }\n\n await this._initialize();\n\n this._remoteDescription = new RTCSessionDescription(description);\n this._pendingRemoteDescription = this._remoteDescription;\n\n // Update signaling state\n if (description.type === 'offer') {\n this._signalingState = RTCSignalingState.HAVE_REMOTE_OFFER;\n } else if (description.type === 'answer') {\n this._signalingState = RTCSignalingState.STABLE;\n this._pendingRemoteDescription = null;\n this._pendingLocalDescription = null;\n }\n\n // Parse remote parameters\n const iceParams = sdpUtils.parseIceParameters(description.sdp);\n const dtlsParams = sdpUtils.parseDtlsParameters(description.sdp);\n const sctpParams = sdpUtils.parseSctpParameters(description.sdp);\n\n // Parse remote candidates and extract connection info\n const remoteCandidates = sdpUtils.parseCandidates(description.sdp);\n this._remoteIceCandidates = remoteCandidates;\n \n // Extract connection info from SDP\n this._extractConnectionInfo(description.sdp);\n\n this.emit('signalingstatechange');\n\n // Start connection establishment if we have both descriptions\n if (this._signalingState === RTCSignalingState.STABLE) {\n await this._startConnection(iceParams, dtlsParams, sctpParams);\n }\n }\n\n /**\n * Extract connection information from SDP\n * @param {string} sdp - SDP string\n * @private\n */\n _extractConnectionInfo(sdp) {\n // Look for connection line: c=IN IP4 <address>\n const cLineMatch = sdp.match(/^c=IN IP4 ([^\\s]+)/m);\n if (cLineMatch && cLineMatch[1] !== '0.0.0.0') {\n const address = cLineMatch[1];\n \n // Look for port in media line: m=application <port>\n const mLineMatch = sdp.match(/^m=application (\\d+)/m);\n if (mLineMatch && mLineMatch[1] !== '9') {\n const port = parseInt(mLineMatch[1], 10);\n this._remoteConnectionInfo = { address, port };\n }\n }\n }\n\n /**\n * Start connection establishment\n * @param {Object} iceParams - ICE parameters\n * @param {Object} dtlsParams - DTLS parameters\n * @param {Object} sctpParams - SCTP parameters\n * @private\n */\n async _startConnection(iceParams, dtlsParams, sctpParams) {\n // Determine if we're the offerer based on setup attribute\n this._isOfferer = this._localDescription?.type === 'offer';\n\n // Start network transport\n try {\n if (this._isOfferer) {\n // Offerer already started listening in createOffer()\n // Wait for incoming connection\n } else {\n // Answerer connects to offerer\n if (this._remoteConnectionInfo) {\n await this._networkTransport.connect(\n this._remoteConnectionInfo.address,\n this._remoteConnectionInfo.port\n );\n \n // Connection established - open channels\n setImmediate(() => {\n this._openDataChannels();\n });\n }\n }\n } catch (error) {\n console.error('Failed to establish network connection:', error);\n }\n\n // Start ICE\n if (iceParams.usernameFragment && iceParams.password) {\n try {\n await this._iceTransport.start(iceParams, this._isOfferer ? 'controlling' : 'controlled');\n } catch (error) {\n console.error('Failed to start ICE:', error);\n }\n }\n\n // Add remote candidates\n for (const candidate of this._remoteIceCandidates) {\n try {\n // Parse candidate string (simplified)\n await this._iceTransport.addRemoteCandidate(candidate);\n } catch (error) {\n console.error('Failed to add remote candidate:', error);\n }\n }\n\n // Open data channels when connection is established\n this._sctpTransport.once('statechange', () => {\n if (this._sctpTransport.state === 'connected') {\n for (const channel of this._dataChannels.values()) {\n if (channel.readyState === 'connecting') {\n channel._setStateToOpen();\n \n // Hook up channel to network transport\n this._connectChannelToNetwork(channel);\n }\n }\n }\n });\n }\n\n /**\n * Connect data channel to network transport\n * @param {RTCDataChannel} channel - Data channel\n * @private\n */\n _connectChannelToNetwork(channel) {\n // Store original _send method\n const originalInternalSend = channel._send ? channel._send.bind(channel) : null;\n \n // Override the internal send to use network transport\n channel._send = async (data) => {\n try {\n const message = JSON.stringify({\n type: 'datachannel',\n label: channel.label,\n id: channel.id,\n data: data\n });\n await this._networkTransport.sendMessage(message);\n \n // Update buffered amount tracking\n if (channel._bufferedAmount > 0) {\n channel._bufferedAmount = Math.max(0, channel._bufferedAmount - (typeof data === 'string' ? data.length : 0));\n channel._emitBufferedAmountLow();\n }\n } catch (error) {\n console.error('Failed to send via network:', error);\n throw error;\n }\n };\n }\n\n /**\n * Add an ICE candidate.\n * @param {Object} [candidate] - ICE candidate\n * @returns {Promise<void>}\n */\n async addIceCandidate(candidate) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n\n if (!candidate) {\n // End of candidates signal\n this._iceGatheringState = RTCIceGatheringState.COMPLETE;\n this.emit('icegatheringstatechange');\n return;\n }\n\n await this._initialize();\n\n if (this._iceTransport) {\n this._remoteIceCandidates.push(candidate);\n \n // If connection is already started, add candidate immediately\n if (this._remoteDescription) {\n try {\n await this._iceTransport.addRemoteCandidate(candidate);\n } catch (error) {\n console.error('Failed to add ICE candidate:', error);\n }\n }\n }\n }\n\n /**\n * Get the current configuration.\n * @returns {Object} Configuration\n */\n getConfiguration() {\n return { ...this._configuration };\n }\n\n /**\n * Set the configuration.\n * @param {Object} configuration - New configuration\n */\n setConfiguration(configuration) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n this._configuration = { ...configuration };\n }\n\n /**\n * Close the peer connection.\n */\n close() {\n if (this._isClosed) {\n return;\n }\n\n this._isClosed = true;\n this._signalingState = RTCSignalingState.CLOSED;\n this._connectionState = RTCPeerConnectionState.CLOSED;\n\n // Close all data channels\n for (const channel of this._dataChannels.values()) {\n channel.close();\n }\n\n // Close transports\n if (this._sctpTransport) {\n this._sctpTransport.close();\n }\n if (this._dtlsTransport) {\n this._dtlsTransport.close();\n }\n if (this._iceTransport) {\n this._iceTransport.stop();\n }\n\n this.emit('signalingstatechange');\n this.emit('connectionstatechange');\n }\n\n /**\n * Get the signaling state.\n * @returns {string} Signaling state\n */\n get signalingState() {\n return this._signalingState;\n }\n\n /**\n * Get the ICE gathering state.\n * @returns {string} ICE gathering state\n */\n get iceGatheringState() {\n return this._iceGatheringState;\n }\n\n /**\n * Get the ICE connection state.\n * @returns {string} ICE connection state\n */\n get iceConnectionState() {\n return this._iceTransport?.state || 'new';\n }\n\n /**\n * Get the overall connection state.\n * @returns {string} Connection state\n */\n get connectionState() {\n return this._connectionState;\n }\n\n /**\n * Get the local description.\n * @returns {RTCSessionDescription|null} Local description\n */\n get localDescription() {\n return this._localDescription;\n }\n\n /**\n * Get the remote description.\n * @returns {RTCSessionDescription|null} Remote description\n */\n get remoteDescription() {\n return this._remoteDescription;\n }\n\n /**\n * Get the current local description.\n * @returns {RTCSessionDescription|null} Current local description\n */\n get currentLocalDescription() {\n return this._signalingState === RTCSignalingState.STABLE ? this._localDescription : null;\n }\n\n /**\n * Get the pending local description.\n * @returns {RTCSessionDescription|null} Pending local description\n */\n get pendingLocalDescription() {\n return this._pendingLocalDescription;\n }\n\n /**\n * Get the current remote description.\n * @returns {RTCSessionDescription|null} Current remote description\n */\n get currentRemoteDescription() {\n return this._signalingState === RTCSignalingState.STABLE ? this._remoteDescription : null;\n }\n\n /**\n * Get the pending remote description.\n * @returns {RTCSessionDescription|null} Pending remote description\n */\n get pendingRemoteDescription() {\n return this._pendingRemoteDescription;\n }\n\n /**\n * Check if ICE candidate trickling is supported.\n * @returns {boolean} Always true\n */\n get canTrickleIceCandidates() {\n return true;\n }\n\n /**\n * Get the SCTP transport.\n * @returns {RTCSctpTransport|null} SCTP transport\n */\n get sctp() {\n return this._sctpTransport;\n }\n}\n\nmodule.exports = {\n RTCPeerConnection,\n RTCSignalingState,\n RTCIceGatheringState,\n RTCPeerConnectionState\n};\n","/**\n * @fileoverview node-rtc-connection - WebRTC DataChannel implementation for Node.js\n * \n * A clean-room implementation of WebRTC peer connections and data channels\n * for Node.js, ported from Chromium's production WebRTC code.\n * \n * This implementation focuses on DataChannel functionality without media streams.\n * Features:\n * - ICE (Interactive Connectivity Establishment)\n * - STUN/TURN support for NAT traversal\n * - DTLS encryption\n * - SCTP for reliable data channels\n * - Full WebRTC API compatibility\n * \n * @license BSD-3-Clause\n * @author nmhung1210\n */\n\n'use strict';\n\n// Foundation Layer\nconst ByteBufferQueue = require('./foundation/ByteBufferQueue');\nconst RTCError = require('./foundation/RTCError');\n\n// ICE Layer\nconst RTCIceCandidate = require('./ice/RTCIceCandidate');\nconst { \n RTCIceTransport, \n RTCIceRole, \n RTCIceTransportState, \n RTCIceGatheringState \n} = require('./ice/RTCIceTransport');\n\n// DTLS Layer\nconst RTCCertificate = require('./dtls/RTCCertificate');\nconst { RTCDtlsTransport, RTCDtlsTransportState } = require('./dtls/RTCDtlsTransport');\n\n// SCTP Layer\nconst { RTCSctpTransport, RTCSctpTransportState } = require('./sctp/RTCSctpTransport');\n\n// DataChannel Layer\nconst { RTCDataChannel, RTCDataChannelState } = require('./datachannel/RTCDataChannel');\n\n// SDP Layer\nconst { RTCSessionDescription, RTCSdpType } = require('./sdp/RTCSessionDescription');\n\n// PeerConnection Layer\nconst { \n RTCPeerConnection, \n RTCSignalingState, \n RTCIceGatheringState: RTCIceGatheringStatePC,\n RTCPeerConnectionState \n} = require('./peerconnection/RTCPeerConnection');\n\n// Export all public APIs\nmodule.exports = {\n // Foundation\n ByteBufferQueue,\n RTCError,\n \n // ICE\n RTCIceCandidate,\n RTCIceTransport,\n RTCIceRole,\n RTCIceTransportState,\n RTCIceGatheringState,\n \n // DTLS\n RTCCertificate,\n RTCDtlsTransport,\n RTCDtlsTransportState,\n \n // SCTP\n RTCSctpTransport,\n RTCSctpTransportState,\n \n // DataChannel\n RTCDataChannel,\n RTCDataChannelState,\n \n // SDP\n RTCSessionDescription,\n RTCSdpType,\n \n // PeerConnection\n RTCPeerConnection,\n RTCSignalingState,\n RTCPeerConnectionState,\n \n // Version\n version: require('../package.json').version\n};\n","import { getDefaultExportFromCjs } from \"\u0000commonjsHelpers.js\";\nimport { __require as requireSrc } from \"/home/runner/work/nodertc/nodertc/src/index.js\";\nvar srcExports = requireSrc();\nexport { srcExports as __moduleExports };\nexport default /*@__PURE__*/getDefaultExportFromCjs(srcExports);"],"names":["require$$1","require$$0","require$$2","require$$5","require$$3","require$$4","require$$6","require$$7","require$$8","require$$9"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/foundation/ByteBufferQueue.js","../src/foundation/RTCError.js","../src/ice/RTCIceCandidate.js","../src/stun/stun-client.js","../src/ice/RTCIceTransport.js","../src/dtls/RTCCertificate.js","../src/dtls/RTCDtlsTransport.js","../src/sctp/RTCSctpTransport.js","../src/datachannel/RTCDataChannel.js","../src/sdp/RTCSessionDescription.js","../src/sdp/sdp-utils.js","../src/network/network-transport.js","../src/peerconnection/RTCPeerConnection.js","../src/index.js","../src/index.js?commonjs-entry"],"sourcesContent":["/**\n * @fileoverview ByteBufferQueue - Efficient byte buffer with O(1) append and O(n) read.\n * \n * Ported from Chromium's WebRTC implementation:\n * chromium/src/third_party/blink/renderer/modules/peerconnection/byte_buffer_queue.{h,cc}\n * \n * This class provides efficient management of byte buffers with O(1) append operations\n * and O(n) read operations. Clients can append entire buffers then copy data out across\n * buffer boundaries.\n * \n * @license BSD-3-Clause\n * @author nmhung1210\n */\n\n'use strict';\n\n/**\n * A ByteBufferQueue manages a queue of byte buffers with efficient operations.\n * \n * Invariants maintained:\n * - size_ = sum of all buffer sizes - frontBufferOffset_\n * - No buffer in the queue is empty\n * - If queue is empty, frontBufferOffset_ = 0\n * - Otherwise, frontBufferOffset_ < front buffer size\n */\nclass ByteBufferQueue {\n constructor() {\n /**\n * Total number of bytes available to read.\n * @private {number}\n */\n this._size = 0;\n\n /**\n * Double-ended queue of byte buffers.\n * Append() pushes to the back, ReadInto() consumes from the front.\n * @private {Buffer[]}\n */\n this._buffers = [];\n\n /**\n * Offset from which to start reading the front buffer.\n * @private {number}\n */\n this._frontBufferOffset = 0;\n }\n\n /**\n * Number of bytes that can be read.\n * @returns {number}\n */\n get size() {\n return this._size;\n }\n\n /**\n * Returns true if no bytes are available to read.\n * @returns {boolean}\n */\n get empty() {\n return this._size === 0;\n }\n\n /**\n * Copies data into the given buffer. Consumes bytes from the queue.\n * Returns the number of bytes written to bufferOut.\n * \n * @param {Buffer} bufferOut - Destination buffer to read into\n * @returns {number} Number of bytes actually read\n * @throws {TypeError} If bufferOut is not a Buffer\n */\n readInto(bufferOut) {\n if (!Buffer.isBuffer(bufferOut)) {\n throw new TypeError('bufferOut must be a Buffer');\n }\n\n let readAmount = 0;\n let outputOffset = 0;\n\n while (outputOffset < bufferOut.length && this._buffers.length > 0) {\n const frontBuffer = this._buffers[0];\n const availableInFront = frontBuffer.length - this._frontBufferOffset;\n const remainingOutput = bufferOut.length - outputOffset;\n const toCopy = Math.min(availableInFront, remainingOutput);\n\n // Copy data from front buffer to output\n frontBuffer.copy(\n bufferOut,\n outputOffset,\n this._frontBufferOffset,\n this._frontBufferOffset + toCopy\n );\n\n readAmount += toCopy;\n outputOffset += toCopy;\n\n if (toCopy < availableInFront) {\n // Partial read, update offset\n this._frontBufferOffset += toCopy;\n } else {\n // Consumed entire front buffer, remove it\n this._buffers.shift();\n this._frontBufferOffset = 0;\n }\n }\n\n this._size -= readAmount;\n this._checkInvariants();\n return readAmount;\n }\n\n /**\n * Appends a buffer to the queue. Takes ownership of the buffer.\n * Empty buffers are ignored.\n * \n * @param {Buffer} buffer - Buffer to append\n * @throws {TypeError} If buffer is not a Buffer\n */\n append(buffer) {\n if (!Buffer.isBuffer(buffer)) {\n throw new TypeError('buffer must be a Buffer');\n }\n\n if (buffer.length === 0) {\n return; // Ignore empty buffers\n }\n\n this._size += buffer.length;\n this._buffers.push(buffer);\n this._checkInvariants();\n }\n\n /**\n * Clears all stored buffers.\n */\n clear() {\n this._buffers = [];\n this._frontBufferOffset = 0;\n this._size = 0;\n this._checkInvariants();\n }\n\n /**\n * Reads and consumes exactly n bytes.\n * \n * @param {number} n - Number of bytes to read\n * @returns {Buffer} Buffer containing exactly n bytes\n * @throws {RangeError} If fewer than n bytes are available\n */\n read(n) {\n if (n > this._size) {\n throw new RangeError(`Cannot read ${n} bytes, only ${this._size} available`);\n }\n if (n === 0) {\n return Buffer.allocUnsafe(0);\n }\n\n const result = Buffer.allocUnsafe(n);\n const bytesRead = this.readInto(result);\n\n if (bytesRead !== n) {\n throw new Error(`Internal error: read ${bytesRead} bytes, expected ${n}`);\n }\n\n return result;\n }\n\n /**\n * Peeks at data without consuming it.\n * \n * @param {number} [n=this._size] - Number of bytes to peek\n * @returns {Buffer} Buffer containing up to n bytes (not consumed)\n */\n peek(n = this._size) {\n const peekAmount = Math.min(n, this._size);\n if (peekAmount === 0) {\n return Buffer.allocUnsafe(0);\n }\n\n const result = Buffer.allocUnsafe(peekAmount);\n let written = 0;\n let bufferIndex = 0;\n let offset = this._frontBufferOffset;\n\n while (written < peekAmount && bufferIndex < this._buffers.length) {\n const buffer = this._buffers[bufferIndex];\n const available = buffer.length - offset;\n const toCopy = Math.min(available, peekAmount - written);\n\n buffer.copy(result, written, offset, offset + toCopy);\n written += toCopy;\n\n bufferIndex++;\n offset = 0; // Reset offset for subsequent buffers\n }\n\n return result;\n }\n\n /**\n * Checks internal invariants (development mode only).\n * @private\n * @throws {Error} If invariants are violated\n */\n _checkInvariants() {\n if (process.env.NODE_ENV !== 'production') {\n let bufferSizeSum = 0;\n for (const buffer of this._buffers) {\n if (buffer.length === 0) {\n throw new Error('Invariant violation: empty buffer in queue');\n }\n bufferSizeSum += buffer.length;\n }\n\n const expectedSize = bufferSizeSum - this._frontBufferOffset;\n if (this._size !== expectedSize) {\n throw new Error(\n `Invariant violation: size=${this._size}, expected=${expectedSize}`\n );\n }\n\n if (this._buffers.length === 0) {\n if (this._frontBufferOffset !== 0) {\n throw new Error('Invariant violation: offset non-zero with empty queue');\n }\n } else {\n if (this._frontBufferOffset >= this._buffers[0].length) {\n throw new Error('Invariant violation: offset >= front buffer size');\n }\n }\n }\n }\n}\n\nmodule.exports = ByteBufferQueue;\n","/**\n * @fileoverview RTCError - WebRTC-specific error types.\n * \n * Ported from Chromium's WebRTC implementation:\n * chromium/src/third_party/blink/renderer/modules/peerconnection/rtc_error.{h,cc}\n * \n * Provides WebRTC-specific error types extending the standard Error class\n * with additional error detail types and metadata fields.\n * \n * @license BSD-3-Clause\n * @author nmhung1210\n */\n\n'use strict';\n\n/**\n * RTCErrorDetailType enum - Standardized WebRTC error details.\n * Maps to RTCErrorDetailType from the WebRTC spec.\n * \n * @readonly\n * @enum {string}\n */\nconst RTCErrorDetailType = Object.freeze({\n NONE: 'none',\n DATA_CHANNEL_FAILURE: 'data-channel-failure',\n DTLS_FAILURE: 'dtls-failure',\n FINGERPRINT_FAILURE: 'fingerprint-failure',\n SCTP_FAILURE: 'sctp-failure',\n SDP_SYNTAX_ERROR: 'sdp-syntax-error',\n HARDWARE_ENCODER_NOT_AVAILABLE: 'hardware-encoder-not-available',\n HARDWARE_ENCODER_ERROR: 'hardware-encoder-error',\n INVALID_STATE: 'invalid-state',\n INVALID_MODIFICATION: 'invalid-modification',\n INVALID_ACCESS_ERROR: 'invalid-access-error',\n OPERATION_ERROR: 'operation-error'\n});\n\n/**\n * RTCError extends Error with WebRTC-specific error details.\n * \n * @extends Error\n */\nclass RTCError extends Error {\n /**\n * Creates a new RTCError.\n * \n * @param {RTCErrorInit} [init={}] - Error initialization dictionary\n * @param {string} [init.errorDetail='none'] - Error detail type\n * @param {number} [init.sdpLineNumber] - SDP line number where error occurred\n * @param {number} [init.httpRequestStatusCode] - HTTP status code if relevant\n * @param {number} [init.sctpCauseCode] - SCTP cause code\n * @param {number} [init.receivedAlert] - TLS alert received\n * @param {number} [init.sentAlert] - TLS alert sent\n * @param {string} [message=''] - Error message\n */\n constructor(init = {}, message = '') {\n super(message);\n \n this.name = 'RTCError';\n \n // Maintain stack trace in V8\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, RTCError);\n }\n\n // Validate and set errorDetail\n const errorDetail = init.errorDetail || RTCErrorDetailType.NONE;\n if (typeof errorDetail !== 'string') {\n throw new TypeError('errorDetail must be a string');\n }\n \n /**\n * Specific error category.\n * @private {string}\n */\n this._errorDetail = errorDetail;\n\n // Optional numeric fields with validation\n this._sdpLineNumber = this._validateInteger(init.sdpLineNumber, 'sdpLineNumber');\n this._httpRequestStatusCode = this._validateInteger(init.httpRequestStatusCode, 'httpRequestStatusCode');\n this._sctpCauseCode = this._validateInteger(init.sctpCauseCode, 'sctpCauseCode');\n this._receivedAlert = this._validateUnsignedInteger(init.receivedAlert, 'receivedAlert');\n this._sentAlert = this._validateUnsignedInteger(init.sentAlert, 'sentAlert');\n }\n\n /**\n * Validates that a value is an integer or null/undefined.\n * @private\n * @param {*} value - Value to validate\n * @param {string} fieldName - Field name for error messages\n * @returns {number|null}\n * @throws {TypeError} If value is not an integer\n */\n _validateInteger(value, fieldName) {\n if (value === undefined || value === null) {\n return null;\n }\n const num = Number(value);\n if (!Number.isInteger(num)) {\n throw new TypeError(`${fieldName} must be an integer`);\n }\n return num;\n }\n\n /**\n * Validates that a value is an unsigned integer or null/undefined.\n * @private\n * @param {*} value - Value to validate\n * @param {string} fieldName - Field name for error messages\n * @returns {number|null}\n * @throws {TypeError} If value is not an unsigned integer\n */\n _validateUnsignedInteger(value, fieldName) {\n if (value === undefined || value === null) {\n return null;\n }\n const num = Number(value);\n if (!Number.isInteger(num) || num < 0) {\n throw new TypeError(`${fieldName} must be an unsigned integer`);\n }\n return num;\n }\n\n /**\n * RTCErrorDetailType - specific error category.\n * @type {string}\n */\n get errorDetail() {\n return this._errorDetail;\n }\n\n /**\n * SDP line number where the error occurred (if applicable).\n * @type {number|null}\n */\n get sdpLineNumber() {\n return this._sdpLineNumber;\n }\n\n /**\n * HTTP request status code (if applicable).\n * @type {number|null}\n */\n get httpRequestStatusCode() {\n return this._httpRequestStatusCode;\n }\n\n /**\n * SCTP cause code (if applicable).\n * @type {number|null}\n */\n get sctpCauseCode() {\n return this._sctpCauseCode;\n }\n\n /**\n * TLS alert value received (if applicable).\n * @type {number|null}\n */\n get receivedAlert() {\n return this._receivedAlert;\n }\n\n /**\n * TLS alert value sent (if applicable).\n * @type {number|null}\n */\n get sentAlert() {\n return this._sentAlert;\n }\n\n /**\n * Converts error to JSON representation.\n * @returns {Object} JSON representation of the error\n */\n toJSON() {\n const json = {\n name: this.name,\n message: this.message,\n errorDetail: this._errorDetail\n };\n\n if (this._sdpLineNumber !== null) {\n json.sdpLineNumber = this._sdpLineNumber;\n }\n if (this._httpRequestStatusCode !== null) {\n json.httpRequestStatusCode = this._httpRequestStatusCode;\n }\n if (this._sctpCauseCode !== null) {\n json.sctpCauseCode = this._sctpCauseCode;\n }\n if (this._receivedAlert !== null) {\n json.receivedAlert = this._receivedAlert;\n }\n if (this._sentAlert !== null) {\n json.sentAlert = this._sentAlert;\n }\n\n return json;\n }\n\n /**\n * Creates RTCError from a native WebRTC error object.\n * @param {Object} nativeError - Native error object\n * @param {string} [nativeError.error_detail] - Error detail type\n * @param {number} [nativeError.sctp_cause_code] - SCTP cause code\n * @param {string} [nativeError.message] - Error message\n * @returns {RTCError}\n */\n static fromNative(nativeError) {\n const init = {\n errorDetail: nativeError.error_detail || RTCErrorDetailType.NONE\n };\n\n if (nativeError.sctp_cause_code !== undefined) {\n init.sctpCauseCode = nativeError.sctp_cause_code;\n }\n\n return new RTCError(init, nativeError.message || 'Unknown error');\n }\n}\n\n// Export error detail types as static property\nRTCError.DetailType = RTCErrorDetailType;\n\nmodule.exports = RTCError;\n","/**\n * @fileoverview RTCIceCandidate - ICE candidate representation.\n * \n * Ported from Chromium's WebRTC implementation:\n * chromium/src/third_party/blink/renderer/modules/peerconnection/rtc_ice_candidate.{h,cc}\n * \n * Represents an ICE (Interactive Connectivity Establishment) candidate that\n * describes a potential way to establish a connection with a peer.\n * \n * @license BSD-3-Clause\n * @author nmhung1210\n */\n\n'use strict';\n\n/**\n * RTCIceCandidate represents a potential method for establishing connectivity.\n * \n * ICE candidates are described using SDP (Session Description Protocol) syntax.\n * Each candidate describes a single address/port combination and transport protocol.\n */\nclass RTCIceCandidate {\n /**\n * Creates a new RTCIceCandidate.\n * \n * @param {RTCIceCandidateInit} [candidateInit={}] - Initialization dictionary\n * @param {string} [candidateInit.candidate=''] - SDP candidate string\n * @param {string|null} [candidateInit.sdpMid] - Media stream ID\n * @param {number|null} [candidateInit.sdpMLineIndex] - M-line index\n * @param {string} [candidateInit.usernameFragment] - ICE username fragment\n * @throws {TypeError} If both sdpMid and sdpMLineIndex are null\n */\n constructor(candidateInit = {}) {\n // Validate that at least one of sdpMid or sdpMLineIndex is present\n if (candidateInit.sdpMid === null && candidateInit.sdpMLineIndex === null) {\n throw new TypeError('sdpMid and sdpMLineIndex are both null');\n }\n\n /**\n * SDP candidate string.\n * @private {string}\n */\n this._candidate = candidateInit.candidate || '';\n\n /**\n * Media stream identification.\n * @private {string|null}\n */\n this._sdpMid = candidateInit.sdpMid !== undefined ? candidateInit.sdpMid : null;\n\n /**\n * Media line index (zero-based).\n * @private {number|null}\n */\n this._sdpMLineIndex = candidateInit.sdpMLineIndex !== undefined ? \n candidateInit.sdpMLineIndex : null;\n\n /**\n * ICE username fragment.\n * @private {string|null}\n */\n this._usernameFragment = candidateInit.usernameFragment || null;\n\n // Parse candidate string for detailed attributes\n this._parsedAttributes = this._parseCandidate(this._candidate);\n }\n\n /**\n * Parses an ICE candidate string to extract attributes.\n * Format: \"candidate:foundation component protocol priority address port typ type [raddr reladdr] [rport relport]\"\n * \n * @private\n * @param {string} candidateStr - Candidate string to parse\n * @returns {Object} Parsed attributes\n */\n _parseCandidate(candidateStr) {\n const attrs = {\n foundation: null,\n component: null,\n protocol: null,\n priority: null,\n address: null,\n port: null,\n type: null,\n tcpType: null,\n relatedAddress: null,\n relatedPort: null\n };\n\n if (!candidateStr || !candidateStr.startsWith('candidate:')) {\n return attrs;\n }\n\n // Remove \"candidate:\" prefix\n const parts = candidateStr.substring(10).trim().split(/\\s+/);\n \n if (parts.length < 8) {\n return attrs;\n }\n\n // Parse fixed fields\n attrs.foundation = parts[0];\n attrs.component = parts[1];\n attrs.protocol = parts[2].toLowerCase();\n attrs.priority = parseInt(parts[3], 10);\n attrs.address = parts[4];\n attrs.port = parseInt(parts[5], 10);\n \n // parts[6] should be \"typ\"\n if (parts[6] === 'typ') {\n attrs.type = parts[7];\n }\n\n // Parse optional attributes\n for (let i = 8; i < parts.length; i += 2) {\n const key = parts[i];\n const value = parts[i + 1];\n \n if (key === 'raddr') {\n attrs.relatedAddress = value;\n } else if (key === 'rport') {\n attrs.relatedPort = parseInt(value, 10);\n } else if (key === 'tcptype') {\n attrs.tcpType = value;\n }\n }\n\n return attrs;\n }\n\n /**\n * SDP candidate attribute containing the candidate description.\n * @type {string}\n */\n get candidate() {\n return this._candidate;\n }\n\n /**\n * Media stream identification tag.\n * @type {string|null}\n */\n get sdpMid() {\n return this._sdpMid;\n }\n\n /**\n * Index of the m-line in the SDP this candidate is associated with.\n * @type {number|null}\n */\n get sdpMLineIndex() {\n return this._sdpMLineIndex;\n }\n\n /**\n * ICE username fragment.\n * @type {string|null}\n */\n get usernameFragment() {\n return this._usernameFragment;\n }\n\n /**\n * Unique identifier for this candidate.\n * @type {string|null}\n */\n get foundation() {\n return this._parsedAttributes.foundation;\n }\n\n /**\n * Component identifier (rtp=1, rtcp=2).\n * @type {string|null}\n */\n get component() {\n return this._parsedAttributes.component;\n }\n\n /**\n * Priority value for this candidate.\n * Higher priority candidates are preferred.\n * @type {number|null}\n */\n get priority() {\n return this._parsedAttributes.priority;\n }\n\n /**\n * IP address of this candidate.\n * @type {string|null}\n */\n get address() {\n return this._parsedAttributes.address;\n }\n\n /**\n * Transport protocol (udp/tcp).\n * @type {string|null}\n */\n get protocol() {\n return this._parsedAttributes.protocol;\n }\n\n /**\n * Port number.\n * @type {number|null}\n */\n get port() {\n return this._parsedAttributes.port;\n }\n\n /**\n * Type of candidate (host, srflx, prflx, relay).\n * @type {string|null}\n */\n get type() {\n return this._parsedAttributes.type;\n }\n\n /**\n * TCP candidate type (active, passive, so).\n * Only applicable for TCP candidates.\n * @type {string|null}\n */\n get tcpType() {\n return this._parsedAttributes.tcpType;\n }\n\n /**\n * Related address for reflexive/relay candidates.\n * @type {string|null}\n */\n get relatedAddress() {\n return this._parsedAttributes.relatedAddress;\n }\n\n /**\n * Related port for reflexive/relay candidates.\n * @type {number|null}\n */\n get relatedPort() {\n return this._parsedAttributes.relatedPort;\n }\n\n /**\n * Converts candidate to JSON representation.\n * @returns {Object} JSON representation\n */\n toJSON() {\n const json = {\n candidate: this._candidate,\n sdpMid: this._sdpMid,\n sdpMLineIndex: this._sdpMLineIndex\n };\n\n if (this._usernameFragment) {\n json.usernameFragment = this._usernameFragment;\n }\n\n return json;\n }\n\n /**\n * Creates an RTCIceCandidate from a candidate string.\n * \n * @param {string} candidateStr - ICE candidate string\n * @param {string|null} [sdpMid=null] - Media stream ID\n * @param {number|null} [sdpMLineIndex=0] - M-line index\n * @returns {RTCIceCandidate}\n */\n static fromString(candidateStr, sdpMid = null, sdpMLineIndex = 0) {\n return new RTCIceCandidate({\n candidate: candidateStr,\n sdpMid,\n sdpMLineIndex\n });\n }\n\n /**\n * Validates if a string is a valid candidate format.\n * \n * @param {string} candidateStr - String to validate\n * @returns {boolean} True if valid candidate format\n */\n static isValid(candidateStr) {\n if (!candidateStr || typeof candidateStr !== 'string') {\n return false;\n }\n \n // Must start with \"candidate:\"\n if (!candidateStr.startsWith('candidate:')) {\n return false;\n }\n\n // Must have at least the minimum required fields\n const parts = candidateStr.substring(10).trim().split(/\\s+/);\n return parts.length >= 8;\n }\n}\n\nmodule.exports = RTCIceCandidate;\n","/**\n * @file stun-client.js\n * @description STUN (Session Traversal Utilities for NAT) client implementation\n * @module stun/stun-client\n * \n * STUN Protocol: RFC 5389\n * TURN Protocol: RFC 5766\n */\n\n'use strict';\n\nconst dgram = require('dgram');\nconst crypto = require('crypto');\n\n/**\n * STUN message types\n */\nconst STUN_MESSAGE_TYPES = {\n BINDING_REQUEST: 0x0001,\n BINDING_RESPONSE: 0x0101,\n BINDING_ERROR_RESPONSE: 0x0111,\n \n // TURN\n ALLOCATE_REQUEST: 0x0003,\n ALLOCATE_RESPONSE: 0x0103,\n ALLOCATE_ERROR_RESPONSE: 0x0113,\n \n REFRESH_REQUEST: 0x0004,\n REFRESH_RESPONSE: 0x0104,\n \n SEND_INDICATION: 0x0016,\n DATA_INDICATION: 0x0017,\n \n CREATE_PERMISSION_REQUEST: 0x0008,\n CREATE_PERMISSION_RESPONSE: 0x0108,\n \n CHANNEL_BIND_REQUEST: 0x0009,\n CHANNEL_BIND_RESPONSE: 0x0109\n};\n\n/**\n * STUN attribute types\n */\nconst STUN_ATTRIBUTES = {\n MAPPED_ADDRESS: 0x0001,\n USERNAME: 0x0006,\n MESSAGE_INTEGRITY: 0x0008,\n ERROR_CODE: 0x0009,\n UNKNOWN_ATTRIBUTES: 0x000A,\n REALM: 0x0014,\n NONCE: 0x0015,\n XOR_MAPPED_ADDRESS: 0x0020,\n \n // TURN\n CHANNEL_NUMBER: 0x000C,\n LIFETIME: 0x000D,\n XOR_PEER_ADDRESS: 0x0012,\n DATA: 0x0013,\n XOR_RELAYED_ADDRESS: 0x0016,\n REQUESTED_TRANSPORT: 0x0019,\n \n SOFTWARE: 0x8022,\n FINGERPRINT: 0x8028\n};\n\nconst MAGIC_COOKIE = 0x2112A442;\n\n/**\n * @class STUNClient\n * @description STUN/TURN client for NAT traversal\n */\nclass STUNClient {\n /**\n * Create a STUN client\n * @param {Object} options - Client options\n * @param {string} options.server - STUN/TURN server address\n * @param {number} options.port - Server port\n * @param {string} [options.username] - TURN username\n * @param {string} [options.credential] - TURN password\n * @param {string} [options.transport='udp'] - Transport protocol (udp/tcp)\n * @param {Object} [options.params={}] - Additional query parameters from URL\n */\n constructor(options) {\n this.server = options.server;\n this.port = options.port;\n this.username = options.username;\n this.credential = options.credential;\n this.transport = options.transport || 'udp';\n this.params = options.params || {};\n \n this.socket = null;\n this.transactions = new Map();\n this.realm = null;\n this.nonce = null;\n }\n\n /**\n * Connect to the STUN/TURN server\n * @returns {Promise<void>}\n */\n async connect() {\n if (this.socket) {\n return;\n }\n\n return new Promise((resolve, reject) => {\n this.socket = dgram.createSocket('udp4');\n \n this.socket.on('message', (msg, rinfo) => {\n this._handleMessage(msg, rinfo);\n });\n\n this.socket.on('error', (err) => {\n console.error('STUN socket error:', err);\n reject(err);\n });\n\n this.socket.bind(() => {\n resolve();\n });\n });\n }\n\n /**\n * Send a STUN Binding Request to get reflexive address\n * @returns {Promise<Object>} Reflexive address info\n */\n async getReflexiveAddress() {\n await this.connect();\n\n const transactionId = crypto.randomBytes(12);\n const request = this._createBindingRequest(transactionId);\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.transactions.delete(transactionId.toString('hex'));\n reject(new Error('STUN request timeout'));\n }, 5000);\n\n this.transactions.set(transactionId.toString('hex'), {\n resolve: (result) => {\n clearTimeout(timeout);\n resolve(result);\n },\n reject: (error) => {\n clearTimeout(timeout);\n reject(error);\n }\n });\n\n this.socket.send(request, this.port, this.server, (err) => {\n if (err) {\n clearTimeout(timeout);\n this.transactions.delete(transactionId.toString('hex'));\n reject(err);\n }\n });\n });\n }\n\n /**\n * Send a TURN Allocate Request to get relay address\n * @param {number} [lifetime=600] - Allocation lifetime in seconds\n * @returns {Promise<Object>} Relay address info\n */\n async allocateRelay(lifetime = 600) {\n if (!this.username || !this.credential) {\n throw new Error('TURN requires username and credential');\n }\n\n await this.connect();\n\n let transactionId = crypto.randomBytes(12);\n let request = this._createAllocateRequest(transactionId, lifetime);\n\n // First attempt without credentials to get realm and nonce\n try {\n return await this._sendRequest(request, transactionId, 'allocate');\n } catch (error) {\n // If we get 401 Unauthorized, retry with credentials\n if (error.message.includes('401') && this.realm && this.nonce) {\n // Create new transaction ID for retry\n transactionId = crypto.randomBytes(12);\n request = this._createAllocateRequest(transactionId, lifetime, true);\n return await this._sendRequest(request, transactionId, 'allocate');\n }\n throw error;\n }\n }\n\n /**\n * Send a TURN Refresh Request to keep allocation alive\n * @param {number} [lifetime=600] - Allocation lifetime in seconds\n * @returns {Promise<Object>} Updated allocation info\n */\n async refreshAllocation(lifetime = 600) {\n if (!this.username || !this.credential) {\n throw new Error('TURN requires username and credential');\n }\n\n const transactionId = crypto.randomBytes(12);\n const request = this._createRefreshRequest(transactionId, lifetime);\n\n return this._sendRequest(request, transactionId, 'refresh');\n }\n\n /**\n * Send a TURN request\n * @param {Buffer} request - Request message\n * @param {Buffer} transactionId - Transaction ID\n * @param {string} requestType - Type of request\n * @returns {Promise<Object>}\n * @private\n */\n _sendRequest(request, transactionId, requestType) {\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.transactions.delete(transactionId.toString('hex'));\n reject(new Error(`${requestType} request timeout`));\n }, 5000);\n\n this.transactions.set(transactionId.toString('hex'), {\n type: requestType,\n resolve: (result) => {\n clearTimeout(timeout);\n resolve(result);\n },\n reject: (error) => {\n clearTimeout(timeout);\n reject(error);\n }\n });\n\n this.socket.send(request, this.port, this.server, (err) => {\n if (err) {\n clearTimeout(timeout);\n this.transactions.delete(transactionId.toString('hex'));\n reject(err);\n }\n });\n });\n }\n\n /**\n * Create a STUN Binding Request\n * @param {Buffer} transactionId - Transaction ID\n * @returns {Buffer} STUN message\n * @private\n */\n _createBindingRequest(transactionId) {\n const header = Buffer.alloc(20);\n \n // Message Type (2 bytes)\n header.writeUInt16BE(STUN_MESSAGE_TYPES.BINDING_REQUEST, 0);\n \n // Message Length (2 bytes) - 0 for now, no attributes\n header.writeUInt16BE(0, 2);\n \n // Magic Cookie (4 bytes)\n header.writeUInt32BE(MAGIC_COOKIE, 4);\n \n // Transaction ID (12 bytes)\n transactionId.copy(header, 8);\n \n return header;\n }\n\n /**\n * Create a TURN Allocate Request\n * @param {Buffer} transactionId - Transaction ID\n * @param {number} lifetime - Allocation lifetime in seconds\n * @param {boolean} withAuth - Include authentication\n * @returns {Buffer} STUN message\n * @private\n */\n _createAllocateRequest(transactionId, lifetime, withAuth = false) {\n const attributes = [];\n\n // REQUESTED-TRANSPORT (UDP = 17)\n const transport = Buffer.alloc(8);\n transport.writeUInt16BE(STUN_ATTRIBUTES.REQUESTED_TRANSPORT, 0);\n transport.writeUInt16BE(4, 2);\n transport.writeUInt8(17, 4); // UDP\n attributes.push(transport);\n\n // LIFETIME\n const lifetimeAttr = Buffer.alloc(8);\n lifetimeAttr.writeUInt16BE(STUN_ATTRIBUTES.LIFETIME, 0);\n lifetimeAttr.writeUInt16BE(4, 2);\n lifetimeAttr.writeUInt32BE(lifetime, 4);\n attributes.push(lifetimeAttr);\n\n if (withAuth && this.realm && this.nonce) {\n // USERNAME\n const usernameAttr = this._createStringAttribute(STUN_ATTRIBUTES.USERNAME, this.username);\n attributes.push(usernameAttr);\n\n // REALM\n const realmAttr = this._createStringAttribute(STUN_ATTRIBUTES.REALM, this.realm);\n attributes.push(realmAttr);\n\n // NONCE\n const nonceAttr = this._createStringAttribute(STUN_ATTRIBUTES.NONCE, this.nonce);\n attributes.push(nonceAttr);\n }\n\n return this._createMessage(STUN_MESSAGE_TYPES.ALLOCATE_REQUEST, transactionId, attributes, withAuth);\n }\n\n /**\n * Create a TURN Refresh Request\n * @param {Buffer} transactionId - Transaction ID\n * @param {number} lifetime - Allocation lifetime in seconds\n * @returns {Buffer} STUN message\n * @private\n */\n _createRefreshRequest(transactionId, lifetime) {\n const attributes = [];\n\n // LIFETIME\n const lifetimeAttr = Buffer.alloc(8);\n lifetimeAttr.writeUInt16BE(STUN_ATTRIBUTES.LIFETIME, 0);\n lifetimeAttr.writeUInt16BE(4, 2);\n lifetimeAttr.writeUInt32BE(lifetime, 4);\n attributes.push(lifetimeAttr);\n\n // USERNAME\n const usernameAttr = this._createStringAttribute(STUN_ATTRIBUTES.USERNAME, this.username);\n attributes.push(usernameAttr);\n\n // REALM\n if (this.realm) {\n const realmAttr = this._createStringAttribute(STUN_ATTRIBUTES.REALM, this.realm);\n attributes.push(realmAttr);\n }\n\n // NONCE\n if (this.nonce) {\n const nonceAttr = this._createStringAttribute(STUN_ATTRIBUTES.NONCE, this.nonce);\n attributes.push(nonceAttr);\n }\n\n return this._createMessage(STUN_MESSAGE_TYPES.REFRESH_REQUEST, transactionId, attributes, true);\n }\n\n /**\n * Create a STUN message with attributes\n * @param {number} messageType - Message type\n * @param {Buffer} transactionId - Transaction ID\n * @param {Array<Buffer>} attributes - Attribute buffers\n * @param {boolean} withIntegrity - Add MESSAGE-INTEGRITY\n * @returns {Buffer} Complete STUN message\n * @private\n */\n _createMessage(messageType, transactionId, attributes, withIntegrity = false) {\n let attributesBuffer = Buffer.concat(attributes);\n\n // Add MESSAGE-INTEGRITY if needed\n if (withIntegrity && this.credential) {\n const tempHeader = Buffer.alloc(20);\n tempHeader.writeUInt16BE(messageType, 0);\n tempHeader.writeUInt16BE(attributesBuffer.length + 24, 2); // +24 for MESSAGE-INTEGRITY\n tempHeader.writeUInt32BE(MAGIC_COOKIE, 4);\n transactionId.copy(tempHeader, 8);\n\n const tempMessage = Buffer.concat([tempHeader, attributesBuffer]);\n \n // For TURN, compute key as MD5(username:realm:password) per RFC 5766\n let key = this.credential;\n if (this.username && this.realm) {\n const keyString = `${this.username}:${this.realm}:${this.credential}`;\n key = crypto.createHash('md5').update(keyString).digest();\n }\n \n const hmac = crypto.createHmac('sha1', key);\n hmac.update(tempMessage);\n const integrity = hmac.digest();\n\n const integrityAttr = Buffer.alloc(4 + integrity.length);\n integrityAttr.writeUInt16BE(STUN_ATTRIBUTES.MESSAGE_INTEGRITY, 0);\n integrityAttr.writeUInt16BE(integrity.length, 2);\n integrity.copy(integrityAttr, 4);\n\n attributesBuffer = Buffer.concat([attributesBuffer, integrityAttr]);\n }\n\n // Create final message\n const header = Buffer.alloc(20);\n header.writeUInt16BE(messageType, 0);\n header.writeUInt16BE(attributesBuffer.length, 2);\n header.writeUInt32BE(MAGIC_COOKIE, 4);\n transactionId.copy(header, 8);\n\n return Buffer.concat([header, attributesBuffer]);\n }\n\n /**\n * Create a string attribute\n * @param {number} type - Attribute type\n * @param {string} value - String value\n * @returns {Buffer} Attribute buffer\n * @private\n */\n _createStringAttribute(type, value) {\n const valueBuffer = Buffer.from(value, 'utf8');\n const length = valueBuffer.length;\n const padding = (4 - (length % 4)) % 4;\n const buffer = Buffer.alloc(4 + length + padding);\n \n buffer.writeUInt16BE(type, 0);\n buffer.writeUInt16BE(length, 2);\n valueBuffer.copy(buffer, 4);\n \n return buffer;\n }\n\n /**\n * Handle incoming STUN message\n * @param {Buffer} msg - Message buffer\n * @param {Object} rinfo - Remote info\n * @private\n */\n _handleMessage(msg, rinfo) {\n if (msg.length < 20) {\n return; // Invalid STUN message\n }\n\n const messageType = msg.readUInt16BE(0);\n const messageLength = msg.readUInt16BE(2);\n const magicCookie = msg.readUInt32BE(4);\n const transactionId = msg.slice(8, 20);\n\n if (magicCookie !== MAGIC_COOKIE) {\n return; // Not a STUN message\n }\n\n const transactionKey = transactionId.toString('hex');\n const transaction = this.transactions.get(transactionKey);\n\n if (!transaction) {\n return; // Unknown transaction\n }\n\n const attributes = this._parseAttributes(msg.slice(20, 20 + messageLength), transactionId);\n\n // Handle STUN Binding responses\n if (messageType === STUN_MESSAGE_TYPES.BINDING_RESPONSE) {\n if (attributes.xorMappedAddress) {\n transaction.resolve({\n address: attributes.xorMappedAddress.address,\n port: attributes.xorMappedAddress.port,\n family: attributes.xorMappedAddress.family\n });\n } else if (attributes.mappedAddress) {\n transaction.resolve({\n address: attributes.mappedAddress.address,\n port: attributes.mappedAddress.port,\n family: attributes.mappedAddress.family\n });\n } else {\n transaction.reject(new Error('No mapped address in STUN response'));\n }\n this.transactions.delete(transactionKey);\n }\n // Handle TURN Allocate responses\n else if (messageType === STUN_MESSAGE_TYPES.ALLOCATE_RESPONSE) {\n if (attributes.xorRelayedAddress) {\n transaction.resolve({\n relayedAddress: attributes.xorRelayedAddress.address,\n relayedPort: attributes.xorRelayedAddress.port,\n lifetime: attributes.lifetime || 600,\n type: 'relay'\n });\n } else {\n transaction.reject(new Error('No relayed address in ALLOCATE response'));\n }\n this.transactions.delete(transactionKey);\n }\n // Handle TURN Refresh responses\n else if (messageType === STUN_MESSAGE_TYPES.REFRESH_RESPONSE) {\n transaction.resolve({\n lifetime: attributes.lifetime || 600\n });\n this.transactions.delete(transactionKey);\n }\n // Handle error responses\n else if (messageType === STUN_MESSAGE_TYPES.BINDING_ERROR_RESPONSE ||\n messageType === STUN_MESSAGE_TYPES.ALLOCATE_ERROR_RESPONSE) {\n \n // Store realm and nonce for subsequent requests\n if (attributes.realm) {\n this.realm = attributes.realm;\n }\n if (attributes.nonce) {\n this.nonce = attributes.nonce;\n }\n\n const errorMsg = attributes.errorCode || 'Unknown error';\n transaction.reject(new Error(`STUN error: ${errorMsg}`));\n this.transactions.delete(transactionKey);\n }\n }\n\n /**\n * Parse STUN attributes\n * @param {Buffer} data - Attributes data\n * @param {Buffer} transactionId - Transaction ID\n * @returns {Object} Parsed attributes\n * @private\n */\n _parseAttributes(data, transactionId) {\n const attributes = {};\n let offset = 0;\n\n while (offset < data.length) {\n if (offset + 4 > data.length) break;\n\n const type = data.readUInt16BE(offset);\n const length = data.readUInt16BE(offset + 2);\n offset += 4;\n\n if (offset + length > data.length) break;\n\n const value = data.slice(offset, offset + length);\n\n switch (type) {\n case STUN_ATTRIBUTES.XOR_MAPPED_ADDRESS:\n attributes.xorMappedAddress = this._parseXorAddress(value, transactionId);\n break;\n case STUN_ATTRIBUTES.XOR_RELAYED_ADDRESS:\n attributes.xorRelayedAddress = this._parseXorAddress(value, transactionId);\n break;\n case STUN_ATTRIBUTES.MAPPED_ADDRESS:\n attributes.mappedAddress = this._parseAddress(value);\n break;\n case STUN_ATTRIBUTES.LIFETIME:\n attributes.lifetime = value.readUInt32BE(0);\n break;\n case STUN_ATTRIBUTES.ERROR_CODE:\n attributes.errorCode = this._parseErrorCode(value);\n break;\n case STUN_ATTRIBUTES.REALM:\n attributes.realm = value.toString('utf8');\n this.realm = attributes.realm;\n break;\n case STUN_ATTRIBUTES.NONCE:\n attributes.nonce = value.toString('utf8');\n this.nonce = attributes.nonce;\n break;\n }\n\n // Pad to 4-byte boundary\n offset += length;\n const padding = (4 - (length % 4)) % 4;\n offset += padding;\n }\n\n return attributes;\n }\n\n /**\n * Parse XOR-MAPPED-ADDRESS attribute\n * @param {Buffer} data - Attribute data\n * @param {Buffer} transactionId - Transaction ID\n * @returns {Object} Address info\n * @private\n */\n _parseXorAddress(data, transactionId) {\n const family = data.readUInt8(1);\n const xorPort = data.readUInt16BE(2);\n \n // XOR port with magic cookie high 16 bits\n const port = xorPort ^ (MAGIC_COOKIE >> 16);\n\n if (family === 0x01) { // IPv4\n const xorAddress = data.readUInt32BE(4);\n const address = xorAddress ^ MAGIC_COOKIE;\n \n return {\n family: 'IPv4',\n port,\n address: [\n (address >> 24) & 0xFF,\n (address >> 16) & 0xFF,\n (address >> 8) & 0xFF,\n address & 0xFF\n ].join('.')\n };\n }\n\n return null;\n }\n\n /**\n * Parse MAPPED-ADDRESS attribute\n * @param {Buffer} data - Attribute data\n * @returns {Object} Address info\n * @private\n */\n _parseAddress(data) {\n const family = data.readUInt8(1);\n const port = data.readUInt16BE(2);\n\n if (family === 0x01) { // IPv4\n const address = data.slice(4, 8);\n return {\n family: 'IPv4',\n port,\n address: Array.from(address).join('.')\n };\n }\n\n return null;\n }\n\n /**\n * Parse ERROR-CODE attribute\n * @param {Buffer} data - Attribute data\n * @returns {string} Error message\n * @private\n */\n _parseErrorCode(data) {\n const errorClass = data.readUInt8(2) & 0x07;\n const errorNumber = data.readUInt8(3);\n const errorCode = errorClass * 100 + errorNumber;\n const reason = data.slice(4).toString('utf8');\n \n return `${errorCode} ${reason}`;\n }\n\n /**\n * Close the client\n */\n close() {\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n this.transactions.clear();\n }\n}\n\nmodule.exports = STUNClient;\n","/**\n * @file RTCIceTransport.js\n * @description ICE transport implementation for establishing connectivity.\n * @module ice/RTCIceTransport\n * \n * Ported from Chromium's RTCIceTransport implementation:\n * - cc/rtc_ice_transport.h\n * - cc/rtc_ice_transport.cc\n * - cc/rtc_ice_transport.idl\n */\n\nconst EventEmitter = require('events');\nconst STUNClient = require('../stun/stun-client');\nconst dgram = require('dgram');\nconst crypto = require('crypto');\n\n/**\n * RTCIceRole - The role in the ICE process\n * @readonly\n * @enum {string}\n */\nconst RTCIceRole = Object.freeze({\n CONTROLLING: 'controlling',\n CONTROLLED: 'controlled'\n});\n\n/**\n * RTCIceTransportState - Current state of the ICE transport\n * @readonly\n * @enum {string}\n */\nconst RTCIceTransportState = Object.freeze({\n NEW: 'new',\n CHECKING: 'checking',\n CONNECTED: 'connected',\n COMPLETED: 'completed',\n DISCONNECTED: 'disconnected',\n FAILED: 'failed',\n CLOSED: 'closed'\n});\n\n/**\n * RTCIceGatheringState - ICE candidate gathering state\n * @readonly\n * @enum {string}\n */\nconst RTCIceGatheringState = Object.freeze({\n NEW: 'new',\n GATHERING: 'gathering',\n COMPLETE: 'complete'\n});\n\n/**\n * RTCIceParameters - ICE username fragment and password\n * @typedef {Object} RTCIceParameters\n * @property {string} usernameFragment - ICE username fragment\n * @property {string} password - ICE password\n */\n\n/**\n * RTCIceCandidatePair - A pair of local and remote ICE candidates\n * @typedef {Object} RTCIceCandidatePair\n * @property {RTCIceCandidate} local - The local candidate\n * @property {RTCIceCandidate} remote - The remote candidate\n */\n\n/**\n * RTCIceGatherOptions - Options for ICE candidate gathering\n * @typedef {Object} RTCIceGatherOptions\n * @property {RTCIceGatherPolicy} [gatherPolicy='all'] - Candidate gathering policy\n * @property {Array<RTCIceServer>} [iceServers] - STUN/TURN servers to use\n */\n\n/**\n * @class RTCIceTransport\n * @extends EventEmitter\n * @description Represents the ICE transport layer for a peer connection.\n * Manages ICE candidate gathering, connectivity checks, and state transitions.\n * \n * Events:\n * - 'statechange': Fired when the transport state changes\n * - 'gatheringstatechange': Fired when the gathering state changes\n * - 'selectedcandidatepairchange': Fired when the selected candidate pair changes\n * - 'icecandidate': Fired when a new local candidate is gathered\n * \n * @example\n * const transport = new RTCIceTransport();\n * transport.on('statechange', () => {\n * console.log('State:', transport.state);\n * });\n * transport.on('icecandidate', (candidate) => {\n * // Send candidate to remote peer\n * });\n */\nclass RTCIceTransport extends EventEmitter {\n /**\n * Create an RTCIceTransport instance.\n */\n constructor() {\n super();\n\n // Internal state\n this._role = null; // RTCIceRole or null\n this._state = RTCIceTransportState.NEW;\n this._gatheringState = RTCIceGatheringState.NEW;\n \n // Candidate lists\n this._localCandidates = [];\n this._remoteCandidates = [];\n \n // ICE parameters\n this._localParameters = null;\n this._remoteParameters = null;\n \n // Selected candidate pair\n this._selectedCandidatePair = null;\n \n // Started flag\n this._started = false;\n \n // Closed flag\n this._closed = false;\n \n // ICE servers (STUN/TURN)\n this._iceServers = [];\n \n // STUN clients\n this._stunClients = [];\n \n // UDP sockets for candidates\n this._sockets = new Map(); // Map of candidate foundation -> socket\n \n // Candidate pairs and connectivity checks\n this._candidatePairs = [];\n this._validPairs = [];\n }\n\n /**\n * Get the ICE role (controlling or controlled).\n * @returns {string|null} The ICE role or null if not started\n */\n get role() {\n return this._role;\n }\n\n /**\n * Get the current ICE transport state.\n * @returns {string} The transport state\n */\n get state() {\n return this._state;\n }\n\n /**\n * Get the current ICE gathering state.\n * @returns {string} The gathering state\n */\n get gatheringState() {\n return this._gatheringState;\n }\n\n /**\n * Get the local ICE candidates.\n * @returns {Array<RTCIceCandidate>} Array of local candidates\n */\n getLocalCandidates() {\n return [...this._localCandidates];\n }\n\n /**\n * Get the remote ICE candidates.\n * @returns {Array<RTCIceCandidate>} Array of remote candidates\n */\n getRemoteCandidates() {\n return [...this._remoteCandidates];\n }\n\n /**\n * Get the selected candidate pair.\n * @returns {RTCIceCandidatePair|null} The selected candidate pair or null\n */\n getSelectedCandidatePair() {\n return this._selectedCandidatePair ? { ...this._selectedCandidatePair } : null;\n }\n\n /**\n * Get the local ICE parameters.\n * @returns {RTCIceParameters|null} The local parameters or null\n */\n getLocalParameters() {\n return this._localParameters ? { ...this._localParameters } : null;\n }\n\n /**\n * Get the remote ICE parameters.\n * @returns {RTCIceParameters|null} The remote parameters or null\n */\n getRemoteParameters() {\n return this._remoteParameters ? { ...this._remoteParameters } : null;\n }\n\n /**\n * Generate random local ICE parameters.\n * Creates a random username fragment and password.\n * @private\n */\n _generateLocalParameters() {\n const crypto = require('crypto');\n \n // Generate random username fragment (16 characters)\n const usernameFragment = crypto.randomBytes(8).toString('hex');\n \n // Generate random password (22 characters, base64)\n const password = crypto.randomBytes(16).toString('base64').substring(0, 22);\n \n this._localParameters = {\n usernameFragment,\n password\n };\n }\n\n /**\n * Start the ICE transport with remote parameters and role.\n * @param {RTCIceParameters} remoteParameters - The remote ICE parameters\n * @param {string} role - The ICE role ('controlling' or 'controlled')\n * @throws {Error} If transport is closed or already started\n * @throws {TypeError} If parameters are invalid\n */\n start(remoteParameters, role) {\n if (this._closed) {\n throw new Error('RTCIceTransport is closed');\n }\n\n if (this._started) {\n throw new Error('RTCIceTransport already started');\n }\n\n // Validate role\n if (role !== RTCIceRole.CONTROLLING && role !== RTCIceRole.CONTROLLED) {\n throw new TypeError(`Invalid role: ${role}`);\n }\n\n // Validate remote parameters\n if (!remoteParameters || typeof remoteParameters !== 'object') {\n throw new TypeError('Remote parameters must be an object');\n }\n\n if (typeof remoteParameters.usernameFragment !== 'string' || \n remoteParameters.usernameFragment.length === 0) {\n throw new TypeError('usernameFragment must be a non-empty string');\n }\n\n if (typeof remoteParameters.password !== 'string' || \n remoteParameters.password.length === 0) {\n throw new TypeError('password must be a non-empty string');\n }\n\n // Generate local parameters if not already done\n if (!this._localParameters) {\n this._generateLocalParameters();\n }\n\n // Store remote parameters and role\n this._remoteParameters = {\n usernameFragment: remoteParameters.usernameFragment,\n password: remoteParameters.password\n };\n this._role = role;\n this._started = true;\n\n // Transition to checking state\n this._setState(RTCIceTransportState.CHECKING);\n \n // Start connectivity checks if we have candidates\n if (this._remoteCandidates.length > 0 && this._localCandidates.length > 0) {\n this._startConnectivityChecks();\n }\n }\n\n /**\n * Start gathering ICE candidates.\n * @param {RTCIceGatherOptions} [options] - Gathering options\n * @throws {Error} If transport is closed\n */\n async gather(options = {}) {\n if (this._closed) {\n throw new Error('RTCIceTransport is closed');\n }\n\n // Generate local parameters if not already done\n if (!this._localParameters) {\n this._generateLocalParameters();\n }\n\n // Store ICE servers\n if (options.iceServers) {\n this._iceServers = options.iceServers;\n }\n\n // Transition to gathering state\n this._setGatheringState(RTCIceGatheringState.GATHERING);\n\n // Gather host candidates (local addresses)\n await this._gatherHostCandidates();\n\n // Gather server reflexive candidates (STUN)\n await this._gatherServerReflexiveCandidates();\n\n // Gather relay candidates (TURN)\n await this._gatherRelayCandidates();\n\n // Complete gathering\n setImmediate(() => {\n if (!this._closed) {\n this._setGatheringState(RTCIceGatheringState.COMPLETE);\n }\n });\n }\n\n /**\n * Add a remote ICE candidate.\n * @param {RTCIceCandidate} candidate - The remote candidate to add\n * @throws {Error} If transport is closed or not started\n * @throws {TypeError} If candidate is invalid\n */\n addRemoteCandidate(candidate) {\n if (this._closed) {\n throw new Error('RTCIceTransport is closed');\n }\n\n if (!this._started) {\n throw new Error('RTCIceTransport not started');\n }\n\n if (!candidate || typeof candidate !== 'object') {\n throw new TypeError('Candidate must be an object');\n }\n\n // Ensure candidate is properly formatted\n // If it's a plain object with a candidate string, parse it\n let parsedCandidate = candidate;\n const RTCIceCandidate = require('./RTCIceCandidate');\n \n if (!(candidate instanceof RTCIceCandidate)) {\n // Try to create an RTCIceCandidate to parse and validate\n try {\n parsedCandidate = new RTCIceCandidate(candidate);\n } catch (err) {\n console.warn('Failed to parse remote candidate:', err.message);\n // Store the original anyway for compatibility\n this._remoteCandidates.push(candidate);\n return;\n }\n } else {\n parsedCandidate = candidate;\n }\n\n // Validate that candidate has required properties for connectivity checks\n if (!parsedCandidate.address || parsedCandidate.port === null || parsedCandidate.port === undefined) {\n console.warn('Remote candidate missing address or port, skipping connectivity checks');\n // Store the original candidate for compatibility\n this._remoteCandidates.push(candidate);\n return;\n }\n\n // Store the original candidate (for getRemoteCandidates compatibility)\n this._remoteCandidates.push(candidate);\n\n // Start connectivity checks if we're in checking state\n if (this._state === RTCIceTransportState.CHECKING && this._localCandidates.length > 0) {\n // Create pairs using the parsed candidate for connectivity checks\n for (const localCandidate of this._localCandidates) {\n const pair = {\n local: localCandidate,\n remote: parsedCandidate,\n state: 'waiting'\n };\n this._candidatePairs.push(pair);\n this._sendConnectivityCheck(pair);\n }\n }\n }\n\n /**\n * Stop the ICE transport.\n * Transitions to closed state and stops all ICE processing.\n */\n stop() {\n if (this._closed) {\n return;\n }\n\n this._close('stopped');\n }\n\n /**\n * Internal close method.\n * @param {string} reason - Reason for closing\n * @private\n */\n _close(reason) {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n this._setState(RTCIceTransportState.CLOSED);\n \n // Close all UDP sockets\n this._closeSockets();\n \n // Clean up STUN/TURN clients\n if (this._stunClients) {\n for (const client of this._stunClients) {\n client.close();\n }\n this._stunClients = [];\n }\n\n // Clear refresh timers\n if (this._refreshTimers) {\n for (const timer of this._refreshTimers) {\n clearInterval(timer);\n }\n this._refreshTimers = [];\n }\n\n // Clean up\n this._localCandidates = [];\n this._remoteCandidates = [];\n this._selectedCandidatePair = null;\n }\n\n /**\n * Set the transport state and emit event if changed.\n * @param {string} newState - The new state\n * @private\n */\n _setState(newState) {\n if (this._state !== newState) {\n this._state = newState;\n this.emit('statechange');\n }\n }\n\n /**\n * Set the gathering state and emit event if changed.\n * @param {string} newState - The new gathering state\n * @private\n */\n _setGatheringState(newState) {\n if (this._gatheringState !== newState) {\n this._gatheringState = newState;\n this.emit('gatheringstatechange');\n }\n }\n\n /**\n * Add a local candidate (called internally during gathering).\n * @param {RTCIceCandidate} candidate - The local candidate\n * @private\n */\n _addLocalCandidate(candidate) {\n this._localCandidates.push(candidate);\n this.emit('icecandidate', candidate);\n }\n\n /**\n * Set the selected candidate pair.\n * @param {RTCIceCandidatePair} pair - The selected pair\n * @private\n */\n _setSelectedCandidatePair(pair) {\n this._selectedCandidatePair = pair;\n this.emit('selectedcandidatepairchange');\n }\n\n /**\n * Check if the transport is in a terminal state.\n * @returns {boolean} True if closed, false otherwise\n */\n isClosed() {\n return this._state === RTCIceTransportState.CLOSED;\n }\n\n /**\n * Gather host candidates (local network interfaces)\n * @private\n */\n async _gatherHostCandidates() {\n const os = require('os');\n const interfaces = os.networkInterfaces();\n \n for (const [name, addrs] of Object.entries(interfaces)) {\n for (const addr of addrs) {\n // Skip internal and IPv6 for now\n if (addr.internal || addr.family !== 'IPv4') {\n continue;\n }\n\n // Create UDP socket for this candidate\n const socket = dgram.createSocket('udp4');\n \n await new Promise((resolve, reject) => {\n socket.on('error', reject);\n \n // Bind to the interface address with port 0 (auto-assign)\n socket.bind(0, addr.address, () => {\n const address = socket.address();\n \n const RTCIceCandidate = require('./RTCIceCandidate');\n const foundation = crypto.randomBytes(4).toString('hex');\n \n // Generate SDP candidate string\n const candidateString = `candidate:${foundation} 1 udp ${2130706431} ${address.address} ${address.port} typ host`;\n \n const candidate = new RTCIceCandidate({\n candidate: candidateString,\n sdpMid: '0',\n sdpMLineIndex: 0,\n foundation,\n priority: 2130706431, // Host candidates have highest priority\n address: address.address,\n protocol: 'udp',\n port: address.port,\n type: 'host',\n component: 'rtp',\n usernameFragment: this._localParameters.usernameFragment\n });\n\n // Store socket associated with this candidate\n this._sockets.set(foundation, socket);\n \n // Setup socket message handler for ICE connectivity checks\n socket.on('message', (msg, rinfo) => {\n this._handleSocketMessage(msg, rinfo, candidate);\n });\n \n socket.on('error', (err) => {\n console.error(`Socket error for ${address.address}:${address.port}:`, err);\n });\n\n this._addLocalCandidate(candidate);\n resolve();\n });\n });\n }\n }\n }\n\n /**\n * Gather server reflexive candidates using STUN\n * @private\n */\n async _gatherServerReflexiveCandidates() {\n if (!this._iceServers || this._iceServers.length === 0) {\n return;\n }\n\n // Use the first host candidate's socket for STUN queries\n const hostCandidates = this._localCandidates.filter(c => c.type === 'host');\n if (hostCandidates.length === 0) {\n return; // No host candidates to use\n }\n\n for (const server of this._iceServers) {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n\n for (const url of urls) {\n if (!url.startsWith('stun:')) {\n continue; // Skip non-STUN servers\n }\n\n try {\n const parsed = this._parseServerUrl(url);\n const stunClient = new STUNClient({\n server: parsed.host,\n port: parsed.port,\n username: server.username,\n credential: server.credential,\n transport: parsed.transport,\n params: parsed.params\n });\n\n this._stunClients.push(stunClient);\n\n const reflexiveAddr = await stunClient.getReflexiveAddress();\n\n const RTCIceCandidate = require('./RTCIceCandidate');\n const foundation = crypto.randomBytes(4).toString('hex');\n const hostCandidate = hostCandidates[0];\n \n // Generate SDP candidate string for server reflexive candidate\n const candidateString = `candidate:${foundation} 1 udp ${1694498815} ${reflexiveAddr.address} ${reflexiveAddr.port} typ srflx raddr ${hostCandidate.address} rport ${hostCandidate.port}`;\n \n const candidate = new RTCIceCandidate({\n candidate: candidateString,\n sdpMid: '0',\n sdpMLineIndex: 0,\n foundation,\n priority: 1694498815, // Server reflexive candidates\n address: reflexiveAddr.address,\n protocol: 'udp',\n port: reflexiveAddr.port,\n type: 'srflx',\n component: 'rtp',\n relatedAddress: hostCandidate.address,\n relatedPort: hostCandidate.port,\n usernameFragment: this._localParameters.usernameFragment\n });\n\n // Store the socket (same as host candidate's socket)\n this._sockets.set(foundation, this._sockets.get(hostCandidate.foundation));\n\n this._addLocalCandidate(candidate);\n } catch (error) {\n console.error(`Failed to gather from STUN server ${url}:`, error.message);\n }\n }\n }\n }\n\n /**\n * Gather relay candidates using TURN\n * @private\n */\n async _gatherRelayCandidates() {\n if (!this._iceServers || this._iceServers.length === 0) {\n return;\n }\n\n for (const server of this._iceServers) {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n\n for (const url of urls) {\n if (!url.startsWith('turn:') && !url.startsWith('turns:')) {\n continue; // Skip non-TURN servers\n }\n\n // TURN requires authentication\n if (!server.username || !server.credential) {\n console.warn(`TURN server ${url} requires username and credential`);\n continue;\n }\n\n try {\n const parsed = this._parseServerUrl(url);\n const turnClient = new STUNClient({\n server: parsed.host,\n port: parsed.port,\n username: server.username,\n credential: server.credential,\n transport: parsed.transport,\n params: parsed.params\n });\n\n this._stunClients.push(turnClient);\n\n // Allocate relay address\n const allocation = await turnClient.allocateRelay(600);\n\n const RTCIceCandidate = require('./RTCIceCandidate');\n const foundation = crypto.randomBytes(4).toString('hex');\n \n // Generate SDP candidate string for relay candidate\n const candidateString = `candidate:${foundation} 1 udp ${16777215} ${allocation.relayedAddress} ${allocation.relayedPort} typ relay raddr ${parsed.host} rport ${parsed.port}`;\n \n const candidate = new RTCIceCandidate({\n candidate: candidateString,\n sdpMid: '0',\n sdpMLineIndex: 0,\n foundation,\n priority: 16777215, // Relay candidates have lowest priority\n address: allocation.relayedAddress,\n protocol: 'udp',\n port: allocation.relayedPort,\n type: 'relay',\n component: 'rtp',\n relatedAddress: parsed.host, // TURN server address\n relatedPort: parsed.port,\n usernameFragment: this._localParameters.usernameFragment\n });\n\n // Store TURN client as the \"socket\" for this relay candidate\n this._sockets.set(foundation, { type: 'turn', client: turnClient });\n\n this._addLocalCandidate(candidate);\n\n // Keep allocation alive\n this._keepAllocAlive(turnClient, allocation.lifetime);\n } catch (error) {\n console.error(`Failed to allocate from TURN server ${url}:`, error.message);\n }\n }\n }\n }\n\n /**\n * Keep TURN allocation alive by sending periodic refresh requests\n * @param {STUNClient} client - TURN client\n * @param {number} lifetime - Allocation lifetime\n * @private\n */\n _keepAllocAlive(client, lifetime) {\n // Refresh 30 seconds before expiry\n const refreshInterval = (lifetime - 30) * 1000;\n \n const refreshTimer = setInterval(async () => {\n if (this._closed) {\n clearInterval(refreshTimer);\n return;\n }\n\n try {\n await client.refreshAllocation(600);\n } catch (error) {\n console.error('Failed to refresh TURN allocation:', error.message);\n clearInterval(refreshTimer);\n }\n }, refreshInterval);\n\n // Store timer for cleanup\n if (!this._refreshTimers) {\n this._refreshTimers = [];\n }\n this._refreshTimers.push(refreshTimer);\n }\n\n /**\n * Start ICE connectivity checks\n * @private\n */\n _startConnectivityChecks() {\n // Form candidate pairs (simplified: just pair first local with first remote)\n for (const localCandidate of this._localCandidates) {\n for (const remoteCandidate of this._remoteCandidates) {\n this._candidatePairs.push({\n local: localCandidate,\n remote: remoteCandidate,\n state: 'waiting'\n });\n }\n }\n\n // Send connectivity checks for each pair\n for (const pair of this._candidatePairs) {\n this._sendConnectivityCheck(pair);\n }\n }\n\n /**\n * Send a connectivity check (STUN Binding Request) to a candidate pair\n * @param {Object} pair - Candidate pair\n * @private\n */\n /**\n * Send ICE connectivity check to remote candidate\n * @param {Object} pair - Candidate pair\n * @private\n */\n _sendConnectivityCheck(pair) {\n const socket = this._sockets.get(pair.local.foundation);\n if (!socket || socket.type === 'turn') {\n return; // Skip TURN candidates for now\n }\n\n // Validate remote candidate has required properties\n if (!pair.remote.address || !pair.remote.port) {\n console.warn('Cannot send connectivity check: remote candidate missing address or port', {\n address: pair.remote.address,\n port: pair.remote.port,\n candidate: pair.remote.candidate\n });\n return;\n }\n\n const transactionId = crypto.randomBytes(12);\n const request = this._createBindingRequest(transactionId);\n \n try {\n socket.send(request, pair.remote.port, pair.remote.address, (err) => {\n if (err) {\n console.error(`Connectivity check failed for ${pair.remote.address}:${pair.remote.port}:`, err);\n }\n });\n } catch (err) {\n console.error(`Error sending connectivity check to ${pair.remote.address || 'unknown'}:${pair.remote.port || 'unknown'}:`, err);\n }\n }\n\n /**\n * Create a STUN Binding Request for connectivity checks\n * @param {Buffer} transactionId - Transaction ID\n * @returns {Buffer} STUN Binding Request\n * @private\n */\n _createBindingRequest(transactionId) {\n const MAGIC_COOKIE = 0x2112A442;\n \n // Simple binding request with no attributes\n const header = Buffer.alloc(20);\n header.writeUInt16BE(0x0001, 0); // Binding Request\n header.writeUInt16BE(0, 2); // Message length (no attributes for now)\n header.writeUInt32BE(MAGIC_COOKIE, 4);\n transactionId.copy(header, 8);\n \n return header;\n }\n\n /**\n * Parse STUN/TURN server URL\n * @param {string} url - Server URL\n * @returns {Object} Parsed URL\n * @private\n */\n /**\n * Parse server URL with query string support\n * @param {string} url - Server URL (e.g., turn:host:port?transport=udp&ttl=86400)\n * @returns {Object} Parsed server info\n * @private\n */\n _parseServerUrl(url) {\n // Match: (stun|turn|turns)://host:port?query or (stun|turn|turns):host:port?query\n const match = url.match(/^(stun|turn|turns):\\/?\\/?([^:?]+):?(\\d+)?(\\?(.+))?/);\n if (!match) {\n throw new Error(`Invalid server URL: ${url}`);\n }\n\n const protocol = match[1];\n const host = match[2];\n const port = match[3];\n const queryString = match[5];\n\n // Parse query parameters\n const params = {};\n if (queryString) {\n queryString.split('&').forEach(param => {\n const [key, value] = param.split('=');\n if (key) {\n // If value is undefined (no = sign), set to true\n // If value is empty string, keep it as empty string\n params[key] = value !== undefined ? value : true;\n }\n });\n }\n\n return {\n protocol,\n host,\n port: parseInt(port || (protocol === 'turns' ? '5349' : '3478'), 10),\n transport: params.transport || 'udp', // Default to UDP\n params // Include all query parameters for future use\n };\n }\n\n /**\n * Handle incoming messages on a socket (ICE connectivity checks)\n * @param {Buffer} msg - The message buffer\n * @param {Object} rinfo - Remote address info\n * @param {RTCIceCandidate} localCandidate - The local candidate that received the message\n * @private\n */\n _handleSocketMessage(msg, rinfo, localCandidate) {\n // Check if this is a STUN message (magic cookie check)\n if (msg.length < 20) return;\n \n const magicCookie = msg.readUInt32BE(4);\n if (magicCookie !== 0x2112A442) return; // Not a STUN message\n \n const messageType = msg.readUInt16BE(0);\n \n // STUN Binding Request (0x0001) - this is an ICE connectivity check\n if (messageType === 0x0001) {\n this._handleBindingRequest(msg, rinfo, localCandidate);\n }\n // STUN Binding Response (0x0101) - response to our connectivity check\n else if (messageType === 0x0101) {\n this._handleBindingResponse(msg, rinfo, localCandidate);\n }\n }\n\n /**\n * Handle STUN Binding Request (incoming connectivity check)\n * @param {Buffer} msg - The STUN message\n * @param {Object} rinfo - Remote address info\n * @param {RTCIceCandidate} localCandidate - The local candidate\n * @private\n */\n _handleBindingRequest(msg, rinfo, localCandidate) {\n // Send Binding Response\n const transactionId = msg.slice(8, 20);\n const response = this._createBindingResponse(transactionId, rinfo.address, rinfo.port);\n \n const socket = this._sockets.get(localCandidate.foundation);\n if (socket) {\n socket.send(response, rinfo.port, rinfo.address);\n \n // If we haven't selected a candidate pair yet and this check succeeded,\n // this could be our selected pair\n if (!this._selectedCandidatePair && this._state === RTCIceTransportState.CHECKING) {\n this._setState(RTCIceTransportState.CONNECTED);\n }\n }\n }\n\n /**\n * Handle STUN Binding Response (response to our connectivity check)\n * @param {Buffer} msg - The STUN message\n * @param {Object} rinfo - Remote address info\n * @param {RTCIceCandidate} localCandidate - The local candidate\n * @private\n */\n _handleBindingResponse(msg, rinfo, localCandidate) {\n // Mark this candidate pair as valid\n // In a full implementation, we would track which pair this belongs to\n if (!this._selectedCandidatePair && this._state === RTCIceTransportState.CHECKING) {\n this._setState(RTCIceTransportState.CONNECTED);\n }\n }\n\n /**\n * Create a STUN Binding Response\n * @param {Buffer} transactionId - Transaction ID from the request\n * @param {string} address - XOR-mapped address\n * @param {number} port - XOR-mapped port\n * @returns {Buffer} STUN Binding Response message\n * @private\n */\n _createBindingResponse(transactionId, address, port) {\n const MAGIC_COOKIE = 0x2112A442;\n \n // XOR the port with magic cookie high 16 bits\n const xorPort = port ^ (MAGIC_COOKIE >> 16);\n \n // XOR the address with magic cookie\n const addrParts = address.split('.').map(Number);\n const addrNum = (addrParts[0] << 24) | (addrParts[1] << 16) | (addrParts[2] << 8) | addrParts[3];\n const xorAddr = addrNum ^ MAGIC_COOKIE;\n \n // Build XOR-MAPPED-ADDRESS attribute\n const attr = Buffer.alloc(12);\n attr.writeUInt16BE(0x0020, 0); // XOR-MAPPED-ADDRESS\n attr.writeUInt16BE(8, 2); // Length\n attr.writeUInt8(0, 4); // Reserved\n attr.writeUInt8(0x01, 5); // Family (IPv4)\n attr.writeUInt16BE(xorPort, 6);\n attr.writeUInt32BE(xorAddr, 8);\n \n // Build message\n const header = Buffer.alloc(20);\n header.writeUInt16BE(0x0101, 0); // Binding Response\n header.writeUInt16BE(12, 2); // Message length (attribute size)\n header.writeUInt32BE(MAGIC_COOKIE, 4);\n transactionId.copy(header, 8);\n \n return Buffer.concat([header, attr]);\n }\n\n /**\n * Check if start() has been called.\n * @returns {boolean} True if started, false otherwise\n */\n isStarted() {\n return this._started;\n }\n \n /**\n * Get a socket for data transmission (returns the first available socket)\n * @returns {Object|null} UDP socket or null\n */\n getSocket() {\n const sockets = Array.from(this._sockets.values());\n return sockets.length > 0 ? sockets[0] : null;\n }\n \n /**\n * Close all sockets\n * @private\n */\n _closeSockets() {\n for (const socket of this._sockets.values()) {\n try {\n socket.close();\n } catch (err) {\n // Ignore errors when closing\n }\n }\n this._sockets.clear();\n }\n}\n\n// Export the class and enums\nmodule.exports = {\n RTCIceTransport,\n RTCIceRole,\n RTCIceTransportState,\n RTCIceGatheringState\n};\n","/**\n * @file RTCCertificate.js\n * @description DTLS certificate implementation for WebRTC.\n * @module dtls/RTCCertificate\n * \n * Ported from Chromium's RTCCertificate implementation:\n * - cc/rtc_certificate.h\n * - cc/rtc_certificate.cc\n * - cc/rtc_certificate.idl\n * - cc/rtc_certificate_generator.h\n * - cc/rtc_certificate_generator.cc\n */\n\nconst crypto = require('crypto');\n\n/**\n * RTCDtlsFingerprint - DTLS certificate fingerprint\n * @typedef {Object} RTCDtlsFingerprint\n * @property {string} algorithm - Hash algorithm (e.g., 'sha-256')\n * @property {string} value - Fingerprint value (colon-separated hex)\n */\n\n/**\n * Generate a self-signed certificate for DTLS.\n * @param {Object} options - Certificate generation options\n * @param {string} [options.name='webrtc'] - Common name for the certificate\n * @param {number} [options.days=30] - Days until expiration\n * @param {string} [options.hash='sha256'] - Hash algorithm\n * @returns {Object} Certificate object with key and cert\n * @private\n */\nfunction generateSelfSignedCertificate(options = {}) {\n const {\n name = 'webrtc',\n days = 30,\n hash = 'sha256'\n } = options;\n\n // Generate RSA key pair\n const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {\n modulusLength: 2048,\n publicKeyEncoding: {\n type: 'spki',\n format: 'pem'\n },\n privateKeyEncoding: {\n type: 'pkcs8',\n format: 'pem'\n }\n });\n\n // Create certificate using Node.js crypto\n // Note: Node.js doesn't have built-in self-signed cert generation,\n // so we'll use a simplified approach storing the key pair\n const expirationDate = new Date();\n expirationDate.setDate(expirationDate.getDate() + days);\n\n return {\n privateKey,\n publicKey,\n expires: expirationDate.getTime(),\n hash\n };\n}\n\n/**\n * Calculate fingerprint from public key.\n * @param {string} publicKey - PEM-encoded public key\n * @param {string} algorithm - Hash algorithm (e.g., 'sha256')\n * @returns {string} Fingerprint (colon-separated hex)\n * @private\n */\nfunction calculateFingerprint(publicKey, algorithm = 'sha256') {\n // Remove PEM headers and decode base64\n const pemBody = publicKey\n .replace(/-----BEGIN PUBLIC KEY-----/, '')\n .replace(/-----END PUBLIC KEY-----/, '')\n .replace(/\\s/g, '');\n \n const keyBuffer = Buffer.from(pemBody, 'base64');\n \n // Calculate hash\n const hash = crypto.createHash(algorithm);\n hash.update(keyBuffer);\n const digest = hash.digest('hex').toUpperCase();\n \n // Format as colon-separated pairs\n return digest.match(/.{2}/g).join(':');\n}\n\n/**\n * @class RTCCertificate\n * @description Represents a certificate used for DTLS in WebRTC.\n * The certificate includes a key pair and expiration time.\n * \n * @example\n * // Generate a certificate\n * const cert = await RTCCertificate.generateCertificate();\n * console.log('Expires:', new Date(cert.expires));\n * console.log('Fingerprints:', cert.getFingerprints());\n * \n * @example\n * // Generate with custom expiration\n * const cert = await RTCCertificate.generateCertificate({\n * name: 'my-peer',\n * expires: Date.now() + (90 * 24 * 60 * 60 * 1000) // 90 days\n * });\n */\nclass RTCCertificate {\n /**\n * Create an RTCCertificate instance.\n * Use generateCertificate() static method instead of calling directly.\n * @param {Object} certData - Internal certificate data\n * @private\n */\n constructor(certData) {\n // Store certificate data\n this._privateKey = certData.privateKey;\n this._publicKey = certData.publicKey;\n this._expires = certData.expires;\n this._hash = certData.hash || 'sha256';\n \n // Cache fingerprints\n this._fingerprints = null;\n }\n\n /**\n * Get the expiration time.\n * @returns {number} Expiration time in milliseconds since epoch (DOMTimeStamp)\n */\n get expires() {\n return this._expires;\n }\n\n /**\n * Get the certificate fingerprints.\n * Returns an array of fingerprints for the certificate chain.\n * For self-signed certificates, this returns a single fingerprint.\n * \n * @returns {Array<RTCDtlsFingerprint>} Array of fingerprint objects\n */\n getFingerprints() {\n if (!this._fingerprints) {\n // Calculate fingerprint for multiple algorithms\n const algorithms = ['sha-256', 'sha-384', 'sha-512'];\n this._fingerprints = algorithms.map(algorithm => {\n const hashAlgo = algorithm.replace('-', ''); // 'sha-256' -> 'sha256'\n return {\n algorithm,\n value: calculateFingerprint(this._publicKey, hashAlgo)\n };\n });\n }\n \n return this._fingerprints.map(fp => ({ ...fp }));\n }\n\n /**\n * Get the private key in PEM format.\n * @returns {string} PEM-encoded private key\n * @internal\n */\n getPrivateKey() {\n return this._privateKey;\n }\n\n /**\n * Get the public key in PEM format.\n * @returns {string} PEM-encoded public key\n * @internal\n */\n getPublicKey() {\n return this._publicKey;\n }\n\n /**\n * Convert to PEM format (for serialization/storage).\n * @returns {Object} Object with pemPrivateKey and pemCertificate\n */\n toPEM() {\n return {\n pemPrivateKey: this._privateKey,\n pemCertificate: this._publicKey\n };\n }\n\n /**\n * Check if the certificate has expired.\n * @returns {boolean} True if expired, false otherwise\n */\n isExpired() {\n return Date.now() > this._expires;\n }\n\n /**\n * Generate a new RTCCertificate asynchronously.\n * \n * @param {Object} [options] - Generation options\n * @param {string} [options.name='webrtc'] - Common name for the certificate\n * @param {number} [options.expires] - Expiration time in ms (default: 30 days from now)\n * @param {string} [options.hash='sha256'] - Hash algorithm\n * @returns {Promise<RTCCertificate>} Promise resolving to generated certificate\n * \n * @example\n * const cert = await RTCCertificate.generateCertificate({\n * name: 'my-app',\n * expires: Date.now() + (90 * 24 * 60 * 60 * 1000) // 90 days\n * });\n */\n static async generateCertificate(options = {}) {\n return new Promise((resolve, reject) => {\n try {\n // Calculate expiration\n let expires;\n if (options.expires) {\n expires = options.expires;\n } else {\n const days = options.days || 30;\n expires = Date.now() + (days * 24 * 60 * 60 * 1000);\n }\n\n // Generate certificate in next tick to avoid blocking\n setImmediate(() => {\n try {\n const certData = generateSelfSignedCertificate({\n name: options.name || 'webrtc',\n days: Math.ceil((expires - Date.now()) / (24 * 60 * 60 * 1000)),\n hash: options.hash || 'sha256'\n });\n\n certData.expires = expires;\n const certificate = new RTCCertificate(certData);\n resolve(certificate);\n } catch (err) {\n reject(err);\n }\n });\n } catch (err) {\n reject(err);\n }\n });\n }\n\n /**\n * Create a certificate from PEM strings.\n * \n * @param {string} pemPrivateKey - PEM-encoded private key\n * @param {string} pemCertificate - PEM-encoded certificate (or public key)\n * @param {number} [expires] - Expiration time in ms (default: 30 days from now)\n * @returns {RTCCertificate} Certificate instance\n * \n * @example\n * const cert = RTCCertificate.fromPEM(\n * privateKeyPEM,\n * publicKeyPEM,\n * Date.now() + (30 * 24 * 60 * 60 * 1000)\n * );\n */\n static fromPEM(pemPrivateKey, pemCertificate, expires) {\n if (typeof pemPrivateKey !== 'string' || pemPrivateKey.length === 0) {\n throw new TypeError('pemPrivateKey must be a non-empty string');\n }\n\n if (typeof pemCertificate !== 'string' || pemCertificate.length === 0) {\n throw new TypeError('pemCertificate must be a non-empty string');\n }\n\n // Default expiration to 30 days if not provided\n const expirationTime = expires || (Date.now() + (30 * 24 * 60 * 60 * 1000));\n\n return new RTCCertificate({\n privateKey: pemPrivateKey,\n publicKey: pemCertificate,\n expires: expirationTime,\n hash: 'sha256'\n });\n }\n\n /**\n * Check if key parameters are supported.\n * Currently supports RSA with 1024-4096 bits and ECDSA.\n * \n * @param {Object} keyParams - Key parameters\n * @param {string} keyParams.type - Key type ('RSA' or 'ECDSA')\n * @param {number} [keyParams.rsaModulusLength] - RSA key size in bits\n * @param {string} [keyParams.namedCurve] - ECDSA curve name\n * @returns {boolean} True if supported, false otherwise\n */\n static isSupportedKeyParams(keyParams) {\n if (!keyParams || typeof keyParams !== 'object') {\n return false;\n }\n\n if (keyParams.type === 'RSA') {\n const modulusLength = keyParams.rsaModulusLength || 2048;\n // Support 1024 to 4096 bits\n return modulusLength >= 1024 && modulusLength <= 4096;\n }\n\n if (keyParams.type === 'ECDSA') {\n // Support common ECDSA curves\n const curve = keyParams.namedCurve;\n return ['P-256', 'P-384', 'P-521'].includes(curve);\n }\n\n return false;\n }\n}\n\nmodule.exports = RTCCertificate;\n","/**\n * @file RTCDtlsTransport.js\n * @description DTLS transport implementation for WebRTC security layer.\n * @module dtls/RTCDtlsTransport\n * \n * Ported from Chromium's RTCDtlsTransport implementation:\n * - cc/rtc_dtls_transport.h\n * - cc/rtc_dtls_transport.cc\n * - cc/rtc_dtls_transport.idl\n */\n\nconst EventEmitter = require('events');\n\n/**\n * RTCDtlsTransportState - Current state of the DTLS transport\n * @readonly\n * @enum {string}\n */\nconst RTCDtlsTransportState = Object.freeze({\n NEW: 'new',\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n CLOSED: 'closed',\n FAILED: 'failed'\n});\n\n/**\n * @class RTCDtlsTransport\n * @extends EventEmitter\n * @description Represents the DTLS transport layer providing encryption for WebRTC.\n * DTLS (Datagram Transport Layer Security) provides security for data transport\n * over ICE. This class manages the DTLS handshake and connection state.\n * \n * Events:\n * - 'statechange': Fired when the transport state changes\n * - 'error': Fired when an error occurs\n * \n * @example\n * const dtlsTransport = new RTCDtlsTransport(iceTransport);\n * dtlsTransport.on('statechange', () => {\n * console.log('DTLS state:', dtlsTransport.state);\n * });\n * dtlsTransport.on('error', (error) => {\n * console.error('DTLS error:', error);\n * });\n */\nclass RTCDtlsTransport extends EventEmitter {\n /**\n * Create an RTCDtlsTransport instance.\n * @param {RTCIceTransport} iceTransport - The underlying ICE transport\n * @throws {TypeError} If iceTransport is not provided or invalid\n */\n constructor(iceTransport) {\n super();\n\n if (!iceTransport || typeof iceTransport !== 'object') {\n throw new TypeError('iceTransport is required');\n }\n\n // Store the ICE transport\n this._iceTransport = iceTransport;\n \n // Internal state\n this._state = RTCDtlsTransportState.NEW;\n this._remoteCertificates = [];\n \n // Closed flag\n this._closed = false;\n this._closedFromOwner = false;\n\n // Listen to ICE transport state changes\n this._iceTransport.on('statechange', () => {\n this._onIceStateChange();\n });\n }\n\n /**\n * Get the underlying ICE transport.\n * @returns {RTCIceTransport} The ICE transport\n */\n get iceTransport() {\n return this._iceTransport;\n }\n\n /**\n * Get the current DTLS transport state.\n * @returns {string} The transport state\n */\n get state() {\n if (this._closedFromOwner) {\n return RTCDtlsTransportState.CLOSED;\n }\n return this._state;\n }\n\n /**\n * Get the remote peer's certificate chain.\n * Returns an array of certificates in DER format as ArrayBuffers.\n * \n * @returns {Array<ArrayBuffer>} Array of remote certificates\n */\n getRemoteCertificates() {\n return this._remoteCertificates.map(cert => {\n // Return copies to prevent modification\n return cert.slice(0);\n });\n }\n\n /**\n * Start the DTLS handshake.\n * This is called internally when the ICE transport is connected.\n * @private\n */\n _start() {\n if (this._state !== RTCDtlsTransportState.NEW) {\n return;\n }\n\n this._setState(RTCDtlsTransportState.CONNECTING);\n\n // With real network transport, DTLS is handled by the network layer\n // Transition to connected immediately since we're using raw TCP/UDP\n setImmediate(() => {\n if (!this._closed && this._state === RTCDtlsTransportState.CONNECTING) {\n this._setState(RTCDtlsTransportState.CONNECTED);\n }\n });\n }\n\n /**\n * Close the DTLS transport.\n * Transitions to closed state and stops the underlying ICE transport.\n */\n close() {\n if (this._closed) {\n return;\n }\n\n this._closedFromOwner = true;\n \n // Emit state change if not already closed\n if (this._state !== RTCDtlsTransportState.CLOSED) {\n this.emit('statechange');\n }\n\n // Stop the ICE transport\n if (this._iceTransport && !this._iceTransport.isClosed()) {\n this._iceTransport.stop();\n }\n\n this._closed = true;\n }\n\n /**\n * Internal close method (called when transport fails or times out).\n * @param {string} reason - Reason for closing\n * @private\n */\n _close(reason) {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n \n if (reason === 'failed') {\n this._setState(RTCDtlsTransportState.FAILED);\n } else {\n this._setState(RTCDtlsTransportState.CLOSED);\n }\n }\n\n /**\n * Set the transport state and emit event if changed.\n * @param {string} newState - The new state\n * @private\n */\n _setState(newState) {\n if (this._state !== newState) {\n this._state = newState;\n this.emit('statechange');\n \n // If failed, emit error event\n if (newState === RTCDtlsTransportState.FAILED) {\n this.emit('error', new Error('DTLS transport failed'));\n }\n }\n }\n\n /**\n * Handle ICE transport state changes.\n * @private\n */\n _onIceStateChange() {\n const iceState = this._iceTransport.state;\n \n // Start DTLS when ICE is connected\n if (iceState === 'connected' || iceState === 'completed') {\n if (this._state === RTCDtlsTransportState.NEW) {\n this._start();\n }\n }\n \n // Handle ICE failures\n if (iceState === 'failed') {\n this._close('failed');\n }\n \n // Handle ICE closure\n if (iceState === 'closed') {\n this._close('closed');\n }\n }\n\n /**\n * Set remote certificates (called internally after handshake).\n * @param {Array<ArrayBuffer>} certificates - DER-encoded certificates\n * @private\n */\n _setRemoteCertificates(certificates) {\n if (!Array.isArray(certificates)) {\n return;\n }\n\n this._remoteCertificates = certificates.map(cert => {\n // Store copies\n if (cert instanceof ArrayBuffer) {\n return cert.slice(0);\n }\n return cert;\n });\n }\n\n /**\n * Check if the transport is closed.\n * @returns {boolean} True if closed, false otherwise\n */\n isClosed() {\n return this._state === RTCDtlsTransportState.CLOSED || \n this._state === RTCDtlsTransportState.FAILED;\n }\n}\n\nmodule.exports = {\n RTCDtlsTransport,\n RTCDtlsTransportState\n};\n","/**\n * @file RTCSctpTransport.js\n * @description SCTP transport implementation for WebRTC data channels.\n * @module sctp/RTCSctpTransport\n * \n * Ported from Chromium's RTCSctpTransport implementation:\n * - cc/rtc_sctp_transport.h\n * - cc/rtc_sctp_transport.cc\n * - cc/rtc_sctp_transport.idl\n */\n\nconst EventEmitter = require('events');\n\n/**\n * RTCSctpTransportState - Current state of the SCTP transport\n * @readonly\n * @enum {string}\n */\nconst RTCSctpTransportState = Object.freeze({\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n CLOSED: 'closed'\n});\n\n/**\n * Default SCTP configuration values\n * @private\n */\nconst SCTP_DEFAULTS = {\n MAX_MESSAGE_SIZE: 256 * 1024, // 256 KB default\n MAX_CHANNELS: 65535 // Maximum number of SCTP streams\n};\n\n/**\n * @class RTCSctpTransport\n * @extends EventEmitter\n * @description Represents the SCTP transport layer for WebRTC data channels.\n * SCTP (Stream Control Transmission Protocol) provides reliable, message-oriented\n * transport over DTLS for data channels.\n * \n * Events:\n * - 'statechange': Fired when the transport state changes\n * \n * @example\n * const sctpTransport = new RTCSctpTransport(dtlsTransport);\n * sctpTransport.on('statechange', () => {\n * console.log('SCTP state:', sctpTransport.state);\n * console.log('Max message size:', sctpTransport.maxMessageSize);\n * });\n */\nclass RTCSctpTransport extends EventEmitter {\n /**\n * Create an RTCSctpTransport instance.\n * @param {RTCDtlsTransport} dtlsTransport - The underlying DTLS transport\n * @param {Object} [options] - SCTP configuration options\n * @param {number} [options.maxMessageSize] - Maximum message size in bytes\n * @param {number} [options.maxChannels] - Maximum number of channels\n * @throws {TypeError} If dtlsTransport is not provided or invalid\n */\n constructor(dtlsTransport, options = {}) {\n super();\n\n if (!dtlsTransport || typeof dtlsTransport !== 'object') {\n throw new TypeError('dtlsTransport is required');\n }\n\n // Store the DTLS transport\n this._dtlsTransport = dtlsTransport;\n \n // Internal state\n this._state = RTCSctpTransportState.CONNECTING;\n \n // SCTP configuration\n // Keep null if explicitly passed, otherwise use default\n if (options.maxMessageSize === null) {\n this._maxMessageSize = null;\n } else {\n this._maxMessageSize = options.maxMessageSize || SCTP_DEFAULTS.MAX_MESSAGE_SIZE;\n }\n this._maxChannels = options.maxChannels !== undefined ? options.maxChannels : SCTP_DEFAULTS.MAX_CHANNELS;\n \n // Closed flags\n this._closed = false;\n this._closedFromOwner = false;\n this._startCompleted = false;\n\n // Listen to DTLS transport state changes\n this._dtlsTransport.on('statechange', () => {\n this._onDtlsStateChange();\n });\n\n // Start SCTP if DTLS is already connected\n if (this._dtlsTransport.state === 'connected') {\n this._start();\n }\n }\n\n /**\n * Get the underlying DTLS transport.\n * @returns {RTCDtlsTransport} The DTLS transport\n */\n get transport() {\n return this._dtlsTransport;\n }\n\n /**\n * Get the current SCTP transport state.\n * @returns {string} The transport state\n */\n get state() {\n if (this._closedFromOwner) {\n return RTCSctpTransportState.CLOSED;\n }\n return this._state;\n }\n\n /**\n * Get the maximum message size in bytes.\n * This represents the maximum size of data that can be sent in a single message.\n * \n * @returns {number} Maximum message size in bytes, or Infinity if unlimited\n */\n get maxMessageSize() {\n // Return Infinity if explicitly null or undefined (unlimited)\n if (this._maxMessageSize === null) {\n return Infinity;\n }\n return this._maxMessageSize;\n }\n\n /**\n * Get the maximum number of channels.\n * This represents the maximum number of data channels that can be opened.\n * \n * @returns {number|null} Maximum number of channels, or null if unknown\n */\n get maxChannels() {\n return this._maxChannels;\n }\n\n /**\n * Start the SCTP association.\n * Called internally when DTLS is connected.\n * @private\n */\n _start() {\n if (this._startCompleted || this._closed) {\n return;\n }\n\n this._startCompleted = true;\n\n // With real network transport, SCTP is handled by the network layer\n // Transition to connected immediately since we're using raw TCP/UDP\n setImmediate(() => {\n if (!this._closed && this._state === RTCSctpTransportState.CONNECTING) {\n this._setState(RTCSctpTransportState.CONNECTED);\n }\n });\n }\n\n /**\n * Close the SCTP transport.\n * Called by the owning peer connection when it closes.\n */\n close() {\n if (this._closed) {\n return;\n }\n\n this._closedFromOwner = true;\n this._closed = true;\n \n // Emit state change if not already closed\n if (this._state !== RTCSctpTransportState.CLOSED) {\n this._state = RTCSctpTransportState.CLOSED;\n this.emit('statechange');\n }\n }\n\n /**\n * Internal close method.\n * @param {string} reason - Reason for closing\n * @private\n */\n _close(reason) {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n this._setState(RTCSctpTransportState.CLOSED);\n }\n\n /**\n * Set the transport state and emit event if changed.\n * @param {string} newState - The new state\n * @private\n */\n _setState(newState) {\n if (this._state !== newState) {\n this._state = newState;\n this.emit('statechange');\n }\n }\n\n /**\n * Handle DTLS transport state changes.\n * @private\n */\n _onDtlsStateChange() {\n const dtlsState = this._dtlsTransport.state;\n \n // Start SCTP when DTLS is connected\n if (dtlsState === 'connected' && !this._startCompleted) {\n this._start();\n }\n \n // Close SCTP when DTLS closes or fails\n if (dtlsState === 'closed' || dtlsState === 'failed') {\n this._close('dtls-closed');\n }\n }\n\n /**\n * Update SCTP configuration.\n * @param {Object} info - SCTP transport information\n * @param {number} [info.maxMessageSize] - Maximum message size\n * @param {number} [info.maxChannels] - Maximum number of channels\n * @private\n */\n _updateConfiguration(info) {\n if (info.maxMessageSize !== undefined) {\n this._maxMessageSize = info.maxMessageSize;\n }\n if (info.maxChannels !== undefined) {\n this._maxChannels = info.maxChannels;\n }\n }\n\n /**\n * Check if the transport is closed.\n * @returns {boolean} True if closed, false otherwise\n */\n isClosed() {\n return this._state === RTCSctpTransportState.CLOSED;\n }\n}\n\nmodule.exports = {\n RTCSctpTransport,\n RTCSctpTransportState\n};\n","/**\n * @file RTCDataChannel.js\n * @description WebRTC DataChannel implementation for peer-to-peer data transfer.\n * @module datachannel/RTCDataChannel\n * \n * Ported from Chromium's RTCDataChannel implementation:\n * - cc/rtc_data_channel.h\n * - cc/rtc_data_channel.cc\n * - cc/rtc_data_channel.idl\n */\n\nconst EventEmitter = require('events');\n\n/**\n * RTCDataChannelState - Current state of the data channel\n * @readonly\n * @enum {string}\n */\nconst RTCDataChannelState = Object.freeze({\n CONNECTING: 'connecting',\n OPEN: 'open',\n CLOSING: 'closing',\n CLOSED: 'closed'\n});\n\n/**\n * RTCDataChannelInit - Configuration for creating a data channel\n * @typedef {Object} RTCDataChannelInit\n * @property {boolean} [ordered=true] - Whether messages must arrive in order\n * @property {number} [maxPacketLifeTime] - Maximum packet lifetime in milliseconds\n * @property {number} [maxRetransmits] - Maximum number of retransmissions\n * @property {string} [protocol=''] - Subprotocol name\n * @property {boolean} [negotiated=false] - Whether channel was negotiated out-of-band\n * @property {number} [id] - Channel ID (required if negotiated is true)\n */\n\n/**\n * @class RTCDataChannel\n * @extends EventEmitter\n * @description Represents a bidirectional data channel between peers.\n * Provides reliable or unreliable data transfer with configurable ordering.\n * \n * Events:\n * - 'open': Fired when the channel opens\n * - 'message': Fired when a message is received\n * - 'bufferedamountlow': Fired when bufferedAmount drops below threshold\n * - 'error': Fired when an error occurs\n * - 'closing': Fired when the channel is closing\n * - 'close': Fired when the channel closes\n * \n * @example\n * const dataChannel = peerConnection.createDataChannel('myChannel', {\n * ordered: true,\n * maxRetransmits: 3\n * });\n * \n * dataChannel.on('open', () => {\n * console.log('Channel opened');\n * dataChannel.send('Hello!');\n * });\n * \n * dataChannel.on('message', (event) => {\n * console.log('Received:', event.data);\n * });\n */\nclass RTCDataChannel extends EventEmitter {\n /**\n * Create an RTCDataChannel instance.\n * @param {string} label - Channel label\n * @param {RTCDataChannelInit} [init] - Channel configuration\n */\n constructor(label, init = {}) {\n super();\n\n if (typeof label !== 'string') {\n throw new TypeError('label must be a string');\n }\n\n // Channel configuration\n this._label = label;\n this._ordered = init.ordered !== undefined ? init.ordered : true;\n this._maxPacketLifeTime = init.maxPacketLifeTime || null;\n this._maxRetransmits = init.maxRetransmits || null;\n this._protocol = init.protocol || '';\n this._negotiated = init.negotiated || false;\n this._id = init.id !== undefined ? init.id : null;\n\n // State\n this._readyState = RTCDataChannelState.CONNECTING;\n this._bufferedAmount = 0;\n this._bufferedAmountLowThreshold = 0;\n this._binaryType = 'arraybuffer'; // or 'blob'\n\n // Message queue for when not open\n this._messageQueue = [];\n }\n\n /**\n * Get the channel label.\n * @returns {string} Channel label\n */\n get label() {\n return this._label;\n }\n\n /**\n * Check if messages are delivered in order.\n * @returns {boolean} True if ordered\n */\n get ordered() {\n return this._ordered;\n }\n\n /**\n * Get the maximum packet lifetime in milliseconds.\n * @returns {number|null} Maximum lifetime or null if not set\n */\n get maxPacketLifeTime() {\n return this._maxPacketLifeTime;\n }\n\n /**\n * Get the maximum number of retransmissions.\n * @returns {number|null} Maximum retransmits or null if not set\n */\n get maxRetransmits() {\n return this._maxRetransmits;\n }\n\n /**\n * Get the subprotocol name.\n * @returns {string} Protocol name\n */\n get protocol() {\n return this._protocol;\n }\n\n /**\n * Check if the channel was negotiated out-of-band.\n * @returns {boolean} True if negotiated\n */\n get negotiated() {\n return this._negotiated;\n }\n\n /**\n * Get the channel ID.\n * @returns {number|null} Channel ID or null if not assigned\n */\n get id() {\n return this._id;\n }\n\n /**\n * Get the current state of the channel.\n * @returns {string} Channel state\n */\n get readyState() {\n return this._readyState;\n }\n\n /**\n * Get the number of bytes queued to send.\n * @returns {number} Buffered amount in bytes\n */\n get bufferedAmount() {\n return this._bufferedAmount;\n }\n\n /**\n * Get the threshold for bufferedamountlow event.\n * @returns {number} Threshold in bytes\n */\n get bufferedAmountLowThreshold() {\n return this._bufferedAmountLowThreshold;\n }\n\n /**\n * Set the threshold for bufferedamountlow event.\n * @param {number} value - Threshold in bytes\n */\n set bufferedAmountLowThreshold(value) {\n this._bufferedAmountLowThreshold = value;\n }\n\n /**\n * Get the binary data type.\n * @returns {string} 'arraybuffer' or 'blob'\n */\n get binaryType() {\n return this._binaryType;\n }\n\n /**\n * Set the binary data type.\n * @param {string} value - 'arraybuffer' or 'blob'\n * @throws {TypeError} If value is invalid\n */\n set binaryType(value) {\n if (value !== 'arraybuffer' && value !== 'blob') {\n throw new TypeError('binaryType must be \"arraybuffer\" or \"blob\"');\n }\n this._binaryType = value;\n }\n\n /**\n * Check if the channel is reliable (deprecated).\n * @returns {boolean} True if ordered and no packet lifetime/retransmit limits\n * @deprecated Use ordered, maxPacketLifeTime, and maxRetransmits instead\n */\n get reliable() {\n return this._ordered && \n this._maxPacketLifeTime === null && \n this._maxRetransmits === null;\n }\n\n /**\n * Send a message through the channel.\n * @param {string|ArrayBuffer|ArrayBufferView|Blob} data - Data to send\n * @throws {Error} If channel is not open or data is invalid\n */\n send(data) {\n if (this._readyState !== RTCDataChannelState.OPEN) {\n throw new Error('RTCDataChannel.readyState is not \"open\"');\n }\n\n let dataToSend;\n let byteLength = 0;\n\n if (typeof data === 'string') {\n dataToSend = Buffer.from(data, 'utf8');\n byteLength = dataToSend.length;\n } else if (data instanceof ArrayBuffer) {\n dataToSend = Buffer.from(data);\n byteLength = data.byteLength;\n } else if (ArrayBuffer.isView(data)) {\n dataToSend = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n byteLength = data.byteLength;\n } else if (data && typeof data.arrayBuffer === 'function') {\n // Blob-like object\n throw new Error('Blob sending not yet implemented');\n } else {\n throw new TypeError('Invalid data type');\n }\n\n // Update buffered amount\n this._bufferedAmount += byteLength;\n\n // Use real network transport\n if (!this._send) {\n throw new Error('Data channel not connected to network transport');\n }\n \n this._send(data).catch(err => {\n console.error('Send error:', err);\n this.emit('error', err);\n });\n }\n\n /**\n * Emit bufferedamountlow if appropriate\n * @private\n */\n _emitBufferedAmountLow() {\n if (this._bufferedAmount <= this._bufferedAmountLowThreshold) {\n this.emit('bufferedamountlow');\n }\n }\n\n /**\n * Close the data channel.\n */\n close() {\n if (this._readyState === RTCDataChannelState.CLOSING || \n this._readyState === RTCDataChannelState.CLOSED) {\n return;\n }\n\n this._setState(RTCDataChannelState.CLOSING);\n \n // Transition to closed asynchronously\n setImmediate(() => {\n if (this._readyState === RTCDataChannelState.CLOSING) {\n this._setState(RTCDataChannelState.CLOSED);\n }\n });\n }\n\n /**\n * Set the channel state and emit appropriate events.\n * @param {string} newState - New state\n * @private\n */\n _setState(newState) {\n const oldState = this._readyState;\n if (oldState === newState) {\n return;\n }\n\n this._readyState = newState;\n\n // Emit state-specific events\n if (newState === RTCDataChannelState.OPEN) {\n this.emit('open');\n } else if (newState === RTCDataChannelState.CLOSING) {\n this.emit('closing');\n } else if (newState === RTCDataChannelState.CLOSED) {\n this.emit('close');\n }\n }\n\n /**\n * Set channel to open state (internal use).\n * @private\n */\n _setStateToOpen() {\n this._setState(RTCDataChannelState.OPEN);\n }\n\n /**\n * Handle received message (internal use).\n * @param {Buffer|string} data - Received data\n * @private\n */\n _onMessage(data) {\n const event = {\n data: data\n };\n this.emit('message', event);\n }\n\n /**\n * Receive message from network transport (internal use).\n * @param {any} data - Received data\n * @private\n */\n _receiveMessage(data) {\n this._onMessage(data);\n }\n\n /**\n * Set the channel ID (internal use).\n * @param {number} id - Channel ID\n * @private\n */\n _setId(id) {\n this._id = id;\n }\n}\n\nmodule.exports = {\n RTCDataChannel,\n RTCDataChannelState\n};\n","/**\n * @file RTCSessionDescription.js\n * @description Session Description Protocol (SDP) representation\n * @module sdp/RTCSessionDescription\n * \n * Ported from Chromium's RTCSessionDescription implementation:\n * - cc/rtc_session_description.idl\n * - cc/rtc_session_description.h\n */\n\n'use strict';\n\n/**\n * RTCSdpType - Types of session descriptions\n * @readonly\n * @enum {string}\n */\nconst RTCSdpType = Object.freeze({\n OFFER: 'offer',\n PRANSWER: 'pranswer',\n ANSWER: 'answer',\n ROLLBACK: 'rollback'\n});\n\n/**\n * @class RTCSessionDescription\n * @description Represents a WebRTC session description (offer/answer)\n * \n * @example\n * const desc = new RTCSessionDescription({\n * type: 'offer',\n * sdp: 'v=0\\r\\no=- 123456 2 IN IP4 127.0.0.1\\r\\n...'\n * });\n */\nclass RTCSessionDescription {\n /**\n * Create an RTCSessionDescription instance.\n * @param {Object} [init] - Session description init\n * @param {string} [init.type] - SDP type (offer/answer/pranswer/rollback)\n * @param {string} [init.sdp] - SDP string\n */\n constructor(init = {}) {\n this._type = init.type || null;\n this._sdp = init.sdp || null;\n\n // Validate type if provided\n if (this._type && !Object.values(RTCSdpType).includes(this._type)) {\n throw new TypeError(`Invalid SDP type: ${this._type}`);\n }\n }\n\n /**\n * Get the SDP type.\n * @returns {string|null} SDP type\n */\n get type() {\n return this._type;\n }\n\n /**\n * Set the SDP type.\n * @param {string} value - SDP type\n */\n set type(value) {\n if (value && !Object.values(RTCSdpType).includes(value)) {\n throw new TypeError(`Invalid SDP type: ${value}`);\n }\n this._type = value;\n }\n\n /**\n * Get the SDP string.\n * @returns {string|null} SDP string\n */\n get sdp() {\n return this._sdp;\n }\n\n /**\n * Set the SDP string.\n * @param {string} value - SDP string\n */\n set sdp(value) {\n this._sdp = value;\n }\n\n /**\n * Convert to JSON representation.\n * @returns {Object} JSON representation\n */\n toJSON() {\n return {\n type: this._type,\n sdp: this._sdp\n };\n }\n}\n\nmodule.exports = {\n RTCSessionDescription,\n RTCSdpType\n};\n","/**\n * @file sdp-utils.js\n * @description SDP parsing and generation utilities\n * @module sdp/sdp-utils\n */\n\n'use strict';\n\n/**\n * Generate a simple SDP offer for data channel only\n * @param {Object} options - Generation options\n * @param {string} options.iceUfrag - ICE username fragment\n * @param {string} options.icePwd - ICE password\n * @param {Array<Object>} options.fingerprints - DTLS fingerprints\n * @param {Array<Object>} options.candidates - ICE candidates\n * @param {string} [options.setup='actpass'] - DTLS setup role\n * @param {string} [options.connectionAddress] - Connection IP address\n * @param {number} [options.connectionPort] - Connection port\n * @returns {string} SDP offer\n */\nfunction generateOffer(options) {\n const {\n iceUfrag,\n icePwd,\n fingerprints = [],\n candidates = [],\n setup = 'actpass',\n connectionAddress = '0.0.0.0',\n connectionPort = 9\n } = options;\n\n const sessionId = Date.now();\n const sessionVersion = 2;\n \n // Get primary fingerprint (SHA-256)\n const fingerprint = fingerprints.find(fp => fp.algorithm === 'sha-256') || fingerprints[0];\n \n let sdp = '';\n \n // Session description\n sdp += 'v=0\\r\\n';\n sdp += `o=- ${sessionId} ${sessionVersion} IN IP4 ${connectionAddress}\\r\\n`;\n sdp += 's=-\\r\\n';\n sdp += 't=0 0\\r\\n';\n \n // Bundle group (data channel only)\n sdp += 'a=group:BUNDLE 0\\r\\n';\n sdp += 'a=msid-semantic: WMS\\r\\n';\n \n // Media description for data channel (application)\n sdp += `m=application ${connectionPort} UDP/DTLS/SCTP webrtc-datachannel\\r\\n`;\n sdp += `c=IN IP4 ${connectionAddress}\\r\\n`;\n sdp += 'a=ice-ufrag:' + iceUfrag + '\\r\\n';\n sdp += 'a=ice-pwd:' + icePwd + '\\r\\n';\n sdp += 'a=ice-options:trickle\\r\\n';\n \n // DTLS fingerprint\n if (fingerprint) {\n sdp += `a=fingerprint:${fingerprint.algorithm.toUpperCase()} ${fingerprint.value}\\r\\n`;\n }\n sdp += `a=setup:${setup}\\r\\n`;\n \n // SCTP\n sdp += 'a=mid:0\\r\\n';\n sdp += 'a=sctp-port:5000\\r\\n';\n sdp += 'a=max-message-size:262144\\r\\n';\n \n // ICE candidates\n for (const candidate of candidates) {\n if (candidate.candidate) {\n sdp += `a=${candidate.candidate}\\r\\n`;\n }\n }\n \n return sdp;\n}\n\n/**\n * Generate a simple SDP answer for data channel only\n * @param {Object} options - Generation options\n * @param {string} options.iceUfrag - ICE username fragment\n * @param {string} options.icePwd - ICE password\n * @param {Array<Object>} options.fingerprints - DTLS fingerprints\n * @param {Array<Object>} options.candidates - ICE candidates\n * @param {string} [options.setup='active'] - DTLS setup role\n * @returns {string} SDP answer\n */\nfunction generateAnswer(options) {\n // Answer is similar to offer but with different setup role\n return generateOffer({\n ...options,\n setup: options.setup || 'active'\n });\n}\n\n/**\n * Parse SDP string to extract ICE candidates\n * @param {string} sdp - SDP string\n * @returns {Array<Object>} Array of candidate objects\n */\nfunction parseCandidates(sdp) {\n const candidates = [];\n const lines = sdp.split('\\r\\n');\n \n for (const line of lines) {\n if (line.startsWith('a=candidate:')) {\n candidates.push({\n candidate: line,\n sdpMid: '0',\n sdpMLineIndex: 0\n });\n }\n }\n \n return candidates;\n}\n\n/**\n * Parse SDP to extract ICE parameters\n * @param {string} sdp - SDP string\n * @returns {Object} ICE parameters\n */\nfunction parseIceParameters(sdp) {\n const lines = sdp.split('\\r\\n');\n const params = {\n usernameFragment: null,\n password: null\n };\n \n for (const line of lines) {\n if (line.startsWith('a=ice-ufrag:')) {\n params.usernameFragment = line.substring(12);\n } else if (line.startsWith('a=ice-pwd:')) {\n params.password = line.substring(10);\n }\n }\n \n return params;\n}\n\n/**\n * Parse SDP to extract DTLS parameters\n * @param {string} sdp - SDP string\n * @returns {Object} DTLS parameters\n */\nfunction parseDtlsParameters(sdp) {\n const lines = sdp.split('\\r\\n');\n const params = {\n role: 'auto',\n fingerprints: []\n };\n \n for (const line of lines) {\n if (line.startsWith('a=setup:')) {\n const setup = line.substring(8);\n if (setup === 'active') params.role = 'client';\n else if (setup === 'passive') params.role = 'server';\n else params.role = 'auto';\n } else if (line.startsWith('a=fingerprint:')) {\n const parts = line.substring(14).split(' ');\n if (parts.length === 2) {\n params.fingerprints.push({\n algorithm: parts[0].toLowerCase(),\n value: parts[1]\n });\n }\n }\n }\n \n return params;\n}\n\n/**\n * Parse SDP to extract SCTP parameters\n * @param {string} sdp - SDP string\n * @returns {Object} SCTP parameters\n */\nfunction parseSctpParameters(sdp) {\n const lines = sdp.split('\\r\\n');\n const params = {\n port: 5000,\n maxMessageSize: 262144\n };\n \n for (const line of lines) {\n if (line.startsWith('a=sctp-port:')) {\n params.port = parseInt(line.substring(12), 10);\n } else if (line.startsWith('a=max-message-size:')) {\n params.maxMessageSize = parseInt(line.substring(19), 10);\n }\n }\n \n return params;\n}\n\n/**\n * Generate random ICE credentials\n * @returns {Object} ICE credentials\n */\nfunction generateIceCredentials() {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n const randomString = (length) => {\n let result = '';\n for (let i = 0; i < length; i++) {\n result += chars.charAt(Math.floor(Math.random() * chars.length));\n }\n return result;\n };\n \n return {\n usernameFragment: randomString(4),\n password: randomString(24)\n };\n}\n\nmodule.exports = {\n generateOffer,\n generateAnswer,\n parseCandidates,\n parseIceParameters,\n parseDtlsParameters,\n parseSctpParameters,\n generateIceCredentials\n};\n","/**\n * @file network-transport.js\n * @description Real UDP/TCP network transport implementation\n * @module network/network-transport\n * \n * Provides real networking capabilities using Node.js net and dgram packages\n */\n\n'use strict';\n\nconst dgram = require('dgram');\nconst net = require('net');\nconst EventEmitter = require('events');\nconst crypto = require('crypto');\n\n/**\n * Transport protocol types\n */\nconst TransportProtocol = Object.freeze({\n UDP: 'udp',\n TCP: 'tcp'\n});\n\n/**\n * @class NetworkTransport\n * @extends EventEmitter\n * @description Base class for network transport\n * \n * Events:\n * - 'data': (data, rinfo) - Data received\n * - 'error': (error) - Error occurred\n * - 'listening': () - Socket is listening\n * - 'close': () - Socket closed\n */\nclass NetworkTransport extends EventEmitter {\n constructor(protocol = TransportProtocol.UDP) {\n super();\n this.protocol = protocol;\n this.socket = null;\n this.localAddress = null;\n this.localPort = null;\n this.isListening = false;\n }\n\n /**\n * Bind to a local address and port\n * @param {number} [port=0] - Port to bind (0 for random)\n * @param {string} [address='0.0.0.0'] - Address to bind\n * @returns {Promise<{address: string, port: number}>}\n */\n async bind(port = 0, address = '0.0.0.0') {\n throw new Error('Must be implemented by subclass');\n }\n\n /**\n * Send data to remote address\n * @param {Buffer} data - Data to send\n * @param {string} address - Remote address\n * @param {number} port - Remote port\n * @returns {Promise<void>}\n */\n async send(data, address, port) {\n throw new Error('Must be implemented by subclass');\n }\n\n /**\n * Close the transport\n */\n close() {\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n this.isListening = false;\n }\n}\n\n/**\n * @class UDPTransport\n * @extends NetworkTransport\n * @description UDP transport implementation using dgram\n */\nclass UDPTransport extends NetworkTransport {\n constructor() {\n super(TransportProtocol.UDP);\n }\n\n /**\n * Bind to a local address and port\n * @param {number} [port=0] - Port to bind (0 for random)\n * @param {string} [address='0.0.0.0'] - Address to bind\n * @returns {Promise<{address: string, port: number}>}\n */\n async bind(port = 0, address = '0.0.0.0') {\n if (this.socket) {\n throw new Error('Already bound');\n }\n\n return new Promise((resolve, reject) => {\n this.socket = dgram.createSocket('udp4');\n\n this.socket.on('message', (msg, rinfo) => {\n this.emit('data', msg, rinfo);\n });\n\n this.socket.on('error', (error) => {\n this.emit('error', error);\n });\n\n this.socket.on('close', () => {\n this.isListening = false;\n this.emit('close');\n });\n\n this.socket.bind(port, address, () => {\n const addr = this.socket.address();\n this.localAddress = addr.address;\n this.localPort = addr.port;\n this.isListening = true;\n this.emit('listening');\n resolve({ address: addr.address, port: addr.port });\n });\n });\n }\n\n /**\n * Send data to remote address\n * @param {Buffer} data - Data to send\n * @param {string} address - Remote address\n * @param {number} port - Remote port\n * @returns {Promise<void>}\n */\n async send(data, address, port) {\n if (!this.socket) {\n throw new Error('Socket not bound');\n }\n\n return new Promise((resolve, reject) => {\n this.socket.send(data, port, address, (error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n });\n }\n}\n\n/**\n * @class TCPTransport\n * @extends NetworkTransport\n * @description TCP transport implementation using net\n * Supports both server (listening) and client (connecting) modes\n */\nclass TCPTransport extends NetworkTransport {\n constructor() {\n super(TransportProtocol.TCP);\n this.server = null;\n this.connections = new Map(); // connection id -> socket\n this.mode = null; // 'server' or 'client'\n }\n\n /**\n * Start listening for connections (server mode)\n * @param {number} [port=0] - Port to listen on (0 for random)\n * @param {string} [address='0.0.0.0'] - Address to bind\n * @returns {Promise<{address: string, port: number}>}\n */\n async listen(port = 0, address = '0.0.0.0') {\n if (this.server) {\n throw new Error('Already listening');\n }\n\n this.mode = 'server';\n\n return new Promise((resolve, reject) => {\n this.server = net.createServer((socket) => {\n this._handleConnection(socket);\n });\n\n this.server.on('error', (error) => {\n this.emit('error', error);\n });\n\n this.server.on('close', () => {\n this.isListening = false;\n this.emit('close');\n });\n\n this.server.listen(port, address, () => {\n const addr = this.server.address();\n this.localAddress = addr.address;\n this.localPort = addr.port;\n this.isListening = true;\n this.emit('listening');\n resolve({ address: addr.address, port: addr.port });\n });\n });\n }\n\n /**\n * Connect to remote server (client mode)\n * @param {string} address - Remote address\n * @param {number} port - Remote port\n * @returns {Promise<void>}\n */\n async connect(address, port) {\n if (this.mode === 'server') {\n throw new Error('Cannot connect in server mode');\n }\n\n this.mode = 'client';\n\n return new Promise((resolve, reject) => {\n const socket = net.connect(port, address, () => {\n this._handleConnection(socket);\n resolve();\n });\n\n socket.on('error', (error) => {\n reject(error);\n });\n });\n }\n\n /**\n * Handle new connection\n * @param {net.Socket} socket - TCP socket\n * @private\n */\n _handleConnection(socket) {\n const connectionId = crypto.randomBytes(8).toString('hex');\n this.connections.set(connectionId, socket);\n\n const rinfo = {\n address: socket.remoteAddress,\n port: socket.remotePort,\n connectionId\n };\n\n // Handle incoming data\n socket.on('data', (data) => {\n this.emit('data', data, rinfo);\n });\n\n // Handle socket close\n socket.on('close', () => {\n this.connections.delete(connectionId);\n this.emit('connectionClosed', connectionId);\n });\n\n // Handle errors\n socket.on('error', (error) => {\n this.emit('error', error);\n });\n\n // Emit connection event\n this.emit('connection', connectionId, rinfo);\n }\n\n /**\n * Send data to specific connection or address\n * @param {Buffer} data - Data to send\n * @param {string} addressOrConnectionId - Remote address or connection ID\n * @param {number} [port] - Remote port (not needed if using connection ID)\n * @returns {Promise<void>}\n */\n async send(data, addressOrConnectionId, port) {\n // If in server mode or already have connection, use connection ID\n if (this.connections.has(addressOrConnectionId)) {\n const socket = this.connections.get(addressOrConnectionId);\n return new Promise((resolve, reject) => {\n socket.write(data, (error) => {\n if (error) reject(error);\n else resolve();\n });\n });\n }\n\n // Otherwise, send to all connections (broadcast)\n if (this.connections.size > 0) {\n const promises = [];\n for (const socket of this.connections.values()) {\n promises.push(\n new Promise((resolve, reject) => {\n socket.write(data, (error) => {\n if (error) reject(error);\n else resolve();\n });\n })\n );\n }\n await Promise.all(promises);\n } else {\n throw new Error('No active connections');\n }\n }\n\n /**\n * Close specific connection or all connections\n * @param {string} [connectionId] - Connection ID to close (omit to close all)\n */\n closeConnection(connectionId) {\n if (connectionId) {\n const socket = this.connections.get(connectionId);\n if (socket) {\n socket.end();\n this.connections.delete(connectionId);\n }\n } else {\n // Close all connections\n for (const socket of this.connections.values()) {\n socket.end();\n }\n this.connections.clear();\n }\n }\n\n /**\n * Close the transport and all connections\n */\n close() {\n // Close all connections\n this.closeConnection();\n\n // Close server\n if (this.server) {\n this.server.close();\n this.server = null;\n }\n\n this.isListening = false;\n this.mode = null;\n }\n\n /**\n * Bind is an alias for listen in TCP\n */\n async bind(port, address) {\n return this.listen(port, address);\n }\n}\n\n/**\n * @class DataChannelTransport\n * @description High-level transport for data channels using TCP\n * Implements message framing with length prefix\n */\nclass DataChannelTransport extends EventEmitter {\n constructor() {\n super();\n this.tcpTransport = new TCPTransport();\n this.messageBuffers = new Map(); // connection -> incomplete message buffer\n\n // Forward events\n this.tcpTransport.on('connection', (connectionId, rinfo) => {\n this.messageBuffers.set(connectionId, Buffer.alloc(0));\n this.emit('connection', connectionId, rinfo);\n });\n\n this.tcpTransport.on('connectionClosed', (connectionId) => {\n this.messageBuffers.delete(connectionId);\n this.emit('connectionClosed', connectionId);\n });\n\n this.tcpTransport.on('data', (data, rinfo) => {\n this._handleData(data, rinfo);\n });\n\n this.tcpTransport.on('error', (error) => {\n this.emit('error', error);\n });\n\n this.tcpTransport.on('listening', () => {\n this.emit('listening');\n });\n\n this.tcpTransport.on('close', () => {\n this.emit('close');\n });\n }\n\n /**\n * Handle incoming data with message framing\n * Message format: [4 bytes length][message data]\n * @private\n */\n _handleData(data, rinfo) {\n const connectionId = rinfo.connectionId || 'default';\n \n // Get existing buffer or create new\n let buffer = this.messageBuffers.get(connectionId) || Buffer.alloc(0);\n buffer = Buffer.concat([buffer, data]);\n this.messageBuffers.set(connectionId, buffer);\n\n // Process complete messages\n while (buffer.length >= 4) {\n const messageLength = buffer.readUInt32BE(0);\n \n if (buffer.length >= 4 + messageLength) {\n // Extract complete message\n const message = buffer.slice(4, 4 + messageLength);\n buffer = buffer.slice(4 + messageLength);\n this.messageBuffers.set(connectionId, buffer);\n\n // Emit message event\n this.emit('message', message, rinfo);\n } else {\n // Incomplete message, wait for more data\n break;\n }\n }\n }\n\n /**\n * Send message with length prefix\n * @param {Buffer|string} message - Message to send\n * @param {string} [connectionId] - Connection ID (for server mode)\n * @returns {Promise<void>}\n */\n async sendMessage(message, connectionId) {\n const messageBuffer = Buffer.isBuffer(message) ? message : Buffer.from(message);\n \n // Create framed message: [length][data]\n const frame = Buffer.alloc(4 + messageBuffer.length);\n frame.writeUInt32BE(messageBuffer.length, 0);\n messageBuffer.copy(frame, 4);\n\n if (connectionId) {\n await this.tcpTransport.send(frame, connectionId);\n } else {\n // Broadcast to all connections\n await this.tcpTransport.send(frame);\n }\n }\n\n /**\n * Start listening (server mode)\n */\n async listen(port, address) {\n return this.tcpTransport.listen(port, address);\n }\n\n /**\n * Connect to remote (client mode)\n */\n async connect(address, port) {\n return this.tcpTransport.connect(address, port);\n }\n\n /**\n * Get local address info\n */\n get localAddress() {\n return this.tcpTransport.localAddress;\n }\n\n get localPort() {\n return this.tcpTransport.localPort;\n }\n\n /**\n * Close transport\n */\n close() {\n this.messageBuffers.clear();\n this.tcpTransport.close();\n }\n}\n\nmodule.exports = {\n NetworkTransport,\n UDPTransport,\n TCPTransport,\n DataChannelTransport,\n TransportProtocol\n};\n","/**\n * @file RTCPeerConnection.js\n * @description WebRTC Peer Connection implementation\n * @module peerconnection/RTCPeerConnection\n * \n * Ported from Chromium's RTCPeerConnection implementation:\n * - cc/rtc_peer_connection.idl\n * - cc/rtc_peer_connection.h\n */\n\n'use strict';\n\nconst EventEmitter = require('events');\nconst { RTCIceTransport } = require('../ice/RTCIceTransport');\nconst { RTCDtlsTransport } = require('../dtls/RTCDtlsTransport');\nconst { RTCSctpTransport } = require('../sctp/RTCSctpTransport');\nconst { RTCDataChannel } = require('../datachannel/RTCDataChannel');\nconst RTCCertificate = require('../dtls/RTCCertificate');\nconst { RTCSessionDescription, RTCSdpType } = require('../sdp/RTCSessionDescription');\nconst sdpUtils = require('../sdp/sdp-utils');\nconst { DataChannelTransport } = require('../network/network-transport');\n\n/**\n * RTCSignalingState - Signaling state of the peer connection\n * @readonly\n * @enum {string}\n */\nconst RTCSignalingState = Object.freeze({\n STABLE: 'stable',\n HAVE_LOCAL_OFFER: 'have-local-offer',\n HAVE_REMOTE_OFFER: 'have-remote-offer',\n HAVE_LOCAL_PRANSWER: 'have-local-pranswer',\n HAVE_REMOTE_PRANSWER: 'have-remote-pranswer',\n CLOSED: 'closed'\n});\n\n/**\n * RTCIceGatheringState - ICE gathering state\n * @readonly\n * @enum {string}\n */\nconst RTCIceGatheringState = Object.freeze({\n NEW: 'new',\n GATHERING: 'gathering',\n COMPLETE: 'complete'\n});\n\n/**\n * RTCPeerConnectionState - Overall connection state\n * @readonly\n * @enum {string}\n */\nconst RTCPeerConnectionState = Object.freeze({\n NEW: 'new',\n CONNECTING: 'connecting',\n CONNECTED: 'connected',\n DISCONNECTED: 'disconnected',\n FAILED: 'failed',\n CLOSED: 'closed'\n});\n\n/**\n * @class RTCPeerConnection\n * @extends EventEmitter\n * @description Main class for WebRTC peer-to-peer connections\n * \n * Events:\n * - 'negotiationneeded': Negotiation is needed\n * - 'icecandidate': New ICE candidate gathered\n * - 'icegatheringstatechange': ICE gathering state changed\n * - 'iceconnectionstatechange': ICE connection state changed\n * - 'connectionstatechange': Overall connection state changed\n * - 'signalingstatechange': Signaling state changed\n * - 'datachannel': New data channel received\n * \n * @example\n * const pc = new RTCPeerConnection({\n * iceServers: [{ urls: 'stun:stun.l.google.com:19302' }]\n * });\n * \n * const channel = pc.createDataChannel('myChannel');\n * const offer = await pc.createOffer();\n * await pc.setLocalDescription(offer);\n */\nclass RTCPeerConnection extends EventEmitter {\n /**\n * Create an RTCPeerConnection instance.\n * @param {Object} [configuration] - Configuration options\n * @param {Array<Object>} [configuration.iceServers] - STUN/TURN servers\n * @param {string} [configuration.iceTransportPolicy='all'] - ICE transport policy\n * @param {string} [configuration.bundlePolicy='balanced'] - Bundle policy\n */\n constructor(configuration = {}) {\n super();\n\n this._configuration = configuration;\n this._signalingState = RTCSignalingState.STABLE;\n this._iceGatheringState = RTCIceGatheringState.NEW;\n this._connectionState = RTCPeerConnectionState.NEW;\n \n this._localDescription = null;\n this._remoteDescription = null;\n this._pendingLocalDescription = null;\n this._pendingRemoteDescription = null;\n \n this._dataChannels = new Map();\n this._nextChannelId = 0;\n \n // Transport components\n this._certificate = null;\n this._iceTransport = null;\n this._dtlsTransport = null;\n this._sctpTransport = null;\n this._networkTransport = null;\n \n this._isClosed = false;\n this._localIceCandidates = [];\n this._remoteIceCandidates = [];\n \n // Network state\n this._isOfferer = false;\n this._remoteConnectionInfo = null;\n \n // Initialize transports lazily\n this._initializePromise = null;\n }\n\n /**\n * Initialize transports (lazy initialization)\n * @private\n */\n async _initialize() {\n if (this._initializePromise) {\n return this._initializePromise;\n }\n\n this._initializePromise = (async () => {\n // Generate certificate if not provided\n if (!this._certificate) {\n this._certificate = await RTCCertificate.generateCertificate({\n name: 'RSASSA-PKCS1-v1_5',\n modulusLength: 2048,\n hash: 'SHA-256'\n });\n }\n\n // Create transport stack\n this._iceTransport = new RTCIceTransport();\n this._dtlsTransport = new RTCDtlsTransport(this._iceTransport, [this._certificate]);\n this._sctpTransport = new RTCSctpTransport(this._dtlsTransport);\n \n // Create network transport\n this._networkTransport = new DataChannelTransport();\n\n // Setup event handlers\n this._setupTransportEvents();\n this._setupNetworkTransport();\n })();\n\n return this._initializePromise;\n }\n\n /**\n * Setup transport event handlers\n * @private\n */\n _setupTransportEvents() {\n // ICE events\n this._iceTransport.on('icecandidate', (candidate) => {\n const candidateInit = {\n candidate: candidate.candidate,\n sdpMid: '0',\n sdpMLineIndex: 0,\n usernameFragment: candidate.usernameFragment\n };\n this._localIceCandidates.push(candidateInit);\n this.emit('icecandidate', { candidate: candidateInit });\n });\n\n this._iceTransport.on('gatheringstatechange', () => {\n const state = this._iceTransport.gatheringState;\n this._iceGatheringState = state;\n this.emit('icegatheringstatechange');\n });\n\n this._iceTransport.on('statechange', () => {\n this._updateConnectionState();\n this.emit('iceconnectionstatechange');\n });\n\n // DTLS events\n this._dtlsTransport.on('statechange', () => {\n this._updateConnectionState();\n });\n\n // SCTP events\n this._sctpTransport.on('statechange', () => {\n this._updateConnectionState();\n });\n }\n\n /**\n * Setup network transport event handlers\n * @private\n */\n _setupNetworkTransport() {\n this._networkTransport.on('message', (message, rinfo) => {\n this._handleIncomingMessage(message, rinfo);\n });\n\n this._networkTransport.on('connection', (connectionId, rinfo) => {\n // Connection established - open data channels\n setImmediate(() => {\n this._openDataChannels();\n });\n });\n\n this._networkTransport.on('error', (error) => {\n console.error('Network transport error:', error);\n });\n }\n\n /**\n * Open all data channels\n * @private\n */\n _openDataChannels() {\n for (const channel of this._dataChannels.values()) {\n if (channel.readyState === 'connecting') {\n this._connectChannelToNetwork(channel);\n channel._setStateToOpen();\n }\n }\n }\n\n /**\n * Handle incoming network message\n * @private\n */\n _handleIncomingMessage(message, rinfo) {\n try {\n // Try to parse as JSON first (for data channel messages)\n const data = JSON.parse(message.toString());\n \n if (data.type === 'datachannel') {\n const channelLabel = data.label;\n const channelData = data.data;\n\n // Find or create data channel\n let channel = Array.from(this._dataChannels.values())\n .find(ch => ch.label === channelLabel);\n\n if (!channel) {\n // Remote peer created a new data channel\n channel = new RTCDataChannel(channelLabel, {\n id: data.id || this._nextChannelId++\n });\n this._dataChannels.set(channel.id, channel);\n \n // Connect channel to network before opening\n this._connectChannelToNetwork(channel);\n \n channel._setStateToOpen();\n this.emit('datachannel', { channel });\n }\n\n // Deliver message to channel\n if (channel.readyState === 'open') {\n channel._receiveMessage(channelData);\n }\n }\n } catch (error) {\n // Not JSON, might be raw binary data\n console.error('Error parsing network message:', error);\n }\n }\n\n /**\n * Update overall connection state based on transport states\n * @private\n */\n _updateConnectionState() {\n if (this._isClosed) {\n this._connectionState = RTCPeerConnectionState.CLOSED;\n this.emit('connectionstatechange');\n return;\n }\n\n const iceState = this._iceTransport?.state || 'new';\n const dtlsState = this._dtlsTransport?.state || 'new';\n const sctpState = this._sctpTransport?.state || 'connecting';\n\n let newState;\n\n if (iceState === 'failed' || dtlsState === 'failed') {\n newState = RTCPeerConnectionState.FAILED;\n } else if (iceState === 'connected' && dtlsState === 'connected' && sctpState === 'connected') {\n newState = RTCPeerConnectionState.CONNECTED;\n } else if (iceState === 'checking' || dtlsState === 'connecting' || sctpState === 'connecting') {\n newState = RTCPeerConnectionState.CONNECTING;\n } else if (iceState === 'disconnected') {\n newState = RTCPeerConnectionState.DISCONNECTED;\n } else {\n newState = RTCPeerConnectionState.NEW;\n }\n\n if (newState !== this._connectionState) {\n this._connectionState = newState;\n this.emit('connectionstatechange');\n }\n }\n\n /**\n * Create a data channel.\n * @param {string} label - Channel label\n * @param {Object} [options] - Channel options\n * @returns {RTCDataChannel} Data channel\n */\n createDataChannel(label, options = {}) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n\n const channelOptions = {\n ...options,\n negotiated: options.negotiated || false\n };\n\n if (!channelOptions.negotiated) {\n channelOptions.id = this._nextChannelId++;\n }\n\n const channel = new RTCDataChannel(label, channelOptions);\n this._dataChannels.set(channelOptions.id, channel);\n\n // Emit negotiation needed\n setImmediate(() => {\n if (!this._isClosed) {\n this.emit('negotiationneeded');\n }\n });\n\n return channel;\n }\n\n /**\n * Create an SDP offer.\n * @param {Object} [options] - Offer options\n * @returns {Promise<RTCSessionDescription>} Offer description\n */\n async createOffer(options = {}) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n\n await this._initialize();\n\n // Start listening to get actual port\n const { address, port } = await this._networkTransport.listen(0, '0.0.0.0');\n \n // Get local address (try to find non-localhost)\n const os = require('os');\n const interfaces = os.networkInterfaces();\n let localAddress = '127.0.0.1';\n \n for (const [name, addrs] of Object.entries(interfaces)) {\n for (const addr of addrs) {\n if (addr.family === 'IPv4' && !addr.internal) {\n localAddress = addr.address;\n break;\n }\n }\n if (localAddress !== '127.0.0.1') break;\n }\n\n // Generate ICE credentials\n const iceCredentials = sdpUtils.generateIceCredentials();\n\n // Get fingerprints\n const fingerprints = this._certificate.getFingerprints();\n\n // Generate SDP offer with actual connection info\n const sdp = sdpUtils.generateOffer({\n iceUfrag: iceCredentials.usernameFragment,\n icePwd: iceCredentials.password,\n fingerprints,\n candidates: this._localIceCandidates,\n setup: 'actpass',\n connectionAddress: localAddress,\n connectionPort: port\n });\n\n return new RTCSessionDescription({\n type: RTCSdpType.OFFER,\n sdp\n });\n }\n\n /**\n * Create an SDP answer.\n * @param {Object} [options] - Answer options\n * @returns {Promise<RTCSessionDescription>} Answer description\n */\n async createAnswer(options = {}) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n\n if (!this._remoteDescription || this._remoteDescription.type !== 'offer') {\n throw new Error('Cannot create answer without remote offer');\n }\n\n await this._initialize();\n\n // Generate ICE credentials\n const iceCredentials = sdpUtils.generateIceCredentials();\n\n // Get fingerprints\n const fingerprints = this._certificate.getFingerprints();\n\n // Generate SDP answer\n const sdp = sdpUtils.generateAnswer({\n iceUfrag: iceCredentials.usernameFragment,\n icePwd: iceCredentials.password,\n fingerprints,\n candidates: this._localIceCandidates,\n setup: 'active'\n });\n\n return new RTCSessionDescription({\n type: RTCSdpType.ANSWER,\n sdp\n });\n }\n\n /**\n * Set the local description.\n * @param {RTCSessionDescription} [description] - Local description\n * @returns {Promise<void>}\n */\n async setLocalDescription(description) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n\n // If no description provided, create one based on signaling state\n if (!description) {\n if (this._signalingState === RTCSignalingState.HAVE_REMOTE_OFFER) {\n description = await this.createAnswer();\n } else {\n description = await this.createOffer();\n }\n }\n\n await this._initialize();\n\n this._localDescription = new RTCSessionDescription(description);\n this._pendingLocalDescription = this._localDescription;\n\n // Update signaling state\n if (description.type === 'offer') {\n this._signalingState = RTCSignalingState.HAVE_LOCAL_OFFER;\n } else if (description.type === 'answer') {\n this._signalingState = RTCSignalingState.STABLE;\n this._pendingLocalDescription = null;\n \n // Answerer: start connection when setting local answer\n if (this._remoteDescription) {\n const iceParams = sdpUtils.parseIceParameters(this._remoteDescription.sdp);\n const dtlsParams = sdpUtils.parseDtlsParameters(this._remoteDescription.sdp);\n const sctpParams = sdpUtils.parseSctpParameters(this._remoteDescription.sdp);\n await this._startConnection(iceParams, dtlsParams, sctpParams);\n }\n }\n\n // Parse and apply ICE parameters\n const iceParams = sdpUtils.parseIceParameters(description.sdp);\n \n // Start ICE gathering with configured servers\n this._iceGatheringState = RTCIceGatheringState.GATHERING;\n this.emit('icegatheringstatechange');\n \n // Gather candidates with ICE servers\n if (this._iceTransport) {\n await this._iceTransport.gather({\n iceServers: this._configuration.iceServers || []\n });\n }\n\n this.emit('signalingstatechange');\n }\n\n /**\n * Set the remote description.\n * @param {RTCSessionDescription} description - Remote description\n * @returns {Promise<void>}\n */\n async setRemoteDescription(description) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n\n if (!description || !description.sdp) {\n throw new Error('Invalid session description');\n }\n\n await this._initialize();\n\n this._remoteDescription = new RTCSessionDescription(description);\n this._pendingRemoteDescription = this._remoteDescription;\n\n // Update signaling state\n if (description.type === 'offer') {\n this._signalingState = RTCSignalingState.HAVE_REMOTE_OFFER;\n } else if (description.type === 'answer') {\n this._signalingState = RTCSignalingState.STABLE;\n this._pendingRemoteDescription = null;\n this._pendingLocalDescription = null;\n }\n\n // Parse remote parameters\n const iceParams = sdpUtils.parseIceParameters(description.sdp);\n const dtlsParams = sdpUtils.parseDtlsParameters(description.sdp);\n const sctpParams = sdpUtils.parseSctpParameters(description.sdp);\n\n // Parse remote candidates and extract connection info\n const remoteCandidates = sdpUtils.parseCandidates(description.sdp);\n this._remoteIceCandidates = remoteCandidates;\n \n // Extract connection info from SDP\n this._extractConnectionInfo(description.sdp);\n\n this.emit('signalingstatechange');\n\n // Start connection establishment if we have both descriptions\n if (this._signalingState === RTCSignalingState.STABLE) {\n await this._startConnection(iceParams, dtlsParams, sctpParams);\n }\n }\n\n /**\n * Extract connection information from SDP\n * @param {string} sdp - SDP string\n * @private\n */\n _extractConnectionInfo(sdp) {\n // Look for connection line: c=IN IP4 <address>\n const cLineMatch = sdp.match(/^c=IN IP4 ([^\\s]+)/m);\n if (cLineMatch && cLineMatch[1] !== '0.0.0.0') {\n const address = cLineMatch[1];\n \n // Look for port in media line: m=application <port>\n const mLineMatch = sdp.match(/^m=application (\\d+)/m);\n if (mLineMatch && mLineMatch[1] !== '9') {\n const port = parseInt(mLineMatch[1], 10);\n this._remoteConnectionInfo = { address, port };\n }\n }\n }\n\n /**\n * Start connection establishment\n * @param {Object} iceParams - ICE parameters\n * @param {Object} dtlsParams - DTLS parameters\n * @param {Object} sctpParams - SCTP parameters\n * @private\n */\n async _startConnection(iceParams, dtlsParams, sctpParams) {\n // Determine if we're the offerer based on setup attribute\n this._isOfferer = this._localDescription?.type === 'offer';\n\n // Start network transport\n try {\n if (this._isOfferer) {\n // Offerer already started listening in createOffer()\n // Wait for incoming connection\n } else {\n // Answerer connects to offerer\n if (this._remoteConnectionInfo) {\n await this._networkTransport.connect(\n this._remoteConnectionInfo.address,\n this._remoteConnectionInfo.port\n );\n \n // Connection established - open channels\n setImmediate(() => {\n this._openDataChannels();\n });\n }\n }\n } catch (error) {\n console.error('Failed to establish network connection:', error);\n }\n\n // Start ICE\n if (iceParams.usernameFragment && iceParams.password) {\n try {\n await this._iceTransport.start(iceParams, this._isOfferer ? 'controlling' : 'controlled');\n } catch (error) {\n console.error('Failed to start ICE:', error);\n }\n }\n\n // Add remote candidates\n for (const candidate of this._remoteIceCandidates) {\n try {\n // Parse candidate string (simplified)\n await this._iceTransport.addRemoteCandidate(candidate);\n } catch (error) {\n console.error('Failed to add remote candidate:', error);\n }\n }\n\n // Open data channels when connection is established\n this._sctpTransport.once('statechange', () => {\n if (this._sctpTransport.state === 'connected') {\n for (const channel of this._dataChannels.values()) {\n if (channel.readyState === 'connecting') {\n channel._setStateToOpen();\n \n // Hook up channel to network transport\n this._connectChannelToNetwork(channel);\n }\n }\n }\n });\n }\n\n /**\n * Connect data channel to network transport\n * @param {RTCDataChannel} channel - Data channel\n * @private\n */\n _connectChannelToNetwork(channel) {\n // Store original _send method\n const originalInternalSend = channel._send ? channel._send.bind(channel) : null;\n \n // Override the internal send to use network transport\n channel._send = async (data) => {\n try {\n const message = JSON.stringify({\n type: 'datachannel',\n label: channel.label,\n id: channel.id,\n data: data\n });\n await this._networkTransport.sendMessage(message);\n \n // Update buffered amount tracking\n if (channel._bufferedAmount > 0) {\n channel._bufferedAmount = Math.max(0, channel._bufferedAmount - (typeof data === 'string' ? data.length : 0));\n channel._emitBufferedAmountLow();\n }\n } catch (error) {\n console.error('Failed to send via network:', error);\n throw error;\n }\n };\n }\n\n /**\n * Add an ICE candidate.\n * @param {Object} [candidate] - ICE candidate\n * @returns {Promise<void>}\n */\n async addIceCandidate(candidate) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n\n if (!candidate) {\n // End of candidates signal\n this._iceGatheringState = RTCIceGatheringState.COMPLETE;\n this.emit('icegatheringstatechange');\n return;\n }\n\n await this._initialize();\n\n if (this._iceTransport) {\n this._remoteIceCandidates.push(candidate);\n \n // If connection is already started, add candidate immediately\n if (this._remoteDescription) {\n try {\n await this._iceTransport.addRemoteCandidate(candidate);\n } catch (error) {\n console.error('Failed to add ICE candidate:', error);\n }\n }\n }\n }\n\n /**\n * Get the current configuration.\n * @returns {Object} Configuration\n */\n getConfiguration() {\n return { ...this._configuration };\n }\n\n /**\n * Set the configuration.\n * @param {Object} configuration - New configuration\n */\n setConfiguration(configuration) {\n if (this._isClosed) {\n throw new Error('RTCPeerConnection is closed');\n }\n this._configuration = { ...configuration };\n }\n\n /**\n * Close the peer connection.\n */\n close() {\n if (this._isClosed) {\n return;\n }\n\n this._isClosed = true;\n this._signalingState = RTCSignalingState.CLOSED;\n this._connectionState = RTCPeerConnectionState.CLOSED;\n\n // Close all data channels\n for (const channel of this._dataChannels.values()) {\n channel.close();\n }\n\n // Close transports\n if (this._sctpTransport) {\n this._sctpTransport.close();\n }\n if (this._dtlsTransport) {\n this._dtlsTransport.close();\n }\n if (this._iceTransport) {\n this._iceTransport.stop();\n }\n\n this.emit('signalingstatechange');\n this.emit('connectionstatechange');\n }\n\n /**\n * Get the signaling state.\n * @returns {string} Signaling state\n */\n get signalingState() {\n return this._signalingState;\n }\n\n /**\n * Get the ICE gathering state.\n * @returns {string} ICE gathering state\n */\n get iceGatheringState() {\n return this._iceGatheringState;\n }\n\n /**\n * Get the ICE connection state.\n * @returns {string} ICE connection state\n */\n get iceConnectionState() {\n return this._iceTransport?.state || 'new';\n }\n\n /**\n * Get the overall connection state.\n * @returns {string} Connection state\n */\n get connectionState() {\n return this._connectionState;\n }\n\n /**\n * Get the local description.\n * @returns {RTCSessionDescription|null} Local description\n */\n get localDescription() {\n return this._localDescription;\n }\n\n /**\n * Get the remote description.\n * @returns {RTCSessionDescription|null} Remote description\n */\n get remoteDescription() {\n return this._remoteDescription;\n }\n\n /**\n * Get the current local description.\n * @returns {RTCSessionDescription|null} Current local description\n */\n get currentLocalDescription() {\n return this._signalingState === RTCSignalingState.STABLE ? this._localDescription : null;\n }\n\n /**\n * Get the pending local description.\n * @returns {RTCSessionDescription|null} Pending local description\n */\n get pendingLocalDescription() {\n return this._pendingLocalDescription;\n }\n\n /**\n * Get the current remote description.\n * @returns {RTCSessionDescription|null} Current remote description\n */\n get currentRemoteDescription() {\n return this._signalingState === RTCSignalingState.STABLE ? this._remoteDescription : null;\n }\n\n /**\n * Get the pending remote description.\n * @returns {RTCSessionDescription|null} Pending remote description\n */\n get pendingRemoteDescription() {\n return this._pendingRemoteDescription;\n }\n\n /**\n * Check if ICE candidate trickling is supported.\n * @returns {boolean} Always true\n */\n get canTrickleIceCandidates() {\n return true;\n }\n\n /**\n * Get the SCTP transport.\n * @returns {RTCSctpTransport|null} SCTP transport\n */\n get sctp() {\n return this._sctpTransport;\n }\n}\n\nmodule.exports = {\n RTCPeerConnection,\n RTCSignalingState,\n RTCIceGatheringState,\n RTCPeerConnectionState\n};\n","/**\n * @fileoverview node-rtc-connection - WebRTC DataChannel implementation for Node.js\n * \n * A clean-room implementation of WebRTC peer connections and data channels\n * for Node.js, ported from Chromium's production WebRTC code.\n * \n * This implementation focuses on DataChannel functionality without media streams.\n * Features:\n * - ICE (Interactive Connectivity Establishment)\n * - STUN/TURN support for NAT traversal\n * - DTLS encryption\n * - SCTP for reliable data channels\n * - Full WebRTC API compatibility\n * \n * @license BSD-3-Clause\n * @author nmhung1210\n */\n\n'use strict';\n\n// Foundation Layer\nconst ByteBufferQueue = require('./foundation/ByteBufferQueue');\nconst RTCError = require('./foundation/RTCError');\n\n// ICE Layer\nconst RTCIceCandidate = require('./ice/RTCIceCandidate');\nconst { \n RTCIceTransport, \n RTCIceRole, \n RTCIceTransportState, \n RTCIceGatheringState \n} = require('./ice/RTCIceTransport');\n\n// DTLS Layer\nconst RTCCertificate = require('./dtls/RTCCertificate');\nconst { RTCDtlsTransport, RTCDtlsTransportState } = require('./dtls/RTCDtlsTransport');\n\n// SCTP Layer\nconst { RTCSctpTransport, RTCSctpTransportState } = require('./sctp/RTCSctpTransport');\n\n// DataChannel Layer\nconst { RTCDataChannel, RTCDataChannelState } = require('./datachannel/RTCDataChannel');\n\n// SDP Layer\nconst { RTCSessionDescription, RTCSdpType } = require('./sdp/RTCSessionDescription');\n\n// PeerConnection Layer\nconst { \n RTCPeerConnection, \n RTCSignalingState, \n RTCIceGatheringState: RTCIceGatheringStatePC,\n RTCPeerConnectionState \n} = require('./peerconnection/RTCPeerConnection');\n\n// Export all public APIs\nmodule.exports = {\n // Foundation\n ByteBufferQueue,\n RTCError,\n \n // ICE\n RTCIceCandidate,\n RTCIceTransport,\n RTCIceRole,\n RTCIceTransportState,\n RTCIceGatheringState,\n \n // DTLS\n RTCCertificate,\n RTCDtlsTransport,\n RTCDtlsTransportState,\n \n // SCTP\n RTCSctpTransport,\n RTCSctpTransportState,\n \n // DataChannel\n RTCDataChannel,\n RTCDataChannelState,\n \n // SDP\n RTCSessionDescription,\n RTCSdpType,\n \n // PeerConnection\n RTCPeerConnection,\n RTCSignalingState,\n RTCPeerConnectionState,\n \n // Version\n version: require('../package.json').version\n};\n","import { getDefaultExportFromCjs } from \"\u0000commonjsHelpers.js\";\nimport { __require as requireSrc } from \"/home/runner/work/nodertc/nodertc/src/index.js\";\nvar srcExports = requireSrc();\nexport { srcExports as __moduleExports };\nexport default /*@__PURE__*/getDefaultExportFromCjs(srcExports);"],"names":["require$$1","require$$0","require$$2","require$$4","require$$3","require$$5","require$$6","require$$7","require$$8","require$$9"],"mappings":"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"}