hyperdrive-daemon-client
Version:
A client library and CLI tool for interacting with the Hyperdrive daemon.
76 lines (65 loc) • 2.08 kB
JavaScript
const grpc = require('@grpc/grpc-js')
const maybe = require('call-me-maybe')
const { peers: { services, messages } } = require('../rpc')
const {
toRPCMetadata: toMetadata
} = require('../common')
const WatchPeersTypes = messages.WatchPeersResponse.Type
module.exports = class PeersClient {
constructor (endpoint, token) {
this.endpoint = endpoint
this.token = token
this._client = new services.PeersClient(this.endpoint, grpc.credentials.createInsecure())
}
closeClient () {
const channel = this._client.getChannel()
channel.close()
}
watchPeers (discoveryKey, opts = {}) {
const req = new messages.WatchPeersRequest()
if (discoveryKey) req.setDiscoverykey(discoveryKey)
const stream = this._client.watchPeers(req, toMetadata({ token: this.token }))
stream.on('data', msg => {
const peers = msg.getPeersList()
switch(msg.getType()) {
case WatchPeersTypes.JOINED:
if (opts.onjoin) {
for (const peer of peers) {
opts.onjoin(peer)
}
}
break
case WatchPeersTypes.LEFT:
if (opts.onleave) {
for (const peer of peers) {
opts.onleave(peer)
}
}
break
default:
throw new Error('Invalid message type received from server:' + msg.type)
}
})
return () => stream.destroy()
}
getAlias (key, cb) {
const req = new messages.GetAliasRequest()
req.setKey(key)
return maybe(cb, new Promise((resolve, reject) => {
this._client.getAlias(req, toMetadata({ token: this.token }), (err, rsp) => {
if (err) return reject(err)
return resolve(rsp.getAlias())
})
}))
}
getKey (alias, cb) {
const req = new messages.GetKeyRequest()
req.setAlias(alias)
return maybe(cb, new Promise((resolve, reject) => {
this._client.getKey(req, toMetadata({ token: this.token }), (err, rsp) => {
if (err) return reject(err)
return resolve(Buffer.from(rsp.getKey()))
})
}))
}
}