229 lines
3.9 KiB
JavaScript
229 lines
3.9 KiB
JavaScript
/*!
|
|
* nullclient.js - node client for hsd
|
|
* Copyright (c) 2017-2018, Christopher Jeffrey (MIT License).
|
|
* https://github.com/handshake-org/hsd
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const assert = require('bsert');
|
|
const EventEmitter = require('events');
|
|
const NameState = require('../covenants/namestate');
|
|
const Block = require('../primitives/block');
|
|
|
|
/**
|
|
* Null Client
|
|
* Sort of a fake local client for separation of concerns.
|
|
* @alias module:node.NullClient
|
|
*/
|
|
|
|
class NullClient extends EventEmitter {
|
|
/**
|
|
* Create a client.
|
|
* @constructor
|
|
*/
|
|
|
|
constructor(wdb) {
|
|
super();
|
|
|
|
this.wdb = wdb;
|
|
this.network = wdb.network;
|
|
this.opened = false;
|
|
}
|
|
|
|
/**
|
|
* Open the client.
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async open() {
|
|
assert(!this.opened, 'NullClient is already open.');
|
|
this.opened = true;
|
|
setImmediate(() => this.emit('connect'));
|
|
}
|
|
|
|
/**
|
|
* Close the client.
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async close() {
|
|
assert(this.opened, 'NullClient is not open.');
|
|
this.opened = false;
|
|
setImmediate(() => this.emit('disconnect'));
|
|
}
|
|
|
|
/**
|
|
* Add a listener.
|
|
* @param {String} type
|
|
* @param {Function} handler
|
|
*/
|
|
|
|
bind(type, handler) {
|
|
return this.on(type, handler);
|
|
}
|
|
|
|
/**
|
|
* Add a listener.
|
|
* @param {String} type
|
|
* @param {Function} handler
|
|
*/
|
|
|
|
hook(type, handler) {
|
|
return this.on(type, handler);
|
|
}
|
|
|
|
/**
|
|
* Get chain tip.
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async getTip() {
|
|
const {hash, height, time} = this.network.genesis;
|
|
return { hash, height, time };
|
|
}
|
|
|
|
/**
|
|
* Get chain entry.
|
|
* @param {Hash} hash
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async getEntry(hash) {
|
|
return { hash, height: 0, time: 0 };
|
|
}
|
|
|
|
/**
|
|
* Send a transaction. Do not wait for promise.
|
|
* @param {TX} tx
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async send(tx) {
|
|
this.wdb.emit('send', tx);
|
|
}
|
|
|
|
/**
|
|
* Send a claim. Do not wait for promise.
|
|
* @param {Claim} claim
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async sendClaim(claim) {
|
|
this.wdb.emit('send claim', claim);
|
|
}
|
|
|
|
/**
|
|
* Set bloom filter.
|
|
* @param {Bloom} filter
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async setFilter(filter) {
|
|
this.wdb.emit('set filter', filter);
|
|
}
|
|
|
|
/**
|
|
* Add data to filter.
|
|
* @param {Buffer} data
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async addFilter(data) {
|
|
this.wdb.emit('add filter', data);
|
|
}
|
|
|
|
/**
|
|
* Reset filter.
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async resetFilter() {
|
|
this.wdb.emit('reset filter');
|
|
}
|
|
|
|
/**
|
|
* Esimate smart fee.
|
|
* @param {Number?} blocks
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async estimateFee(blocks) {
|
|
return this.network.feeRate;
|
|
}
|
|
|
|
/**
|
|
* Get hash range.
|
|
* @param {Number} start
|
|
* @param {Number} end
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async getHashes(start = -1, end = -1) {
|
|
return [this.network.genesis.hash];
|
|
}
|
|
|
|
/**
|
|
* Get entries.
|
|
* @param {Number} [start=-1]
|
|
* @param {Number} [end=-1]
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async getEntries(start = -1, end = -1) {
|
|
const genesisBlock = Block.decode(this.network.genesisBlock);
|
|
const entry = {
|
|
hash: genesisBlock.hash(),
|
|
height: 0,
|
|
time: genesisBlock.time
|
|
};
|
|
return [entry];
|
|
}
|
|
|
|
/**
|
|
* Rescan for any missed transactions.
|
|
* @param {Number|Hash} start - Start block.
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async rescan(start) {
|
|
;
|
|
}
|
|
|
|
/**
|
|
* Rescan interactive for any missed transactions.
|
|
* @param {Number|Hash} start - Start block.
|
|
* @param {Boolean} [fullLock=false]
|
|
* @returns {Promise}
|
|
*/
|
|
|
|
async rescanInteractive(start, fullLock) {
|
|
;
|
|
}
|
|
|
|
/**
|
|
* Get opening bid height.
|
|
* @param {Buffer} nameHash
|
|
* @returns {Object}
|
|
*/
|
|
|
|
async getNameStatus(nameHash) {
|
|
return new NameState();
|
|
}
|
|
|
|
/**
|
|
* Get block header.
|
|
* @param {Hash|Number} block
|
|
* @returns {Promise<ChainEntry?>}
|
|
*/
|
|
|
|
async getBlockHeader(block) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Expose
|
|
*/
|
|
|
|
module.exports = NullClient;
|