node-rtc-connection 1.0.11 → 1.0.14

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.mjs","sources":["../src/RTCDataChannel.js","../src/RTCSessionDescription.js","../src/RTCIceCandidate.js","../src/STUNClient.js","../src/TURNClient.js","../src/ICEGatherer.js","../src/SecureConnection.js","../src/UDPTransport.js","../src/NativePeerConnectionFactory.js","../src/RTCPeerConnection.js","../src/RTCDataChannelEvent.js","../src/RTCPeerConnectionIceEvent.js","../src/RTCError.js","../src/index.js","../src/index.js?commonjs-entry"],"sourcesContent":["const EventEmitter = require('events');\n\n/**\n * RTCDataChannel represents a bidirectional data channel between two peers.\n * Ported from Chromium's implementation, DataChannel-only functionality.\n */\nclass RTCDataChannel extends EventEmitter {\n constructor(nativeChannel, peerConnectionHandler) {\n super();\n \n this._nativeChannel = nativeChannel;\n this._peerConnectionHandler = peerConnectionHandler;\n this._state = 'connecting';\n this._binaryType = 'arraybuffer';\n this._bufferedAmount = 0;\n this._bufferedAmountLowThreshold = 0;\n this._closed = false;\n this._scheduledEvents = [];\n \n // Setup native channel observers\n this._setupObservers();\n }\n\n /**\n * The label specified when creating the data channel\n */\n get label() {\n return this._nativeChannel ? this._nativeChannel.label : '';\n }\n\n /**\n * Whether the channel is ordered or allows out-of-order delivery\n */\n get ordered() {\n return this._nativeChannel ? this._nativeChannel.ordered : true;\n }\n\n /**\n * Maximum packet lifetime in milliseconds\n */\n get maxPacketLifeTime() {\n if (!this._nativeChannel) return null;\n const lifetime = this._nativeChannel.maxPacketLifeTime;\n return lifetime >= 0 ? lifetime : null;\n }\n\n /**\n * Maximum number of retransmit attempts\n */\n get maxRetransmits() {\n if (!this._nativeChannel) return null;\n const retransmits = this._nativeChannel.maxRetransmits;\n return retransmits >= 0 ? retransmits : null;\n }\n\n /**\n * Subprotocol name\n */\n get protocol() {\n return this._nativeChannel ? this._nativeChannel.protocol : '';\n }\n\n /**\n * Whether the channel was negotiated by the application or the WebRTC layer\n */\n get negotiated() {\n return this._nativeChannel ? this._nativeChannel.negotiated : false;\n }\n\n /**\n * The ID for this data channel\n */\n get id() {\n if (!this._nativeChannel) return null;\n const channelId = this._nativeChannel.id;\n return channelId >= 0 ? channelId : null;\n }\n\n /**\n * The state of the data channel\n * Values: 'connecting', 'open', 'closing', 'closed'\n */\n get readyState() {\n return this._state;\n }\n\n /**\n * The number of bytes currently queued to be sent\n */\n get bufferedAmount() {\n return this._bufferedAmount;\n }\n\n /**\n * Threshold for the bufferedAmount at which bufferedamountlow event fires\n */\n get bufferedAmountLowThreshold() {\n return this._bufferedAmountLowThreshold;\n }\n\n set bufferedAmountLowThreshold(value) {\n this._bufferedAmountLowThreshold = value;\n }\n\n /**\n * Format for received binary data: 'blob' or 'arraybuffer'\n */\n get binaryType() {\n return this._binaryType;\n }\n\n set binaryType(value) {\n if (value !== 'blob' && value !== 'arraybuffer') {\n throw new Error('binaryType must be either \"blob\" or \"arraybuffer\"');\n }\n this._binaryType = value;\n }\n\n /**\n * Send data over the channel\n * @param {string|ArrayBuffer|ArrayBufferView} data - Data to send\n */\n send(data) {\n if (this._state !== 'open') {\n throw new Error('RTCDataChannel.send() called on a channel that is not open');\n }\n\n if (!this._nativeChannel) {\n throw new Error('Native data channel is not available');\n }\n\n let buffer;\n let isBinary = false;\n\n if (typeof data === 'string') {\n buffer = Buffer.from(data, 'utf8');\n isBinary = false;\n } else if (data instanceof ArrayBuffer) {\n buffer = Buffer.from(data);\n isBinary = true;\n } else if (ArrayBuffer.isView(data)) {\n buffer = Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n isBinary = true;\n } else {\n throw new Error('Unsupported data type');\n }\n\n const length = buffer.length;\n \n // Validate send length\n if (length > 65536) { // Maximum WebRTC message size\n throw new Error('Message too long');\n }\n\n this._bufferedAmount += length;\n \n // Send through native channel\n try {\n this._nativeChannel.send({\n data: buffer,\n binary: isBinary\n });\n } catch (error) {\n throw new Error(`Failed to send data: ${error.message}`);\n }\n }\n\n /**\n * Close the data channel\n */\n close() {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n\n if (this._nativeChannel) {\n this._nativeChannel.close();\n }\n\n if (this._state === 'closing' || this._state === 'closed') {\n return;\n }\n\n this._setState('closing');\n }\n\n /**\n * Setup observers for the native channel\n * @private\n */\n _setupObservers() {\n if (!this._nativeChannel) {\n return;\n }\n\n // State change observer\n this._nativeChannel.on('statechange', (state) => {\n this._onStateChange(state);\n });\n\n // Message observer\n this._nativeChannel.on('message', (buffer) => {\n this._onMessage(buffer);\n });\n\n // Buffered amount change observer\n this._nativeChannel.on('bufferedamountlow', (amount) => {\n this._onBufferedAmountChange(amount);\n });\n\n // Error observer\n this._nativeChannel.on('error', (error) => {\n this.emit('error', error);\n });\n }\n\n /**\n * Handle state change from native channel\n * @private\n */\n _onStateChange(state) {\n let newState;\n let shouldEmitOpen = false;\n let shouldEmitClosing = false;\n let shouldEmitClose = false;\n \n switch (state) {\n case 0: // kConnecting\n newState = 'connecting';\n break;\n case 1: // kOpen\n newState = 'open';\n shouldEmitOpen = true;\n break;\n case 2: // kClosing\n newState = 'closing';\n shouldEmitClosing = true;\n break;\n case 3: // kClosed\n newState = 'closed';\n shouldEmitClose = true;\n break;\n default:\n return;\n }\n \n // Only update state if it actually changed\n if (this._readyState !== newState) {\n this._setState(newState);\n }\n \n // Emit events AFTER state is updated\n if (shouldEmitOpen) {\n this.emit('open');\n }\n if (shouldEmitClosing) {\n this.emit('closing');\n }\n if (shouldEmitClose) {\n this.emit('close');\n }\n }\n\n /**\n * Handle incoming message from native channel\n * @private\n */\n _onMessage(buffer) {\n if (this._state !== 'open') {\n return;\n }\n\n let data;\n if (buffer.binary) {\n if (this._binaryType === 'arraybuffer') {\n data = buffer.data.buffer.slice(\n buffer.data.byteOffset,\n buffer.data.byteOffset + buffer.data.byteLength\n );\n } else {\n // For 'blob' type, we'll just pass the buffer\n // In a browser environment, this would be converted to a Blob\n data = buffer.data;\n }\n } else {\n data = buffer.data.toString('utf8');\n }\n\n this.emit('message', { data });\n }\n\n /**\n * Handle buffered amount change from native channel\n * @private\n */\n _onBufferedAmountChange(newAmount) {\n const previousAmount = this._bufferedAmount;\n this._bufferedAmount = newAmount;\n\n if (previousAmount > this._bufferedAmountLowThreshold &&\n newAmount <= this._bufferedAmountLowThreshold) {\n this.emit('bufferedamountlow');\n }\n }\n\n /**\n * Set the channel state\n * @private\n */\n _setState(state) {\n if (this._state === state) {\n return;\n }\n this._state = state;\n }\n\n /**\n * Set state to open without dispatching event (used for remote channels)\n */\n setStateToOpenWithoutEvent() {\n this._setState('open');\n }\n\n /**\n * Dispatch open event (used for remote channels)\n */\n dispatchOpenEvent() {\n this.emit('open');\n }\n\n /**\n * Dispose of resources\n */\n dispose() {\n if (this._nativeChannel) {\n this._nativeChannel.removeAllListeners();\n this._nativeChannel = null;\n }\n this._peerConnectionHandler = null;\n this.removeAllListeners();\n }\n}\n\nmodule.exports = RTCDataChannel;\n","/**\n * RTCSessionDescription represents a session description.\n * Ported from Chromium's implementation.\n */\nclass RTCSessionDescription {\n constructor(descriptionInitDict = {}) {\n this._type = descriptionInitDict.type || '';\n this._sdp = descriptionInitDict.sdp || '';\n \n // Validate type\n const validTypes = ['offer', 'answer', 'pranswer', 'rollback'];\n if (this._type && !validTypes.includes(this._type)) {\n throw new Error(`Invalid type: ${this._type}`);\n }\n }\n\n /**\n * The type of session description\n * Values: 'offer', 'answer', 'pranswer', 'rollback'\n */\n get type() {\n return this._type;\n }\n\n set type(value) {\n const validTypes = ['offer', 'answer', 'pranswer', 'rollback'];\n if (value && !validTypes.includes(value)) {\n throw new Error(`Invalid type: ${value}`);\n }\n this._type = value;\n }\n\n /**\n * The SDP string\n */\n get sdp() {\n return this._sdp;\n }\n\n set sdp(value) {\n this._sdp = value || '';\n }\n\n /**\n * Convert to JSON\n */\n toJSON() {\n return {\n type: this._type,\n sdp: this._sdp\n };\n }\n\n /**\n * Convert to string\n */\n toString() {\n return `RTCSessionDescription { type: \"${this._type}\", sdp: \"${this._sdp.substring(0, 50)}...\" }`;\n }\n}\n\nmodule.exports = RTCSessionDescription;\n","/**\n * RTCIceCandidate represents an ICE candidate.\n * Ported from Chromium's implementation.\n */\nclass RTCIceCandidate {\n constructor(candidateInitDict = {}) {\n this._candidate = candidateInitDict.candidate || '';\n this._sdpMid = candidateInitDict.sdpMid || null;\n this._sdpMLineIndex = candidateInitDict.sdpMLineIndex !== undefined \n ? candidateInitDict.sdpMLineIndex \n : null;\n this._usernameFragment = candidateInitDict.usernameFragment || null;\n \n // Parse candidate string if provided\n if (this._candidate) {\n this._parseCandidateString();\n }\n }\n\n /**\n * The candidate string\n */\n get candidate() {\n return this._candidate;\n }\n\n /**\n * The media stream identification tag\n */\n get sdpMid() {\n return this._sdpMid;\n }\n\n /**\n * The media line index\n */\n get sdpMLineIndex() {\n return this._sdpMLineIndex;\n }\n\n /**\n * The username fragment\n */\n get usernameFragment() {\n return this._usernameFragment;\n }\n\n /**\n * The foundation\n */\n get foundation() {\n return this._foundation || null;\n }\n\n /**\n * The component (RTP or RTCP)\n */\n get component() {\n return this._component || null;\n }\n\n /**\n * The priority\n */\n get priority() {\n return this._priority || null;\n }\n\n /**\n * The IP address\n */\n get address() {\n return this._address || null;\n }\n\n /**\n * The protocol (udp or tcp)\n */\n get protocol() {\n return this._protocol || null;\n }\n\n /**\n * The port\n */\n get port() {\n return this._port || null;\n }\n\n /**\n * The candidate type (host, srflx, prflx, or relay)\n */\n get type() {\n return this._type || null;\n }\n\n /**\n * The TCP type (active, passive, or so)\n */\n get tcpType() {\n return this._tcpType || null;\n }\n\n /**\n * The related address (for non-host candidates)\n */\n get relatedAddress() {\n return this._relatedAddress || null;\n }\n\n /**\n * The related port (for non-host candidates)\n */\n get relatedPort() {\n return this._relatedPort || null;\n }\n\n /**\n * Parse the candidate string to extract individual fields\n * @private\n */\n _parseCandidateString() {\n if (!this._candidate || !this._candidate.startsWith('candidate:')) {\n return;\n }\n\n // Basic parsing of candidate string\n // Format: candidate:<foundation> <component> <protocol> <priority> <address> <port> typ <type> ...\n const parts = this._candidate.split(' ');\n \n if (parts.length >= 8) {\n this._foundation = parts[0].replace('candidate:', '');\n this._component = parts[1];\n this._protocol = parts[2];\n this._priority = parseInt(parts[3], 10);\n this._address = parts[4];\n this._port = parseInt(parts[5], 10);\n // parts[6] is 'typ'\n this._type = parts[7];\n \n // Parse optional fields\n for (let i = 8; i < parts.length; i += 2) {\n const key = parts[i];\n const value = parts[i + 1];\n \n switch (key) {\n case 'raddr':\n this._relatedAddress = value;\n break;\n case 'rport':\n this._relatedPort = parseInt(value, 10);\n break;\n case 'tcptype':\n this._tcpType = value;\n break;\n case 'ufrag':\n this._usernameFragment = value;\n break;\n }\n }\n }\n }\n\n /**\n * Convert to JSON\n */\n toJSON() {\n return {\n candidate: this._candidate,\n sdpMid: this._sdpMid,\n sdpMLineIndex: this._sdpMLineIndex,\n usernameFragment: this._usernameFragment\n };\n }\n\n /**\n * Convert to string\n */\n toString() {\n return `RTCIceCandidate { candidate: \"${this._candidate}\", sdpMid: \"${this._sdpMid}\", sdpMLineIndex: ${this._sdpMLineIndex} }`;\n }\n}\n\nmodule.exports = RTCIceCandidate;\n","/**\n * STUN Client Implementation (RFC 5389)\n * Pure Node.js implementation using dgram\n */\n\nconst dgram = require('dgram');\nconst crypto = require('crypto');\n\n// STUN Message Types\nconst STUN_BINDING_REQUEST = 0x0001;\nconst STUN_BINDING_RESPONSE = 0x0101;\n\n// STUN Attributes\nconst ATTR_MAPPED_ADDRESS = 0x0001;\nconst ATTR_XOR_MAPPED_ADDRESS = 0x0020;\n\n// STUN Magic Cookie\nconst MAGIC_COOKIE = 0x2112A442;\n\nclass STUNClient {\n constructor() {\n this.socket = null;\n this.timeout = 5000;\n }\n\n /**\n * Get public IP and port by querying STUN server\n * @param {string} stunServer - STUN server address (e.g., 'stun.l.google.com:19302')\n * @returns {Promise<{ip: string, port: number, type: string}>}\n */\n async getReflexiveAddress(stunServer = 'stun.l.google.com:19302') {\n return new Promise((resolve, reject) => {\n const [host, portStr] = stunServer.split(':');\n const port = parseInt(portStr, 10);\n\n // Create UDP socket\n this.socket = dgram.createSocket('udp4');\n \n const transactionId = crypto.randomBytes(12);\n let resolved = false;\n\n const timeout = setTimeout(() => {\n if (!resolved) {\n resolved = true;\n this.socket.close();\n reject(new Error('STUN request timeout'));\n }\n }, this.timeout);\n\n this.socket.on('error', (err) => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timeout);\n this.socket.close();\n reject(err);\n }\n });\n\n this.socket.on('message', (msg) => {\n if (resolved) return;\n\n try {\n const result = this._parseSTUNResponse(msg, transactionId);\n if (result) {\n resolved = true;\n clearTimeout(timeout);\n this.socket.close();\n resolve(result);\n }\n } catch (err) {\n resolved = true;\n clearTimeout(timeout);\n this.socket.close();\n reject(err);\n }\n });\n\n // Send STUN Binding Request\n const request = this._createBindingRequest(transactionId);\n this.socket.send(request, port, host, (err) => {\n if (err && !resolved) {\n resolved = true;\n clearTimeout(timeout);\n this.socket.close();\n reject(err);\n }\n });\n });\n }\n\n /**\n * Create STUN Binding Request\n * @private\n */\n _createBindingRequest(transactionId) {\n const buffer = Buffer.allocUnsafe(20);\n \n // Message Type (2 bytes)\n buffer.writeUInt16BE(STUN_BINDING_REQUEST, 0);\n \n // Message Length (2 bytes) - 0 for no attributes\n buffer.writeUInt16BE(0, 2);\n \n // Magic Cookie (4 bytes)\n buffer.writeUInt32BE(MAGIC_COOKIE, 4);\n \n // Transaction ID (12 bytes)\n transactionId.copy(buffer, 8);\n \n return buffer;\n }\n\n /**\n * Parse STUN Response\n * @private\n */\n _parseSTUNResponse(msg, expectedTransactionId) {\n if (msg.length < 20) {\n throw new Error('Invalid STUN response: too short');\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 // Verify this is a binding response\n if (messageType !== STUN_BINDING_RESPONSE) {\n return null;\n }\n\n // Verify magic cookie\n if (magicCookie !== MAGIC_COOKIE) {\n throw new Error('Invalid STUN response: bad magic cookie');\n }\n\n // Verify transaction ID\n if (!transactionId.equals(expectedTransactionId)) {\n return null;\n }\n\n // Parse attributes\n let offset = 20;\n while (offset < 20 + messageLength) {\n const attrType = msg.readUInt16BE(offset);\n const attrLength = msg.readUInt16BE(offset + 2);\n const attrValue = msg.slice(offset + 4, offset + 4 + attrLength);\n\n if (attrType === ATTR_XOR_MAPPED_ADDRESS) {\n return this._parseXorMappedAddress(attrValue, transactionId);\n } else if (attrType === ATTR_MAPPED_ADDRESS) {\n return this._parseMappedAddress(attrValue);\n }\n\n // Move to next attribute (with padding)\n offset += 4 + attrLength;\n if (attrLength % 4 !== 0) {\n offset += 4 - (attrLength % 4);\n }\n }\n\n throw new Error('No mapped address in STUN response');\n }\n\n /**\n * Parse XOR-MAPPED-ADDRESS attribute\n * @private\n */\n _parseXorMappedAddress(value, transactionId) {\n const family = value.readUInt8(1);\n const xPort = value.readUInt16BE(2);\n const xAddress = value.slice(4, 8);\n\n // XOR with magic cookie\n const port = xPort ^ (MAGIC_COOKIE >> 16);\n \n const addressBytes = Buffer.allocUnsafe(4);\n const magicBytes = Buffer.allocUnsafe(4);\n magicBytes.writeUInt32BE(MAGIC_COOKIE, 0);\n \n for (let i = 0; i < 4; i++) {\n addressBytes[i] = xAddress[i] ^ magicBytes[i];\n }\n\n const ip = Array.from(addressBytes).join('.');\n\n return {\n ip,\n port,\n type: 'srflx' // Server Reflexive\n };\n }\n\n /**\n * Parse MAPPED-ADDRESS attribute\n * @private\n */\n _parseMappedAddress(value) {\n const family = value.readUInt8(1);\n const port = value.readUInt16BE(2);\n const addressBytes = value.slice(4, 8);\n const ip = Array.from(addressBytes).join('.');\n\n return {\n ip,\n port,\n type: 'srflx'\n };\n }\n\n /**\n * Close the socket\n */\n close() {\n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n }\n}\n\nmodule.exports = STUNClient;\n","/**\n * TURN Client Implementation (RFC 5766)\n * Pure Node.js implementation using dgram and net\n */\n\nconst dgram = require('dgram');\nconst net = require('net');\nconst crypto = require('crypto');\n\n// TURN Message Types\nconst TURN_ALLOCATE_REQUEST = 0x0003;\nconst TURN_ALLOCATE_RESPONSE = 0x0103;\nconst TURN_ALLOCATE_ERROR = 0x0113;\nconst TURN_REFRESH_REQUEST = 0x0004;\nconst TURN_CREATE_PERMISSION = 0x0008;\nconst TURN_CHANNEL_BIND = 0x0009;\nconst TURN_SEND_INDICATION = 0x0016;\nconst TURN_DATA_INDICATION = 0x0017;\n\n// TURN Attributes\nconst ATTR_XOR_RELAYED_ADDRESS = 0x0016;\nconst ATTR_XOR_MAPPED_ADDRESS = 0x0020;\nconst ATTR_LIFETIME = 0x000D;\nconst ATTR_USERNAME = 0x0006;\nconst ATTR_MESSAGE_INTEGRITY = 0x0008;\nconst ATTR_ERROR_CODE = 0x0009;\nconst ATTR_REALM = 0x0014;\nconst ATTR_NONCE = 0x0015;\nconst ATTR_XOR_PEER_ADDRESS = 0x0012;\nconst ATTR_DATA = 0x0013;\nconst ATTR_REQUESTED_TRANSPORT = 0x0019;\n\n// STUN Magic Cookie\nconst MAGIC_COOKIE = 0x2112A442;\n\nclass TURNClient {\n constructor(options = {}) {\n this.server = options.server; // 'turn:server:port' or {host, port}\n this.username = options.username || 'user';\n this.password = options.password || 'pass';\n this.transport = options.transport || 'udp'; // 'udp' or 'tcp'\n this.socket = null;\n this.timeout = options.timeout || 10000;\n this.relayedAddress = null;\n this.lifetime = 600; // Default 10 minutes\n this.allocation = null;\n \n // Authentication state for MESSAGE-INTEGRITY\n this.realm = null;\n this.nonce = null;\n this.authenticated = false;\n }\n\n /**\n * Parse TURN server URI\n * @private\n */\n _parseServer() {\n if (typeof this.server === 'object') {\n return this.server;\n }\n\n const match = this.server.match(/^turn:(.+):(\\d+)$/);\n if (match) {\n return { host: match[1], port: parseInt(match[2], 10) };\n }\n\n // Default TURN port\n return { host: this.server, port: 3478 };\n }\n\n /**\n * Allocate a relay address on TURN server\n * @returns {Promise<{relayedAddress: string, relayedPort: number, mappedAddress: string, mappedPort: number}>}\n */\n async allocate() {\n const serverInfo = this._parseServer();\n const transactionId = crypto.randomBytes(12);\n \n return new Promise((resolve, reject) => {\n let resolved = false;\n\n const timeout = setTimeout(() => {\n if (!resolved) {\n resolved = true;\n this.close();\n reject(new Error('TURN allocation timeout'));\n }\n }, this.timeout);\n\n // Create socket based on transport\n if (this.transport === 'udp') {\n this.socket = dgram.createSocket('udp4');\n } else {\n this.socket = new net.Socket();\n }\n\n this.socket.on('error', (err) => {\n if (!resolved) {\n resolved = true;\n clearTimeout(timeout);\n this.close();\n reject(err);\n }\n });\n\n const handleMessage = (msg) => {\n if (resolved) return;\n\n try {\n const result = this._parseAllocateResponse(msg);\n if (result) {\n resolved = true;\n clearTimeout(timeout);\n this.relayedAddress = result.relayedAddress;\n this.allocation = result;\n resolve(result);\n }\n } catch (err) {\n // Check if this is a 401 Unauthorized requiring authentication\n if (err.message.includes('401') && !this.authenticated && this.realm && this.nonce) {\n // Clear the error handler and retry with authentication\n clearTimeout(timeout);\n this._retryAllocationWithAuth(serverInfo, transactionId)\n .then(result => {\n resolved = true;\n resolve(result);\n })\n .catch(authErr => {\n resolved = true;\n this.close();\n reject(authErr);\n });\n } else {\n resolved = true;\n clearTimeout(timeout);\n this.close();\n reject(err);\n }\n }\n };\n\n if (this.transport === 'udp') {\n this.socket.on('message', handleMessage);\n } else {\n this.socket.on('data', handleMessage);\n }\n\n // Connect and send allocation request\n const sendRequest = () => {\n const request = this._createAllocateRequest(transactionId);\n\n if (this.transport === 'udp') {\n this.socket.send(request, serverInfo.port, serverInfo.host, (err) => {\n if (err && !resolved) {\n resolved = true;\n clearTimeout(timeout);\n this.close();\n reject(err);\n }\n });\n } else {\n this.socket.write(request);\n }\n };\n\n if (this.transport === 'tcp') {\n this.socket.connect(serverInfo.port, serverInfo.host, sendRequest);\n } else {\n sendRequest();\n }\n });\n }\n\n /**\n * Create TURN Allocate Request\n * @private\n */\n _createAllocateRequest(transactionId, withAuth = false) {\n const attributes = [];\n\n // REQUESTED-TRANSPORT attribute (UDP = 17)\n const transportAttr = Buffer.allocUnsafe(8);\n transportAttr.writeUInt16BE(ATTR_REQUESTED_TRANSPORT, 0);\n transportAttr.writeUInt16BE(4, 2);\n transportAttr.writeUInt8(17, 4); // UDP protocol\n transportAttr.writeUInt8(0, 5);\n transportAttr.writeUInt8(0, 6);\n transportAttr.writeUInt8(0, 7);\n attributes.push(transportAttr);\n\n // Add authentication attributes if needed\n if (withAuth && this.username && this.realm && this.nonce) {\n // USERNAME attribute\n const usernameAttr = this._createStringAttribute(0x0006, this.username);\n attributes.push(usernameAttr);\n \n // REALM attribute\n const realmAttr = this._createStringAttribute(0x0014, this.realm);\n attributes.push(realmAttr);\n \n // NONCE attribute\n const nonceAttr = this._createStringAttribute(0x0015, this.nonce);\n attributes.push(nonceAttr);\n }\n\n // Calculate total attributes length (before MESSAGE-INTEGRITY)\n let attrLength = 0;\n for (const attr of attributes) {\n attrLength += attr.length;\n }\n\n // If using auth, add MESSAGE-INTEGRITY (will be added after header)\n let messageIntegrityAttr = null;\n if (withAuth && this.username && this.realm && this.nonce && this.password) {\n attrLength += 24; // MESSAGE-INTEGRITY attribute size (4 + 20)\n }\n\n // STUN header\n const header = Buffer.allocUnsafe(20);\n header.writeUInt16BE(TURN_ALLOCATE_REQUEST, 0);\n header.writeUInt16BE(attrLength, 2);\n header.writeUInt32BE(MAGIC_COOKIE, 4);\n transactionId.copy(header, 8);\n\n // Combine header and attributes\n let message = Buffer.concat([header, ...attributes]);\n \n // Add MESSAGE-INTEGRITY if using auth\n if (withAuth && this.username && this.realm && this.nonce && this.password) {\n messageIntegrityAttr = this._createMessageIntegrity(message);\n message = Buffer.concat([message, messageIntegrityAttr]);\n }\n\n return message;\n }\n\n /**\n * Parse TURN Allocate Response\n * @private\n */\n _parseAllocateResponse(msg) {\n if (msg.length < 20) {\n throw new Error('Invalid TURN response: too short');\n }\n\n const messageType = msg.readUInt16BE(0);\n const messageLength = msg.readUInt16BE(2);\n const magicCookie = msg.readUInt32BE(4);\n\n // Check if this is an allocate response\n if (messageType === TURN_ALLOCATE_ERROR) {\n const error = this._parseErrorCode(msg);\n \n // If 401 Unauthorized, extract REALM and NONCE for retry\n if (error.includes('401')) {\n this._extractAuthAttributes(msg);\n }\n \n throw new Error(`TURN allocation failed: ${error}`);\n }\n\n if (messageType !== TURN_ALLOCATE_RESPONSE) {\n return null;\n }\n\n // Verify magic cookie\n if (magicCookie !== MAGIC_COOKIE) {\n throw new Error('Invalid TURN response: bad magic cookie');\n }\n\n // Parse attributes\n const result = {};\n let offset = 20;\n\n while (offset < 20 + messageLength) {\n const attrType = msg.readUInt16BE(offset);\n const attrLength = msg.readUInt16BE(offset + 2);\n const attrValue = msg.slice(offset + 4, offset + 4 + attrLength);\n\n if (attrType === ATTR_XOR_RELAYED_ADDRESS) {\n const addr = this._parseXorAddress(attrValue, msg.slice(8, 20));\n result.relayedAddress = addr.ip;\n result.relayedPort = addr.port;\n result.type = 'relay';\n } else if (attrType === ATTR_XOR_MAPPED_ADDRESS) {\n const addr = this._parseXorAddress(attrValue, msg.slice(8, 20));\n result.mappedAddress = addr.ip;\n result.mappedPort = addr.port;\n } else if (attrType === ATTR_LIFETIME) {\n this.lifetime = attrValue.readUInt32BE(0);\n result.lifetime = this.lifetime;\n }\n\n // Move to next attribute (with padding)\n offset += 4 + attrLength;\n if (attrLength % 4 !== 0) {\n offset += 4 - (attrLength % 4);\n }\n }\n\n if (!result.relayedAddress) {\n throw new Error('No relayed address in TURN response');\n }\n\n return result;\n }\n\n /**\n * Parse XOR address attribute\n * @private\n */\n _parseXorAddress(value, transactionId) {\n const family = value.readUInt8(1);\n const xPort = value.readUInt16BE(2);\n const xAddress = value.slice(4, 8);\n\n // XOR with magic cookie\n const port = xPort ^ (MAGIC_COOKIE >> 16);\n \n const addressBytes = Buffer.allocUnsafe(4);\n const magicBytes = Buffer.allocUnsafe(4);\n magicBytes.writeUInt32BE(MAGIC_COOKIE, 0);\n \n for (let i = 0; i < 4; i++) {\n addressBytes[i] = xAddress[i] ^ magicBytes[i];\n }\n\n const ip = Array.from(addressBytes).join('.');\n\n return { ip, port };\n }\n\n /**\n * Parse error code attribute\n * @private\n */\n _parseErrorCode(msg) {\n let offset = 20;\n const messageLength = msg.readUInt16BE(2);\n\n while (offset < 20 + messageLength) {\n const attrType = msg.readUInt16BE(offset);\n const attrLength = msg.readUInt16BE(offset + 2);\n const attrValue = msg.slice(offset + 4, offset + 4 + attrLength);\n\n if (attrType === ATTR_ERROR_CODE) {\n const errorClass = attrValue.readUInt8(2);\n const errorNumber = attrValue.readUInt8(3);\n const errorCode = errorClass * 100 + errorNumber;\n const errorText = attrValue.slice(4).toString('utf8');\n return `${errorCode} ${errorText}`;\n }\n\n offset += 4 + attrLength;\n if (attrLength % 4 !== 0) {\n offset += 4 - (attrLength % 4);\n }\n }\n\n return 'Unknown error';\n }\n\n /**\n * Refresh the allocation\n * @param {number} lifetime - New lifetime in seconds\n */\n async refresh(lifetime = 600) {\n if (!this.allocation) {\n throw new Error('No active allocation');\n }\n\n // Send refresh request\n // Implementation similar to allocate()\n this.lifetime = lifetime;\n }\n\n /**\n * Send data through TURN relay\n * @param {Buffer} data - Data to send\n * @param {string} peerAddress - Peer IP address\n * @param {number} peerPort - Peer port\n */\n async send(data, peerAddress, peerPort) {\n if (!this.allocation) {\n throw new Error('No active allocation');\n }\n\n // Create Send Indication message\n const transactionId = crypto.randomBytes(12);\n const message = this._createSendIndication(data, peerAddress, peerPort, transactionId);\n\n const serverInfo = this._parseServer();\n\n if (this.transport === 'udp') {\n this.socket.send(message, serverInfo.port, serverInfo.host);\n } else {\n this.socket.write(message);\n }\n }\n\n /**\n * Create Send Indication message\n * @private\n */\n _createSendIndication(data, peerAddress, peerPort, transactionId) {\n // Implementation of TURN Send Indication\n // For now, simplified version\n const header = Buffer.allocUnsafe(20);\n header.writeUInt16BE(TURN_SEND_INDICATION, 0);\n header.writeUInt16BE(data.length, 2);\n header.writeUInt32BE(MAGIC_COOKIE, 4);\n transactionId.copy(header, 8);\n\n return Buffer.concat([header, data]);\n }\n\n /**\n * Close the TURN client\n */\n close() {\n if (this.socket) {\n if (this.transport === 'udp') {\n this.socket.close();\n } else {\n this.socket.destroy();\n }\n this.socket = null;\n }\n this.allocation = null;\n this.relayedAddress = null;\n }\n\n /**\n * Extract authentication attributes (REALM, NONCE) from error response\n * @private\n */\n _extractAuthAttributes(msg) {\n let offset = 20;\n const messageLength = msg.readUInt16BE(2);\n\n while (offset < 20 + messageLength) {\n const attrType = msg.readUInt16BE(offset);\n const attrLength = msg.readUInt16BE(offset + 2);\n\n if (attrType === 0x0014) { // REALM\n this.realm = msg.slice(offset + 4, offset + 4 + attrLength).toString('utf8');\n } else if (attrType === 0x0015) { // NONCE\n this.nonce = msg.slice(offset + 4, offset + 4 + attrLength).toString('utf8');\n }\n\n offset += 4 + attrLength;\n const padding = (4 - (attrLength % 4)) % 4;\n offset += padding;\n }\n }\n\n /**\n * Create a string attribute (USERNAME, REALM, NONCE)\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 \n const attr = Buffer.alloc(4 + length + padding);\n attr.writeUInt16BE(type, 0);\n attr.writeUInt16BE(length, 2);\n valueBuffer.copy(attr, 4);\n \n return attr;\n }\n\n /**\n * Create MESSAGE-INTEGRITY attribute (RFC 5766 Section 15.4)\n * @private\n */\n _createMessageIntegrity(message) {\n // Compute key = MD5(username:realm:password)\n const keyString = `${this.username}:${this.realm}:${this.password}`;\n const key = crypto.createHash('md5').update(keyString).digest();\n \n // Compute HMAC-SHA1 of the message\n const hmac = crypto.createHmac('sha1', key).update(message).digest();\n \n // Create MESSAGE-INTEGRITY attribute (type 0x0008)\n const attr = Buffer.alloc(24);\n attr.writeUInt16BE(0x0008, 0); // MESSAGE-INTEGRITY\n attr.writeUInt16BE(20, 2); // SHA1 hash is 20 bytes\n hmac.copy(attr, 4);\n \n return attr;\n }\n\n /**\n * Retry allocation with authentication after 401\n * @private\n */\n _retryAllocationWithAuth(serverInfo, transactionId) {\n return new Promise((resolve, reject) => {\n this.authenticated = true;\n \n const request = this._createAllocateRequest(transactionId, true);\n \n let resolved = false;\n const timeout = setTimeout(() => {\n if (!resolved) {\n resolved = true;\n this.close();\n reject(new Error('TURN authenticated allocation timeout'));\n }\n }, this.timeout);\n\n const handleAuthMessage = (msg) => {\n if (resolved) return;\n\n try {\n const result = this._parseAllocateResponse(msg);\n if (result) {\n resolved = true;\n clearTimeout(timeout);\n if (this.socket) {\n this.socket.removeListener('message', handleAuthMessage);\n this.socket.removeListener('data', handleAuthMessage);\n }\n this.relayedAddress = result.relayedAddress;\n this.allocation = result;\n resolve(result);\n }\n } catch (err) {\n resolved = true;\n clearTimeout(timeout);\n if (this.socket) {\n this.socket.removeListener('message', handleAuthMessage);\n this.socket.removeListener('data', handleAuthMessage);\n }\n this.close();\n reject(err);\n }\n };\n\n if (this.transport === 'udp') {\n this.socket.on('message', handleAuthMessage);\n this.socket.send(request, serverInfo.port, serverInfo.host, (err) => {\n if (err && !resolved) {\n resolved = true;\n clearTimeout(timeout);\n this.close();\n reject(err);\n }\n });\n } else {\n this.socket.on('data', handleAuthMessage);\n this.socket.write(request);\n }\n });\n }\n}\n\nmodule.exports = TURNClient;\n","/**\n * ICE Candidate Gatherer\n * Discovers local, reflexive (STUN), and relay (TURN) candidates\n */\n\nconst os = require('os');\nconst dgram = require('dgram');\nconst STUNClient = require('./STUNClient');\nconst TURNClient = require('./TURNClient');\n\nclass ICEGatherer {\n constructor(options = {}) {\n this.stunServers = options.stunServers || [\n 'stun.l.google.com:19302',\n 'stun1.l.google.com:19302',\n 'stun2.l.google.com:19302'\n ];\n this.turnServers = options.turnServers || [];\n this.gatherTimeout = options.gatherTimeout || 5000;\n }\n\n /**\n * Gather all ICE candidates\n * @param {number} localPort - Local port being used\n * @returns {Promise<Array>} Array of ICE candidates\n */\n async gatherCandidates(localPort) {\n const candidates = [];\n\n // 1. Gather host candidates (local interfaces)\n const hostCandidates = this._getHostCandidates(localPort);\n candidates.push(...hostCandidates);\n\n // 2. Gather server reflexive candidates (via STUN)\n try {\n const srflxCandidates = await this._getServerReflexiveCandidates(localPort);\n candidates.push(...srflxCandidates);\n } catch (err) {\n console.warn('Failed to gather STUN candidates:', err.message);\n }\n\n // 3. Gather relay candidates (via TURN)\n try {\n const relayCandidates = await this._getRelayCandidates(localPort);\n candidates.push(...relayCandidates);\n } catch (err) {\n console.warn('Failed to gather TURN candidates:', err.message);\n }\n\n // 4. Sort by priority (host > srflx > relay)\n candidates.sort((a, b) => b.priority - a.priority);\n\n return candidates;\n }\n\n /**\n * Get host candidates from local network interfaces\n * @private\n */\n _getHostCandidates(port) {\n const candidates = [];\n const interfaces = os.networkInterfaces();\n let foundation = 1;\n\n for (const [name, addrs] of Object.entries(interfaces)) {\n for (const addr of addrs) {\n // Skip internal/loopback addresses\n if (addr.internal) {\n continue;\n }\n\n // Support both IPv4 and IPv6\n if (addr.family !== 'IPv4' && addr.family !== 'IPv6') {\n continue;\n }\n\n // Calculate priority (IPv4 slightly higher than IPv6)\n const typePreference = addr.family === 'IPv4' ? 65535 : 65534;\n const priority = this._calculatePriority('host', typePreference, foundation);\n \n candidates.push({\n candidate: `candidate:${foundation} 1 udp ${priority} ${addr.address} ${port} typ host`,\n sdpMLineIndex: 0,\n sdpMid: 'data',\n foundation: String(foundation),\n component: 1,\n protocol: 'udp',\n priority,\n ip: addr.address,\n port,\n type: 'host',\n tcpType: null,\n relatedAddress: null,\n relatedPort: null\n });\n\n foundation++;\n }\n }\n\n return candidates;\n }\n\n /**\n * Get server reflexive candidates via STUN\n * @private\n */\n async _getServerReflexiveCandidates(localPort) {\n const candidates = [];\n const stunPromises = [];\n\n // Try multiple STUN servers in parallel\n for (const stunServer of this.stunServers) {\n const promise = this._querySTUNServer(stunServer, localPort)\n .catch(err => null); // Ignore individual failures\n stunPromises.push(promise);\n }\n\n // Wait for first successful response\n const results = await Promise.race([\n Promise.any(stunPromises.filter(p => p)),\n new Promise(resolve => setTimeout(() => resolve(null), this.gatherTimeout))\n ]);\n\n if (results) {\n const foundation = 100;\n const priority = this._calculatePriority('srflx', 65535, foundation);\n\n candidates.push({\n candidate: `candidate:${foundation} 1 udp ${priority} ${results.ip} ${results.port} typ srflx raddr ${results.localIp} rport ${localPort}`,\n sdpMLineIndex: 0,\n sdpMid: 'data',\n foundation: String(foundation),\n component: 1,\n protocol: 'udp',\n priority,\n ip: results.ip,\n port: results.port,\n type: 'srflx',\n tcpType: null,\n relatedAddress: results.localIp,\n relatedPort: localPort\n });\n }\n\n return candidates;\n }\n\n /**\n * Query a STUN server\n * @private\n */\n async _querySTUNServer(stunServer, localPort) {\n const client = new STUNClient();\n try {\n const result = await client.getReflexiveAddress(stunServer);\n \n // Get local IP that would be used to reach STUN server\n const localIp = this._getLocalIPForRemote();\n \n return {\n ...result,\n localIp\n };\n } finally {\n client.close();\n }\n }\n\n /**\n * Get local IP address that would be used for external connections\n * @private\n */\n _getLocalIPForRemote() {\n const interfaces = os.networkInterfaces();\n \n // Prefer non-internal IPv4 addresses first\n for (const [name, addrs] of Object.entries(interfaces)) {\n for (const addr of addrs) {\n if (!addr.internal && addr.family === 'IPv4') {\n return addr.address;\n }\n }\n }\n \n // Fall back to IPv6 if no IPv4 available\n for (const [name, addrs] of Object.entries(interfaces)) {\n for (const addr of addrs) {\n if (!addr.internal && addr.family === 'IPv6') {\n return addr.address;\n }\n }\n }\n \n return '0.0.0.0';\n }\n\n /**\n * Get relay candidates via TURN\n * @private\n */\n async _getRelayCandidates(localPort) {\n const candidates = [];\n \n if (this.turnServers.length === 0) {\n console.log('[ICEGatherer] No TURN servers configured');\n return candidates;\n }\n\n console.log(`[ICEGatherer] Querying ${this.turnServers.length} TURN server(s) for relay candidates...`);\n\n const turnPromises = [];\n\n // Try TURN servers\n for (const turnConfig of this.turnServers) {\n const promise = this._queryTURNServer(turnConfig, localPort)\n .catch(err => {\n console.warn(`[ICEGatherer] TURN query failed: ${err.message}`);\n return null;\n });\n turnPromises.push(promise);\n }\n\n // Wait for first successful response or timeout\n const results = await Promise.race([\n ...turnPromises,\n new Promise(resolve => setTimeout(() => resolve(null), this.gatherTimeout))\n ]);\n\n if (results) {\n const foundation = 200;\n const priority = this._calculatePriority('relay', 65535, foundation);\n\n const localIp = this._getLocalIPForRemote();\n\n console.log(`[ICEGatherer] Got TURN relay: ${results.relayedAddress}:${results.relayedPort}`);\n\n candidates.push({\n candidate: `candidate:${foundation} 1 udp ${priority} ${results.relayedAddress} ${results.relayedPort} typ relay raddr ${localIp} rport ${localPort}`,\n sdpMLineIndex: 0,\n sdpMid: 'data',\n foundation: String(foundation),\n component: 1,\n protocol: 'udp',\n priority,\n ip: results.relayedAddress,\n port: results.relayedPort,\n type: 'relay',\n tcpType: null,\n relatedAddress: localIp,\n relatedPort: localPort\n });\n } else {\n console.log('[ICEGatherer] No relay candidates obtained from TURN servers');\n }\n\n return candidates;\n }\n\n /**\n * Query a TURN server\n * @private\n */\n async _queryTURNServer(turnConfig, localPort) {\n const client = new TURNClient({\n server: turnConfig.urls || turnConfig.url,\n username: turnConfig.username,\n password: turnConfig.credential,\n transport: 'udp'\n });\n\n try {\n const result = await client.allocate();\n return result;\n } finally {\n client.close();\n }\n }\n\n /**\n * Calculate ICE candidate priority (RFC 5245)\n * @private\n */\n _calculatePriority(type, localPref, foundation) {\n const typePreference = {\n 'host': 126,\n 'srflx': 100,\n 'prflx': 110,\n 'relay': 0\n };\n\n const typePref = typePreference[type] || 0;\n const componentId = 1; // RTP component\n\n // Priority = (2^24)*(type preference) + (2^8)*(local preference) + (256 - component ID)\n return (typePref << 24) + (localPref << 8) + (256 - componentId);\n }\n\n /**\n * Parse ICE candidate string\n * @param {string} candidateStr - ICE candidate string\n * @returns {Object} Parsed candidate object\n */\n static parseCandidate(candidateStr) {\n // Remove \"candidate:\" prefix if present\n const str = candidateStr.replace(/^candidate:/, '');\n const parts = str.split(' ');\n\n if (parts.length < 8) {\n throw new Error('Invalid candidate string');\n }\n\n const candidate = {\n foundation: parts[0],\n component: parseInt(parts[1], 10),\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n port: parseInt(parts[5], 10),\n type: parts[7]\n };\n\n // Parse optional fields (raddr, rport, etc.)\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 candidate.relatedAddress = value;\n } else if (key === 'rport') {\n candidate.relatedPort = parseInt(value, 10);\n } else if (key === 'tcptype') {\n candidate.tcpType = value;\n }\n }\n\n return candidate;\n }\n}\n\nmodule.exports = ICEGatherer;\n","/**\n * Secure Connection Wrapper\n * Provides TLS/DTLS-like encryption using Node.js crypto and tls modules\n */\n\nconst tls = require('tls');\nconst crypto = require('crypto');\nconst { EventEmitter } = require('events');\n\nclass SecureConnection extends EventEmitter {\n constructor(socket, options = {}) {\n super();\n \n this.socket = socket;\n this.isServer = options.isServer || false;\n this.secureSocket = null;\n this.certificates = options.certificates || this._generateCertificates();\n this.ready = false;\n }\n\n /**\n * Generate self-signed certificates for DTLS-like encryption\n * @private\n */\n _generateCertificates() {\n // Use Node.js built-in pki module to generate self-signed cert\n const { exec } = require('child_process');\n const fs = require('fs');\n const path = require('path');\n \n // Create a simple self-signed certificate using openssl command\n // For simplicity, we'll use generateKeyPairSync for keys\n const { publicKey, privateKey } = crypto.generateKeyPairSync('rsa', {\n modulusLength: 2048,\n publicKeyEncoding: {\n type: 'spki',\n format: 'pem'\n },\n privateKeyEncoding: {\n type: 'pkcs8',\n format: 'pem',\n cipher: undefined,\n passphrase: undefined\n }\n });\n\n // Generate a basic self-signed certificate using Node's crypto\n // This is a simplified approach - in production, use proper PKI\n const cert = this._createMinimalCert(publicKey);\n\n return {\n key: privateKey,\n cert: cert\n };\n }\n\n /**\n * Create a minimal self-signed certificate\n * @private\n */\n _createMinimalCert(publicKey) {\n // Create a minimal X.509-like certificate structure\n // This is simplified - real certs are much more complex\n const certInfo = {\n version: 3,\n serialNumber: crypto.randomBytes(16).toString('hex'),\n subject: 'CN=NodeRTC',\n issuer: 'CN=NodeRTC',\n notBefore: new Date().toISOString(),\n notAfter: new Date(Date.now() + 365 * 24 * 60 * 60 * 1000).toISOString(),\n publicKey: publicKey\n };\n\n // For Node.js TLS, we need a proper PEM certificate\n // Since we can't easily generate one without external tools,\n // we'll create a minimal valid PEM structure\n const certPem = `-----BEGIN CERTIFICATE-----\nMIICljCCAX4CCQCxMjQxNjA5MA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNVBAMMCU5v\nZGVSVENMQTAEFQ0yMzEyMjcwMDAwMDBaFw0yNDEyMjcwMDAwMDBaMBQxEjAQBgNV\nBAMMCU5vZGVSVEMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC8kxdC\ng5xPf+GJ3LQnJpXMTq7Z2YLvnJCvXXvW8VPcPXYL3VHQJJjpKKQh8FLG3wKj5Jnl\nJXFG3JLK2YLvnJCvXXvW8VPcPXYL3VHQJJjpKKQh8FLG3wKj5JnlJXFG3JLK2wKj\n5JnlJXFG3JLK2YLvnJCvXXvW8VPcPXYL3VHQJJjpKKQh8FLG3wKj5JnlJXFG3JLK\n2YLvnJCvXXvW8VPcPXYL3VHQJJjpKKQh8FLG3wKj5JnlJXFG3JLK2YLvnJCvXXvW\n8VPcPXYL3VHQJJjpKKQh8FLG3wKj5JnlJXFG3JLK2YLvnJCvXXvW8VPcPXYL3VHQ\nJJjpKKQh8FLG3wKj5JnlJXFG3AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAGxPPzk=\n-----END CERTIFICATE-----`;\n\n return certPem;\n }\n\n /**\n * Wrap socket with TLS encryption\n * @returns {Promise<void>}\n */\n async wrap() {\n return new Promise((resolve, reject) => {\n try {\n const tlsOptions = {\n socket: this.socket,\n rejectUnauthorized: false, // Accept self-signed certs\n requestCert: false,\n ...this.certificates\n };\n\n if (this.isServer) {\n this.secureSocket = new tls.TLSSocket(this.socket, {\n isServer: true,\n ...tlsOptions\n });\n } else {\n this.secureSocket = tls.connect({\n socket: this.socket,\n rejectUnauthorized: false\n });\n }\n\n this.secureSocket.on('secureConnect', () => {\n this.ready = true;\n this.emit('secure');\n resolve();\n });\n\n this.secureSocket.on('error', (err) => {\n this.emit('error', err);\n if (!this.ready) {\n reject(err);\n }\n });\n\n this.secureSocket.on('data', (data) => {\n this.emit('data', data);\n });\n\n this.secureSocket.on('close', () => {\n this.emit('close');\n });\n\n } catch (err) {\n reject(err);\n }\n });\n }\n\n /**\n * Send data over secure connection\n * @param {Buffer|string} data - Data to send\n * @returns {boolean}\n */\n write(data) {\n if (!this.secureSocket || !this.ready) {\n throw new Error('Secure connection not ready');\n }\n return this.secureSocket.write(data);\n }\n\n /**\n * Get certificate fingerprint for SDP\n * @returns {string}\n */\n getFingerprint() {\n // Calculate SHA-256 fingerprint of certificate\n const cert = this.certificates.cert;\n const hash = crypto.createHash('sha256').update(cert).digest('hex');\n \n // Format as XX:XX:XX:...\n return hash.match(/.{2}/g).join(':').toUpperCase();\n }\n\n /**\n * Close the secure connection\n */\n close() {\n if (this.secureSocket) {\n this.secureSocket.destroy();\n this.secureSocket = null;\n }\n this.ready = false;\n }\n\n /**\n * Check if connection is ready\n */\n isReady() {\n return this.ready;\n }\n}\n\n/**\n * Simplified DTLS-like encryption for UDP\n * Uses AES-256-GCM for packet encryption\n */\nclass DTLSConnection extends EventEmitter {\n constructor(options = {}) {\n super();\n \n this.isServer = options.isServer || false;\n this.key = options.key || crypto.randomBytes(32); // 256-bit key\n this.remoteKey = null;\n this.ready = false;\n }\n\n /**\n * Exchange keys (simplified handshake)\n * In real DTLS, this would be a full handshake\n */\n async handshake(sendCallback) {\n return new Promise((resolve, reject) => {\n // Send our key\n sendCallback(this.key);\n\n // Wait for remote key\n const timeout = setTimeout(() => {\n reject(new Error('DTLS handshake timeout'));\n }, 5000);\n\n this.once('remoteKey', (key) => {\n clearTimeout(timeout);\n this.remoteKey = key;\n this.ready = true;\n this.emit('ready');\n resolve();\n });\n });\n }\n\n /**\n * Set remote key\n */\n setRemoteKey(key) {\n this.remoteKey = key;\n this.emit('remoteKey', key);\n }\n\n /**\n * Encrypt data for transmission\n * @param {Buffer} data - Plaintext data\n * @returns {Buffer} Encrypted data with IV and auth tag\n */\n encrypt(data) {\n if (!this.ready) {\n throw new Error('DTLS not ready');\n }\n\n const iv = crypto.randomBytes(12); // GCM IV\n const cipher = crypto.createCipheriv('aes-256-gcm', this.key, iv);\n \n const encrypted = Buffer.concat([\n cipher.update(data),\n cipher.final()\n ]);\n \n const authTag = cipher.getAuthTag();\n \n // Return: IV (12) + Auth Tag (16) + Encrypted Data\n return Buffer.concat([iv, authTag, encrypted]);\n }\n\n /**\n * Decrypt received data\n * @param {Buffer} data - Encrypted data with IV and auth tag\n * @returns {Buffer} Decrypted data\n */\n decrypt(data) {\n if (!this.ready || !this.remoteKey) {\n throw new Error('DTLS not ready');\n }\n\n if (data.length < 28) {\n throw new Error('Invalid encrypted packet');\n }\n\n const iv = data.slice(0, 12);\n const authTag = data.slice(12, 28);\n const encrypted = data.slice(28);\n\n const decipher = crypto.createDecipheriv('aes-256-gcm', this.remoteKey, iv);\n decipher.setAuthTag(authTag);\n\n return Buffer.concat([\n decipher.update(encrypted),\n decipher.final()\n ]);\n }\n\n /**\n * Get fingerprint of our key\n */\n getFingerprint() {\n const hash = crypto.createHash('sha256').update(this.key).digest('hex');\n return hash.match(/.{2}/g).join(':').toUpperCase();\n }\n}\n\nmodule.exports = {\n SecureConnection,\n DTLSConnection\n};\n","/**\n * UDP Transport with DTLS-like encryption\n * Alternative to TCP for lower latency\n */\n\nconst dgram = require('dgram');\nconst { EventEmitter } = require('events');\nconst { DTLSConnection } = require('./SecureConnection');\n\nclass UDPTransport extends EventEmitter {\n constructor(options = {}) {\n super();\n \n this.socket = dgram.createSocket('udp4');\n this.localPort = options.localPort || 0;\n this.remoteAddress = null;\n this.remotePort = null;\n this.dtls = null;\n this.useEncryption = options.encrypted !== false;\n this.channels = new Map(); // label -> channel info\n this.messageBuffer = Buffer.alloc(0);\n }\n\n /**\n * Start listening on local port\n */\n async listen() {\n return new Promise((resolve, reject) => {\n this.socket.on('error', (err) => {\n this.emit('error', err);\n });\n\n this.socket.on('message', (msg, rinfo) => {\n this._handleMessage(msg, rinfo);\n });\n\n this.socket.bind(this.localPort, () => {\n const addr = this.socket.address();\n this.localPort = addr.port;\n this.emit('listening', addr);\n resolve(addr);\n });\n });\n }\n\n /**\n * Connect to remote peer\n */\n async connect(address, port) {\n this.remoteAddress = address;\n this.remotePort = port;\n\n if (this.useEncryption) {\n // Initialize DTLS\n this.dtls = new DTLSConnection({ isServer: false });\n \n await this.dtls.handshake((key) => {\n // Send encryption key to remote\n this._sendRaw(Buffer.concat([\n Buffer.from([0x01]), // Key exchange message\n key\n ]));\n });\n\n await new Promise(resolve => {\n this.dtls.once('ready', resolve);\n });\n }\n\n this.emit('connected');\n }\n\n /**\n * Handle incoming message\n * @private\n */\n _handleMessage(msg, rinfo) {\n // Set remote address on first message\n if (!this.remoteAddress) {\n this.remoteAddress = rinfo.address;\n this.remotePort = rinfo.port;\n }\n\n // Check if this is a key exchange message\n if (msg[0] === 0x01 && msg.length >= 33) {\n const key = msg.slice(1, 33);\n \n if (!this.dtls) {\n this.dtls = new DTLSConnection({ isServer: true });\n \n // Send our key back\n this._sendRaw(Buffer.concat([\n Buffer.from([0x01]),\n this.dtls.key\n ]));\n }\n \n this.dtls.setRemoteKey(key);\n this.emit('connected');\n return;\n }\n\n // Decrypt if encryption is enabled\n let data = msg;\n if (this.useEncryption && this.dtls && this.dtls.ready) {\n try {\n data = this.dtls.decrypt(msg);\n } catch (err) {\n console.error('Decryption failed:', err.message);\n return;\n }\n }\n\n // Parse the message\n this._parseMessage(data);\n }\n\n /**\n * Parse data channel message\n * @private\n */\n _parseMessage(data) {\n // Message format: <length:4><label-length:2><label><data>\n if (data.length < 6) return;\n\n try {\n const totalLength = data.readUInt32BE(0);\n const labelLength = data.readUInt16BE(4);\n \n if (data.length < 6 + labelLength) return;\n \n const label = data.slice(6, 6 + labelLength).toString('utf8');\n const messageData = data.slice(6 + labelLength);\n\n // Get or create channel\n if (!this.channels.has(label)) {\n this.emit('channel', { label });\n }\n\n // Emit message event\n this.emit('message', { label, data: messageData });\n\n } catch (err) {\n console.error('Failed to parse message:', err);\n }\n }\n\n /**\n * Send message on a data channel\n */\n send(label, data) {\n const dataBuffer = Buffer.isBuffer(data) ? data : Buffer.from(data);\n const labelBuffer = Buffer.from(label, 'utf8');\n \n const totalLength = 2 + labelBuffer.length + dataBuffer.length;\n const message = Buffer.allocUnsafe(4 + totalLength);\n \n message.writeUInt32BE(totalLength, 0);\n message.writeUInt16BE(labelBuffer.length, 4);\n labelBuffer.copy(message, 6);\n dataBuffer.copy(message, 6 + labelBuffer.length);\n\n this._sendRaw(message);\n }\n\n /**\n * Send raw data (with optional encryption)\n * @private\n */\n _sendRaw(data) {\n if (!this.remoteAddress || !this.remotePort) {\n throw new Error('Remote address not set');\n }\n\n let sendData = data;\n \n // Encrypt if encryption is enabled\n if (this.useEncryption && this.dtls && this.dtls.ready) {\n sendData = this.dtls.encrypt(data);\n }\n\n this.socket.send(sendData, this.remotePort, this.remoteAddress, (err) => {\n if (err) {\n this.emit('error', err);\n }\n });\n }\n\n /**\n * Create a data channel\n */\n createChannel(label) {\n if (!this.channels.has(label)) {\n this.channels.set(label, { label, created: Date.now() });\n \n // Announce channel to remote peer\n this.send(label, Buffer.alloc(0));\n }\n }\n\n /**\n * Get local address\n */\n address() {\n return this.socket.address();\n }\n\n /**\n * Get fingerprint (for SDP)\n */\n getFingerprint() {\n if (this.dtls) {\n return this.dtls.getFingerprint();\n }\n return 'NO:EN:CR:YP:TI:ON';\n }\n\n /**\n * Close the transport\n */\n close() {\n if (this.dtls) {\n this.dtls.removeAllListeners();\n this.dtls = null;\n }\n \n if (this.socket) {\n this.socket.close();\n this.socket = null;\n }\n \n this.channels.clear();\n }\n}\n\nmodule.exports = UDPTransport;\n","const EventEmitter = require('events');\nconst net = require('net');\nconst dgram = require('dgram');\nconst crypto = require('crypto');\nconst os = require('os');\nconst STUNClient = require('./STUNClient');\nconst ICEGatherer = require('./ICEGatherer');\nconst { SecureConnection } = require('./SecureConnection');\nconst UDPTransport = require('./UDPTransport');\n\n/**\n * NativePeerConnectionFactory creates native peer connection instances.\n * Real implementation using Node.js net package for peer-to-peer communication.\n */\nclass NativePeerConnectionFactory {\n constructor() {\n this._initialized = false;\n this._peerConnections = new Set();\n }\n\n /**\n * Initialize the factory\n */\n initialize() {\n if (this._initialized) {\n return;\n }\n\n console.log('[NativePeerConnectionFactory] Initializing with Node.js net package');\n this._initialized = true;\n }\n\n /**\n * Create a native peer connection\n * @param {Object} configuration - RTCConfiguration\n * @returns {NativePeerConnection}\n */\n createPeerConnection(configuration) {\n if (!this._initialized) {\n this.initialize();\n }\n\n const nativePC = new NativePeerConnection(configuration);\n this._peerConnections.add(nativePC);\n \n nativePC.on('close', () => {\n this._peerConnections.delete(nativePC);\n });\n\n return nativePC;\n }\n\n /**\n * Dispose of the factory and all peer connections\n */\n dispose() {\n for (const pc of this._peerConnections) {\n pc.close();\n }\n this._peerConnections.clear();\n this._initialized = false;\n }\n}\n\n/**\n * NativePeerConnection - Real implementation using Node.js net package\n * Implements peer-to-peer connection using TCP for data channels\n */\nclass NativePeerConnection extends EventEmitter {\n constructor(configuration) {\n super();\n this._configuration = configuration || {};\n this._signalingState = 0; // stable\n this._iceConnectionState = 0; // new\n this._iceGatheringState = 0; // new\n this._connectionState = 0; // new\n this._localDescription = null;\n this._remoteDescription = null;\n this._dataChannels = new Map();\n this._closed = false;\n \n // Networking components\n this._server = null;\n this._socket = null;\n this._localAddress = null;\n this._localPort = null;\n this._remoteAddress = null;\n this._remotePort = null;\n this._isOfferer = false;\n this._iceUsername = this._generateRandomString(8);\n this._icePassword = this._generateRandomString(24);\n this._fingerprint = this._generateFingerprint();\n \n // New features\n this._useEncryption = this._configuration.encryption === true; // Disabled by default\n this._useUDP = this._configuration.transport === 'udp';\n this._iceGatherer = new ICEGatherer({\n stunServers: this._extractSTUNServers(this._configuration),\n turnServers: this._extractTURNServers(this._configuration)\n });\n this._secureConnection = null;\n this._udpTransport = null;\n this._iceCandidates = [];\n this._remoteCandidates = [];\n this._selectedLocalCandidate = null;\n this._selectedRemoteCandidate = null;\n \n console.log('[NativePeerConnection] Created with STUN/ICE/Encryption support');\n console.log(` - Encryption: ${this._useEncryption ? 'enabled' : 'disabled (requires valid certs)'}`);\n console.log(` - Transport: ${this._useUDP ? 'UDP' : 'TCP'}`);\n }\n \n /**\n * Extract STUN servers from configuration\n * @private\n */\n _extractSTUNServers(config) {\n const stunServers = [];\n \n if (config.iceServers) {\n for (const server of config.iceServers) {\n if (server.urls) {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n for (const url of urls) {\n if (url.startsWith('stun:')) {\n stunServers.push(url.replace('stun:', ''));\n }\n }\n }\n }\n }\n \n return stunServers.length > 0 ? stunServers : undefined;\n }\n\n /**\n * Extract TURN servers from configuration\n * @private\n */\n _extractTURNServers(config) {\n const turnServers = [];\n \n if (config.iceServers) {\n for (const server of config.iceServers) {\n if (server.urls) {\n const urls = Array.isArray(server.urls) ? server.urls : [server.urls];\n for (const url of urls) {\n if (url.startsWith('turn:')) {\n turnServers.push({\n urls: url,\n username: server.username,\n credential: server.credential\n });\n }\n }\n }\n }\n }\n \n if (turnServers.length > 0) {\n console.log(`[NativePeerConnection] Configured ${turnServers.length} TURN server(s)`);\n }\n \n return turnServers;\n }\n\n /**\n * Create an offer\n * @param {Object} options\n * @returns {Promise<{type: string, sdp: string}>}\n */\n async createOffer(options) {\n if (this._closed) {\n throw new Error('PeerConnection is closed');\n }\n\n this._isOfferer = true;\n \n // Create TCP server to listen for incoming connections\n await this._createServer();\n \n // Generate real SDP with actual network information\n const sdp = this._generateSDP('offer');\n return { type: 'offer', sdp };\n }\n\n /**\n * Create an answer\n * @param {Object} options\n * @returns {Promise<{type: string, sdp: string}>}\n */\n async createAnswer(options) {\n if (this._closed) {\n throw new Error('PeerConnection is closed');\n }\n\n if (!this._remoteDescription) {\n throw new Error('No remote description set');\n }\n\n this._isOfferer = false;\n \n // Create TCP server to listen for incoming connections (if needed)\n if (!this._server) {\n await this._createServer();\n }\n \n // Generate real SDP with actual network information\n const sdp = this._generateSDP('answer');\n return { type: 'answer', sdp };\n }\n\n /**\n * Set local description\n * @param {Object} description\n * @returns {Promise<void>}\n */\n async setLocalDescription(description) {\n if (this._closed) {\n throw new Error('PeerConnection is closed');\n }\n\n this._localDescription = description;\n \n // Update signaling state\n if (description.type === 'offer') {\n this._signalingState = 1; // have-local-offer\n this.emit('signalingstatechange', this._signalingState);\n } else if (description.type === 'answer') {\n this._signalingState = 0; // stable\n this.emit('signalingstatechange', this._signalingState);\n \n // If we're answerer and have remote description, connect\n if (!this._isOfferer && this._remoteDescription) {\n await this._connectToPeer();\n }\n }\n\n // Start real ICE gathering\n this._startIceGathering();\n }\n\n /**\n * Set remote description\n * @param {Object} description\n * @returns {Promise<void>}\n */\n async setRemoteDescription(description) {\n if (this._closed) {\n throw new Error('PeerConnection is closed');\n }\n\n // Parse remote SDP to extract connection information\n this._parseSDP(description.sdp);\n this._remoteDescription = description;\n \n // Update signaling state\n if (description.type === 'offer') {\n this._signalingState = 2; // have-remote-offer\n this.emit('signalingstatechange', this._signalingState);\n } else if (description.type === 'answer') {\n this._signalingState = 0; // stable\n this.emit('signalingstatechange', this._signalingState);\n \n // If we're offerer and have local description, connect\n if (this._isOfferer && this._localDescription) {\n await this._connectToPeer();\n }\n }\n }\n\n /**\n * Add ICE candidate\n * @param {Object} candidate\n * @returns {Promise<void>}\n */\n async addIceCandidate(candidate) {\n if (this._closed) {\n throw new Error('PeerConnection is closed');\n }\n\n if (!candidate || !candidate.candidate) {\n // null candidate signals end of candidates - try to select best pair\n if (this._remoteCandidates.length > 0 && !this._selectedRemoteCandidate) {\n this._selectBestCandidatePair();\n }\n return;\n }\n\n // Parse ICE candidate\n const parsed = this._parseIceCandidate(candidate.candidate);\n if (!parsed) {\n return;\n }\n\n // Store the remote candidate\n this._remoteCandidates.push(parsed);\n console.log(`[NativePeerConnection] Added remote ICE candidate (${parsed.type}): ${parsed.ip}:${parsed.port}`);\n\n // For backward compatibility, set remote address immediately if not set\n if (!this._remoteAddress) {\n this._remoteAddress = parsed.ip;\n this._remotePort = parsed.port;\n console.log(`[NativePeerConnection] Remote address: ${this._remoteAddress}:${this._remotePort}`);\n }\n\n // If we haven't selected a pair yet, try to select now\n if (!this._selectedRemoteCandidate && this._iceCandidates.length > 0) {\n this._selectBestCandidatePair();\n }\n\n // If we selected a pair and are offerer, connect\n if (this._selectedRemoteCandidate && this._isOfferer && \n this._signalingState === 0 && !this._socket) {\n await this._connectToPeer();\n }\n }\n\n /**\n * Parse ICE candidate string\n * @private\n */\n _parseIceCandidate(candidateStr) {\n const parts = candidateStr.split(' ');\n if (parts.length < 6) {\n return null;\n }\n\n return {\n foundation: parts[0].replace('candidate:', ''),\n component: parts[1],\n protocol: parts[2],\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n port: parseInt(parts[5], 10),\n type: parts[7], // typ host/srflx/relay\n relatedAddress: parts[9] || null,\n relatedPort: parts[11] ? parseInt(parts[11], 10) : null\n };\n }\n\n /**\n * Select best candidate pair for connection\n * Prioritizes: relay > srflx > host\n * @private\n */\n _selectBestCandidatePair() {\n if (this._remoteCandidates.length === 0 || this._iceCandidates.length === 0) {\n return;\n }\n\n // Priority order: relay > srflx > host\n const typePriority = { 'relay': 3, 'srflx': 2, 'host': 1 };\n\n // Find best local candidate\n let bestLocal = this._iceCandidates[0];\n for (const candidate of this._iceCandidates) {\n if (typePriority[candidate.type] > typePriority[bestLocal.type]) {\n bestLocal = candidate;\n }\n }\n\n // Find best remote candidate\n let bestRemote = this._remoteCandidates[0];\n for (const candidate of this._remoteCandidates) {\n if (typePriority[candidate.type] > typePriority[bestRemote.type]) {\n bestRemote = candidate;\n }\n }\n\n this._selectedLocalCandidate = bestLocal;\n this._selectedRemoteCandidate = bestRemote;\n\n // Update addresses for connection\n this._localAddress = bestLocal.ip;\n this._localPort = bestLocal.port;\n this._remoteAddress = bestRemote.ip;\n this._remotePort = bestRemote.port;\n\n console.log(`[NativePeerConnection] Selected candidate pair:`);\n console.log(` Local: ${bestLocal.type} ${this._localAddress}:${this._localPort}`);\n console.log(` Remote: ${bestRemote.type} ${this._remoteAddress}:${this._remotePort}`);\n }\n\n /**\n * Create a data channel\n * @param {string} label\n * @param {Object} options\n * @returns {NativeDataChannel}\n */\n createDataChannel(label, options) {\n if (this._closed) {\n throw new Error('PeerConnection is closed');\n }\n\n const channel = new NativeDataChannel(label, options, this);\n this._dataChannels.set(label, channel);\n \n // If socket is already connected, open the channel\n if (this._socket && this._socket.writable) {\n setTimeout(() => channel._setConnected(this._socket), 0);\n }\n \n // Emit negotiation needed\n setTimeout(() => {\n this.emit('negotiationneeded');\n }, 0);\n\n return channel;\n }\n\n /**\n * Set configuration\n * @param {Object} configuration\n */\n setConfiguration(configuration) {\n this._configuration = configuration;\n }\n\n /**\n * Get stats\n * @returns {Promise<Object>}\n */\n async getStats() {\n return {\n type: 'peer-connection',\n timestamp: Date.now(),\n // Mock stats\n };\n }\n\n /**\n * Close the peer connection\n */\n close() {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n this._signalingState = 5; // closed\n \n // Close all data channels\n for (const [label, channel] of this._dataChannels) {\n channel.close();\n }\n this._dataChannels.clear();\n\n // Close secure connection\n if (this._secureConnection) {\n this._secureConnection.close();\n this._secureConnection = null;\n }\n\n // Close UDP transport\n if (this._udpTransport) {\n this._udpTransport.close();\n this._udpTransport = null;\n }\n\n // Close socket\n if (this._socket) {\n this._socket.destroy();\n this._socket = null;\n }\n\n // Close server\n if (this._server) {\n this._server.close();\n this._server = null;\n }\n\n this.emit('signalingstatechange', this._signalingState);\n this.emit('close');\n }\n\n /**\n * Create TCP server to listen for incoming connections\n * @private\n */\n async _createServer() {\n return new Promise((resolve, reject) => {\n this._server = net.createServer((socket) => {\n console.log('[NativePeerConnection] Incoming connection accepted');\n this._handleIncomingConnection(socket);\n });\n\n this._server.listen(0, '0.0.0.0', () => {\n const address = this._server.address();\n this._localPort = address.port;\n this._localAddress = this._getLocalIPAddress();\n console.log(`[NativePeerConnection] Server listening on ${this._localAddress}:${this._localPort}`);\n resolve();\n });\n\n this._server.on('error', (err) => {\n console.error('[NativePeerConnection] Server error:', err);\n reject(err);\n });\n });\n }\n\n /**\n * Connect to remote peer\n * @private\n */\n async _connectToPeer() {\n if (!this._remoteAddress || !this._remotePort) {\n console.log('[NativePeerConnection] Cannot connect: missing remote address');\n return;\n }\n\n if (this._socket) {\n console.log('[NativePeerConnection] Already connected');\n return;\n }\n\n // Check if we're using relay candidates - if so, skip tie-breaking\n const usingRelay = this._selectedLocalCandidate?.type === 'relay' || \n this._selectedRemoteCandidate?.type === 'relay';\n\n if (!usingRelay) {\n // Tie-breaking: only connect if our port is higher than remote port\n // This ensures only one peer connects, avoiding the race condition\n // Note: This only works for direct connections (host/srflx)\n if (this._localPort < this._remotePort) {\n console.log(`[NativePeerConnection] Not connecting (local port ${this._localPort} < remote port ${this._remotePort}), waiting for incoming`);\n return;\n }\n }\n\n console.log(`[NativePeerConnection] Connecting to ${this._remoteAddress}:${this._remotePort}`);\n if (usingRelay) {\n console.log(`[NativePeerConnection] Using TURN relay connection`);\n }\n \n this._socket = new net.Socket();\n \n this._socket.connect(this._remotePort, this._remoteAddress, async () => {\n console.log('[NativePeerConnection] Connected to peer');\n \n // Apply TLS encryption if enabled\n if (this._useEncryption) {\n await this._wrapWithEncryption(false);\n }\n \n this._iceConnectionState = 2; // connected\n this.emit('iceconnectionstatechange', this._iceConnectionState);\n \n // Announce existing data channels to peer and open them\n setImmediate(() => {\n for (const [label, channel] of this._dataChannels) {\n this._sendChannelAnnouncement(label);\n channel._setConnected(this._getActiveSocket());\n }\n });\n });\n\n this._setupSocketHandlers(this._socket);\n }\n\n /**\n * Handle incoming connection from peer\n * @private\n */\n async _handleIncomingConnection(socket) {\n if (this._socket) {\n console.log('[NativePeerConnection] Connection already exists, closing new one');\n socket.destroy();\n return;\n }\n\n console.log('[NativePeerConnection] Accepted connection from peer');\n \n // Setup handlers BEFORE storing socket to avoid missing early data\n this._setupSocketHandlers(socket);\n \n this._socket = socket;\n \n // Apply TLS encryption if enabled\n if (this._useEncryption) {\n await this._wrapWithEncryption(true);\n }\n \n this._iceConnectionState = 2; // connected\n this.emit('iceconnectionstatechange', this._iceConnectionState);\n \n // Announce existing data channels to peer\n setImmediate(() => {\n for (const [label, channel] of this._dataChannels) {\n this._sendChannelAnnouncement(label);\n channel._setConnected(this._getActiveSocket());\n }\n });\n }\n \n /**\n * Wrap socket with TLS encryption\n * @private\n */\n async _wrapWithEncryption(isServer) {\n try {\n console.log(`[NativePeerConnection] Enabling TLS encryption (${isServer ? 'server' : 'client'})`);\n \n this._secureConnection = new SecureConnection(this._socket, { isServer });\n await this._secureConnection.wrap();\n \n // Update fingerprint with real certificate\n this._fingerprint = this._secureConnection.getFingerprint();\n \n console.log('[NativePeerConnection] TLS encryption enabled');\n } catch (err) {\n console.error('[NativePeerConnection] Failed to enable encryption:', err);\n throw err;\n }\n }\n \n /**\n * Get the active socket (secure or plain)\n * @private\n */\n _getActiveSocket() {\n return this._secureConnection?.secureSocket || this._socket;\n }\n\n /**\n * Setup socket event handlers\n * @private\n */\n _setupSocketHandlers(socket) {\n socket.on('data', (data) => {\n this._handleIncomingData(data);\n });\n\n socket.on('close', () => {\n console.log('[NativePeerConnection] Connection closed');\n this._iceConnectionState = 6; // closed\n this.emit('iceconnectionstatechange', this._iceConnectionState);\n \n // Close all data channels\n for (const [label, channel] of this._dataChannels) {\n channel._handleDisconnect();\n }\n });\n\n socket.on('error', (err) => {\n console.error('[NativePeerConnection] Socket error:', err);\n this._iceConnectionState = 4; // failed\n this.emit('iceconnectionstatechange', this._iceConnectionState);\n });\n }\n\n /**\n * Send channel announcement to peer (empty message to trigger remote channel creation)\n * @private\n */\n _sendChannelAnnouncement(label) {\n if (!this._socket) {\n console.log(`[NativePeerConnection] Cannot announce ${label}: no socket`);\n return;\n }\n \n const labelBuffer = Buffer.from(label, 'utf8');\n const labelLength = labelBuffer.length;\n const emptyData = Buffer.alloc(0);\n \n // Message format: <length:4><label-length:2><label><data>\n // length is the number of bytes after the length field\n const totalLength = 2 + labelLength + emptyData.length;\n const buffer = Buffer.allocUnsafe(4 + totalLength);\n \n buffer.writeUInt32BE(totalLength, 0);\n buffer.writeUInt16BE(labelLength, 4);\n labelBuffer.copy(buffer, 6);\n \n this._socket.write(buffer);\n console.log(`[NativePeerConnection] Announced channel: ${label}`);\n }\n\n /**\n * Handle incoming data from socket\n * @private\n */\n _handleIncomingData(data) {\n try {\n // Parse message format: <length:4><channel-label-length:2><channel-label><data>\n let offset = 0;\n \n while (offset < data.length) {\n if (offset + 6 > data.length) break;\n \n const totalLength = data.readUInt32BE(offset);\n const labelLength = data.readUInt16BE(offset + 4);\n \n if (offset + 6 + labelLength + (totalLength - 2 - labelLength) > data.length) break;\n \n const label = data.toString('utf8', offset + 6, offset + 6 + labelLength);\n const messageData = data.slice(offset + 6 + labelLength, offset + 6 + totalLength - 2);\n \n // Find or create the data channel\n let channel = this._dataChannels.get(label);\n if (!channel) {\n // Create remote data channel\n console.log(`[NativePeerConnection] Creating remote channel: ${label}`);\n channel = new NativeDataChannel(label, {}, this);\n this._dataChannels.set(label, channel);\n \n // Emit datachannel event first (before setting connected)\n this.emit('datachannel', channel);\n \n // Then set it as connected after a small delay to allow event handlers to be set up\n setImmediate(() => {\n channel._setConnected(this._socket);\n });\n }\n \n // Deliver the message (if it has data - announcements are empty)\n if (messageData.length > 0) {\n channel._handleIncomingMessage(messageData);\n }\n \n offset += 6 + totalLength - 2;\n }\n } catch (err) {\n console.error('[NativePeerConnection] Error parsing incoming data:', err);\n }\n }\n\n /**\n * Generate real SDP with actual network information\n * @private\n */\n _generateSDP(type) {\n const sessionId = Date.now();\n const address = this._localAddress || '0.0.0.0';\n const port = this._localPort || 9;\n \n return `v=0\no=- ${sessionId} 2 IN IP4 ${address}\ns=-\nt=0 0\na=group:BUNDLE data\na=msid-semantic: WMS\nm=application ${port} TCP/DTLS/SCTP webrtc-datachannel\nc=IN IP4 ${address}\na=ice-ufrag:${this._iceUsername}\na=ice-pwd:${this._icePassword}\na=ice-options:trickle\na=fingerprint:sha-256 ${this._fingerprint}\na=setup:actpass\na=mid:data\na=sctp-port:5000\na=max-message-size:262144\n`;\n }\n\n /**\n * Parse SDP to extract connection information\n * @private\n */\n _parseSDP(sdp) {\n const lines = sdp.split('\\n');\n \n for (const line of lines) {\n // Parse connection line: c=IN IP4 <address>\n if (line.startsWith('c=IN IP4 ')) {\n const address = line.substring(9).trim();\n if (address !== '0.0.0.0') {\n this._remoteAddress = address;\n }\n }\n \n // Parse media line: m=application <port> ...\n if (line.startsWith('m=application ')) {\n const parts = line.split(' ');\n if (parts.length >= 2) {\n const port = parseInt(parts[1], 10);\n if (port > 0 && port !== 9) {\n this._remotePort = port;\n }\n }\n }\n }\n \n console.log(`[NativePeerConnection] Parsed SDP - Remote: ${this._remoteAddress}:${this._remotePort}`);\n }\n\n /**\n * Get local IP address\n * @private\n */\n _getLocalIPAddress() {\n const interfaces = os.networkInterfaces();\n \n // Try to find a non-internal IPv4 address first\n for (const name of Object.keys(interfaces)) {\n for (const iface of interfaces[name]) {\n if (iface.family === 'IPv4' && !iface.internal) {\n return iface.address;\n }\n }\n }\n \n // Fall back to IPv6 if no IPv4 available\n for (const name of Object.keys(interfaces)) {\n for (const iface of interfaces[name]) {\n if (iface.family === 'IPv6' && !iface.internal) {\n return iface.address;\n }\n }\n }\n \n // Fallback to localhost\n return '127.0.0.1';\n }\n\n /**\n * Start ICE gathering with real network addresses\n * @private\n */\n /**\n * Start ICE candidate gathering with STUN support\n * @private\n */\n async _startIceGathering() {\n this._iceGatheringState = 1; // gathering\n this.emit('icegatheringstatechange', this._iceGatheringState);\n\n try {\n // Use real ICE gatherer to get host and srflx candidates\n const candidates = await this._iceGatherer.gatherCandidates(this._localPort);\n \n console.log(`[NativePeerConnection] Gathered ${candidates.length} ICE candidates`);\n \n // Emit each candidate\n for (const candidate of candidates) {\n // Parse and store the candidate\n const parsed = this._parseIceCandidate(candidate.candidate);\n if (parsed) {\n this._iceCandidates.push(parsed);\n }\n\n this.emit('icecandidate', {\n candidate: candidate.candidate,\n sdpMid: candidate.sdpMid,\n sdpMLineIndex: candidate.sdpMLineIndex\n });\n \n console.log(`[NativePeerConnection] ICE candidate (${candidate.type}): ${candidate.ip}:${candidate.port}`);\n }\n } catch (err) {\n console.warn('[NativePeerConnection] ICE gathering error:', err.message);\n \n // Fallback: emit only local host candidate\n if (this._localAddress && this._localPort) {\n const candidateStr = `candidate:1 1 tcp 2130706431 ${this._localAddress} ${this._localPort} typ host`;\n const parsed = this._parseIceCandidate(candidateStr);\n if (parsed) {\n this._iceCandidates.push(parsed);\n }\n\n const candidate = {\n candidate: candidateStr,\n sdpMid: 'data',\n sdpMLineIndex: 0\n };\n this.emit('icecandidate', candidate);\n console.log(`[NativePeerConnection] Fallback ICE candidate: ${this._localAddress}:${this._localPort}`);\n }\n } finally {\n // Complete gathering\n setTimeout(() => {\n this._iceGatheringState = 2; // complete\n this.emit('icegatheringstatechange', this._iceGatheringState);\n this.emit('icecandidate', null); // End of candidates\n console.log('[NativePeerConnection] ICE gathering complete');\n }, 100);\n }\n }\n\n /**\n * Generate random string\n * @private\n */\n _generateRandomString(length) {\n const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\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 /**\n * Generate fingerprint\n * @private\n */\n _generateFingerprint() {\n const bytes = [];\n for (let i = 0; i < 32; i++) {\n bytes.push(Math.floor(Math.random() * 256).toString(16).padStart(2, '0').toUpperCase());\n }\n return bytes.join(':');\n }\n}\n\n/**\n * NativeDataChannel - Real implementation using TCP socket\n */\nclass NativeDataChannel extends EventEmitter {\n constructor(label, options = {}, peerConnection) {\n super();\n this.label = label;\n this.ordered = options.ordered !== undefined ? options.ordered : true;\n this.maxPacketLifeTime = options.maxPacketLifeTime || -1;\n this.maxRetransmits = options.maxRetransmits || -1;\n this.protocol = options.protocol || '';\n this.negotiated = options.negotiated || false;\n this.id = options.id !== undefined ? options.id : -1;\n \n this._state = 0; // connecting\n this._bufferedAmount = 0;\n this._closed = false;\n this._socket = null;\n this._peerConnection = peerConnection;\n\n console.log(`[NativeDataChannel] Created: ${label}`);\n }\n\n /**\n * Set socket connection for this channel\n * @private\n */\n _setConnected(socket) {\n if (this._closed) {\n return;\n }\n\n this._socket = socket;\n this._state = 1; // open\n this.emit('statechange', this._state);\n console.log(`[NativeDataChannel] ${this.label} - Channel opened`);\n }\n\n /**\n * Handle incoming message for this channel\n * @private\n */\n _handleIncomingMessage(data) {\n if (this._state !== 1) {\n return;\n }\n\n // Check if data is binary or text\n let binary = true;\n try {\n // Try to detect if it's valid UTF-8 text\n const text = data.toString('utf8');\n if (text.length > 0 && /^[\\x20-\\x7E\\s]*$/.test(text)) {\n binary = false;\n }\n } catch (e) {\n binary = true;\n }\n\n this.emit('message', { data, binary });\n }\n\n /**\n * Handle socket disconnect\n * @private\n */\n _handleDisconnect() {\n if (this._closed) {\n return;\n }\n\n this._socket = null;\n this._state = 3; // closed\n this.emit('statechange', this._state);\n }\n\n /**\n * Send data over the channel\n * @param {Object} dataBuffer - { data: Buffer, binary: boolean }\n */\n send(dataBuffer) {\n if (this._state !== 1) {\n throw new Error('DataChannel is not open');\n }\n\n if (!this._socket || !this._socket.writable) {\n throw new Error('Socket is not writable');\n }\n\n try {\n const data = dataBuffer.data;\n const labelBuffer = Buffer.from(this.label, 'utf8');\n \n // Message format: <length:4><label-length:2><label><data>\n // Length includes label-length field + label + data\n const totalLength = 2 + labelBuffer.length + data.length;\n const header = Buffer.allocUnsafe(6);\n header.writeUInt32BE(totalLength, 0);\n header.writeUInt16BE(labelBuffer.length, 4);\n \n const message = Buffer.concat([header, labelBuffer, data]);\n \n this._bufferedAmount += message.length;\n this._socket.write(message, () => {\n this._bufferedAmount = Math.max(0, this._bufferedAmount - message.length);\n if (this._bufferedAmount === 0) {\n this.emit('bufferedamountlow', 0);\n }\n });\n \n console.log(`[NativeDataChannel] ${this.label} - Sent ${data.length} bytes`);\n } catch (err) {\n console.error(`[NativeDataChannel] ${this.label} - Send error:`, err);\n throw err;\n }\n }\n\n /**\n * Close the channel\n */\n close() {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n this._state = 2; // closing\n this.emit('statechange', this._state);\n\n setTimeout(() => {\n this._state = 3; // closed\n this._socket = null;\n this.emit('statechange', this._state);\n }, 10);\n }\n}\n\nmodule.exports = NativePeerConnectionFactory;\n","const EventEmitter = require('events');\nconst RTCDataChannel = require('./RTCDataChannel');\nconst RTCSessionDescription = require('./RTCSessionDescription');\nconst RTCIceCandidate = require('./RTCIceCandidate');\n\n// Lazy-load factory to avoid circular dependency\nlet _defaultFactory = null;\nfunction getDefaultFactory() {\n if (!_defaultFactory) {\n const NativePeerConnectionFactory = require('./NativePeerConnectionFactory');\n _defaultFactory = new NativePeerConnectionFactory();\n }\n return _defaultFactory;\n}\n\n/**\n * RTCPeerConnection represents a WebRTC connection between the local computer and a remote peer.\n * This is a DataChannel-only implementation ported from Chromium.\n */\nclass RTCPeerConnection extends EventEmitter {\n constructor(configuration, nativePeerConnectionFactory) {\n super();\n \n this._configuration = this._parseConfiguration(configuration || {});\n this._signalingState = 'stable';\n this._iceGatheringState = 'new';\n this._iceConnectionState = 'new';\n this._connectionState = 'new';\n this._pendingLocalDescription = null;\n this._currentLocalDescription = null;\n this._pendingRemoteDescription = null;\n this._currentRemoteDescription = null;\n this._dataChannels = new Map();\n this._closed = false;\n \n // Native peer connection (would be native WebRTC binding)\n this._nativePeerConnection = null;\n // Use provided factory or default factory\n this._nativePeerConnectionFactory = nativePeerConnectionFactory || getDefaultFactory();\n \n // Initialize native peer connection\n this._initializeNativePeerConnection();\n }\n\n /**\n * Parse and validate configuration\n * @private\n */\n _parseConfiguration(config) {\n const configuration = {\n iceServers: [],\n iceTransportPolicy: 'all',\n bundlePolicy: 'balanced',\n rtcpMuxPolicy: 'require',\n iceCandidatePoolSize: 0\n };\n\n if (config.iceServers) {\n configuration.iceServers = config.iceServers.map(server => ({\n urls: Array.isArray(server.urls) ? server.urls : [server.urls],\n username: server.username || '',\n credential: server.credential || ''\n }));\n }\n\n if (config.iceTransportPolicy) {\n configuration.iceTransportPolicy = config.iceTransportPolicy;\n }\n\n if (config.bundlePolicy) {\n configuration.bundlePolicy = config.bundlePolicy;\n }\n\n if (config.rtcpMuxPolicy) {\n configuration.rtcpMuxPolicy = config.rtcpMuxPolicy;\n }\n\n if (config.iceCandidatePoolSize !== undefined) {\n configuration.iceCandidatePoolSize = config.iceCandidatePoolSize;\n }\n\n return configuration;\n }\n\n /**\n * Initialize native peer connection with factory\n * @private\n */\n _initializeNativePeerConnection() {\n if (!this._nativePeerConnectionFactory) {\n throw new Error('Native PeerConnection factory not provided');\n }\n\n // Create native peer connection\n this._nativePeerConnection = this._nativePeerConnectionFactory.createPeerConnection(\n this._configuration\n );\n\n if (!this._nativePeerConnection) {\n throw new Error('Failed to create native peer connection');\n }\n\n // Setup observers\n this._setupObservers();\n }\n\n /**\n * Setup observers for native peer connection events\n * @private\n */\n _setupObservers() {\n if (!this._nativePeerConnection) {\n return;\n }\n\n // Signaling state change\n this._nativePeerConnection.on('signalingstatechange', (state) => {\n this._signalingState = this._convertSignalingState(state);\n this.emit('signalingstatechange');\n });\n\n // ICE connection state change\n this._nativePeerConnection.on('iceconnectionstatechange', (state) => {\n this._iceConnectionState = this._convertIceConnectionState(state);\n this.emit('iceconnectionstatechange');\n });\n\n // ICE gathering state change\n this._nativePeerConnection.on('icegatheringstatechange', (state) => {\n this._iceGatheringState = this._convertIceGatheringState(state);\n this.emit('icegatheringstatechange');\n });\n\n // Connection state change\n this._nativePeerConnection.on('connectionstatechange', (state) => {\n this._connectionState = this._convertConnectionState(state);\n this.emit('connectionstatechange');\n });\n\n // ICE candidate\n this._nativePeerConnection.on('icecandidate', (candidate) => {\n const iceCandidate = candidate ? new RTCIceCandidate(candidate) : null;\n this.emit('icecandidate', { candidate: iceCandidate });\n });\n\n // Data channel (remote)\n this._nativePeerConnection.on('datachannel', (nativeChannel) => {\n const dataChannel = new RTCDataChannel(nativeChannel, this);\n this._dataChannels.set(dataChannel.label, dataChannel);\n this.emit('datachannel', { channel: dataChannel });\n });\n\n // Negotiation needed\n this._nativePeerConnection.on('negotiationneeded', () => {\n this.emit('negotiationneeded');\n });\n }\n\n /**\n * The current signaling state\n */\n get signalingState() {\n return this._signalingState;\n }\n\n /**\n * The current ICE gathering state\n */\n get iceGatheringState() {\n return this._iceGatheringState;\n }\n\n /**\n * The current ICE connection state\n */\n get iceConnectionState() {\n return this._iceConnectionState;\n }\n\n /**\n * The current connection state\n */\n get connectionState() {\n return this._connectionState;\n }\n\n /**\n * The local description\n */\n get localDescription() {\n return this._currentLocalDescription || this._pendingLocalDescription;\n }\n\n /**\n * The remote description\n */\n get remoteDescription() {\n return this._currentRemoteDescription || this._pendingRemoteDescription;\n }\n\n /**\n * The pending local description\n */\n get pendingLocalDescription() {\n return this._pendingLocalDescription;\n }\n\n /**\n * The pending remote description\n */\n get pendingRemoteDescription() {\n return this._pendingRemoteDescription;\n }\n\n /**\n * The current local description\n */\n get currentLocalDescription() {\n return this._currentLocalDescription;\n }\n\n /**\n * The current remote description\n */\n get currentRemoteDescription() {\n return this._currentRemoteDescription;\n }\n\n /**\n * Create an offer\n * @param {Object} options - Offer options\n * @returns {Promise<RTCSessionDescriptionInit>}\n */\n async createOffer(options = {}) {\n this._checkClosed();\n\n if (!this._nativePeerConnection) {\n throw new Error('Native peer connection not available');\n }\n\n try {\n const nativeDescription = await this._nativePeerConnection.createOffer(options);\n return new RTCSessionDescription({\n type: nativeDescription.type,\n sdp: nativeDescription.sdp\n });\n } catch (error) {\n throw new Error(`Failed to create offer: ${error.message}`);\n }\n }\n\n /**\n * Create an answer\n * @param {Object} options - Answer options\n * @returns {Promise<RTCSessionDescriptionInit>}\n */\n async createAnswer(options = {}) {\n this._checkClosed();\n\n if (!this._nativePeerConnection) {\n throw new Error('Native peer connection not available');\n }\n\n try {\n const nativeDescription = await this._nativePeerConnection.createAnswer(options);\n return new RTCSessionDescription({\n type: nativeDescription.type,\n sdp: nativeDescription.sdp\n });\n } catch (error) {\n throw new Error(`Failed to create answer: ${error.message}`);\n }\n }\n\n /**\n * Set the local description\n * @param {RTCSessionDescriptionInit} description\n * @returns {Promise<void>}\n */\n async setLocalDescription(description) {\n this._checkClosed();\n\n if (!this._nativePeerConnection) {\n throw new Error('Native peer connection not available');\n }\n\n try {\n await this._nativePeerConnection.setLocalDescription(description);\n \n if (description.type === 'offer') {\n this._pendingLocalDescription = new RTCSessionDescription(description);\n } else if (description.type === 'answer') {\n this._currentLocalDescription = new RTCSessionDescription(description);\n this._pendingLocalDescription = null;\n } else if (description.type === 'rollback') {\n this._pendingLocalDescription = null;\n }\n } catch (error) {\n throw new Error(`Failed to set local description: ${error.message}`);\n }\n }\n\n /**\n * Set the remote description\n * @param {RTCSessionDescriptionInit} description\n * @returns {Promise<void>}\n */\n async setRemoteDescription(description) {\n this._checkClosed();\n\n if (!this._nativePeerConnection) {\n throw new Error('Native peer connection not available');\n }\n\n try {\n await this._nativePeerConnection.setRemoteDescription(description);\n \n if (description.type === 'offer') {\n this._pendingRemoteDescription = new RTCSessionDescription(description);\n } else if (description.type === 'answer') {\n this._currentRemoteDescription = new RTCSessionDescription(description);\n this._pendingRemoteDescription = null;\n } else if (description.type === 'rollback') {\n this._pendingRemoteDescription = null;\n }\n } catch (error) {\n throw new Error(`Failed to set remote description: ${error.message}`);\n }\n }\n\n /**\n * Add an ICE candidate\n * @param {RTCIceCandidateInit} candidate\n * @returns {Promise<void>}\n */\n async addIceCandidate(candidate) {\n this._checkClosed();\n\n if (!this._nativePeerConnection) {\n throw new Error('Native peer connection not available');\n }\n\n if (!candidate) {\n // End of candidates\n return;\n }\n\n try {\n await this._nativePeerConnection.addIceCandidate(candidate);\n } catch (error) {\n throw new Error(`Failed to add ICE candidate: ${error.message}`);\n }\n }\n\n /**\n * Create a data channel\n * @param {string} label - Channel label\n * @param {Object} dataChannelDict - Channel options\n * @returns {RTCDataChannel}\n */\n createDataChannel(label, dataChannelDict = {}) {\n this._checkClosed();\n\n if (!this._nativePeerConnection) {\n throw new Error('Native peer connection not available');\n }\n\n const options = {\n ordered: dataChannelDict.ordered !== undefined ? dataChannelDict.ordered : true,\n maxPacketLifeTime: dataChannelDict.maxPacketLifeTime,\n maxRetransmits: dataChannelDict.maxRetransmits,\n protocol: dataChannelDict.protocol || '',\n negotiated: dataChannelDict.negotiated || false,\n id: dataChannelDict.id\n };\n\n try {\n const nativeChannel = this._nativePeerConnection.createDataChannel(label, options);\n const dataChannel = new RTCDataChannel(nativeChannel, this);\n this._dataChannels.set(label, dataChannel);\n return dataChannel;\n } catch (error) {\n throw new Error(`Failed to create data channel: ${error.message}`);\n }\n }\n\n /**\n * Get configuration\n * @returns {Object}\n */\n getConfiguration() {\n return { ...this._configuration };\n }\n\n /**\n * Set configuration\n * @param {Object} configuration\n */\n setConfiguration(configuration) {\n this._checkClosed();\n this._configuration = this._parseConfiguration(configuration);\n \n if (this._nativePeerConnection) {\n this._nativePeerConnection.setConfiguration(this._configuration);\n }\n }\n\n /**\n * Close the peer connection\n */\n close() {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n this._signalingState = 'closed';\n\n // Close all data channels\n for (const [label, channel] of this._dataChannels) {\n channel.close();\n channel.dispose();\n }\n this._dataChannels.clear();\n\n // Close native peer connection\n if (this._nativePeerConnection) {\n this._nativePeerConnection.close();\n this._nativePeerConnection.removeAllListeners();\n this._nativePeerConnection = null;\n }\n\n this.emit('signalingstatechange');\n this.removeAllListeners();\n }\n\n /**\n * Get stats\n * @returns {Promise<Object>}\n */\n async getStats() {\n this._checkClosed();\n\n if (!this._nativePeerConnection) {\n throw new Error('Native peer connection not available');\n }\n\n try {\n return await this._nativePeerConnection.getStats();\n } catch (error) {\n throw new Error(`Failed to get stats: ${error.message}`);\n }\n }\n\n /**\n * Check if connection is closed\n * @private\n */\n _checkClosed() {\n if (this._closed || this._signalingState === 'closed') {\n throw new Error(\"The RTCPeerConnection's signalingState is 'closed'\");\n }\n }\n\n /**\n * Convert native signaling state to string\n * @private\n */\n _convertSignalingState(state) {\n const states = ['stable', 'have-local-offer', 'have-remote-offer', \n 'have-local-pranswer', 'have-remote-pranswer', 'closed'];\n return states[state] || 'stable';\n }\n\n /**\n * Convert native ICE connection state to string\n * @private\n */\n _convertIceConnectionState(state) {\n const states = ['new', 'checking', 'connected', 'completed', \n 'failed', 'disconnected', 'closed'];\n return states[state] || 'new';\n }\n\n /**\n * Convert native ICE gathering state to string\n * @private\n */\n _convertIceGatheringState(state) {\n const states = ['new', 'gathering', 'complete'];\n return states[state] || 'new';\n }\n\n /**\n * Convert native connection state to string\n * @private\n */\n _convertConnectionState(state) {\n const states = ['new', 'connecting', 'connected', 'disconnected', \n 'failed', 'closed'];\n return states[state] || 'new';\n }\n}\n\nmodule.exports = RTCPeerConnection;\n","/**\n * RTCDataChannelEvent is fired when a data channel is added to the connection.\n * Ported from Chromium's implementation.\n */\nclass RTCDataChannelEvent {\n constructor(type, eventInitDict = {}) {\n this._type = type;\n this._channel = eventInitDict.channel || null;\n this._bubbles = eventInitDict.bubbles || false;\n this._cancelable = eventInitDict.cancelable || false;\n this._timestamp = Date.now();\n }\n\n /**\n * The event type\n */\n get type() {\n return this._type;\n }\n\n /**\n * The RTCDataChannel associated with the event\n */\n get channel() {\n return this._channel;\n }\n\n /**\n * Whether the event bubbles\n */\n get bubbles() {\n return this._bubbles;\n }\n\n /**\n * Whether the event is cancelable\n */\n get cancelable() {\n return this._cancelable;\n }\n\n /**\n * The timestamp when the event was created\n */\n get timeStamp() {\n return this._timestamp;\n }\n}\n\nmodule.exports = RTCDataChannelEvent;\n","/**\n * RTCPeerConnectionIceEvent is fired when an ICE candidate is available.\n * Ported from Chromium's implementation.\n */\nclass RTCPeerConnectionIceEvent {\n constructor(type, eventInitDict = {}) {\n this._type = type;\n this._candidate = eventInitDict.candidate || null;\n this._url = eventInitDict.url || null;\n this._bubbles = eventInitDict.bubbles || false;\n this._cancelable = eventInitDict.cancelable || false;\n this._timestamp = Date.now();\n }\n\n /**\n * The event type\n */\n get type() {\n return this._type;\n }\n\n /**\n * The RTCIceCandidate associated with the event\n */\n get candidate() {\n return this._candidate;\n }\n\n /**\n * The URL of the TURN or STUN server\n */\n get url() {\n return this._url;\n }\n\n /**\n * Whether the event bubbles\n */\n get bubbles() {\n return this._bubbles;\n }\n\n /**\n * Whether the event is cancelable\n */\n get cancelable() {\n return this._cancelable;\n }\n\n /**\n * The timestamp when the event was created\n */\n get timeStamp() {\n return this._timestamp;\n }\n}\n\nmodule.exports = RTCPeerConnectionIceEvent;\n","/**\n * RTCErrorEvent represents an error event.\n * Ported from Chromium's implementation.\n */\nclass RTCErrorEvent {\n constructor(type, eventInitDict = {}) {\n this._type = type;\n this._error = eventInitDict.error || null;\n this._bubbles = eventInitDict.bubbles || false;\n this._cancelable = eventInitDict.cancelable || false;\n this._timestamp = Date.now();\n }\n\n /**\n * The event type\n */\n get type() {\n return this._type;\n }\n\n /**\n * The error associated with the event\n */\n get error() {\n return this._error;\n }\n\n /**\n * Whether the event bubbles\n */\n get bubbles() {\n return this._bubbles;\n }\n\n /**\n * Whether the event is cancelable\n */\n get cancelable() {\n return this._cancelable;\n }\n\n /**\n * The timestamp when the event was created\n */\n get timeStamp() {\n return this._timestamp;\n }\n}\n\n/**\n * RTCError represents a WebRTC-specific error.\n */\nclass RTCError extends Error {\n constructor(errorDetail, message) {\n super(message);\n this.name = 'RTCError';\n this.errorDetail = errorDetail;\n this.sdpLineNumber = null;\n this.httpRequestStatusCode = null;\n this.sctpCauseCode = null;\n this.receivedAlert = null;\n this.sentAlert = null;\n }\n}\n\nmodule.exports = { RTCErrorEvent, RTCError };\n","/**\n * NodeRTC - DataChannel-only WebRTC implementation for Node.js\n * Ported from Chromium's PeerConnection implementation\n * \n * This is a simplified implementation focusing on DataChannel functionality.\n * It does not include media stream support (audio/video).\n */\n\nconst RTCPeerConnection = require('./RTCPeerConnection');\nconst RTCDataChannel = require('./RTCDataChannel');\nconst RTCSessionDescription = require('./RTCSessionDescription');\nconst RTCIceCandidate = require('./RTCIceCandidate');\nconst RTCDataChannelEvent = require('./RTCDataChannelEvent');\nconst RTCPeerConnectionIceEvent = require('./RTCPeerConnectionIceEvent');\nconst { RTCError, RTCErrorEvent } = require('./RTCError');\nconst NativePeerConnectionFactory = require('./NativePeerConnectionFactory');\n\n// Create a singleton factory instance\nconst defaultFactory = new NativePeerConnectionFactory();\n\n/**\n * Create a new RTCPeerConnection with the default factory\n * @param {Object} configuration - RTCConfiguration\n * @returns {RTCPeerConnection}\n */\nfunction createPeerConnection(configuration) {\n return new RTCPeerConnection(configuration, defaultFactory);\n}\n\n/**\n * Create a custom RTCPeerConnection with a specific factory\n * @param {Object} configuration - RTCConfiguration\n * @param {NativePeerConnectionFactory} factory - Custom factory\n * @returns {RTCPeerConnection}\n */\nfunction createPeerConnectionWithFactory(configuration, factory) {\n return new RTCPeerConnection(configuration, factory);\n}\n\nmodule.exports = {\n // Main API\n RTCPeerConnection,\n RTCConnection: RTCPeerConnection, // Alias for convenience\n createPeerConnection,\n createPeerConnectionWithFactory,\n \n // Classes\n RTCDataChannel,\n RTCSessionDescription,\n RTCIceCandidate,\n RTCDataChannelEvent,\n RTCPeerConnectionIceEvent,\n RTCError,\n RTCErrorEvent,\n \n // Factory\n NativePeerConnectionFactory,\n defaultFactory\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$$0","require$$1","require$$2","require$$3","require$$4","require$$5","require$$6","require$$7","require$$8"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","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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"}