index.js

const { decode, encode, ExtensionCodec } = require('@msgpack/msgpack')
const Queue = require('async-await-queue')
const HClient = require('./src/HClient')
const WS = require('ws')
const { bigIntCodec } = require('./src/ExtensionCodecs')

const extensionCodec = new ExtensionCodec()
bigIntCodec(extensionCodec, encode, decode)
const queue = new Queue(3, 100)

/**
 * @module nodejs
 */

 /**
   * Base class for nodejs clients. See {@link module:nodejs~NodeClient} for extensions.
   * @extends HClient
   * @public
   * @param options see {@link HClient} base class
   * @param logger see {@link HClient} base class
  */
class Client extends HClient {
  createSocket () {
    if (!this.token) {
      throw new Error(`Auth token is not set, check your config`)
    }
    this.ws = new WS(this.getEndpoint(), undefined, {
      headers: { Authorization: this.token }
    })
    this.ws.setMaxListeners(0)
  }

  get closed () {
    return this.ws == null || this.ws.readyState === WS.CLOSED
  }

  decode (event) {
    if (!event.hasOwnProperty('decoded')) {
      event.decoded = Client.msgpack.decode(event.data)
    }
    return event.decoded
  }

  encode (obj) {
    return Client.msgpack.encode(obj)
  }

  async _slotGet (qid, priority) {
    return queue.wait(qid, priority)
  }

  _slotFree (qid) {
    queue.end(qid)
  }

  async _flushQueue () {
    return queue.flush()
  }
}
Client.msgpack = {
  encode: (obj) => {
    return encode(obj, { extensionCodec })
  },
  decode: (data)  => {
    return decode(new Uint8Array(data), { extensionCodec })
  },
}
module.exports = Client