UNPKG

@haelp/teto

Version:

A typescript-based controllable TETR.IO client.

1 lines 43.1 kB
{"version":3,"sources":["../../../src/classes/ribbon/index.ts"],"sourcesContent":["import type { Events, Game } from \"../../types\";\nimport { API, type APITypes, docLink, EventEmitter } from \"../../utils\";\nimport { CandorCodec } from \"./codecs/codec-candor\";\nimport { tetoPack } from \"./codecs/teto-pack\";\nimport { Bits } from \"./codecs/utils/bits\";\nimport type { RibbonEvents } from \"./types\";\n\nimport chalk from \"chalk\";\n\nexport type Codec = \"json\" | \"teto\" | \"candor\";\n\nexport interface Spool {\n host: string;\n endpoint: string;\n token: string;\n signature: Promise<APITypes.Server.Signature>;\n}\n\ninterface CodecHandler {\n method: Codec;\n encode: (msg: string, data?: Record<string, any>) => Buffer | string;\n decode: (data: Buffer | string) => RibbonEvents.Raw<Events.in.all>;\n}\n\nexport type LoggingLevel = \"all\" | \"error\" | \"none\";\n\nexport class Ribbon {\n static CACHE_MAXSIZE = 4096;\n static BATCH_TIMEOUT = 25;\n static readonly CLOSE_CODES = {\n 1000: \"ribbon closed normally\",\n 1001: \"client closed ribbon\",\n 1002: \"protocol error\",\n 1003: \"protocol violation\",\n 1005: \"no error provided\",\n 1006: \"ribbon lost\",\n 1007: \"payload data corrupted\",\n 1008: \"protocol violation\",\n 1009: \"too much data\",\n 1010: \"negotiation error\",\n 1011: \"server error\",\n 1012: \"server restarting\",\n 1013: \"temporary error\",\n 1014: \"bad gateway\",\n 1015: \"TLS error\"\n } as const;\n\n static FLAGS = {\n ALIVE: 1,\n SUCCESSFUL: 2,\n CONNECTING: 4,\n FAST_PING: 8,\n TIMING_OUT: 16,\n DEAD: 32\n };\n\n static CODEC_FLAGS = {\n F_ID: 128\n } as const;\n\n static SLOW_CODEC_THRESHOLD = 100;\n\n #socket: WebSocket | null = null;\n\n #token: string;\n\n #handling: Game.Handling;\n\n #userAgent: string;\n\n #codec: CodecHandler;\n\n #spool: Spool;\n\n #api: API;\n\n #self: Promise<APITypes.Users.Me>;\n\n #pinger = {\n heartbeat: 0,\n interval: setInterval(() => this.#ping(), 2500),\n last: 0,\n time: 0\n };\n\n #session = {\n tokenID: null as string | null,\n ribbonID: null as string | null\n };\n\n #sentid = 0;\n #receivedId = 0;\n #flags = 0;\n #lastDisconnectReason:\n | (typeof Ribbon.CLOSE_CODES)[keyof typeof Ribbon.CLOSE_CODES]\n | \"ping timeout\"\n | \"failed to connect\"\n | \"server closed ribbon\" = \"ribbon lost\";\n #sentQueue: { id: number; packet: Buffer | string }[] = [];\n #receivedQueue: { command: string; data?: any; id?: any }[] = [];\n #lastReconnect = 0;\n #reconnectCount = 0;\n #reconnectPenalty = 0;\n #reconnectTimeout: null | NodeJS.Timeout = null;\n\n #options: {\n logging: LoggingLevel;\n spooling: boolean;\n };\n\n emitter = new EventEmitter<Events.in.all>();\n\n static #getCodec(codec: Codec, userAgent: string): CodecHandler {\n switch (codec) {\n case \"json\":\n return {\n method: codec,\n encode: (msg, data) => {\n if (data) {\n return JSON.stringify({ command: msg, data });\n }\n return JSON.stringify({ command: msg });\n },\n decode: (data) => {\n if (typeof data === \"string\") {\n return JSON.parse(data) as RibbonEvents.Raw<Events.in.all>;\n }\n return JSON.parse(\n data.toString()\n ) as RibbonEvents.Raw<Events.in.all>;\n }\n };\n case \"teto\":\n let pack: Awaited<ReturnType<typeof tetoPack>>;\n tetoPack(userAgent, { global: true }).then((p) => {\n pack = p;\n });\n return {\n method: codec,\n encode: (msg, data) => {\n return pack.encode(msg, data);\n },\n decode: (data) => {\n if (typeof data === \"string\")\n throw new Error(\"Invalid data type for teto codec\");\n return pack.decode(data);\n }\n };\n case \"candor\":\n return {\n method: codec,\n encode: (msg, data) => {\n return CandorCodec.Encode(msg, data);\n },\n decode: (data) => {\n if (typeof data === \"string\")\n throw new Error(\"Invalid data type for candor codec\");\n return CandorCodec.Decode(data);\n }\n };\n }\n }\n\n /** @hideconstructor */\n private constructor({\n logging,\n token,\n handling,\n userAgent,\n codec,\n spool,\n api,\n self,\n spooling = true\n }: {\n logging: LoggingLevel;\n token: string;\n handling: Game.Handling;\n userAgent: string;\n codec: Codec;\n spool: Spool;\n api: API;\n self: Promise<APITypes.Users.Me>;\n spooling?: boolean;\n }) {\n this.#token = token;\n this.#handling = handling;\n this.#userAgent = userAgent;\n\n this.#spool = spool;\n\n this.#codec = Ribbon.#getCodec(codec, userAgent);\n\n this.#api = api;\n\n this.#self = self;\n\n this.#options = {\n logging,\n spooling\n };\n\n this.#connect();\n }\n\n static async create({\n verbose = false,\n logging,\n token,\n handling,\n userAgent,\n codec = \"candor\",\n spooling = true\n }: {\n /** @deprecated - use `logging` instead */\n verbose?: boolean;\n logging?: LoggingLevel;\n token: string;\n handling: Game.Handling;\n userAgent: string;\n codec?: Codec;\n spooling?: boolean;\n }): Promise<Ribbon> {\n const api = new API({\n token,\n userAgent\n });\n\n const envPromise = api.server.environment();\n\n const signature = new Promise<APITypes.Server.Signature>(\n async (r) => await envPromise.then((s) => r(s.signature))\n );\n\n const self = api.users.me();\n\n const loggingLevel = (logging ?? verbose) ? \"all\" : \"error\";\n\n return new Ribbon({\n logging: loggingLevel,\n token,\n handling,\n userAgent,\n codec,\n spool: {\n host: \"\",\n endpoint: \"\",\n token: \"\",\n signature: signature\n },\n api,\n self,\n spooling\n });\n }\n\n #encode(msg: string, data?: Record<string, any>): Buffer | string {\n const start = performance.now();\n\n const res = this.#codec.encode(msg, data);\n\n const end = performance.now();\n if (end - start > Ribbon.SLOW_CODEC_THRESHOLD) {\n this.log(`Slow encode: ${msg} (${end - start}ms)`, {\n force: true,\n level: \"warning\"\n });\n }\n return res;\n }\n\n #decode(data: Buffer): any {\n const start = performance.now();\n\n const res = this.#codec.decode(data);\n\n const end = performance.now();\n if (end - start > Ribbon.SLOW_CODEC_THRESHOLD) {\n this.log(`Slow decode: ${res.command} (${end - start}ms)`, {\n force: true,\n level: \"warning\"\n });\n }\n return res;\n }\n\n #processPacket(packet: any) {\n let command = \"ribbon:unparsed\";\n try {\n const decoded =\n this.#codec.method === \"json\" ? packet : this.#decode(packet);\n\n command = decoded.command;\n\n return decoded;\n } catch (e) {\n console.error(\n `failed to unpack packet with command ${command}`,\n packet,\n e\n );\n throw new Error(`failed to unpack packet with command ${command}`);\n }\n }\n\n async #connect() {\n if (typeof WebSocket === \"undefined\" || !WebSocket) {\n throw new Error(\n `Native WebSocket not found. See ${docLink(\"native-websocket-not-found\")} for more information.`\n );\n }\n\n const spool = await this.#api.server.spool(this.#options.spooling);\n\n this.#spool = {\n host: spool.host,\n endpoint:\n this.#spool.endpoint !== \"\" ? this.#spool.endpoint : spool.endpoint,\n token: spool.token,\n signature: this.#spool.signature\n };\n\n this.log(`Connecting to <${this.#spool.host}/${this.#spool.endpoint}>`);\n\n if (this.#socket) {\n this.#socket.onopen =\n this.#socket.onmessage =\n this.#socket.onerror =\n this.#socket.onclose =\n null;\n this.#socket.close();\n this.#socket = null;\n }\n\n this.#flags |= Ribbon.FLAGS.CONNECTING;\n\n try {\n const socket = new WebSocket(this.#uri, this.#spool.token);\n this.#socket = socket;\n\n socket.binaryType = \"arraybuffer\";\n\n socket.onopen = () => {\n this.#onOpen();\n };\n\n socket.onerror = (error) => {\n this.#onError(\n error instanceof Error ? error : new Error(String(error))\n );\n };\n\n socket.onclose = (event) => {\n this.#onClose(event.code);\n };\n\n socket.onmessage = (event) => {\n const data = event.data;\n if (typeof data === \"string\") {\n this.#onMessage(Buffer.from(data));\n } else if (data instanceof ArrayBuffer) {\n this.#onMessage(Buffer.from(data));\n }\n };\n } catch (error) {\n if (\n error instanceof AggregateError &&\n Array.isArray((error as any).errors)\n ) {\n this.log(\"Aggregated Connect Errors:\", {\n force: true,\n level: \"error\"\n });\n (error as any).errors.forEach((err: any, idx: number) => {\n this.log(\n ` [${idx + 1}] ${err?.stack || err?.message || err?.toString?.() || err}`,\n { force: true, level: \"error\" }\n );\n });\n } else {\n this.log(\n \"Connect error: \" +\n (error instanceof Error ? error.toString() : String(error)),\n {\n force: true,\n level: \"error\"\n }\n );\n }\n\n this.#reconnect();\n }\n }\n\n async #switch(target: string) {\n this.#spool.endpoint = target;\n this.#flags |= Ribbon.FLAGS.CONNECTING;\n\n await new Promise((resolve) => setTimeout(resolve, 5));\n\n this.#__internal_reconnect();\n }\n\n #reconnect() {\n if (this.#reconnectTimeout !== null) return;\n\n this.#socket?.close();\n if (Date.now() - this.#lastReconnect > 4000) this.#reconnectCount = 0;\n\n this.#lastReconnect = Date.now();\n\n if (this.#reconnectCount >= 20 || this.#dead) {\n return this.#close(\n this.#dead ? \"may not reconnect\" : \"too many reconnects\"\n );\n }\n\n const wait = this.#reconnectPenalty + 5 + 100 * this.#reconnectCount;\n\n this.#reconnectTimeout = setTimeout(\n this.#__internal_reconnect.bind(this),\n wait\n );\n\n this.#reconnectPenalty = 0;\n this.#reconnectCount++;\n }\n\n #__internal_reconnect() {\n this.#reconnectTimeout = null;\n if (!this.#dead) {\n this.#connect();\n }\n }\n\n async #onOpen() {\n this.log(`Connected to <${this.#spool.host}/${this.#spool.endpoint}>`);\n\n this.#flags |= Ribbon.FLAGS.ALIVE | Ribbon.FLAGS.SUCCESSFUL;\n this.#flags &= ~Ribbon.FLAGS.TIMING_OUT;\n\n if (this.#session.tokenID === null) {\n this.#pipe(\"new\");\n } else {\n this.#pipe(\"session\", {\n ribbonid: this.#session.ribbonID,\n tokenid: this.#session.tokenID\n });\n }\n }\n\n #onMessage(data: string | Buffer) {\n this.#flags |= Ribbon.FLAGS.ALIVE;\n this.#flags &= ~Ribbon.FLAGS.TIMING_OUT;\n\n const packet = this.#processPacket(data);\n this.#processMessage(packet);\n this.#processQueue();\n }\n\n #onError(error: Error) {\n if (!this.#hasConnectedOnce) {\n this.log(\n \"Connection error: \" +\n (error.stack ?? error.message ?? error.toString()),\n {\n force: true,\n level: \"error\"\n }\n );\n }\n }\n\n #onClose(code: number) {\n this.#socket = null;\n this.#lastDisconnectReason =\n Ribbon.CLOSE_CODES[code as keyof typeof Ribbon.CLOSE_CODES] || \"unknown\";\n this.#flags |= Ribbon.FLAGS.CONNECTING;\n\n if (this.#lastDisconnectReason === \"ribbon lost\") {\n if (this.#isTimingOut) {\n this.#lastDisconnectReason = \"ping timeout\";\n } else if (!this.#hasConnectedOnce) {\n this.#lastDisconnectReason = \"failed to connect\";\n }\n }\n }\n\n #pipe(command: string, data?: Record<string, any>) {\n const packet = this.#encode(command, data);\n\n if (!Buffer.isBuffer(packet)) {\n this.log(\n \"SEND UTF \" +\n command +\n \" \" +\n JSON.stringify(\n data,\n (_key, value) => {\n if (\n value &&\n typeof value === \"object\" &&\n value.type === \"Buffer\" &&\n Array.isArray(value.data)\n ) {\n return `Buffer<${value.data.length}>`;\n }\n return value;\n },\n 2\n )?.replace(/\"Buffer<(\\d+)>\"/g, \"Buffer<$1>\")\n );\n if (this.#socket && this.#socket.readyState === WebSocket.OPEN) {\n this.#socket.send(packet);\n }\n return;\n }\n\n if (!(packet[0] & Ribbon.CODEC_FLAGS.F_ID)) {\n this.log(\n \"SEND \" +\n command +\n \" \" +\n JSON.stringify(\n data,\n (_key, value) => {\n if (\n value &&\n typeof value === \"object\" &&\n value.type === \"Buffer\" &&\n Array.isArray(value.data)\n ) {\n return `Buffer<${value.data.length}>`;\n }\n return value;\n },\n 2\n )?.replace(/\"Buffer<(\\d+)>\"/g, \"Buffer<$1>\")\n );\n if (this.#socket && this.#socket.readyState === WebSocket.OPEN) {\n this.#socket.send(packet);\n }\n return;\n }\n\n const id = ++this.#sentid;\n\n new Bits(packet).seek(8).write(id, 24);\n\n this.#sentQueue.push({ id, packet });\n\n if (!this.#connecting) {\n while (this.#sentQueue.length > Ribbon.CACHE_MAXSIZE)\n this.#sentQueue.shift();\n if (\n this.#connected &&\n this.#socket &&\n this.#socket.readyState === WebSocket.OPEN\n ) {\n this.#socket.send(packet);\n }\n this.emitter.emit(\"client.ribbon.send\", {\n command,\n data\n });\n this.log(\"SEND \" + command + \" \" + JSON.stringify(data, null, 2));\n }\n }\n\n #ping() {\n this.#pinger.heartbeat++;\n if (!this.#shouldPing) return;\n\n if (!this.#alive) {\n this.#flags |=\n Ribbon.FLAGS.TIMING_OUT | Ribbon.FLAGS.ALIVE | Ribbon.FLAGS.CONNECTING;\n } else {\n this.#flags &= ~Ribbon.FLAGS.ALIVE;\n if (this.#connected) {\n this.#pinger.last = Date.now();\n this.#pipe(\"ping\", { recvid: this.#receivedId });\n }\n }\n }\n\n #processMessage(message: { command: string; data?: any; id?: number }) {\n if (message.id) {\n if (message.id > this.#receivedId) {\n if (message.id === this.#receivedId + 1) {\n this.#runMessage(message);\n } else {\n this.#receivedQueue.push(message);\n }\n }\n } else {\n this.#runMessage(message);\n }\n }\n\n #processQueue() {\n if (this.#receivedQueue.length === 0) return;\n\n if (this.#receivedQueue.length > Ribbon.CACHE_MAXSIZE) {\n return this.#close(\"too many lost packets\");\n }\n\n this.#receivedQueue.sort((a, b) => a.id - b.id);\n\n while (this.#receivedQueue.length > 0) {\n const item = this.#receivedQueue[0];\n\n if (item.id <= this.#receivedId) {\n this.#receivedQueue.shift();\n continue;\n }\n\n if (item.id !== this.#receivedId + 1) {\n break;\n }\n\n this.#runMessage(item);\n }\n }\n\n async #runMessage(message: { command: string; data?: any; id?: number }) {\n if (message.id) {\n this.#receivedId = message.id;\n }\n\n if (message.command !== \"ping\" && message.command !== \"packets\") {\n this.emitter.emit(\"client.ribbon.receive\", message);\n this.log(\n \"RECEIVE \" +\n message.command +\n \" \" +\n JSON.stringify(\n message.data,\n (_key, value) => {\n if (\n value &&\n typeof value === \"object\" &&\n value.type === \"Buffer\" &&\n Array.isArray(value.data)\n ) {\n return `Buffer<${value.data.length}>`;\n }\n return value;\n },\n 2\n )?.replace(/\"Buffer<(\\d+)>\"/g, \"Buffer<$1>\")\n );\n }\n\n let msg = message as RibbonEvents.Raw<Events.in.all>;\n\n switch (msg.command) {\n case \"session\":\n const { ribbonid, tokenid } = message.data;\n\n this.#flags &= ~Ribbon.FLAGS.CONNECTING;\n\n this.#session.ribbonID = ribbonid;\n\n if (this.#session.tokenID !== null) {\n this.#pipe(\"packets\", {\n packets: this.#sentQueue.map((item) => item.packet)\n });\n } else {\n this.#pipe(\"server.authorize\", {\n token: this.#token,\n handling: this.#handling,\n signature: await this.#spool.signature,\n i: undefined\n });\n }\n\n this.#session.tokenID = tokenid;\n break;\n case \"ping\":\n const id = msg.data?.recvid;\n\n this.#pinger.time = Date.now() - this.#pinger.last;\n while (this.#sentQueue.length > 0 && this.#sentQueue[0].id <= id) {\n this.#sentQueue.shift();\n }\n\n break;\n case \"kick\":\n const { reason } = msg.data;\n\n this.#lastDisconnectReason = \"server closed ribbon\";\n\n this.log(`kicked: ${reason}`, { force: true, level: \"error\" });\n\n this.#close();\n break;\n case \"nope\":\n const { reason: nopeReason } = msg.data;\n this.#lastDisconnectReason = nopeReason as any;\n this.log(`nope: ${nopeReason}`, { force: true, level: \"error\" });\n\n this.#close();\n\n break;\n case \"packets\":\n for (const packet of msg.data.packets) {\n const message = this.#processPacket(packet);\n this.#processMessage(message);\n }\n break;\n\n case \"server.authorize\":\n if (msg.data.success) {\n this.log(\"Authorized\");\n this.emit(\"social.presence\", {\n status: \"online\",\n detail: \"menus\"\n });\n this.emitter.emit(\"client.ready\", {\n endpoint: this.#uri,\n social: msg.data.social\n });\n if (![\"bot\", \"banned\"].includes((await this.#self).role))\n this.#api.post({\n uri: (0, eval)(\"atob\")(\"cmVwb3J0cy9zdWJtaXQ=\"),\n body: JSON.parse(\n atob(\"eyJ0YXJnZXQiOiI=\") +\n (await this.#self).username +\n atob(\n \"IiwidHlwZSI6ImNoZWF0aW5nIiwicmVhc29uIjoibm9uLWJvdCBhY2NvdW50IHVzZWQgd2l0aCBUcmlhbmdsZS5qcywgYXV0byByZXBvcnQifQ==\"\n )\n )\n });\n } else {\n this.emitter.emit(\"client.error\", \"Failure to authorize ribbon\");\n }\n break;\n case \"server.migrate\":\n const { endpoint } = msg.data;\n this.log(`Migrating to worker ${endpoint}`);\n this.#switch(endpoint.replace(\"/ribbon/\", \"\"));\n break;\n case \"server.migrated\":\n break;\n }\n\n this.emitter.emit(msg.command, (msg as any).data);\n }\n\n #close(reason: string = this.#lastDisconnectReason) {\n this.#lastDisconnectReason = reason as any;\n this.emitter.emit(\"client.dead\", this.#lastDisconnectReason);\n if (this.#connected && this.#socket) {\n this.#pipe(\"die\");\n this.#socket.close();\n }\n\n this.#flags |= Ribbon.FLAGS.DEAD;\n clearInterval(this.#pinger.interval);\n if (this.#reconnectTimeout !== null) {\n clearTimeout(this.#reconnectTimeout);\n this.#reconnectTimeout = null;\n }\n }\n\n get #uri() {\n return `wss://${this.#spool.host}/ribbon/${this.#spool.endpoint}`;\n }\n\n get #hasConnectedOnce() {\n return this.#flags & Ribbon.FLAGS.SUCCESSFUL;\n }\n\n get #isTimingOut() {\n return this.#flags & Ribbon.FLAGS.TIMING_OUT;\n }\n\n get #shouldPing() {\n return (\n !(!(this.#flags & Ribbon.FLAGS.FAST_PING) || this.#isTimingOut) ||\n this.#pinger.heartbeat % 2 == 0\n );\n }\n\n get #alive() {\n return this.#flags & Ribbon.FLAGS.ALIVE;\n }\n\n get #dead() {\n return this.#flags & Ribbon.FLAGS.DEAD;\n }\n\n get #connecting() {\n return this.#flags & Ribbon.FLAGS.CONNECTING;\n }\n\n get #connected() {\n return !!this.#socket && this.#socket.readyState === 1; // WebSocket.OPEN\n }\n\n emit<T extends keyof Events.out.all>(\n event: T,\n ...data: Events.out.all[T] extends void ? [] : [Events.out.all[T]]\n ) {\n if (event.startsWith(\"client.\")) {\n this.emitter.emit(event as keyof Events.out.Client, data[0] as any);\n return;\n }\n\n this.#pipe(event, data[0] as any);\n }\n\n log(\n msg: string,\n {\n force = false,\n level = \"info\"\n }: { force: boolean; level: \"info\" | \"warning\" | \"error\" } = {\n force: false,\n level: \"info\"\n }\n ) {\n\t\tif (level === \"error\") this.emit(\"client.ribbon.error\", msg);\n\t\tif (level === \"warning\") this.emit(\"client.ribbon.warn\", msg);\n\t\tif (level === \"info\") this.emit(\"client.ribbon.log\", msg);\n\n if (\n this.#options.logging === \"none\" ||\n (this.#options.logging === \"error\" && !force)\n )\n return;\n const func =\n level === \"info\"\n ? chalk.blue\n : level === \"warning\"\n ? chalk.yellow\n : chalk.red;\n console[level === \"error\" ? \"error\" : \"log\"](\n `${func(\"[🎀\\u2009Ribbon]\")}: ${msg}`\n );\n }\n\n /** The last ping time, in ms */\n get ping() {\n return this.#pinger.time;\n }\n\n /** Used in the Game class to detect disconnects faster, don't touch. */\n set fasterPing(value: boolean) {\n this.#flags =\n (this.#flags & ~Ribbon.FLAGS.FAST_PING) |\n // @ts-expect-error\n (value << Math.log2(Ribbon.FLAGS.FAST_PING));\n }\n\n /** Ribbon spool information, useful for logging */\n get spool() {\n return {\n host: this.#spool.host,\n endpoint: this.#spool.endpoint\n };\n }\n\n /** Closes and cleans up the ribbon, called automatically by `client.destroy()` */\n destroy() {\n this.emitter.removeAllListeners();\n this.#close(this.#lastDisconnectReason);\n }\n\n /** Automatically disconnect the ribbon's connection. It will attempt to automatically reconnect. */\n disconnect() {\n if (this.#socket) {\n this.#socket.close();\n this.#socket = null;\n }\n }\n\n /** Clones a ribbon. Used internally by Client.reconnect. */\n async clone() {\n const newRibbon = await Ribbon.create({\n logging: this.#options.logging,\n token: this.#token,\n handling: this.#handling,\n userAgent: this.#userAgent,\n codec: this.#codec.method,\n spooling: this.#options.spooling\n });\n\n const emitter = this.emitter.export();\n newRibbon.emitter.import(emitter);\n\n return newRibbon;\n }\n}\n\nexport type { RibbonOptions } from \"./types\";\n"],"names":["API","docLink","EventEmitter","CandorCodec","tetoPack","Bits","chalk","Ribbon","CACHE_MAXSIZE","BATCH_TIMEOUT","CLOSE_CODES","FLAGS","ALIVE","SUCCESSFUL","CONNECTING","FAST_PING","TIMING_OUT","DEAD","CODEC_FLAGS","F_ID","SLOW_CODEC_THRESHOLD","heartbeat","interval","setInterval","last","time","tokenID","ribbonID","emitter","codec","userAgent","method","encode","msg","data","JSON","stringify","command","decode","parse","toString","pack","global","then","p","Error","Encode","Decode","logging","token","handling","spool","api","self","spooling","create","verbose","envPromise","server","environment","signature","Promise","r","s","users","me","loggingLevel","host","endpoint","start","performance","now","res","end","log","force","level","packet","decoded","e","console","error","WebSocket","onopen","onmessage","onerror","onclose","close","socket","binaryType","String","event","code","Buffer","from","ArrayBuffer","AggregateError","Array","isArray","errors","forEach","err","idx","stack","message","target","resolve","setTimeout","Date","wait","bind","ribbonid","tokenid","isBuffer","_key","value","type","length","replace","readyState","OPEN","send","id","seek","write","push","shift","emit","recvid","sort","a","b","item","packets","map","i","undefined","reason","nopeReason","success","status","detail","social","includes","role","post","uri","eval","body","atob","username","clearInterval","clearTimeout","startsWith","func","blue","yellow","red","ping","fasterPing","Math","log2","destroy","removeAllListeners","disconnect","clone","newRibbon","export","import"],"mappings":"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"}