zeronet-protocol
Version:
ZeroNet protocol
69 lines (57 loc) • 1.84 kB
JavaScript
const debug = require('debug')
const log = debug('zeronet:protocol:zero')
const validate = require('./verify')
const PeerRequest = require('peer-request')
const handler = require('./peer-request-handler')
const HandshakeClient = require('./handshake/client')
const Crypto = require('./crypto')
function ZProtocol (opt, zeronet) {
if (!opt) opt = {}
log('create zero protocol', opt)
const self = this
const commands = self.commands = {}
const handlers = self.handlers = {}
self.attach = client => {
client.cmd = {}
Object.keys(commands).forEach(cmd => {
log('attaching %s to %s', cmd, client.addr)
const h = handler(cmd, commands[cmd], client, handlers[cmd])
client.handlers[cmd] = h.recv
client.cmd[cmd] = h.send
})
}
self.upgradeConn = opt =>
(conn, cb) => {
log('upgrading conn', opt)
if (!cb) cb = () => {}
const c = conn.client = new HandshakeClient(conn, opt, zeronet, self)
c.conn = conn
c.upgrade((err, client, upgrade, isServer) => {
if (err) return cb(err)
if (upgrade) {
if (isServer) {
zeronet.swarm.lp2p.up.simulateConnection(upgrade)
} else {
cb(err, client, upgrade)
}
} else {
c.upgraded = client
log('finished upgrade', opt)
return cb(null, client)
}
})
}
self.handle = self.handleZN = (name, def, defret, cb) => {
if (commands[name]) throw new Error(name + ' is already handled')
log('Handling', name)
commands[name] = new PeerRequest(name, def, defret, validate)
handlers[name] = cb
}
if (opt.crypto) {
Crypto(self)
if (!Array.isArray(opt.crypto)) opt.crypto = [opt.crypto]
opt.crypto.map(c => c(self, zeronet, opt.id))
}
}
module.exports = ZProtocol