const e = require("compact-encoding"),
t = require("@holepunchto/keet-registry"),
r = require("@holepunchto/keet-registry/lib/errors"),
o = require("z32"),
{
RecordRequest: s,
ReserveRequest: n,
BlockRequest: i,
} = require("@holepunchto/keet-registry-schema"),
a = require("protomux-rpc-client-pool")
class c {
constructor(
e,
t,
{ nrRetries: r = 3, requestTimeout: o, timeout: s = 1e4, rateLimit: n = {} } = {},
) {
;(n.capacity || (n.capacity = 2),
n.intervalMs || (n.intervalMs = 5e3),
(this.pool = new a(e, t, { nrRetries: r, totalTimeout: s, rpcTimeout: o, rateLimit: n })))
}
get keys() {
return this.pool.keys
}
get timeout() {
return this.totalTimeout
}
get totalTimeout() {
return this.pool.totalTimeout
}
get requestTimeout() {
return this.pool.rpcTimeout
}
get chosenKey() {
return this.pool.chosenKey
}
async putRecord(o, { force: n = !1 } = {}) {
const { profile: i, attestation: a } = o
if (!t.verifyAttestation({ profile: i, attestation: a })) throw r.INVALID_ATTESTATION()
const c = { profile: i, attestation: a }
try {
await this.pool.makeRequest("put-record/v2", c, {
requestEncoding: s,
responseEncoding: e.none,
})
} catch (e) {
if ("REQUEST_ERROR" !== e.code) throw e
throw u(e)
}
}
async getDbKey() {
try {
return await this.pool.makeRequest("get-db-key", null, {
requestEncoding: e.none,
responseEncoding: e.fixed32,
})
} catch (e) {
if ("REQUEST_ERROR" !== e.code) throw e
throw u(e)
}
}
async reserve(t) {
try {
return await this.pool.makeRequest("reserve", t, {
requestEncoding: n,
responseEncoding: e.bool,
})
} catch (e) {
if ("REQUEST_ERROR" !== e.code) throw e
throw u(e)
}
}
async getIp(t) {
"string" == typeof t && (t = o.decode(t))
try {
return await this.pool.makeRequest("get-ip", t, {
requestEncoding: e.buffer,
responseEncoding: e.ipv4,
})
} catch (e) {
if ("REQUEST_ERROR" !== e.code) throw e
throw u(e)
}
}
async block({ memberKey: t, reason: r = "" }) {
try {
return await this.pool.makeRequest(
"block",
{ memberKey: t, reason: r },
{ requestEncoding: i, responseEncoding: e.none },
)
} catch (e) {
if ("REQUEST_ERROR" !== e.code) throw e
throw u(e)
}
}
reservationData(e) {
return t.encodeReservation({ username: e })
}
destroy() {
this.pool.destroy()
}
}
function u(e) {
const t = e.cause
switch (t.code) {
case "NAME_UNAVAILABLE":
return r.NAME_UNAVAILABLE(t.message)
case "INVALID_NAME":
return r.INVALID_NAME(t.message)
case "KEY_EXISTS":
return r.KEY_EXISTS(t.message)
case "UNKNOWN_KEY":
return r.UNKNOWN_KEY(t.message)
case "INVALID_ATTESTATION":
return r.INVALID_ATTESTATION(t.message)
case "OUTDATED_CLOCK":
return r.OUTDATED_CLOCK(t.message)
case "INVALID_AVATAR":
return r.INVALID_AVATAR(t.message)
case "EXCEEDS_RECORD_LIMIT":
return r.EXCEEDS_RECORD_LIMIT(t.message)
case "EXCEEDS_RESERVATION_LIMIT":
return r.EXCEEDS_RESERVATION_LIMIT(t.message)
case "NO_ACCESS":
return new r(t.message, "NO_ACCESS")
default:
return new r(t.message, "REQUEST_ERROR")
}
}
module.exports = c