'use strict'; const constants = require('./constants'); const version = require('./version'); const utils = require('./utils'); /** * The Kadence daemon can be controlled by another process on the same host or * remotely via socket connection. By default, the daemon is configured to * listen on a UNIX domain socket located at $HOME/.config/kadence/kadence.sock. * Once connected to the daemon, you may send it control commands to build * networks in other languages. The controller understands newline terminated * JSON-RPC 2.0 payloads. */ class Control { /** * @constructor * @param {KademliaNode} node */ constructor(node) { this.node = node; } /** * @private */ _parseMethodSignature(name) { const method = name; const func = this[method].toString(); const args = func.split(`${method}(`)[1].split(')')[0]; const params = args.split(', ').map(s => s.trim()); params.pop(); return { method, params }; } /** * Returns a list of the support methods from the controller * @param {Control~listMethodsCallback} callback */ listMethods(callback) { callback(null, Object.getOwnPropertyNames(Object.getPrototypeOf(this)) .filter(method => { return method[0] !== '_' && method !== 'constructor' && typeof this[method] === 'function'; }) .map(this._parseMethodSignature.bind(this)) .sort((a, b) => b.method < a.method)); } /** * @callback Control~listMethodsCallback * @param {error|null} error * @param {object[]} methods * @param {string} methods.method * @param {string[]} methods.params */ /** * Returns basic informations about the running node * @param {Control~getProtocolInfoCallback} callback */ getProtocolInfo(callback) { const peers = [], dump = this.node.router.getClosestContactsToKey( this.node.identity, constants.K * constants.B ); for (let peer of dump) { peers.push(peer); } callback(null, { versions: version, identity: this.node.identity.toString('hex'), contact: this.node.contact, peers }); } /** * @callback Control~getProtocolInfoCallback * @param {error|null} error * @param {object} info * @param {object} info.versions * @param {string} info.versions.software * @param {string} info.versions.protocol * @param {string} info.identity * @param {object} info.contact * @param {array[]} info.peers */ /** * {@link KademliaNode#iterativeFindNode} */ /* istanbul ignore next */ iterativeFindNode(hexKey, callback) { this.node.iterativeFindNode(hexKey, callback); } /** * {@link KademliaNode#iterativeFindValue} */ /* istanbul ignore next */ iterativeFindValue(hexKey, callback) { this.node.iterativeFindValue(Buffer.from(hexKey, 'hex'), callback); } /** * {@link KademliaNode#iterativeStore} */ /* istanbul ignore next */ iterativeStore(hexValue, callback) { let hexKey = utils.hash160(Buffer.from(hexValue, 'hex')).toString('hex'); this.node.iterativeStore(hexKey, hexValue, function(err, count) { if (err) { return callback(err); } callback(null, count, hexKey); }); } /** * {@link module:kadence/quasar~QuasarPlugin#quasarSubscribe} */ /* istanbul ignore next */ quasarSubscribe(hexKey, callback) { this.node.quasarSubscribe(hexKey, callback); } /** * {@link module:kadence/quasar~QuasarPlugin#quasarPublish} */ /* istanbul ignore next */ quasarPublish(hexKey, contentValue, callback) { this.node.quasarPublish(hexKey, contentValue, callback); } } module.exports = Control;