@tiktool/live 2.8.0 → 2.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client.ts","../src/proto.ts"],"sourcesContent":["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>): 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 req = mod.get(url, { headers }, (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\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 }\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 let ttwid = this._presetSessionId;\r\n let roomId = this._presetRoomId;\r\n let clusterRegion = '';\r\n let preSignedUrl = '';\n let preSignedCookies = '';\n let preSignedUA = '';\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) {\n // Use pre-signed URL + cookies directly — skip ttwid flow\n preSignedUrl = credData.data.signed_url;\n preSignedCookies = credData.data.cookies || '';\n preSignedUA = credData.data.user_agent || DEFAULT_UA;\n ttwid = '__presigned__'; // Sentinel to pass the ttwid check\n console.log(`[TikTokLive] ✅ Got pre-signed URL from sign server`);\n } else {\n console.log(`[TikTokLive] ⚠️ ws_credentials bad response: ${JSON.stringify(credData).substring(0, 120)}`);\n }\n }\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 });\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 });\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\n ? preSignedUrl.replace(/^https:\\/\\//, 'wss://')\n : wsUrl;\n const finalHeaders = preSignedUrl\n ? { 'User-Agent': preSignedUA, 'Cookie': preSignedCookies, 'Origin': 'https://www.tiktok.com' }\n : { 'User-Agent': DEFAULT_UA, 'Cookie': `ttwid=${ttwid}`, 'Origin': 'https://www.tiktok.com' };\n console.log(`[TikTokLive] Connecting WS: ${preSignedUrl ? 'pre-signed URL' : 'self-built URL'}`);\n this.ws = new WebSocket(finalWsUrl, {\n headers: finalHeaders,\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 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","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":[]}
1
+ {"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 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"]}