{"version":3,"file":"index.modern.mjs","sources":["../src/httpClient.ts","../src/log.ts","../src/api.ts"],"sourcesContent":["const isNode = typeof process === \"object\";\n\nconst $get = (url: string, cb: Function): void => {\n  const req = new XMLHttpRequest();\n  req.onreadystatechange = () => {\n    if (req.readyState === 4 && req.status === 200) {\n      cb(req.responseText);\n    }\n  };\n  req.open(\"GET\", url, true);\n  req.send(null);\n};\n\nconst $post = (url: string, data: any, cb: (...args: any[]) => void): void => {\n  const req = new XMLHttpRequest();\n  req.onreadystatechange = () => {\n    if (req.readyState === 4 && req.status === 200) {\n      cb(JSON.parse(req.responseText));\n    }\n  };\n  req.open(\"POST\", url);\n\n  req.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n  req.setRequestHeader(\"X-Requested-With\", \"XMLHttpRequest\");\n\n  req.send(JSON.stringify(data));\n};\n\nexport default {\n  get: (url: string): Promise<any> => {\n    return new Promise((resolve) => {\n      $get(url, (response) => resolve(response));\n    });\n  },\n  post: (url: string, data: Object): Promise<any> => {\n    return new Promise((resolve) => {\n      $post(url, data, (response) => resolve(response));\n    });\n  },\n};\n","\n/**\n * Represents a logger\n * @constructor\n * @param {string} prefix - logger prefix\n */\n\nexport default class {\n  public readonly prefix: string;\n  public doOutput: boolean = true;\n\n  /** Creates new logger */\n  constructor( prefix?: string, doOutput?: boolean ) {\n    this.doOutput = doOutput;\n    this.prefix = (prefix ?? '[bitwave.tv API]') + ' ';\n  }\n\n  /** Creates logger info */\n  info( message: String, ...args ): void {\n    this.doOutput && console.log( this.prefix + message, ...args );\n  }\n\n  /** Creates logger warn */\n  warn( message: String, ...args ): void {\n    this.doOutput && console.warn( this.prefix + '[WARN] ' + message, ...args );\n  }\n\n  /** Creates logger error */\n  error( message: String, ...args ): void {\n    this.doOutput && console.error( this.prefix + '[ERROR] ' + message, ...args );\n  }\n}\n","import $http from \"./httpClient\";\nimport logger from \"./log\";\nimport { io } from \"socket.io-client\";\n\nconst $log = new logger(\"[bitwave.tv API]\");\n\nexport interface Message {\n  avatar: string;\n  badge: string;\n  color: string;\n  unum: number;\n  message: string;\n  timestamp: number;\n  username: string;\n  channel: string;\n  global: boolean;\n  type: string;\n  id: string;\n}\n\nexport interface OutgoingMessage {\n  message: string;\n  channel: string;\n  global: boolean;\n  showBadge: boolean;\n}\n\nexport type Credentials = string | Token | void;\n\nexport interface Token {\n  recaptcha: any;\n  page: string;\n  jwt: string;\n}\n\n/* ========================================= */\n\nexport class FedwaveChat {\n  private _socket = null;\n\n  private _chatServer = \"https://fw.rnih.org\";\n  private _apiPrefix = \"https://fw.rnih.org\";\n  private _whisperEndpoint = \"/v1/whispers/send\";\n\n  public async getTrollToken() {\n    try {\n      return await $http.get(this._apiPrefix + \"/mktroll\");\n    } catch (e) {\n      $log.error(`Couldn't get troll token!`, e);\n    }\n  }\n\n  private userProfile: Token = {\n    recaptcha: null,\n    page: \"global\", // room name\n    jwt: null,\n  };\n\n  /**\n   * Uses `credentials` to get a token from the server.\n   *\n   * @return JWT token as string\n   */\n  public async initToken(credentials: Token | void) {\n    if (credentials) {\n      this.userProfile = credentials;\n    } else {\n      this.userProfile.jwt = await this.getTrollToken();\n      this.onUpdateCredentials(this.userProfile.jwt);\n    }\n  }\n\n  public global: boolean | any = true; /**< Global chat mode flag */\n\n  /**\n   * Callback function that receives messages (in bulk)\n   * @param ms Message object array\n   */\n  public rcvMessageBulk(ms: Message[]): void {\n    for (const m of ms) console.log(m);\n  }\n\n  /**\n   * Callback function that receives paid chat alert objects\n   * @param message Alert object\n   */\n  public alert(message: Object): void {\n    $log.warn(`Received alert: `, message);\n  }\n\n  public channelViewers = []; /**< Array of channel viewers.  */\n\n  /**\n   * Callback function that gets called when the list of usernames gets updated.\n   */\n  public async onUpdateUsernames(newViewers: any[]) {}\n\n  /**\n   * Callback function that gets called when current credentials change.\n   */\n  public async onUpdateCredentials(newCredentials: Credentials) {}\n\n  /**\n   * Gets an array of usernames from the server and puts it in channelViewers\n   * It is called automatically at request from the server, but can be called manually\n   * @see channelViewers\n   */\n  public async updateUsernames(): Promise<void> {\n    try {\n      const res = await $http.get(this._apiPrefix + \"/v1/chat/channels\");\n      const data = JSON.parse(res);\n      if (data && data.success) {\n        await this.onUpdateUsernames(data.data);\n        this.channelViewers = data.data;\n      }\n    } catch (e) {\n      $log.error(`Couldn't update usernames!`);\n      console.error(e);\n    }\n  }\n\n  public onHydrate(data: Message[]) {\n    this.rcvMessageBulk(data);\n  }\n\n  /**\n   * Requests messages from the server (called hydration)\n   * It is called automatically when reconnecting.\n   * @see socketError()\n   * @return False if unsuccessful or empty\n   */\n  public async hydrate(): Promise<boolean> {\n    try {\n      const url: string =\n        this._apiPrefix +\n        \"/v1/messages/\" +\n        (!this.global && this.userProfile.page ? this.userProfile.page : \"\");\n      const data = JSON.parse(await $http.get(url));\n      if (!data.size)\n        return $log.warn(\"Hydration data was empty\") === undefined && false;\n\n      this.onHydrate(data.data);\n      return true;\n    } catch (e) {\n      $log.error(`Couldn't get chat hydration data!`);\n      console.error(e);\n      return false;\n    }\n  }\n\n  /**\n   * This function is called when connecting to the server\n   */\n  public socketConnect() {\n    this._socket.emit(\"new user\", this.userProfile);\n    $log.info(`Connected to chat! (${this.userProfile.page})`);\n  }\n\n  /**\n   * This function is called when the server issues a reconnect.\n   * It force hydrates chat to catch up.\n   */\n  public async socketReconnect() {\n    $log.info(\"Socket issued 'reconnect'. Forcing hydration...\");\n    await this.hydrate();\n  }\n\n  /**\n   * This function is called when there's a socket error.\n   */\n  public async socketError(message: string, error) {\n    $log.error(`Socket error: ${message}`, error);\n    // TODO: handle error\n  }\n\n  public blocked(data) {\n    $log.info(\"TODO: handle blocked event\", data);\n  }\n\n  public pollstate(data) {\n    $log.info(\"TODO: handle pollstate event\", data);\n  }\n\n  public constructor(doLogging?: boolean) {\n    $log.doOutput = doLogging;\n  }\n\n  /**\n   * Inits data and starts connection to server\n   * @param room is a string for the channel you wish to connect to\n   * @param credentials User credentials if falsy, gets a new troll token. If a string, it's taken as the JWT chat token\n   * @param specificServer URI to a specific chat server\n   */\n  async connect(\n    room: string,\n    credentials: string | Token | void,\n    specificServer?: string\n  ) {\n    if (typeof credentials === \"string\") this.userProfile.jwt = credentials;\n    else this.initToken(credentials);\n\n    this.userProfile.page = room;\n\n    const socketOptions = { transports: [\"websocket\"] };\n    this._socket = io(specificServer || this._chatServer, socketOptions);\n\n    const sockSetup = new Map([\n      [\n        \"connect\",\n        async () => {\n          this._socket.emit(\"new user\", this.userProfile);\n          $log.info(`Connected to chat! (${this.userProfile.page})`);\n          await this.socketConnect.call(this);\n        },\n      ],\n      [\n        \"reconnect\",\n        async () => {\n          $log.info(\"Socket issued 'reconnect'. Forcing hydration...\");\n          await this.hydrate();\n          await this.socketReconnect.call(this);\n        },\n      ],\n      [\n        \"error\",\n        async (error: Object) => {\n          // TODO: handle error\n          $log.error(`Socket error: Connection Failed`, error);\n          await this.socketError.call(this, `Connection Failed`, error);\n        },\n      ],\n      [\n        \"disconnect\",\n        async (data: Object) =>\n          await $log.error(`Socket error: Connection Lost`, data),\n      ],\n      [\"update usernames\", async () => await this.updateUsernames()],\n      [\n        \"bulkmessage\",\n        async (data: Message[]) => await this.rcvMessageBulk(data),\n      ],\n      [\"alert\", async (data) => await this.alert(data)],\n    ]);\n\n    sockSetup.forEach((cb, event) => {\n      this._socket.on(event, cb);\n    });\n  }\n\n  get room() {\n    return this.userProfile.page;\n  } /**< Current room */\n  set room(r) {\n    this.userProfile.page = r;\n    $log.info(`Changed to room ${r}`);\n  }\n\n  get doLogging() {\n    return $log.doOutput;\n  } /**< Enable log output */\n  set doLogging(r) {\n    $log.doOutput = r;\n  }\n\n  get socket() {\n    return this._socket;\n  } /**< Deprecated, but allows access to underlying socket */\n  set socket(s) {\n    this._socket = s;\n  }\n\n  disconnect(): void {\n    this.socket?.off();\n    this.socket?.disconnect();\n  }\n\n  /**\n   * Sends message with current config (this.userProfile)\n   * @param msg Message to be sent. Can be an object: { message, channel, global, showBadge }, or just a string (in which case channel/global use current values)\n   */\n  sendMessage(msg: OutgoingMessage | string): void {\n    switch (typeof msg) {\n      case \"object\":\n        this._socket.emit(\"message\", msg);\n        break;\n      case \"string\":\n        this._socket.emit(\"message\", {\n          message: msg,\n          channel: this.userProfile.page,\n          global: this.global,\n          showBadge: true,\n        });\n        break;\n    }\n  }\n\n  async sendWhisper(recipient: string, msg: string): Promise<void> {\n    this._socket.emit(\"whisper\", {\n      to: recipient,\n      message: msg,\n    });\n  }\n}\n"],"names":["$get","url","cb","req","XMLHttpRequest","onreadystatechange","readyState","status","responseText","open","send","$post","data","JSON","parse","setRequestHeader","stringify","get","Promise","resolve","response","post","constructor","prefix","doOutput","info","message","args","console","log","warn","error","$log","logger","FedwaveChat","getTrollToken","$http","_apiPrefix","e","initToken","credentials","userProfile","jwt","onUpdateCredentials","rcvMessageBulk","ms","m","alert","onUpdateUsernames","newViewers","newCredentials","updateUsernames","res","success","channelViewers","onHydrate","hydrate","global","page","size","undefined","socketConnect","_socket","emit","socketReconnect","socketError","blocked","pollstate","doLogging","_chatServer","_whisperEndpoint","recaptcha","connect","room","specificServer","socketOptions","transports","io","sockSetup","Map","call","forEach","event","on","r","socket","s","disconnect","off","sendMessage","msg","channel","showBadge","sendWhisper","recipient","to"],"mappings":"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"}