{"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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"}