add GetProgess() method.
This commit is contained in:
parent
2f83b739f4
commit
50bcaf2918
|
@ -353,6 +353,10 @@ Bitcoin.prototype.getAddresses = function() {
|
||||||
return bitcoindjs.getAddresses();
|
return bitcoindjs.getAddresses();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Bitcoin.prototype.getProgress = function(callback) {
|
||||||
|
return bitcoindjs.getProgress(callback);
|
||||||
|
};
|
||||||
|
|
||||||
Bitcoin.prototype.log =
|
Bitcoin.prototype.log =
|
||||||
Bitcoin.prototype.info = function() {
|
Bitcoin.prototype.info = function() {
|
||||||
if (typeof arguments[0] !== 'string') {
|
if (typeof arguments[0] !== 'string') {
|
||||||
|
|
|
@ -167,6 +167,7 @@ NAN_METHOD(FillTransaction);
|
||||||
NAN_METHOD(GetInfo);
|
NAN_METHOD(GetInfo);
|
||||||
NAN_METHOD(GetPeerInfo);
|
NAN_METHOD(GetPeerInfo);
|
||||||
NAN_METHOD(GetAddresses);
|
NAN_METHOD(GetAddresses);
|
||||||
|
NAN_METHOD(GetProgress);
|
||||||
NAN_METHOD(GetBlockHex);
|
NAN_METHOD(GetBlockHex);
|
||||||
NAN_METHOD(GetTxHex);
|
NAN_METHOD(GetTxHex);
|
||||||
NAN_METHOD(BlockFromHex);
|
NAN_METHOD(BlockFromHex);
|
||||||
|
@ -226,6 +227,9 @@ async_get_block(uv_work_t *req);
|
||||||
static void
|
static void
|
||||||
async_get_block_after(uv_work_t *req);
|
async_get_block_after(uv_work_t *req);
|
||||||
|
|
||||||
|
static void
|
||||||
|
async_get_progress_after(uv_work_t *req);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
async_get_tx(uv_work_t *req);
|
async_get_tx(uv_work_t *req);
|
||||||
|
|
||||||
|
@ -1396,6 +1400,100 @@ NAN_METHOD(GetAddresses) {
|
||||||
NanReturnValue(array);
|
NanReturnValue(array);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GetProgress()
|
||||||
|
* bitcoindjs.getProgress(callback)
|
||||||
|
* Get progress of blockchain download
|
||||||
|
*/
|
||||||
|
|
||||||
|
NAN_METHOD(GetProgress) {
|
||||||
|
NanScope();
|
||||||
|
|
||||||
|
if (args.Length() < 1 || !args[0]->IsFunction()) {
|
||||||
|
return NanThrowError(
|
||||||
|
"Usage: bitcoindjs.getProgress(callback)");
|
||||||
|
}
|
||||||
|
|
||||||
|
Local<Function> callback = Local<Function>::Cast(args[0]);
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
NOTES:
|
||||||
|
chainActive.Height()
|
||||||
|
CBlockIndex *pindexMax = chainActive[std::max(0, chainActive.Height() - 144)]; // the tip can be reorganised; use a 144-block safety margin
|
||||||
|
if (!pindex || !chainActive.Contains(pindex))
|
||||||
|
return chainActive.Height() - pindex->nHeight + 1;
|
||||||
|
while (pindex && nTimeFirstKey && (pindex->GetBlockTime() < (nTimeFirstKey - 7200)))
|
||||||
|
pindex = chainActive.Next(pindex);
|
||||||
|
double dProgressTip = Checkpoints::GuessVerificationProgress(chainActive.Tip(), false);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
CBlockIndex *pindex = chainActive.Tip();
|
||||||
|
|
||||||
|
// pindex->nHeight;
|
||||||
|
// pindex->GetBlockHash();
|
||||||
|
|
||||||
|
async_block_data *data = new async_block_data();
|
||||||
|
data->err_msg = std::string("");
|
||||||
|
data->hash = pindex->GetBlockHash();
|
||||||
|
data->callback = Persistent<Function>::New(callback);
|
||||||
|
|
||||||
|
uv_work_t *req = new uv_work_t();
|
||||||
|
req->data = data;
|
||||||
|
|
||||||
|
int status = uv_queue_work(uv_default_loop(),
|
||||||
|
req, async_get_block,
|
||||||
|
(uv_after_work_cb)async_get_progress_after);
|
||||||
|
|
||||||
|
assert(status == 0);
|
||||||
|
|
||||||
|
NanReturnValue(Undefined());
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
async_get_progress_after(uv_work_t *req) {
|
||||||
|
NanScope();
|
||||||
|
async_block_data* data = static_cast<async_block_data*>(req->data);
|
||||||
|
|
||||||
|
if (!data->err_msg.empty()) {
|
||||||
|
Local<Value> err = Exception::Error(String::New(data->err_msg.c_str()));
|
||||||
|
const unsigned argc = 1;
|
||||||
|
Local<Value> argv[argc] = { err };
|
||||||
|
TryCatch try_catch;
|
||||||
|
data->callback->Call(Context::GetCurrent()->Global(), argc, argv);
|
||||||
|
if (try_catch.HasCaught()) {
|
||||||
|
node::FatalException(try_catch);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const CBlock& cblock = data->result_block;
|
||||||
|
|
||||||
|
uint32_t ts_ = cblock.GetBlockTime();
|
||||||
|
time_t now_ = time(NULL);
|
||||||
|
|
||||||
|
uint64_t ts = (uint64_t)ts_;
|
||||||
|
// Assume last block was ten minutes ago:
|
||||||
|
uint64_t now = ((uint64_t)now_ * 1000) - (10 * (60 * 1000));
|
||||||
|
|
||||||
|
uint64_t diff = now - ts;
|
||||||
|
unsigned int perc = 100 - (diff / now * 100);
|
||||||
|
|
||||||
|
const unsigned argc = 2;
|
||||||
|
Local<Value> argv[argc] = {
|
||||||
|
Local<Value>::New(Null()),
|
||||||
|
Local<Value>::New(NanNew<Number>(perc))
|
||||||
|
};
|
||||||
|
TryCatch try_catch;
|
||||||
|
data->callback->Call(Context::GetCurrent()->Global(), argc, argv);
|
||||||
|
if (try_catch.HasCaught()) {
|
||||||
|
node::FatalException(try_catch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
data->callback.Dispose();
|
||||||
|
|
||||||
|
delete data;
|
||||||
|
delete req;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GetBlockHex()
|
* GetBlockHex()
|
||||||
* bitcoindjs.getBlockHex(callback)
|
* bitcoindjs.getBlockHex(callback)
|
||||||
|
@ -3798,6 +3896,7 @@ init(Handle<Object> target) {
|
||||||
NODE_SET_METHOD(target, "getInfo", GetInfo);
|
NODE_SET_METHOD(target, "getInfo", GetInfo);
|
||||||
NODE_SET_METHOD(target, "getPeerInfo", GetPeerInfo);
|
NODE_SET_METHOD(target, "getPeerInfo", GetPeerInfo);
|
||||||
NODE_SET_METHOD(target, "getAddresses", GetAddresses);
|
NODE_SET_METHOD(target, "getAddresses", GetAddresses);
|
||||||
|
NODE_SET_METHOD(target, "getProgress", GetProgress);
|
||||||
NODE_SET_METHOD(target, "getBlockHex", GetBlockHex);
|
NODE_SET_METHOD(target, "getBlockHex", GetBlockHex);
|
||||||
NODE_SET_METHOD(target, "getTxHex", GetTxHex);
|
NODE_SET_METHOD(target, "getTxHex", GetTxHex);
|
||||||
NODE_SET_METHOD(target, "blockFromHex", BlockFromHex);
|
NODE_SET_METHOD(target, "blockFromHex", BlockFromHex);
|
||||||
|
|
Loading…
Reference in New Issue