@afterrealism/dendri-client 2.3.7 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -21
- package/README.md +65 -72
- package/dist/{chunk-MJW5M75V.js → chunk-3CE674DE.js} +267 -24
- package/dist/chunk-3CE674DE.js.map +1 -0
- package/dist/dendri.browser.global.js +233 -18
- package/dist/dendri.browser.global.js.map +1 -1
- package/dist/dendri.cjs +266 -22
- package/dist/dendri.cjs.map +1 -1
- package/dist/dendri.d.cts +13 -4
- package/dist/dendri.d.ts +13 -4
- package/dist/dendri.js +3 -3
- package/dist/dendri.js.map +1 -1
- package/dist/dendri.min.global.js +13 -13
- package/dist/dendri.min.global.js.map +1 -1
- package/dist/serializer.msgpack.cjs +3 -3
- package/dist/serializer.msgpack.cjs.map +1 -1
- package/dist/serializer.msgpack.d.cts +31 -4
- package/dist/serializer.msgpack.d.ts +31 -4
- package/dist/serializer.msgpack.js +2 -2
- package/dist/serializer.msgpack.js.map +1 -1
- package/dist/{store-RTivRmUW.d.cts → store-C3Nwl62R.d.cts} +38 -5
- package/dist/{store-RTivRmUW.d.ts → store-C3Nwl62R.d.ts} +38 -5
- package/dist/store.cjs +256 -21
- package/dist/store.cjs.map +1 -1
- package/dist/store.d.cts +1 -1
- package/dist/store.d.ts +1 -1
- package/dist/store.js +1 -1
- package/package.json +8 -2
- package/dist/chunk-MJW5M75V.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/.pnpm/sdp@3.2.2/node_modules/sdp/sdp.js","../node_modules/.pnpm/eventemitter3@4.0.7/node_modules/eventemitter3/index.js","../src/logger.ts","../node_modules/.pnpm/peerjs-js-binarypack@2.1.0/node_modules/peerjs-js-binarypack/lib/bufferbuilder.ts","../node_modules/.pnpm/peerjs-js-binarypack@2.1.0/node_modules/peerjs-js-binarypack/lib/binarypack.ts","../src/dataconnection/BufferedConnection/binaryPackChunker.ts","../node_modules/.pnpm/webrtc-adapter@9.0.5/node_modules/webrtc-adapter/src/js/utils.js","../node_modules/.pnpm/webrtc-adapter@9.0.5/node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","../node_modules/.pnpm/webrtc-adapter@9.0.5/node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","../node_modules/.pnpm/webrtc-adapter@9.0.5/node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","../node_modules/.pnpm/webrtc-adapter@9.0.5/node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","../node_modules/.pnpm/webrtc-adapter@9.0.5/node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","../node_modules/.pnpm/webrtc-adapter@9.0.5/node_modules/webrtc-adapter/src/js/safari/safari_shim.js","../node_modules/.pnpm/webrtc-adapter@9.0.5/node_modules/webrtc-adapter/src/js/common_shim.js","../node_modules/.pnpm/webrtc-adapter@9.0.5/node_modules/webrtc-adapter/src/js/adapter_factory.js","../node_modules/.pnpm/webrtc-adapter@9.0.5/node_modules/webrtc-adapter/src/js/adapter_core.js","../src/supports.ts","../src/utils/randomToken.ts","../src/utils/validateId.ts","../src/util.ts","../src/api.ts","../src/enums.ts","../src/dendriError.ts","../src/baseconnection.ts","../src/negotiator.ts","../src/dataconnection/DataConnection.ts","../src/dataconnection/BufferedConnection/BufferedConnection.ts","../src/dataconnection/BufferedConnection/BinaryPack.ts","../src/dataconnection/BufferedConnection/Json.ts","../src/dataconnection/BufferedConnection/Raw.ts","../src/hybridconnection.ts","../src/ack.ts","../src/encryption.ts","../src/topics.ts","../src/mediaconnection.ts","../src/transport.ts","../src/polling-transport.ts","../src/socket.ts","../src/sse-transport.ts","../src/dendri.ts","../src/room.ts","../src/hostmigration.ts","../src/presence.ts","../src/rpc.ts","../src/store.ts"],"names":["exports","SDPUtils","sdp","version","EventEmitter","window","navigator","shimGetUserMedia","shimOnTrack","shimPeerConnection","RTCPeerConnection","logging","adapter","ConnectionType","DendriErrorType","BaseConnectionErrorType","DataConnectionErrorType","SerializationType","SocketEventType","ServerMessageType","TransportMode","ConnectionState","ConnectionQuality","data","blob","import_eventemitter3","id","message","RpcErrorCode"],"mappings":"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","file":"chunk-MJW5M75V.js","sourcesContent":["/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nconst SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substring(2, 12);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(line => line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index) => (index > 0 ?\n 'm=' + part : part).trim() + '\\r\\n');\n};\n\n// Returns the session description.\nSDPUtils.getDescription = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// Returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(line => line.indexOf(prefix) === 0);\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\n// Input can be prefixed with a=.\nSDPUtils.parseCandidate = function(line) {\n let parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n const candidate = {\n foundation: parts[0],\n component: {1: 'rtp', 2: 'rtcp'}[parts[1]] || parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7],\n };\n\n for (let i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag. Don't overwrite.\n if (candidate[parts[i]] === undefined) {\n candidate[parts[i]] = parts[i + 1];\n }\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\nSDPUtils.writeCandidate = function(candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n\n const component = candidate.component;\n if (component === 'rtp') {\n sdp.push(1);\n } else if (component === 'rtcp') {\n sdp.push(2);\n } else {\n sdp.push(component);\n }\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n const type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort !== undefined) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// Sample input:\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substring(14).split(' ');\n};\n\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n let parts = line.substring(9).split(' ');\n const parsed = {\n payloadType: parseInt(parts.shift(), 10), // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n const channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses a extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1],\n attributes: parts.slice(2).join(' '),\n };\n};\n\n// Generates an extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri +\n (headerExtension.attributes ? ' ' + headerExtension.attributes : '') +\n '\\r\\n';\n};\n\n// Parses a fmtp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\n// Non-key-value such as telephone-events `0-15` get parsed as\n// {`0-15`:undefined}\nSDPUtils.parseFmtp = function(line) {\n const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for (let j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach(param => {\n if (codec.parameters[param] !== undefined) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' '),\n };\n};\n\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n let lines = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(fb => {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10),\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else {\n parts.attribute = line.substring(sp + 1);\n }\n return parts;\n};\n\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\nSDPUtils.parseSsrcGroup = function(line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(ssrc => parseInt(ssrc, 10)),\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// Returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substring(6);\n }\n};\n\n// Parses a fingerprint line for DTLS-SRTP.\nSDPUtils.parseFingerprint = function(line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1].toUpperCase(), // the definition is upper-case in RFC 4572.\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint),\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(fp => {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n const parts = line.substring(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n const parts = keyParams.substring(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES parameters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) {\n sdp += 'a=ice-lite\\r\\n';\n }\n return sdp;\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: [],\n };\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for (let i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n const pt = mline[i];\n const rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp:<pt> is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.forEach(codec => {\n wildcardRtcpFb.forEach(fb=> {\n const duplicate = codec.rtcpFeedback.find(existingFeedback => {\n return existingFeedback.type === fb.type &&\n existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) {\n codec.rtcpFeedback.push(fb);\n }\n });\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n let sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map(codec => {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(codec => {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach(codec => {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(extension => {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n const encodingParameters = [];\n const description = SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(parts => parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n\n const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(line => {\n const parts = line.substring(17).split(' ');\n return parts.map(part => parseInt(part, 10));\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(codec => {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10),\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red',\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc,\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substring(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substring(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(params => {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n const rtcpParameters = {};\n\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(obj => obj.attribute === 'cname')[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\nSDPUtils.writeRtcpParameters = function(rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n if (rtcpParameters.mux) {\n sdp += 'a=rtcp-mux\\r\\n';\n }\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) {\n sdp += 'a=ssrc:' + rtcpParameters.ssrc +\n ' cname:' + rtcpParameters.cname + '\\r\\n';\n }\n return sdp;\n};\n\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n let parts;\n const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(msidParts => msidParts.attribute === 'msid');\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n const mline = SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize,\n };\n }\n const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0]\n .substring(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize,\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n let output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n',\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n',\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 22);\n};\n\n// Write boiler plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n const user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n const lines = SDPUtils.splitLines(mediaSection);\n for (let i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substring(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' '),\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5],\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n const lines = SDPUtils.splitLines(blob);\n for (let i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","const LOG_PREFIX = \"Dendri: \";\n\n/*\nPrints log messages depending on the debug level passed in. Defaults to 0.\n0 Prints no logs.\n1 Prints only errors.\n2 Prints errors and warnings.\n3 Prints all logs.\n*/\nexport enum LogLevel {\n\t/**\n\t * Prints no logs.\n\t */\n\tDisabled,\n\t/**\n\t * Prints only errors.\n\t */\n\tErrors,\n\t/**\n\t * Prints errors and warnings.\n\t */\n\tWarnings,\n\t/**\n\t * Prints all logs.\n\t */\n\tAll,\n}\n\nclass Logger {\n\tprivate _logLevel = LogLevel.Disabled;\n\n\tget logLevel(): LogLevel {\n\t\treturn this._logLevel;\n\t}\n\n\tset logLevel(logLevel: LogLevel) {\n\t\tthis._logLevel = logLevel;\n\t}\n\n\tlog(...args: any[]) {\n\t\tif (this._logLevel >= LogLevel.All) {\n\t\t\tthis._print(LogLevel.All, ...args);\n\t\t}\n\t}\n\n\twarn(...args: any[]) {\n\t\tif (this._logLevel >= LogLevel.Warnings) {\n\t\t\tthis._print(LogLevel.Warnings, ...args);\n\t\t}\n\t}\n\n\terror(...args: any[]) {\n\t\tif (this._logLevel >= LogLevel.Errors) {\n\t\t\tthis._print(LogLevel.Errors, ...args);\n\t\t}\n\t}\n\n\tsetLogFunction(fn: (logLevel: LogLevel, ..._: any[]) => void): void {\n\t\tthis._print = fn;\n\t}\n\n\tprivate _print(logLevel: LogLevel, ...rest: any[]): void {\n\t\tconst copy = [LOG_PREFIX, ...rest];\n\n\t\tfor (const i in copy) {\n\t\t\tif (copy[i] instanceof Error) {\n\t\t\t\tcopy[i] = `(${copy[i].name}) ${copy[i].message}`;\n\t\t\t}\n\t\t}\n\n\t\tif (logLevel >= LogLevel.All) {\n\t\t\tconsole.log(...copy);\n\t\t} else if (logLevel >= LogLevel.Warnings) {\n\t\t\tconsole.warn(\"WARNING\", ...copy);\n\t\t} else if (logLevel >= LogLevel.Errors) {\n\t\t\tconsole.error(\"ERROR\", ...copy);\n\t\t}\n\t}\n}\n\nexport default new Logger();\n","class BufferBuilder {\n\tprivate _pieces: number[];\n\tprivate readonly _parts: ArrayBufferView[];\n\n\tconstructor() {\n\t\tthis._pieces = [];\n\t\tthis._parts = [];\n\t}\n\n\tappend_buffer(data: ArrayBufferView) {\n\t\tthis.flush();\n\t\tthis._parts.push(data);\n\t}\n\n\tappend(data: number) {\n\t\tthis._pieces.push(data);\n\t}\n\n\tflush() {\n\t\tif (this._pieces.length > 0) {\n\t\t\tconst buf = new Uint8Array(this._pieces);\n\t\t\tthis._parts.push(buf);\n\t\t\tthis._pieces = [];\n\t\t}\n\t}\n\n\tprivate encoder = new TextEncoder();\n\n\tpublic toArrayBuffer() {\n\t\tconst buffer = [];\n\t\tfor (const part of this._parts) {\n\t\t\tbuffer.push(part);\n\t\t}\n\t\treturn concatArrayBuffers(buffer).buffer;\n\t}\n}\n\nexport { BufferBuilder };\n\nfunction concatArrayBuffers(bufs: ArrayBufferView[]) {\n\tlet size = 0;\n\tfor (const buf of bufs) {\n\t\tsize += buf.byteLength;\n\t}\n\tconst result = new Uint8Array(size);\n\tlet offset = 0;\n\tfor (const buf of bufs) {\n\t\tconst view = new Uint8Array(buf.buffer, buf.byteOffset, buf.byteLength);\n\t\tresult.set(view, offset);\n\t\toffset += buf.byteLength;\n\t}\n\treturn result;\n}\n","import { BufferBuilder } from \"./bufferbuilder\";\n\nexport type Packable =\n\t| null\n\t| undefined\n\t| string\n\t| number\n\t| boolean\n\t| Date\n\t| ArrayBuffer\n\t| Blob\n\t| Array<Packable>\n\t| { [key: string]: Packable }\n\t| ({ BYTES_PER_ELEMENT: number } & ArrayBufferView);\nexport type Unpackable =\n\t| null\n\t| undefined\n\t| string\n\t| number\n\t| boolean\n\t| ArrayBuffer\n\t| Array<Unpackable>\n\t| { [key: string]: Unpackable };\n\nexport function unpack<T extends Unpackable>(data: ArrayBuffer) {\n\tconst unpacker = new Unpacker(data);\n\treturn unpacker.unpack() as T;\n}\n\nexport function pack(data: Packable) {\n\tconst packer = new Packer();\n\tconst res = packer.pack(data);\n\tif (res instanceof Promise) {\n\t\treturn res.then(() => packer.getBuffer());\n\t}\n\treturn packer.getBuffer();\n}\n\nclass Unpacker {\n\tprivate index: number;\n\tprivate readonly dataBuffer: ArrayBuffer;\n\tprivate readonly dataView: Uint8Array;\n\tprivate readonly length: number;\n\n\tconstructor(data: ArrayBuffer) {\n\t\tthis.index = 0;\n\t\tthis.dataBuffer = data;\n\t\tthis.dataView = new Uint8Array(this.dataBuffer);\n\t\tthis.length = this.dataBuffer.byteLength;\n\t}\n\n\tunpack(): Unpackable {\n\t\tconst type = this.unpack_uint8();\n\t\tif (type < 0x80) {\n\t\t\treturn type;\n\t\t} else if ((type ^ 0xe0) < 0x20) {\n\t\t\treturn (type ^ 0xe0) - 0x20;\n\t\t}\n\n\t\tlet size;\n\t\tif ((size = type ^ 0xa0) <= 0x0f) {\n\t\t\treturn this.unpack_raw(size);\n\t\t} else if ((size = type ^ 0xb0) <= 0x0f) {\n\t\t\treturn this.unpack_string(size);\n\t\t} else if ((size = type ^ 0x90) <= 0x0f) {\n\t\t\treturn this.unpack_array(size);\n\t\t} else if ((size = type ^ 0x80) <= 0x0f) {\n\t\t\treturn this.unpack_map(size);\n\t\t}\n\n\t\tswitch (type) {\n\t\t\tcase 0xc0:\n\t\t\t\treturn null;\n\t\t\tcase 0xc1:\n\t\t\t\treturn undefined;\n\t\t\tcase 0xc2:\n\t\t\t\treturn false;\n\t\t\tcase 0xc3:\n\t\t\t\treturn true;\n\t\t\tcase 0xca:\n\t\t\t\treturn this.unpack_float();\n\t\t\tcase 0xcb:\n\t\t\t\treturn this.unpack_double();\n\t\t\tcase 0xcc:\n\t\t\t\treturn this.unpack_uint8();\n\t\t\tcase 0xcd:\n\t\t\t\treturn this.unpack_uint16();\n\t\t\tcase 0xce:\n\t\t\t\treturn this.unpack_uint32();\n\t\t\tcase 0xcf:\n\t\t\t\treturn this.unpack_uint64();\n\t\t\tcase 0xd0:\n\t\t\t\treturn this.unpack_int8();\n\t\t\tcase 0xd1:\n\t\t\t\treturn this.unpack_int16();\n\t\t\tcase 0xd2:\n\t\t\t\treturn this.unpack_int32();\n\t\t\tcase 0xd3:\n\t\t\t\treturn this.unpack_int64();\n\t\t\tcase 0xd4:\n\t\t\t\treturn undefined;\n\t\t\tcase 0xd5:\n\t\t\t\treturn undefined;\n\t\t\tcase 0xd6:\n\t\t\t\treturn undefined;\n\t\t\tcase 0xd7:\n\t\t\t\treturn undefined;\n\t\t\tcase 0xd8:\n\t\t\t\tsize = this.unpack_uint16();\n\t\t\t\treturn this.unpack_string(size);\n\t\t\tcase 0xd9:\n\t\t\t\tsize = this.unpack_uint32();\n\t\t\t\treturn this.unpack_string(size);\n\t\t\tcase 0xda:\n\t\t\t\tsize = this.unpack_uint16();\n\t\t\t\treturn this.unpack_raw(size);\n\t\t\tcase 0xdb:\n\t\t\t\tsize = this.unpack_uint32();\n\t\t\t\treturn this.unpack_raw(size);\n\t\t\tcase 0xdc:\n\t\t\t\tsize = this.unpack_uint16();\n\t\t\t\treturn this.unpack_array(size);\n\t\t\tcase 0xdd:\n\t\t\t\tsize = this.unpack_uint32();\n\t\t\t\treturn this.unpack_array(size);\n\t\t\tcase 0xde:\n\t\t\t\tsize = this.unpack_uint16();\n\t\t\t\treturn this.unpack_map(size);\n\t\t\tcase 0xdf:\n\t\t\t\tsize = this.unpack_uint32();\n\t\t\t\treturn this.unpack_map(size);\n\t\t}\n\t}\n\n\tunpack_uint8() {\n\t\tconst byte = this.dataView[this.index] & 0xff;\n\t\tthis.index++;\n\t\treturn byte;\n\t}\n\n\tunpack_uint16() {\n\t\tconst bytes = this.read(2);\n\t\tconst uint16 = (bytes[0] & 0xff) * 256 + (bytes[1] & 0xff);\n\t\tthis.index += 2;\n\t\treturn uint16;\n\t}\n\n\tunpack_uint32() {\n\t\tconst bytes = this.read(4);\n\t\tconst uint32 =\n\t\t\t((bytes[0] * 256 + bytes[1]) * 256 + bytes[2]) * 256 + bytes[3];\n\t\tthis.index += 4;\n\t\treturn uint32;\n\t}\n\n\tunpack_uint64() {\n\t\tconst bytes = this.read(8);\n\t\tconst uint64 =\n\t\t\t((((((bytes[0] * 256 + bytes[1]) * 256 + bytes[2]) * 256 + bytes[3]) *\n\t\t\t\t256 +\n\t\t\t\tbytes[4]) *\n\t\t\t\t256 +\n\t\t\t\tbytes[5]) *\n\t\t\t\t256 +\n\t\t\t\tbytes[6]) *\n\t\t\t\t256 +\n\t\t\tbytes[7];\n\t\tthis.index += 8;\n\t\treturn uint64;\n\t}\n\n\tunpack_int8() {\n\t\tconst uint8 = this.unpack_uint8();\n\t\treturn uint8 < 0x80 ? uint8 : uint8 - (1 << 8);\n\t}\n\n\tunpack_int16() {\n\t\tconst uint16 = this.unpack_uint16();\n\t\treturn uint16 < 0x8000 ? uint16 : uint16 - (1 << 16);\n\t}\n\n\tunpack_int32() {\n\t\tconst uint32 = this.unpack_uint32();\n\t\treturn uint32 < 2 ** 31 ? uint32 : uint32 - 2 ** 32;\n\t}\n\n\tunpack_int64() {\n\t\tconst uint64 = this.unpack_uint64();\n\t\treturn uint64 < 2 ** 63 ? uint64 : uint64 - 2 ** 64;\n\t}\n\n\tunpack_raw(size: number) {\n\t\tif (this.length < this.index + size) {\n\t\t\tthrow new Error(\n\t\t\t\t`BinaryPackFailure: index is out of range ${this.index} ${size} ${this.length}`,\n\t\t\t);\n\t\t}\n\t\tconst buf = this.dataBuffer.slice(this.index, this.index + size);\n\t\tthis.index += size;\n\n\t\treturn buf;\n\t}\n\n\tunpack_string(size: number) {\n\t\tconst bytes = this.read(size);\n\t\tlet i = 0;\n\t\tlet str = \"\";\n\t\tlet c;\n\t\tlet code;\n\n\t\twhile (i < size) {\n\t\t\tc = bytes[i];\n\t\t\t// The length of a UTF-8 sequence is specified in the first byte:\n\t\t\t// 0xxxxxxx means length 1,\n\t\t\t// 110xxxxx means length 2,\n\t\t\t// 1110xxxx means length 3,\n\t\t\t// 11110xxx means length 4.\n\t\t\t// 10xxxxxx is for non-initial bytes.\n\t\t\tif (c < 0xa0) {\n\t\t\t\t// One-byte sequence: bits 0xxxxxxx\n\t\t\t\tcode = c;\n\t\t\t\ti++;\n\t\t\t} else if ((c ^ 0xc0) < 0x20) {\n\t\t\t\t// Two-byte sequence: bits 110xxxxx 10xxxxxx\n\t\t\t\tcode = ((c & 0x1f) << 6) | (bytes[i + 1] & 0x3f);\n\t\t\t\ti += 2;\n\t\t\t} else if ((c ^ 0xe0) < 0x10) {\n\t\t\t\t// Three-byte sequence: bits 1110xxxx 10xxxxxx 10xxxxxx\n\t\t\t\tcode =\n\t\t\t\t\t((c & 0x0f) << 12) |\n\t\t\t\t\t((bytes[i + 1] & 0x3f) << 6) |\n\t\t\t\t\t(bytes[i + 2] & 0x3f);\n\t\t\t\ti += 3;\n\t\t\t} else {\n\t\t\t\t// Four-byte sequence: bits 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx\n\t\t\t\tcode =\n\t\t\t\t\t((c & 0x07) << 18) |\n\t\t\t\t\t((bytes[i + 1] & 0x3f) << 12) |\n\t\t\t\t\t((bytes[i + 2] & 0x3f) << 6) |\n\t\t\t\t\t(bytes[i + 3] & 0x3f);\n\t\t\t\ti += 4;\n\t\t\t}\n\t\t\tstr += String.fromCodePoint(code);\n\t\t}\n\n\t\tthis.index += size;\n\t\treturn str;\n\t}\n\n\tunpack_array(size: number) {\n\t\tconst objects = new Array<Unpackable>(size);\n\t\tfor (let i = 0; i < size; i++) {\n\t\t\tobjects[i] = this.unpack();\n\t\t}\n\t\treturn objects;\n\t}\n\n\tunpack_map(size: number) {\n\t\tconst map: { [key: string]: Unpackable } = {};\n\t\tfor (let i = 0; i < size; i++) {\n\t\t\tconst key = this.unpack() as string;\n\t\t\tmap[key] = this.unpack();\n\t\t}\n\t\treturn map;\n\t}\n\n\tunpack_float() {\n\t\tconst uint32 = this.unpack_uint32();\n\t\tconst sign = uint32 >> 31;\n\t\tconst exp = ((uint32 >> 23) & 0xff) - 127;\n\t\tconst fraction = (uint32 & 0x7fffff) | 0x800000;\n\t\treturn (sign === 0 ? 1 : -1) * fraction * 2 ** (exp - 23);\n\t}\n\n\tunpack_double() {\n\t\tconst h32 = this.unpack_uint32();\n\t\tconst l32 = this.unpack_uint32();\n\t\tconst sign = h32 >> 31;\n\t\tconst exp = ((h32 >> 20) & 0x7ff) - 1023;\n\t\tconst hfrac = (h32 & 0xfffff) | 0x100000;\n\t\tconst frac = hfrac * 2 ** (exp - 20) + l32 * 2 ** (exp - 52);\n\t\treturn (sign === 0 ? 1 : -1) * frac;\n\t}\n\n\tread(length: number) {\n\t\tconst j = this.index;\n\t\tif (j + length <= this.length) {\n\t\t\treturn this.dataView.subarray(j, j + length);\n\t\t} else {\n\t\t\tthrow new Error(\"BinaryPackFailure: read index out of range\");\n\t\t}\n\t}\n}\n\nexport class Packer {\n\tprivate _bufferBuilder = new BufferBuilder();\n\tprivate _textEncoder = new TextEncoder();\n\n\tgetBuffer() {\n\t\treturn this._bufferBuilder.toArrayBuffer();\n\t}\n\n\tpack(value: Packable) {\n\t\tif (typeof value === \"string\") {\n\t\t\tthis.pack_string(value);\n\t\t} else if (typeof value === \"number\") {\n\t\t\tif (Math.floor(value) === value) {\n\t\t\t\tthis.pack_integer(value);\n\t\t\t} else {\n\t\t\t\tthis.pack_double(value);\n\t\t\t}\n\t\t} else if (typeof value === \"boolean\") {\n\t\t\tif (value === true) {\n\t\t\t\tthis._bufferBuilder.append(0xc3);\n\t\t\t} else if (value === false) {\n\t\t\t\tthis._bufferBuilder.append(0xc2);\n\t\t\t}\n\t\t} else if (value === undefined) {\n\t\t\tthis._bufferBuilder.append(0xc0);\n\t\t} else if (typeof value === \"object\") {\n\t\t\tif (value === null) {\n\t\t\t\tthis._bufferBuilder.append(0xc0);\n\t\t\t} else {\n\t\t\t\tconst constructor = value.constructor;\n\t\t\t\tif (value instanceof Array) {\n\t\t\t\t\tconst res = this.pack_array(value);\n\t\t\t\t\tif (res instanceof Promise) {\n\t\t\t\t\t\treturn res.then(() => this._bufferBuilder.flush());\n\t\t\t\t\t}\n\t\t\t\t} else if (value instanceof ArrayBuffer) {\n\t\t\t\t\tthis.pack_bin(new Uint8Array(value));\n\t\t\t\t} else if (\"BYTES_PER_ELEMENT\" in value) {\n\t\t\t\t\tconst v = value as unknown as DataView;\n\t\t\t\t\tthis.pack_bin(new Uint8Array(v.buffer, v.byteOffset, v.byteLength));\n\t\t\t\t} else if (value instanceof Date) {\n\t\t\t\t\tthis.pack_string(value.toString());\n\t\t\t\t} else if (value instanceof Blob) {\n\t\t\t\t\treturn value.arrayBuffer().then((buffer) => {\n\t\t\t\t\t\tthis.pack_bin(new Uint8Array(buffer));\n\t\t\t\t\t\tthis._bufferBuilder.flush();\n\t\t\t\t\t});\n\t\t\t\t\t// this.pack_bin(new Uint8Array(await value.arrayBuffer()));\n\t\t\t\t} else if (\n\t\t\t\t\tconstructor == Object ||\n\t\t\t\t\tconstructor.toString().startsWith(\"class\")\n\t\t\t\t) {\n\t\t\t\t\tconst res = this.pack_object(value);\n\t\t\t\t\tif (res instanceof Promise) {\n\t\t\t\t\t\treturn res.then(() => this._bufferBuilder.flush());\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthrow new Error(`Type \"${constructor.toString()}\" not yet supported`);\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new Error(`Type \"${typeof value}\" not yet supported`);\n\t\t}\n\t\tthis._bufferBuilder.flush();\n\t}\n\n\tpack_bin(blob: Uint8Array) {\n\t\tconst length = blob.length;\n\n\t\tif (length <= 0x0f) {\n\t\t\tthis.pack_uint8(0xa0 + length);\n\t\t} else if (length <= 0xffff) {\n\t\t\tthis._bufferBuilder.append(0xda);\n\t\t\tthis.pack_uint16(length);\n\t\t} else if (length <= 0xffffffff) {\n\t\t\tthis._bufferBuilder.append(0xdb);\n\t\t\tthis.pack_uint32(length);\n\t\t} else {\n\t\t\tthrow new Error(\"Invalid length\");\n\t\t}\n\t\tthis._bufferBuilder.append_buffer(blob);\n\t}\n\n\tpack_string(str: string) {\n\t\tconst encoded = this._textEncoder.encode(str);\n\t\tconst length = encoded.length;\n\n\t\tif (length <= 0x0f) {\n\t\t\tthis.pack_uint8(0xb0 + length);\n\t\t} else if (length <= 0xffff) {\n\t\t\tthis._bufferBuilder.append(0xd8);\n\t\t\tthis.pack_uint16(length);\n\t\t} else if (length <= 0xffffffff) {\n\t\t\tthis._bufferBuilder.append(0xd9);\n\t\t\tthis.pack_uint32(length);\n\t\t} else {\n\t\t\tthrow new Error(\"Invalid length\");\n\t\t}\n\t\tthis._bufferBuilder.append_buffer(encoded);\n\t}\n\n\tpack_array(ary: Packable[]) {\n\t\tconst length = ary.length;\n\t\tif (length <= 0x0f) {\n\t\t\tthis.pack_uint8(0x90 + length);\n\t\t} else if (length <= 0xffff) {\n\t\t\tthis._bufferBuilder.append(0xdc);\n\t\t\tthis.pack_uint16(length);\n\t\t} else if (length <= 0xffffffff) {\n\t\t\tthis._bufferBuilder.append(0xdd);\n\t\t\tthis.pack_uint32(length);\n\t\t} else {\n\t\t\tthrow new Error(\"Invalid length\");\n\t\t}\n\n\t\tconst packNext = (index: number): Promise<void> | void => {\n\t\t\tif (index < length) {\n\t\t\t\tconst res = this.pack(ary[index]);\n\t\t\t\tif (res instanceof Promise) {\n\t\t\t\t\treturn res.then(() => packNext(index + 1));\n\t\t\t\t}\n\t\t\t\treturn packNext(index + 1);\n\t\t\t}\n\t\t};\n\n\t\treturn packNext(0);\n\t}\n\n\tpack_integer(num: number) {\n\t\tif (num >= -0x20 && num <= 0x7f) {\n\t\t\tthis._bufferBuilder.append(num & 0xff);\n\t\t} else if (num >= 0x00 && num <= 0xff) {\n\t\t\tthis._bufferBuilder.append(0xcc);\n\t\t\tthis.pack_uint8(num);\n\t\t} else if (num >= -0x80 && num <= 0x7f) {\n\t\t\tthis._bufferBuilder.append(0xd0);\n\t\t\tthis.pack_int8(num);\n\t\t} else if (num >= 0x0000 && num <= 0xffff) {\n\t\t\tthis._bufferBuilder.append(0xcd);\n\t\t\tthis.pack_uint16(num);\n\t\t} else if (num >= -0x8000 && num <= 0x7fff) {\n\t\t\tthis._bufferBuilder.append(0xd1);\n\t\t\tthis.pack_int16(num);\n\t\t} else if (num >= 0x00000000 && num <= 0xffffffff) {\n\t\t\tthis._bufferBuilder.append(0xce);\n\t\t\tthis.pack_uint32(num);\n\t\t} else if (num >= -0x80000000 && num <= 0x7fffffff) {\n\t\t\tthis._bufferBuilder.append(0xd2);\n\t\t\tthis.pack_int32(num);\n\t\t} else if (num >= -0x8000000000000000 && num <= 0x7fffffffffffffff) {\n\t\t\tthis._bufferBuilder.append(0xd3);\n\t\t\tthis.pack_int64(num);\n\t\t} else if (num >= 0x0000000000000000 && num <= 0xffffffffffffffff) {\n\t\t\tthis._bufferBuilder.append(0xcf);\n\t\t\tthis.pack_uint64(num);\n\t\t} else {\n\t\t\tthrow new Error(\"Invalid integer\");\n\t\t}\n\t}\n\n\tpack_double(num: number) {\n\t\tlet sign = 0;\n\t\tif (num < 0) {\n\t\t\tsign = 1;\n\t\t\tnum = -num;\n\t\t}\n\t\tconst exp = Math.floor(Math.log(num) / Math.LN2);\n\t\tconst frac0 = num / 2 ** exp - 1;\n\t\tconst frac1 = Math.floor(frac0 * 2 ** 52);\n\t\tconst b32 = 2 ** 32;\n\t\tconst h32 =\n\t\t\t(sign << 31) | ((exp + 1023) << 20) | ((frac1 / b32) & 0x0fffff);\n\t\tconst l32 = frac1 % b32;\n\t\tthis._bufferBuilder.append(0xcb);\n\t\tthis.pack_int32(h32);\n\t\tthis.pack_int32(l32);\n\t}\n\n\tpack_object(obj: { [key: string]: Packable }) {\n\t\tconst keys = Object.keys(obj);\n\t\tconst length = keys.length;\n\t\tif (length <= 0x0f) {\n\t\t\tthis.pack_uint8(0x80 + length);\n\t\t} else if (length <= 0xffff) {\n\t\t\tthis._bufferBuilder.append(0xde);\n\t\t\tthis.pack_uint16(length);\n\t\t} else if (length <= 0xffffffff) {\n\t\t\tthis._bufferBuilder.append(0xdf);\n\t\t\tthis.pack_uint32(length);\n\t\t} else {\n\t\t\tthrow new Error(\"Invalid length\");\n\t\t}\n\n\t\tconst packNext = (index: number): Promise<void> | void => {\n\t\t\tif (index < keys.length) {\n\t\t\t\tconst prop = keys[index];\n\t\t\t\t// eslint-disable-next-line no-prototype-builtins\n\t\t\t\tif (obj.hasOwnProperty(prop)) {\n\t\t\t\t\tthis.pack(prop);\n\t\t\t\t\tconst res = this.pack(obj[prop]);\n\t\t\t\t\tif (res instanceof Promise) {\n\t\t\t\t\t\treturn res.then(() => packNext(index + 1));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn packNext(index + 1);\n\t\t\t}\n\t\t};\n\n\t\treturn packNext(0);\n\t}\n\n\tpack_uint8(num: number) {\n\t\tthis._bufferBuilder.append(num);\n\t}\n\n\tpack_uint16(num: number) {\n\t\tthis._bufferBuilder.append(num >> 8);\n\t\tthis._bufferBuilder.append(num & 0xff);\n\t}\n\n\tpack_uint32(num: number) {\n\t\tconst n = num & 0xffffffff;\n\t\tthis._bufferBuilder.append((n & 0xff000000) >>> 24);\n\t\tthis._bufferBuilder.append((n & 0x00ff0000) >>> 16);\n\t\tthis._bufferBuilder.append((n & 0x0000ff00) >>> 8);\n\t\tthis._bufferBuilder.append(n & 0x000000ff);\n\t}\n\n\tpack_uint64(num: number) {\n\t\tconst high = num / 2 ** 32;\n\t\tconst low = num % 2 ** 32;\n\t\tthis._bufferBuilder.append((high & 0xff000000) >>> 24);\n\t\tthis._bufferBuilder.append((high & 0x00ff0000) >>> 16);\n\t\tthis._bufferBuilder.append((high & 0x0000ff00) >>> 8);\n\t\tthis._bufferBuilder.append(high & 0x000000ff);\n\t\tthis._bufferBuilder.append((low & 0xff000000) >>> 24);\n\t\tthis._bufferBuilder.append((low & 0x00ff0000) >>> 16);\n\t\tthis._bufferBuilder.append((low & 0x0000ff00) >>> 8);\n\t\tthis._bufferBuilder.append(low & 0x000000ff);\n\t}\n\n\tpack_int8(num: number) {\n\t\tthis._bufferBuilder.append(num & 0xff);\n\t}\n\n\tpack_int16(num: number) {\n\t\tthis._bufferBuilder.append((num & 0xff00) >> 8);\n\t\tthis._bufferBuilder.append(num & 0xff);\n\t}\n\n\tpack_int32(num: number) {\n\t\tthis._bufferBuilder.append((num >>> 24) & 0xff);\n\t\tthis._bufferBuilder.append((num & 0x00ff0000) >>> 16);\n\t\tthis._bufferBuilder.append((num & 0x0000ff00) >>> 8);\n\t\tthis._bufferBuilder.append(num & 0x000000ff);\n\t}\n\n\tpack_int64(num: number) {\n\t\tconst high = Math.floor(num / 2 ** 32);\n\t\tconst low = num % 2 ** 32;\n\t\tthis._bufferBuilder.append((high & 0xff000000) >>> 24);\n\t\tthis._bufferBuilder.append((high & 0x00ff0000) >>> 16);\n\t\tthis._bufferBuilder.append((high & 0x0000ff00) >>> 8);\n\t\tthis._bufferBuilder.append(high & 0x000000ff);\n\t\tthis._bufferBuilder.append((low & 0xff000000) >>> 24);\n\t\tthis._bufferBuilder.append((low & 0x00ff0000) >>> 16);\n\t\tthis._bufferBuilder.append((low & 0x0000ff00) >>> 8);\n\t\tthis._bufferBuilder.append(low & 0x000000ff);\n\t}\n}\n","export class BinaryPackChunker {\n\treadonly chunkedMTU = 16300; // The original 60000 bytes setting does not work when sending data from Firefox to Chrome, which is \"cut off\" after 16384 bytes and delivered individually.\n\n\t// Binary stuff\n\n\tprivate _dataCount: number = 1;\n\n\tchunk = (\n\t\tblob: ArrayBuffer,\n\t): { __peerData: number; n: number; total: number; data: ArrayBuffer }[] => {\n\t\tconst chunks = [];\n\t\tconst size = blob.byteLength;\n\t\tconst total = Math.ceil(size / this.chunkedMTU);\n\n\t\tlet index = 0;\n\t\tlet start = 0;\n\n\t\twhile (start < size) {\n\t\t\tconst end = Math.min(size, start + this.chunkedMTU);\n\t\t\tconst b = blob.slice(start, end);\n\n\t\t\tconst chunk = {\n\t\t\t\t__peerData: this._dataCount,\n\t\t\t\tn: index,\n\t\t\t\tdata: b,\n\t\t\t\ttotal,\n\t\t\t};\n\n\t\t\tchunks.push(chunk);\n\n\t\t\tstart = end;\n\t\t\tindex++;\n\t\t}\n\n\t\tthis._dataCount++;\n\n\t\treturn chunks;\n\t};\n}\n\nexport function concatArrayBuffers(bufs: Uint8Array[]) {\n\tlet size = 0;\n\tfor (const buf of bufs) {\n\t\tsize += buf.byteLength;\n\t}\n\tconst result = new Uint8Array(size);\n\tlet offset = 0;\n\tfor (const buf of bufs) {\n\t\tresult.set(buf, offset);\n\t\toffset += buf.byteLength;\n\t}\n\treturn result;\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseFloat(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const addEventListener = Object.getOwnPropertyDescriptor(\n EventTarget.prototype, 'addEventListener');\n if (!addEventListener.writable) {\n log('Unable to polyfill events');\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator ||\n !window.navigator.userAgent) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n const {navigator} = window;\n\n // Prefer navigator.userAgentData.\n if (navigator.userAgentData && navigator.userAgentData.brands) {\n const chromium = navigator.userAgentData.brands.find((brand) => {\n return brand.brand === 'Chromium';\n });\n if (chromium) {\n return {browser: 'chrome', version: parseInt(chromium.version, 10)};\n }\n }\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = parseInt(extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1));\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection)) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = parseInt(extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2)) || null;\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = parseInt(extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1));\n result.supportsUnifiedPlan = window.RTCRtpTransceiver &&\n 'currentDirection' in window.RTCRtpTransceiver.prototype;\n // Only for internal usage.\n result._safariVersion = extractVersion(navigator.userAgent,\n /Version\\/(\\d+(\\.?\\d+))/, 1);\n } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function(accumulator, key) {\n const isObj = isObject(data[key]);\n const value = isObj ? compactObject(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, {[key]: value});\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(name => {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(id => {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n const trackStats = [];\n result.forEach(value => {\n if (value.type === 'track' &&\n value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(trackStat => {\n result.forEach(stats => {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window, browserDetails) {\n if (browserDetails.version > 102) {\n // Unified plan is supported so no need to do anything.\n return;\n }\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimSenderReceiverGetStats(window, browserDetails) {\n if (browserDetails.version >= 67) {\n return;\n }\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n if (browserDetails.version > 102) {\n // Plan-B is no longer supported.\n return;\n }\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || (pc.getConfiguration &&\n pc.getConfiguration().sdpSemantics === 'plan-b')) {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n const constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n const cc = {};\n Object.keys(c).forEach(key => {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n const r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n const oldname_ = function(prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return (name === 'deviceId') ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n let oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname_('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname_('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname_('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(mix => {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n\n const shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n let face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n const getSupportedFacingModeLies = browserDetails.version < 66;\n\n if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n face.ideal === 'user' || face.ideal === 'environment')) &&\n !(navigator.mediaDevices.getSupportedConstraints &&\n navigator.mediaDevices.getSupportedConstraints().facingMode &&\n !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n devices = devices.filter(d => d.kind === 'videoinput');\n let dev = devices.find(d => matches.some(match =>\n d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact\n ? {exact: dev.deviceId}\n : {ideal: dev.deviceId};\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n const shimError_ = function(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n const getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, c => {\n navigator.webkitGetUserMedia(c, onSuccess, e => {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n if (navigator.mediaDevices.getUserMedia) {\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(track => {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, e => Promise.reject(shimError_(e))));\n };\n }\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\nexport function shimGetStats(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (browserDetails.version >= 151) {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1056433\n return;\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n if (this.signalingState === 'closed') {\n // No longer required in FF151+\n return Promise.resolve(new Map());\n }\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n // WebIDL input coercion and validation\n let sendEncodings = arguments[1] && arguments[1].sendEncodings;\n if (sendEncodings === undefined) {\n sendEncodings = [];\n }\n sendEncodings = [...sendEncodings];\n const shouldPerformCheck = sendEncodings.length > 0;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n sendEncodings.forEach((encodingParam) => {\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n const transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n const {sender} = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params) ||\n // Avoid being fooled by patched getParameters() below.\n (params.encodings.length === 1 &&\n Object.keys(params.encodings[0]).length === 0)) {\n params.encodings = sendEncodings;\n sender.sendEncodings = sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params)\n .then(() => {\n delete sender.sendEncodings;\n }).catch(() => {\n delete sender.sendEncodings;\n })\n );\n }\n }\n return transceiver;\n };\n }\n}\n\nexport function shimGetParameters(window) {\n if (!(typeof window === 'object' && window.RTCRtpSender)) {\n return;\n }\n const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n if (origGetParameters) {\n window.RTCRtpSender.prototype.getParameters =\n function getParameters() {\n const params = origGetParameters.apply(this, arguments);\n if (!('encodings' in params)) {\n params.encodings = [].concat(this.sendEncodings || [{}]);\n }\n return params;\n };\n }\n}\n\nexport function shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateOffer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateAnswer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(track => _addTrack.call(this, track,\n stream));\n stream.getVideoTracks().forEach(track => _addTrack.call(this, track,\n stream));\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, ...streams) {\n if (streams) {\n streams.forEach((stream) => {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n });\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n const index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach(sender => {\n if (tracks.includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams =\n function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get() {\n return this._onaddstream;\n },\n set(f) {\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = (e) => {\n e.streams.forEach(stream => {\n if (!this._remoteStreams) {\n this._remoteStreams = [];\n }\n if (this._remoteStreams.includes(stream)) {\n return;\n }\n this._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n this.dispatchEvent(event);\n });\n });\n }\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach(stream => {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nexport function shimCallbacksAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n const prototype = window.RTCPeerConnection.prototype;\n const origCreateOffer = prototype.createOffer;\n const origCreateAnswer = prototype.createAnswer;\n const setLocalDescription = prototype.setLocalDescription;\n const setRemoteDescription = prototype.setRemoteDescription;\n const addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer =\n function createOffer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer =\n function createAnswer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n let withCallback = function(description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function(description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function(candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n const mediaDevices = navigator.mediaDevices;\n const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = (constraints) => {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nexport function shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({},\n constraints,\n {video: utils.compactObject(constraints.video)}\n );\n }\n\n return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection =\n function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n const newIceServers = [];\n for (let i = 0; i < pcConfig.iceServers.length; i++) {\n let server = pcConfig.iceServers[i];\n if (server.urls === undefined && server.url) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in OrigPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nexport function shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent &&\n 'receiver' in window.RTCTrackEvent.prototype &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimCreateOfferLegacy(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer =\n function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio =\n !!offerOptions.offerToReceiveAudio;\n }\n const audioTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true &&\n !audioTransceiver) {\n this.addTransceiver('audio', {direction: 'recvonly'});\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo =\n !!offerOptions.offerToReceiveVideo;\n }\n const videoTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n this.addTransceiver('video', {direction: 'recvonly'});\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimAudioContext(window) {\n if (typeof window !== 'object' || window.AudioContext) {\n return;\n }\n window.AudioContext = window.webkitAudioContext;\n}\n\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n const NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate &&\n args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substring(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n const nativeCandidate = new NativeRTCIceCandidate(args);\n const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n for (const key in parsedCandidate) {\n if (!(key in nativeCandidate)) {\n Object.defineProperty(nativeCandidate, key,\n {value: parsedCandidate[key]});\n }\n }\n\n // Override serializer to not serialize the extra attributes.\n nativeCandidate.toJSON = function toJSON() {\n return {\n candidate: nativeCandidate.candidate,\n sdpMid: nativeCandidate.sdpMid,\n sdpMLineIndex: nativeCandidate.sdpMLineIndex,\n usernameFragment: nativeCandidate.usernameFragment,\n };\n };\n return nativeCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nexport function shimRTCIceCandidateRelayProtocol(window) {\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'relayProtocol' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n const parsedCandidate = SDPUtils.parseCandidate(e.candidate.candidate);\n if (parsedCandidate.type === 'relay') {\n // This is a libwebrtc-specific mapping of local type preference\n // to relayProtocol.\n e.candidate.relayProtocol = {\n 0: 'tls',\n 1: 'tcp',\n 2: 'udp',\n }[parsedCandidate.priority >> 24];\n }\n }\n return e;\n });\n}\n\nexport function shimMaxMessageSize(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n const sctpInDescription = function(description) {\n if (!description || !description.sdp) {\n return false;\n }\n const sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(mediaSection => {\n const mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n const getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n let canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize =\n browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n const getMaxMessageSize = function(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n let maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox'\n && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n const match = SDPUtils.matchPrefix(description.sdp,\n 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substring(19), 10);\n } else if (browserDetails.browser === 'firefox' &&\n remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n const {sdpSemantics} = this.getConfiguration();\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n const sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nexport function shimSendThrowTypeError(window, browserDetails) {\n if (!(window.RTCPeerConnection &&\n 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n if (browserDetails.browser === 'chrome' && browserDetails.version > 149) {\n // Fixed by https://issues.chromium.org/issues/490588131\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n if (browserDetails.browser === 'firefox' && browserDetails.version > 60) {\n return;\n }\n\n function wrapDcSend(dc, pc) {\n const origDataChannelSend = dc.send;\n dc.send = function send() {\n const data = arguments[0];\n const length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' &&\n pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel =\n function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', e => {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n if (!window.RTCPeerConnection ||\n 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get() {\n return this._onconnectionstatechange || null;\n },\n set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange',\n this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange',\n this._onconnectionstatechange = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach((method) => {\n const origMethod = proto[method];\n proto[method] = function() {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = e => {\n const pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n const newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange',\n this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nexport function removeExtmapAllowMixed(window, browserDetails) {\n /* remove a=extmap-allow-mixed for webrtc.org < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n if (browserDetails.browser === 'safari' &&\n browserDetails._safariVersion >= 13.1) {\n return;\n }\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n const sdp = desc.sdp.split('\\n').filter((line) => {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n // Safari enforces read-only-ness of RTCSessionDescription fields.\n if (window.RTCSessionDescription &&\n desc instanceof window.RTCSessionDescription) {\n arguments[0] = new window.RTCSessionDescription({\n type: desc.type,\n sdp,\n });\n } else {\n desc.sdp = sdp;\n }\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n\nexport function shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n // Support for addIceCandidate(null or undefined)\n // as well as addIceCandidate({candidate: \"\", ...})\n // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n // Note: must be called before other polyfills which change the signature.\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.addIceCandidate =\n function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n // Native support for ignoring exists for Chrome M77+.\n // Safari ignores as well, exact version unknown but works in the same\n // version that also ignores addIceCandidate(null).\n if (((browserDetails.browser === 'chrome' && browserDetails.version < 78)\n || (browserDetails.browser === 'firefox'\n && browserDetails.version < 68)\n || (browserDetails.browser === 'safari'))\n && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n\n// Note: Make sure to call this ahead of APIs that modify\n// setLocalDescription.length\nexport function shimParameterlessSetLocalDescription(window, browserDetails) {\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n if (!nativeSetLocalDescription || nativeSetLocalDescription.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n let desc = arguments[0] || {};\n if (typeof desc !== 'object' || (desc.type && desc.sdp)) {\n return nativeSetLocalDescription.apply(this, arguments);\n }\n // The remaining steps should technically happen when SLD comes off the\n // RTCPeerConnection's operations chain (not ahead of going on it), but\n // this is too difficult to shim. Instead, this shim only covers the\n // common case where the operations chain is empty. This is imperfect, but\n // should cover many cases. Rationale: Even if we can't reduce the glare\n // window to zero on imperfect implementations, there's value in tapping\n // into the perfect negotiation pattern that several browsers support.\n desc = {type: desc.type, sdp: desc.sdp};\n if (!desc.type) {\n switch (this.signalingState) {\n case 'stable':\n case 'have-local-offer':\n case 'have-remote-pranswer':\n desc.type = 'offer';\n break;\n default:\n desc.type = 'answer';\n break;\n }\n }\n if (desc.sdp || (desc.type !== 'offer' && desc.type !== 'answer')) {\n return nativeSetLocalDescription.apply(this, [desc]);\n }\n const func = desc.type === 'offer' ? this.createOffer : this.createAnswer;\n return func.apply(this)\n .then(d => nativeSetLocalDescription.apply(this, [d]));\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\nimport * as utils from './utils';\n\n// Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\nimport * as sdp from 'sdp';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: true,\n shimSafari: true,\n}) {\n // Utils.\n const logging = utils.log;\n const browserDetails = utils.detectBrowser(window);\n\n const adapter = {\n browserDetails,\n commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings,\n // Expose sdp as a convenience. For production apps include directly.\n sdp,\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection ||\n !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n if (browserDetails.version === null) {\n logging('Chrome shim can not determine version, not shimming.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n chromeShim.shimGetUserMedia(window, browserDetails);\n chromeShim.shimMediaStream(window, browserDetails);\n chromeShim.shimPeerConnection(window, browserDetails);\n chromeShim.shimOnTrack(window, browserDetails);\n chromeShim.shimAddTrackRemoveTrack(window, browserDetails);\n chromeShim.shimGetSendersWithDtmf(window, browserDetails);\n chromeShim.shimSenderReceiverGetStats(window, browserDetails);\n chromeShim.fixNegotiationNeeded(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n firefoxShim.shimGetUserMedia(window, browserDetails);\n firefoxShim.shimPeerConnection(window, browserDetails);\n firefoxShim.shimGetStats(window, browserDetails);\n firefoxShim.shimOnTrack(window, browserDetails);\n firefoxShim.shimRemoveStream(window, browserDetails);\n firefoxShim.shimSenderGetStats(window, browserDetails);\n firefoxShim.shimReceiverGetStats(window, browserDetails);\n firefoxShim.shimRTCDataChannel(window, browserDetails);\n firefoxShim.shimAddTransceiver(window, browserDetails);\n firefoxShim.shimGetParameters(window, browserDetails);\n firefoxShim.shimCreateOffer(window, browserDetails);\n firefoxShim.shimCreateAnswer(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n // Must be called before shimCallbackAPI.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n commonShim.shimParameterlessSetLocalDescription(window, browserDetails);\n\n safariShim.shimRTCIceServerUrls(window, browserDetails);\n safariShim.shimCreateOfferLegacy(window, browserDetails);\n safariShim.shimCallbacksAPI(window, browserDetails);\n safariShim.shimLocalStreamsAPI(window, browserDetails);\n safariShim.shimRemoteStreamsAPI(window, browserDetails);\n safariShim.shimTrackEventTransceiver(window, browserDetails);\n safariShim.shimGetUserMedia(window, browserDetails);\n safariShim.shimAudioContext(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","import webRTCAdapter_import from \"webrtc-adapter\";\n\nconst webRTCAdapter: typeof webRTCAdapter_import =\n\t//@ts-expect-error\n\twebRTCAdapter_import.default || webRTCAdapter_import;\n\nexport const Supports = new (class {\n\treadonly isIOS =\n\t\ttypeof navigator !== \"undefined\"\n\t\t\t? /iPad|iPhone|iPod/.test(navigator.userAgent) ||\n\t\t\t\t(navigator.platform === \"MacIntel\" && navigator.maxTouchPoints > 1)\n\t\t\t: false;\n\treadonly supportedBrowsers = [\"firefox\", \"chrome\", \"safari\"];\n\n\treadonly minFirefoxVersion = 59;\n\treadonly minChromeVersion = 72;\n\treadonly minSafariVersion = 605;\n\n\tisWebRTCSupported(): boolean {\n\t\treturn typeof RTCPeerConnection !== \"undefined\";\n\t}\n\n\tisBrowserSupported(): boolean {\n\t\tconst browser = this.getBrowser();\n\t\tconst version = this.getVersion();\n\n\t\tconst validBrowser = this.supportedBrowsers.includes(browser);\n\n\t\tif (!validBrowser) return false;\n\n\t\tif (browser === \"chrome\") return version >= this.minChromeVersion;\n\t\tif (browser === \"firefox\") return version >= this.minFirefoxVersion;\n\t\tif (browser === \"safari\") return !this.isIOS && version >= this.minSafariVersion;\n\n\t\treturn false;\n\t}\n\n\tgetBrowser(): string {\n\t\treturn webRTCAdapter.browserDetails.browser;\n\t}\n\n\tgetVersion(): number {\n\t\treturn webRTCAdapter.browserDetails.version || 0;\n\t}\n\n\tisUnifiedPlanSupported(): boolean {\n\t\tconst browser = this.getBrowser();\n\t\tconst version = webRTCAdapter.browserDetails.version || 0;\n\n\t\tif (browser === \"chrome\" && version < this.minChromeVersion) return false;\n\t\tif (browser === \"firefox\" && version >= this.minFirefoxVersion) return true;\n\t\tif (\n\t\t\ttypeof RTCRtpTransceiver === \"undefined\" ||\n\t\t\t!(\"currentDirection\" in RTCRtpTransceiver.prototype)\n\t\t)\n\t\t\treturn false;\n\n\t\tlet tempPc: RTCPeerConnection | undefined;\n\t\tlet supported = false;\n\n\t\ttry {\n\t\t\ttempPc = new RTCPeerConnection();\n\t\t\ttempPc.addTransceiver(\"audio\");\n\t\t\tsupported = true;\n\t\t} catch (_e) {\n\t\t} finally {\n\t\t\tif (tempPc) {\n\t\t\t\ttempPc.close();\n\t\t\t}\n\t\t}\n\n\t\treturn supported;\n\t}\n\n\ttoString(): string {\n\t\treturn `Supports:\n browser:${this.getBrowser()}\n version:${this.getVersion()}\n isIOS:${this.isIOS}\n isWebRTCSupported:${this.isWebRTCSupported()}\n isBrowserSupported:${this.isBrowserSupported()}\n isUnifiedPlanSupported:${this.isUnifiedPlanSupported()}`;\n\t}\n})();\n","export const randomToken = () => Math.random().toString(36).slice(2);\n","export const validateId = (id: string): boolean => {\n\t// Allow empty ids\n\treturn !id || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(id);\n};\n","import * as BinaryPack from \"peerjs-js-binarypack\";\nimport { BinaryPackChunker } from \"./dataconnection/BufferedConnection/binaryPackChunker\";\nimport { Supports } from \"./supports\";\nimport { randomToken } from \"./utils/randomToken\";\nimport { validateId } from \"./utils/validateId\";\n\nexport interface UtilSupportsObj {\n\t/**\n\t * The current browser.\n\t * This property can be useful in determining whether two peers can connect.\n\t *\n\t * ```ts\n\t * if (util.browser === 'firefox') {\n\t * // OK to peer with Firefox peers.\n\t * }\n\t * ```\n\t *\n\t * `util.browser` can currently have the values\n\t * `'firefox', 'chrome', 'safari', 'edge', 'Not a supported browser.', 'Not a browser.' (unknown WebRTC-compatible agent).\n\t */\n\tbrowser: boolean;\n\twebRTC: boolean;\n\t/**\n\t * True if the current browser supports media streams and PeerConnection.\n\t */\n\taudioVideo: boolean;\n\t/**\n\t * True if the current browser supports DataChannel and PeerConnection.\n\t */\n\tdata: boolean;\n\tbinaryBlob: boolean;\n\t/**\n\t * True if the current browser supports reliable DataChannels.\n\t */\n\treliable: boolean;\n}\n\nconst DEFAULT_CONFIG: RTCConfiguration = {\n\ticeServers: [{ urls: \"stun:stun.l.google.com:19302\" }, { urls: \"stun:stun1.l.google.com:19302\" }],\n};\n\nexport class Util extends BinaryPackChunker {\n\tnoop(): void {}\n\n\treadonly CLOUD_HOST = \"signal.dendri.dev\";\n\treadonly CLOUD_PORT = 443;\n\n\t// Browsers that need chunking:\n\treadonly chunkedBrowsers = { Chrome: 1, chrome: 1 };\n\n\t// Returns browser-agnostic default config\n\treadonly defaultConfig = DEFAULT_CONFIG;\n\n\treadonly browser = Supports.getBrowser();\n\treadonly browserVersion = Supports.getVersion();\n\n\tget isSafari(): boolean {\n\t\tif (typeof navigator === \"undefined\") return false;\n\t\treturn /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\n\t}\n\n\tget isIOS(): boolean {\n\t\tif (typeof navigator === \"undefined\") return false;\n\t\treturn (\n\t\t\t/iPad|iPhone|iPod/.test(navigator.userAgent) ||\n\t\t\t(navigator.platform === \"MacIntel\" && navigator.maxTouchPoints > 1)\n\t\t);\n\t}\n\n\tpack = BinaryPack.pack;\n\tunpack = BinaryPack.unpack;\n\n\t/**\n\t * A hash of WebRTC features mapped to booleans that correspond to whether the feature is supported by the current browser.\n\t *\n\t * :::caution\n\t * Only the properties documented here are guaranteed to be present on `util.supports`\n\t * :::\n\t */\n\treadonly supports = (() => {\n\t\tconst supported: UtilSupportsObj = {\n\t\t\tbrowser: Supports.isBrowserSupported(),\n\t\t\twebRTC: Supports.isWebRTCSupported(),\n\t\t\taudioVideo: false,\n\t\t\tdata: false,\n\t\t\tbinaryBlob: false,\n\t\t\treliable: false,\n\t\t};\n\n\t\tif (!supported.webRTC) return supported;\n\n\t\tlet pc: RTCPeerConnection | undefined;\n\n\t\ttry {\n\t\t\tpc = new RTCPeerConnection(DEFAULT_CONFIG);\n\n\t\t\tsupported.audioVideo = true;\n\n\t\t\tlet dc: RTCDataChannel | undefined;\n\n\t\t\ttry {\n\t\t\t\tdc = pc.createDataChannel(\"_DENDRITEST\", { ordered: true });\n\t\t\t\tsupported.data = true;\n\t\t\t\tsupported.reliable = !!dc.ordered;\n\n\t\t\t\t// Binary test\n\t\t\t\ttry {\n\t\t\t\t\tdc.binaryType = \"blob\";\n\t\t\t\t\tsupported.binaryBlob = !Supports.isIOS;\n\t\t\t\t} catch (_e) {}\n\t\t\t} catch (_e) {\n\t\t\t} finally {\n\t\t\t\tif (dc) {\n\t\t\t\t\tdc.close();\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (_e) {\n\t\t} finally {\n\t\t\tif (pc) {\n\t\t\t\tpc.close();\n\t\t\t}\n\t\t}\n\n\t\treturn supported;\n\t})();\n\n\t// Ensure alphanumeric ids\n\tvalidateId = validateId;\n\trandomToken = randomToken;\n\n\tblobToArrayBuffer(blob: Blob, cb: (arg: ArrayBuffer | null) => void): FileReader {\n\t\tconst fr = new FileReader();\n\n\t\tfr.onload = (evt) => {\n\t\t\tif (evt.target) {\n\t\t\t\tcb(evt.target.result as ArrayBuffer);\n\t\t\t}\n\t\t};\n\n\t\tfr.readAsArrayBuffer(blob);\n\n\t\treturn fr;\n\t}\n\n\tbinaryStringToArrayBuffer(binary: string): ArrayBuffer | SharedArrayBuffer {\n\t\tconst byteArray = new Uint8Array(binary.length);\n\n\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\tbyteArray[i] = binary.charCodeAt(i) & 0xff;\n\t\t}\n\n\t\treturn byteArray.buffer;\n\t}\n\tisSecure(): boolean {\n\t\treturn typeof location !== \"undefined\" && location.protocol === \"https:\";\n\t}\n}\n\n/**\n * Provides a variety of helpful utilities.\n *\n * :::caution\n * Only the utilities documented here are guaranteed to be present on `util`.\n * Undocumented utilities can be removed without warning.\n * We don't consider these to be breaking changes.\n * :::\n */\nexport const util = new Util();\n","import logger from \"./logger\";\nimport type { DendriOption } from \"./optionInterfaces\";\nimport { util } from \"./util\";\n\ndeclare const __VERSION__: string;\nconst version = __VERSION__;\n\nexport class API {\n\tprivate static readonly FETCH_TIMEOUT = 10_000;\n\n\tconstructor(private readonly _options: DendriOption) {}\n\n\tprivate _buildRequest(method: string): Promise<Response> {\n\t\tconst protocol = this._options.secure ? \"https\" : \"http\";\n\t\tconst { host, port, path, key } = this._options;\n\t\tconst url = new URL(`${protocol}://${host}:${port}${path}${key}/${method}`);\n\t\t// TODO: Why timestamp, why random?\n\t\turl.searchParams.set(\"ts\", `${Date.now()}${Math.random()}`);\n\t\turl.searchParams.set(\"version\", version);\n\n\t\tconst controller = new AbortController();\n\t\tconst timeoutId = setTimeout(() => controller.abort(), API.FETCH_TIMEOUT);\n\n\t\treturn fetch(url.href, {\n\t\t\treferrerPolicy: this._options.referrerPolicy,\n\t\t\tsignal: controller.signal,\n\t\t}).finally(() => clearTimeout(timeoutId));\n\t}\n\n\t/** Get a unique ID from the server via XHR and initialize with it. */\n\tasync retrieveId(): Promise<string> {\n\t\ttry {\n\t\t\tconst response = await this._buildRequest(\"id\");\n\n\t\t\tif (response.status !== 200) {\n\t\t\t\tthrow new Error(`Error. Status:${response.status}`);\n\t\t\t}\n\n\t\t\treturn response.text();\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Error retrieving ID\", error);\n\n\t\t\tlet pathError = \"\";\n\n\t\t\tif (this._options.path === \"/\" && this._options.host !== util.CLOUD_HOST) {\n\t\t\t\tpathError =\n\t\t\t\t\t\" If you passed in a `path` to your self-hosted Dendri server, \" +\n\t\t\t\t\t\"you'll also need to pass in that same path when creating a new \" +\n\t\t\t\t\t\"Dendri instance.\";\n\t\t\t}\n\n\t\t\tthrow new Error(`Could not get an ID from the server.${pathError}`);\n\t\t}\n\t}\n\n\t/** Fetch TURN credentials from the signaling server's GET /turn endpoint. */\n\tasync getTurnCredentials(): Promise<RTCIceServer[]> {\n\t\tconst protocol = this._options.secure ? \"https\" : \"http\";\n\t\tconst { host, port } = this._options;\n\t\tconst url = `${protocol}://${host}:${port}/turn`;\n\n\t\ttry {\n\t\t\tconst controller = new AbortController();\n\t\t\tconst timeoutId = setTimeout(() => controller.abort(), API.FETCH_TIMEOUT);\n\n\t\t\tconst response = await fetch(url, {\n\t\t\t\treferrerPolicy: this._options.referrerPolicy,\n\t\t\t\tsignal: controller.signal,\n\t\t\t}).finally(() => clearTimeout(timeoutId));\n\n\t\t\tif (!response.ok) {\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst data = await response.json();\n\t\t\tconst raw = (data as { iceServers?: RTCIceServer | RTCIceServer[] }).iceServers;\n\t\t\tif (!raw) return [];\n\t\t\treturn Array.isArray(raw) ? raw : [raw];\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Error fetching TURN credentials\", error);\n\t\t\treturn [];\n\t\t}\n\t}\n\n\t/** @deprecated */\n\tasync listAllPeers(): Promise<any[]> {\n\t\ttry {\n\t\t\tconst response = await this._buildRequest(\"peers\");\n\n\t\t\tif (response.status !== 200) {\n\t\t\t\tif (response.status === 401) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"It doesn't look like you have permission to list peers IDs. \" +\n\t\t\t\t\t\t\t\"Check your server configuration and ensure allow_discovery is enabled.\",\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(`Error. Status:${response.status}`);\n\t\t\t}\n\n\t\t\treturn response.json();\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Error retrieving list peers\", error);\n\n\t\t\tthrow new Error(\n\t\t\t\t\"Could not get list peers from the server. \" +\n\t\t\t\t\t(error instanceof Error ? error.message : error),\n\t\t\t);\n\t\t}\n\t}\n}\n","export enum ConnectionType {\n\tData = \"data\",\n\tMedia = \"media\",\n}\n\nexport enum DendriErrorType {\n\t/**\n\t * The client's browser does not support some or all WebRTC features that you are trying to use.\n\t */\n\tBrowserIncompatible = \"browser-incompatible\",\n\t/**\n\t * You've already disconnected this peer from the server and can no longer make any new connections on it.\n\t */\n\tDisconnected = \"disconnected\",\n\t/**\n\t * The ID passed into the Peer constructor contains illegal characters.\n\t */\n\tInvalidID = \"invalid-id\",\n\t/**\n\t * The API key passed into the Peer constructor contains illegal characters or is not in the system (cloud server only).\n\t */\n\tInvalidKey = \"invalid-key\",\n\t/**\n\t * Lost or cannot establish a connection to the signalling server.\n\t */\n\tNetwork = \"network\",\n\t/**\n\t * The peer you're trying to connect to does not exist.\n\t */\n\tPeerUnavailable = \"peer-unavailable\",\n\t/**\n\t * Dendri is being used securely, but the cloud server does not support SSL. Use a custom DendriServer.\n\t */\n\tSslUnavailable = \"ssl-unavailable\",\n\t/**\n\t * Unable to reach the server.\n\t */\n\tServerError = \"server-error\",\n\t/**\n\t * An error from the underlying socket.\n\t */\n\tSocketError = \"socket-error\",\n\t/**\n\t * The underlying socket closed unexpectedly.\n\t */\n\tSocketClosed = \"socket-closed\",\n\t/**\n\t * The ID passed into the Peer constructor is already taken.\n\t *\n\t * :::caution\n\t * This error is not fatal if your peer has open peer-to-peer connections.\n\t * This can happen if you attempt to {@apilink Dendri.reconnect} a peer that has been disconnected from the server,\n\t * but its old ID has now been taken.\n\t * :::\n\t */\n\tUnavailableID = \"unavailable-id\",\n\t/**\n\t * Native WebRTC errors.\n\t */\n\tWebRTC = \"webrtc\",\n}\n\nexport enum BaseConnectionErrorType {\n\tNegotiationFailed = \"negotiation-failed\",\n\tConnectionClosed = \"connection-closed\",\n}\n\nexport enum DataConnectionErrorType {\n\tNotOpenYet = \"not-open-yet\",\n\tMessageTooBig = \"message-too-big\",\n\t/** @deprecated Use {@link MessageTooBig} instead */\n\tMessageToBig = \"message-too-big\",\n}\n\nexport enum SerializationType {\n\tBinary = \"binary\",\n\tBinaryUTF8 = \"binary-utf8\",\n\tJSON = \"json\",\n\tNone = \"raw\",\n}\n\nexport enum SocketEventType {\n\tMessage = \"message\",\n\tDisconnected = \"disconnected\",\n\tError = \"error\",\n\tClose = \"close\",\n\tReconnected = \"reconnected\",\n\tReconnectAttempt = \"reconnect-attempt\",\n}\n\nexport enum ServerMessageType {\n\tHeartbeat = \"HEARTBEAT\",\n\tCandidate = \"CANDIDATE\",\n\tOffer = \"OFFER\",\n\tAnswer = \"ANSWER\",\n\tOpen = \"OPEN\", // The connection to the server is open.\n\tError = \"ERROR\", // Server error.\n\tIdTaken = \"ID-TAKEN\", // The selected ID is taken.\n\tInvalidKey = \"INVALID-KEY\", // The given API key cannot be found.\n\tLeave = \"LEAVE\", // Another peer has closed its connection to this peer.\n\tExpire = \"EXPIRE\", // The offer sent to a peer has expired without response.\n\tData = \"DATA\", // Relayed data message via WebSocket.\n\tAck = \"ACK\", // Server acknowledgement with sequence number.\n\tRoomJoin = \"ROOM-JOIN\", // A peer joined a room.\n\tRoomLeave = \"ROOM-LEAVE\", // A peer left a room.\n\tRoomPeers = \"ROOM-PEERS\", // List of peers in a room.\n\tHostMigrate = \"HOST-MIGRATE\", // Host migration notification.\n\tPresenceUpdate = \"PRESENCE-UPDATE\", // Presence data broadcast.\n\tKeyExchange = \"KEY-EXCHANGE\", // E2E encryption key exchange for relay.\n}\n\nexport enum TransportMode {\n\tWebRTC = \"webrtc\",\n\tWebSocketRelay = \"ws-relay\",\n\tReconnecting = \"reconnecting\",\n}\n\nexport enum ConnectionState {\n\t/** Initial state, not yet connected */\n\tInitialized = \"initialized\",\n\t/** Attempting to connect to signaling server */\n\tConnecting = \"connecting\",\n\t/** Connected and ready */\n\tConnected = \"connected\",\n\t/** Temporarily disconnected, will auto-reconnect */\n\tDisconnected = \"disconnected\",\n\t/** Extended offline, slower retry schedule */\n\tSuspended = \"suspended\",\n\t/** Explicitly closed by user */\n\tClosed = \"closed\",\n\t/** Unrecoverable error */\n\tFailed = \"failed\",\n}\n\nexport enum ConnectionQuality {\n\tExcellent = \"excellent\",\n\tGood = \"good\",\n\tPoor = \"poor\",\n\tUnknown = \"unknown\",\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport logger from \"./logger\";\n\nexport interface EventsWithError<ErrorType extends string> {\n\terror: (error: DendriError<`${ErrorType}`>) => void;\n}\n\nexport class EventEmitterWithError<\n\tErrorType extends string,\n\tEvents extends EventsWithError<ErrorType>,\n> extends EventEmitter<Events, never> {\n\t/**\n\t * Emits a typed error message.\n\t *\n\t * @internal\n\t */\n\temitError(type: ErrorType, err: string | Error, retryable = false): void {\n\t\tlogger.error(\"Error:\", err);\n\n\t\tconst error = new DendriError<`${ErrorType}`>(`${type}`, err);\n\t\terror.retryable = retryable;\n\n\t\t// @ts-expect-error\n\t\tthis.emit(\"error\", error);\n\t}\n}\n/**\n * A DendriError is emitted whenever an error occurs.\n * It always has a `.type`, which can be used to identify the error.\n */\nexport class DendriError<T extends string> extends Error {\n\tpublic type: T;\n\n\t/** Whether the operation that caused this error can be retried. */\n\tpublic retryable: boolean;\n\n\t/** Structured context about the error. */\n\tpublic details?: Record<string, unknown>;\n\n\t/**\n\t * @internal\n\t */\n\tconstructor(type: T, err: Error | string) {\n\t\tif (typeof err === \"string\") {\n\t\t\tsuper(err);\n\t\t} else {\n\t\t\tsuper(err.message);\n\t\t\tthis.stack = err.stack;\n\t\t}\n\n\t\tthis.type = type;\n\t\tthis.retryable = false;\n\t}\n\n\t/** Set the retryable flag (fluent API). */\n\tsetRetryable(retryable: boolean): this {\n\t\tthis.retryable = retryable;\n\t\treturn this;\n\t}\n\n\t/** Set structured details (fluent API). */\n\tsetDetails(details: Record<string, unknown>): this {\n\t\tthis.details = details;\n\t\treturn this;\n\t}\n}\n","import type { ValidEventTypes } from \"eventemitter3\";\nimport type { Dendri } from \"./dendri\";\nimport { type DendriError, EventEmitterWithError, type EventsWithError } from \"./dendriError\";\nimport type { BaseConnectionErrorType, ConnectionType } from \"./enums\";\nimport type { ServerMessage } from \"./servermessage\";\n\nexport interface BaseConnectionEvents<ErrorType extends string = BaseConnectionErrorType>\n\textends EventsWithError<ErrorType> {\n\t/**\n\t * Emitted when either you or the remote peer closes the connection.\n\t *\n\t * ```ts\n\t * connection.on('close', () => { ... });\n\t * ```\n\t */\n\tclose: () => void;\n\t/**\n\t * ```ts\n\t * connection.on('error', (error) => { ... });\n\t * ```\n\t */\n\terror: (error: DendriError<`${ErrorType}`>) => void;\n\ticeStateChanged: (state: RTCIceConnectionState) => void;\n}\n\nexport abstract class BaseConnection<\n\tSubClassEvents extends ValidEventTypes,\n\tErrorType extends string = never,\n> extends EventEmitterWithError<\n\tErrorType | BaseConnectionErrorType,\n\tSubClassEvents & BaseConnectionEvents<BaseConnectionErrorType | ErrorType>\n> {\n\tprotected _open = false;\n\n\t/**\n\t * Any type of metadata associated with the connection,\n\t * passed in by whoever initiated the connection.\n\t */\n\treadonly metadata: any;\n\tconnectionId!: string;\n\n\tpeerConnection!: RTCPeerConnection | null;\n\tdataChannel: RTCDataChannel | null = null;\n\n\tabstract get type(): ConnectionType;\n\n\t/**\n\t * The optional label passed in or assigned by Dendri when the connection was initiated.\n\t */\n\tlabel!: string;\n\n\t/**\n\t * Whether the media connection is active (e.g. your call has been answered).\n\t * You can check this if you want to set a maximum wait time for a one-sided call.\n\t */\n\tget open() {\n\t\treturn this._open;\n\t}\n\n\tprotected constructor(\n\t\t/**\n\t\t * The ID of the peer on the other end of this connection.\n\t\t */\n\t\treadonly peer: string,\n\t\tpublic provider: Dendri | null,\n\t\treadonly options: any,\n\t) {\n\t\tsuper();\n\n\t\tthis.metadata = options.metadata;\n\t}\n\n\tabstract close(): void;\n\n\t/**\n\t * @internal\n\t */\n\tabstract handleMessage(message: ServerMessage): void;\n\n\t/**\n\t * Called by the Negotiator when the DataChannel is ready.\n\t * @internal\n\t * */\n\tabstract _initializeDataChannel(dc: RTCDataChannel): void;\n}\n","import type { ValidEventTypes } from \"eventemitter3\";\nimport type { BaseConnection, BaseConnectionEvents } from \"./baseconnection\";\nimport type { DataConnection } from \"./dataconnection/DataConnection\";\nimport {\n\tBaseConnectionErrorType,\n\tConnectionType,\n\tDendriErrorType,\n\tServerMessageType,\n} from \"./enums\";\nimport logger from \"./logger\";\nimport type { MediaConnection } from \"./mediaconnection\";\n\n/**\n * Manages all negotiations between Peers.\n */\nexport class Negotiator<\n\tEvents extends ValidEventTypes,\n\tT extends BaseConnection<Events | BaseConnectionEvents>,\n> {\n\tprivate _pendingCandidates: RTCIceCandidate[] = [];\n\n\tconstructor(readonly connection: T) {}\n\n\t/** Returns a PeerConnection object set up correctly (for data, media). */\n\tstartConnection(options: any) {\n\t\tconst peerConnection = this._startPeerConnection();\n\n\t\t// Set the connection's PC.\n\t\tthis.connection.peerConnection = peerConnection;\n\n\t\tif (this.connection.type === ConnectionType.Media && options._stream) {\n\t\t\tthis._addTracksToConnection(options._stream, peerConnection);\n\t\t\tthis._setCodecPreferences(peerConnection);\n\t\t}\n\n\t\t// What do we need to do now?\n\t\tif (options.originator) {\n\t\t\tconst dataConnection = this.connection;\n\n\t\t\tconst config: RTCDataChannelInit = { ordered: !!options.reliable };\n\n\t\t\tconst dataChannel = peerConnection.createDataChannel(dataConnection.label, config);\n\t\t\tdataConnection._initializeDataChannel(dataChannel);\n\n\t\t\tvoid this._makeOffer();\n\t\t} else {\n\t\t\tvoid this.handleSDP(\"OFFER\", options.sdp);\n\t\t}\n\t}\n\n\t/** Start a PC. */\n\tprivate _startPeerConnection(): RTCPeerConnection {\n\t\tlogger.log(\"Creating RTCPeerConnection.\");\n\n\t\tconst peerConnection = new RTCPeerConnection(this.connection.provider?.options.config);\n\n\t\tthis._setupListeners(peerConnection);\n\n\t\treturn peerConnection;\n\t}\n\n\t/** Set up various WebRTC listeners. */\n\tprivate _setupListeners(peerConnection: RTCPeerConnection) {\n\t\tconst peerId = this.connection.peer;\n\t\tconst connectionId = this.connection.connectionId;\n\t\tconst connectionType = this.connection.type;\n\t\tconst provider = this.connection.provider!;\n\n\t\t// ICE CANDIDATES.\n\t\tlogger.log(\"Listening for ICE candidates.\");\n\n\t\tpeerConnection.onicecandidate = (evt) => {\n\t\t\tif (!evt.candidate?.candidate) return;\n\n\t\t\tlogger.log(`Received ICE candidates for ${peerId}:`, evt.candidate);\n\n\t\t\tprovider.socket.send({\n\t\t\t\ttype: ServerMessageType.Candidate,\n\t\t\t\tpayload: {\n\t\t\t\t\tcandidate: evt.candidate,\n\t\t\t\t\ttype: connectionType,\n\t\t\t\t\tconnectionId: connectionId,\n\t\t\t\t},\n\t\t\t\tdst: peerId,\n\t\t\t});\n\t\t};\n\n\t\tpeerConnection.oniceconnectionstatechange = () => {\n\t\t\tswitch (peerConnection.iceConnectionState) {\n\t\t\t\tcase \"failed\":\n\t\t\t\t\tlogger.log(`iceConnectionState is failed, closing connections to ${peerId}`);\n\t\t\t\t\tthis.connection.emitError(\n\t\t\t\t\t\tBaseConnectionErrorType.NegotiationFailed,\n\t\t\t\t\t\t`Negotiation of connection to ${peerId} failed.`,\n\t\t\t\t\t);\n\t\t\t\t\tthis.connection.close();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"closed\":\n\t\t\t\t\tlogger.log(`iceConnectionState is closed, closing connections to ${peerId}`);\n\t\t\t\t\tthis.connection.emitError(\n\t\t\t\t\t\tBaseConnectionErrorType.ConnectionClosed,\n\t\t\t\t\t\t`Connection to ${peerId} closed.`,\n\t\t\t\t\t);\n\t\t\t\t\tthis.connection.close();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"disconnected\":\n\t\t\t\t\tlogger.log(`iceConnectionState changed to disconnected on the connection with ${peerId}`);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"completed\":\n\t\t\t\t\tpeerConnection.onicecandidate = () => {};\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.connection.emit(\"iceStateChanged\", peerConnection.iceConnectionState);\n\t\t};\n\n\t\t// DATACONNECTION.\n\t\tlogger.log(\"Listening for data channel\");\n\t\t// Fired between offer and answer, so options should already be saved\n\t\t// in the options hash.\n\t\tpeerConnection.ondatachannel = (evt) => {\n\t\t\tlogger.log(\"Received data channel\");\n\n\t\t\tconst dataChannel = evt.channel;\n\t\t\tconst connection = provider.getConnection(peerId, connectionId);\n\n\t\t\tif (!connection) {\n\t\t\t\tlogger.warn(`Received data channel for non-existent connection ${connectionId}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconnection._initializeDataChannel(dataChannel);\n\t\t};\n\n\t\t// MEDIACONNECTION.\n\t\tlogger.log(\"Listening for remote stream\");\n\n\t\tpeerConnection.ontrack = (evt) => {\n\t\t\tlogger.log(\"Received remote stream\");\n\n\t\t\tconst stream = evt.streams[0];\n\t\t\tconst connection = provider.getConnection(peerId, connectionId);\n\n\t\t\tif (!connection) {\n\t\t\t\tlogger.warn(`Received remote stream for non-existent connection ${connectionId}`);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (connection.type === ConnectionType.Media) {\n\t\t\t\tconst mediaConnection = <MediaConnection>connection;\n\n\t\t\t\tthis._addStreamToMediaConnection(stream, mediaConnection);\n\t\t\t}\n\t\t};\n\t}\n\n\tcleanup(): void {\n\t\tlogger.log(`Cleaning up PeerConnection to ${this.connection.peer}`);\n\n\t\tconst peerConnection = this.connection.peerConnection;\n\n\t\tif (!peerConnection) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.connection.peerConnection = null;\n\t\tthis._pendingCandidates = [];\n\n\t\t//unsubscribe from all PeerConnection's events\n\t\tpeerConnection.onicecandidate =\n\t\t\tpeerConnection.oniceconnectionstatechange =\n\t\t\tpeerConnection.ondatachannel =\n\t\t\tpeerConnection.ontrack =\n\t\t\t\t() => {};\n\n\t\tconst peerConnectionNotClosed = peerConnection.signalingState !== \"closed\";\n\t\tlet dataChannelNotClosed = false;\n\n\t\tconst dataChannel = this.connection.dataChannel;\n\n\t\tif (dataChannel) {\n\t\t\tdataChannelNotClosed = !!dataChannel.readyState && dataChannel.readyState !== \"closed\";\n\t\t\tif (dataChannelNotClosed) {\n\t\t\t\tdataChannel.close();\n\t\t\t}\n\t\t}\n\n\t\tif (peerConnectionNotClosed || dataChannelNotClosed) {\n\t\t\tpeerConnection.close();\n\t\t}\n\t}\n\n\tprivate async _makeOffer(): Promise<void> {\n\t\tconst peerConnection = this.connection.peerConnection!;\n\t\tconst provider = this.connection.provider!;\n\n\t\ttry {\n\t\t\tconst offer = await peerConnection.createOffer(this.connection.options.constraints);\n\n\t\t\tif (!this.connection.peerConnection) {\n\t\t\t\tlogger.log(\"PeerConnection closed during createOffer\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger.log(\"Created offer.\");\n\n\t\t\tif (\n\t\t\t\tthis.connection.options.sdpTransform &&\n\t\t\t\ttypeof this.connection.options.sdpTransform === \"function\"\n\t\t\t) {\n\t\t\t\toffer.sdp = this.connection.options.sdpTransform(offer.sdp) || offer.sdp;\n\t\t\t}\n\n\t\t\t// Apply H.264 SDP fallback for video (Safari compatibility)\n\t\t\tif (this.connection.type === ConnectionType.Media && offer.sdp) {\n\t\t\t\toffer.sdp = this._applyH264SdpFallback(offer.sdp, peerConnection);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait peerConnection.setLocalDescription(offer);\n\n\t\t\t\tif (!this.connection.peerConnection) {\n\t\t\t\t\tlogger.log(\"PeerConnection closed during setLocalDescription\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlogger.log(\"Set localDescription:\", offer, `for:${this.connection.peer}`);\n\n\t\t\t\tlet payload: any = {\n\t\t\t\t\tsdp: offer,\n\t\t\t\t\ttype: this.connection.type,\n\t\t\t\t\tconnectionId: this.connection.connectionId,\n\t\t\t\t\tmetadata: this.connection.metadata,\n\t\t\t\t};\n\n\t\t\t\tif (this.connection.type === ConnectionType.Data) {\n\t\t\t\t\tconst dataConnection = <DataConnection>(<unknown>this.connection);\n\n\t\t\t\t\tpayload = {\n\t\t\t\t\t\t...payload,\n\t\t\t\t\t\tlabel: dataConnection.label,\n\t\t\t\t\t\treliable: dataConnection.reliable,\n\t\t\t\t\t\tserialization: dataConnection.serialization,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tprovider.socket.send({\n\t\t\t\t\ttype: ServerMessageType.Offer,\n\t\t\t\t\tpayload,\n\t\t\t\t\tdst: this.connection.peer,\n\t\t\t\t});\n\t\t\t} catch (err: unknown) {\n\t\t\t\t// TODO: investigate why _makeOffer is being called from the answer\n\t\t\t\tif (\n\t\t\t\t\terr !==\n\t\t\t\t\t\"OperationError: Failed to set local offer sdp: Called in wrong state: kHaveRemoteOffer\"\n\t\t\t\t) {\n\t\t\t\t\tprovider.emitError(DendriErrorType.WebRTC, err instanceof Error ? err : String(err));\n\t\t\t\t\tlogger.log(\"Failed to setLocalDescription, \", err);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err_1: unknown) {\n\t\t\tprovider.emitError(DendriErrorType.WebRTC, err_1 instanceof Error ? err_1 : String(err_1));\n\t\t\tlogger.log(\"Failed to createOffer, \", err_1);\n\t\t}\n\t}\n\n\tprivate async _makeAnswer(): Promise<void> {\n\t\tconst peerConnection = this.connection.peerConnection!;\n\t\tconst provider = this.connection.provider!;\n\n\t\ttry {\n\t\t\tconst answer = await peerConnection.createAnswer();\n\n\t\t\tif (!this.connection.peerConnection) {\n\t\t\t\tlogger.log(\"PeerConnection closed during createAnswer\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger.log(\"Created answer.\");\n\n\t\t\tif (\n\t\t\t\tthis.connection.options.sdpTransform &&\n\t\t\t\ttypeof this.connection.options.sdpTransform === \"function\"\n\t\t\t) {\n\t\t\t\tanswer.sdp = this.connection.options.sdpTransform(answer.sdp) || answer.sdp;\n\t\t\t}\n\n\t\t\t// Apply H.264 SDP fallback for video (Safari compatibility)\n\t\t\tif (this.connection.type === ConnectionType.Media && answer.sdp) {\n\t\t\t\tanswer.sdp = this._applyH264SdpFallback(answer.sdp, peerConnection);\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait peerConnection.setLocalDescription(answer);\n\n\t\t\t\tif (!this.connection.peerConnection) {\n\t\t\t\t\tlogger.log(\"PeerConnection closed during setLocalDescription\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlogger.log(`Set localDescription:`, answer, `for:${this.connection.peer}`);\n\n\t\t\t\tprovider.socket.send({\n\t\t\t\t\ttype: ServerMessageType.Answer,\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tsdp: answer,\n\t\t\t\t\t\ttype: this.connection.type,\n\t\t\t\t\t\tconnectionId: this.connection.connectionId,\n\t\t\t\t\t},\n\t\t\t\t\tdst: this.connection.peer,\n\t\t\t\t});\n\t\t\t} catch (err: unknown) {\n\t\t\t\tprovider.emitError(DendriErrorType.WebRTC, err instanceof Error ? err : String(err));\n\t\t\t\tlogger.log(\"Failed to setLocalDescription, \", err);\n\t\t\t}\n\t\t} catch (err_1: unknown) {\n\t\t\tprovider.emitError(DendriErrorType.WebRTC, err_1 instanceof Error ? err_1 : String(err_1));\n\t\t\tlogger.log(\"Failed to create answer, \", err_1);\n\t\t}\n\t}\n\n\t/** Handle an SDP. */\n\tasync handleSDP(type: string, sdp: any): Promise<void> {\n\t\tconst peerConnection = this.connection.peerConnection!;\n\t\tconst provider = this.connection.provider!;\n\n\t\tlogger.log(\"Setting remote description\", sdp);\n\n\t\ttry {\n\t\t\tawait peerConnection.setRemoteDescription(sdp);\n\n\t\t\tif (!this.connection.peerConnection) {\n\t\t\t\tlogger.log(\"PeerConnection closed during setRemoteDescription\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger.log(`Set remoteDescription:${type} for:${this.connection.peer}`);\n\n\t\t\t// Flush any ICE candidates that arrived before remote description was set\n\t\t\tif (this._pendingCandidates.length > 0) {\n\t\t\t\tlogger.log(`Flushing ${this._pendingCandidates.length} pending ICE candidates`);\n\t\t\t\tconst candidates = this._pendingCandidates;\n\t\t\t\tthis._pendingCandidates = [];\n\t\t\t\tfor (const candidate of candidates) {\n\t\t\t\t\tawait this.handleCandidate(candidate);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (type === \"OFFER\") {\n\t\t\t\tawait this._makeAnswer();\n\t\t\t}\n\t\t} catch (err: unknown) {\n\t\t\tprovider.emitError(DendriErrorType.WebRTC, err instanceof Error ? err : String(err));\n\t\t\tlogger.log(\"Failed to setRemoteDescription, \", err);\n\t\t}\n\t}\n\n\t/** Handle a candidate. */\n\tasync handleCandidate(ice: RTCIceCandidate) {\n\t\tlogger.log(`handleCandidate:`, ice);\n\n\t\tconst peerConnection = this.connection.peerConnection;\n\n\t\tif (!peerConnection) {\n\t\t\tlogger.warn(`PeerConnection not set for ${this.connection.peer}, cannot add ICE candidate`);\n\t\t\treturn;\n\t\t}\n\n\t\t// Queue candidates that arrive before remote description is set\n\t\tif (!peerConnection.remoteDescription) {\n\t\t\tlogger.log(`Queueing ICE candidate (no remote description yet)`);\n\t\t\tthis._pendingCandidates.push(ice);\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tawait peerConnection.addIceCandidate(ice);\n\t\t\tlogger.log(`Added ICE candidate for:${this.connection.peer}`);\n\t\t} catch (err: unknown) {\n\t\t\tthis.connection.provider?.emitError(\n\t\t\t\tDendriErrorType.WebRTC,\n\t\t\t\terr instanceof Error ? err : String(err),\n\t\t\t);\n\t\t\tlogger.log(\"Failed to handleCandidate, \", err);\n\t\t}\n\t}\n\n\t/**\n\t * Set codec preferences on all video transceivers to prioritize H.264.\n\t * Safari only supports H.264 for video, so this ensures cross-browser\n\t * compatibility when one peer is Safari and the other is Chrome/Firefox.\n\t */\n\tprivate _setCodecPreferences(pc: RTCPeerConnection): void {\n\t\tif (!pc.getTransceivers) return;\n\n\t\tfor (const transceiver of pc.getTransceivers()) {\n\t\t\tif (transceiver.sender?.track?.kind === \"video\") {\n\t\t\t\tconst codecs =\n\t\t\t\t\ttypeof RTCRtpReceiver !== \"undefined\"\n\t\t\t\t\t\t? RTCRtpReceiver.getCapabilities?.(\"video\")?.codecs\n\t\t\t\t\t\t: undefined;\n\t\t\t\tif (!codecs) continue;\n\n\t\t\t\tconst h264 = codecs.filter((c) => c.mimeType === \"video/H264\");\n\t\t\t\tconst others = codecs.filter((c) => c.mimeType !== \"video/H264\");\n\n\t\t\t\tif (h264.length > 0 && typeof transceiver.setCodecPreferences === \"function\") {\n\t\t\t\t\ttry {\n\t\t\t\t\t\ttransceiver.setCodecPreferences([...h264, ...others]);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\t// setCodecPreferences may throw if codecs are invalid\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * SDP fallback for browsers without setCodecPreferences support.\n\t * Reorders H.264 payload types to the front of the m=video line so that\n\t * H.264 is preferred during negotiation.\n\t */\n\t_preferH264InSdp(sdp: string): string {\n\t\tconst lines = sdp.split(\"\\r\\n\");\n\t\tconst result: string[] = [];\n\n\t\t// Collect H.264 payload types from a=rtpmap lines\n\t\tconst h264Payloads: string[] = [];\n\t\tfor (const line of lines) {\n\t\t\tif (line.includes(\"a=rtpmap:\") && line.toLowerCase().includes(\"h264\")) {\n\t\t\t\tconst match = line.match(/a=rtpmap:(\\d+)/);\n\t\t\t\tif (match) h264Payloads.push(match[1]);\n\t\t\t}\n\t\t}\n\n\t\tfor (const line of lines) {\n\t\t\tif (line.startsWith(\"m=video\") && h264Payloads.length > 0) {\n\t\t\t\tconst parts = line.split(\" \");\n\t\t\t\tconst prefix = parts.slice(0, 3).join(\" \");\n\t\t\t\tconst payloads = parts.slice(3);\n\t\t\t\tconst reordered = [...h264Payloads, ...payloads.filter((p) => !h264Payloads.includes(p))];\n\t\t\t\tresult.push(`${prefix} ${reordered.join(\" \")}`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tresult.push(line);\n\t\t}\n\n\t\treturn result.join(\"\\r\\n\");\n\t}\n\n\t/**\n\t * Apply H.264 preference to SDP when setCodecPreferences is not available.\n\t * Returns the original SDP unchanged if setCodecPreferences was already applied.\n\t */\n\tprivate _applyH264SdpFallback(sdp: string, pc: RTCPeerConnection): string {\n\t\t// If setCodecPreferences is supported, the transceiver API already handled it\n\t\tconst hasSetCodecPreferences =\n\t\t\tpc.getTransceivers &&\n\t\t\tpc.getTransceivers().some((t) => typeof t.setCodecPreferences === \"function\");\n\n\t\tif (hasSetCodecPreferences) return sdp;\n\n\t\treturn this._preferH264InSdp(sdp);\n\t}\n\n\tprivate _addTracksToConnection(stream: MediaStream, peerConnection: RTCPeerConnection): void {\n\t\tlogger.log(`add tracks from stream ${stream.id} to peer connection`);\n\n\t\tif (!peerConnection.addTrack) {\n\t\t\tlogger.error(`Your browser doesn't support RTCPeerConnection#addTrack. Ignored.`);\n\t\t\treturn;\n\t\t}\n\n\t\tstream.getTracks().forEach((track) => {\n\t\t\tpeerConnection.addTrack(track, stream);\n\t\t});\n\t}\n\n\tprivate _addStreamToMediaConnection(stream: MediaStream, mediaConnection: MediaConnection): void {\n\t\tlogger.log(`add stream ${stream.id} to media connection ${mediaConnection.connectionId}`);\n\n\t\tmediaConnection.addStream(stream);\n\t}\n}\n","import { BaseConnection, type BaseConnectionEvents } from \"../baseconnection\";\nimport type { Dendri } from \"../dendri\";\nimport type { EventsWithError } from \"../dendriError\";\nimport {\n\ttype BaseConnectionErrorType,\n\tConnectionType,\n\tDataConnectionErrorType,\n\tServerMessageType,\n} from \"../enums\";\nimport logger from \"../logger\";\nimport { Negotiator } from \"../negotiator\";\nimport type { ServerMessage } from \"../servermessage\";\nimport { randomToken } from \"../utils/randomToken\";\n\nexport interface DataConnectionEvents\n\textends EventsWithError<DataConnectionErrorType | BaseConnectionErrorType>,\n\t\tBaseConnectionEvents<DataConnectionErrorType | BaseConnectionErrorType> {\n\t/**\n\t * Emitted when data is received from the remote peer.\n\t */\n\tdata: (data: unknown) => void;\n\t/**\n\t * Emitted when the connection is established and ready-to-use.\n\t */\n\topen: () => void;\n}\n\n/**\n * Wraps a DataChannel between two Peers.\n */\nexport abstract class DataConnection extends BaseConnection<\n\tDataConnectionEvents,\n\tDataConnectionErrorType\n> {\n\tprotected static readonly ID_PREFIX = \"dc_\";\n\tprotected static readonly MAX_BUFFERED_AMOUNT = 8 * 1024 * 1024;\n\n\tprivate _negotiator: Negotiator<DataConnectionEvents, this> | null;\n\tabstract readonly serialization: string;\n\treadonly reliable: boolean;\n\n\tpublic get type() {\n\t\treturn ConnectionType.Data;\n\t}\n\n\tconstructor(peerId: string, provider: Dendri, options: any) {\n\t\tsuper(peerId, provider, options);\n\n\t\tthis.connectionId = this.options.connectionId || DataConnection.ID_PREFIX + randomToken();\n\n\t\tthis.label = this.options.label || this.connectionId;\n\t\tthis.reliable = !!this.options.reliable;\n\n\t\tthis._negotiator = new Negotiator(this);\n\n\t\tthis._negotiator.startConnection(\n\t\t\tthis.options._payload || {\n\t\t\t\toriginator: true,\n\t\t\t\treliable: this.reliable,\n\t\t\t},\n\t\t);\n\t}\n\n\t/** Called by the Negotiator when the DataChannel is ready. */\n\toverride _initializeDataChannel(dc: RTCDataChannel): void {\n\t\tthis.dataChannel = dc;\n\n\t\tthis.dataChannel.onopen = () => {\n\t\t\tlogger.log(`DC#${this.connectionId} dc connection success`);\n\t\t\tthis._open = true;\n\t\t\tthis.emit(\"open\");\n\t\t};\n\n\t\tthis.dataChannel.onclose = () => {\n\t\t\tlogger.log(`DC#${this.connectionId} dc closed for:`, this.peer);\n\t\t\tthis.close();\n\t\t};\n\t}\n\n\t/**\n\t * Exposed functionality for users.\n\t */\n\n\tprivate _flushCloseTimeout: ReturnType<typeof setTimeout> | null = null;\n\n\t/** Allows user to close connection. */\n\tclose(options?: { flush?: boolean }): void {\n\t\tif (options?.flush) {\n\t\t\tthis.send({\n\t\t\t\t__peerData: {\n\t\t\t\t\ttype: \"close\",\n\t\t\t\t},\n\t\t\t});\n\t\t\t// Fallback timeout so close() is guaranteed even if flush hangs\n\t\t\tthis._flushCloseTimeout = setTimeout(() => {\n\t\t\t\tthis._flushCloseTimeout = null;\n\t\t\t\tthis.close();\n\t\t\t}, 5000);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._flushCloseTimeout) {\n\t\t\tclearTimeout(this._flushCloseTimeout);\n\t\t\tthis._flushCloseTimeout = null;\n\t\t}\n\n\t\tif (this._negotiator) {\n\t\t\tthis._negotiator.cleanup();\n\t\t\tthis._negotiator = null;\n\t\t}\n\n\t\tif (this.provider) {\n\t\t\tthis.provider._removeConnection(this);\n\n\t\t\tthis.provider = null;\n\t\t}\n\n\t\tif (this.dataChannel) {\n\t\t\tthis.dataChannel.onopen = null;\n\t\t\tthis.dataChannel.onmessage = null;\n\t\t\tthis.dataChannel.onclose = null;\n\t\t\tthis.dataChannel = null;\n\t\t}\n\n\t\tif (!this.open) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._open = false;\n\n\t\tsuper.emit(\"close\");\n\t\tthis.removeAllListeners();\n\t}\n\n\tprotected abstract _send(data: any, chunked: boolean): void | Promise<void>;\n\n\t/** Allows user to send data. */\n\tpublic send(data: any, chunked = false) {\n\t\tif (!this.open) {\n\t\t\tthis.emitError(\n\t\t\t\tDataConnectionErrorType.NotOpenYet,\n\t\t\t\t\"Connection is not open. You should listen for the `open` event before sending messages.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\treturn this._send(data, chunked);\n\t}\n\n\tasync handleMessage(message: ServerMessage) {\n\t\tconst payload = message.payload;\n\n\t\tswitch (message.type) {\n\t\t\tcase ServerMessageType.Answer:\n\t\t\t\tif (this._negotiator) {\n\t\t\t\t\tawait this._negotiator.handleSDP(message.type, payload.sdp);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Candidate:\n\t\t\t\tif (this._negotiator) {\n\t\t\t\t\tawait this._negotiator.handleCandidate(payload.candidate);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tlogger.warn(\"Unrecognized message type:\", message.type, \"from peer:\", this.peer);\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n","import logger from \"../../logger\";\nimport { DataConnection } from \"../DataConnection\";\n\nexport abstract class BufferedConnection extends DataConnection {\n\tprivate _buffer: any[] = [];\n\tprivate _bufferSize = 0;\n\tprivate _buffering = false;\n\tprivate _bufferTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate _messageHandler: ((e: MessageEvent) => void) | null = null;\n\n\tpublic get bufferSize(): number {\n\t\treturn this._bufferSize;\n\t}\n\n\tpublic override _initializeDataChannel(dc: RTCDataChannel) {\n\t\tsuper._initializeDataChannel(dc);\n\t\tthis.dataChannel!.binaryType = \"arraybuffer\";\n\t\tthis._messageHandler = (e: MessageEvent) => this._handleDataMessage(e);\n\t\tthis.dataChannel?.addEventListener(\"message\", this._messageHandler);\n\t}\n\n\tprotected abstract _handleDataMessage(e: MessageEvent): void;\n\n\tprotected _bufferedSend(msg: ArrayBuffer): void {\n\t\tif (this._buffering || !this._trySend(msg)) {\n\t\t\tthis._buffer.push(msg);\n\t\t\tthis._bufferSize = this._buffer.length;\n\t\t}\n\t}\n\n\t// Returns true if the send succeeds.\n\tprivate _trySend(msg: ArrayBuffer): boolean {\n\t\tif (!this.open) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif ((this.dataChannel?.bufferedAmount ?? 0) > DataConnection.MAX_BUFFERED_AMOUNT) {\n\t\t\tthis._buffering = true;\n\t\t\tthis._bufferTimer = setTimeout(() => {\n\t\t\t\tthis._bufferTimer = null;\n\t\t\t\tthis._buffering = false;\n\t\t\t\tthis._tryBuffer();\n\t\t\t}, 50);\n\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.dataChannel?.send(msg);\n\t\t} catch (e) {\n\t\t\tlogger.error(`DC#:${this.connectionId} Error when sending:`, e);\n\t\t\tthis._buffering = true;\n\n\t\t\tthis.close();\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Try to send buffered messages iteratively.\n\tprivate _tryBuffer(): void {\n\t\twhile (this.open && this._buffer.length > 0) {\n\t\t\tconst msg = this._buffer[0];\n\n\t\t\tif (!this._trySend(msg)) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis._buffer.shift();\n\t\t\tthis._bufferSize = this._buffer.length;\n\t\t}\n\t}\n\n\tpublic override close(options?: { flush?: boolean }) {\n\t\tif (options?.flush) {\n\t\t\tthis.send({\n\t\t\t\t__peerData: {\n\t\t\t\t\ttype: \"close\",\n\t\t\t\t},\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._bufferTimer) {\n\t\t\tclearTimeout(this._bufferTimer);\n\t\t\tthis._bufferTimer = null;\n\t\t}\n\n\t\tif (this.dataChannel && this._messageHandler) {\n\t\t\tthis.dataChannel.removeEventListener(\"message\", this._messageHandler);\n\t\t\tthis._messageHandler = null;\n\t\t}\n\n\t\tthis._buffer = [];\n\t\tthis._bufferSize = 0;\n\t\tsuper.close();\n\t}\n}\n","import { type Packable, pack, unpack } from \"peerjs-js-binarypack\";\nimport { DataConnectionErrorType, SerializationType } from \"../../enums\";\nimport logger from \"../../logger\";\nimport { BufferedConnection } from \"./BufferedConnection\";\nimport { BinaryPackChunker, concatArrayBuffers } from \"./binaryPackChunker\";\n\nexport class BinaryPack extends BufferedConnection {\n\tprivate readonly chunker = new BinaryPackChunker();\n\treadonly serialization = SerializationType.Binary;\n\n\tprivate static readonly MAX_CHUNKED_SETS = 256;\n\n\tprivate _chunkedData: {\n\t\t[id: number]: {\n\t\t\tdata: Uint8Array[];\n\t\t\tcount: number;\n\t\t\ttotal: number;\n\t\t};\n\t} = {};\n\n\tpublic override close(options?: { flush?: boolean }) {\n\t\tthis._chunkedData = {};\n\t\tsuper.close(options);\n\t}\n\n\t// Handles a DataChannel message.\n\tprotected override _handleDataMessage({ data }: { data: Uint8Array }): void {\n\t\tlet deserializedData: any;\n\t\ttry {\n\t\t\tdeserializedData = unpack(data as unknown as ArrayBuffer);\n\t\t} catch (e) {\n\t\t\tlogger.error(`DC#${this.connectionId} Failed to unpack data:`, e);\n\t\t\tthis.emitError(DataConnectionErrorType.NotOpenYet, \"Failed to deserialize received data\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Dendri specific message\n\t\tconst peerData = deserializedData.__peerData;\n\t\tif (peerData) {\n\t\t\tif (peerData.type === \"close\") {\n\t\t\t\tthis.close();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Chunked data -- piece things back together.\n\t\t\tthis._handleChunk(deserializedData);\n\t\t\treturn;\n\t\t}\n\n\t\tthis.emit(\"data\", deserializedData);\n\t}\n\n\tprivate _handleChunk(data: {\n\t\t__peerData: number;\n\t\tn: number;\n\t\ttotal: number;\n\t\tdata: ArrayBuffer;\n\t}): void {\n\t\tconst id = data.__peerData;\n\n\t\t// Validate chunk index\n\t\tif (data.n < 0 || data.n >= data.total) {\n\t\t\tlogger.warn(\n\t\t\t\t`DC#${this.connectionId} Invalid chunk index ${data.n} of ${data.total}, dropping`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst chunkInfo = this._chunkedData[id] || {\n\t\t\tdata: [],\n\t\t\tcount: 0,\n\t\t\ttotal: data.total,\n\t\t};\n\n\t\tchunkInfo.data[data.n] = new Uint8Array(data.data);\n\t\tchunkInfo.count++;\n\t\tthis._chunkedData[id] = chunkInfo;\n\n\t\tif (chunkInfo.total === chunkInfo.count) {\n\t\t\t// Clean up before making the recursive call to `_handleDataMessage`.\n\t\t\tdelete this._chunkedData[id];\n\n\t\t\t// We've received all the chunks--time to construct the complete data.\n\t\t\t// const data = new Blob(chunkInfo.data);\n\t\t\tconst data = concatArrayBuffers(chunkInfo.data);\n\t\t\tthis._handleDataMessage({ data });\n\t\t} else {\n\t\t\t// Cap pending incomplete chunk sets to prevent memory exhaustion\n\t\t\tconst pendingKeys = Object.keys(this._chunkedData);\n\t\t\tif (pendingKeys.length > BinaryPack.MAX_CHUNKED_SETS) {\n\t\t\t\t// Remove the oldest entry\n\t\t\t\tconst oldestKey = pendingKeys[0];\n\t\t\t\tlogger.warn(\n\t\t\t\t\t`DC#${this.connectionId} Too many pending chunk sets (${pendingKeys.length}), dropping oldest`,\n\t\t\t\t);\n\t\t\t\tdelete this._chunkedData[Number(oldestKey)];\n\t\t\t}\n\t\t}\n\t}\n\n\tprotected override _send(data: Packable, chunked: boolean) {\n\t\tconst blob = pack(data);\n\t\tif (blob instanceof Promise) {\n\t\t\treturn this._send_blob(blob);\n\t\t}\n\n\t\tif (!chunked && blob.byteLength > this.chunker.chunkedMTU) {\n\t\t\tthis._sendChunks(blob);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._bufferedSend(blob);\n\t}\n\tprivate async _send_blob(blobPromise: Promise<ArrayBufferLike>) {\n\t\tconst blob = (await blobPromise) as ArrayBuffer;\n\n\t\tif (!this.open) {\n\t\t\tlogger.warn(`DC#${this.connectionId} Connection closed during async send, dropping message`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (blob.byteLength > this.chunker.chunkedMTU) {\n\t\t\tthis._sendChunks(blob);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._bufferedSend(blob);\n\t}\n\n\tprivate _sendChunks(blob: ArrayBuffer) {\n\t\tconst blobs = this.chunker.chunk(blob);\n\t\tlogger.log(`DC#${this.connectionId} Try to send ${blobs.length} chunks...`);\n\n\t\tfor (const blob of blobs) {\n\t\t\tthis.send(blob, true);\n\t\t}\n\t}\n}\n","import { DataConnectionErrorType, SerializationType } from \"../../enums\";\nimport logger from \"../../logger\";\nimport { util } from \"../../util\";\nimport { BufferedConnection } from \"./BufferedConnection\";\n\nexport class Json extends BufferedConnection {\n\treadonly serialization = SerializationType.JSON;\n\tprivate readonly encoder = new TextEncoder();\n\tprivate readonly decoder = new TextDecoder();\n\n\tstringify: (data: any) => string = JSON.stringify;\n\tparse: (data: string) => any = JSON.parse;\n\n\t// Handles a DataChannel message.\n\tprotected override _handleDataMessage({ data }: { data: Uint8Array }): void {\n\t\tlet deserializedData: any;\n\t\ttry {\n\t\t\tdeserializedData = this.parse(this.decoder.decode(data));\n\t\t} catch (e) {\n\t\t\tlogger.error(`DC#${this.connectionId} Failed to parse JSON data:`, e);\n\t\t\tthis.emitError(DataConnectionErrorType.NotOpenYet, \"Failed to parse received JSON data\");\n\t\t\treturn;\n\t\t}\n\n\t\t// Dendri specific message\n\t\tconst peerData = deserializedData.__peerData;\n\t\tif (peerData && peerData.type === \"close\") {\n\t\t\tthis.close();\n\t\t\treturn;\n\t\t}\n\n\t\tthis.emit(\"data\", deserializedData);\n\t}\n\n\toverride _send(data: any, _chunked: boolean) {\n\t\tconst encodedData = this.encoder.encode(this.stringify(data));\n\t\tif (encodedData.byteLength >= util.chunkedMTU) {\n\t\t\tthis.emitError(DataConnectionErrorType.MessageToBig, \"Message too big for JSON channel\");\n\t\t\treturn;\n\t\t}\n\t\tthis._bufferedSend(encodedData.buffer as ArrayBuffer);\n\t}\n}\n","import { SerializationType } from \"../../enums\";\nimport { BufferedConnection } from \"./BufferedConnection\";\n\nexport class Raw extends BufferedConnection {\n\treadonly serialization = SerializationType.None;\n\n\tprotected _handleDataMessage({ data }: MessageEvent): void {\n\t\tsuper.emit(\"data\", data);\n\t}\n\n\toverride _send(data: ArrayBuffer, _chunked: boolean): void {\n\t\tthis._bufferedSend(data);\n\t}\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport { AckManager } from \"./ack\";\nimport type { DataConnection } from \"./dataconnection/DataConnection\";\nimport type { Dendri } from \"./dendri\";\nimport { RelayEncryption } from \"./encryption\";\nimport { type ConnectionQuality, ServerMessageType, TransportMode } from \"./enums\";\nimport logger from \"./logger\";\nimport type { HybridConnectionOption } from \"./optionInterfaces\";\nimport { isTopicEnvelope, TopicManager } from \"./topics\";\n\n/** Options accepted by {@link HybridConnection.send}. */\nexport interface HybridSendOptions {\n\t/** When set, the message is tagged with this topic string. */\n\treadonly topic?: string;\n}\n\ninterface HybridConnectionEvents {\n\topen: () => void;\n\tdata: (data: unknown) => void;\n\tclose: () => void;\n\terror: (err: Error) => void;\n\ttransportChanged: (mode: TransportMode) => void;\n\tqualityChanged: (quality: ConnectionQuality) => void;\n}\n\n/**\n * Wraps both a WebRTC DataConnection and a WebSocket relay,\n * switching transparently between them.\n *\n * - Attempts WebRTC first; falls back to WS relay on ICE timeout.\n * - Periodically retries WebRTC upgrade when on relay.\n * - Emits `transportChanged` whenever the active transport switches.\n */\nexport class HybridConnection extends EventEmitter<HybridConnectionEvents> {\n\treadonly peer: string;\n\tprivate readonly _provider: Dendri;\n\tprivate readonly _options: Readonly<HybridConnectionOption>;\n\tprivate _dataConnection: DataConnection | null = null;\n\tprivate _mode: TransportMode = TransportMode.Reconnecting;\n\tprivate _iceTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate _upgradeTimer: ReturnType<typeof setInterval> | null = null;\n\tprivate _upgradeAttempts: number = 0;\n\tprivate _open: boolean = false;\n\tprivate _closed: boolean = false;\n\tprivate readonly _ackManager = new AckManager();\n\tprivate readonly _topics = new TopicManager();\n\tprivate readonly _encryption = new RelayEncryption();\n\tprivate readonly _encryptRelay: boolean;\n\tprivate _keyExchangeSent = false;\n\tprivate _pendingRelayQueue: unknown[] = [];\n\n\t// --- Reorder buffer for sequenced relay delivery ---\n\t// `null` means no baseline seen yet; the first message establishes it.\n\t// Using a real sentinel avoids the `=== 0` check misfiring when the\n\t// server assigns seq=0 (valid after a restart).\n\tprivate _expectedSeq: number | null = null;\n\tprivate _reorderBuffer = new Map<number, unknown>();\n\tprivate readonly _reorderTimeout = 500; // ms to wait for missing messages\n\t// Track pending gap timers so close() can cancel them; otherwise a\n\t// timer firing after close will emit on a dead emitter.\n\tprivate _reorderTimers = new Set<ReturnType<typeof setTimeout>>();\n\n\tconstructor(peer: string, provider: Dendri, options: HybridConnectionOption = {}) {\n\t\tsuper();\n\n\t\tthis.peer = peer;\n\t\tthis._provider = provider;\n\t\tthis._options = Object.freeze({ ...options });\n\t\tthis._encryptRelay = options.encryptRelay ?? true;\n\t}\n\n\tget mode(): TransportMode {\n\t\treturn this._mode;\n\t}\n\n\tget open(): boolean {\n\t\treturn this._open;\n\t}\n\n\t/** Start connection: try WebRTC first, fall back to WS relay on timeout. */\n\tstart(): void {\n\t\tif (this._closed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._attemptWebRTC();\n\t}\n\n\t/** Send data through the best available transport, optionally tagged with a topic. */\n\tsend(data: unknown, options?: HybridSendOptions): void {\n\t\tif (this._closed) {\n\t\t\tthis.emit(\"error\", new Error(\"Connection is closed.\"));\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._open) {\n\t\t\tthis.emit(\n\t\t\t\t\"error\",\n\t\t\t\tnew Error(\"Connection is not open. Listen for the `open` event before sending.\"),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst topic = options?.topic;\n\t\tconst wire = topic ? { __topic: topic, __data: data } : data;\n\n\t\tif (this._mode === TransportMode.WebRTC && this._dataConnection?.open) {\n\t\t\tthis._dataConnection.send(wire);\n\t\t} else if (this._mode === TransportMode.WebSocketRelay) {\n\t\t\tthis._sendRelay(wire);\n\t\t} else {\n\t\t\tthis.emit(\"error\", new Error(`No transport available (current mode: ${this._mode}).`));\n\t\t}\n\t}\n\n\t/**\n\t * Send data with delivery confirmation (at-least-once guarantee).\n\t * Resolves when the remote peer ACKs, rejects on timeout.\n\t */\n\tasync sendWithAck(data: unknown, timeoutMs?: number): Promise<void> {\n\t\tif (this._closed) {\n\t\t\tthrow new Error(\"Connection is closed.\");\n\t\t}\n\n\t\tif (!this._open) {\n\t\t\tthrow new Error(\"Connection is not open. Listen for the `open` event before sending.\");\n\t\t}\n\n\t\tconst ackId = this._ackManager.nextId();\n\n\t\tif (this._mode === TransportMode.WebRTC && this._dataConnection?.open) {\n\t\t\tthis._dataConnection.send({ __ackId: ackId, data });\n\t\t} else if (this._mode === TransportMode.WebSocketRelay) {\n\t\t\tthis._sendRelay({ __ackId: ackId, data });\n\t\t} else {\n\t\t\tthrow new Error(`No transport available (current mode: ${this._mode}).`);\n\t\t}\n\n\t\treturn this._ackManager.waitForAck(ackId, timeoutMs);\n\t}\n\n\t/**\n\t * @internal\n\t * Expose the AckManager so the Dendri instance can route incoming ACKs.\n\t */\n\tget ackManager(): AckManager {\n\t\treturn this._ackManager;\n\t}\n\n\t/**\n\t * Subscribe to messages on a specific topic.\n\t * Returns an unsubscribe function.\n\t */\n\tsubscribe(topic: string, handler: (data: unknown, peerId: string) => void): () => void {\n\t\treturn this._topics.subscribe(topic, handler);\n\t}\n\n\t/**\n\t * Subscribe to all incoming data regardless of topic.\n\t * Returns an unsubscribe function.\n\t */\n\tonData(handler: (data: unknown, peerId: string) => void): () => void {\n\t\treturn this._topics.subscribeAll(handler);\n\t}\n\n\t/**\n\t * Handle a DATA message received via WebSocket relay.\n\t * Called by Dendri._handleMessage when routing relay data.\n\t *\n\t * @param payload - The message payload.\n\t * @param seq - Optional server-assigned sequence number for ordering.\n\t */\n\thandleRelayData(payload: unknown, seq?: number): void {\n\t\tif (\n\t\t\tthis._encryptRelay &&\n\t\t\tthis._encryption.ready &&\n\t\t\tpayload !== null &&\n\t\t\ttypeof payload === \"object\" &&\n\t\t\t\"__encrypted\" in payload\n\t\t) {\n\t\t\tconst enc = payload as { __encrypted: { iv: string; ciphertext: string } };\n\t\t\tthis._encryption\n\t\t\t\t.decrypt(enc.__encrypted)\n\t\t\t\t.then((plaintext) => {\n\t\t\t\t\tthis._deliverInOrder(seq, JSON.parse(plaintext));\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tthis.emit(\"error\", new Error(`Relay decryption failed: ${String(err)}`));\n\t\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tthis._deliverInOrder(seq, payload);\n\t}\n\n\t/** Close connection and clean up all resources. */\n\tclose(): void {\n\t\tif (this._closed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._closed = true;\n\t\tthis._clearIceTimer();\n\t\tthis._clearUpgradeTimer();\n\t\tthis._ackManager.clear();\n\t\tthis._topics.clear();\n\t\tthis._encryption.clear();\n\t\tthis._pendingRelayQueue = [];\n\t\tthis._keyExchangeSent = false;\n\t\tthis._reorderBuffer.clear();\n\t\tthis._expectedSeq = null;\n\t\tfor (const t of this._reorderTimers) clearTimeout(t);\n\t\tthis._reorderTimers.clear();\n\n\t\tif (this._dataConnection) {\n\t\t\tthis._dataConnection.close();\n\t\t\tthis._dataConnection = null;\n\t\t}\n\n\t\tif (this._open) {\n\t\t\tthis._open = false;\n\t\t\tthis.emit(\"close\");\n\t\t}\n\n\t\tthis.removeAllListeners();\n\t}\n\n\t/**\n\t * Initiate the ECDH key exchange by generating a key pair and sending\n\t * the public key to the remote peer via signaling.\n\t */\n\tinitiateKeyExchange(): void {\n\t\tif (!this._encryptRelay || this._keyExchangeSent) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Set the flag synchronously before the await so a second call made\n\t\t// before generateKeyPair resolves is rejected. Otherwise two key\n\t\t// pairs could be generated and the second would silently replace\n\t\t// the first, invalidating messages already encrypted with key A.\n\t\tthis._keyExchangeSent = true;\n\n\t\tthis._encryption\n\t\t\t.generateKeyPair()\n\t\t\t.then((publicKey) => {\n\t\t\t\tthis._provider.socket.send({\n\t\t\t\t\ttype: ServerMessageType.KeyExchange,\n\t\t\t\t\tdst: this.peer,\n\t\t\t\t\tpayload: { publicKey },\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\t// Roll back so a retry can succeed.\n\t\t\t\tthis._keyExchangeSent = false;\n\t\t\t\tthis.emit(\"error\", new Error(`Key exchange initiation failed: ${String(err)}`));\n\t\t\t});\n\t}\n\n\t/**\n\t * Handle an incoming KEY_EXCHANGE message from the remote peer.\n\t * Derives the shared secret and sends our public key back if we haven't yet.\n\t */\n\thandleKeyExchange(payload: { publicKey: JsonWebKey }): void {\n\t\tif (!this._encryptRelay) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst deriveAndFlush = (remoteKey: JsonWebKey): void => {\n\t\t\tthis._encryption\n\t\t\t\t.deriveSharedKey(remoteKey)\n\t\t\t\t.then(() => {\n\t\t\t\t\tlogger.log(`HybridConnection: E2E encryption established with ${this.peer}`);\n\t\t\t\t\tthis._flushPendingRelayQueue();\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tthis.emit(\"error\", new Error(`Key derivation failed: ${String(err)}`));\n\t\t\t\t});\n\t\t};\n\n\t\tif (!this._keyExchangeSent) {\n\t\t\t// We received the first KEY_EXCHANGE — generate our key pair and respond.\n\t\t\t// Flag set synchronously to block a concurrent initiateKeyExchange.\n\t\t\tthis._keyExchangeSent = true;\n\t\t\tthis._encryption\n\t\t\t\t.generateKeyPair()\n\t\t\t\t.then((publicKey) => {\n\t\t\t\t\tthis._provider.socket.send({\n\t\t\t\t\t\ttype: ServerMessageType.KeyExchange,\n\t\t\t\t\t\tdst: this.peer,\n\t\t\t\t\t\tpayload: { publicKey },\n\t\t\t\t\t});\n\t\t\t\t\tderiveAndFlush(payload.publicKey);\n\t\t\t\t})\n\t\t\t\t.catch((err) => {\n\t\t\t\t\tthis._keyExchangeSent = false;\n\t\t\t\t\tthis.emit(\"error\", new Error(`Key exchange response failed: ${String(err)}`));\n\t\t\t\t});\n\t\t} else {\n\t\t\t// We already sent our key — just derive from the peer's key.\n\t\t\tderiveAndFlush(payload.publicKey);\n\t\t}\n\t}\n\n\t/**\n\t * Send a payload via WebSocket relay, encrypting it if encryption is ready.\n\t * If encryption is enabled but not yet ready, the message is queued.\n\t */\n\tprivate _sendRelay(wire: unknown): void {\n\t\tif (!this._encryptRelay) {\n\t\t\tthis._provider.socket.send({\n\t\t\t\ttype: ServerMessageType.Data,\n\t\t\t\tdst: this.peer,\n\t\t\t\tpayload: wire,\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._encryption.ready) {\n\t\t\t// Key exchange in progress — queue the message.\n\t\t\tthis._pendingRelayQueue.push(wire);\n\t\t\treturn;\n\t\t}\n\n\t\tconst serialized = JSON.stringify(wire);\n\t\tthis._encryption\n\t\t\t.encrypt(serialized)\n\t\t\t.then((encrypted) => {\n\t\t\t\tthis._provider.socket.send({\n\t\t\t\t\ttype: ServerMessageType.Data,\n\t\t\t\t\tdst: this.peer,\n\t\t\t\t\tpayload: { __encrypted: encrypted },\n\t\t\t\t});\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tthis.emit(\"error\", new Error(`Relay encryption failed: ${String(err)}`));\n\t\t\t});\n\t}\n\n\t/** Flush messages that were queued while waiting for key exchange. */\n\tprivate _flushPendingRelayQueue(): void {\n\t\tconst queued = [...this._pendingRelayQueue];\n\t\tthis._pendingRelayQueue = [];\n\n\t\tfor (const wire of queued) {\n\t\t\tthis._sendRelay(wire);\n\t\t}\n\t}\n\n\t/**\n\t * Enforce ordered delivery for sequenced relay messages.\n\t * Messages without a seq or when not in relay mode are delivered immediately.\n\t */\n\tprivate _deliverInOrder(seq: number | undefined, data: unknown): void {\n\t\tif (seq === undefined || !this._encryptRelay) {\n\t\t\t// No seq or not in relay mode -- deliver immediately (backward compat)\n\t\t\tthis._dispatchIncoming(data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._expectedSeq === null) {\n\t\t\t// First message -- establish baseline.\n\t\t\tthis._dispatchIncoming(data);\n\t\t\tthis._expectedSeq = seq + 1;\n\t\t\treturn;\n\t\t}\n\n\t\tif (seq === this._expectedSeq) {\n\t\t\t// In order -- deliver and flush any buffered\n\t\t\tthis._dispatchIncoming(data);\n\t\t\tthis._expectedSeq = seq + 1;\n\t\t\tthis._flushReorderBuffer();\n\t\t} else if (seq > this._expectedSeq) {\n\t\t\t// Out of order -- buffer it\n\t\t\tthis._reorderBuffer.set(seq, data);\n\t\t\t// Track the timer so close() can cancel it. If we don't, a\n\t\t\t// late fire after close would dispatch on a closed emitter.\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis._reorderTimers.delete(timer);\n\t\t\t\tif (this._closed) return;\n\t\t\t\tif (this._reorderBuffer.has(seq)) {\n\t\t\t\t\tthis._forceFlushReorderBuffer();\n\t\t\t\t}\n\t\t\t}, this._reorderTimeout);\n\t\t\tthis._reorderTimers.add(timer);\n\t\t}\n\t\t// seq < _expectedSeq = duplicate, ignore\n\t}\n\n\t/** Flush consecutive messages from the reorder buffer. */\n\tprivate _flushReorderBuffer(): void {\n\t\tif (this._expectedSeq === null) return;\n\t\twhile (this._reorderBuffer.has(this._expectedSeq)) {\n\t\t\tthis._dispatchIncoming(this._reorderBuffer.get(this._expectedSeq));\n\t\t\tthis._reorderBuffer.delete(this._expectedSeq);\n\t\t\tthis._expectedSeq++;\n\t\t}\n\t}\n\n\t/**\n\t * Force-flush the reorder buffer when a timeout fires.\n\t * Skips past any gaps by advancing _expectedSeq to the lowest buffered\n\t * sequence, then delivers all consecutive messages from there.\n\t */\n\tprivate _forceFlushReorderBuffer(): void {\n\t\tif (this._reorderBuffer.size === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Find the lowest buffered seq and skip the gap.\n\t\tlet minSeq = Number.MAX_SAFE_INTEGER;\n\t\tfor (const seq of this._reorderBuffer.keys()) {\n\t\t\tif (seq < minSeq) {\n\t\t\t\tminSeq = seq;\n\t\t\t}\n\t\t}\n\n\t\t// Skip past the gap to the lowest buffered message.\n\t\tthis._expectedSeq = minSeq;\n\t\tthis._flushReorderBuffer();\n\t}\n\n\t/**\n\t * Route an incoming payload through the TopicManager (if applicable)\n\t * and emit the generic `data` event.\n\t *\n\t * If the payload is a topic envelope, the inner data is extracted and\n\t * dispatched to topic-specific handlers. The raw `data` event always fires\n\t * with the unwrapped payload so legacy listeners still work.\n\t */\n\tprivate _dispatchIncoming(payload: unknown): void {\n\t\tif (isTopicEnvelope(payload)) {\n\t\t\tthis._topics.dispatch(payload.__topic, payload.__data, this.peer);\n\t\t\tthis.emit(\"data\", payload.__data);\n\t\t} else {\n\t\t\tthis._topics.dispatch(undefined, payload, this.peer);\n\t\t\tthis.emit(\"data\", payload);\n\t\t}\n\t}\n\n\t/** Attempt a WebRTC connection with ICE timeout. */\n\tprivate _attemptWebRTC(): void {\n\t\tif (this._closed) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst iceTimeout = this._options.iceTimeout ?? 10_000;\n\n\t\t// Start WebRTC negotiation via the provider's existing connect() method.\n\t\tconst dc = this._provider.connect(this.peer, { reliable: true });\n\n\t\tif (!dc) {\n\t\t\t// connect() returned undefined (disconnected, invalid peer, etc.)\n\t\t\tthis._fallbackToRelay();\n\t\t\treturn;\n\t\t}\n\n\t\tthis._dataConnection = dc;\n\n\t\t// Set ICE timeout — if WebRTC hasn't opened by then, fall back.\n\t\tthis._iceTimer = setTimeout(() => {\n\t\t\tif (this._mode !== TransportMode.WebRTC) {\n\t\t\t\tthis._fallbackToRelay();\n\t\t\t}\n\t\t}, iceTimeout);\n\n\t\tthis._dataConnection.on(\"open\", () => {\n\t\t\tthis._clearIceTimer();\n\t\t\tthis._clearUpgradeTimer();\n\t\t\tthis._upgradeAttempts = 0;\n\t\t\tthis._setMode(TransportMode.WebRTC);\n\n\t\t\tif (!this._open) {\n\t\t\t\tthis._open = true;\n\t\t\t\tthis.emit(\"open\");\n\t\t\t}\n\t\t});\n\n\t\tthis._dataConnection.on(\"data\", (data) => {\n\t\t\tthis._dispatchIncoming(data);\n\t\t});\n\n\t\tthis._dataConnection.on(\"close\", () => {\n\t\t\tif (this._open && !this._closed) {\n\t\t\t\t// WebRTC dropped mid-session — fall back to relay.\n\t\t\t\tlogger.log(`HybridConnection: WebRTC to ${this.peer} closed, falling back to relay`);\n\t\t\t\tthis._dataConnection = null;\n\t\t\t\tthis._fallbackToRelay();\n\t\t\t}\n\t\t});\n\n\t\tthis._dataConnection.on(\"error\", (err) => {\n\t\t\tthis.emit(\"error\", err instanceof Error ? err : new Error(String(err)));\n\t\t});\n\t}\n\n\t/** Switch to WebSocket relay and optionally schedule periodic upgrade attempts. */\n\tprivate _fallbackToRelay(): void {\n\t\tif (this._closed) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._clearIceTimer();\n\t\tthis._setMode(TransportMode.WebSocketRelay);\n\n\t\tif (!this._open) {\n\t\t\tthis._open = true;\n\t\t\tthis.emit(\"open\");\n\t\t}\n\n\t\t// Initiate E2E encryption key exchange for the relay path.\n\t\tthis.initiateKeyExchange();\n\n\t\tthis._scheduleUpgrade();\n\t}\n\n\t/** Update the transport mode and emit if changed. */\n\tprivate _setMode(mode: TransportMode): void {\n\t\tif (this._mode !== mode) {\n\t\t\tthis._mode = mode;\n\t\t\tthis.emit(\"transportChanged\", mode);\n\t\t}\n\t}\n\n\tprivate _clearIceTimer(): void {\n\t\tif (this._iceTimer !== null) {\n\t\t\tclearTimeout(this._iceTimer);\n\t\t\tthis._iceTimer = null;\n\t\t}\n\t}\n\n\tprivate _clearUpgradeTimer(): void {\n\t\tif (this._upgradeTimer !== null) {\n\t\t\tclearInterval(this._upgradeTimer);\n\t\t\tthis._upgradeTimer = null;\n\t\t}\n\t}\n\n\t/**\n\t * Periodically retry WebRTC when on relay.\n\t * Respects `autoUpgrade`, `upgradeInterval`, and `maxUpgradeAttempts` options.\n\t */\n\tprivate _scheduleUpgrade(): void {\n\t\tif (!(this._options.autoUpgrade ?? true)) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Don't stack multiple upgrade timers.\n\t\tthis._clearUpgradeTimer();\n\n\t\tconst interval = this._options.upgradeInterval ?? 60_000;\n\t\tconst maxAttempts = this._options.maxUpgradeAttempts ?? 5;\n\n\t\tthis._upgradeTimer = setInterval(() => {\n\t\t\tif (this._closed) {\n\t\t\t\tthis._clearUpgradeTimer();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this._upgradeAttempts >= maxAttempts) {\n\t\t\t\tthis._clearUpgradeTimer();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._upgradeAttempts++;\n\t\t\tthis._attemptWebRTC();\n\t\t}, interval);\n\t}\n}\n","/**\n * ACK-based message delivery confirmation manager.\n *\n * Tracks outgoing messages that expect an acknowledgement and resolves/rejects\n * the corresponding promise when the ACK arrives or the timeout fires.\n */\n\ninterface PendingAck {\n\treadonly resolve: () => void;\n\treadonly reject: (err: Error) => void;\n\treadonly timer: ReturnType<typeof setTimeout>;\n\t/** Optional peer tag so per-peer disconnects can reject only their ACKs. */\n\treadonly peerId?: string;\n}\n\nexport class AckManager {\n\tprivate readonly _pending = new Map<string, PendingAck>();\n\tprivate _counter = 0;\n\n\t/** Generate a unique ack ID. */\n\tnextId(): string {\n\t\treturn `ack_${++this._counter}_${Date.now()}`;\n\t}\n\n\t/**\n\t * Register a pending ACK with timeout. When `peerId` is supplied, the\n\t * ACK can be rejected early by {@link rejectAllForPeer} when that peer\n\t * disconnects, so callers don't wait out the full timeout after the\n\t * transport layer already knows the target is gone.\n\t */\n\twaitForAck(ackId: string, timeoutMs: number = 5000, peerId?: string): Promise<void> {\n\t\treturn new Promise<void>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis._pending.delete(ackId);\n\t\t\t\treject(new Error(`ACK timeout for ${ackId}`));\n\t\t\t}, timeoutMs);\n\n\t\t\tthis._pending.set(ackId, { resolve, reject, timer, peerId });\n\t\t});\n\t}\n\n\t/** Handle an incoming ACK message. Returns true if the ackId was pending. */\n\thandleAck(ackId: string): boolean {\n\t\tconst pending = this._pending.get(ackId);\n\n\t\tif (pending) {\n\t\t\tclearTimeout(pending.timer);\n\t\t\tpending.resolve();\n\t\t\tthis._pending.delete(ackId);\n\t\t\treturn true;\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t * Reject every pending ACK whose `peerId` matches. Called from the\n\t * close path of a per-peer connection so broadcastWithAck promises\n\t * resolve with a clear error immediately instead of stalling until\n\t * the timeout.\n\t */\n\trejectAllForPeer(peerId: string): number {\n\t\tlet rejected = 0;\n\t\tfor (const [ackId, pending] of this._pending) {\n\t\t\tif (pending.peerId === peerId) {\n\t\t\t\tclearTimeout(pending.timer);\n\t\t\t\tpending.reject(new Error(`Peer ${peerId} disconnected`));\n\t\t\t\tthis._pending.delete(ackId);\n\t\t\t\trejected++;\n\t\t\t}\n\t\t}\n\t\treturn rejected;\n\t}\n\n\t/** Clean up all pending ACKs (e.g. on disconnect). */\n\tclear(): void {\n\t\tfor (const [, pending] of this._pending) {\n\t\t\tclearTimeout(pending.timer);\n\t\t\tpending.reject(new Error(\"Connection closed\"));\n\t\t}\n\t\tthis._pending.clear();\n\t}\n\n\t/** Number of ACKs currently awaiting confirmation. */\n\tget pendingCount(): number {\n\t\treturn this._pending.size;\n\t}\n}\n","/**\n * E2E encryption for relay messages using ECDH + AES-256-GCM.\n * Uses the Web Crypto API -- available in all modern browsers and Node.js 18+.\n */\n\n/** Encrypted payload structure sent over the relay. */\nexport interface EncryptedPayload {\n\treadonly iv: string;\n\treadonly ciphertext: string;\n}\n\nexport class RelayEncryption {\n\tprivate _keyPair: CryptoKeyPair | null = null;\n\tprivate _sharedKey: CryptoKey | null = null;\n\tprivate _ready = false;\n\n\tget ready(): boolean {\n\t\treturn this._ready;\n\t}\n\n\t/** Generate ECDH key pair and return the public key as JWK. */\n\tasync generateKeyPair(): Promise<JsonWebKey> {\n\t\tthis._keyPair = await crypto.subtle.generateKey({ name: \"ECDH\", namedCurve: \"P-256\" }, true, [\n\t\t\t\"deriveKey\",\n\t\t]);\n\t\treturn crypto.subtle.exportKey(\"jwk\", this._keyPair.publicKey);\n\t}\n\n\t/** Derive shared AES-256-GCM key from remote peer's public key. */\n\tasync deriveSharedKey(remotePublicKeyJwk: JsonWebKey): Promise<void> {\n\t\tif (!this._keyPair) {\n\t\t\tthrow new Error(\"Key pair not generated\");\n\t\t}\n\n\t\tconst remotePublicKey = await crypto.subtle.importKey(\n\t\t\t\"jwk\",\n\t\t\tremotePublicKeyJwk,\n\t\t\t{ name: \"ECDH\", namedCurve: \"P-256\" },\n\t\t\tfalse,\n\t\t\t[],\n\t\t);\n\n\t\tthis._sharedKey = await crypto.subtle.deriveKey(\n\t\t\t{ name: \"ECDH\", public: remotePublicKey },\n\t\t\tthis._keyPair.privateKey,\n\t\t\t{ name: \"AES-GCM\", length: 256 },\n\t\t\tfalse,\n\t\t\t[\"encrypt\", \"decrypt\"],\n\t\t);\n\t\tthis._ready = true;\n\t}\n\n\t/** Encrypt a message for relay. */\n\tasync encrypt(data: string): Promise<EncryptedPayload> {\n\t\tif (!this._sharedKey) {\n\t\t\tthrow new Error(\"Shared key not derived\");\n\t\t}\n\n\t\tconst iv = crypto.getRandomValues(new Uint8Array(12));\n\t\tconst encoded = new TextEncoder().encode(data);\n\n\t\tconst ciphertext = await crypto.subtle.encrypt(\n\t\t\t{ name: \"AES-GCM\", iv },\n\t\t\tthis._sharedKey,\n\t\t\tencoded,\n\t\t);\n\n\t\treturn {\n\t\t\tiv: btoa(String.fromCharCode(...iv)),\n\t\t\tciphertext: btoa(String.fromCharCode(...new Uint8Array(ciphertext))),\n\t\t};\n\t}\n\n\t/** Decrypt a message from relay. */\n\tasync decrypt(encrypted: EncryptedPayload): Promise<string> {\n\t\tif (!this._sharedKey) {\n\t\t\tthrow new Error(\"Shared key not derived\");\n\t\t}\n\n\t\tconst iv = Uint8Array.from(atob(encrypted.iv), (c) => c.charCodeAt(0));\n\t\tconst ciphertext = Uint8Array.from(atob(encrypted.ciphertext), (c) => c.charCodeAt(0));\n\n\t\tconst decrypted = await crypto.subtle.decrypt(\n\t\t\t{ name: \"AES-GCM\", iv },\n\t\t\tthis._sharedKey,\n\t\t\tciphertext,\n\t\t);\n\n\t\treturn new TextDecoder().decode(decrypted);\n\t}\n\n\t/** Reset encryption state. */\n\tclear(): void {\n\t\tthis._keyPair = null;\n\t\tthis._sharedKey = null;\n\t\tthis._ready = false;\n\t}\n}\n","/**\n * Callback signature for topic message handlers.\n * @param data The payload received on this topic.\n * @param peerId The ID of the peer that sent the message.\n */\nexport type TopicHandler = (data: unknown, peerId: string) => void;\n\n/**\n * Marker interface for messages that carry topic metadata.\n * When a topic is specified the original payload is wrapped in this envelope\n * so the receiver can extract and route it.\n */\nexport interface TopicEnvelope {\n\treadonly __topic: string;\n\treadonly __data: unknown;\n\t/** If true, `__data` is base64-encoded bytes — receivers must decode before use. */\n\treadonly __binary?: boolean;\n}\n\n/** Type-guard: does `value` look like a topic-wrapped envelope? */\nexport function isTopicEnvelope(value: unknown): value is TopicEnvelope {\n\treturn (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"__topic\" in value &&\n\t\ttypeof (value as Record<string, unknown>).__topic === \"string\" &&\n\t\t\"__data\" in value\n\t);\n}\n\n/**\n * Manages per-topic subscriptions and dispatches incoming messages\n * to the matching handlers.\n *\n * Designed for use inside Room and HybridConnection so that\n * callers can filter messages by topic without manual switching logic.\n */\nexport class TopicManager {\n\tprivate readonly _handlers = new Map<string, Set<TopicHandler>>();\n\tprivate readonly _globalHandlers = new Set<TopicHandler>();\n\n\t/** Subscribe to a specific topic. Returns an unsubscribe function. */\n\tsubscribe(topic: string, handler: TopicHandler): () => void {\n\t\tif (!this._handlers.has(topic)) {\n\t\t\tthis._handlers.set(topic, new Set());\n\t\t}\n\t\tthis._handlers.get(topic)!.add(handler);\n\n\t\treturn () => {\n\t\t\tthis._handlers.get(topic)?.delete(handler);\n\t\t};\n\t}\n\n\t/** Subscribe to ALL topics (including un-topiced messages). Returns an unsubscribe function. */\n\tsubscribeAll(handler: TopicHandler): () => void {\n\t\tthis._globalHandlers.add(handler);\n\n\t\treturn () => {\n\t\t\tthis._globalHandlers.delete(handler);\n\t\t};\n\t}\n\n\t/**\n\t * Dispatch a message to the appropriate handlers.\n\t *\n\t * @returns `true` if at least one handler was invoked, `false` otherwise.\n\t */\n\tdispatch(topic: string | undefined, data: unknown, peerId: string): boolean {\n\t\tlet handled = false;\n\n\t\tif (topic !== undefined && this._handlers.has(topic)) {\n\t\t\tfor (const handler of this._handlers.get(topic)!) {\n\t\t\t\thandler(data, peerId);\n\t\t\t\thandled = true;\n\t\t\t}\n\t\t}\n\n\t\tfor (const handler of this._globalHandlers) {\n\t\t\thandler(data, peerId);\n\t\t\thandled = true;\n\t\t}\n\n\t\treturn handled;\n\t}\n\n\t/** Remove all subscriptions. */\n\tclear(): void {\n\t\tthis._handlers.clear();\n\t\tthis._globalHandlers.clear();\n\t}\n}\n","import { BaseConnection, type BaseConnectionEvents } from \"./baseconnection\";\nimport type { Dendri } from \"./dendri\";\nimport { ConnectionType, ServerMessageType } from \"./enums\";\nimport logger from \"./logger\";\nimport { Negotiator } from \"./negotiator\";\nimport type { AnswerOption } from \"./optionInterfaces\";\nimport type { ServerMessage } from \"./servermessage\";\nimport { util } from \"./util\";\n\nexport interface MediaConnectionEvents extends BaseConnectionEvents<never> {\n\t/**\n\t * Emitted when a connection to the Dendri server is established.\n\t *\n\t * ```ts\n\t * mediaConnection.on('stream', (stream) => { ... });\n\t * ```\n\t */\n\tstream: (stream: MediaStream) => void;\n\t/**\n\t * Emitted when the auxiliary data channel is established.\n\t * After this event, hanging up will close the connection cleanly on the remote peer.\n\t * @beta\n\t */\n\twillCloseOnRemote: () => void;\n}\n\n/**\n * Wraps WebRTC's media streams.\n * To get one, use {@apilink Dendri.call} or listen for the {@apilink DendriEvents | `call`} event.\n */\nexport class MediaConnection extends BaseConnection<MediaConnectionEvents> {\n\tprivate static readonly ID_PREFIX = \"mc_\";\n\tdeclare readonly label: string;\n\n\tprivate _negotiator: Negotiator<MediaConnectionEvents, this> | null;\n\tprivate _localStream: MediaStream | null | undefined;\n\tprivate _remoteStream: MediaStream | null = null;\n\n\t/**\n\t * For media connections, this is always 'media'.\n\t */\n\tget type() {\n\t\treturn ConnectionType.Media;\n\t}\n\n\tget localStream(): MediaStream | null | undefined {\n\t\treturn this._localStream;\n\t}\n\n\tget remoteStream(): MediaStream | null {\n\t\treturn this._remoteStream;\n\t}\n\n\tconstructor(peerId: string, provider: Dendri, options: any) {\n\t\tsuper(peerId, provider, options);\n\n\t\tthis._localStream = this.options._stream;\n\t\tthis.connectionId = this.options.connectionId || MediaConnection.ID_PREFIX + util.randomToken();\n\n\t\tthis._negotiator = new Negotiator(this);\n\n\t\tif (this._localStream) {\n\t\t\tthis._negotiator.startConnection({\n\t\t\t\t_stream: this._localStream,\n\t\t\t\toriginator: true,\n\t\t\t});\n\t\t}\n\t}\n\n\t/** Called by the Negotiator when the DataChannel is ready. */\n\toverride _initializeDataChannel(dc: RTCDataChannel): void {\n\t\tthis.dataChannel = dc;\n\n\t\tthis.dataChannel.onopen = () => {\n\t\t\tlogger.log(`DC#${this.connectionId} dc connection success`);\n\t\t\tthis.emit(\"willCloseOnRemote\");\n\t\t};\n\n\t\tthis.dataChannel.onclose = () => {\n\t\t\tlogger.log(`DC#${this.connectionId} dc closed for:`, this.peer);\n\t\t\tthis.close();\n\t\t};\n\t}\n\taddStream(remoteStream: MediaStream) {\n\t\tlogger.log(\"Receiving stream\", remoteStream);\n\n\t\tthis._remoteStream = remoteStream;\n\t\tsuper.emit(\"stream\", remoteStream); // Should we call this `open`?\n\t}\n\n\t/**\n\t * @internal\n\t */\n\thandleMessage(message: ServerMessage): void {\n\t\tconst type = message.type;\n\t\tconst payload = message.payload;\n\n\t\tswitch (message.type) {\n\t\t\tcase ServerMessageType.Answer:\n\t\t\t\t// Forward to negotiator\n\t\t\t\tif (this._negotiator) {\n\t\t\t\t\tvoid this._negotiator.handleSDP(type, payload.sdp).then(() => {\n\t\t\t\t\t\t// Defer _open until handleSDP resolves\n\t\t\t\t\t\tthis._open = true;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Candidate:\n\t\t\t\tif (this._negotiator) {\n\t\t\t\t\tvoid this._negotiator.handleCandidate(payload.candidate);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tlogger.warn(`Unrecognized message type:${type} from peer:${this.peer}`);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/**\n * When receiving a {@apilink DendriEvents | `call`} event on a peer, you can call\n * `answer` on the media connection provided by the callback to accept the call\n * and optionally send your own media stream.\n\n *\n * @param stream A WebRTC media stream.\n * @param options\n * @returns\n */\n\tanswer(stream?: MediaStream, options: AnswerOption = {}): void {\n\t\tif (this._localStream) {\n\t\t\tlogger.warn(\n\t\t\t\t\"Local stream already exists on this MediaConnection. Are you answering a call twice?\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._negotiator || !this.provider) {\n\t\t\tlogger.warn(\"Cannot answer a connection that has already been closed.\");\n\t\t\treturn;\n\t\t}\n\n\t\tthis._localStream = stream ?? null;\n\n\t\tif (options?.sdpTransform) {\n\t\t\tthis.options.sdpTransform = options.sdpTransform;\n\t\t}\n\n\t\tthis._negotiator.startConnection({\n\t\t\t...this.options._payload,\n\t\t\t_stream: stream,\n\t\t});\n\t\t// Retrieve lost messages stored because PeerConnection not set up.\n\t\tconst messages = this.provider._getMessages(this.connectionId);\n\n\t\tfor (const message of messages) {\n\t\t\tthis.handleMessage(message);\n\t\t}\n\n\t\tthis._open = true;\n\t}\n\n\t/**\n\t * Exposed functionality for users.\n\t */\n\n\t/**\n\t * Closes the media connection.\n\t */\n\tclose(): void {\n\t\tif (this._negotiator) {\n\t\t\tthis._negotiator.cleanup();\n\t\t\tthis._negotiator = null;\n\t\t}\n\n\t\tthis._localStream = null;\n\t\tthis._remoteStream = null;\n\n\t\tif (this.provider) {\n\t\t\tthis.provider._removeConnection(this);\n\n\t\t\tthis.provider = null;\n\t\t}\n\n\t\tif (this.options?._stream) {\n\t\t\tthis.options._stream = null;\n\t\t}\n\n\t\tif (!this.open) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._open = false;\n\n\t\tsuper.emit(\"close\");\n\t\tthis.removeAllListeners();\n\t}\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport { SocketEventType } from \"./enums\";\n\n/**\n * Events emitted by all signaling transports.\n */\nexport interface TransportEvents {\n\t[SocketEventType.Message]: (data: any) => void;\n\t[SocketEventType.Disconnected]: () => void;\n\t[SocketEventType.Error]: (error: string) => void;\n\t[SocketEventType.Reconnected]: () => void;\n\t[SocketEventType.ReconnectAttempt]: (attempt: number) => void;\n}\n\n/**\n * Abstract signaling transport. WebSocket, SSE+POST, and Long Polling\n * all implement this interface so the Dendri class is transport-agnostic.\n */\nexport abstract class SignalingTransport extends EventEmitter<TransportEvents> {\n\tabstract start(id: string, token: string): void;\n\tabstract send(data: any): void;\n\tabstract close(): void;\n\tabstract get reconnectAttempt(): number;\n}\n","import { ServerMessageType, SocketEventType } from \"./enums\";\nimport logger from \"./logger\";\nimport { SignalingTransport } from \"./transport\";\n\n/**\n * HTTP Long Polling transport — works through any network that allows HTTPS.\n * Client->Server: POST\n * Server->Client: GET (held open until data available or timeout)\n */\nexport class PollingTransport extends SignalingTransport {\n\tprivate _connected = false;\n\tprivate _disconnected = true;\n\tprivate _id?: string;\n\tprivate _token?: string;\n\tprivate _messagesQueue: Array<object> = [];\n\tprivate _polling = false;\n\tprivate _autoReconnect = true;\n\tprivate _reconnectAttempt = 0;\n\tprivate _reconnectTimer?: ReturnType<typeof setTimeout>;\n\tprivate _heartbeatTimer?: ReturnType<typeof setInterval>;\n\tprivate _lastSeq = 0;\n\tprivate _baseUrl: string;\n\tprivate readonly _pingInterval: number;\n\tprivate _abortController?: AbortController;\n\n\t/** Backoff schedule base delays in milliseconds. */\n\tprivate static readonly BACKOFF_SCHEDULE = [0, 1000, 2000, 4000, 8000, 16000, 30000];\n\n\t/** Random jitter range in milliseconds (applied as +/-). */\n\tprivate static readonly BACKOFF_JITTER = 500;\n\n\tconstructor(\n\t\tsecure: boolean,\n\t\thost: string,\n\t\tport: number,\n\t\tpath: string,\n\t\t_key: string,\n\t\tpingInterval: number = 5000,\n\t\t_jwt?: string,\n\t) {\n\t\tsuper();\n\t\tconst protocol = secure ? \"https://\" : \"http://\";\n\t\tthis._baseUrl = `${protocol + host}:${port}${path}`;\n\t\tthis._pingInterval = pingInterval;\n\t}\n\n\tget reconnectAttempt(): number {\n\t\treturn this._reconnectAttempt;\n\t}\n\n\tstart(id: string, token: string): void {\n\t\tthis._id = id;\n\t\tthis._token = token;\n\t\tthis._disconnected = false;\n\t\tthis._connected = true;\n\t\tthis._reconnectAttempt = 0;\n\t\t// _startPolling is async; ensure a pre-loop rejection lands in the\n\t\t// reconnect path instead of becoming an unhandled promise rejection.\n\t\tthis._startPolling().catch((err) => {\n\t\t\tlogger.error(\"Polling start failed:\", err);\n\t\t\tif (!this._disconnected && this._autoReconnect) this._scheduleReconnect();\n\t\t});\n\t\tthis._startHeartbeat();\n\t\tthis._sendQueuedMessages();\n\t}\n\n\tprivate async _startPolling(): Promise<void> {\n\t\tif (this._polling || this._disconnected) return;\n\t\tthis._polling = true;\n\n\t\twhile (this._polling && !this._disconnected) {\n\t\t\ttry {\n\t\t\t\tthis._abortController = new AbortController();\n\t\t\t\tconst params = new URLSearchParams({\n\t\t\t\t\tid: this._id!,\n\t\t\t\t\ttoken: this._token!,\n\t\t\t\t});\n\t\t\t\tif (this._lastSeq > 0) params.set(\"last_seq\", String(this._lastSeq));\n\n\t\t\t\tconst response = await fetch(`${this._baseUrl}http/poll?${params}`, {\n\t\t\t\t\tsignal: this._abortController.signal,\n\t\t\t\t});\n\n\t\t\t\tif (!response.ok) throw new Error(`Poll failed: ${response.status}`);\n\n\t\t\t\tconst messages: any[] = await response.json();\n\t\t\t\tfor (const msg of messages) {\n\t\t\t\t\t// Truthiness check would drop seq=0; tracking it is required\n\t\t\t\t\t// so reconnect resumes from the correct replay cursor.\n\t\t\t\t\tif (typeof msg.seq === \"number\") this._lastSeq = msg.seq;\n\t\t\t\t\tthis.emit(SocketEventType.Message, msg);\n\t\t\t\t}\n\t\t\t} catch (error: unknown) {\n\t\t\t\tif ((error as { name?: string })?.name === \"AbortError\") break;\n\t\t\t\tlogger.error(\"Poll error:\", error);\n\t\t\t\tawait new Promise((r) => setTimeout(r, 1000)); // Brief pause before retry\n\t\t\t}\n\t\t}\n\n\t\tthis._polling = false;\n\t\tif (!this._disconnected && this._autoReconnect) {\n\t\t\tthis._scheduleReconnect();\n\t\t}\n\t}\n\n\tsend(data: any): void {\n\t\tif (this._disconnected) return;\n\n\t\tif (!this._id || !this._connected) {\n\t\t\tthis._messagesQueue.push(data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!data.type) {\n\t\t\tthis.emit(SocketEventType.Error, \"Invalid message\");\n\t\t\treturn;\n\t\t}\n\n\t\tthis._postMessage(data);\n\t}\n\n\tprivate async _postMessage(data: any): Promise<void> {\n\t\tconst params = new URLSearchParams({\n\t\t\tid: this._id!,\n\t\t\ttoken: this._token!,\n\t\t});\n\n\t\ttry {\n\t\t\tawait fetch(`${this._baseUrl}http/send?${params}`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify(data),\n\t\t\t});\n\t\t} catch {\n\t\t\tthis._messagesQueue.push(data);\n\t\t}\n\t}\n\n\tclose(): void {\n\t\tthis._autoReconnect = false;\n\t\tthis._cleanup();\n\t\tthis._disconnected = true;\n\t}\n\n\t/** Compute the backoff delay (with jitter) for the current attempt. */\n\tprivate _getReconnectDelay(): number {\n\t\tconst schedule = PollingTransport.BACKOFF_SCHEDULE;\n\t\tconst idx = Math.min(this._reconnectAttempt, schedule.length - 1);\n\t\tconst base = schedule[idx];\n\t\tconst jitter =\n\t\t\tMath.random() * PollingTransport.BACKOFF_JITTER * 2 - PollingTransport.BACKOFF_JITTER;\n\t\treturn Math.max(0, base + jitter);\n\t}\n\n\tprivate _scheduleReconnect(): void {\n\t\tthis._reconnectAttempt++;\n\t\tthis.emit(SocketEventType.ReconnectAttempt, this._reconnectAttempt);\n\t\tconst delay = this._getReconnectDelay();\n\t\tthis._reconnectTimer = setTimeout(\n\t\t\t() => {\n\t\t\t\tthis._startPolling().catch((err) => {\n\t\t\t\t\tlogger.error(\"Polling reconnect failed:\", err);\n\t\t\t\t\tif (!this._disconnected && this._autoReconnect) this._scheduleReconnect();\n\t\t\t\t});\n\t\t\t},\n\t\t\tMath.max(0, delay),\n\t\t);\n\t}\n\n\tprivate _startHeartbeat(): void {\n\t\tthis._heartbeatTimer = setInterval(() => {\n\t\t\tif (this._connected) {\n\t\t\t\tthis._postMessage({ type: ServerMessageType.Heartbeat });\n\t\t\t}\n\t\t}, this._pingInterval);\n\t}\n\n\tprivate _sendQueuedMessages(): void {\n\t\tconst queue = [...this._messagesQueue];\n\t\tthis._messagesQueue = [];\n\t\tfor (const msg of queue) {\n\t\t\tthis.send(msg);\n\t\t}\n\t}\n\n\tprivate _cleanup(): void {\n\t\tthis._polling = false;\n\t\tthis._abortController?.abort();\n\t\tthis._abortController = undefined;\n\t\tclearTimeout(this._reconnectTimer);\n\t\tthis._reconnectTimer = undefined;\n\t\tclearInterval(this._heartbeatTimer);\n\t\tthis._heartbeatTimer = undefined;\n\t\tthis._connected = false;\n\t}\n}\n","import { ServerMessageType, SocketEventType } from \"./enums\";\nimport logger from \"./logger\";\nimport { SignalingTransport } from \"./transport\";\n\ndeclare const __VERSION__: string;\nconst version = __VERSION__;\n\n/**\n * An abstraction on top of WebSockets to provide fastest\n * possible connection for peers.\n */\nexport class Socket extends SignalingTransport {\n\tprivate _disconnected: boolean = true;\n\tprivate _id?: string;\n\tprivate _messagesQueue: Array<object> = [];\n\tprivate _socket?: WebSocket;\n\tprivate _wsPingTimer?: any;\n\tprivate _heartbeatWorker: Worker | null = null;\n\tprivate _heartbeatWorkerUrl: string | undefined = undefined;\n\tprivate _visibilityHandler?: () => void;\n\tprivate readonly _baseUrl: string;\n\n\t/** When true, unexpected closes trigger automatic reconnection (enabled by default). */\n\tprivate _autoReconnect: boolean = true;\n\n\t/** Tracks the last server-assigned sequence number for replay on reconnect. */\n\tprivate _lastSeq: number = 0;\n\n\t/** Current reconnect attempt counter (reset on successful connection). */\n\tprivate _reconnectAttempt: number = 0;\n\n\t/** Timer handle for the pending reconnect delay. */\n\tprivate _reconnectTimer?: ReturnType<typeof setTimeout>;\n\n\t/** Saved token for reconnection. */\n\tprivate _token?: string;\n\n\t/** Optional JWT for authenticated connections. */\n\tprivate readonly _jwt?: string;\n\n\t/** Backoff schedule base delays in milliseconds. */\n\tprivate static readonly BACKOFF_SCHEDULE = [0, 1000, 2000, 4000, 8000, 16000, 30000];\n\n\t/** Random jitter range in milliseconds (applied as +/-). */\n\tprivate static readonly BACKOFF_JITTER = 500;\n\n\tconstructor(\n\t\tsecure: boolean,\n\t\thost: string,\n\t\tport: number,\n\t\tpath: string,\n\t\tkey: string,\n\t\tprivate readonly pingInterval: number = 5000,\n\t\tjwt?: string,\n\t) {\n\t\tsuper();\n\n\t\tconst wsProtocol = secure ? \"wss://\" : \"ws://\";\n\n\t\tthis._baseUrl = `${wsProtocol + host}:${port}${path}dendri?key=${key}`;\n\t\tthis._jwt = jwt;\n\t}\n\n\tstart(id: string, token: string): void {\n\t\tthis._id = id;\n\t\tthis._token = token;\n\n\t\tlet wsUrl = `${this._baseUrl}&id=${id}&token=${token}`;\n\t\tif (this._jwt) {\n\t\t\twsUrl += `&jwt=${encodeURIComponent(this._jwt)}`;\n\t\t}\n\n\t\tif (!!this._socket || !this._disconnected) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._socket = new WebSocket(`${wsUrl}&version=${version}`);\n\t\tthis._disconnected = false;\n\n\t\tthis._socket.onmessage = (event) => {\n\t\t\tlet data: unknown;\n\n\t\t\ttry {\n\t\t\t\tdata = JSON.parse(event.data);\n\t\t\t\tlogger.log(\"Server message received:\", data);\n\t\t\t} catch (_e) {\n\t\t\t\tlogger.log(\"Invalid server message\", event.data);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Track server-assigned sequence numbers for replay on reconnect.\n\t\t\tif (\n\t\t\t\tdata !== null &&\n\t\t\t\ttypeof data === \"object\" &&\n\t\t\t\t\"seq\" in data &&\n\t\t\t\ttypeof (data as { seq: unknown }).seq === \"number\"\n\t\t\t) {\n\t\t\t\tthis._lastSeq = (data as { seq: number }).seq;\n\t\t\t}\n\n\t\t\tthis.emit(SocketEventType.Message, data);\n\t\t};\n\n\t\tthis._socket.onclose = (event) => {\n\t\t\tif (this._disconnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger.log(\"Socket closed.\", event);\n\n\t\t\tthis._cleanup();\n\t\t\tthis._disconnected = true;\n\n\t\t\tif (this._autoReconnect && this._id && this._token) {\n\t\t\t\tthis._scheduleReconnect();\n\t\t\t} else {\n\t\t\t\tthis.emit(SocketEventType.Disconnected);\n\t\t\t}\n\t\t};\n\n\t\tthis._socket.onerror = (event) => {\n\t\t\tlogger.error(\"Socket error:\", event);\n\t\t\t// WebSocket errors are always followed by a close event which handles\n\t\t\t// cleanup and reconnection. We just log here to surface the error.\n\t\t};\n\n\t\t// Take care of the queue of connections if necessary and make sure Peer knows\n\t\t// socket is open.\n\t\tthis._socket.onopen = () => {\n\t\t\tif (this._disconnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst wasReconnecting = this._reconnectAttempt > 0;\n\n\t\t\t// Successful connection — reset backoff counter.\n\t\t\tthis._reconnectAttempt = 0;\n\n\t\t\tthis._sendQueuedMessages();\n\n\t\t\tlogger.log(\"Socket open\");\n\n\t\t\tthis._createHeartbeatWorker();\n\t\t\tthis._startWorkerHeartbeat();\n\n\t\t\tif (wasReconnecting) {\n\t\t\t\tthis.emit(SocketEventType.Reconnected);\n\t\t\t}\n\t\t};\n\n\t\tif (typeof document !== \"undefined\") {\n\t\t\tthis._visibilityHandler = () => {\n\t\t\t\tif (document.visibilityState === \"hidden\") {\n\t\t\t\t\t// Pause heartbeat when tab is backgrounded\n\t\t\t\t\tclearTimeout(this._wsPingTimer!);\n\t\t\t\t} else {\n\t\t\t\t\t// Tab is visible again — check connection and resume\n\t\t\t\t\tif (this._wsOpen()) {\n\t\t\t\t\t\tthis._sendHeartbeat();\n\t\t\t\t\t} else if (this._autoReconnect && !this._disconnected) {\n\t\t\t\t\t\tthis._scheduleReconnect();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tdocument.addEventListener(\"visibilitychange\", this._visibilityHandler);\n\t\t}\n\t}\n\n\t/** Compute the backoff delay (with jitter) for the current attempt. */\n\tprivate _getReconnectDelay(): number {\n\t\tconst schedule = Socket.BACKOFF_SCHEDULE;\n\t\tconst idx = Math.min(this._reconnectAttempt, schedule.length - 1);\n\t\tconst base = schedule[idx];\n\t\tconst jitter = Math.random() * Socket.BACKOFF_JITTER * 2 - Socket.BACKOFF_JITTER;\n\t\treturn Math.max(0, base + jitter);\n\t}\n\n\t/** Current reconnect attempt number (read-only for external inspection). */\n\tget reconnectAttempt(): number {\n\t\treturn this._reconnectAttempt;\n\t}\n\n\t/** Schedule a reconnection attempt with exponential backoff + jitter. */\n\tprivate _scheduleReconnect(): void {\n\t\tconst delay = this._getReconnectDelay();\n\t\tthis._reconnectAttempt++;\n\n\t\tthis.emit(SocketEventType.ReconnectAttempt, this._reconnectAttempt);\n\n\t\tlogger.log(`Scheduling reconnect attempt ${this._reconnectAttempt} in ${Math.round(delay)}ms`);\n\n\t\tthis._reconnectTimer = setTimeout(() => {\n\t\t\tthis._reconnectTimer = undefined;\n\n\t\t\tif (!this._autoReconnect || !this._id || !this._token) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Build URL with last_seq for server-side replay.\n\t\t\tlet wsUrl = `${this._baseUrl}&id=${this._id}&token=${this._token}&version=${version}&last_seq=${this._lastSeq}`;\n\t\t\tif (this._jwt) {\n\t\t\t\twsUrl += `&jwt=${encodeURIComponent(this._jwt)}`;\n\t\t\t}\n\n\t\t\tthis._disconnected = false;\n\t\t\tthis._socket = new WebSocket(wsUrl);\n\n\t\t\tthis._socket.onmessage = (event) => {\n\t\t\t\tlet data: unknown;\n\n\t\t\t\ttry {\n\t\t\t\t\tdata = JSON.parse(event.data);\n\t\t\t\t\tlogger.log(\"Server message received:\", data);\n\t\t\t\t} catch (_e) {\n\t\t\t\t\tlogger.log(\"Invalid server message\", event.data);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\tdata !== null &&\n\t\t\t\t\ttypeof data === \"object\" &&\n\t\t\t\t\t\"seq\" in data &&\n\t\t\t\t\ttypeof (data as { seq: unknown }).seq === \"number\"\n\t\t\t\t) {\n\t\t\t\t\tthis._lastSeq = (data as { seq: number }).seq;\n\t\t\t\t}\n\n\t\t\t\tthis.emit(SocketEventType.Message, data);\n\t\t\t};\n\n\t\t\tthis._socket.onclose = (event) => {\n\t\t\t\tif (this._disconnected) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tlogger.log(\"Socket closed during reconnect.\", event);\n\n\t\t\t\tthis._cleanup();\n\t\t\t\tthis._disconnected = true;\n\n\t\t\t\tif (this._autoReconnect && this._id && this._token) {\n\t\t\t\t\tthis._scheduleReconnect();\n\t\t\t\t} else {\n\t\t\t\t\tthis.emit(SocketEventType.Disconnected);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis._socket.onerror = (event) => {\n\t\t\t\tlogger.error(\"Socket error during reconnect:\", event);\n\t\t\t};\n\n\t\t\tthis._socket.onopen = () => {\n\t\t\t\tif (this._disconnected) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Successful reconnection — reset backoff counter.\n\t\t\t\tthis._reconnectAttempt = 0;\n\n\t\t\t\tthis._sendQueuedMessages();\n\n\t\t\t\tlogger.log(\"Socket reconnected\");\n\n\t\t\t\tthis._createHeartbeatWorker();\n\t\t\t\tthis._startWorkerHeartbeat();\n\n\t\t\t\tthis.emit(SocketEventType.Reconnected);\n\t\t\t};\n\t\t}, delay);\n\t}\n\n\tprivate _createHeartbeatWorker(): void {\n\t\tif (typeof Worker === \"undefined\" || typeof Blob === \"undefined\") return;\n\n\t\ttry {\n\t\t\t// Inline Web Worker for heartbeat — immune to tab throttling\n\t\t\tconst workerCode = `\n\t\t\t\tlet interval = null;\n\t\t\t\tself.onmessage = function(e) {\n\t\t\t\t\tif (e.data.type === 'start') {\n\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t\tinterval = setInterval(() => self.postMessage('heartbeat'), e.data.interval);\n\t\t\t\t\t} else if (e.data.type === 'stop') {\n\t\t\t\t\t\tclearInterval(interval);\n\t\t\t\t\t\tinterval = null;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t`;\n\t\t\tconst blob = new Blob([workerCode], { type: \"application/javascript\" });\n\t\t\tconst blobUrl = URL.createObjectURL(blob);\n\t\t\tthis._heartbeatWorker = new Worker(blobUrl);\n\t\t\tthis._heartbeatWorkerUrl = blobUrl;\n\t\t\tthis._heartbeatWorker.onmessage = () => {\n\t\t\t\tthis._sendHeartbeat();\n\t\t\t};\n\t\t} catch {\n\t\t\t// Workers not available — fall back to setTimeout (existing behavior)\n\t\t}\n\t}\n\n\tprivate _startWorkerHeartbeat(): void {\n\t\tif (this._heartbeatWorker) {\n\t\t\tthis._heartbeatWorker.postMessage({ type: \"start\", interval: this.pingInterval });\n\t\t} else {\n\t\t\t// Fallback to setTimeout\n\t\t\tthis._scheduleHeartbeat();\n\t\t}\n\t}\n\n\tprivate _stopWorkerHeartbeat(): void {\n\t\tif (this._heartbeatWorker) {\n\t\t\tthis._heartbeatWorker.postMessage({ type: \"stop\" });\n\t\t}\n\t}\n\n\tprivate _scheduleHeartbeat(): void {\n\t\tthis._wsPingTimer = setTimeout(() => {\n\t\t\tthis._sendHeartbeat();\n\t\t}, this.pingInterval);\n\t}\n\n\tprivate _sendHeartbeat(): void {\n\t\tif (!this._wsOpen()) {\n\t\t\tlogger.log(`Cannot send heartbeat, because socket closed`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst message = JSON.stringify({ type: ServerMessageType.Heartbeat });\n\n\t\tthis._socket?.send(message);\n\n\t\t// When using the Web Worker heartbeat, the worker drives the interval.\n\t\t// Only fall back to setTimeout-based scheduling when no worker is present.\n\t\tif (!this._heartbeatWorker) {\n\t\t\tthis._scheduleHeartbeat();\n\t\t}\n\t}\n\n\t/** Is the websocket currently open? */\n\tprivate _wsOpen(): boolean {\n\t\treturn !!this._socket && this._socket.readyState === 1;\n\t}\n\n\t/** Send queued messages. */\n\tprivate _sendQueuedMessages(): void {\n\t\t//Create copy of queue and clear it,\n\t\t//because send method push the message back to queue if smth will go wrong\n\t\tconst copiedQueue = [...this._messagesQueue];\n\t\tthis._messagesQueue = [];\n\n\t\tfor (const message of copiedQueue) {\n\t\t\tthis.send(message);\n\t\t}\n\t}\n\n\t/** Exposed send for DC & Peer. */\n\tsend(data: any): void {\n\t\tif (this._disconnected) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If we didn't get an ID yet, we can't yet send anything so we should queue\n\t\t// up these messages.\n\t\tif (!this._id) {\n\t\t\tthis._messagesQueue.push(data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!data.type) {\n\t\t\tthis.emit(SocketEventType.Error, \"Invalid message\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._wsOpen()) {\n\t\t\tthis._messagesQueue.push(data);\n\t\t\treturn;\n\t\t}\n\n\t\tconst message = JSON.stringify(data);\n\n\t\tthis._socket?.send(message);\n\t}\n\n\tclose(): void {\n\t\tif (this._disconnected) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Explicit close — disable auto-reconnect so we don't retry.\n\t\tthis._autoReconnect = false;\n\n\t\tthis._cleanup();\n\n\t\tthis._disconnected = true;\n\t}\n\n\tprivate _cleanup(): void {\n\t\tif (this._socket) {\n\t\t\tthis._socket.onopen =\n\t\t\t\tthis._socket.onmessage =\n\t\t\t\tthis._socket.onclose =\n\t\t\t\tthis._socket.onerror =\n\t\t\t\t\tnull;\n\t\t\tthis._socket.close();\n\t\t\tthis._socket = undefined;\n\t\t}\n\n\t\tclearTimeout(this._wsPingTimer!);\n\n\t\tthis._stopWorkerHeartbeat();\n\t\tif (this._heartbeatWorker) {\n\t\t\tthis._heartbeatWorker.terminate();\n\t\t\tthis._heartbeatWorker = null;\n\t\t}\n\t\tif (this._heartbeatWorkerUrl) {\n\t\t\t// Revoke the blob URL that `_createHeartbeatWorker` created so\n\t\t\t// each reconnect doesn't permanently leak a blob URL.\n\t\t\tURL.revokeObjectURL(this._heartbeatWorkerUrl);\n\t\t\tthis._heartbeatWorkerUrl = undefined;\n\t\t}\n\n\t\tif (this._visibilityHandler && typeof document !== \"undefined\") {\n\t\t\tdocument.removeEventListener(\"visibilitychange\", this._visibilityHandler);\n\t\t\tthis._visibilityHandler = undefined;\n\t\t}\n\n\t\tif (this._reconnectTimer !== undefined) {\n\t\t\tclearTimeout(this._reconnectTimer);\n\t\t\tthis._reconnectTimer = undefined;\n\t\t}\n\t}\n}\n","import { ServerMessageType, SocketEventType } from \"./enums\";\nimport logger from \"./logger\";\nimport { SignalingTransport } from \"./transport\";\n\n/**\n * SSE + POST transport for environments where WebSocket is blocked.\n * Server->Client: Server-Sent Events (fetch-based, supports custom headers)\n * Client->Server: HTTP POST requests\n */\nexport class SSETransport extends SignalingTransport {\n\tprivate _connected = false;\n\tprivate _disconnected = true;\n\tprivate _id?: string;\n\tprivate _token?: string;\n\tprivate _messagesQueue: Array<object> = [];\n\tprivate _abortController?: AbortController;\n\tprivate _autoReconnect = true;\n\tprivate _reconnectAttempt = 0;\n\tprivate _reconnectTimer?: ReturnType<typeof setTimeout>;\n\tprivate _heartbeatTimer?: ReturnType<typeof setInterval>;\n\tprivate _lastSeq = 0;\n\tprivate _baseUrl: string;\n\tprivate _jwt?: string;\n\tprivate readonly _pingInterval: number;\n\n\t/** Backoff schedule base delays in milliseconds. */\n\tprivate static readonly BACKOFF_SCHEDULE = [0, 1000, 2000, 4000, 8000, 16000, 30000];\n\n\t/** Random jitter range in milliseconds (applied as +/-). */\n\tprivate static readonly BACKOFF_JITTER = 500;\n\n\tconstructor(\n\t\tsecure: boolean,\n\t\thost: string,\n\t\tport: number,\n\t\tpath: string,\n\t\t_key: string,\n\t\tpingInterval: number = 5000,\n\t\tjwt?: string,\n\t) {\n\t\tsuper();\n\t\tconst protocol = secure ? \"https://\" : \"http://\";\n\t\tthis._baseUrl = `${protocol + host}:${port}${path}`;\n\t\tthis._pingInterval = pingInterval;\n\t\tthis._jwt = jwt;\n\t}\n\n\tget reconnectAttempt(): number {\n\t\treturn this._reconnectAttempt;\n\t}\n\n\tstart(id: string, token: string): void {\n\t\tthis._id = id;\n\t\tthis._token = token;\n\t\tthis._disconnected = false;\n\t\t// _connectSSE is async; a rejection before the inner try/catch (e.g. a\n\t\t// synchronous TypeError from the URL builder) would become an\n\t\t// unhandled rejection. Route any slip-through into _handleDisconnect.\n\t\tthis._connectSSE().catch((err) => {\n\t\t\tlogger.error(\"SSE start failed:\", err);\n\t\t\tthis._handleDisconnect();\n\t\t});\n\t}\n\n\tprivate async _connectSSE(): Promise<void> {\n\t\tif (this._disconnected) return;\n\n\t\tconst params = new URLSearchParams({\n\t\t\tid: this._id!,\n\t\t\ttoken: this._token!,\n\t\t\tkey: \"dendri\",\n\t\t});\n\t\tif (this._jwt) params.set(\"jwt\", this._jwt);\n\t\tif (this._lastSeq > 0) params.set(\"last_seq\", String(this._lastSeq));\n\n\t\tconst url = `${this._baseUrl}http/sse?${params}`;\n\n\t\ttry {\n\t\t\tthis._abortController = new AbortController();\n\n\t\t\tconst response = await fetch(url, {\n\t\t\t\theaders: {\n\t\t\t\t\tAccept: \"text/event-stream\",\n\t\t\t\t\t\"Cache-Control\": \"no-cache\",\n\t\t\t\t},\n\t\t\t\tsignal: this._abortController.signal,\n\t\t\t});\n\n\t\t\tif (!response.ok || !response.body) {\n\t\t\t\tthrow new Error(`SSE connection failed: ${response.status}`);\n\t\t\t}\n\n\t\t\tconst wasReconnecting = this._reconnectAttempt > 0;\n\n\t\t\tthis._connected = true;\n\t\t\tthis._reconnectAttempt = 0;\n\n\t\t\tif (wasReconnecting) {\n\t\t\t\tthis.emit(SocketEventType.Reconnected);\n\t\t\t}\n\n\t\t\t// Start heartbeat via POST\n\t\t\tthis._startHeartbeat();\n\n\t\t\t// Send queued messages\n\t\t\tthis._sendQueuedMessages();\n\n\t\t\t// Read SSE stream\n\t\t\tconst reader = response.body.getReader();\n\t\t\tconst decoder = new TextDecoder();\n\t\t\tlet buffer = \"\";\n\n\t\t\twhile (true) {\n\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\tif (done) break;\n\n\t\t\t\tbuffer += decoder.decode(value, { stream: true });\n\t\t\t\tconst lines = buffer.split(\"\\n\");\n\t\t\t\tbuffer = lines.pop() || \"\";\n\n\t\t\t\tfor (const line of lines) {\n\t\t\t\t\tif (line.startsWith(\"data: \")) {\n\t\t\t\t\t\tconst data = line.slice(6);\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tconst parsed = JSON.parse(data);\n\t\t\t\t\t\t\t// `if (parsed.seq)` is falsy on seq=0. The server's\n\t\t\t\t\t\t\t// seq counter starts from 1 today, but it resets to\n\t\t\t\t\t\t\t// 0 after restart — missing that update would\n\t\t\t\t\t\t\t// desynchronise the replay cursor on reconnect.\n\t\t\t\t\t\t\tif (typeof parsed.seq === \"number\") this._lastSeq = parsed.seq;\n\t\t\t\t\t\t\tlogger.log(\"SSE message received:\", parsed);\n\t\t\t\t\t\t\tthis.emit(SocketEventType.Message, parsed);\n\t\t\t\t\t\t} catch {\n\t\t\t\t\t\t\tlogger.log(\"Invalid SSE message\", data);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Stream ended — connection closed\n\t\t\tthis._handleDisconnect();\n\t\t} catch (error: unknown) {\n\t\t\tif ((error as { name?: string })?.name === \"AbortError\") return; // Intentional close\n\t\t\tlogger.error(\"SSE error:\", error);\n\t\t\tthis._handleDisconnect();\n\t\t}\n\t}\n\n\tsend(data: any): void {\n\t\tif (this._disconnected) return;\n\n\t\tif (!this._id) {\n\t\t\tthis._messagesQueue.push(data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!data.type) {\n\t\t\tthis.emit(SocketEventType.Error, \"Invalid message\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._connected) {\n\t\t\tthis._messagesQueue.push(data);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._postMessage(data);\n\t}\n\n\tprivate async _postMessage(data: any): Promise<void> {\n\t\tconst params = new URLSearchParams({\n\t\t\tid: this._id!,\n\t\t\ttoken: this._token!,\n\t\t});\n\n\t\ttry {\n\t\t\tawait fetch(`${this._baseUrl}http/send?${params}`, {\n\t\t\t\tmethod: \"POST\",\n\t\t\t\theaders: { \"Content-Type\": \"application/json\" },\n\t\t\t\tbody: JSON.stringify(data),\n\t\t\t});\n\t\t} catch (error) {\n\t\t\tlogger.error(\"POST send failed:\", error);\n\t\t\tthis._messagesQueue.push(data);\n\t\t}\n\t}\n\n\tclose(): void {\n\t\tif (this._disconnected) return;\n\t\tthis._autoReconnect = false;\n\t\tthis._cleanup();\n\t\tthis._disconnected = true;\n\t}\n\n\tprivate _handleDisconnect(): void {\n\t\tthis._connected = false;\n\t\tif (this._autoReconnect && !this._disconnected) {\n\t\t\tthis._scheduleReconnect();\n\t\t} else {\n\t\t\tthis._cleanup();\n\t\t\tthis._disconnected = true;\n\t\t\tthis.emit(SocketEventType.Disconnected);\n\t\t}\n\t}\n\n\t/** Compute the backoff delay (with jitter) for the current attempt. */\n\tprivate _getReconnectDelay(): number {\n\t\tconst schedule = SSETransport.BACKOFF_SCHEDULE;\n\t\tconst idx = Math.min(this._reconnectAttempt, schedule.length - 1);\n\t\tconst base = schedule[idx];\n\t\tconst jitter = Math.random() * SSETransport.BACKOFF_JITTER * 2 - SSETransport.BACKOFF_JITTER;\n\t\treturn Math.max(0, base + jitter);\n\t}\n\n\tprivate _scheduleReconnect(): void {\n\t\tthis._reconnectAttempt++;\n\t\tthis.emit(SocketEventType.ReconnectAttempt, this._reconnectAttempt);\n\n\t\tconst delay = this._getReconnectDelay();\n\t\tthis._reconnectTimer = setTimeout(() => {\n\t\t\tthis._connectSSE().catch((err) => {\n\t\t\t\tlogger.error(\"SSE reconnect failed:\", err);\n\t\t\t\tthis._handleDisconnect();\n\t\t\t});\n\t\t}, delay);\n\t}\n\n\tprivate _startHeartbeat(): void {\n\t\tthis._heartbeatTimer = setInterval(() => {\n\t\t\tif (this._connected) {\n\t\t\t\tthis._postMessage({ type: ServerMessageType.Heartbeat });\n\t\t\t}\n\t\t}, this._pingInterval);\n\t}\n\n\tprivate _sendQueuedMessages(): void {\n\t\tconst queue = [...this._messagesQueue];\n\t\tthis._messagesQueue = [];\n\t\tfor (const msg of queue) {\n\t\t\tthis.send(msg);\n\t\t}\n\t}\n\n\tprivate _cleanup(): void {\n\t\tthis._abortController?.abort();\n\t\tthis._abortController = undefined;\n\t\tclearTimeout(this._reconnectTimer);\n\t\tthis._reconnectTimer = undefined;\n\t\tclearInterval(this._heartbeatTimer);\n\t\tthis._heartbeatTimer = undefined;\n\t\tthis._connected = false;\n\t}\n}\n","import { API } from \"./api\";\nimport { BinaryPack } from \"./dataconnection/BufferedConnection/BinaryPack\";\nimport { Json } from \"./dataconnection/BufferedConnection/Json\";\nimport { Raw } from \"./dataconnection/BufferedConnection/Raw\";\nimport type { DataConnection } from \"./dataconnection/DataConnection\";\nimport { type DendriError, EventEmitterWithError } from \"./dendriError\";\nimport {\n\tConnectionState,\n\tConnectionType,\n\tDendriErrorType,\n\tServerMessageType,\n\tSocketEventType,\n\ttype TransportMode,\n} from \"./enums\";\nimport { HybridConnection } from \"./hybridconnection\";\nimport logger, { type LogLevel } from \"./logger\";\nimport { MediaConnection } from \"./mediaconnection\";\nimport type {\n\tCallOption,\n\tDendriConnectOption,\n\tDendriOption,\n\tHybridConnectionOption,\n} from \"./optionInterfaces\";\nimport { PollingTransport } from \"./polling-transport\";\nimport type { ServerMessage } from \"./servermessage\";\nimport { Socket } from \"./socket\";\nimport { SSETransport } from \"./sse-transport\";\nimport type { SignalingTransport } from \"./transport\";\nimport { util } from \"./util\";\n\nclass DendriOptions implements DendriOption {\n\t/**\n\t * Prints log messages depending on the debug level passed in.\n\t */\n\tdebug?: LogLevel;\n\t/**\n\t * Server host for your Dendri signaling server.\n\t * Also accepts `'/'` to signify relative hostname.\n\t */\n\thost!: string;\n\t/**\n\t * Server port. Defaults to `443`.\n\t */\n\tport?: number;\n\t/**\n\t * The path where your self-hosted Dendri server is running. Defaults to `'/'`\n\t */\n\tpath?: string;\n\t/**\n\t * API key for the Dendri server.\n\t * This is not used anymore.\n\t * @deprecated\n\t */\n\tkey?: string;\n\ttoken?: string;\n\t/**\n\t * Configuration hash passed to RTCPeerConnection.\n\t * This hash contains any custom ICE/TURN server configuration.\n\t *\n\t * Defaults to {@apilink util.defaultConfig}\n\t */\n\tconfig?: any;\n\t/**\n\t * Set to true `true` if you're using TLS.\n\t * :::danger\n\t * If possible *always use TLS*\n\t * :::\n\t */\n\tsecure?: boolean;\n\tpingInterval?: number;\n\treferrerPolicy?: ReferrerPolicy;\n\tlogFunction?: (logLevel: LogLevel, ...rest: any[]) => void;\n\tserializers?: SerializerMapping;\n\t/** Auto-fetch TURN credentials from the signaling server's GET /turn endpoint. */\n\tfetchTurnCredentials?: boolean;\n\t/** Optional JWT for authenticated connections. */\n\tjwt?: string;\n\t/** Enable WebSocket relay fallback when WebRTC is unavailable. */\n\tenableRelay?: boolean;\n\t/** Optional function to validate connection metadata before accepting. */\n\tvalidateMetadata?: (metadata: unknown) => boolean;\n\t/** Signaling transport: 'websocket' (default), 'sse', 'polling', or 'auto' (tries WS then SSE then polling) */\n\tsignalingTransport?: \"websocket\" | \"sse\" | \"polling\" | \"auto\";\n}\n\nexport type { DendriOptions };\n\nexport interface SerializerMapping {\n\t[key: string]: new (peerId: string, provider: Dendri, options: any) => DataConnection;\n}\n\nexport interface DendriEvents {\n\t/**\n\t * Emitted when a connection to the Dendri server is established.\n\t *\n\t * You may use the peer before this is emitted, but messages to the server will be queued. <code>id</code> is the brokering ID of the peer (which was either provided in the constructor or assigned by the server).<span class='tip'>You should not wait for this event before connecting to other peers if connection speed is important.</span>\n\t */\n\topen: (id: string) => void;\n\t/**\n\t * Emitted when a new data connection is established from a remote peer.\n\t */\n\tconnection: (dataConnection: DataConnection) => void;\n\t/**\n\t * Emitted when a remote peer attempts to call you.\n\t */\n\tcall: (mediaConnection: MediaConnection) => void;\n\t/**\n\t * Emitted when the peer is destroyed and can no longer accept or create any new connections.\n\t */\n\tclose: () => void;\n\t/**\n\t * Emitted when the peer is disconnected from the signalling server\n\t */\n\tdisconnected: (currentId: string) => void;\n\t/**\n\t * Errors on the peer are almost always fatal and will destroy the peer.\n\t *\n\t * Errors from the underlying socket and PeerConnections are forwarded here.\n\t */\n\terror: (error: DendriError<`${DendriErrorType}`>) => void;\n\t/**\n\t * Emitted when the server sends a ROOM_PEERS message with the current\n\t * list of peers in a room.\n\t */\n\troomPeers: (room: string, peers: string[]) => void;\n\t/**\n\t * Emitted when the connection state machine transitions to a new state.\n\t */\n\tconnectionStateChanged: (state: ConnectionState, previousState: ConnectionState) => void;\n\t/**\n\t * Emitted when a PRESENCE_UPDATE message is received from the server.\n\t */\n\tpresenceUpdate: (peerId: string, room: string, data: unknown) => void;\n\t/**\n\t * Emitted when the underlying signaling socket finishes a successful\n\t * reconnection. Consumers (e.g. Room) should re-send server-side\n\t * state (joinRoom, presence) so it survives server-side state loss\n\t * such as a Durable Object hibernation + wake-up cycle.\n\t */\n\treconnected: () => void;\n}\n/**\n * A peer who can initiate connections with other peers.\n */\nexport class Dendri extends EventEmitterWithError<DendriErrorType, DendriEvents> {\n\tprivate static readonly DEFAULT_KEY = \"dendri\";\n\n\tprotected readonly _serializers: SerializerMapping = {\n\t\traw: Raw,\n\t\tjson: Json,\n\t\tbinary: BinaryPack,\n\t\t\"binary-utf8\": BinaryPack,\n\n\t\tdefault: BinaryPack,\n\t};\n\tprivate readonly _options: DendriOptions;\n\tprivate readonly _api: API;\n\tprivate readonly _socket: SignalingTransport;\n\n\tprivate _id: string | null = null;\n\tprivate _lastServerId: string | null = null;\n\n\t// Connection state machine.\n\tprivate _connectionState: ConnectionState = ConnectionState.Initialized;\n\n\t/** Number of consecutive reconnection failures that triggers the Suspended state. */\n\tprivate static readonly SUSPEND_THRESHOLD = 5;\n\n\tprivate readonly _connections: Map<string, (DataConnection | MediaConnection)[]> = new Map(); // All connections for this peer.\n\tprivate readonly _lostMessages: Map<string, ServerMessage[]> = new Map(); // src => [list of messages]\n\tprivate readonly _lostMessageGeneration: Map<string, number> = new Map();\n\tprivate readonly _hybridConnections: Map<string, HybridConnection> = new Map(); // peer => HybridConnection\n\t/**\n\t * The brokering ID of this peer\n\t *\n\t * If no ID was specified in {@apilink Dendri | the constructor},\n\t * this will be `undefined` until the {@apilink DendriEvents | `open`} event is emitted.\n\t */\n\tget id() {\n\t\treturn this._id;\n\t}\n\n\tget options() {\n\t\treturn this._options;\n\t}\n\n\t/**\n\t * The current connection state of this peer.\n\t */\n\tget connectionState(): ConnectionState {\n\t\treturn this._connectionState;\n\t}\n\n\tget open() {\n\t\treturn this._connectionState === ConnectionState.Connected;\n\t}\n\n\t/**\n\t * @internal\n\t */\n\tget socket() {\n\t\treturn this._socket;\n\t}\n\n\t/**\n\t * A hash of all connections associated with this peer, keyed by the remote peer's ID.\n\t * @deprecated\n\t * Return type will change from Object to Map<string,[]>\n\t */\n\tget connections(): Object {\n\t\tconst plainConnections = Object.create(null);\n\n\t\tfor (const [k, v] of this._connections) {\n\t\t\tplainConnections[k] = [...v];\n\t\t}\n\n\t\treturn plainConnections;\n\t}\n\n\t/**\n\t * true if this peer and all of its connections can no longer be used.\n\t */\n\tget destroyed() {\n\t\treturn (\n\t\t\tthis._connectionState === ConnectionState.Closed ||\n\t\t\tthis._connectionState === ConnectionState.Failed\n\t\t);\n\t}\n\t/**\n\t * false if there is an active connection to the Dendri server.\n\t *\n\t * Also returns true for terminal states (Closed/Failed) to preserve\n\t * backward compatibility: the original boolean was set during\n\t * disconnect() and never cleared by destroy().\n\t */\n\tget disconnected() {\n\t\tconst s = this._connectionState;\n\t\treturn (\n\t\t\ts === ConnectionState.Disconnected ||\n\t\t\ts === ConnectionState.Suspended ||\n\t\t\ts === ConnectionState.Closed ||\n\t\t\ts === ConnectionState.Failed\n\t\t);\n\t}\n\n\t/**\n\t * A peer can connect to other peers and listen for connections.\n\t */\n\tconstructor(options: DendriOptions);\n\n\t/**\n\t * A peer can connect to other peers and listen for connections.\n\t * @param id Other peers can connect to this peer using the provided ID.\n\t * If no ID is given, one will be generated by the brokering server.\n\t * The ID must start and end with an alphanumeric character (lower or upper case character or a digit). In the middle of the ID spaces, dashes (-) and underscores (_) are allowed. Use {@apilink DendriOptions.metadata } to send identifying information.\n\t * @param options for specifying details about Dendri server\n\t */\n\tconstructor(id: string, options?: DendriOptions);\n\n\tconstructor(id?: string | DendriOptions, options?: DendriOptions) {\n\t\tsuper();\n\n\t\tlet userId: string | undefined;\n\t\tlet providedOptions = options;\n\n\t\t// Deal with overloading\n\t\tif (id && typeof id === \"object\" && id.constructor === Object) {\n\t\t\tprovidedOptions = id as DendriOptions;\n\t\t} else if (id) {\n\t\t\tuserId = id.toString();\n\t\t}\n\n\t\t// Configurize options\n\t\tconst normalizedOptions = {\n\t\t\tdebug: 0, // 1: Errors, 2: Warnings, 3: All logs\n\t\t\tport: util.CLOUD_PORT,\n\t\t\tpath: \"/\",\n\t\t\tkey: Dendri.DEFAULT_KEY,\n\t\t\ttoken: util.randomToken(),\n\t\t\tconfig: util.defaultConfig,\n\t\t\treferrerPolicy: \"strict-origin-when-cross-origin\",\n\t\t\tserializers: {},\n\t\t\t...providedOptions,\n\t\t} as DendriOptions;\n\t\tthis._options = normalizedOptions;\n\n\t\tif (typeof this._options.host !== \"string\" || this._options.host.trim() === \"\") {\n\t\t\tthrow new Error(\n\t\t\t\t'Dendri requires a signaling server host. Pass your self-hosted server domain, for example { host: \"signal.example.com\", secure: true }.',\n\t\t\t);\n\t\t}\n\t\tthis._options.host = this._options.host.trim();\n\n\t\tthis._serializers = { ...this._serializers, ...this.options.serializers };\n\n\t\t// Detect relative URL host.\n\t\tif (this._options.host === \"/\") {\n\t\t\tthis._options.host = typeof window !== \"undefined\" ? window.location.hostname : \"localhost\";\n\t\t}\n\n\t\t// Set path correctly.\n\t\tif (this._options.path) {\n\t\t\tif (this._options.path[0] !== \"/\") {\n\t\t\t\tthis._options.path = `/${this._options.path}`;\n\t\t\t}\n\t\t\tif (this._options.path[this._options.path.length - 1] !== \"/\") {\n\t\t\t\tthis._options.path += \"/\";\n\t\t\t}\n\t\t}\n\n\t\t// Set whether we use SSL to same as current host\n\t\tif (this._options.secure === undefined && this._options.host !== util.CLOUD_HOST) {\n\t\t\tthis._options.secure = util.isSecure();\n\t\t} else if (this._options.host === util.CLOUD_HOST) {\n\t\t\tthis._options.secure = true;\n\t\t}\n\t\t// Set a custom log function if present\n\t\tif (this._options.logFunction) {\n\t\t\tlogger.setLogFunction(this._options.logFunction);\n\t\t}\n\n\t\tlogger.logLevel = this._options.debug || 0;\n\n\t\tthis._api = new API(this._options);\n\t\tthis._socket = this._createServerConnection();\n\n\t\t// Sanity checks\n\t\t// Ensure WebRTC supported (or relay-only mode enabled)\n\t\tif (!util.supports.audioVideo && !util.supports.data) {\n\t\t\tif (this._options.enableRelay) {\n\t\t\t\tlogger.warn(\"WebRTC not supported — operating in relay-only mode\");\n\t\t\t} else {\n\t\t\t\tthis._delayedAbort(\n\t\t\t\t\tDendriErrorType.BrowserIncompatible,\n\t\t\t\t\t\"The current browser does not support WebRTC\",\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\n\t\t// Ensure alphanumeric id\n\t\tif (!!userId && !util.validateId(userId)) {\n\t\t\tthis._delayedAbort(DendriErrorType.InvalidID, `ID \"${userId}\" is invalid`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (userId) {\n\t\t\tthis._initialize(userId);\n\t\t} else {\n\t\t\tthis._api\n\t\t\t\t.retrieveId()\n\t\t\t\t.then((id) => this._initialize(id))\n\t\t\t\t.catch((error) => this._abort(DendriErrorType.ServerError, error, true));\n\t\t}\n\t}\n\n\t/**\n\t * Transition to a new connection state. Invalid transitions are logged and ignored.\n\t */\n\tprivate _setState(newState: ConnectionState): void {\n\t\tconst oldState = this._connectionState;\n\t\tif (oldState === newState) return;\n\n\t\tif (!Dendri._isValidTransition(oldState, newState)) {\n\t\t\tlogger.warn(`Invalid state transition: ${oldState} → ${newState}`);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._connectionState = newState;\n\t\tthis.emit(\"connectionStateChanged\", newState, oldState);\n\t}\n\n\tprivate static _isValidTransition(from: ConnectionState, to: ConnectionState): boolean {\n\t\tconst transitions: Record<ConnectionState, ConnectionState[]> = {\n\t\t\t[ConnectionState.Initialized]: [\n\t\t\t\tConnectionState.Connecting,\n\t\t\t\tConnectionState.Disconnected,\n\t\t\t\tConnectionState.Closed,\n\t\t\t\tConnectionState.Failed,\n\t\t\t],\n\t\t\t[ConnectionState.Connecting]: [\n\t\t\t\tConnectionState.Connected,\n\t\t\t\tConnectionState.Disconnected,\n\t\t\t\tConnectionState.Failed,\n\t\t\t\tConnectionState.Closed,\n\t\t\t],\n\t\t\t[ConnectionState.Connected]: [ConnectionState.Disconnected, ConnectionState.Closed],\n\t\t\t[ConnectionState.Disconnected]: [\n\t\t\t\tConnectionState.Connecting,\n\t\t\t\tConnectionState.Suspended,\n\t\t\t\tConnectionState.Closed,\n\t\t\t\tConnectionState.Failed,\n\t\t\t],\n\t\t\t[ConnectionState.Suspended]: [\n\t\t\t\tConnectionState.Connecting,\n\t\t\t\tConnectionState.Closed,\n\t\t\t\tConnectionState.Failed,\n\t\t\t],\n\t\t\t[ConnectionState.Closed]: [], // Terminal\n\t\t\t[ConnectionState.Failed]: [ConnectionState.Closed], // Terminal, can only close\n\t\t};\n\t\treturn transitions[from]?.includes(to) ?? false;\n\t}\n\n\tprivate _createServerConnection(): SignalingTransport {\n\t\tconst transport = this._options.signalingTransport || \"websocket\";\n\n\t\tconst socket: SignalingTransport =\n\t\t\ttransport === \"sse\"\n\t\t\t\t? new SSETransport(\n\t\t\t\t\t\tthis._options.secure ?? false,\n\t\t\t\t\t\tthis._options.host!,\n\t\t\t\t\t\tthis._options.port!,\n\t\t\t\t\t\tthis._options.path!,\n\t\t\t\t\t\tthis._options.key!,\n\t\t\t\t\t\tthis._options.pingInterval,\n\t\t\t\t\t\tthis._options.jwt,\n\t\t\t\t\t)\n\t\t\t\t: transport === \"polling\"\n\t\t\t\t\t? new PollingTransport(\n\t\t\t\t\t\t\tthis._options.secure ?? false,\n\t\t\t\t\t\t\tthis._options.host!,\n\t\t\t\t\t\t\tthis._options.port!,\n\t\t\t\t\t\t\tthis._options.path!,\n\t\t\t\t\t\t\tthis._options.key!,\n\t\t\t\t\t\t\tthis._options.pingInterval,\n\t\t\t\t\t\t\tthis._options.jwt,\n\t\t\t\t\t\t)\n\t\t\t\t\t: new Socket(\n\t\t\t\t\t\t\tthis._options.secure ?? false,\n\t\t\t\t\t\t\tthis._options.host!,\n\t\t\t\t\t\t\tthis._options.port!,\n\t\t\t\t\t\t\tthis._options.path!,\n\t\t\t\t\t\t\tthis._options.key!,\n\t\t\t\t\t\t\tthis._options.pingInterval,\n\t\t\t\t\t\t\tthis._options.jwt,\n\t\t\t\t\t\t);\n\n\t\tsocket.on(SocketEventType.Message, (data: ServerMessage) => {\n\t\t\tthis._handleMessage(data);\n\t\t});\n\n\t\tsocket.on(SocketEventType.Error, (error: string) => {\n\t\t\tthis._abort(DendriErrorType.SocketError, error, true);\n\t\t});\n\n\t\tsocket.on(SocketEventType.Disconnected, () => {\n\t\t\tif (this.disconnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.emitError(DendriErrorType.Network, \"Lost connection to server.\", true);\n\t\t\tthis.disconnect();\n\t\t});\n\n\t\tsocket.on(SocketEventType.ReconnectAttempt, (attempt: number) => {\n\t\t\tif (\n\t\t\t\tattempt >= Dendri.SUSPEND_THRESHOLD &&\n\t\t\t\tthis._connectionState === ConnectionState.Disconnected\n\t\t\t) {\n\t\t\t\tthis._setState(ConnectionState.Suspended);\n\t\t\t}\n\t\t});\n\n\t\tsocket.on(SocketEventType.Reconnected, () => {\n\t\t\tthis.emit(\"reconnected\");\n\t\t});\n\n\t\treturn socket;\n\t}\n\n\t/** Initialize a connection with the server. */\n\tprivate _initialize(id: string): void {\n\t\tthis._id = id;\n\t\tthis._setState(ConnectionState.Connecting);\n\t\tthis.socket.start(id, this._options.token!);\n\n\t\tif (util.isSafari || util.isIOS) {\n\t\t\tlogger.log(\"Safari/iOS detected — H.264 codec preference will be applied for video calls\");\n\t\t}\n\t}\n\n\t/** Handles messages from the server. */\n\tprivate _handleMessage(message: ServerMessage): void {\n\t\tconst type = message.type;\n\t\tconst payload = message.payload;\n\t\tconst peerId = message.src;\n\n\t\tswitch (type) {\n\t\t\tcase ServerMessageType.Open: // The connection to the server is open.\n\t\t\t\tthis._lastServerId = this.id;\n\t\t\t\tthis._setState(ConnectionState.Connected);\n\t\t\t\tthis._fetchTurnIfEnabled().then(() => {\n\t\t\t\t\tthis.emit(\"open\", this.id!);\n\t\t\t\t});\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Error: // Server error.\n\t\t\t\tthis._abort(DendriErrorType.ServerError, payload.msg, true);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.IdTaken: // The selected ID is taken.\n\t\t\t\tthis._abort(DendriErrorType.UnavailableID, `ID \"${this.id}\" is taken`);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.InvalidKey: // The given API key cannot be found.\n\t\t\t\tthis._abort(DendriErrorType.InvalidKey, `API KEY \"${this._options.key}\" is invalid`);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Leave: // Another peer has closed its connection to this peer.\n\t\t\t\tlogger.log(`Received leave message from ${peerId}`);\n\t\t\t\tthis._cleanupPeer(peerId);\n\t\t\t\tthis._connections.delete(peerId);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Expire: // The offer sent to a peer has expired without response.\n\t\t\t\tthis.emitError(\n\t\t\t\t\tDendriErrorType.PeerUnavailable,\n\t\t\t\t\t`Could not connect to peer ${peerId}`,\n\t\t\t\t\ttrue,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Offer: {\n\t\t\t\t// we should consider switching this to CALL/CONNECT, but this is the least breaking option.\n\t\t\t\tconst connectionId = payload.connectionId;\n\t\t\t\tlet connection = this.getConnection(peerId, connectionId);\n\n\t\t\t\tif (connection) {\n\t\t\t\t\tconnection.close();\n\t\t\t\t\tlogger.warn(`Offer received for existing Connection ID:${connectionId}`);\n\t\t\t\t}\n\n\t\t\t\t// Validate metadata if a validator is configured.\n\t\t\t\tif (this._options.validateMetadata && !this._options.validateMetadata(payload.metadata)) {\n\t\t\t\t\tlogger.warn(`Rejected connection from ${peerId} - metadata validation failed`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Create a new connection.\n\t\t\t\tif (payload.type === ConnectionType.Media) {\n\t\t\t\t\tconst mediaConnection = new MediaConnection(peerId, this, {\n\t\t\t\t\t\tconnectionId: connectionId,\n\t\t\t\t\t\t_payload: payload,\n\t\t\t\t\t\tmetadata: payload.metadata,\n\t\t\t\t\t});\n\t\t\t\t\tconnection = mediaConnection;\n\t\t\t\t\tthis._addConnection(peerId, connection);\n\t\t\t\t\tthis.emit(\"call\", mediaConnection);\n\t\t\t\t} else if (payload.type === ConnectionType.Data) {\n\t\t\t\t\tconst Serializer = this._serializers[payload.serialization];\n\n\t\t\t\t\tif (!Serializer) {\n\t\t\t\t\t\tlogger.warn(`Received offer with unknown serialization type: ${payload.serialization}`);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst dataConnection = new Serializer(peerId, this, {\n\t\t\t\t\t\tconnectionId: connectionId,\n\t\t\t\t\t\t_payload: payload,\n\t\t\t\t\t\tmetadata: payload.metadata,\n\t\t\t\t\t\tlabel: payload.label,\n\t\t\t\t\t\tserialization: payload.serialization,\n\t\t\t\t\t\treliable: payload.reliable,\n\t\t\t\t\t});\n\t\t\t\t\tconnection = dataConnection;\n\n\t\t\t\t\tthis._addConnection(peerId, connection);\n\t\t\t\t\tthis.emit(\"connection\", dataConnection);\n\t\t\t\t} else {\n\t\t\t\t\tlogger.warn(`Received malformed connection type:${payload.type}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Find messages.\n\t\t\t\tconst messages = this._getMessages(connectionId);\n\t\t\t\tfor (const message of messages) {\n\t\t\t\t\tconnection.handleMessage(message);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ServerMessageType.KeyExchange: {\n\t\t\t\t// Route KEY_EXCHANGE to the appropriate HybridConnection.\n\t\t\t\tconst hybridKx = this._hybridConnections.get(peerId);\n\t\t\t\tif (hybridKx) {\n\t\t\t\t\thybridKx.handleKeyExchange(payload);\n\t\t\t\t} else {\n\t\t\t\t\tlogger.warn(`Received KEY-EXCHANGE from ${peerId} but no HybridConnection exists`);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ServerMessageType.Data: {\n\t\t\t\t// Relay data routed to a HybridConnection.\n\t\t\t\tconst hybrid = this._hybridConnections.get(peerId);\n\t\t\t\tif (hybrid) {\n\t\t\t\t\tconst seq = message.seq;\n\t\t\t\t\t// If the payload contains an __ackId, send an ACK back to the sender.\n\t\t\t\t\tif (\n\t\t\t\t\t\tpayload !== null &&\n\t\t\t\t\t\ttypeof payload === \"object\" &&\n\t\t\t\t\t\t\"__ackId\" in payload &&\n\t\t\t\t\t\ttypeof payload.__ackId === \"string\"\n\t\t\t\t\t) {\n\t\t\t\t\t\tthis._socket.send({\n\t\t\t\t\t\t\ttype: ServerMessageType.Ack,\n\t\t\t\t\t\t\tdst: peerId,\n\t\t\t\t\t\t\tpayload: { ackId: payload.__ackId },\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// Unwrap and deliver the inner data.\n\t\t\t\t\t\thybrid.handleRelayData(payload.data, seq);\n\t\t\t\t\t} else {\n\t\t\t\t\t\thybrid.handleRelayData(payload, seq);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// Emit for Room relay fallback — room-scoped DATA messages\n\t\t\t\t\t// that arrive when no HybridConnection exists.\n\t\t\t\t\tthis.emit(\"relayData\" as any, peerId, payload, message.room);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ServerMessageType.Ack: {\n\t\t\t\t// Route ACK to the matching HybridConnection's AckManager.\n\t\t\t\tif (payload?.ackId) {\n\t\t\t\t\tconst hybrid = this._hybridConnections.get(peerId);\n\t\t\t\t\tif (hybrid) {\n\t\t\t\t\t\thybrid.ackManager.handleAck(payload.ackId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ServerMessageType.RoomPeers: {\n\t\t\t\tconst room = message.room ?? \"\";\n\t\t\t\tconst peers: string[] = Array.isArray(payload) ? payload : [];\n\t\t\t\tthis.emit(\"roomPeers\", room, peers);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ServerMessageType.PresenceUpdate: {\n\t\t\t\tthis.emit(\"presenceUpdate\", message.src, message.room ?? \"\", payload);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase ServerMessageType.Heartbeat:\n\t\t\t\t// Server echo — silently ignore.\n\t\t\t\tbreak;\n\t\t\tdefault: {\n\t\t\t\tif (!payload) {\n\t\t\t\t\tlogger.warn(`You received a malformed message from ${peerId} of type ${type}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connectionId = payload.connectionId;\n\t\t\t\tconst connection = this.getConnection(peerId, connectionId);\n\n\t\t\t\tif (connection?.peerConnection) {\n\t\t\t\t\t// Pass it on.\n\t\t\t\t\tconnection.handleMessage(message);\n\t\t\t\t} else if (connectionId) {\n\t\t\t\t\t// Store for possible later use\n\t\t\t\t\tthis._storeMessage(connectionId, message);\n\t\t\t\t} else {\n\t\t\t\t\tlogger.warn(\"You received an unrecognized message:\", message);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate static readonly MAX_LOST_MESSAGES = 1000;\n\tprivate static readonly LOST_MESSAGE_TTL = 5 * 60 * 1000; // 5 minutes\n\n\t/** Stores messages without a set up connection, to be claimed later. */\n\tprivate _storeMessage(connectionId: string, message: ServerMessage): void {\n\t\tif (!this._lostMessages.has(connectionId)) {\n\t\t\tthis._lostMessages.set(connectionId, []);\n\t\t}\n\n\t\tthis._lostMessages.get(connectionId)?.push(message);\n\n\t\t// Cap total stored messages to prevent unbounded growth\n\t\tlet totalMessages = 0;\n\t\tfor (const msgs of this._lostMessages.values()) {\n\t\t\ttotalMessages += msgs.length;\n\t\t}\n\t\tif (totalMessages > Dendri.MAX_LOST_MESSAGES) {\n\t\t\t// Remove the oldest entry (first key in Map iteration order)\n\t\t\tconst oldestKey = this._lostMessages.keys().next().value;\n\t\t\tif (oldestKey !== undefined) {\n\t\t\t\tthis._lostMessages.delete(oldestKey);\n\t\t\t\tthis._lostMessageGeneration.delete(oldestKey);\n\t\t\t}\n\t\t}\n\n\t\t// Schedule TTL cleanup with generation counter to avoid deleting\n\t\t// messages that were re-stored after the timer was set.\n\t\tconst gen = (this._lostMessageGeneration.get(connectionId) ?? 0) + 1;\n\t\tthis._lostMessageGeneration.set(connectionId, gen);\n\n\t\tsetTimeout(() => {\n\t\t\tif (this._lostMessageGeneration.get(connectionId) === gen) {\n\t\t\t\tthis._lostMessages.delete(connectionId);\n\t\t\t\tthis._lostMessageGeneration.delete(connectionId);\n\t\t\t}\n\t\t}, Dendri.LOST_MESSAGE_TTL);\n\t}\n\n\t/**\n\t * Retrieve messages from lost message store\n\t * @internal\n\t */\n\t//TODO Change it to private\n\tpublic _getMessages(connectionId: string): ServerMessage[] {\n\t\tconst messages = this._lostMessages.get(connectionId);\n\n\t\tif (messages) {\n\t\t\tthis._lostMessages.delete(connectionId);\n\t\t\tthis._lostMessageGeneration.delete(connectionId);\n\t\t\treturn messages;\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Connects to the remote peer specified by id and returns a data connection.\n\t * @param peer The brokering ID of the remote peer (their {@apilink Dendri.id}).\n\t * @param options for specifying details about the data connection\n\t */\n\tconnect(peer: string, options: DendriConnectOption = {}): DataConnection | undefined {\n\t\tif (!peer || typeof peer !== \"string\") {\n\t\t\tthis.emitError(DendriErrorType.InvalidID, \"A non-empty peer ID is required to connect.\");\n\t\t\treturn undefined;\n\t\t}\n\n\t\toptions = {\n\t\t\tserialization: \"default\",\n\t\t\t...options,\n\t\t};\n\t\tif (this.disconnected) {\n\t\t\tlogger.warn(\n\t\t\t\t\"You cannot connect to a new Dendri instance because you called \" +\n\t\t\t\t\t\".disconnect() on this Dendri instance and ended your connection with the \" +\n\t\t\t\t\t\"server. You can create a new Dendri instance to reconnect, or call reconnect \" +\n\t\t\t\t\t\"on this peer if you believe its ID to still be available.\",\n\t\t\t);\n\t\t\tthis.emitError(\n\t\t\t\tDendriErrorType.Disconnected,\n\t\t\t\t\"Cannot connect to new Dendri instance after disconnecting from server.\",\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst Serializer = this._serializers[options.serialization!];\n\n\t\tif (!Serializer) {\n\t\t\tthis.emitError(\n\t\t\t\tDendriErrorType.InvalidID,\n\t\t\t\t`Unknown serialization type: ${options.serialization}`,\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst dataConnection = new Serializer(peer, this, options);\n\t\tthis._addConnection(peer, dataConnection);\n\t\treturn dataConnection;\n\t}\n\n\t/**\n\t * Calls the remote peer specified by id and returns a media connection.\n\t * @param peer The brokering ID of the remote peer (their peer.id).\n\t * @param stream The caller's media stream\n\t * @param options Metadata associated with the connection, passed in by whoever initiated the connection.\n\t */\n\tcall(peer: string, stream: MediaStream, options: CallOption = {}): MediaConnection | undefined {\n\t\tif (!peer || typeof peer !== \"string\") {\n\t\t\tthis.emitError(DendriErrorType.InvalidID, \"A non-empty peer ID is required to call.\");\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (this.disconnected) {\n\t\t\tlogger.warn(\n\t\t\t\t\"You cannot connect to a new Dendri instance because you called \" +\n\t\t\t\t\t\".disconnect() on this Dendri instance and ended your connection with the \" +\n\t\t\t\t\t\"server. You can create a new Dendri instance to reconnect.\",\n\t\t\t);\n\t\t\tthis.emitError(\n\t\t\t\tDendriErrorType.Disconnected,\n\t\t\t\t\"Cannot connect to new Dendri instance after disconnecting from server.\",\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!stream) {\n\t\t\tlogger.error(\"To call a peer, you must provide a stream from your browser's `getUserMedia`.\");\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst mediaConnection = new MediaConnection(peer, this, {\n\t\t\t...options,\n\t\t\t_stream: stream,\n\t\t});\n\t\tthis._addConnection(peer, mediaConnection);\n\t\treturn mediaConnection;\n\t}\n\n\t/**\n\t * Create a hybrid connection that uses WebRTC when possible\n\t * and transparently falls back to WebSocket relay.\n\t *\n\t * @param peer The brokering ID of the remote peer.\n\t * @param options HybridConnection-specific options (ICE timeout, upgrade behaviour, etc.)\n\t */\n\tconnectHybrid(peer: string, options?: HybridConnectionOption): HybridConnection | undefined {\n\t\tif (!peer || typeof peer !== \"string\") {\n\t\t\tthis.emitError(DendriErrorType.InvalidID, \"A non-empty peer ID is required to connect.\");\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (this.disconnected) {\n\t\t\tlogger.warn(\n\t\t\t\t\"You cannot connect to a new Dendri instance because you called \" +\n\t\t\t\t\t\".disconnect() on this Dendri instance and ended your connection with the \" +\n\t\t\t\t\t\"server. You can create a new Dendri instance to reconnect, or call reconnect \" +\n\t\t\t\t\t\"on this peer if you believe its ID to still be available.\",\n\t\t\t);\n\t\t\tthis.emitError(\n\t\t\t\tDendriErrorType.Disconnected,\n\t\t\t\t\"Cannot connect to new Dendri instance after disconnecting from server.\",\n\t\t\t);\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst hybrid = new HybridConnection(peer, this, options);\n\t\tthis._hybridConnections.set(peer, hybrid);\n\n\t\t// Clean up the reference when the hybrid connection closes.\n\t\thybrid.on(\"close\", () => {\n\t\t\tthis._hybridConnections.delete(peer);\n\t\t});\n\n\t\thybrid.start();\n\t\treturn hybrid;\n\t}\n\n\t/**\n\t * Join a room on the signaling server.\n\t * The server will respond with a ROOM_PEERS message listing current members.\n\t */\n\tjoinRoom(roomName: string): void {\n\t\tthis.socket.send({ type: ServerMessageType.RoomJoin, room: roomName });\n\t}\n\n\t/**\n\t * Leave a room on the signaling server.\n\t */\n\tleaveRoom(roomName: string): void {\n\t\tthis.socket.send({ type: ServerMessageType.RoomLeave, room: roomName });\n\t}\n\n\t/** Auto-fetch TURN credentials when the option is enabled. */\n\tprivate async _fetchTurnIfEnabled(): Promise<void> {\n\t\tif (!this._options.fetchTurnCredentials) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tconst turnServers = await this._api.getTurnCredentials();\n\t\t\tif (turnServers.length > 0) {\n\t\t\t\tconst existingServers = this._options.config?.iceServers ?? [];\n\t\t\t\tthis._options.config = {\n\t\t\t\t\t...this._options.config,\n\t\t\t\t\ticeServers: [...existingServers, ...turnServers],\n\t\t\t\t};\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Failed to fetch TURN credentials\", error);\n\t\t}\n\t}\n\n\t/** Add a data/media connection to this peer. */\n\tprivate _addConnection(peerId: string, connection: MediaConnection | DataConnection): void {\n\t\tlogger.log(`add connection ${connection.type}:${connection.connectionId} to peerId:${peerId}`);\n\n\t\tif (!this._connections.has(peerId)) {\n\t\t\tthis._connections.set(peerId, []);\n\t\t}\n\t\tthis._connections.get(peerId)?.push(connection);\n\t}\n\n\t//TODO should be private\n\t_removeConnection(connection: DataConnection | MediaConnection): void {\n\t\tconst connections = this._connections.get(connection.peer);\n\n\t\tif (connections) {\n\t\t\tconst index = connections.indexOf(connection);\n\n\t\t\tif (index !== -1) {\n\t\t\t\tconnections.splice(index, 1);\n\t\t\t}\n\n\t\t\tif (connections.length === 0) {\n\t\t\t\tthis._connections.delete(connection.peer);\n\t\t\t}\n\t\t}\n\n\t\t//remove from lost messages\n\t\tthis._lostMessages.delete(connection.connectionId);\n\t\tthis._lostMessageGeneration.delete(connection.connectionId);\n\t}\n\n\t/** Retrieve a data/media connection for this peer. */\n\tgetConnection(peerId: string, connectionId: string): null | DataConnection | MediaConnection {\n\t\tconst connections = this._connections.get(peerId);\n\t\tif (!connections) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfor (const connection of connections) {\n\t\t\tif (connection.connectionId === connectionId) {\n\t\t\t\treturn connection;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\t/** Error types that indicate an unrecoverable problem. */\n\tprivate static readonly FATAL_ERROR_TYPES: ReadonlySet<DendriErrorType> = new Set([\n\t\tDendriErrorType.BrowserIncompatible,\n\t\tDendriErrorType.InvalidID,\n\t\tDendriErrorType.InvalidKey,\n\t]);\n\n\tprivate _delayedAbort(type: DendriErrorType, message: string | Error, retryable = false): void {\n\t\tsetTimeout(() => {\n\t\t\tthis._abort(type, message, retryable);\n\t\t}, 0);\n\t}\n\n\t/**\n\t * Emits an error message and destroys the Dendri instance.\n\t * The Dendri instance is not destroyed if it's in a disconnected state, in which case\n\t * it retains its disconnected state and its existing connections.\n\t */\n\tprivate _abort(type: DendriErrorType, message: string | Error, retryable = false): void {\n\t\tlogger.error(\"Aborting!\");\n\n\t\tif (!this._lastServerId) {\n\t\t\tconst isFatal = Dendri.FATAL_ERROR_TYPES.has(type);\n\t\t\tconst terminalState = isFatal ? ConnectionState.Failed : ConnectionState.Closed;\n\n\t\t\t// Perform cleanup and state transition before emitting the error\n\t\t\t// so that listeners see the correct terminal state.\n\t\t\tthis.disconnect();\n\t\t\tthis._cleanup();\n\t\t\tthis._setState(terminalState);\n\n\t\t\tthis.emitError(type, message, retryable);\n\t\t\tthis.emit(\"close\");\n\t\t} else {\n\t\t\tthis.emitError(type, message, retryable);\n\t\t\tthis.disconnect();\n\t\t}\n\t}\n\n\t/**\n\t * Destroys the Dendri instance: closes all active connections as well as the connection\n\t * to the server.\n\t *\n\t * :::caution\n\t * This cannot be undone; the respective peer object will no longer be able\n\t * to create or receive any connections, its ID will be forfeited on the server,\n\t * and all of its data and media connections will be closed.\n\t * :::\n\t */\n\tdestroy(): void {\n\t\tthis._destroyWithState(ConnectionState.Closed);\n\t}\n\n\t/** Internal destroy that transitions to the given terminal state. */\n\tprivate _destroyWithState(terminalState: ConnectionState): void {\n\t\tif (this.destroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.log(`Destroy peer with ID:${this.id}`);\n\n\t\tthis.disconnect();\n\t\tthis._cleanup();\n\n\t\tthis._setState(terminalState);\n\n\t\tthis.emit(\"close\");\n\t}\n\n\t/** Disconnects every connection on this peer. */\n\tprivate _cleanup(): void {\n\t\tconst peerIds = [...this._connections.keys()];\n\n\t\tfor (const peerId of peerIds) {\n\t\t\tthis._cleanupPeer(peerId);\n\t\t}\n\n\t\tthis._connections.clear();\n\n\t\t// Close all hybrid connections.\n\t\tfor (const hybrid of this._hybridConnections.values()) {\n\t\t\thybrid.close();\n\t\t}\n\t\tthis._hybridConnections.clear();\n\n\t\tthis.socket.removeAllListeners();\n\t}\n\n\t/** Closes all connections to this peer. */\n\tprivate _cleanupPeer(peerId: string): void {\n\t\tconst connections = this._connections.get(peerId);\n\n\t\tif (!connections) return;\n\n\t\t// Copy array since close() calls _removeConnection which mutates it\n\t\tconst connectionsToClose = [...connections];\n\n\t\tfor (const connection of connectionsToClose) {\n\t\t\tconnection.close();\n\t\t}\n\t}\n\n\t/**\n\t * Disconnects the Dendri instance's connection to the Dendri server. Does not close any\n\t * active connections.\n\t * Warning: The peer can no longer create or accept connections after being\n\t * disconnected. It also cannot reconnect to the server.\n\t */\n\tdisconnect(): void {\n\t\tconst s = this._connectionState;\n\t\tif (\n\t\t\ts === ConnectionState.Disconnected ||\n\t\t\ts === ConnectionState.Suspended ||\n\t\t\ts === ConnectionState.Closed ||\n\t\t\ts === ConnectionState.Failed\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentId = this.id;\n\n\t\tlogger.log(`Disconnect peer with ID:${currentId}`);\n\n\t\tthis._setState(ConnectionState.Disconnected);\n\n\t\tthis.socket.close();\n\n\t\tthis._lastServerId = currentId;\n\t\tthis._id = null;\n\n\t\tthis.emit(\"disconnected\", currentId!);\n\t}\n\n\t/** Attempts to reconnect with the same ID.\n\t *\n\t * Only {@apilink Dendri.disconnect | disconnected peers} can be reconnected.\n\t * Destroyed peers cannot be reconnected.\n\t * If the connection fails (as an example, if the peer's old ID is now taken),\n\t * the peer's existing connections will not close, but any associated errors events will fire.\n\t */\n\treconnect(): void {\n\t\tif (this.disconnected && !this.destroyed) {\n\t\t\tlogger.log(`Attempting reconnection to server with ID ${this._lastServerId}`);\n\t\t\tthis._initialize(this._lastServerId!);\n\t\t} else if (this.destroyed) {\n\t\t\tthrow new Error(\"This peer cannot reconnect to the server. It has already been destroyed.\");\n\t\t} else if (!this.disconnected && !this.open) {\n\t\t\t// Do nothing. We're still connecting the first time.\n\t\t\tlogger.error(\"In a hurry? We're still trying to make the initial connection!\");\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Dendri ${this.id} cannot reconnect because it is not disconnected from the server!`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get a list of available peer IDs. If you're running your own server, you'll\n\t * want to set allow_discovery: true in the Dendri server options.\n\t */\n\tlistAllPeers(cb = (_: any[]) => {}): void {\n\t\tthis._api\n\t\t\t.listAllPeers()\n\t\t\t.then((peers) => cb(peers))\n\t\t\t.catch((error) => this.emitError(DendriErrorType.ServerError, error, true));\n\t}\n\n\t/** Returns a snapshot of the current connection state for debugging. */\n\tdiagnostics(): {\n\t\tpeerId: string | null;\n\t\tconnectionState: ConnectionState;\n\t\tserverConnected: boolean;\n\t\tconnections: Array<{\n\t\t\tpeerId: string;\n\t\t\ttype: string;\n\t\t\topen: boolean;\n\t\t}>;\n\t\thybridConnections: Array<{\n\t\t\tpeerId: string;\n\t\t\tmode: TransportMode;\n\t\t\topen: boolean;\n\t\t}>;\n\t\tsocket: {\n\t\t\tconnected: boolean;\n\t\t\tautoReconnect: boolean;\n\t\t\treconnectAttempt: number;\n\t\t\tlastSeq: number;\n\t\t};\n\t\tpendingMessages: number;\n\t} {\n\t\tconst connections: Array<{ peerId: string; type: string; open: boolean }> = [];\n\t\tfor (const [peerId, conns] of this._connections) {\n\t\t\tfor (const conn of conns) {\n\t\t\t\tconnections.push({\n\t\t\t\t\tpeerId,\n\t\t\t\t\ttype: conn.type,\n\t\t\t\t\topen: conn.open,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst hybridConnections: Array<{\n\t\t\tpeerId: string;\n\t\t\tmode: TransportMode;\n\t\t\topen: boolean;\n\t\t}> = [];\n\t\tfor (const [peerId, hybrid] of this._hybridConnections) {\n\t\t\thybridConnections.push({\n\t\t\t\tpeerId,\n\t\t\t\tmode: hybrid.mode,\n\t\t\t\topen: hybrid.open,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tpeerId: this.id ?? null,\n\t\t\tconnectionState: this.connectionState,\n\t\t\tserverConnected: !this.disconnected,\n\t\t\tconnections,\n\t\t\thybridConnections,\n\t\t\tsocket: {\n\t\t\t\tconnected: !!(this.socket as any)?._socket,\n\t\t\t\tautoReconnect: (this.socket as any)?._autoReconnect ?? false,\n\t\t\t\treconnectAttempt: (this.socket as any)?._reconnectAttempt ?? 0,\n\t\t\t\tlastSeq: (this.socket as any)?._lastSeq ?? 0,\n\t\t\t},\n\t\t\tpendingMessages: this._lostMessages.size,\n\t\t};\n\t}\n}\n","/**\n * High-level Room abstraction for star-topology P2P rooms with host migration.\n *\n * Usage pattern:\n * const room = new Room(\"my-room\");\n * room.join({ host: \"localhost\", port: 9000, secure: false, path: \"/\" });\n * room.on(\"joined\", (peerId, isHost) => { ... });\n * room.on(\"data\", (peerId, data) => { ... });\n * room.broadcast({ cursor: [10, 20] });\n *\n * The Room class is opt-in. Existing Dendri usage patterns are unaffected.\n */\n\nimport { EventEmitter } from \"eventemitter3\";\nimport { AckManager } from \"./ack\";\nimport type { DataConnection } from \"./dataconnection/DataConnection\";\nimport type { Dendri, DendriOptions } from \"./dendri\";\nimport { ServerMessageType } from \"./enums\";\nimport { electNewHost } from \"./hostmigration\";\nimport { PresenceManager } from \"./presence\";\nimport { isRpcRequest, isRpcResponse, type RpcHandler, RpcManager } from \"./rpc\";\nimport { isTopicEnvelope, TopicManager } from \"./topics\";\n\n/**\n * Encode bytes as base64 so binary payloads survive JSON-only signaling-relay\n * and topic envelopes. WebRTC paths could carry Uint8Array natively, but we\n * wrap uniformly to keep host-fanout, relay fallback, and receivers identical.\n */\nfunction bytesToBase64(bytes: Uint8Array): string {\n\tlet binary = \"\";\n\tfor (let i = 0; i < bytes.length; i++) {\n\t\tbinary += String.fromCharCode(bytes[i]);\n\t}\n\treturn btoa(binary);\n}\n\nfunction base64ToBytes(b64: string): Uint8Array {\n\tconst binary = atob(b64);\n\tconst bytes = new Uint8Array(binary.length);\n\tfor (let i = 0; i < binary.length; i++) {\n\t\tbytes[i] = binary.charCodeAt(i);\n\t}\n\treturn bytes;\n}\n\nexport interface RoomEvents {\n\t/** Fired when this peer has successfully joined the room. */\n\tjoined: (peerId: string, isHost: boolean) => void;\n\t/** Fired when a remote peer joins the room. */\n\tpeerJoined: (peerId: string) => void;\n\t/** Fired when a remote peer leaves the room. */\n\tpeerLeft: (peerId: string) => void;\n\t/** Fired when data is received from any peer. */\n\tdata: (peerId: string, data: unknown) => void;\n\t/** Fired when the host changes (either via initial join or migration). */\n\thostChanged: (newHostId: string) => void;\n\t/** Fired on errors. */\n\terror: (err: Error) => void;\n}\n\nexport interface RoomOptions {\n\t/** Milliseconds to wait for a new host to become reachable (default 10000). */\n\treadonly migrationTimeout?: number;\n}\n\n/**\n * A Room manages the lifecycle of a star-topology P2P room:\n * - First peer to join becomes the host (claims the room ID as its peer ID).\n * - Subsequent peers connect to the host.\n * - If the host disconnects, the remaining peer with the lowest alphabetical ID\n * takes over as host (deterministic election).\n */\nexport class Room extends EventEmitter<RoomEvents> {\n\tprivate _peer: Dendri | null = null;\n\tprivate _isHost = false;\n\tprivate _hostId: string | null = null;\n\tprivate readonly _connections = new Map<string, DataConnection>();\n\tprivate readonly _knownPeers = new Set<string>();\n\tprivate readonly _topics = new TopicManager();\n\tprivate readonly _ackManager = new AckManager();\n\tprivate readonly _rpc = new RpcManager();\n\tprivate readonly _presence = new PresenceManager();\n\tprivate readonly _roomId: string;\n\tprivate readonly _migrationTimeout: number;\n\tprivate _dendriOptions: DendriOptions | null = null;\n\tprivate _DendriCtor: (new (id: string, opts?: DendriOptions) => Dendri) | null = null;\n\tprivate _migrationTimer: ReturnType<typeof setTimeout> | null = null;\n\tprivate _roomJoinInterval: ReturnType<typeof setInterval> | null = null;\n\tprivate _joined = false;\n\n\tconstructor(roomId: string, options?: RoomOptions) {\n\t\tsuper();\n\t\tthis._roomId = roomId;\n\t\tthis._migrationTimeout = options?.migrationTimeout ?? 10_000;\n\t}\n\n\t/** Whether this peer is the current host. */\n\tget isHost(): boolean {\n\t\treturn this._isHost;\n\t}\n\n\t/** The peer ID of the current host, or null if not yet joined. */\n\tget hostId(): string | null {\n\t\treturn this._hostId;\n\t}\n\n\t/** All known peer IDs in the room (excluding self). */\n\tget peers(): string[] {\n\t\treturn Array.from(this._knownPeers);\n\t}\n\n\t/** Number of known peers (excluding self). */\n\tget peerCount(): number {\n\t\treturn this._knownPeers.size;\n\t}\n\n\t/** The local peer's ID, or null if not joined. */\n\tget peerId(): string | null {\n\t\treturn this._peer?.id ?? null;\n\t}\n\n\t/**\n\t * Join the room. Tries to become host first (claims roomId as peer ID).\n\t * If the ID is already taken, joins as a client.\n\t *\n\t * @param DendriCtor - The Dendri constructor to use for creating peer instances.\n\t * @param dendriOptions - Options forwarded to the Dendri constructor.\n\t */\n\tjoin(\n\t\tDendriCtor: new (id: string, opts?: DendriOptions) => Dendri,\n\t\tdendriOptions: DendriOptions,\n\t): void {\n\t\tif (this._joined) {\n\t\t\tthis.emit(\"error\", new Error(\"Already joined this room\"));\n\t\t\treturn;\n\t\t}\n\n\t\tthis._DendriCtor = DendriCtor;\n\t\tthis._dendriOptions = dendriOptions;\n\t\tthis._tryBecomeHost();\n\t}\n\n\t/**\n\t * Send data to all peers in the room, optionally tagged with a topic.\n\t * Tries WebRTC first; falls back to signaling server DATA relay when\n\t * no WebRTC connections are open (e.g. behind a VPN).\n\t */\n\tbroadcast(data: unknown, options?: { readonly topic?: string }): void {\n\t\tconst topic = options?.topic;\n\t\tconst wire = topic ? { __topic: topic, __data: data } : data;\n\n\t\tlet sentViaWebRTC = false;\n\n\t\tif (this._isHost) {\n\t\t\tfor (const conn of this._connections.values()) {\n\t\t\t\tif (conn.open) {\n\t\t\t\t\tconn.send(wire);\n\t\t\t\t\tsentViaWebRTC = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this._hostId) {\n\t\t\tconst hostConn = this._connections.get(this._hostId);\n\t\t\tif (hostConn?.open) {\n\t\t\t\thostConn.send(wire);\n\t\t\t\tsentViaWebRTC = true;\n\t\t\t}\n\t\t}\n\n\t\t// Fallback: relay via signaling server when WebRTC is unavailable.\n\t\tif (!sentViaWebRTC && this._peer?.socket) {\n\t\t\tthis._peer.socket.send({\n\t\t\t\ttype: ServerMessageType.Data,\n\t\t\t\troom: this._roomId,\n\t\t\t\tpayload: wire,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Broadcast a binary payload tagged with a topic. Wraps bytes in a\n\t * base64 topic envelope so they survive both WebRTC fanout and the\n\t * JSON-only signaling-relay fallback. Receivers see a Uint8Array.\n\t */\n\tbroadcastBinary(bytes: Uint8Array, options: { readonly topic: string }): void {\n\t\tconst wire = {\n\t\t\t__topic: options.topic,\n\t\t\t__binary: true,\n\t\t\t__data: bytesToBase64(bytes),\n\t\t};\n\n\t\tlet sentViaWebRTC = false;\n\n\t\tif (this._isHost) {\n\t\t\tfor (const conn of this._connections.values()) {\n\t\t\t\tif (conn.open) {\n\t\t\t\t\tconn.send(wire);\n\t\t\t\t\tsentViaWebRTC = true;\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this._hostId) {\n\t\t\tconst hostConn = this._connections.get(this._hostId);\n\t\t\tif (hostConn?.open) {\n\t\t\t\thostConn.send(wire);\n\t\t\t\tsentViaWebRTC = true;\n\t\t\t}\n\t\t}\n\n\t\tif (!sentViaWebRTC && this._peer?.socket) {\n\t\t\tthis._peer.socket.send({\n\t\t\t\ttype: ServerMessageType.Data,\n\t\t\t\troom: this._roomId,\n\t\t\t\tpayload: wire,\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Broadcast data with delivery confirmation (at-least-once guarantee).\n\t * Resolves when all currently connected peers have ACKed.\n\t */\n\tasync broadcastWithAck(data: unknown, timeoutMs: number = 5000): Promise<void> {\n\t\tconst connections: DataConnection[] = [];\n\n\t\tif (this._isHost) {\n\t\t\tfor (const conn of this._connections.values()) {\n\t\t\t\tif (conn.open) {\n\t\t\t\t\tconnections.push(conn);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (this._hostId) {\n\t\t\tconst hostConn = this._connections.get(this._hostId);\n\t\t\tif (hostConn?.open) {\n\t\t\t\tconnections.push(hostConn);\n\t\t\t}\n\t\t}\n\n\t\tif (connections.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst promises: Promise<void>[] = [];\n\n\t\tfor (const conn of connections) {\n\t\t\tconst ackId = this._ackManager.nextId();\n\t\t\tconn.send({ __ackId: ackId, data });\n\t\t\t// Tag with the peer so a disconnect on that peer rejects the\n\t\t\t// promise immediately instead of waiting out the full timeout.\n\t\t\tpromises.push(this._ackManager.waitForAck(ackId, timeoutMs, conn.peer));\n\t\t}\n\n\t\tawait Promise.all(promises);\n\t}\n\n\t/**\n\t * Subscribe to messages on a specific topic.\n\t * Returns an unsubscribe function.\n\t */\n\tsubscribe(topic: string, handler: (data: unknown, peerId: string) => void): () => void {\n\t\treturn this._topics.subscribe(topic, handler);\n\t}\n\n\t/**\n\t * Subscribe to all incoming data regardless of topic.\n\t * Returns an unsubscribe function.\n\t */\n\tonData(handler: (data: unknown, peerId: string) => void): () => void {\n\t\treturn this._topics.subscribeAll(handler);\n\t}\n\n\t/**\n\t * Register an RPC method that other peers can call.\n\t * Returns an unregister function.\n\t */\n\tregisterRpcMethod(name: string, handler: RpcHandler): () => void {\n\t\treturn this._rpc.registerMethod(name, handler);\n\t}\n\n\t/**\n\t * Call an RPC method on a remote peer (or broadcast to all).\n\t *\n\t * When `peerId` is specified the request is sent only to that peer.\n\t * Otherwise it is broadcast to every connected peer (useful when any\n\t * peer may handle the method).\n\t */\n\tasync performRpc(\n\t\tmethod: string,\n\t\tpayload: unknown,\n\t\toptions?: { readonly timeout?: number; readonly peerId?: string },\n\t): Promise<unknown> {\n\t\treturn this._rpc.performRpc(\n\t\t\tmethod,\n\t\t\tpayload,\n\t\t\t(request) => {\n\t\t\t\tconst wire = { ...request, sender: this._peer?.id ?? \"\" };\n\n\t\t\t\tif (options?.peerId) {\n\t\t\t\t\tthis._sendToPeer(options.peerId, wire);\n\t\t\t\t} else {\n\t\t\t\t\tthis.broadcast(wire, { topic: \"__rpc\" });\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ timeout: options?.timeout },\n\t\t);\n\t}\n\n\t/**\n\t * Set my presence data -- automatically broadcast to all room peers\n\t * via the signaling server's PRESENCE_UPDATE message.\n\t */\n\tsetPresence<P extends Record<string, unknown>>(data: P): void {\n\t\tthis._presence.setMyPresence(data);\n\n\t\tif (this._peer?.socket) {\n\t\t\tthis._peer.socket.send({\n\t\t\t\ttype: ServerMessageType.PresenceUpdate,\n\t\t\t\troom: this._roomId,\n\t\t\t\tpayload: this._presence.myPresence,\n\t\t\t});\n\t\t}\n\t}\n\n\t/** Get all other peers' presence data. */\n\tgetOthers(): Map<string, unknown> {\n\t\treturn this._presence.getOthers();\n\t}\n\n\t/** Get a specific peer's presence data. */\n\tgetPresence(peerId: string): unknown {\n\t\treturn this._presence.getPresence(peerId);\n\t}\n\n\t/** Get the presence manager for direct event listening. */\n\tget presence(): PresenceManager {\n\t\treturn this._presence;\n\t}\n\n\t/**\n\t * Leave the room and clean up all connections.\n\t */\n\tleave(): void {\n\t\tthis._clearMigrationTimer();\n\t\tthis._stopRoomJoinHeartbeat();\n\n\t\tfor (const conn of this._connections.values()) {\n\t\t\tconn.close();\n\t\t}\n\t\tthis._connections.clear();\n\t\tthis._knownPeers.clear();\n\t\tthis._topics.clear();\n\t\tthis._ackManager.clear();\n\t\tthis._rpc.clear();\n\t\tthis._presence.clear();\n\n\t\tif (this._peer) {\n\t\t\tthis._peer.off(\"reconnected\" as any, this._onSignalingReconnected);\n\t\t\tthis._peer.destroy();\n\t\t\tthis._peer = null;\n\t\t}\n\n\t\tthis._isHost = false;\n\t\tthis._hostId = null;\n\t\tthis._joined = false;\n\t\tthis._DendriCtor = null;\n\t\tthis._dendriOptions = null;\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Internal: host path\n\t// -----------------------------------------------------------------------\n\n\tprivate _tryBecomeHost(): void {\n\t\tconst peer = new this._DendriCtor!(this._roomId, this._dendriOptions!);\n\n\t\tpeer.once(\"open\", () => {\n\t\t\tthis._postJoinSetup(peer, true);\n\t\t\tthis.emit(\"joined\", peer.id!, true);\n\t\t});\n\n\t\tpeer.once(\"error\", (err) => {\n\t\t\t// ID taken means someone else is host already\n\t\t\tif (err.type === \"unavailable-id\") {\n\t\t\t\tpeer.destroy();\n\t\t\t\tthis._joinAsClient();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.emit(\"error\", err);\n\t\t});\n\t}\n\n\t/**\n\t * Wire up all listeners and register with the server-side room.\n\t * Used by every entry path (_tryBecomeHost, _joinAsClient, _becomeHost)\n\t * so the three can't drift out of sync. This is the single source of\n\t * truth for \"a peer has just entered the room\".\n\t */\n\tprivate _postJoinSetup(peer: Dendri, isHost: boolean): void {\n\t\tthis._peer = peer;\n\t\tthis._isHost = isHost;\n\t\tthis._hostId = this._roomId;\n\t\tthis._joined = true;\n\t\tthis._presence.setMyPeerId(peer.id!);\n\n\t\tif (isHost) {\n\t\t\tthis._setupHostListeners();\n\t\t}\n\t\tthis._setupPresenceListener();\n\t\tthis._setupSignalingPeerTracking();\n\t\tthis._setupRelayDataListener();\n\t\t// Re-join the server-side room whenever the signaling socket\n\t\t// reconnects (e.g. after a DO hibernation wake-up). Otherwise the\n\t\t// server would not know we're in this room until the 30 s\n\t\t// heartbeat ticks, and broadcasts during that window would skip us.\n\t\tpeer.on(\"reconnected\" as any, this._onSignalingReconnected);\n\n\t\tpeer.joinRoom(this._roomId);\n\t\tthis._startRoomJoinHeartbeat();\n\t}\n\n\tprivate readonly _onSignalingReconnected = (): void => {\n\t\tif (this._peer && this._joined) {\n\t\t\tthis._peer.joinRoom(this._roomId);\n\t\t\t// Also re-broadcast current presence so other peers' views\n\t\t\t// reflect our state immediately instead of on our next update.\n\t\t\tconst current = this._presence.myPresence;\n\t\t\tif (current && Object.keys(current).length > 0) {\n\t\t\t\tthis._peer.socket.send({\n\t\t\t\t\ttype: ServerMessageType.PresenceUpdate,\n\t\t\t\t\troom: this._roomId,\n\t\t\t\t\tpayload: current,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\n\tprivate _setupHostListeners(): void {\n\t\tif (!this._peer) return;\n\n\t\tthis._peer.on(\"connection\", (conn: DataConnection) => {\n\t\t\tconst remotePeerId = conn.peer;\n\t\t\tthis._connections.set(remotePeerId, conn);\n\t\t\tthis._knownPeers.add(remotePeerId);\n\n\t\t\tconn.on(\"open\", () => {\n\t\t\t\tthis.emit(\"peerJoined\", remotePeerId);\n\n\t\t\t\t// Notify existing clients about the new peer\n\t\t\t\tfor (const [peerId, c] of this._connections) {\n\t\t\t\t\tif (peerId !== remotePeerId && c.open) {\n\t\t\t\t\t\tc.send({ __room: { type: \"peer-joined\", peerId: remotePeerId } });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Inform the new peer about existing peers\n\t\t\t\tconn.send({\n\t\t\t\t\t__room: {\n\t\t\t\t\t\ttype: \"peer-list\",\n\t\t\t\t\t\tpeers: this.peers,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t});\n\n\t\t\tconn.on(\"data\", (data: unknown) => {\n\t\t\t\tthis._handleIncomingData(remotePeerId, data);\n\t\t\t});\n\n\t\t\tconn.on(\"close\", () => {\n\t\t\t\tthis._connections.delete(remotePeerId);\n\t\t\t\tthis._knownPeers.delete(remotePeerId);\n\t\t\t\tthis._presence.handleLeave(remotePeerId);\n\t\t\t\t// Fail outstanding broadcastWithAck promises targeting this\n\t\t\t\t// peer immediately; otherwise they stall to the full\n\t\t\t\t// timeout after the transport already knows they're gone.\n\t\t\t\tthis._ackManager.rejectAllForPeer(remotePeerId);\n\n\t\t\t\t// Notify remaining clients about the departed peer\n\t\t\t\tfor (const c of this._connections.values()) {\n\t\t\t\t\tif (c.open) {\n\t\t\t\t\t\tc.send({ __room: { type: \"peer-left\", peerId: remotePeerId } });\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tthis.emit(\"peerLeft\", remotePeerId);\n\t\t\t});\n\t\t});\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Internal: client path\n\t// -----------------------------------------------------------------------\n\n\tprivate _joinAsClient(): void {\n\t\t// Create peer with server-assigned ID\n\t\tconst peer = new this._DendriCtor!(\"\", this._dendriOptions!);\n\n\t\tpeer.once(\"open\", () => {\n\t\t\tthis._postJoinSetup(peer, false);\n\n\t\t\t// Attempt WebRTC connection to host for lower latency.\n\t\t\tconst conn = peer.connect(this._roomId);\n\t\t\tif (conn) {\n\t\t\t\tthis._connections.set(this._roomId, conn);\n\n\t\t\t\tconn.on(\"data\", (data: unknown) => {\n\t\t\t\t\tthis._handleIncomingData(this._roomId!, data);\n\t\t\t\t});\n\n\t\t\t\tconn.on(\"close\", () => {\n\t\t\t\t\tthis._connections.delete(this._roomId);\n\t\t\t\t\tthis._handleHostDisconnect();\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Emit joined immediately — the signaling relay ensures data\n\t\t\t// can flow even if WebRTC never connects (e.g. behind a VPN).\n\t\t\tthis._knownPeers.add(this._roomId);\n\t\t\tthis.emit(\"joined\", peer.id!, false);\n\t\t});\n\n\t\tpeer.once(\"error\", (err) => {\n\t\t\tthis.emit(\"error\", err);\n\t\t});\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Internal: host migration\n\t// -----------------------------------------------------------------------\n\n\t/**\n\t * Called when the client detects the host has disconnected.\n\t * Elects a new host deterministically (lowest alphabetical peer ID).\n\t */\n\tprivate _handleHostDisconnect(): void {\n\t\tif (!this._peer?.id) return;\n\n\t\tconst oldHostId = this._hostId;\n\n\t\t// Remove the departed host from known peers and emit peerLeft\n\t\tif (oldHostId && this._knownPeers.has(oldHostId)) {\n\t\t\tthis._knownPeers.delete(oldHostId);\n\t\t\tthis._presence.handleLeave(oldHostId);\n\t\t\tthis._ackManager.rejectAllForPeer(oldHostId);\n\t\t\tthis.emit(\"peerLeft\", oldHostId);\n\t\t}\n\n\t\tconst remainingPeers = Array.from(this._knownPeers);\n\n\t\tconst newHostId = electNewHost(this._peer.id, remainingPeers);\n\t\tthis._hostId = newHostId;\n\n\t\tthis.emit(\"hostChanged\", newHostId);\n\n\t\tif (newHostId === this._peer.id) {\n\t\t\tthis._becomeHost();\n\t\t} else {\n\t\t\tthis._connectToNewHost(newHostId);\n\t\t}\n\t}\n\n\t/**\n\t * This peer won the election. Tear down the old peer and create a new\n\t * one using the room ID so other peers can find us.\n\t */\n\tprivate _becomeHost(): void {\n\t\tconst oldPeer = this._peer;\n\t\tif (oldPeer) {\n\t\t\toldPeer.destroy();\n\t\t}\n\n\t\tthis._connections.clear();\n\t\t// Reset joined so _postJoinSetup runs the full wiring from scratch.\n\t\t// Heartbeat, presence, relay, and signaling tracking all need fresh\n\t\t// listeners on the new peer.\n\t\tthis._joined = false;\n\t\tthis._stopRoomJoinHeartbeat();\n\n\t\tconst peer = new this._DendriCtor!(this._roomId, this._dendriOptions!);\n\n\t\tpeer.once(\"open\", () => {\n\t\t\tthis._postJoinSetup(peer, true);\n\t\t\t// Migration happened — no \"joined\" emit (it was emitted on\n\t\t\t// initial join), but the app may care that we now host.\n\t\t});\n\n\t\tpeer.once(\"error\", (err) => {\n\t\t\t// Split-brain: two survivors elected themselves simultaneously\n\t\t\t// and both tried to claim the room ID. The loser falls back to\n\t\t\t// joining as a client so the room heals instead of dying.\n\t\t\tif (err.type === \"unavailable-id\") {\n\t\t\t\tpeer.destroy();\n\t\t\t\tthis._isHost = false;\n\t\t\t\tthis._joinAsClient();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.emit(\"error\", err);\n\t\t});\n\t}\n\n\t/**\n\t * Another peer won the election. Wait for it to claim the room ID,\n\t * then connect.\n\t */\n\tprivate _connectToNewHost(hostId: string): void {\n\t\tthis._clearMigrationTimer();\n\n\t\tthis._migrationTimer = setTimeout(() => {\n\t\t\t// The elected host never came online. Drop them from known\n\t\t\t// peers and re-run election with the remaining candidates\n\t\t\t// instead of surfacing a dead-end error. Without this the\n\t\t\t// room stalls until the app calls leave()+join().\n\t\t\tif (this._knownPeers.has(hostId)) {\n\t\t\t\tthis._knownPeers.delete(hostId);\n\t\t\t\tthis._presence.handleLeave(hostId);\n\t\t\t\tthis._ackManager.rejectAllForPeer(hostId);\n\t\t\t\tthis.emit(\"peerLeft\", hostId);\n\t\t\t}\n\n\t\t\tif (this._knownPeers.size === 0 && this._peer?.id) {\n\t\t\t\t// Only self remains — become host.\n\t\t\t\tthis._handleHostDisconnect();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (this._peer?.id) {\n\t\t\t\t// Re-elect with remaining peers.\n\t\t\t\tthis._handleHostDisconnect();\n\t\t\t} else {\n\t\t\t\tthis.emit(\n\t\t\t\t\t\"error\",\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t`Host migration timed out after ${this._migrationTimeout}ms waiting for ${hostId}`,\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t}, this._migrationTimeout);\n\n\t\t// The new host needs time to register with the room ID.\n\t\t// Retry connecting on a short interval.\n\t\tthis._retryConnect(hostId, 0);\n\t}\n\n\tprivate _retryConnect(hostId: string, attempts: number): void {\n\t\tconst MAX_RETRIES = 10;\n\t\tconst RETRY_DELAY = 1_000;\n\n\t\tif (!this._peer || attempts >= MAX_RETRIES) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst conn = this._peer.connect(hostId);\n\t\tif (!conn) return;\n\n\t\tconn.on(\"open\", () => {\n\t\t\tthis._clearMigrationTimer();\n\t\t\tthis._connections.set(hostId, conn);\n\n\t\t\tconn.on(\"data\", (data: unknown) => {\n\t\t\t\tthis._handleIncomingData(hostId, data);\n\t\t\t});\n\n\t\t\tconn.on(\"close\", () => {\n\t\t\t\tthis._connections.delete(hostId);\n\t\t\t\tthis._handleHostDisconnect();\n\t\t\t});\n\t\t});\n\n\t\tconn.on(\"error\", () => {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._retryConnect(hostId, attempts + 1);\n\t\t\t}, RETRY_DELAY);\n\t\t});\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Internal: data routing\n\t// -----------------------------------------------------------------------\n\n\tprivate _handleIncomingData(fromPeerId: string, data: unknown): void {\n\t\t// Check for internal room protocol messages\n\t\tif (this._isRoomProtocol(data)) {\n\t\t\tthis._handleRoomProtocol(fromPeerId, data);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle ACK responses from peers.\n\t\tif (this._isAckResponse(data)) {\n\t\t\tthis._ackManager.handleAck(data.__ackResponse);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle RPC responses — resolve pending performRpc calls.\n\t\tif (isRpcResponse(data)) {\n\t\t\tthis._rpc.handleResponse(data);\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle RPC requests — execute handler and send response back.\n\t\tif (isRpcRequest(data)) {\n\t\t\tvoid this._rpc.handleRequest(data).then((response) => {\n\t\t\t\tthis._sendToPeer(fromPeerId, response);\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\t// Handle incoming data with __ackId — send ACK back to sender.\n\t\tif (this._isAckRequest(data)) {\n\t\t\tconst conn = this._connections.get(fromPeerId);\n\t\t\tif (conn?.open) {\n\t\t\t\tconn.send({ __ackResponse: data.__ackId });\n\t\t\t}\n\t\t\t// Replace data with the unwrapped inner payload for downstream processing.\n\t\t\tdata = data.data;\n\t\t}\n\n\t\t// If we're the host, relay to all other peers (pass raw wire data)\n\t\tif (this._isHost) {\n\t\t\tfor (const [peerId, conn] of this._connections) {\n\t\t\t\tif (peerId !== fromPeerId && conn.open) {\n\t\t\t\t\tconn.send(data);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Unwrap topic envelope and dispatch through TopicManager\n\t\tif (isTopicEnvelope(data)) {\n\t\t\tconst payload =\n\t\t\t\tdata.__binary === true && typeof data.__data === \"string\"\n\t\t\t\t\t? base64ToBytes(data.__data)\n\t\t\t\t\t: data.__data;\n\t\t\tthis._topics.dispatch(data.__topic, payload, fromPeerId);\n\t\t\tthis.emit(\"data\", fromPeerId, payload);\n\t\t} else {\n\t\t\tthis._topics.dispatch(undefined, data, fromPeerId);\n\t\t\tthis.emit(\"data\", fromPeerId, data);\n\t\t}\n\t}\n\n\tprivate _isAckRequest(data: unknown): data is { __ackId: string; data: unknown } {\n\t\treturn (\n\t\t\ttypeof data === \"object\" &&\n\t\t\tdata !== null &&\n\t\t\t\"__ackId\" in data &&\n\t\t\ttypeof (data as Record<string, unknown>).__ackId === \"string\"\n\t\t);\n\t}\n\n\tprivate _isAckResponse(data: unknown): data is { __ackResponse: string } {\n\t\treturn (\n\t\t\ttypeof data === \"object\" &&\n\t\t\tdata !== null &&\n\t\t\t\"__ackResponse\" in data &&\n\t\t\ttypeof (data as Record<string, unknown>).__ackResponse === \"string\"\n\t\t);\n\t}\n\n\tprivate _isRoomProtocol(\n\t\tdata: unknown,\n\t): data is { __room: { type: string; peers?: string[]; peerId?: string } } {\n\t\treturn (\n\t\t\ttypeof data === \"object\" &&\n\t\t\tdata !== null &&\n\t\t\t\"__room\" in data &&\n\t\t\ttypeof (data as Record<string, unknown>).__room === \"object\"\n\t\t);\n\t}\n\n\tprivate _handleRoomProtocol(\n\t\t_fromPeerId: string,\n\t\tdata: { __room: { type: string; peers?: string[]; peerId?: string } },\n\t): void {\n\t\tconst msg = data.__room;\n\n\t\tif (msg.type === \"peer-list\" && Array.isArray(msg.peers)) {\n\t\t\tfor (const peerId of msg.peers) {\n\t\t\t\tif (peerId !== this._peer?.id && !this._knownPeers.has(peerId)) {\n\t\t\t\t\tthis._knownPeers.add(peerId);\n\t\t\t\t\tthis.emit(\"peerJoined\", peerId);\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (msg.type === \"peer-joined\" && msg.peerId) {\n\t\t\tif (msg.peerId !== this._peer?.id && !this._knownPeers.has(msg.peerId)) {\n\t\t\t\tthis._knownPeers.add(msg.peerId);\n\t\t\t\tthis.emit(\"peerJoined\", msg.peerId);\n\t\t\t}\n\t\t} else if (msg.type === \"peer-left\" && msg.peerId) {\n\t\t\tif (this._knownPeers.has(msg.peerId)) {\n\t\t\t\tthis._knownPeers.delete(msg.peerId);\n\t\t\t\tthis._presence.handleLeave(msg.peerId);\n\t\t\t\tthis.emit(\"peerLeft\", msg.peerId);\n\t\t\t}\n\t\t}\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Internal: presence\n\t// -----------------------------------------------------------------------\n\n\t/**\n\t * Hook up the underlying Dendri peer's presenceUpdate event so incoming\n\t * server-side presence broadcasts are routed to the PresenceManager.\n\t */\n\tprivate _setupPresenceListener(): void {\n\t\tif (!this._peer) return;\n\n\t\tthis._peer.on(\"presenceUpdate\" as any, (peerId: string, room: string, data: unknown) => {\n\t\t\tif (room === this._roomId && peerId !== this._peer?.id) {\n\t\t\t\tthis._presence.handleUpdate(peerId, data as Record<string, unknown>);\n\t\t\t}\n\t\t});\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Internal: signaling relay data listener\n\t// -----------------------------------------------------------------------\n\n\t/**\n\t * Listen for relay DATA messages from the signaling server (room fan-out).\n\t * This is the fallback path when WebRTC connections can't be established\n\t * (e.g. behind a VPN or restrictive firewall).\n\t */\n\tprivate _setupRelayDataListener(): void {\n\t\tif (!this._peer) return;\n\n\t\tthis._peer.on(\"relayData\" as any, (peerId: string, payload: unknown, room: string) => {\n\t\t\tif (room !== this._roomId) return;\n\t\t\tif (peerId === this._peer?.id) return; // ignore own messages\n\n\t\t\t// Track peers we see via relay\n\t\t\tif (!this._knownPeers.has(peerId)) {\n\t\t\t\tthis._knownPeers.add(peerId);\n\t\t\t\tthis.emit(\"peerJoined\", peerId);\n\t\t\t}\n\n\t\t\tthis._handleIncomingData(peerId, payload);\n\t\t});\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Internal: signaling-based peer tracking\n\t// -----------------------------------------------------------------------\n\n\t/**\n\t * Listen for ROOM-PEERS messages from the signaling server and merge them\n\t * into `_knownPeers`. This ensures the peer count stays accurate even when\n\t * WebRTC connections fail (e.g. behind a VPN or restrictive firewall).\n\t *\n\t * WebRTC-connected peers are always trusted. Peers that only appear in the\n\t * signaling list are added as \"signaling-only\" so the UI reflects the\n\t * correct room membership.\n\t */\n\tprivate _setupSignalingPeerTracking(): void {\n\t\tif (!this._peer) return;\n\n\t\tthis._peer.on(\"roomPeers\" as any, (room: string, peers: string[]) => {\n\t\t\tif (room !== this._roomId) return;\n\n\t\t\tconst myId = this._peer?.id;\n\t\t\tif (!myId) return;\n\n\t\t\tconst remotePeerSet = new Set(peers.filter((id) => id !== myId));\n\n\t\t\t// Add peers the signaling server knows about that we don't yet.\n\t\t\tfor (const peerId of remotePeerSet) {\n\t\t\t\tif (!this._knownPeers.has(peerId)) {\n\t\t\t\t\tthis._knownPeers.add(peerId);\n\t\t\t\t\tthis.emit(\"peerJoined\", peerId);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove peers absent from signaling AND without an active connection.\n\t\t\tfor (const peerId of this._knownPeers) {\n\t\t\t\tif (!remotePeerSet.has(peerId)) {\n\t\t\t\t\tconst conn = this._connections.get(peerId);\n\t\t\t\t\tif (!conn?.open) {\n\t\t\t\t\t\tthis._knownPeers.delete(peerId);\n\t\t\t\t\t\tthis._presence.handleLeave(peerId);\n\t\t\t\t\t\tthis.emit(\"peerLeft\", peerId);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Internal: helpers\n\t// -----------------------------------------------------------------------\n\n\t/**\n\t * Send data directly to a specific peer.\n\t * If host: send via the direct connection.\n\t * If client: send via the host connection (host relays).\n\t */\n\tprivate _sendToPeer(peerId: string, data: unknown): void {\n\t\tconst conn = this._connections.get(peerId);\n\t\tif (conn?.open) {\n\t\t\tconn.send(data);\n\t\t\treturn;\n\t\t}\n\n\t\t// If we're a client the only connection is to the host.\n\t\t// Send to the host and let it relay.\n\t\tif (!this._isHost && this._hostId) {\n\t\t\tconst hostConn = this._connections.get(this._hostId);\n\t\t\tif (hostConn?.open) {\n\t\t\t\thostConn.send(data);\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate _clearMigrationTimer(): void {\n\t\tif (this._migrationTimer) {\n\t\t\tclearTimeout(this._migrationTimer);\n\t\t\tthis._migrationTimer = null;\n\t\t}\n\t}\n\n\t/**\n\t * Periodically re-send ROOM-JOIN to the signaling server so room\n\t * membership survives server-side state loss (e.g. DO hibernation).\n\t */\n\tprivate _startRoomJoinHeartbeat(): void {\n\t\tthis._stopRoomJoinHeartbeat();\n\t\tthis._roomJoinInterval = setInterval(() => {\n\t\t\tif (this._peer && this._joined) {\n\t\t\t\tthis._peer.joinRoom(this._roomId);\n\t\t\t}\n\t\t}, 30_000);\n\t}\n\n\tprivate _stopRoomJoinHeartbeat(): void {\n\t\tif (this._roomJoinInterval) {\n\t\t\tclearInterval(this._roomJoinInterval);\n\t\t\tthis._roomJoinInterval = null;\n\t\t}\n\t}\n}\n","/**\n * Host migration utilities for star topology rooms.\n *\n * When the host disconnects, the peer with the lowest alphabetical ID\n * among all remaining peers becomes the new host. This is deterministic:\n * every peer arrives at the same answer independently.\n */\n\nexport interface HostMigrationOptions {\n\treadonly roomId: string;\n\treadonly myPeerId: string;\n\treadonly knownPeers: readonly string[];\n\treadonly onBecomeHost: () => void;\n\treadonly onNewHost: (hostId: string) => void;\n\treadonly migrationTimeout?: number;\n}\n\n/**\n * Elect a new host from the given set of peer IDs.\n * Deterministic: the lowest alphabetical ID always wins.\n *\n * @param myPeerId - The local peer's ID.\n * @param peerIds - All other known peer IDs (excluding the departed host).\n * @returns The peer ID that should become the new host.\n */\nexport function electNewHost(myPeerId: string, peerIds: readonly string[]): string {\n\tconst candidates = [...peerIds, myPeerId].sort();\n\treturn candidates[0];\n}\n","import { EventEmitter } from \"eventemitter3\";\n\nexport interface PresenceEvents<T> {\n\tupdate: (peerId: string, data: T) => void;\n\tjoin: (peerId: string, data: T) => void;\n\tleave: (peerId: string) => void;\n\tsync: (presences: ReadonlyMap<string, T>) => void;\n}\n\n/**\n * Manages per-peer presence state for a room.\n *\n * Each peer can set arbitrary typed state that is broadcast to all room\n * members. Incoming updates are stored and exposed via getters; lifecycle\n * events (join, update, leave, sync) are emitted for subscribers.\n */\nexport class PresenceManager<T = Record<string, unknown>> extends EventEmitter<PresenceEvents<T>> {\n\tprivate readonly _presences = new Map<string, T>();\n\tprivate _myPresence: T | null = null;\n\tprivate _myPeerId: string | null = null;\n\n\t/** Set (or merge) my own presence data. */\n\tsetMyPresence(data: Partial<T>): void {\n\t\tthis._myPresence = {\n\t\t\t...((this._myPresence ?? {}) as T),\n\t\t\t...data,\n\t\t} as T;\n\n\t\tif (this._myPeerId) {\n\t\t\tthis._presences.set(this._myPeerId, this._myPresence);\n\t\t\tthis.emit(\"update\", this._myPeerId, this._myPresence);\n\t\t}\n\t}\n\n\t/** Get a specific peer's presence. */\n\tgetPresence(peerId: string): T | undefined {\n\t\treturn this._presences.get(peerId);\n\t}\n\n\t/** Get all presences excluding this peer. */\n\tgetOthers(): Map<string, T> {\n\t\tconst others = new Map(this._presences);\n\t\tif (this._myPeerId) {\n\t\t\tothers.delete(this._myPeerId);\n\t\t}\n\t\treturn others;\n\t}\n\n\t/** Get all presences (including self). */\n\tgetAll(): Map<string, T> {\n\t\treturn new Map(this._presences);\n\t}\n\n\t/** Handle an incoming presence update from a remote peer. */\n\thandleUpdate(peerId: string, data: T): void {\n\t\tconst isNew = !this._presences.has(peerId);\n\t\tthis._presences.set(peerId, data);\n\n\t\tif (isNew) {\n\t\t\tthis.emit(\"join\", peerId, data);\n\t\t}\n\t\tthis.emit(\"update\", peerId, data);\n\t}\n\n\t/** Handle a peer leaving — remove their presence. */\n\thandleLeave(peerId: string): void {\n\t\tif (this._presences.has(peerId)) {\n\t\t\tthis._presences.delete(peerId);\n\t\t\tthis.emit(\"leave\", peerId);\n\t\t}\n\t}\n\n\t/** Set this peer's ID (called by Room on join). */\n\tsetMyPeerId(id: string): void {\n\t\tthis._myPeerId = id;\n\t}\n\n\t/** Clear all presences and local state. */\n\tclear(): void {\n\t\tthis._presences.clear();\n\t\tthis._myPresence = null;\n\t\tthis._myPeerId = null;\n\t}\n\n\t/** The local peer's current presence, or null if not yet set. */\n\tget myPresence(): T | null {\n\t\treturn this._myPresence;\n\t}\n\n\t/** Number of tracked presences (including self if set). */\n\tget size(): number {\n\t\treturn this._presences.size;\n\t}\n}\n","/**\n * RPC (Remote Procedure Call) layer for request-response patterns over P2P connections.\n *\n * Inspired by LiveKit's `performRpc`/`registerRpcMethod`, this module enables\n * peers to expose named methods that other peers can call and await results.\n *\n * Usage (via Room):\n * // Responder\n * room.registerRpcMethod(\"greet\", (payload) => `Hello, ${payload}!`);\n *\n * // Caller\n * const result = await room.performRpc(\"greet\", \"world\");\n * // result === \"Hello, world!\"\n */\n\nexport interface RpcRequest {\n\treadonly __rpc: true;\n\treadonly id: string;\n\treadonly method: string;\n\treadonly payload: unknown;\n\treadonly sender: string;\n}\n\nexport interface RpcResponse {\n\treadonly __rpc_response: true;\n\treadonly id: string;\n\treadonly result?: unknown;\n\treadonly error?: { readonly code: number; readonly message: string };\n}\n\nexport type RpcHandler = (payload: unknown, sender: string) => unknown | Promise<unknown>;\n\n/** Standard RPC error codes (inspired by LiveKit). */\nexport enum RpcErrorCode {\n\tAPPLICATION_ERROR = 1500,\n\tCONNECTION_TIMEOUT = 1501,\n\tRESPONSE_TIMEOUT = 1502,\n\tRECIPIENT_DISCONNECTED = 1503,\n\tRESPONSE_PAYLOAD_TOO_LARGE = 1504,\n\tMETHOD_NOT_FOUND = 1505,\n}\n\nexport class RpcError extends Error {\n\treadonly code: number;\n\n\tconstructor(code: number, message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"RpcError\";\n\t\tthis.code = code;\n\t}\n}\n\ninterface PendingRpc {\n\treadonly resolve: (result: unknown) => void;\n\treadonly reject: (err: RpcError) => void;\n\treadonly timer: ReturnType<typeof setTimeout>;\n}\n\nexport class RpcManager {\n\tprivate readonly _handlers = new Map<string, RpcHandler>();\n\tprivate readonly _pending = new Map<string, PendingRpc>();\n\tprivate _counter = 0;\n\n\t/** Register a method handler. Returns an unregister function. */\n\tregisterMethod(name: string, handler: RpcHandler): () => void {\n\t\tthis._handlers.set(name, handler);\n\t\treturn () => {\n\t\t\tthis._handlers.delete(name);\n\t\t};\n\t}\n\n\t/** Perform an RPC call -- returns a promise that resolves with the response. */\n\tperformRpc(\n\t\tmethod: string,\n\t\tpayload: unknown,\n\t\tsendFn: (data: RpcRequest) => void,\n\t\toptions?: { readonly timeout?: number },\n\t): Promise<unknown> {\n\t\tconst id = `rpc_${++this._counter}_${Date.now()}`;\n\t\tconst timeout = options?.timeout ?? 10_000;\n\n\t\treturn new Promise<unknown>((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tthis._pending.delete(id);\n\t\t\t\treject(new RpcError(RpcErrorCode.RESPONSE_TIMEOUT, `RPC timeout: ${method}`));\n\t\t\t}, timeout);\n\n\t\t\tthis._pending.set(id, { resolve, reject, timer });\n\n\t\t\tsendFn({\n\t\t\t\t__rpc: true,\n\t\t\t\tid,\n\t\t\t\tmethod,\n\t\t\t\tpayload,\n\t\t\t\tsender: \"\", // filled by the caller (e.g. Room)\n\t\t\t});\n\t\t});\n\t}\n\n\t/** Handle an incoming RPC request -- execute handler and return response. */\n\tasync handleRequest(request: RpcRequest): Promise<RpcResponse> {\n\t\tconst handler = this._handlers.get(request.method);\n\n\t\tif (!handler) {\n\t\t\treturn {\n\t\t\t\t__rpc_response: true,\n\t\t\t\tid: request.id,\n\t\t\t\terror: {\n\t\t\t\t\tcode: RpcErrorCode.METHOD_NOT_FOUND,\n\t\t\t\t\tmessage: `Method not found: ${request.method}`,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = await handler(request.payload, request.sender);\n\t\t\treturn { __rpc_response: true, id: request.id, result };\n\t\t} catch (err: unknown) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\tconst code = err instanceof RpcError ? err.code : RpcErrorCode.APPLICATION_ERROR;\n\t\t\treturn {\n\t\t\t\t__rpc_response: true,\n\t\t\t\tid: request.id,\n\t\t\t\terror: { code, message },\n\t\t\t};\n\t\t}\n\t}\n\n\t/** Handle an incoming RPC response -- resolve the pending promise. */\n\thandleResponse(response: RpcResponse): boolean {\n\t\tconst pending = this._pending.get(response.id);\n\n\t\tif (!pending) {\n\t\t\treturn false;\n\t\t}\n\n\t\tclearTimeout(pending.timer);\n\t\tthis._pending.delete(response.id);\n\n\t\tif (response.error) {\n\t\t\tpending.reject(new RpcError(response.error.code, response.error.message));\n\t\t} else {\n\t\t\tpending.resolve(response.result);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t/** Clear all pending RPCs, rejecting them with CONNECTION_TIMEOUT. */\n\tclear(): void {\n\t\tfor (const [, pending] of this._pending) {\n\t\t\tclearTimeout(pending.timer);\n\t\t\tpending.reject(new RpcError(RpcErrorCode.CONNECTION_TIMEOUT, \"Connection closed\"));\n\t\t}\n\t\tthis._pending.clear();\n\t}\n\n\t/** Number of RPCs currently awaiting a response. */\n\tget pendingCount(): number {\n\t\treturn this._pending.size;\n\t}\n\n\t/** Names of all registered RPC methods. */\n\tget registeredMethods(): string[] {\n\t\treturn Array.from(this._handlers.keys());\n\t}\n}\n\n/** Type guard for RPC request messages. */\nexport function isRpcRequest(data: unknown): data is RpcRequest {\n\treturn (\n\t\ttypeof data === \"object\" &&\n\t\tdata !== null &&\n\t\t\"__rpc\" in data &&\n\t\t(data as Record<string, unknown>).__rpc === true\n\t);\n}\n\n/** Type guard for RPC response messages. */\nexport function isRpcResponse(data: unknown): data is RpcResponse {\n\treturn (\n\t\ttypeof data === \"object\" &&\n\t\tdata !== null &&\n\t\t\"__rpc_response\" in data &&\n\t\t(data as Record<string, unknown>).__rpc_response === true\n\t);\n}\n","/**\n * Framework-agnostic reactive store factory for Dendri Room.\n *\n * Works with any UI framework. Provides a subscribe-based reactivity model\n * (similar to Svelte stores or Zustand) that can be consumed by:\n *\n * - **Svelte 5**: Wrap getters in `$derived` or read in `$effect`\n * - **React**: Use `useSyncExternalStore` with `store.subscribe`\n * - **Vue**: Use `watchEffect` over store getters\n * - **Vanilla JS**: Call `store.subscribe` directly\n *\n * @example\n * ```ts\n * import { Dendri } from \"dendri\";\n * import { createDendriStore } from \"dendri/store\";\n *\n * const store = createDendriStore({\n * DendriCtor: Dendri,\n * dendriOptions: { host: \"localhost\", port: 9000, secure: false, path: \"/\" },\n * });\n *\n * store.join(\"my-room\");\n * store.subscribe(() => console.log(\"peers:\", store.peers));\n * ```\n */\n\nimport { Dendri as DefaultDendri, type Dendri, type DendriOptions } from \"./dendri\";\nimport { ConnectionState } from \"./enums\";\nimport type { PresenceEvents } from \"./presence\";\nimport { Room, type RoomOptions } from \"./room\";\n\n/** Options passed to {@link createDendriStore} in advanced form. */\nexport interface DendriStoreOptions {\n\t/**\n\t * The Dendri constructor to use for creating peer instances. When\n\t * omitted the default {@link Dendri} class is used. Overriding is\n\t * useful for injecting a mock in tests.\n\t */\n\treadonly DendriCtor?: new (\n\t\tid: string,\n\t\topts?: DendriOptions,\n\t) => Dendri;\n\t/** Options forwarded to the Dendri constructor on each join. */\n\treadonly dendriOptions?: DendriOptions;\n\t/** Optional Room-level options (e.g. migration timeout). */\n\treadonly roomOptions?: RoomOptions;\n}\n\n/**\n * `createDendriStore` accepts either the advanced {@link DendriStoreOptions}\n * shape or a flat {@link DendriOptions} object. Pass an explicit signaling\n * server host so open-source/self-hosted apps connect to their own server.\n */\nexport type CreateDendriStoreInput = DendriStoreOptions | DendriOptions;\n\nfunction isAdvancedOptions(input: CreateDendriStoreInput | undefined): input is DendriStoreOptions {\n\treturn (\n\t\t!!input &&\n\t\ttypeof input === \"object\" &&\n\t\t(\"DendriCtor\" in input || \"dendriOptions\" in input || \"roomOptions\" in input)\n\t);\n}\n\n/** Snapshot of the store's reactive state at a given point in time. */\nexport interface DendriStoreSnapshot {\n\treadonly connectionState: ConnectionState;\n\treadonly isHost: boolean;\n\treadonly myPeerId: string | null;\n\treadonly hostId: string | null;\n\treadonly peers: readonly string[];\n\treadonly peerCount: number;\n\treadonly presences: ReadonlyMap<string, unknown>;\n}\n\n/** Listener callback for store state changes. */\nexport type StoreListener = () => void;\n\n/**\n * A framework-agnostic reactive wrapper around a Dendri {@link Room}.\n *\n * State is accessed via getters. External frameworks react to changes\n * by subscribing with {@link DendriStore.subscribe}.\n */\nexport interface DendriStore {\n\t// -----------------------------------------------------------------------\n\t// Reactive state (read via getters)\n\t// -----------------------------------------------------------------------\n\n\t/** Current connection lifecycle state. */\n\treadonly connectionState: ConnectionState;\n\t/** Whether this peer is the current room host. */\n\treadonly isHost: boolean;\n\t/** The local peer's ID, or `null` before joining. */\n\treadonly myPeerId: string | null;\n\t/** The current host's peer ID, or `null` before joining. */\n\treadonly hostId: string | null;\n\t/** All known remote peer IDs in the room. */\n\treadonly peers: readonly string[];\n\t/** Number of known remote peers. */\n\treadonly peerCount: number;\n\t/** Map of remote peer presences. */\n\treadonly presences: ReadonlyMap<string, unknown>;\n\n\t// -----------------------------------------------------------------------\n\t// Actions\n\t// -----------------------------------------------------------------------\n\n\t/** Join a room by ID. Creates a new Room internally. */\n\tjoin(roomId: string): void;\n\t/** Leave the current room and clean up. */\n\tleave(): void;\n\t/** Broadcast data to all room peers, optionally on a topic. */\n\tbroadcast(data: unknown, options?: { readonly topic?: string }): void;\n\t/** Broadcast a binary payload tagged with a topic. Receivers see a Uint8Array. */\n\tbroadcastBinary(bytes: Uint8Array, options: { readonly topic: string }): void;\n\t/** Broadcast with delivery confirmation. */\n\tbroadcastWithAck(data: unknown, timeout?: number): Promise<void>;\n\t/** Set this peer's presence data. */\n\tsetPresence(data: Record<string, unknown>): void;\n\n\t// -----------------------------------------------------------------------\n\t// Events — register callbacks that fire on room lifecycle events\n\t// -----------------------------------------------------------------------\n\n\t/** Register a callback for when a remote peer joins. Returns unsubscribe fn. */\n\tonPeerJoin(handler: (peerId: string) => void): () => void;\n\t/** Register a callback for when a remote peer leaves. Returns unsubscribe fn. */\n\tonPeerLeave(handler: (peerId: string) => void): () => void;\n\t/** Register a callback for all incoming data. Returns unsubscribe fn. */\n\tonData(handler: (data: unknown, peerId: string) => void): () => void;\n\t/** Register a callback for presence updates. Returns unsubscribe fn. */\n\tonPresenceUpdate(handler: PresenceEvents<Record<string, unknown>>[\"update\"]): () => void;\n\t/** Register a callback for host changes. Returns unsubscribe fn. */\n\tonHostChanged(handler: (hostId: string) => void): () => void;\n\n\t// -----------------------------------------------------------------------\n\t// Framework integration\n\t// -----------------------------------------------------------------------\n\n\t/**\n\t * Subscribe to state changes. The listener is called whenever reactive\n\t * state changes. Returns an unsubscribe function.\n\t *\n\t * Compatible with React's `useSyncExternalStore`, Svelte's `$effect`,\n\t * and any callback-based reactivity system.\n\t */\n\tsubscribe: {\n\t\t// Overload 1: topic subscription (matches Room.subscribe)\n\t\t(topic: string, handler: (data: unknown, peerId: string) => void): () => void;\n\t\t// Overload 2: state-change listener (for framework reactivity)\n\t\t(listener: StoreListener): () => void;\n\t};\n\n\t/**\n\t * Get an immutable snapshot of the current state.\n\t * Compatible with React's `useSyncExternalStore` (getSnapshot).\n\t */\n\tgetSnapshot(): DendriStoreSnapshot;\n\n\t// -----------------------------------------------------------------------\n\t// Cleanup\n\t// -----------------------------------------------------------------------\n\n\t/** Leave the room and remove all listeners. */\n\tdestroy(): void;\n}\n\n/**\n * Create a framework-agnostic reactive store wrapping a Dendri Room.\n *\n * Accepts three calling shapes:\n *\n * ```ts\n * // 1. Flat DendriOptions (passthrough to the Dendri constructor)\n * const store = createDendriStore({ host: \"localhost\", port: 9000, secure: false });\n *\n * // 2. Advanced — inject a custom Dendri class (for tests / mocks)\n * const store = createDendriStore({\n * DendriCtor: MyDendri,\n * dendriOptions: { secure: true },\n * roomOptions: { migrationTimeout: 5000 },\n * });\n * ```\n *\n * @param input - Configuration containing an explicit signaling server host.\n * @returns A {@link DendriStore} instance.\n */\nexport function createDendriStore(input?: CreateDendriStoreInput): DendriStore {\n\tconst advanced = isAdvancedOptions(input);\n\tconst DendriCtor: new (id: string, opts?: DendriOptions) => Dendri =\n\t\t(advanced ? input.DendriCtor : undefined) ??\n\t\t(DefaultDendri as unknown as new (\n\t\t\tid: string,\n\t\t\topts?: DendriOptions,\n\t\t) => Dendri);\n\tconst dendriOptions = (advanced\n\t\t? (input.dendriOptions ?? {})\n\t\t: ((input as DendriOptions | undefined) ?? {})) as DendriOptions;\n\tconst roomOptions: RoomOptions | undefined = advanced ? input.roomOptions : undefined;\n\n\tlet room: Room | null = null;\n\n\t// -----------------------------------------------------------------------\n\t// Internal mutable state — exposed via getters\n\t// -----------------------------------------------------------------------\n\n\tlet _connectionState: ConnectionState = ConnectionState.Initialized;\n\tlet _isHost = false;\n\tlet _myPeerId: string | null = null;\n\tlet _hostId: string | null = null;\n\tlet _peers: readonly string[] = [];\n\tlet _presences: ReadonlyMap<string, unknown> = new Map();\n\n\t// -----------------------------------------------------------------------\n\t// Listener bookkeeping\n\t// -----------------------------------------------------------------------\n\n\tconst _listeners = new Set<StoreListener>();\n\n\t/** Topic subscriptions registered before join() — replayed on the Room once created. */\n\tconst _pendingTopicSubs: { topic: string; handler: (data: unknown, peerId: string) => void }[] =\n\t\t[];\n\n\t// Room-event handlers registered before join() are queued so they actually\n\t// fire on the eventual Room instance. Previously the on/off pair was a\n\t// no-op that returned a no-op unsubscriber, making the API look wired\n\t// but silently dropping every event.\n\tconst _pendingPeerJoin: ((peerId: string) => void)[] = [];\n\tconst _pendingPeerLeave: ((peerId: string) => void)[] = [];\n\tconst _pendingHostChanged: ((hostId: string) => void)[] = [];\n\tconst _pendingPresenceUpdate: PresenceEvents<Record<string, unknown>>[\"update\"][] = [];\n\n\t/** Cached snapshot — invalidated on every notify(). */\n\tlet _snapshot: DendriStoreSnapshot | null = null;\n\n\tfunction notify(): void {\n\t\t_snapshot = null; // invalidate\n\t\tfor (const fn of _listeners) {\n\t\t\tfn();\n\t\t}\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Actions\n\t// -----------------------------------------------------------------------\n\n\tfunction join(roomId: string): void {\n\t\tif (room !== null) {\n\t\t\tleave();\n\t\t}\n\n\t\troom = new Room(roomId, roomOptions);\n\n\t\t// Replay any topic subscriptions that were registered before join().\n\t\tfor (const { topic, handler } of _pendingTopicSubs) {\n\t\t\troom.subscribe(topic, handler);\n\t\t}\n\t\t_pendingTopicSubs.length = 0;\n\n\t\t// Replay room-event handlers queued before join().\n\t\tfor (const h of _pendingPeerJoin) room.on(\"peerJoined\", h);\n\t\t_pendingPeerJoin.length = 0;\n\t\tfor (const h of _pendingPeerLeave) room.on(\"peerLeft\", h);\n\t\t_pendingPeerLeave.length = 0;\n\t\tfor (const h of _pendingHostChanged) room.on(\"hostChanged\", h);\n\t\t_pendingHostChanged.length = 0;\n\t\tfor (const h of _pendingPresenceUpdate) room.presence.on(\"update\", h);\n\t\t_pendingPresenceUpdate.length = 0;\n\n\t\t// Capture the room instance for closures so late-firing callbacks\n\t\t// that arrive after leave()/destroy() can bail out safely.\n\t\tconst currentRoom = room;\n\n\t\tcurrentRoom.on(\"joined\", (peerId, isHost) => {\n\t\t\tif (room !== currentRoom) return;\n\t\t\t_myPeerId = peerId;\n\t\t\t_isHost = isHost;\n\t\t\t_hostId = currentRoom.hostId;\n\t\t\t_connectionState = ConnectionState.Connected;\n\t\t\t_peers = currentRoom.peers;\n\t\t\tnotify();\n\t\t});\n\n\t\tcurrentRoom.on(\"peerJoined\", () => {\n\t\t\tif (room !== currentRoom) return;\n\t\t\t_peers = currentRoom.peers;\n\t\t\tnotify();\n\t\t});\n\n\t\tcurrentRoom.on(\"peerLeft\", () => {\n\t\t\tif (room !== currentRoom) return;\n\t\t\t_peers = currentRoom.peers;\n\t\t\t_presences = currentRoom.getOthers();\n\t\t\tnotify();\n\t\t});\n\n\t\tcurrentRoom.on(\"hostChanged\", (newHostId) => {\n\t\t\tif (room !== currentRoom) return;\n\t\t\t_hostId = newHostId;\n\t\t\t_isHost = currentRoom.isHost;\n\t\t\tnotify();\n\t\t});\n\n\t\tcurrentRoom.on(\"error\", () => {\n\t\t\tif (room !== currentRoom) return;\n\t\t\t_connectionState = ConnectionState.Failed;\n\t\t\tnotify();\n\t\t});\n\n\t\tcurrentRoom.presence.on(\"update\", () => {\n\t\t\tif (room !== currentRoom) return;\n\t\t\t_presences = currentRoom.getOthers();\n\t\t\tnotify();\n\t\t});\n\n\t\t_connectionState = ConnectionState.Connecting;\n\t\tnotify();\n\n\t\troom.join(DendriCtor, dendriOptions);\n\t}\n\n\tfunction leave(): void {\n\t\tif (room !== null) {\n\t\t\troom.leave();\n\t\t\troom = null;\n\t\t}\n\n\t\t_connectionState = ConnectionState.Closed;\n\t\t_isHost = false;\n\t\t_myPeerId = null;\n\t\t_hostId = null;\n\t\t_peers = [];\n\t\t_presences = new Map();\n\t\tnotify();\n\t}\n\n\tfunction broadcast(data: unknown, opts?: { readonly topic?: string }): void {\n\t\troom?.broadcast(data, opts);\n\t}\n\n\tfunction broadcastBinary(\n\t\tbytes: Uint8Array,\n\t\topts: { readonly topic: string },\n\t): void {\n\t\troom?.broadcastBinary(bytes, opts);\n\t}\n\n\tfunction broadcastWithAck(data: unknown, timeout?: number): Promise<void> {\n\t\treturn room?.broadcastWithAck(data, timeout) ?? Promise.resolve();\n\t}\n\n\tfunction setPresence(data: Record<string, unknown>): void {\n\t\troom?.setPresence(data);\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Event registration helpers\n\t// -----------------------------------------------------------------------\n\n\tfunction onPeerJoin(handler: (peerId: string) => void): () => void {\n\t\tif (room) {\n\t\t\troom.on(\"peerJoined\", handler);\n\t\t} else {\n\t\t\t_pendingPeerJoin.push(handler);\n\t\t}\n\t\treturn () => {\n\t\t\tif (room) {\n\t\t\t\troom.off(\"peerJoined\", handler);\n\t\t\t} else {\n\t\t\t\tconst idx = _pendingPeerJoin.indexOf(handler);\n\t\t\t\tif (idx !== -1) _pendingPeerJoin.splice(idx, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction onPeerLeave(handler: (peerId: string) => void): () => void {\n\t\tif (room) {\n\t\t\troom.on(\"peerLeft\", handler);\n\t\t} else {\n\t\t\t_pendingPeerLeave.push(handler);\n\t\t}\n\t\treturn () => {\n\t\t\tif (room) {\n\t\t\t\troom.off(\"peerLeft\", handler);\n\t\t\t} else {\n\t\t\t\tconst idx = _pendingPeerLeave.indexOf(handler);\n\t\t\t\tif (idx !== -1) _pendingPeerLeave.splice(idx, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction onData(handler: (data: unknown, peerId: string) => void): () => void {\n\t\treturn room?.onData(handler) ?? (() => {});\n\t}\n\n\tfunction onPresenceUpdate(\n\t\thandler: PresenceEvents<Record<string, unknown>>[\"update\"],\n\t): () => void {\n\t\tif (room) {\n\t\t\troom.presence.on(\"update\", handler);\n\t\t} else {\n\t\t\t_pendingPresenceUpdate.push(handler);\n\t\t}\n\t\treturn () => {\n\t\t\tif (room) {\n\t\t\t\troom.presence.off(\"update\", handler);\n\t\t\t} else {\n\t\t\t\tconst idx = _pendingPresenceUpdate.indexOf(handler);\n\t\t\t\tif (idx !== -1) _pendingPresenceUpdate.splice(idx, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\tfunction onHostChanged(handler: (hostId: string) => void): () => void {\n\t\tif (room) {\n\t\t\troom.on(\"hostChanged\", handler);\n\t\t} else {\n\t\t\t_pendingHostChanged.push(handler);\n\t\t}\n\t\treturn () => {\n\t\t\tif (room) {\n\t\t\t\troom.off(\"hostChanged\", handler);\n\t\t\t} else {\n\t\t\t\tconst idx = _pendingHostChanged.indexOf(handler);\n\t\t\t\tif (idx !== -1) _pendingHostChanged.splice(idx, 1);\n\t\t\t}\n\t\t};\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Framework integration\n\t// -----------------------------------------------------------------------\n\n\tfunction subscribeFn(\n\t\ttopicOrListener: string | StoreListener,\n\t\thandler?: (data: unknown, peerId: string) => void,\n\t): () => void {\n\t\t// Overload 1: topic subscription\n\t\tif (typeof topicOrListener === \"string\" && handler !== undefined) {\n\t\t\tif (room !== null) {\n\t\t\t\treturn room.subscribe(topicOrListener, handler);\n\t\t\t}\n\t\t\t// Room not created yet — queue the subscription for replay in join().\n\t\t\tconst entry = { topic: topicOrListener, handler };\n\t\t\t_pendingTopicSubs.push(entry);\n\t\t\treturn () => {\n\t\t\t\tconst idx = _pendingTopicSubs.indexOf(entry);\n\t\t\t\tif (idx !== -1) {\n\t\t\t\t\t_pendingTopicSubs.splice(idx, 1);\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\n\t\t// Overload 2: state-change listener\n\t\tif (typeof topicOrListener === \"function\") {\n\t\t\t_listeners.add(topicOrListener);\n\t\t\treturn () => {\n\t\t\t\t_listeners.delete(topicOrListener);\n\t\t\t};\n\t\t}\n\n\t\treturn () => {};\n\t}\n\n\tfunction getSnapshot(): DendriStoreSnapshot {\n\t\tif (_snapshot !== null) {\n\t\t\treturn _snapshot;\n\t\t}\n\n\t\t_snapshot = {\n\t\t\tconnectionState: _connectionState,\n\t\t\tisHost: _isHost,\n\t\t\tmyPeerId: _myPeerId,\n\t\t\thostId: _hostId,\n\t\t\tpeers: _peers,\n\t\t\tpeerCount: _peers.length,\n\t\t\tpresences: _presences,\n\t\t};\n\n\t\treturn _snapshot;\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Cleanup\n\t// -----------------------------------------------------------------------\n\n\tfunction destroy(): void {\n\t\tif (room !== null) {\n\t\t\troom.leave();\n\t\t\troom = null;\n\t\t}\n\n\t\t_connectionState = ConnectionState.Closed;\n\t\t_isHost = false;\n\t\t_myPeerId = null;\n\t\t_hostId = null;\n\t\t_peers = [];\n\t\t_presences = new Map();\n\t\t_listeners.clear();\n\t\t_snapshot = null;\n\t}\n\n\t// -----------------------------------------------------------------------\n\t// Public API\n\t// -----------------------------------------------------------------------\n\n\treturn {\n\t\tget connectionState() {\n\t\t\treturn _connectionState;\n\t\t},\n\t\tget isHost() {\n\t\t\treturn _isHost;\n\t\t},\n\t\tget myPeerId() {\n\t\t\treturn _myPeerId;\n\t\t},\n\t\tget hostId() {\n\t\t\treturn _hostId;\n\t\t},\n\t\tget peers() {\n\t\t\treturn _peers;\n\t\t},\n\t\tget peerCount() {\n\t\t\treturn _peers.length;\n\t\t},\n\t\tget presences() {\n\t\t\treturn _presences;\n\t\t},\n\n\t\tjoin,\n\t\tleave,\n\t\tbroadcast,\n\t\tbroadcastBinary,\n\t\tbroadcastWithAck,\n\t\tsetPresence,\n\n\t\tonPeerJoin,\n\t\tonPeerLeave,\n\t\tonData,\n\t\tonPresenceUpdate,\n\t\tonHostChanged,\n\n\t\tsubscribe: subscribeFn as DendriStore[\"subscribe\"],\n\t\tgetSnapshot,\n\t\tdestroy,\n\t};\n}\n"]}
|