Source

lib/client/onNotification.js

// Dependencies
const signalR = require('@microsoft/signalr')
const events = require('events')

// Includes
const getSession = require('../util/getSession.js').func
const settings = require('../../settings.json')

// Args
exports.optional = ['jar']

// Docs
/**
 * 🔐 An event for when you get a notification.
 * @category Client
 * @alias onNotification
 * @returns An EventEmitter that emits when you get a notification.
 * @example const noblox = require("noblox.js")
 * // Login using your cookie
 * const notification = noblox.onNotification()
 * notification.on("data", function(data) {
 *  console.log("New notification! ", data)
 * })
 * notification.on("error", function(err) {
 *  console.error("Something went wrong: ", err)
 *  // Handle error as needed
 * })
**/

// Define
exports.func = function (args) {
  const max = settings.event.maxRetries
  const notifications = new events.EventEmitter()
  function connect (retries) {
    if (typeof args.jar === 'string') {
      args.jar = { session: args.jar }
    }
    const session = getSession({ jar: args.jar })
    let userNotificationConnection = null;

    userNotificationConnection = new signalR.HubConnectionBuilder()
      .withUrl('https://realtime-signalr.roblox.com/userhub', {
        transport: signalR.HttpTransportType.WebSockets,
        skipNegotiation: true,
        headers: {
          Cookie: '.ROBLOSECURITY=' + session + ';'
        }
      })
      .build();

      userNotificationConnection.on('notification', function(name, message) {
        notifications.emit('data', name, JSON.parse(message))
      })

      notifications.on('close', userNotificationConnection.stop)

      userNotificationConnection.disconnected = function (err) {
        notifications.emit('error', new Error('Connection failed: ' + err.message))
        if (retries !== -1) {
          if (retries > max) {
            notifications.emit('close', new Error('Max retries reached'))
          } else {
            setTimeout(connect, 5000, retries + 1)
          }
        }
      }

      userNotificationConnection.error = function (err) {
        notifications.emit('error', err)
      }

      userNotificationConnection.connected = function(connection) {
        notifications.emit('connect', connection)
      }

      userNotificationConnection.reconnecting = function () {
        setTimeout(connect, 5000, 0)
      notifications.emit('error', new Error('Lost connection, reconnecting'))
      return true // Abort reconnection
      }

      userNotificationConnection.start()
  }
  connect(-1)
  return notifications
}