{"version":3,"file":"index.mjs","sources":["src/index.js"],"sourcesContent":["import WebSocket from 'ws'\n\nconst WS_URL = 'wss://ws-prod.plug.dj:443/socket'\nconst WS_ORIGIN = 'https://plug.dj'\n\nconst WSSTATE_OPEN = 1\nconst HEARTBEAT_TIMEOUT = 25 * 1000\n\nexport default function socket (authToken, options) {\n  const wsUrl = options && options.url || WS_URL\n  const wsOrigin = options && options.origin || WS_ORIGIN\n  const heartbeatTimeout = options && options.timeout || HEARTBEAT_TIMEOUT\n\n  const ws = new WebSocket(wsUrl, { origin: wsOrigin })\n\n  const queue = []\n  let heartbeat\n\n  function gotHeartbeat () {\n    if (heartbeat) clearTimeout(heartbeat)\n    heartbeat = setTimeout(ontimedout, heartbeatTimeout)\n  }\n\n  function onmessage (event) {\n    gotHeartbeat()\n\n    if (event.data === 'h') {\n      return null\n    }\n\n    const actions = JSON.parse(event.data)\n    if (!Array.isArray(actions)) {\n      return null\n    }\n\n    actions.forEach((data) => {\n      // Action shape:\n      // { a: action, p: param, s: slug }\n      ws.emit(data.a, data.p, data.s)\n      ws.emit('action', data.a, data.p, data.s)\n    })\n  }\n\n  ws.sendMessage = function sendMessage (action, param) {\n    if (ws.readyState === WSSTATE_OPEN) {\n      ws.send(JSON.stringify({\n        a: action,\n        p: param,\n        t: Math.floor(Date.now() / 1000)\n      }))\n    } else {\n      queue.push({ action: action, param: param })\n    }\n    return ws\n  }\n\n  /**\n   * Send all queued messages.\n   */\n  function onopen () {\n    gotHeartbeat()\n    queue.forEach((message) => {\n      ws.sendMessage(message.action, message.param)\n    })\n  }\n\n  function onclose () {\n    if (heartbeat) clearTimeout(heartbeat)\n  }\n\n  /**\n   * When we haven't received a heartbeat for some time, the connection might\n   * have stopped working.\n   */\n  function ontimedout () {\n    ws.close(3001, 'Timed out: did not receive heartbeat from plug.dj')\n  }\n\n  ws.auth = function auth (param) {\n    return ws.sendMessage('auth', param)\n  }\n  ws.chat = function chat (param) {\n    return ws.sendMessage('chat', param)\n  }\n\n  ws.onmessage = onmessage\n  ws.onopen = onopen\n  ws.onclose = onclose\n\n  if (authToken) {\n    ws.auth(authToken)\n  }\n\n  return ws\n}\n"],"names":["const","let"],"mappings":"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"}