OverviewFilesCommitsIssuesDocsReleasesPeers

keet-deobfuscated / @holepunchto / keet-push / index.js

82 lines · javascript ref:
const e = require("@hyperswarm/rpc"),
  t = require("hypercore-crypto"),
  s = require("hypercore-id-encoding"),
  r = require("./lib/notifications"),
  o = require("./lib/encoding")
class i {
  constructor(e, t, s) {
    ;((this.push = e), (this.roomKey = t), (this.roomDiscoveryKey = s), (this.destroyed = !1))
  }
  async send(e, t = [e.length], { version: s = 0, attest: r = null } = {}) {
    try {
      for (const o of t)
        await this.push.send(e, this.roomKey, {
          roomDiscoveryKey: this.roomDiscoveryKey,
          length: o,
          version: s,
          attest: r,
        })
    } catch (e) {
      if (this.destroyed) return
      throw e
    }
  }
  destroy() {
    this.destroyed = !0
  }
}
module.exports = class {
  constructor(e = [], t = {}) {
    ;((this.rpc = null),
      (this.dht = t.dht || null),
      (this.gatewayKeys = e.map(s.decode)),
      (this.destroyed = !1),
      (this.suspended = !1))
  }
  setDHT(e) {
    this.dht = e
  }
  setGatewayKeys(e) {
    this.gatewayKeys = e.map(s.decode)
  }
  room(e, s = t.discoveryKey(e)) {
    return new i(this, e, s)
  }
  async send(e, t, s = {}) {
    if (this.destroyed) throw new Error("Destroyed")
    const i = await r.send(e, t, s)
    if (this.destroyed) throw new Error("Destroyed")
    if (0 === this.gatewayKeys.length) throw new Error("No server keys set")
    const h = this._getRPC(),
      n = Math.floor(Math.random() * this.gatewayKeys.length)
    let d = null
    for (let e = 0; e < 2 * this.gatewayKeys.length; e++) {
      const t = this.gatewayKeys[(e + n) % this.gatewayKeys.length]
      try {
        return await h.request(t, "notify", i, { timeout: 6e4, requestEncoding: o.notification })
      } catch (e) {
        d = e
      }
      if (this.destroyed) throw new Error("Destroyed")
    }
    throw d
  }
  _getRPC() {
    if (this.suspended) throw new Error("Suspended")
    return (this.rpc || (this.rpc = new e({ dht: this.dht, poolLinger: 6e4 })), this.rpc)
  }
  suspend() {
    this.suspended || (this.rpc && this.rpc.destroy(), (this.rpc = null), (this.suspended = !0))
  }
  resume() {
    this.suspended = !1
  }
  destroy() {
    return ((this.destroyed = !0), this.rpc ? this.rpc.destroy() : Promise.resolve())
  }
  static requestEncoding = o
  static receive(e, t, s = {}) {
    return r.receive(e, t, s)
  }
}