{"version":3,"sources":["../../../../node_modules/ms/index.js","../../../../node_modules/debug/src/common.js","../../../../node_modules/debug/src/browser.js","../../../../../node_modules/has-flag/index.js","../../../../../node_modules/supports-color/index.js","../../../../node_modules/debug/src/node.js","../../../../node_modules/debug/src/index.js","../../../../node_modules/agent-base/src/helpers.ts","../../../../node_modules/agent-base/src/index.ts","../../../../node_modules/https-proxy-agent/src/parse-proxy-response.ts","../../../../node_modules/https-proxy-agent/src/index.ts","../src/client.ts","../src/proto.ts"],"sourcesContent":["/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isFinite(val)) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'weeks':\n    case 'week':\n    case 'w':\n      return n * w;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (msAbs >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (msAbs >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (msAbs >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return plural(ms, msAbs, d, 'day');\n  }\n  if (msAbs >= h) {\n    return plural(ms, msAbs, h, 'hour');\n  }\n  if (msAbs >= m) {\n    return plural(ms, msAbs, m, 'minute');\n  }\n  if (msAbs >= s) {\n    return plural(ms, msAbs, s, 'second');\n  }\n  return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n  var isPlural = msAbs >= n * 1.5;\n  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug') || exports.storage.getItem('DEBUG') ;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","'use strict';\n\nmodule.exports = (flag, argv = process.argv) => {\n\tconst prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--');\n\tconst position = argv.indexOf(prefix + flag);\n\tconst terminatorPosition = argv.indexOf('--');\n\treturn position !== -1 && (terminatorPosition === -1 || position < terminatorPosition);\n};\n","'use strict';\nconst os = require('os');\nconst tty = require('tty');\nconst hasFlag = require('has-flag');\n\nconst {env} = process;\n\nlet forceColor;\nif (hasFlag('no-color') ||\n\thasFlag('no-colors') ||\n\thasFlag('color=false') ||\n\thasFlag('color=never')) {\n\tforceColor = 0;\n} else if (hasFlag('color') ||\n\thasFlag('colors') ||\n\thasFlag('color=true') ||\n\thasFlag('color=always')) {\n\tforceColor = 1;\n}\n\nif ('FORCE_COLOR' in env) {\n\tif (env.FORCE_COLOR === 'true') {\n\t\tforceColor = 1;\n\t} else if (env.FORCE_COLOR === 'false') {\n\t\tforceColor = 0;\n\t} else {\n\t\tforceColor = env.FORCE_COLOR.length === 0 ? 1 : Math.min(parseInt(env.FORCE_COLOR, 10), 3);\n\t}\n}\n\nfunction translateLevel(level) {\n\tif (level === 0) {\n\t\treturn false;\n\t}\n\n\treturn {\n\t\tlevel,\n\t\thasBasic: true,\n\t\thas256: level >= 2,\n\t\thas16m: level >= 3\n\t};\n}\n\nfunction supportsColor(haveStream, streamIsTTY) {\n\tif (forceColor === 0) {\n\t\treturn 0;\n\t}\n\n\tif (hasFlag('color=16m') ||\n\t\thasFlag('color=full') ||\n\t\thasFlag('color=truecolor')) {\n\t\treturn 3;\n\t}\n\n\tif (hasFlag('color=256')) {\n\t\treturn 2;\n\t}\n\n\tif (haveStream && !streamIsTTY && forceColor === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst min = forceColor || 0;\n\n\tif (env.TERM === 'dumb') {\n\t\treturn min;\n\t}\n\n\tif (process.platform === 'win32') {\n\t\t// Windows 10 build 10586 is the first Windows release that supports 256 colors.\n\t\t// Windows 10 build 14931 is the first release that supports 16m/TrueColor.\n\t\tconst osRelease = os.release().split('.');\n\t\tif (\n\t\t\tNumber(osRelease[0]) >= 10 &&\n\t\t\tNumber(osRelease[2]) >= 10586\n\t\t) {\n\t\t\treturn Number(osRelease[2]) >= 14931 ? 3 : 2;\n\t\t}\n\n\t\treturn 1;\n\t}\n\n\tif ('CI' in env) {\n\t\tif (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE'].some(sign => sign in env) || env.CI_NAME === 'codeship') {\n\t\t\treturn 1;\n\t\t}\n\n\t\treturn min;\n\t}\n\n\tif ('TEAMCITY_VERSION' in env) {\n\t\treturn /^(9\\.(0*[1-9]\\d*)\\.|\\d{2,}\\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0;\n\t}\n\n\tif (env.COLORTERM === 'truecolor') {\n\t\treturn 3;\n\t}\n\n\tif ('TERM_PROGRAM' in env) {\n\t\tconst version = parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10);\n\n\t\tswitch (env.TERM_PROGRAM) {\n\t\t\tcase 'iTerm.app':\n\t\t\t\treturn version >= 3 ? 3 : 2;\n\t\t\tcase 'Apple_Terminal':\n\t\t\t\treturn 2;\n\t\t\t// No default\n\t\t}\n\t}\n\n\tif (/-256(color)?$/i.test(env.TERM)) {\n\t\treturn 2;\n\t}\n\n\tif (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) {\n\t\treturn 1;\n\t}\n\n\tif ('COLORTERM' in env) {\n\t\treturn 1;\n\t}\n\n\treturn min;\n}\n\nfunction getSupportLevel(stream) {\n\tconst level = supportsColor(stream, stream && stream.isTTY);\n\treturn translateLevel(level);\n}\n\nmodule.exports = {\n\tsupportsColor: getSupportLevel,\n\tstdout: translateLevel(supportsColor(true, tty.isatty(1))),\n\tstderr: translateLevel(supportsColor(true, tty.isatty(2)))\n};\n","/**\n * Module dependencies.\n */\n\nconst tty = require('tty');\nconst util = require('util');\n\n/**\n * This is the Node.js implementation of `debug()`.\n */\n\nexports.init = init;\nexports.log = log;\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.destroy = util.deprecate(\n\t() => {},\n\t'Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.'\n);\n\n/**\n * Colors.\n */\n\nexports.colors = [6, 2, 3, 4, 5, 1];\n\ntry {\n\t// Optional dependency (as in, doesn't need to be installed, NOT like optionalDependencies in package.json)\n\t// eslint-disable-next-line import/no-extraneous-dependencies\n\tconst supportsColor = require('supports-color');\n\n\tif (supportsColor && (supportsColor.stderr || supportsColor).level >= 2) {\n\t\texports.colors = [\n\t\t\t20,\n\t\t\t21,\n\t\t\t26,\n\t\t\t27,\n\t\t\t32,\n\t\t\t33,\n\t\t\t38,\n\t\t\t39,\n\t\t\t40,\n\t\t\t41,\n\t\t\t42,\n\t\t\t43,\n\t\t\t44,\n\t\t\t45,\n\t\t\t56,\n\t\t\t57,\n\t\t\t62,\n\t\t\t63,\n\t\t\t68,\n\t\t\t69,\n\t\t\t74,\n\t\t\t75,\n\t\t\t76,\n\t\t\t77,\n\t\t\t78,\n\t\t\t79,\n\t\t\t80,\n\t\t\t81,\n\t\t\t92,\n\t\t\t93,\n\t\t\t98,\n\t\t\t99,\n\t\t\t112,\n\t\t\t113,\n\t\t\t128,\n\t\t\t129,\n\t\t\t134,\n\t\t\t135,\n\t\t\t148,\n\t\t\t149,\n\t\t\t160,\n\t\t\t161,\n\t\t\t162,\n\t\t\t163,\n\t\t\t164,\n\t\t\t165,\n\t\t\t166,\n\t\t\t167,\n\t\t\t168,\n\t\t\t169,\n\t\t\t170,\n\t\t\t171,\n\t\t\t172,\n\t\t\t173,\n\t\t\t178,\n\t\t\t179,\n\t\t\t184,\n\t\t\t185,\n\t\t\t196,\n\t\t\t197,\n\t\t\t198,\n\t\t\t199,\n\t\t\t200,\n\t\t\t201,\n\t\t\t202,\n\t\t\t203,\n\t\t\t204,\n\t\t\t205,\n\t\t\t206,\n\t\t\t207,\n\t\t\t208,\n\t\t\t209,\n\t\t\t214,\n\t\t\t215,\n\t\t\t220,\n\t\t\t221\n\t\t];\n\t}\n} catch (error) {\n\t// Swallow - we only care if `supports-color` is available; it doesn't have to be.\n}\n\n/**\n * Build up the default `inspectOpts` object from the environment variables.\n *\n *   $ DEBUG_COLORS=no DEBUG_DEPTH=10 DEBUG_SHOW_HIDDEN=enabled node script.js\n */\n\nexports.inspectOpts = Object.keys(process.env).filter(key => {\n\treturn /^debug_/i.test(key);\n}).reduce((obj, key) => {\n\t// Camel-case\n\tconst prop = key\n\t\t.substring(6)\n\t\t.toLowerCase()\n\t\t.replace(/_([a-z])/g, (_, k) => {\n\t\t\treturn k.toUpperCase();\n\t\t});\n\n\t// Coerce string value into JS value\n\tlet val = process.env[key];\n\tif (/^(yes|on|true|enabled)$/i.test(val)) {\n\t\tval = true;\n\t} else if (/^(no|off|false|disabled)$/i.test(val)) {\n\t\tval = false;\n\t} else if (val === 'null') {\n\t\tval = null;\n\t} else {\n\t\tval = Number(val);\n\t}\n\n\tobj[prop] = val;\n\treturn obj;\n}, {});\n\n/**\n * Is stdout a TTY? Colored output is enabled when `true`.\n */\n\nfunction useColors() {\n\treturn 'colors' in exports.inspectOpts ?\n\t\tBoolean(exports.inspectOpts.colors) :\n\t\ttty.isatty(process.stderr.fd);\n}\n\n/**\n * Adds ANSI color escape codes if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\tconst {namespace: name, useColors} = this;\n\n\tif (useColors) {\n\t\tconst c = this.color;\n\t\tconst colorCode = '\\u001B[3' + (c < 8 ? c : '8;5;' + c);\n\t\tconst prefix = `  ${colorCode};1m${name} \\u001B[0m`;\n\n\t\targs[0] = prefix + args[0].split('\\n').join('\\n' + prefix);\n\t\targs.push(colorCode + 'm+' + module.exports.humanize(this.diff) + '\\u001B[0m');\n\t} else {\n\t\targs[0] = getDate() + name + ' ' + args[0];\n\t}\n}\n\nfunction getDate() {\n\tif (exports.inspectOpts.hideDate) {\n\t\treturn '';\n\t}\n\treturn new Date().toISOString() + ' ';\n}\n\n/**\n * Invokes `util.formatWithOptions()` with the specified arguments and writes to stderr.\n */\n\nfunction log(...args) {\n\treturn process.stderr.write(util.formatWithOptions(exports.inspectOpts, ...args) + '\\n');\n}\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\tif (namespaces) {\n\t\tprocess.env.DEBUG = namespaces;\n\t} else {\n\t\t// If you set a process.env field to null or undefined, it gets cast to the\n\t\t// string 'null' or 'undefined'. Just delete instead.\n\t\tdelete process.env.DEBUG;\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\n\nfunction load() {\n\treturn process.env.DEBUG;\n}\n\n/**\n * Init logic for `debug` instances.\n *\n * Create a new `inspectOpts` object in case `useColors` is set\n * differently for a particular `debug` instance.\n */\n\nfunction init(debug) {\n\tdebug.inspectOpts = {};\n\n\tconst keys = Object.keys(exports.inspectOpts);\n\tfor (let i = 0; i < keys.length; i++) {\n\t\tdebug.inspectOpts[keys[i]] = exports.inspectOpts[keys[i]];\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %o to `util.inspect()`, all on a single line.\n */\n\nformatters.o = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts)\n\t\t.split('\\n')\n\t\t.map(str => str.trim())\n\t\t.join(' ');\n};\n\n/**\n * Map %O to `util.inspect()`, allowing multiple lines if needed.\n */\n\nformatters.O = function (v) {\n\tthis.inspectOpts.colors = this.useColors;\n\treturn util.inspect(v, this.inspectOpts);\n};\n","/**\n * Detect Electron renderer / nwjs process, which is node, but we should\n * treat as a browser.\n */\n\nif (typeof process === 'undefined' || process.type === 'renderer' || process.browser === true || process.__nwjs) {\n\tmodule.exports = require('./browser.js');\n} else {\n\tmodule.exports = require('./node.js');\n}\n",null,null,null,null,"import { EventEmitter } from 'events';\r\nimport * as http from 'http';\r\nimport * as https from 'https';\r\nimport * as zlib from 'zlib';\r\nimport WebSocket from 'ws';\r\nimport type { TikTokLiveOptions, TikTokLiveEvents, RoomInfo, LiveEvent, StreamInfo } from './types.js';\r\nimport {\r\n    decodeProto,\r\n    getStr,\r\n    getBytes,\r\n    buildHeartbeat,\r\n    buildImEnterRoom,\r\n    buildAck,\r\n    parseWebcastResponse,\r\n} from './proto.js';\r\n\r\nconst DEFAULT_UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';\r\nconst DEFAULT_SIGN_SERVER = 'https://api.tik.tools';\r\n\r\nfunction httpGet(url: string, headers: Record<string, string>, agent?: any): Promise<{\r\n    status: number;\r\n    headers: http.IncomingHttpHeaders;\r\n    body: Buffer;\r\n}> {\r\n    return new Promise((resolve, reject) => {\r\n        const mod = url.startsWith('https') ? https : http;\r\n        const opts: any = { headers };\r\n        if (agent) opts.agent = agent;\r\n        const req = mod.get(url, opts, (res) => {\r\n            const chunks: Buffer[] = [];\r\n            const enc = res.headers['content-encoding'];\r\n            const stream = (enc === 'gzip' || enc === 'br')\r\n                ? res.pipe(enc === 'br' ? zlib.createBrotliDecompress() : zlib.createGunzip())\r\n                : res;\r\n            stream.on('data', (c: Buffer) => chunks.push(c));\r\n            stream.on('end', () => resolve({\r\n                status: res.statusCode || 0,\r\n                headers: res.headers,\r\n                body: Buffer.concat(chunks),\r\n            }));\r\n            stream.on('error', reject);\r\n        });\r\n        req.on('error', reject);\r\n        req.setTimeout(15_000, () => { req.destroy(); reject(new Error('Request timeout')); });\r\n    });\r\n}\r\n\r\nfunction getWsHost(clusterRegion: string): string {\r\n    if (!clusterRegion) return 'webcast-ws.tiktok.com';\r\n    const r = clusterRegion.toLowerCase();\r\n    if (r.startsWith('eu') || r.includes('eu')) return 'webcast-ws.eu.tiktok.com';\r\n    if (r.startsWith('us') || r.includes('us')) return 'webcast-ws.us.tiktok.com';\r\n    return 'webcast-ws.tiktok.com';\r\n}\r\n\r\nexport class TikTokLive extends EventEmitter {\r\n    private ws: WebSocket | null = null;\r\n    private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\r\n    private reconnectAttempts = 0;\r\n    private intentionalClose = false;\r\n    private _connected = false;\r\n    private _destroyed = false;\r\n    private _eventCount = 0;\r\n    private _roomId = '';\r\n    // Cache host identities from battle events for enriching battleArmies\r\n    // Bounded to MAX_BATTLE_HOSTS entries to prevent unbounded memory growth\r\n    private static readonly MAX_BATTLE_HOSTS = 50;\r\n    private _battleHosts = new Map<string, { id: string; nickname: string; uniqueId: string; profilePicture?: string }>();\r\n    // Track in-flight host resolution requests to avoid duplicate API calls\r\n    private _pendingHostResolves = new Set<string>();\r\n\r\n    private readonly uniqueId: string;\r\n    private readonly signServerUrl: string;\r\n    private readonly apiKey: string;\r\n    private readonly autoReconnect: boolean;\r\n    private readonly maxReconnectAttempts: number;\r\n    private readonly heartbeatInterval: number;\r\n    private readonly debug: boolean;\r\n    private readonly _presetRoomId: string;\r\n    private readonly _presetSessionId: string;\r\n    private readonly proxyUrl: string;\r\n    private readonly mode: 'direct' | 'relayed';\r\n\r\n    constructor(options: TikTokLiveOptions) {\r\n        super();\r\n        this.setMaxListeners(20); // Prevent memory leak warnings\r\n        this.uniqueId = options.uniqueId.replace(/^@/, '');\r\n        this.signServerUrl = (options.signServerUrl || DEFAULT_SIGN_SERVER).replace(/\\/$/, '');\r\n        if (!options.apiKey) throw new Error('apiKey is required. Get a free key at https://tik.tools');\r\n        this.apiKey = options.apiKey;\r\n        this.autoReconnect = options.autoReconnect ?? true;\r\n        this.maxReconnectAttempts = options.maxReconnectAttempts ?? 5;\r\n        this.heartbeatInterval = options.heartbeatInterval ?? 10_000;\r\n        this.debug = options.debug ?? false;\r\n        this._presetRoomId = options.roomId || '';\r\n        this._presetSessionId = options.sessionId || '';\r\n        this.proxyUrl = options.proxy || '';\r\n        this.mode = options.mode || 'direct';\r\n    }\r\n\r\n    /**\r\n     * Build an HttpsProxyAgent when `proxy` option is set, else undefined.\r\n     * Lazy-required so users without proxy don't pay the dependency cost.\r\n     */\r\n    private getProxyAgent(): any {\r\n        if (!this.proxyUrl) return undefined;\r\n        try {\r\n            // Lazy import — keeps https-proxy-agent optional for non-proxy users.\r\n            const { HttpsProxyAgent } = require('https-proxy-agent');\r\n            return new HttpsProxyAgent(this.proxyUrl);\r\n        } catch (e: any) {\r\n            throw new Error(\r\n                `proxy option requires 'https-proxy-agent' package. Install it: npm i https-proxy-agent`\r\n            );\r\n        }\r\n    }\r\n\r\n    async connect(): Promise<void> {\r\n        if (this._destroyed) throw new Error('Client has been destroyed. Create a new instance.');\r\n        this.intentionalClose = false;\r\n\r\n        // Relayed mode: skip TikTok credential dance, connect to TikTools' managed\r\n        // pool. We open the TikTok session from our rotated proxy fleet and forward\r\n        // decoded events as JSON. SDK consumers see the same `client.on(...)` API.\r\n        if (this.mode === 'relayed') {\r\n            return this._connectRelayed();\r\n        }\r\n\r\n        let ttwid = this._presetSessionId;\r\n        let roomId = this._presetRoomId;\r\n        let clusterRegion = '';\r\n        let preSignedUrl = '';\r\n        let preSignedCookies = '';\r\n        let preSignedUA = '';\r\n\r\n        if (roomId && ttwid) {\r\n            // Both pre-resolved â€” skip TikTok page fetch entirely\r\n            console.log(`[TikTokLive] Using preset roomId=${roomId} + sessionId (skip TikTok fetch)`);\r\n        } else if (roomId && !ttwid) {\r\n            // Have roomId but need ttwid â€” get it from sign server (proxied)\r\n            console.log(`[TikTokLive] Have roomId=${roomId}, fetching ttwid from sign server...`);\r\n            try {\r\n                const credResp = await fetch(`${this.signServerUrl}/webcast/ws_credentials`, {\r\n                    method: 'POST',\r\n                    headers: { 'Content-Type': 'application/json', 'x-api-key': this.apiKey },\r\n                    body: JSON.stringify({ unique_id: this.uniqueId, room_id: roomId }),\r\n                });\r\n                console.log(`[TikTokLive] ws_credentials response: ${credResp.status}`);\r\n                if (credResp.ok) {\r\n                    const credData = await credResp.json() as any;\r\n                    if (credData.status_code === 0 && credData.data?.signed_url) {\r\n                        // Use pre-signed URL + cookies directly â€” skip ttwid flow\r\n                        preSignedUrl = credData.data.signed_url;\r\n                        preSignedCookies = credData.data.cookies || '';\r\n                        preSignedUA = credData.data.user_agent || DEFAULT_UA;\r\n                        ttwid = '__presigned__'; // Sentinel to pass the ttwid check\r\n                        console.log(`[TikTokLive] âœ… Got pre-signed URL from sign server`);\r\n                    } else {\r\n                        console.log(`[TikTokLive] âš ï¸ ws_credentials bad response: ${JSON.stringify(credData).substring(0, 120)}`);\r\n                    }\r\n                }\r\n            } catch (e: any) { console.log(`[TikTokLive] âŒ ws_credentials failed: ${e.message}`); }\r\n            // Fallback: try direct TikTok fetch\r\n            if (!ttwid) {\r\n                console.log(`[TikTokLive] Fallback: direct TikTok fetch for ttwid...`);\r\n                try {\r\n                    const resp = await httpGet(`https://www.tiktok.com/@${this.uniqueId}/live`, {\r\n                        'User-Agent': DEFAULT_UA,\r\n                        'Accept': 'text/html',\r\n                    }, this.getProxyAgent());\r\n                    for (const sc of [resp.headers['set-cookie'] || []].flat()) {\r\n                        if (typeof sc === 'string' && sc.startsWith('ttwid=')) {\r\n                            ttwid = sc.split(';')[0].split('=').slice(1).join('=');\r\n                            break;\r\n                        }\r\n                    }\r\n                    console.log(`[TikTokLive] Direct fetch ttwid: ${ttwid ? 'âœ…' : 'âŒ none'}`);\r\n                } catch (e: any) { console.log(`[TikTokLive] âŒ Direct TikTok fetch failed: ${e.message}`); }\r\n            }\r\n        } else {\r\n            // No presets â€” try sign server first (works from VPS), then fall back to direct fetch\r\n            console.log(`[TikTokLive] No presets for @${this.uniqueId}. Resolving via sign server (${this.signServerUrl})...`);\r\n            // Step 1: Resolve roomId via sign server's /webcast/room_id (uses proxies)\r\n            try {\r\n                const roomResp = await fetch(`${this.signServerUrl}/webcast/room_id`, {\r\n                    method: 'POST',\r\n                    headers: { 'Content-Type': 'application/json', 'x-api-key': this.apiKey },\r\n                    body: JSON.stringify({ unique_id: this.uniqueId }),\r\n                });\r\n                console.log(`[TikTokLive] room_id response: ${roomResp.status}`);\r\n                if (roomResp.ok) {\r\n                    const roomData = await roomResp.json() as any;\r\n                    if (roomData.status_code === 0 && roomData.data?.room_id) {\r\n                        roomId = roomData.data.room_id;\r\n                        console.log(`[TikTokLive] âœ… Got roomId from sign server: ${roomId}`);\r\n                    } else {\r\n                        console.log(`[TikTokLive] âš ï¸ room_id response: ${JSON.stringify(roomData).substring(0, 120)}`);\r\n                    }\r\n                }\r\n            } catch (e: any) { console.log(`[TikTokLive] âŒ room_id request failed: ${e.message}`); }\r\n\r\n            // Step 2: Get ttwid via sign server's /webcast/ws_credentials\r\n            if (roomId) {\r\n                try {\r\n                    const credResp = await fetch(`${this.signServerUrl}/webcast/ws_credentials`, {\r\n                        method: 'POST',\r\n                        headers: { 'Content-Type': 'application/json', 'x-api-key': this.apiKey },\r\n                        body: JSON.stringify({ unique_id: this.uniqueId, room_id: roomId }),\r\n                    });\r\n                    console.log(`[TikTokLive] ws_credentials response: ${credResp.status}`);\r\n                    if (credResp.ok) {\r\n                        const credData = await credResp.json() as any;\r\n                        if (credData.data?.cookies) {\r\n                            const m = credData.data.cookies.match(/ttwid=([^;]+)/);\r\n                            if (m) { ttwid = m[1]; console.log(`[TikTokLive] âœ… Got ttwid from sign server`); }\r\n                            else console.log(`[TikTokLive] âš ï¸ No ttwid in cookies: ${credData.data.cookies.substring(0, 60)}`);\r\n                        } else {\r\n                            console.log(`[TikTokLive] âš ï¸ No cookies in ws_credentials: ${JSON.stringify(credData).substring(0, 120)}`);\r\n                        }\r\n                    }\r\n                } catch (e: any) { console.log(`[TikTokLive] âŒ ws_credentials failed: ${e.message}`); }\r\n            }\r\n\r\n            // Step 3: Fallback â€” direct TikTok page fetch (works on dev, blocked on most VPS)\r\n            if (!roomId || !ttwid) {\r\n                console.log(`[TikTokLive] Fallback: direct TikTok fetch (roomId=${roomId || 'none'}, ttwid=${ttwid ? 'yes' : 'none'})...`);\r\n                try {\r\n                    const resp = await httpGet(`https://www.tiktok.com/@${this.uniqueId}/live`, {\r\n                        'User-Agent': DEFAULT_UA,\r\n                        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',\r\n                        'Accept-Encoding': 'gzip, deflate, br',\r\n                        'Accept-Language': 'en-US,en;q=0.9',\r\n                    }, this.getProxyAgent());\r\n\r\n                    if (!ttwid) {\r\n                        for (const sc of [resp.headers['set-cookie'] || []].flat()) {\r\n                            if (typeof sc === 'string' && sc.startsWith('ttwid=')) {\r\n                                ttwid = sc.split(';')[0].split('=').slice(1).join('=');\r\n                                break;\r\n                            }\r\n                        }\r\n                    }\r\n\r\n                    if (!roomId) {\r\n                        const html = resp.body.toString();\r\n                        const sigiMatch = html.match(/id=\"SIGI_STATE\"[^>]*>([^<]+)/);\r\n                        if (sigiMatch) {\r\n                            try {\r\n                                const json = JSON.parse(sigiMatch[1]);\r\n                                const jsonStr = JSON.stringify(json);\r\n                                const m = jsonStr.match(/\"roomId\"\\s*:\\s*\"(\\d+)\"/);\r\n                                if (m) roomId = m[1];\r\n                            } catch { }\r\n                        }\r\n\r\n                        const crMatch = html.match(/\"clusterRegion\"\\s*:\\s*\"([^\"]+)\"/);\r\n                        clusterRegion = crMatch ? crMatch[1] : '';\r\n                    }\r\n                    console.log(`[TikTokLive] Direct fetch result: roomId=${roomId || 'none'}, ttwid=${ttwid ? 'yes' : 'none'}`);\r\n                } catch (e: any) { console.log(`[TikTokLive] âŒ Direct TikTok fetch failed: ${e.message}`); }\r\n            }\r\n        }\r\n\r\n        if (!ttwid) throw new Error('Failed to obtain session cookie');\r\n        if (!roomId) throw new Error(`User @${this.uniqueId} is not currently live`);\r\n        this._roomId = roomId;\r\n        const wsHost = getWsHost(clusterRegion);\r\n\r\n        const wsParams = new URLSearchParams({\r\n            version_code: '270000', device_platform: 'web', cookie_enabled: 'true',\r\n            screen_width: '1920', screen_height: '1080', browser_language: 'en-US',\r\n            browser_platform: 'Win32', browser_name: 'Mozilla',\r\n            browser_version: DEFAULT_UA.split('Mozilla/')[1] || '5.0',\r\n            browser_online: 'true', tz_name: Intl.DateTimeFormat().resolvedOptions().timeZone,\r\n            app_name: 'tiktok_web', sup_ws_ds_opt: '1', update_version_code: '2.0.0',\r\n            compress: 'gzip', webcast_language: 'en', ws_direct: '1', aid: '1988',\r\n            live_id: '12', app_language: 'en', client_enter: '1', room_id: roomId,\r\n            identity: 'audience', history_comment_count: '6', last_rtt: '0',\r\n            heartbeat_duration: '10000', resp_content_type: 'protobuf', did_rule: '3',\r\n        });\r\n\r\n        const rawWsUrl = `https://${wsHost}/webcast/im/ws_proxy/ws_reuse_supplement/?${wsParams}`;\r\n\r\n        const signUrl = `${this.signServerUrl}/webcast/sign_url`;\r\n\r\n        let wsUrl: string;\r\n        try {\r\n            const signResp = await fetch(signUrl, {\r\n                method: 'POST',\r\n                headers: {\r\n                    'Content-Type': 'application/json',\r\n                    'x-api-key': this.apiKey,\r\n                },\r\n                body: JSON.stringify({ url: rawWsUrl }),\r\n            });\r\n            const signData = await signResp.json() as Record<string, any>;\r\n\r\n            if (signData.status_code === 0 && signData.data?.signed_url) {\r\n                wsUrl = (signData.data.signed_url as string).replace(/^https:\\/\\//, 'wss://');\r\n            } else {\r\n                wsUrl = rawWsUrl.replace(/^https:\\/\\//, 'wss://');\r\n            }\r\n        } catch {\r\n            wsUrl = rawWsUrl.replace(/^https:\\/\\//, 'wss://');\r\n        }\r\n\r\n        return new Promise<void>((resolve, reject) => {\r\n            const finalWsUrl = preSignedUrl\r\n                ? preSignedUrl.replace(/^https:\\/\\//, 'wss://')\r\n                : wsUrl;\r\n            const finalHeaders = preSignedUrl\r\n                ? { 'User-Agent': preSignedUA, 'Cookie': preSignedCookies, 'Origin': 'https://www.tiktok.com' }\r\n                : { 'User-Agent': DEFAULT_UA, 'Cookie': `ttwid=${ttwid}`, 'Origin': 'https://www.tiktok.com' };\r\n            console.log(`[TikTokLive] Connecting WS: ${preSignedUrl ? 'pre-signed URL' : 'self-built URL'}`);\r\n            const proxyAgent = this.getProxyAgent();\r\n            this.ws = new WebSocket(finalWsUrl, {\r\n                headers: finalHeaders,\r\n                ...(proxyAgent ? { agent: proxyAgent } : {}),\r\n            });\r\n\r\n            this.ws.on('open', () => {\r\n                this._connected = true;\r\n                this.reconnectAttempts = 0;\r\n\r\n                this.ws!.send(buildHeartbeat(roomId));\r\n                this.ws!.send(buildImEnterRoom(roomId));\r\n                this.startHeartbeat(roomId);\r\n\r\n                const roomInfo: RoomInfo = {\r\n                    roomId,\r\n                    wsHost,\r\n                    clusterRegion,\r\n                    connectedAt: new Date().toISOString(),\r\n                };\r\n\r\n                this.emit('connected');\r\n                this.emit('roomInfo', roomInfo);\r\n                resolve();\r\n            });\r\n\r\n            this.ws.on('message', (rawData: Buffer) => {\r\n                this.handleFrame(Buffer.from(rawData));\r\n            });\r\n\r\n            this.ws.on('close', (code, reason) => {\r\n                const wasConnected = this._connected;\r\n                this._connected = false;\r\n                this.stopHeartbeat();\r\n\r\n                const reasonStr = reason?.toString() || '';\r\n                this.emit('disconnected', code, reasonStr);\r\n\r\n                // Only auto-reconnect if we WERE connected (connection drop, not initial 403 failure)\r\n                if (wasConnected && !this.intentionalClose && this.autoReconnect && this.reconnectAttempts < this.maxReconnectAttempts) {\r\n                    this.reconnectAttempts++;\r\n                    const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts - 1), 30_000);\r\n                    setTimeout(() => this.connect().catch(e => this.emit('error', e)), delay);\r\n                }\r\n            });\r\n\r\n            this.ws.on('error', (err) => {\r\n                // Only emit 'error' for connection drops (was connected).\r\n                // Initial 403 failures are handled via promise rejection.\r\n                if (this._connected) {\r\n                    this.emit('error', err);\r\n                }\r\n                if (!this._connected) reject(err);\r\n            });\r\n        });\r\n    }\r\n\r\n    disconnect(): void {\r\n        this.intentionalClose = true;\r\n        this.stopHeartbeat();\r\n        if (this.ws) {\r\n            this.ws.removeAllListeners();\r\n            this.ws.close(1000);\r\n            this.ws = null;\r\n        }\r\n        this._connected = false;\r\n    }\r\n\r\n    /**\r\n     * Fully destroy the client, releasing all resources and listeners.\r\n     * After calling destroy(), the instance cannot be reused â€” create a new one.\r\n     */\r\n    destroy(): void {\r\n        this.disconnect();\r\n        this._destroyed = true;\r\n        this._battleHosts.clear();\r\n        this._eventCount = 0;\r\n        this._roomId = '';\r\n        this.removeAllListeners();\r\n    }\r\n\r\n    get connected(): boolean {\r\n        return this._connected;\r\n    }\r\n\r\n    get destroyed(): boolean {\r\n        return this._destroyed;\r\n    }\r\n\r\n    get eventCount(): number {\r\n        return this._eventCount;\r\n    }\r\n\r\n    get roomId(): string {\r\n        return this._roomId;\r\n    }\r\n\r\n    /**\r\n     * Get live stream video URLs for a TikTok user.\r\n     * Returns FLV & HLS URLs segmented by quality (FULL_HD1, HD1, SD1, SD2).\r\n     * This is a standalone method â€” no WebSocket connection required.\r\n     * \r\n     * @example\r\n     * ```ts\r\n     * const stream = await TikTokLive.getStreamUrl({\r\n     *   uniqueId: 'username',\r\n     *   apiKey: 'your-api-key',\r\n     * });\r\n     * if (stream.alive) {\r\n     *   console.log(stream.streamUrls.HD1?.hls); // HLS URL for HD quality\r\n     *   console.log(stream.flvPullUrl);           // Best FLV URL\r\n     * }\r\n     * ```\r\n     */\r\n    static async getStreamUrl(options: {\r\n        uniqueId: string;\r\n        apiKey: string;\r\n        signServerUrl?: string;\r\n        quality?: string;\r\n    }): Promise<StreamInfo> {\r\n        const serverUrl = (options.signServerUrl || DEFAULT_SIGN_SERVER).replace(/\\/$/, '');\r\n\r\n        const resp = await fetch(`${serverUrl}/webcast/room_video`, {\r\n            method: 'POST',\r\n            headers: {\r\n                'Content-Type': 'application/json',\r\n                'x-api-key': options.apiKey,\r\n            },\r\n            body: JSON.stringify({ unique_id: options.uniqueId.replace(/^@/, '') }),\r\n        });\r\n\r\n        const data = await resp.json() as Record<string, any>;\r\n\r\n        if (data.status_code !== 0) {\r\n            throw new Error(data.error || 'Failed to get stream URL');\r\n        }\r\n\r\n        const d = data.data;\r\n        return {\r\n            roomId: d.room_id,\r\n            alive: d.alive ?? false,\r\n            streamUrls: d.stream_urls || {},\r\n            defaultQuality: d.default_quality || '',\r\n            flvPullUrl: d.flv_pull_url || undefined,\r\n            hlsPullUrl: d.hls_pull_url || undefined,\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Resolve a TikTok username to the streamer's full public profile —\r\n     * numeric user ID, secUid, nickname, bio, avatars, follower stats.\r\n     *\r\n     * Useful when you need the numeric TikTok ID for a username (the inverse\r\n     * of `resolve_user_ids`, which only goes userId → username).\r\n     *\r\n     * Requires Pro tier+. Cached server-side for 24h.\r\n     *\r\n     * @example\r\n     * ```ts\r\n     * const profile = await TikTokLive.getUserProfile({\r\n     *   uniqueId: 'dalga.ahmedov',\r\n     *   apiKey: 'YOUR_KEY',\r\n     * });\r\n     * console.log(profile.id);                    // \"7355610677036581896\" (numeric)\r\n     * console.log(profile.nickname);              // display name\r\n     * console.log(profile.stats.followerCount);   // 12345\r\n     * console.log(profile.avatarLarger);          // CDN URL\r\n     * ```\r\n     */\r\n    static async getUserProfile(options: {\r\n        uniqueId: string;\r\n        apiKey: string;\r\n        signServerUrl?: string;\r\n        /** Set `true` to bypass the 24h server cache (e.g. after the user updated their bio). */\r\n        nocache?: boolean;\r\n    }): Promise<{\r\n        id: string;\r\n        uniqueId: string;\r\n        secUid: string;\r\n        nickname: string;\r\n        signature: string;\r\n        verified: boolean;\r\n        avatarThumb: string;\r\n        avatarMedium: string;\r\n        avatarLarger: string;\r\n        stats: { followerCount: number; followingCount: number; heartCount: number; videoCount: number };\r\n    }> {\r\n        const serverUrl = (options.signServerUrl || DEFAULT_SIGN_SERVER).replace(/\\/$/, '');\r\n        const uname = options.uniqueId.replace(/^@/, '');\r\n        const qs = new URLSearchParams({ unique_id: uname });\r\n        if (options.nocache) qs.set('nocache', '1');\r\n\r\n        const resp = await fetch(`${serverUrl}/webcast/user_profile?${qs}`, {\r\n            headers: { 'x-api-key': options.apiKey },\r\n        });\r\n\r\n        const data = await resp.json() as Record<string, any>;\r\n        if (data.status_code !== 0 || !data.data?.profile) {\r\n            throw new Error(data.error || `Failed to get user profile for @${uname}`);\r\n        }\r\n        return data.data.profile;\r\n    }\r\n\r\n    /**\r\n     * Instance shortcut — fetch the profile of the streamer this client is\r\n     * connected to (or any other user if `uniqueId` is passed).\r\n     */\r\n    async getUserProfile(uniqueId?: string) {\r\n        return TikTokLive.getUserProfile({\r\n            uniqueId: uniqueId || this.uniqueId,\r\n            apiKey: this.apiKey,\r\n            signServerUrl: this.signServerUrl,\r\n        });\r\n    }\r\n\r\n    on<K extends keyof TikTokLiveEvents>(event: K, listener: TikTokLiveEvents[K]): this {\r\n        return super.on(event, listener as (...args: any[]) => void);\r\n    }\r\n\r\n    once<K extends keyof TikTokLiveEvents>(event: K, listener: TikTokLiveEvents[K]): this {\r\n        return super.once(event, listener as (...args: any[]) => void);\r\n    }\r\n\r\n    off<K extends keyof TikTokLiveEvents>(event: K, listener: TikTokLiveEvents[K]): this {\r\n        return super.off(event, listener as (...args: any[]) => void);\r\n    }\r\n\r\n    emit<K extends keyof TikTokLiveEvents>(event: K, ...args: Parameters<TikTokLiveEvents[K]>): boolean {\r\n        return super.emit(event, ...args);\r\n    }\r\n\r\n    private handleFrame(buf: Buffer): void {\r\n        try {\r\n            const fields = decodeProto(buf);\r\n            const idField = fields.find(f => f.fn === 2 && f.wt === 0);\r\n            const id = idField ? idField.value as bigint : 0n;\r\n            const type = getStr(fields, 7);\r\n            const binary = getBytes(fields, 8);\r\n\r\n            if (id > 0n && this.ws?.readyState === WebSocket.OPEN) {\r\n                this.ws.send(buildAck(id));\r\n            }\r\n\r\n            if (type === 'msg' && binary && binary.length > 0) {\r\n                let inner = binary;\r\n                if (inner.length > 2 && inner[0] === 0x1f && inner[1] === 0x8b) {\r\n                    try { inner = zlib.gunzipSync(inner); } catch { }\r\n                }\r\n\r\n                const events = parseWebcastResponse(inner);\r\n                for (const evt of events) {\r\n                    this._eventCount++;\r\n\r\n                    // Cache host identities from battle events (hosts are in users[])\r\n                    if (evt.type === 'battle') {\r\n                        for (const team of evt.teams) {\r\n                            const host = team.users.find(u => u.user.id === team.hostUserId);\r\n                            if (host) {\r\n                                this._battleHosts.set(team.hostUserId, host.user);\r\n                                team.hostUser = host.user;\r\n                            }\r\n                        }\r\n                        // Evict oldest entries if cache exceeds limit\r\n                        if (this._battleHosts.size > TikTokLive.MAX_BATTLE_HOSTS) {\r\n                            const excess = this._battleHosts.size - TikTokLive.MAX_BATTLE_HOSTS;\r\n                            const keys = [...this._battleHosts.keys()].slice(0, excess);\r\n                            for (const key of keys) this._battleHosts.delete(key);\r\n                        }\r\n                    }\r\n\r\n                    // Enrich battleArmies teams with cached host identities\r\n                    if (evt.type === 'battleArmies') {\r\n                        const unresolvedIds: string[] = [];\r\n                        for (const team of evt.teams) {\r\n                            const host = team.users.find(u => u.user.id === team.hostUserId);\r\n                            if (host) {\r\n                                team.hostUser = host.user;\r\n                                this._battleHosts.set(team.hostUserId, host.user);\r\n                            } else {\r\n                                const cached = this._battleHosts.get(team.hostUserId);\r\n                                if (cached) {\r\n                                    team.hostUser = cached;\r\n                                } else if (team.hostUserId && team.hostUserId !== '0') {\r\n                                    unresolvedIds.push(team.hostUserId);\r\n                                }\r\n                            }\r\n                        }\r\n                        // Defer emission until hosts are resolved\r\n                        if (unresolvedIds.length > 0) {\r\n                            this.resolveHostUsers(unresolvedIds, evt).catch(() => { });\r\n                            continue; // Don't emit yet â€” resolveHostUsers will emit after resolution\r\n                        }\r\n                    }\r\n\r\n                    this.emit('event', evt);\r\n                    this.emit(evt.type as keyof TikTokLiveEvents, evt as any);\r\n                }\r\n            }\r\n        } catch { }\r\n    }\r\n\r\n    /**\r\n     * Resolve unknown host user IDs via the sign server API.\r\n     * Caches results and re-emits the battleArmies event with enriched hostUser data.\r\n     */\r\n    private async resolveHostUsers(userIds: string[], originalEvt: LiveEvent): Promise<void> {\r\n        // Filter out IDs already being resolved\r\n        const toResolve = userIds.filter(id => !this._pendingHostResolves.has(id));\r\n        if (toResolve.length === 0) {\r\n            // All IDs being resolved â€” still emit the event as-is\r\n            this.emit('event', originalEvt);\r\n            this.emit(originalEvt.type as keyof TikTokLiveEvents, originalEvt as any);\r\n            return;\r\n        }\r\n        for (const id of toResolve) this._pendingHostResolves.add(id);\r\n\r\n        try {\r\n            const url = `${this.signServerUrl}/webcast/resolve_user_ids`;\r\n            const res = await fetch(url, {\r\n                method: 'POST',\r\n                headers: {\r\n                    'Content-Type': 'application/json',\r\n                    'x-api-key': this.apiKey,\r\n                },\r\n                body: JSON.stringify({ user_ids: toResolve }),\r\n                signal: AbortSignal.timeout(5000),\r\n            });\r\n\r\n            if (res.ok) {\r\n                const json = await res.json() as { data?: Record<string, { userId: string; username: string | null; nickname?: string | null; avatarUrl?: string | null }> };\r\n                if (json.data) {\r\n                    for (const [uid, info] of Object.entries(json.data)) {\r\n                        if (info.username) {\r\n                            const hostUser = {\r\n                                id: uid,\r\n                                uniqueId: info.username,\r\n                                nickname: info.nickname || info.username,\r\n                                profilePicture: info.avatarUrl || undefined,\r\n                            };\r\n                            this._battleHosts.set(uid, hostUser);\r\n                        }\r\n                    }\r\n\r\n                    // Enrich the original event with resolved hosts\r\n                    if (originalEvt.type === 'battleArmies') {\r\n                        for (const team of originalEvt.teams) {\r\n                            if (!team.hostUser) {\r\n                                const cached = this._battleHosts.get(team.hostUserId);\r\n                                if (cached) team.hostUser = cached;\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        } catch {\r\n            // Resolution failed â€” event will still be emitted below (unenriched)\r\n        } finally {\r\n            for (const id of toResolve) this._pendingHostResolves.delete(id);\r\n            // Always emit the event â€” enriched or not\r\n            this.emit('event', originalEvt);\r\n            this.emit(originalEvt.type as keyof TikTokLiveEvents, originalEvt as any);\r\n        }\r\n    }\r\n\r\n    private startHeartbeat(roomId: string): void {\r\n        this.stopHeartbeat();\r\n        this.heartbeatTimer = setInterval(() => {\r\n            if (this.ws?.readyState === WebSocket.OPEN) {\r\n                this.ws.send(buildHeartbeat(roomId));\r\n            }\r\n        }, this.heartbeatInterval);\r\n    }\r\n\r\n    private stopHeartbeat(): void {\r\n        if (this.heartbeatTimer) {\r\n            clearInterval(this.heartbeatTimer);\r\n            this.heartbeatTimer = null;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Relayed-mode connect. Opens a plain WebSocket to TikTools' managed relay\r\n     * endpoint. Events arrive pre-decoded as `{event, data}` JSON envelopes.\r\n     * The SDK re-emits them on the same event names as Direct mode so user\r\n     * code is identical regardless of mode.\r\n     */\r\n    private async _connectRelayed(): Promise<void> {\r\n        const host = this.signServerUrl\r\n            .replace(/^https:\\/\\//, 'wss://')\r\n            .replace(/^http:\\/\\//, 'ws://');\r\n        const wsUrl = `${host}/?uniqueId=${encodeURIComponent(this.uniqueId)}&apiKey=${encodeURIComponent(this.apiKey)}`;\r\n        if (this.debug) console.log(`[TikTokLive] Relayed mode: ${wsUrl.replace(this.apiKey, '***')}`);\r\n\r\n        return new Promise<void>((resolve, reject) => {\r\n            this.ws = new WebSocket(wsUrl);\r\n\r\n            let firstOpen = true;\r\n            this.ws.on('open', () => {\r\n                this._connected = true;\r\n                this.reconnectAttempts = 0;\r\n                if (firstOpen) { firstOpen = false; resolve(); }\r\n                this.emit('connected');\r\n            });\r\n\r\n            this.ws.on('message', (raw: Buffer) => {\r\n                try {\r\n                    const msg = JSON.parse(raw.toString());\r\n                    // Relay sometimes sends plain-text ping/pong heartbeats.\r\n                    if (typeof msg !== 'object' || !msg) return;\r\n                    const evName = msg.event;\r\n                    const evData = msg.data ?? msg;\r\n                    if (!evName) return;\r\n                    if (evName === 'connected' || evName === '_journal' || evName === 'ping' || evName === 'pong') return;\r\n                    if (evName === 'roomInfo') {\r\n                        const ri: RoomInfo = {\r\n                            roomId: evData.roomId || '',\r\n                            wsHost: evData.wsHost || '',\r\n                            clusterRegion: evData.clusterRegion || '',\r\n                            connectedAt: evData.connectedAt || new Date().toISOString(),\r\n                        };\r\n                        this.emit('roomInfo', ri);\r\n                        return;\r\n                    }\r\n                    // Re-emit decoded event under its native name.\r\n                    (this as any).emit(evName, evData);\r\n                    (this as any).emit('event', evData);\r\n                } catch { }\r\n            });\r\n\r\n            this.ws.on('close', (code: number, reason: Buffer) => {\r\n                this._connected = false;\r\n                const reasonStr = reason?.toString() || '';\r\n                this.emit('disconnected', code, reasonStr);\r\n                if (!this.intentionalClose && this.autoReconnect && this.reconnectAttempts < this.maxReconnectAttempts) {\r\n                    this.reconnectAttempts++;\r\n                    const delay = Math.min(1000 * Math.pow(2, this.reconnectAttempts), 30_000);\r\n                    if (this.debug) console.log(`[TikTokLive] Relayed reconnect in ${delay}ms (attempt ${this.reconnectAttempts}/${this.maxReconnectAttempts})`);\r\n                    setTimeout(() => { this._connectRelayed().catch(() => {}); }, delay);\r\n                }\r\n            });\r\n\r\n            this.ws.on('error', (err: Error) => {\r\n                if (firstOpen) { firstOpen = false; reject(err); }\r\n                else this.emit('error', err);\r\n            });\r\n        });\r\n    }\r\n}\r\n","import type { LiveEvent, TikTokUser, BattleTeam, BattleTeamUser, BattleHost, BattleContributor } from './types.js';\r\n\r\nexport function decodeVarint(buf: Buffer, offset: number): { value: number; offset: number } {\r\n    let result = 0, shift = 0;\r\n    while (offset < buf.length) {\r\n        const byte = buf[offset++];\r\n        result |= (byte & 0x7F) << shift;\r\n        if ((byte & 0x80) === 0) break;\r\n        shift += 7;\r\n    }\r\n    return { value: result >>> 0, offset };\r\n}\r\n\r\nexport function decodeVarint64(buf: Buffer, offset: number): { value: bigint; offset: number } {\r\n    let result = 0n, shift = 0n;\r\n    while (offset < buf.length) {\r\n        const byte = BigInt(buf[offset++]);\r\n        result |= (byte & 0x7Fn) << shift;\r\n        if ((byte & 0x80n) === 0n) break;\r\n        shift += 7n;\r\n    }\r\n    return { value: result, offset };\r\n}\r\n\r\nexport function encodeVarint(v: number | bigint): Buffer {\r\n    const bytes: number[] = [];\r\n    let n = typeof v === 'bigint' ? v : BigInt(v);\r\n    do {\r\n        let b = Number(n & 0x7Fn);\r\n        n >>= 7n;\r\n        if (n > 0n) b |= 0x80;\r\n        bytes.push(b);\r\n    } while (n > 0n);\r\n    return Buffer.from(bytes);\r\n}\r\n\r\nexport interface ProtoField {\r\n    fn: number;\r\n    wt: number;\r\n    value: Buffer | number | bigint;\r\n}\r\n\r\nexport function encodeField(fn: number, wt: number, value: Buffer | bigint | number | string): Buffer {\r\n    const tag = encodeVarint((fn << 3) | wt);\r\n    if (wt === 0) {\r\n        return Buffer.concat([tag, encodeVarint(typeof value === 'number' ? BigInt(value) : value as bigint)]);\r\n    }\r\n    const data = typeof value === 'string' ? Buffer.from(value) : value as Buffer;\r\n    return Buffer.concat([tag, encodeVarint(data.length), data]);\r\n}\r\n\r\nexport function decodeProto(buf: Buffer): ProtoField[] {\r\n    const fields: ProtoField[] = [];\r\n    let offset = 0;\r\n    while (offset < buf.length) {\r\n        const tagResult = decodeVarint(buf, offset);\r\n        offset = tagResult.offset;\r\n        const fn = tagResult.value >> 3;\r\n        const wt = tagResult.value & 7;\r\n        if (wt === 0) {\r\n            const r = decodeVarint64(buf, offset);\r\n            offset = r.offset;\r\n            fields.push({ fn, wt, value: r.value });\r\n        } else if (wt === 2) {\r\n            const lenR = decodeVarint(buf, offset);\r\n            offset = lenR.offset;\r\n            const data = buf.subarray(offset, offset + lenR.value);\r\n            offset += lenR.value;\r\n            fields.push({ fn, wt, value: data });\r\n        } else if (wt === 1) {\r\n            fields.push({ fn, wt, value: buf.readBigInt64LE(offset) });\r\n            offset += 8;\r\n        } else if (wt === 5) {\r\n            fields.push({ fn, wt, value: BigInt(buf.readInt32LE(offset)) });\r\n            offset += 4;\r\n        } else {\r\n            break;\r\n        }\r\n    }\r\n    return fields;\r\n}\r\n\r\nexport function getStr(fields: ProtoField[], fn: number): string {\r\n    const f = fields.find(x => x.fn === fn && x.wt === 2);\r\n    return f ? (f.value as Buffer).toString('utf-8') : '';\r\n}\r\n\r\nexport function getBytes(fields: ProtoField[], fn: number): Buffer | null {\r\n    const f = fields.find(x => x.fn === fn && x.wt === 2);\r\n    return f ? f.value as Buffer : null;\r\n}\r\n\r\nexport function getInt(fields: ProtoField[], fn: number): number {\r\n    const f = fields.find(x => x.fn === fn && x.wt === 0);\r\n    return f ? Number(f.value) : 0;\r\n}\r\n\r\n/** Like getInt but returns BigInt as string to preserve full 64-bit precision for user IDs */\r\nexport function getIntStr(fields: ProtoField[], fn: number): string {\r\n    const f = fields.find(x => x.fn === fn && x.wt === 0);\r\n    return f ? String(f.value) : '0';\r\n}\r\n\r\nexport function getAllBytes(fields: ProtoField[], fn: number): Buffer[] {\r\n    return fields.filter(x => x.fn === fn && x.wt === 2).map(x => x.value as Buffer);\r\n}\r\n\r\nexport function buildHeartbeat(roomId: string): Buffer {\r\n    const payload = encodeField(1, 0, BigInt(roomId));\r\n    return Buffer.concat([\r\n        encodeField(6, 2, 'pb'),\r\n        encodeField(7, 2, 'hb'),\r\n        encodeField(8, 2, payload),\r\n    ]);\r\n}\r\n\r\nexport function buildImEnterRoom(roomId: string): Buffer {\r\n    const inner = Buffer.concat([\r\n        encodeField(1, 0, BigInt(roomId)),\r\n        encodeField(4, 0, 12n),\r\n        encodeField(5, 2, 'audience'),\r\n        encodeField(6, 2, ''),\r\n        encodeField(9, 2, ''),\r\n        encodeField(10, 2, ''),\r\n    ]);\r\n    return Buffer.concat([\r\n        encodeField(6, 2, 'pb'),\r\n        encodeField(7, 2, 'im_enter_room'),\r\n        encodeField(8, 2, inner),\r\n    ]);\r\n}\r\n\r\nexport function buildAck(id: bigint): Buffer {\r\n    return Buffer.concat([\r\n        encodeField(2, 0, id),\r\n        encodeField(6, 2, 'pb'),\r\n        encodeField(7, 2, 'ack'),\r\n    ]);\r\n}\r\n\r\n// ── User parsing ────────────────────────────────────────────────────\r\n// Proto: User { userId=1, nickname=3, profilePicture=9, extraAttributes=22, badge=64, uniqueId=38 }\r\n// Proto: LinkUser { userId=1, nickname=2, profilePicture=3, uniqueId=4 }\r\n// Proto: ProfilePicture { repeated urls=1 }\r\n// NOTE: Army users in WebcastLinkMicArmies use a DIFFERENT layout where\r\n//       field 38 contains avatar/image data, NOT uniqueId.\r\n//       We detect this by checking if the string looks like a username (short, no URLs).\r\n\r\nfunction looksLikeUsername(s: string): boolean {\r\n    // Valid TikTok usernames are short (max ~30 chars), no URLs, no binary\r\n    return s.length > 0 && s.length <= 50 && !s.includes('://') && !s.includes('\\x00');\r\n}\r\n\r\nfunction parseUser(data: Buffer): TikTokUser {\r\n    const f = decodeProto(data);\r\n    // Use getIntStr for user ID to preserve full 64-bit precision\r\n    const id = getIntStr(f, 1) !== '0' ? getIntStr(f, 1) : getStr(f, 1);\r\n    const nickname = getStr(f, 3) || getStr(f, 2);\r\n\r\n    // uniqueId: Try field 4 (LinkUser format) first, then field 38 (User format)\r\n    // Validate that the result looks like a username, not binary/URL data\r\n    let uniqueId = '';\r\n    const uid4 = getStr(f, 4);\r\n    const uid38 = getStr(f, 38);\r\n    if (uid4 && looksLikeUsername(uid4)) {\r\n        uniqueId = uid4;\r\n    } else if (uid38 && looksLikeUsername(uid38)) {\r\n        uniqueId = uid38;\r\n    } else {\r\n        // Fall back to field 2 (nickname field in LinkUser)\r\n        const uid2 = getStr(f, 2);\r\n        if (uid2 && looksLikeUsername(uid2)) uniqueId = uid2;\r\n    }\r\n\r\n    // profilePicture: Try field 9 (User format), field 4 (army users — avatar at field 4), field 3 (LinkUser format)\r\n    // Can't use OR chain because field 3 = nickname bytes in User format (truthy but wrong)\r\n    // Must try each and pick the first that yields a valid URL\r\n    let profilePicture: string | undefined;\r\n    for (const fieldNum of [9, 4, 3]) {\r\n        if (profilePicture) break;\r\n        const avatarBuf = getBytes(f, fieldNum);\r\n        if (!avatarBuf) continue;\r\n        try {\r\n            const avatarFields = decodeProto(avatarBuf);\r\n            const urlBufs = getAllBytes(avatarFields, 1);\r\n            for (const urlBuf of urlBufs) {\r\n                const url = urlBuf.toString('utf-8');\r\n                if (url.includes('://')) {\r\n                    profilePicture = url;\r\n                    break;\r\n                }\r\n            }\r\n        } catch { }\r\n    }\r\n\r\n    // avatarLarge: Try field 11 (high-resolution ~720x720 avatar)\r\n    // This is separate from profilePicture which uses the small thumbnail\r\n    let avatarLargeUrl: string | undefined;\r\n    const largeBuf = getBytes(f, 11);\r\n    if (largeBuf) {\r\n        try {\r\n            const largeFields = decodeProto(largeBuf);\r\n            const urlBufs = getAllBytes(largeFields, 1);\r\n            for (const urlBuf of urlBufs) {\r\n                const url = urlBuf.toString('utf-8');\r\n                if (url.includes('://')) {\r\n                    avatarLargeUrl = url;\r\n                    break;\r\n                }\r\n            }\r\n        } catch { }\r\n    }\r\n    // Also try field 10 (avatarMedium) as fallback for avatarLargeUrl\r\n    if (!avatarLargeUrl) {\r\n        const medBuf = getBytes(f, 10);\r\n        if (medBuf) {\r\n            try {\r\n                const medFields = decodeProto(medBuf);\r\n                const urlBufs = getAllBytes(medFields, 1);\r\n                for (const urlBuf of urlBufs) {\r\n                    const url = urlBuf.toString('utf-8');\r\n                    if (url.includes('://')) {\r\n                        avatarLargeUrl = url;\r\n                        break;\r\n                    }\r\n                }\r\n            } catch { }\r\n        }\r\n    }\r\n\r\n    // Badges from field 64 → field 21 (repeated UserBadge)\r\n    const badges: string[] = [];\r\n    const badgeBuf = getBytes(f, 64);\r\n    if (badgeBuf) {\r\n        try {\r\n            const badgeFields = decodeProto(badgeBuf);\r\n            const badgeItems = getAllBytes(badgeFields, 21);\r\n            for (const bi of badgeItems) {\r\n                const bf = decodeProto(bi);\r\n                const name = getStr(bf, 3) || getStr(bf, 2);\r\n                if (name) badges.push(name);\r\n            }\r\n        } catch { }\r\n    }\r\n\r\n    return {\r\n        id,\r\n        nickname,\r\n        uniqueId: uniqueId || nickname || id,\r\n        profilePicture,\r\n        avatarLargeUrl,\r\n        badges: badges.length > 0 ? badges : undefined,\r\n    };\r\n}\r\n\r\n// ── Battle parsing ──────────────────────────────────────────────────\r\n// Proto: WebcastLinkMicBattle { repeated battleUsers=10 }\r\n//   battleUsers → WebcastLinkMicBattleItems { battleGroup=2 }\r\n//     battleGroup → WebcastLinkMicBattleGroup { LinkUser user=1 }\r\n//\r\n// Proto: WebcastLinkMicArmies { repeated battleItems=3, battleStatus=7 }\r\n//   battleItems → WebcastLinkMicArmiesItems { hostUserId=1, repeated battleGroups=2 }\r\n//     battleGroups → WebcastLinkMicArmiesGroup { repeated users=1, points=2 }\r\n\r\nfunction parseBattleTeamFromArmies(itemBuf: Buffer): BattleTeam {\r\n    const f = decodeProto(itemBuf);\r\n    const hostUserId = getIntStr(f, 1);\r\n    let teamScore = 0;\r\n    const users: BattleTeamUser[] = [];\r\n\r\n    // battleGroups at field 2\r\n    const groups = getAllBytes(f, 2);\r\n    for (const gb of groups) {\r\n        try {\r\n            const gf = decodeProto(gb);\r\n            const points = getInt(gf, 2);\r\n            teamScore += points;\r\n\r\n            // users at field 1 (repeated)\r\n            const userBufs = getAllBytes(gf, 1);\r\n\r\n            // TikTok proto structure: WebcastLinkMicArmiesGroup { users=1, points=2 }\r\n            // - When 1 user per group: points IS that user's individual contribution\r\n            // - When N users per group: points is the GROUP TOTAL, NOT individual scores\r\n            //   Individual scores are NOT available in WebcastLinkMicArmies proto.\r\n            // Use -1 to signal \"individual score unavailable\" to the UI.\r\n            const individualScore = userBufs.length === 1 ? points : -1;\r\n\r\n            for (const ub of userBufs) {\r\n                try {\r\n                    const user = parseUser(ub);\r\n                    users.push({ user, score: individualScore });\r\n                } catch { }\r\n            }\r\n        } catch { }\r\n    }\r\n\r\n    return { hostUserId, score: teamScore, users };\r\n}\r\n\r\n// ── Message-specific parsers ────────────────────────────────────────\r\n\r\nexport function parseWebcastMessage(method: string, payload: Buffer): LiveEvent {\r\n    const f = decodeProto(payload);\r\n    const base = { timestamp: Date.now(), msgId: '' };\r\n\r\n    // Try to extract msgId from MessageType (field 1 submessage, field 4 = timestamp)\r\n    const typeBuf = getBytes(f, 1);\r\n    if (typeBuf) {\r\n        try {\r\n            const tf = decodeProto(typeBuf);\r\n            const ts = getInt(tf, 4);\r\n            if (ts) base.timestamp = ts;\r\n        } catch { }\r\n    }\r\n\r\n    switch (method) {\r\n        // Proto: WebcastChatMessage { MessageType type=1, User user=2, string comment=3, ..., repeated WebcastSubEmote emotes=12 }\r\n        // WebcastSubEmote { int32 placeInComment=1, EmoteDetails emote=2 }\r\n        // EmoteDetails { string emoteId=1, EmoteImage image=2 }\r\n        // EmoteImage { string imageUrl=1 }\r\n        case 'WebcastChatMessage': {\r\n            const userBuf = getBytes(f, 2);\r\n            const user = userBuf ? parseUser(userBuf) : { id: '0', nickname: '', uniqueId: '' };\r\n            const comment = getStr(f, 3);\r\n\r\n            // Parse inline emotes (try field 12 and 13 — field number varies across TikTok versions)\r\n            const emotes: Array<{ emoteId: string; imageUrl: string; placeInComment: number }> = [];\r\n            const emoteBufs12 = getAllBytes(f, 12);\r\n            const emoteBufs13 = getAllBytes(f, 13);\r\n            const emoteBufs = emoteBufs13.length > 0 ? emoteBufs13 : emoteBufs12;\r\n            for (const eb of emoteBufs) {\r\n                try {\r\n                    const ef = decodeProto(eb);\r\n                    const placeInComment = getInt(ef, 1);\r\n                    const detailBuf = getBytes(ef, 2);\r\n                    if (detailBuf) {\r\n                        const df = decodeProto(detailBuf);\r\n                        const emoteId = getStr(df, 1);\r\n                        let imageUrl = '';\r\n                        const imgBuf = getBytes(df, 2);\r\n                        if (imgBuf) {\r\n                            const imgf = decodeProto(imgBuf);\r\n                            imageUrl = getStr(imgf, 1);\r\n                        }\r\n                        if (emoteId) {\r\n                            emotes.push({ emoteId, imageUrl, placeInComment });\r\n                        }\r\n                    }\r\n                } catch { }\r\n            }\r\n\r\n            return { ...base, type: 'chat' as const, user, comment, emotes };\r\n        }\r\n\r\n        // Proto: WebcastMemberMessage { User user=2, WebcastMessageEvent event=1 }\r\n        case 'WebcastMemberMessage': {\r\n            const userBuf = getBytes(f, 2);\r\n            const user = userBuf ? parseUser(userBuf) : { id: '0', nickname: '', uniqueId: '' };\r\n            let action = 1;\r\n            const eventBuf = getBytes(f, 1);\r\n            if (eventBuf) {\r\n                const ef = decodeProto(eventBuf);\r\n                const detailBuf = getBytes(ef, 8);\r\n                if (detailBuf) {\r\n                    const df = decodeProto(detailBuf);\r\n                    const label = getStr(df, 2);\r\n                    if (label.includes('followed')) action = 2;\r\n                    else if (label.includes('share')) action = 3;\r\n                }\r\n            }\r\n            return { ...base, type: 'member' as const, user, action };\r\n        }\r\n\r\n        // Proto: WebcastLikeMessage { User user=5, WebcastMessageEvent event=1, int32 likeCount=2, int32 totalLikeCount=3 }\r\n        case 'WebcastLikeMessage': {\r\n            const userBuf = getBytes(f, 5);\r\n            const user = userBuf ? parseUser(userBuf) : { id: '0', nickname: '', uniqueId: '' };\r\n            return {\r\n                ...base, type: 'like' as const, user,\r\n                likeCount: getInt(f, 2),\r\n                totalLikes: getInt(f, 3),\r\n            };\r\n        }\r\n\r\n        // Proto: WebcastGiftMessage {\r\n        //   User user=7, int32 giftId=2, int32 repeatCount=5, int32 repeatEnd=9,\r\n        //   GiftDetails giftDetails=15, GiftExtra giftExtra=23\r\n        // }\r\n        // GiftDetails { GiftImage giftImage=1, string giftName=16, string describe=2,\r\n        //               int32 giftType=11, int32 diamondCount=12 }\r\n        // GiftExtra { uint64 timestamp=6, uint64 toUserId=8 }\r\n        case 'WebcastGiftMessage': {\r\n            const userBuf = getBytes(f, 7);\r\n            const user = userBuf ? parseUser(userBuf) : { id: '0', nickname: '', uniqueId: '' };\r\n            const giftId = getInt(f, 2);\r\n            const repeatCount = getInt(f, 5);\r\n            const repeatEnd = getInt(f, 9) === 1;\r\n\r\n            let giftName = '', diamondCount = 0, giftType = 0;\r\n            let giftImageUrl = '';\r\n            const detailsBuf = getBytes(f, 15);\r\n            if (detailsBuf) {\r\n                const df = decodeProto(detailsBuf);\r\n                giftName = getStr(df, 16) || getStr(df, 2);\r\n                diamondCount = getInt(df, 12);\r\n                giftType = getInt(df, 11);\r\n\r\n                const imgBuf = getBytes(df, 1);\r\n                if (imgBuf) {\r\n                    const imgf = decodeProto(imgBuf);\r\n                    giftImageUrl = getStr(imgf, 1);\r\n                }\r\n            }\r\n\r\n            let toUserId = '';\r\n            const extraBuf = getBytes(f, 23);\r\n            if (extraBuf) {\r\n                const ef = decodeProto(extraBuf);\r\n                toUserId = String(getInt(ef, 8));\r\n            }\r\n\r\n            const groupId = toUserId || getStr(f, 11);\r\n\r\n            return {\r\n                ...base, type: 'gift' as const, user, giftId, giftName, diamondCount,\r\n                repeatCount, repeatEnd, combo: repeatCount > 1 && !repeatEnd,\r\n                giftType, groupId,\r\n            };\r\n        }\r\n\r\n        // Proto: WebcastSocialMessage { User user=2, WebcastMessageEvent event=1 }\r\n        case 'WebcastSocialMessage': {\r\n            const userBuf = getBytes(f, 2);\r\n            const user = userBuf ? parseUser(userBuf) : { id: '0', nickname: '', uniqueId: '' };\r\n            let action = 'follow';\r\n            const eventBuf = getBytes(f, 1);\r\n            if (eventBuf) {\r\n                const ef = decodeProto(eventBuf);\r\n                const detailBuf = getBytes(ef, 8);\r\n                if (detailBuf) {\r\n                    const df = decodeProto(detailBuf);\r\n                    const label = getStr(df, 2);\r\n                    if (label.includes('share')) action = 'share';\r\n                    else if (label.includes('follow')) action = 'follow';\r\n                    const displayType = getStr(df, 1);\r\n                    if (displayType === 'pm_mt_msg_viewer_share') action = 'share';\r\n                }\r\n            }\r\n            return { ...base, type: 'social' as const, user, action };\r\n        }\r\n\r\n        // Proto: WebcastRoomUserSeqMessage { int32 viewerCount=3 }\r\n        case 'WebcastRoomUserSeqMessage': {\r\n            const viewerCount = getInt(f, 3) || getInt(f, 2);\r\n            const totalViewers = getInt(f, 1) || viewerCount;\r\n            return { ...base, type: 'roomUserSeq' as const, totalViewers, viewerCount };\r\n        }\r\n\r\n        // Proto: WebcastLinkMicBattle { repeated WebcastLinkMicBattleItems battleUsers=10 }\r\n        //   battleUsers → { battleGroup=2 → { LinkUser user=1 } }\r\n        case 'WebcastLinkMicBattle': {\r\n            // 🔧 Field map (corrected 2026-05-20):\r\n            //   field 1 = roomId (BigInt — was mislabeled as battleId)\r\n            //   field 2 = roomId again (BigInt — was mislabeled as status; caused\r\n            //             customer to see `status: 7641983148117036000`)\r\n            //   field 3 = battleDuration\r\n            //   field 4 = battleId (the actual PK match ID)\r\n            //   field 7 = battle status (1=ACTIVE, 2=STARTING, 3=ENDED, 4=PREPARING)\r\n            //   field 10 = battleUsers (host-only, no scores)\r\n            //   field 14 = hosts with teamTotalScore + contributors\r\n            const battleId = String(getInt(f, 4) || getInt(f, 1) || '');\r\n            let status = getInt(f, 7);\r\n            if (!status) {\r\n                const fallback = getInt(f, 2);\r\n                status = (fallback > 0 && fallback < 100) ? fallback : 1;\r\n            }\r\n            const battleDuration = getInt(f, 3);\r\n            const teams: BattleTeam[] = [];\r\n\r\n            // Field 14 — hosts with scores (preferred).\r\n            const hostBufs = getAllBytes(f, 14);\r\n            for (const hb of hostBufs) {\r\n                try {\r\n                    const hf = decodeProto(hb);\r\n                    const hostUserId = String(getInt(hf, 1) || '');\r\n                    const teamTotalScore = getInt(hf, 3);\r\n                    const users: BattleTeamUser[] = [];\r\n                    const containerBuf = getBytes(hf, 4);\r\n                    if (containerBuf) {\r\n                        const cf = decodeProto(containerBuf);\r\n                        const userBufs = getAllBytes(cf, 1);\r\n                        for (const ub of userBufs) {\r\n                            try {\r\n                                const uf = decodeProto(ub);\r\n                                users.push({\r\n                                    user: {\r\n                                        id: String(getInt(uf, 1) || ''),\r\n                                        nickname: getStr(uf, 3) || '',\r\n                                        uniqueId: getStr(uf, 3) || '',\r\n                                    } as any,\r\n                                    score: getInt(uf, 2),\r\n                                });\r\n                            } catch { }\r\n                        }\r\n                    }\r\n                    teams.push({ hostUserId, score: teamTotalScore, users });\r\n                } catch { }\r\n            }\r\n\r\n            // Fallback: field 7 (battleArmies-style with scores)\r\n            if (teams.length === 0) {\r\n                const teamBufs7 = getAllBytes(f, 7);\r\n                for (const tb of teamBufs7) {\r\n                    try {\r\n                        teams.push(parseBattleTeamFromArmies(tb));\r\n                    } catch { }\r\n                }\r\n            }\r\n\r\n            // Last resort: field 10 (host-only, no scores)\r\n            if (teams.length === 0) {\r\n                const battleUserBufs = getAllBytes(f, 10);\r\n                for (const bub of battleUserBufs) {\r\n                    try {\r\n                        const bf = decodeProto(bub);\r\n                        const groupBuf = getBytes(bf, 2);\r\n                        if (groupBuf) {\r\n                            const gf = decodeProto(groupBuf);\r\n                            const linkUserBuf = getBytes(gf, 1);\r\n                            if (linkUserBuf) {\r\n                                const user = parseUser(linkUserBuf);\r\n                                teams.push({\r\n                                    hostUserId: user.id,\r\n                                    score: 0,\r\n                                    users: [{ user, score: 0 }],\r\n                                });\r\n                            }\r\n                        }\r\n                    } catch { }\r\n                }\r\n            }\r\n\r\n            return { ...base, type: 'battle' as const, battleId, status, battleDuration, teams };\r\n        }\r\n\r\n        // Proto: WebcastLinkMicArmies { msg_header=1, matchId=2, session_id=4, startedAtMs=5,\r\n        //   serverTsMs=6, repeated battleItems=3, status=7, sessionTag=17,\r\n        //   battle_config=18 { session_id=1, start_time_ms=2, duration_s=3 },\r\n        //   repeated hosts=14 { hostUserId=1, teamTotalScore=3, teamIdx=5,\r\n        //     userContainer=4 { repeated users=1 { userId=1, score=2, nickname=3 } } }\r\n        case 'WebcastLinkMicArmies': {\r\n            // field 17 = sessionTag (hex string ~34 chars)\r\n            // field 2  = matchId (stable across multi-round PK)\r\n            // field 1  = message header (NOT the battle ID)\r\n            const sessionTag = getStr(f, 17);\r\n            // battleId historically = getInt(f, 2) for backwards compat. Same field also = matchId.\r\n            const matchId = getIntStr(f, 2);\r\n            const sessionId = getIntStr(f, 4);\r\n            const battleId = sessionTag || matchId;\r\n            const battleStatus = getInt(f, 7);\r\n            const serverTsMs = getInt(f, 6);\r\n            const teams: BattleTeam[] = [];\r\n\r\n            const itemBufs = getAllBytes(f, 3);\r\n            for (const ib of itemBufs) {\r\n                try {\r\n                    teams.push(parseBattleTeamFromArmies(ib));\r\n                } catch { }\r\n            }\r\n\r\n            // Parse battle timer from field 18 (battle config)\r\n            let battleStartMs = 0;\r\n            let battleDurationSeconds = 0;\r\n            const configBuf = getBytes(f, 18);\r\n            if (configBuf) {\r\n                try {\r\n                    const cf = decodeProto(configBuf);\r\n                    battleStartMs = getInt(cf, 2);    // start time in ms\r\n                    battleDurationSeconds = getInt(cf, 3); // duration in seconds\r\n                } catch { }\r\n            }\r\n\r\n            // secsRemaining computed using TikTok server clock (no VPS drift) when available.\r\n            let secsRemaining = 0;\r\n            if (battleStartMs > 0 && battleDurationSeconds > 0 && serverTsMs > 0) {\r\n                secsRemaining = Math.max(0, battleDurationSeconds - Math.floor((serverTsMs - battleStartMs) / 1000));\r\n            }\r\n\r\n            // Compute endTimeMs for consumers to compute time left with their own clock\r\n            // IMPORTANT: Do NOT use Date.now() here — VPS clock may differ from TikTok server\r\n            // by 10-30 seconds, causing timer drift. Let the consumer compute timeLeft.\r\n            let endTimeMs = 0;\r\n            let timeLeftSeconds = 0;\r\n            if (battleStartMs > 0 && battleDurationSeconds > 0) {\r\n                endTimeMs = battleStartMs + battleDurationSeconds * 1000;\r\n                // Best-effort estimate using VPS clock (may be off by up to 30s)\r\n                const elapsedMs = Date.now() - battleStartMs;\r\n                timeLeftSeconds = Math.max(0, battleDurationSeconds - Math.floor(elapsedMs / 1000));\r\n            }\r\n\r\n            // Multi-guest host blocks (field_14 repeated). Each entry = one PK-side host with\r\n            // per-gifter MVP breakdown sorted high → low.\r\n            const hosts: BattleHost[] = [];\r\n            const hostBufs = getAllBytes(f, 14);\r\n            for (const hb of hostBufs) {\r\n                try {\r\n                    const hf = decodeProto(hb);\r\n                    const hostUserId = getIntStr(hf, 1);\r\n                    const teamTotalScore = getInt(hf, 3);\r\n                    const teamIdx = getInt(hf, 5);\r\n                    const contributors: BattleContributor[] = [];\r\n                    const containerBuf = getBytes(hf, 4);\r\n                    if (containerBuf) {\r\n                        const cf = decodeProto(containerBuf);\r\n                        const userBufs = getAllBytes(cf, 1);\r\n                        for (const ub of userBufs) {\r\n                            try {\r\n                                const uf = decodeProto(ub);\r\n                                contributors.push({\r\n                                    userId: getIntStr(uf, 1),\r\n                                    score: getInt(uf, 2),\r\n                                    nickname: getStr(uf, 3) || '',\r\n                                });\r\n                            } catch { }\r\n                        }\r\n                        contributors.sort((a, b) => b.score - a.score); // MVP first\r\n                    }\r\n                    hosts.push({ hostUserId, teamTotalScore, teamIdx, contributors });\r\n                } catch { }\r\n            }\r\n\r\n            return {\r\n                ...base, type: 'battleArmies' as const, battleId, teams,\r\n                status: battleStatus, battleStartMs, battleDurationSeconds, timeLeftSeconds, endTimeMs,\r\n                matchId, sessionId, serverTsMs, sessionTag,\r\n                durationSec: battleDurationSeconds, secsRemaining,\r\n                hosts,\r\n            };\r\n        }\r\n\r\n        // Proto: WebcastLinkMicBattleItemCard\r\n        //   #2 battleId\r\n        //   #3 cardType (2=gloves/crit, 3=mist, 4=match_guide, 10=x2?, 11=x3, ...)\r\n        //   #5/#6/#7/#14 inner (location varies with cardType — scan numerically):\r\n        //     #1.{\r\n        //       #1 effectKey\r\n        //       #2 icon block { #1 repeated CDN urls, #2 iconKey, #5 accentColor }\r\n        //       #3 activatedAtSec (unix seconds)\r\n        //       #4 sender block: #1 sub { #1 userId, #2 nickname, #3 avatar block, #4 uniqueId }\r\n        //       #5 durationSec\r\n        //       #8 senderUserId (new boosters)\r\n        //       #11 endsAtSec\r\n        //       #12 senderUserId (old gloves/mist)\r\n        //     }\r\n        //     #3 comment template msg → #2 commentText\r\n        case 'WebcastLinkMicBattleItemCard': {\r\n            const battleId = getIntStr(f, 2);\r\n            const cardType = getInt(f, 3);\r\n\r\n            // Inner block field-number varies with cardType. Verified via live capture:\r\n            //   cardType=2 (gloves/crit)  → field_5\r\n            //   cardType=3 (mist)         → field_6\r\n            //   cardType=4 (match_guide)  → field_7\r\n            //   cardType=11 (x3 booster)  → field_14\r\n            // Scan numerically — first present sub-message wins.\r\n            let inner: ProtoField[] | null = null;\r\n            for (const fn of [5, 6, 7, 14, 15, 16, 8, 9, 10, 11, 12, 13]) {\r\n                const buf = getBytes(f, fn);\r\n                if (buf) { inner = decodeProto(buf); break; }\r\n            }\r\n\r\n            let effectKey = '';\r\n            let effect = 'unknown';\r\n            let multiplier = 0;\r\n            let activatedAtSec = 0;\r\n            let durationSec = 0;\r\n            let endsAtSec = 0;\r\n            let senderUserId = '';\r\n            let senderNickname = '';\r\n            let senderUniqueId = '';\r\n            let senderAvatarUrl = '';\r\n            let commentTemplate = '';\r\n            let iconUrl = '';\r\n            let iconKey = '';\r\n            let accentColor = '';\r\n\r\n            if (inner) {\r\n                // 🔥 Name block lives at DIFFERENT inner-field depending on cardType.\r\n                // Verified live via battle:proto:capture (2026-05-20):\r\n                //   cardType 2/3/4 (gloves/mist/match_guide)  → nameBlock = inner.field_1\r\n                //   cardType 10/11  (x2/x3 boosters)          → nameBlock = inner.field_3\r\n                // Try field_1 first; if its decoded effectKey is empty, fall back to field_3.\r\n                let nameBuf = getBytes(inner, 1);\r\n                let nf = nameBuf ? decodeProto(nameBuf) : [];\r\n                let probedKey = nf.length ? (getStr(nf, 1) || '') : '';\r\n                if (!probedKey) {\r\n                    const altBuf = getBytes(inner, 3);\r\n                    if (altBuf) {\r\n                        const altFields = decodeProto(altBuf);\r\n                        const altKey = getStr(altFields, 1) || '';\r\n                        if (altKey) {\r\n                            nameBuf = altBuf;\r\n                            nf = altFields;\r\n                            probedKey = altKey;\r\n                        }\r\n                    }\r\n                }\r\n                if (nameBuf && nf.length) {\r\n                    effectKey = probedKey;\r\n                    // Map known effect keys:\r\n                    //   pm_mt_boost_<X>_name / pm_mt_boost_send_<X>_comment → gloves/mist\r\n                    //   ttlive_match_announcement_userSentBooster_noN       → x2/x3 boosters\r\n                    //   ttlive_match_gotPowerUp_panel_noN_title             → x2/x3 boosters\r\n                    //   pm_mt_match_guide_gotPowerUps                       → broadcast panel\r\n                    // TikTok's protobuf key is `pm_mt_boost_crit_name` but the\r\n                    // in-app booster TikTok shows is the HAMMER (critical strike).\r\n                    // We were emitting 'gloves' here, which is a different older\r\n                    // booster that no longer exists in the live UI.\r\n                    if (effectKey === 'pm_mt_boost_crit_name') effect = 'hammer';\r\n                    else if (effectKey === 'pm_mt_boost_glove_name' || effectKey === 'pm_mt_boost_gloves_name') effect = 'gloves';\r\n                    else if (effectKey === 'pm_mt_boost_mist_name') effect = 'mist';\r\n                    else if (effectKey === 'pm_mt_match_guide_gotPowerUps') effect = 'match_guide';\r\n                    else if (effectKey.includes('userSentBooster_no2') || effectKey.includes('gotPowerUp_panel_no2')) { effect = 'booster_x2'; multiplier = 2; }\r\n                    else if (effectKey.includes('userSentBooster_no3') || effectKey.includes('gotPowerUp_panel_no3')) { effect = 'booster_x3'; multiplier = 3; }\r\n                    else if (effectKey.includes('thunder')) effect = 'thunder';\r\n                    else if (effectKey.includes('extra_time') || effectKey.includes('extra_round')) effect = 'extra_time';\r\n                    else if (effectKey) effect = effectKey;\r\n\r\n                    activatedAtSec = getInt(nf, 3);\r\n                    durationSec = getInt(nf, 5);\r\n                    endsAtSec = getInt(nf, 11) || getInt(nf, 7);\r\n                    // senderUserId at field_12 (old gloves/mist) OR field_8 (new boosters).\r\n                    senderUserId = getIntStr(nf, 12);\r\n                    if (senderUserId === '0') senderUserId = getIntStr(nf, 8);\r\n                    if (senderUserId === '0') senderUserId = getStr(nf, 13) || getStr(nf, 9) || '';\r\n\r\n                    // Icon block at nf.field_2 — first field_1 URL + field_2 short key + field_5 accent hex.\r\n                    const iconBuf = getBytes(nf, 2);\r\n                    if (iconBuf) {\r\n                        const icf = decodeProto(iconBuf);\r\n                        const urlBufs = getAllBytes(icf, 1);\r\n                        for (const ub of urlBufs) {\r\n                            const candidate = ub.toString('utf-8');\r\n                            if (candidate.includes('://')) { iconUrl = candidate; break; }\r\n                        }\r\n                        iconKey = getStr(icf, 2) || '';\r\n                        accentColor = getStr(icf, 5) || '';\r\n                    }\r\n\r\n                    // Sender block: nf.field_4.field_1 = { userId, nickname, avatarMsg, uniqueId }\r\n                    const senderOuter = getBytes(nf, 4);\r\n                    if (senderOuter) {\r\n                        const sf = decodeProto(senderOuter);\r\n                        const sub = getBytes(sf, 1);\r\n                        if (sub) {\r\n                            const su = decodeProto(sub);\r\n                            const nickBuf = getBytes(su, 2);\r\n                            if (nickBuf) {\r\n                                try { senderNickname = nickBuf.toString('utf-8'); } catch { }\r\n                            }\r\n                            senderUniqueId = getStr(su, 4) || '';\r\n                            if (!senderUserId || senderUserId === '0') senderUserId = getIntStr(su, 1);\r\n                            // Avatar: su.field_3 wraps a list of CDN URLs (field_1 repeated)\r\n                            const avBuf = getBytes(su, 3);\r\n                            if (avBuf) {\r\n                                const af = decodeProto(avBuf);\r\n                                const urlBufs = getAllBytes(af, 1);\r\n                                for (const ub of urlBufs) {\r\n                                    const candidate = ub.toString('utf-8');\r\n                                    if (candidate.includes('://')) { senderAvatarUrl = candidate; break; }\r\n                                }\r\n                            }\r\n                        }\r\n                    }\r\n                }\r\n\r\n                // Comment template (e.g. \"{0:user} sent 1 magic mist\")\r\n                const commentBuf = getBytes(inner, 3);\r\n                if (commentBuf) {\r\n                    const cf = decodeProto(commentBuf);\r\n                    commentTemplate = getStr(cf, 2) || '';\r\n                }\r\n            }\r\n\r\n            return {\r\n                ...base, type: 'battleItemCard' as const, battleId, cardType,\r\n                effect, effectKey, multiplier,\r\n                senderUserId, senderNickname, senderUniqueId, senderAvatarUrl,\r\n                activatedAtSec, durationSec, endsAtSec, commentTemplate,\r\n                iconUrl, iconKey, accentColor,\r\n            };\r\n        }\r\n\r\n        // Proto: WebcastSubNotifyMessage { User user=2, ... subMonth=3 }\r\n        case 'WebcastSubNotifyMessage': {\r\n            const userBuf = getBytes(f, 2);\r\n            const user = userBuf ? parseUser(userBuf) : { id: '0', nickname: '', uniqueId: '' };\r\n            return { ...base, type: 'subscribe' as const, user, subMonth: getInt(f, 3) };\r\n        }\r\n\r\n        case 'WebcastEmoteChatMessage': {\r\n            const userBuf = getBytes(f, 2);\r\n            const user = userBuf ? parseUser(userBuf) : { id: '0', nickname: '', uniqueId: '' };\r\n            let emoteId = '', emoteUrl = '';\r\n            const emoteBuf = getBytes(f, 3);\r\n            if (emoteBuf) {\r\n                const ef = decodeProto(emoteBuf);\r\n                emoteId = getStr(ef, 1);\r\n                const imageBuf = getBytes(ef, 2);\r\n                if (imageBuf) {\r\n                    const imgFields = decodeProto(imageBuf);\r\n                    emoteUrl = getStr(imgFields, 1);\r\n                }\r\n            }\r\n            return { ...base, type: 'emoteChat' as const, user, emoteId, emoteUrl };\r\n        }\r\n\r\n        case 'WebcastEnvelopeMessage': {\r\n            const envelopeId = String(getInt(f, 1) || getStr(f, 1));\r\n            return { ...base, type: 'envelope' as const, envelopeId, diamondCount: getInt(f, 3) };\r\n        }\r\n\r\n        // Proto: WebcastQuestionNewMessage { MessageType type=1, QuestionDetails questionDetails=2 }\r\n        //   QuestionDetails { string questionText=2, User user=5 }\r\n        case 'WebcastQuestionNewMessage': {\r\n            let questionText = '', user: TikTokUser = { id: '0', nickname: '', uniqueId: '' };\r\n            const detailBuf = getBytes(f, 2);\r\n            if (detailBuf) {\r\n                const df = decodeProto(detailBuf);\r\n                questionText = getStr(df, 2);\r\n                const userBuf = getBytes(df, 5);\r\n                if (userBuf) user = parseUser(userBuf);\r\n            }\r\n            return { ...base, type: 'question' as const, user, questionText };\r\n        }\r\n\r\n        case 'WebcastRankUpdateMessage':\r\n        case 'WebcastHourlyRankMessage': {\r\n            const rankType = getStr(f, 1) || `rank_${getInt(f, 1)}`;\r\n            const rankList: Array<{ user: TikTokUser; rank: number; score: number }> = [];\r\n            const listBufs = getAllBytes(f, 2);\r\n            for (const lb of listBufs) {\r\n                try {\r\n                    const rf = decodeProto(lb);\r\n                    const userBuf = getBytes(rf, 1);\r\n                    const rank = getInt(rf, 2);\r\n                    const score = getInt(rf, 3);\r\n                    const user = userBuf ? parseUser(userBuf) : { id: '0', nickname: '', uniqueId: '' };\r\n                    rankList.push({ user, rank, score });\r\n                } catch { }\r\n            }\r\n            return { ...base, type: 'rankUpdate' as const, rankType, rankList };\r\n        }\r\n\r\n        // Proto: WebcastControlMessage { int32 action=2 }\r\n        case 'WebcastControlMessage':\r\n            return { ...base, type: 'control' as const, action: getInt(f, 2) || getInt(f, 1) };\r\n\r\n        case 'WebcastRoomMessage':\r\n        case 'RoomMessage':\r\n            return { ...base, type: 'room' as const, status: getInt(f, 2) };\r\n\r\n        // Proto: WebcastLiveIntroMessage { uint64 id=2, string description=4, User user=5 }\r\n        case 'WebcastLiveIntroMessage': {\r\n            const roomId = String(getInt(f, 2));\r\n            const title = getStr(f, 4) || getStr(f, 2);\r\n            return { ...base, type: 'liveIntro' as const, roomId, title };\r\n        }\r\n\r\n        case 'WebcastLinkMicMethod':\r\n        case 'WebcastLinkmicBattleTaskMessage': {\r\n            const action = getStr(f, 1) || `action_${getInt(f, 1)}`;\r\n            const users: TikTokUser[] = [];\r\n            const userBufs = getAllBytes(f, 2);\r\n            for (const ub of userBufs) {\r\n                try { users.push(parseUser(ub)); } catch { }\r\n            }\r\n            return { ...base, type: 'linkMic' as const, action, users };\r\n        }\r\n\r\n        default:\r\n            return { ...base, type: 'unknown' as const, method };\r\n    }\r\n}\r\n\r\nexport function parseWebcastResponse(payload: Buffer): LiveEvent[] {\r\n    const events: LiveEvent[] = [];\r\n    const respFields = decodeProto(payload);\r\n\r\n    for (const mf of respFields.filter(f => f.fn === 1 && f.wt === 2)) {\r\n        const msgBuf = mf.value as Buffer;\r\n        const msgFields = decodeProto(msgBuf);\r\n        const method = getStr(msgFields, 1);\r\n        const innerPayload = getBytes(msgFields, 2);\r\n        if (!method || !innerPayload) continue;\r\n\r\n        try {\r\n            events.push(parseWebcastMessage(method, innerPayload));\r\n        } catch { }\r\n    }\r\n\r\n    return events;\r\n}\r\n"],"mappings":"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","names":["useColors","http","https","req","http"]}