Merge pull request #348 from braydonf/node-v4

Added compilation support for Node.js v4
This commit is contained in:
Patrick Nagurny 2015-10-29 11:21:25 -04:00
commit 275a0b57ea
9 changed files with 140 additions and 103 deletions

View File

@ -1,9 +1,17 @@
sudo: false sudo: false
language: node_js language: node_js
env: env:
- BITCORENODE_ENV=test BITCORENODE_ASSUME_YES=true - BITCORENODE_ENV=test BITCORENODE_ASSUME_YES=true CXX=g++-4.8 CC=gcc-4.8
addons:
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8
- gcc-4.8
node_js: node_js:
- "v0.12.7" - "v0.12.7"
- "v4"
before_install: before_install:
- git config --global user.email "dev@bitpay.com" - git config --global user.email "dev@bitpay.com"
- git config --global user.name "BitPay, Inc." - git config --global user.name "BitPay, Inc."

View File

@ -14,7 +14,7 @@ Note: For your convenience, we distribute binaries for x86_64 Linux and x86_64 M
## Prerequisites ## Prerequisites
- Node.js v0.12 - Node.js v0.12 or v4.2
- ~100GB of disk storage - ~100GB of disk storage
- ~4GB of RAM - ~4GB of RAM
- Mac OS X >= 10.9, Ubuntu >= 12.04 (libc >= 2.15 and libstdc++ >= 6.0.16) - Mac OS X >= 10.9, Ubuntu >= 12.04 (libc >= 2.15 and libstdc++ >= 6.0.16)

View File

@ -5,7 +5,8 @@ function getTarballName() {
var version = require(packageRoot + '/package.json').version; var version = require(packageRoot + '/package.json').version;
var platform = process.platform; var platform = process.platform;
var arch = process.arch; var arch = process.arch;
var tarballName = 'libbitcoind-' + version + '-' + platform + '-' + arch + '.tgz'; var abi = process.versions.modules;
var tarballName = 'libbitcoind-' + version + '-node' + abi + '-' + platform + '-' + arch + '.tgz';
return tarballName; return tarballName;
} }

View File

@ -48,8 +48,7 @@
"<!(./bin/variables.sh memenv)", "<!(./bin/variables.sh memenv)",
"<!(./bin/variables.sh bdb)", "<!(./bin/variables.sh bdb)",
"<!(./bin/variables.sh anl)", "<!(./bin/variables.sh anl)",
"<!(./bin/variables.sh ssl)", "<!(./bin/variables.sh ssl)"
"<!(./bin/variables.sh crypto)"
], ],
"ldflags": [ "ldflags": [
"<!(./bin/variables.sh load_archive)" "<!(./bin/variables.sh load_archive)"

View File

@ -10,7 +10,7 @@ bitcore-node start
Note: For your convenience, we distribute binaries for x86_64 Linux and x86_64 Mac OS X. Upon npm install, the binaries for your platform will be downloaded. For more detailed installation instructions, or if you want to compile the project yourself, then please see the [Build & Install](build.md) documentation to build the project from source. Note: For your convenience, we distribute binaries for x86_64 Linux and x86_64 Mac OS X. Upon npm install, the binaries for your platform will be downloaded. For more detailed installation instructions, or if you want to compile the project yourself, then please see the [Build & Install](build.md) documentation to build the project from source.
# Prerequisites # Prerequisites
- Node.js v0.12 - Node.js v0.12 or v4.2
- ~100GB of disk storage - ~100GB of disk storage
- ~4GB of RAM - ~4GB of RAM
- Mac OS X >= 10.9, Ubuntu >= 12.04 (libc >= 2.15 and libstdc++ >= 6.0.16) - Mac OS X >= 10.9, Ubuntu >= 12.04 (libc >= 2.15 and libstdc++ >= 6.0.16)

View File

@ -79,6 +79,30 @@ index fd74aef..9c79637 100644
LEVELDB_CPPFLAGS= LEVELDB_CPPFLAGS=
LIBLEVELDB= LIBLEVELDB=
LIBMEMENV= LIBMEMENV=
diff --git a/depends/hosts/linux.mk b/depends/hosts/linux.mk
index b13a0f1..0513394 100644
--- a/depends/hosts/linux.mk
+++ b/depends/hosts/linux.mk
@@ -10,15 +10,15 @@ linux_debug_CXXFLAGS=$(linux_debug_CFLAGS)
linux_debug_CPPFLAGS=-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC
ifeq (86,$(findstring 86,$(build_arch)))
-i686_linux_CC=gcc -m32
-i686_linux_CXX=g++ -m32
+i686_linux_CC=${CC} -m32
+i686_linux_CXX=${CXX} -m32
i686_linux_AR=ar
i686_linux_RANLIB=ranlib
i686_linux_NM=nm
i686_linux_STRIP=strip
-x86_64_linux_CC=gcc -m64
-x86_64_linux_CXX=g++ -m64
+x86_64_linux_CC=${CC} -m64
+x86_64_linux_CXX=${CXX} -m64
x86_64_linux_AR=ar
x86_64_linux_RANLIB=ranlib
x86_64_linux_NM=nm
diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk
index 68841af..65a105b 100644 index 68841af..65a105b 100644
--- a/depends/packages/bdb.mk --- a/depends/packages/bdb.mk

View File

@ -54,7 +54,7 @@
"commander": "^2.8.1", "commander": "^2.8.1",
"errno": "^0.1.4", "errno": "^0.1.4",
"express": "^4.13.3", "express": "^4.13.3",
"leveldown": "^1.4.1", "leveldown": "^1.4.2",
"levelup": "^1.2.1", "levelup": "^1.2.1",
"liftoff": "^2.2.0", "liftoff": "^2.2.0",
"memdown": "^1.0.0", "memdown": "^1.0.0",
@ -78,7 +78,7 @@
"bitcore-p2p": "~1.0.0" "bitcore-p2p": "~1.0.0"
}, },
"engines": { "engines": {
"node": "^0.12" "node": "^0.12 || ^4.2"
}, },
"os": [ "os": [
"darwin", "darwin",

View File

@ -161,7 +161,7 @@ struct async_node_data {
struct async_block_data { struct async_block_data {
uv_work_t req; uv_work_t req;
std::string err_msg; std::string err_msg;
std::string hash; uint256 hash;
int64_t height; int64_t height;
char* buffer; char* buffer;
uint32_t size; uint32_t size;
@ -261,7 +261,7 @@ NAN_METHOD(StartTxMon) {
static void static void
tx_notifier(uv_async_t *handle) { tx_notifier(uv_async_t *handle) {
Isolate* isolate = GetCurrentContext()->GetIsolate(); Isolate* isolate = Isolate::GetCurrent();
HandleScope scope(isolate); HandleScope scope(isolate);
Local<Array> results = Array::New(isolate); Local<Array> results = Array::New(isolate);
@ -273,15 +273,15 @@ tx_notifier(uv_async_t *handle) {
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
ssTx << tx; ssTx << tx;
std::string stx = ssTx.str(); std::string stx = ssTx.str();
Local<Value> txBuffer = node::Buffer::New(isolate, stx.c_str(), stx.size()); Nan::MaybeLocal<v8::Object> txBuffer = Nan::CopyBuffer((char *)stx.c_str(), stx.size());
uint256 hash = tx.GetHash(); uint256 hash = tx.GetHash();
Local<Object> obj = New<Object>(); Local<Object> obj = New<Object>();
Set(obj, New("buffer").ToLocalChecked(), txBuffer); Nan::Set(obj, New("buffer").ToLocalChecked(), txBuffer.ToLocalChecked());
Set(obj, New("hash").ToLocalChecked(), New(hash.GetHex()).ToLocalChecked()); Nan::Set(obj, New("hash").ToLocalChecked(), New(hash.GetHex()).ToLocalChecked());
Set(obj, New("mempool").ToLocalChecked(), New<Boolean>(true)); Nan::Set(obj, New("mempool").ToLocalChecked(), New<Boolean>(true));
results->Set(arrayIndex, obj); results->Set(arrayIndex, obj);
arrayIndex++; arrayIndex++;
@ -352,7 +352,7 @@ async_tip_update_after(uv_work_t *r) {
HandleScope scope(isolate); HandleScope scope(isolate);
Local<Function> cb = Local<Function>::New(isolate, req->callback); Local<Function> cb = Local<Function>::New(isolate, req->callback);
TryCatch try_catch; Nan::TryCatch try_catch;
Local<Value> result = Undefined(isolate); Local<Value> result = Undefined(isolate);
if (!shutdown_complete) { if (!shutdown_complete) {
@ -363,11 +363,10 @@ async_tip_update_after(uv_work_t *r) {
}; };
cb->Call(isolate->GetCurrentContext()->Global(), 1, argv); cb->Call(isolate->GetCurrentContext()->Global(), 1, argv);
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); Nan::FatalException(try_catch);
} }
req->callback.Reset(); req->callback.Reset();
delete req;
} }
NAN_METHOD(OnBlocksReady) { NAN_METHOD(OnBlocksReady) {
@ -443,7 +442,7 @@ async_blocks_ready_after(uv_work_t *r) {
Isolate* isolate = req->isolate; Isolate* isolate = req->isolate;
HandleScope scope(isolate); HandleScope scope(isolate);
TryCatch try_catch; Nan::TryCatch try_catch;
Local<Function> cb = Local<Function>::New(isolate, req->callback); Local<Function> cb = Local<Function>::New(isolate, req->callback);
if (req->err_msg != "") { if (req->err_msg != "") {
@ -459,11 +458,10 @@ async_blocks_ready_after(uv_work_t *r) {
} }
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); Nan::FatalException(try_catch);
} }
req->callback.Reset(); req->callback.Reset();
delete req;
} }
/** /**
@ -575,7 +573,7 @@ async_start_node_after(uv_work_t *r) {
Isolate* isolate = req->isolate; Isolate* isolate = req->isolate;
HandleScope scope(isolate); HandleScope scope(isolate);
TryCatch try_catch; Nan::TryCatch try_catch;
Local<Function> cb = Local<Function>::New(isolate, req->callback); Local<Function> cb = Local<Function>::New(isolate, req->callback);
if (req->err_msg != "") { if (req->err_msg != "") {
@ -591,11 +589,10 @@ async_start_node_after(uv_work_t *r) {
} }
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); Nan::FatalException(try_catch);
} }
req->callback.Reset(); req->callback.Reset();
delete req;
} }
/** /**
@ -789,7 +786,7 @@ async_stop_node_after(uv_work_t *r) {
Isolate* isolate = req->isolate; Isolate* isolate = req->isolate;
HandleScope scope(isolate); HandleScope scope(isolate);
TryCatch try_catch; Nan::TryCatch try_catch;
Local<Function> cb = Local<Function>::New(isolate, req->callback); Local<Function> cb = Local<Function>::New(isolate, req->callback);
if (req->err_msg != "") { if (req->err_msg != "") {
@ -805,10 +802,9 @@ async_stop_node_after(uv_work_t *r) {
} }
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); Nan::FatalException(try_catch);
} }
req->callback.Reset(); req->callback.Reset();
delete req;
} }
/** /**
@ -832,13 +828,11 @@ NAN_METHOD(GetBlock) {
if (info[0]->IsNumber()) { if (info[0]->IsNumber()) {
int64_t height = info[0]->IntegerValue(); int64_t height = info[0]->IntegerValue();
req->err_msg = std::string(""); req->err_msg = std::string("");
req->hash = std::string("");
req->height = height; req->height = height;
} else { } else {
String::Utf8Value hash_(info[0]->ToString()); std::string hash = *Nan::Utf8String(info[0]);
std::string hash = std::string(*hash_);
req->err_msg = std::string(""); req->err_msg = std::string("");
req->hash = hash; req->hash = uint256S(hash);
req->height = -1; req->height = -1;
} }
@ -861,7 +855,6 @@ async_get_block(uv_work_t *req) {
async_block_data* data = reinterpret_cast<async_block_data*>(req->data); async_block_data* data = reinterpret_cast<async_block_data*>(req->data);
CBlockIndex* pblockindex; CBlockIndex* pblockindex;
uint256 hash = uint256S(data->hash);
if (data->height != -1) { if (data->height != -1) {
pblockindex = chainActive[data->height]; pblockindex = chainActive[data->height];
@ -870,11 +863,11 @@ async_get_block(uv_work_t *req) {
return; return;
} }
} else { } else {
if (mapBlockIndex.count(hash) == 0) { if (mapBlockIndex.count(data->hash) == 0) {
data->err_msg = std::string("Block not found."); data->err_msg = std::string("Block not found.");
return; return;
} else { } else {
pblockindex = mapBlockIndex[hash]; pblockindex = mapBlockIndex[data->hash];
} }
} }
@ -917,7 +910,7 @@ async_get_block_after(uv_work_t *r) {
Isolate *isolate = req->isolate; Isolate *isolate = req->isolate;
HandleScope scope(isolate); HandleScope scope(isolate);
TryCatch try_catch; Nan::TryCatch try_catch;
Local<Function> cb = Local<Function>::New(isolate, req->callback); Local<Function> cb = Local<Function>::New(isolate, req->callback);
if (req->err_msg != "") { if (req->err_msg != "") {
@ -926,24 +919,20 @@ async_get_block_after(uv_work_t *r) {
cb->Call(isolate->GetCurrentContext()->Global(), 1, argv); cb->Call(isolate->GetCurrentContext()->Global(), 1, argv);
} else { } else {
Local<Value> rawNodeBuffer = node::Buffer::New(isolate, req->buffer, req->size); Nan::MaybeLocal<v8::Object> rawNodeBuffer = Nan::NewBuffer(req->buffer, req->size);
delete req->buffer;
req->buffer = NULL;
Local<Value> argv[2] = { Local<Value> argv[2] = {
Local<Value>::New(isolate, Null()), Local<Value>::New(isolate, Null()),
rawNodeBuffer rawNodeBuffer.ToLocalChecked()
}; };
cb->Call(isolate->GetCurrentContext()->Global(), 2, argv); cb->Call(isolate->GetCurrentContext()->Global(), 2, argv);
} }
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); Nan::FatalException(try_catch);
} }
req->callback.Reset(); req->callback.Reset();
delete req;
} }
/** /**
@ -963,17 +952,14 @@ NAN_METHOD(GetTransaction) {
"Usage: daemon.getTransaction(txid, queryMempool, callback)"); "Usage: daemon.getTransaction(txid, queryMempool, callback)");
} }
String::Utf8Value txid_(info[0]->ToString()); std::string txid = *Nan::Utf8String(info[0]);
bool queryMempool = info[1]->BooleanValue(); bool queryMempool = info[1]->BooleanValue();
Local<Function> callback = Local<Function>::Cast(info[2]); Local<Function> callback = Local<Function>::Cast(info[2]);
async_tx_data *req = new async_tx_data(); async_tx_data *req = new async_tx_data();
req->err_msg = std::string(""); req->err_msg = std::string("");
req->txid = std::string("");
std::string txid = std::string(*txid_);
req->txid = txid; req->txid = txid;
req->queryMempool = queryMempool; req->queryMempool = queryMempool;
req->isolate = isolate; req->isolate = isolate;
@ -993,8 +979,8 @@ static void
async_get_tx(uv_work_t *req) { async_get_tx(uv_work_t *req) {
async_tx_data* data = reinterpret_cast<async_tx_data*>(req->data); async_tx_data* data = reinterpret_cast<async_tx_data*>(req->data);
uint256 hash = uint256S(data->txid);
uint256 blockhash; uint256 blockhash;
uint256 hash = uint256S(data->txid);
CTransaction ctx; CTransaction ctx;
if (data->queryMempool) { if (data->queryMempool) {
@ -1040,7 +1026,7 @@ async_get_tx_after(uv_work_t *r) {
HandleScope scope(isolate); HandleScope scope(isolate);
CTransaction ctx = req->ctx; CTransaction ctx = req->ctx;
TryCatch try_catch; Nan::TryCatch try_catch;
Local<Function> cb = Local<Function>::New(isolate, req->callback); Local<Function> cb = Local<Function>::New(isolate, req->callback);
if (req->err_msg != "") { if (req->err_msg != "") {
@ -1049,28 +1035,32 @@ async_get_tx_after(uv_work_t *r) {
cb->Call(isolate->GetCurrentContext()->Global(), 1, argv); cb->Call(isolate->GetCurrentContext()->Global(), 1, argv);
} else { } else {
Local<Value> result = Local<Value>::New(isolate, Null());
if (!ctx.IsNull()) { if (!ctx.IsNull()) {
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
ssTx << ctx; ssTx << ctx;
std::string stx = ssTx.str(); std::string stx = ssTx.str();
result = node::Buffer::New(isolate, stx.c_str(), stx.size()); Nan::MaybeLocal<v8::Object> result = Nan::CopyBuffer((char *)stx.c_str(), stx.size());
Local<Value> argv[2] = {
Local<Value>::New(isolate, Null()),
result.ToLocalChecked()
};
cb->Call(isolate->GetCurrentContext()->Global(), 2, argv);
} else {
Local<Value> argv[2] = {
Local<Value>::New(isolate, Null()),
Local<Value>::New(isolate, Null())
};
cb->Call(isolate->GetCurrentContext()->Global(), 2, argv);
} }
Local<Value> argv[2] = {
Local<Value>::New(isolate, Null()),
result
};
cb->Call(isolate->GetCurrentContext()->Global(), 2, argv);
} }
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); Nan::FatalException(try_catch);
} }
req->callback.Reset(); req->callback.Reset();
delete req;
} }
/** /**
@ -1182,7 +1172,7 @@ async_get_tx_and_info_after(uv_work_t *r) {
HandleScope scope(isolate); HandleScope scope(isolate);
CTransaction ctx = req->ctx; CTransaction ctx = req->ctx;
TryCatch try_catch; Nan::TryCatch try_catch;
Local<Function> cb = Local<Function>::New(isolate, req->callback); Local<Function> cb = Local<Function>::New(isolate, req->callback);
Local<Object> obj = New<Object>(); Local<Object> obj = New<Object>();
@ -1195,12 +1185,12 @@ async_get_tx_and_info_after(uv_work_t *r) {
CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION); CDataStream ssTx(SER_NETWORK, PROTOCOL_VERSION);
ssTx << ctx; ssTx << ctx;
std::string stx = ssTx.str(); std::string stx = ssTx.str();
Local<Value> rawNodeBuffer = node::Buffer::New(isolate, stx.c_str(), stx.size()); Nan::MaybeLocal<v8::Object> rawNodeBuffer = Nan::CopyBuffer((char *)stx.c_str(), stx.size());
Set(obj, New("blockHash").ToLocalChecked(), New(req->blockHash).ToLocalChecked()); Nan::Set(obj, New("blockHash").ToLocalChecked(), New(req->blockHash).ToLocalChecked());
Set(obj, New("height").ToLocalChecked(), New<Number>(req->height)); Nan::Set(obj, New("height").ToLocalChecked(), New<Number>(req->height));
Set(obj, New("timestamp").ToLocalChecked(), New<Number>(req->nTime)); Nan::Set(obj, New("timestamp").ToLocalChecked(), New<Number>(req->nTime));
Set(obj, New("buffer").ToLocalChecked(), rawNodeBuffer); Nan::Set(obj, New("buffer").ToLocalChecked(), rawNodeBuffer.ToLocalChecked());
Local<Value> argv[2] = { Local<Value> argv[2] = {
Local<Value>::New(isolate, Null()), Local<Value>::New(isolate, Null()),
@ -1209,10 +1199,9 @@ async_get_tx_and_info_after(uv_work_t *r) {
cb->Call(isolate->GetCurrentContext()->Global(), 2, argv); cb->Call(isolate->GetCurrentContext()->Global(), 2, argv);
} }
if (try_catch.HasCaught()) { if (try_catch.HasCaught()) {
node::FatalException(try_catch); Nan::FatalException(try_catch);
} }
req->callback.Reset(); req->callback.Reset();
delete req;
} }
/** /**
@ -1290,15 +1279,15 @@ NAN_METHOD(GetBlockIndex) {
CBlockIndex* prevBlockIndex = blockIndex->pprev; CBlockIndex* prevBlockIndex = blockIndex->pprev;
if (&prevBlockIndex->phashBlock != 0) { if (&prevBlockIndex->phashBlock != 0) {
const uint256* prevHash = prevBlockIndex->phashBlock; const uint256* prevHash = prevBlockIndex->phashBlock;
Set(obj, New("prevHash").ToLocalChecked(), New(prevHash->GetHex()).ToLocalChecked()); Nan::Set(obj, New("prevHash").ToLocalChecked(), New(prevHash->GetHex()).ToLocalChecked());
} else { } else {
Set(obj, New("prevHash").ToLocalChecked(), Null()); Nan::Set(obj, New("prevHash").ToLocalChecked(), Null());
} }
Set(obj, New("hash").ToLocalChecked(), New(blockIndex->phashBlock->GetHex()).ToLocalChecked()); Nan::Set(obj, New("hash").ToLocalChecked(), New(blockIndex->phashBlock->GetHex()).ToLocalChecked());
Set(obj, New("chainWork").ToLocalChecked(), New(cw.GetHex()).ToLocalChecked()); Nan::Set(obj, New("chainWork").ToLocalChecked(), New(cw.GetHex()).ToLocalChecked());
Set(obj, New("height").ToLocalChecked(), New<Number>(blockIndex->nHeight)); Nan::Set(obj, New("height").ToLocalChecked(), New<Number>(blockIndex->nHeight));
info.GetReturnValue().Set(obj); info.GetReturnValue().Set(obj);
}; };
@ -1350,15 +1339,15 @@ NAN_METHOD(GetInfo) {
proxyType proxy; proxyType proxy;
GetProxy(NET_IPV4, proxy); GetProxy(NET_IPV4, proxy);
Set(obj, New("version").ToLocalChecked(), New<Number>(CLIENT_VERSION)); Nan::Set(obj, New("version").ToLocalChecked(), New<Number>(CLIENT_VERSION));
Set(obj, New("protocolversion").ToLocalChecked(), New<Number>(PROTOCOL_VERSION)); Nan::Set(obj, New("protocolversion").ToLocalChecked(), New<Number>(PROTOCOL_VERSION));
Set(obj, New("blocks").ToLocalChecked(), New<Number>((int)chainActive.Height())->ToInt32()); Nan::Set(obj, New("blocks").ToLocalChecked(), New<Number>((int)chainActive.Height())->ToInt32());
Set(obj, New("timeoffset").ToLocalChecked(), New<Number>(GetTimeOffset())); Nan::Set(obj, New("timeoffset").ToLocalChecked(), New<Number>(GetTimeOffset()));
Set(obj, New("connections").ToLocalChecked(), New<Number>((int)vNodes.size())->ToInt32()); Nan::Set(obj, New("connections").ToLocalChecked(), New<Number>((int)vNodes.size())->ToInt32());
Set(obj, New("difficulty").ToLocalChecked(), New<Number>((double)GetDifficulty())); Nan::Set(obj, New("difficulty").ToLocalChecked(), New<Number>((double)GetDifficulty()));
Set(obj, New("testnet").ToLocalChecked(), New<Boolean>(Params().NetworkIDString() == "test")); Nan::Set(obj, New("testnet").ToLocalChecked(), New<Boolean>(Params().NetworkIDString() == "test"));
Set(obj, New("relayfee").ToLocalChecked(), New<Number>(::minRelayTxFee.GetFeePerK())); // double Nan::Set(obj, New("relayfee").ToLocalChecked(), New<Number>(::minRelayTxFee.GetFeePerK())); // double
Set(obj, New("errors").ToLocalChecked(), New(GetWarnings("statusbar")).ToLocalChecked()); Nan::Set(obj, New("errors").ToLocalChecked(), New(GetWarnings("statusbar")).ToLocalChecked());
info.GetReturnValue().Set(obj); info.GetReturnValue().Set(obj);
} }
@ -1473,8 +1462,8 @@ NAN_METHOD(GetMempoolTransactions) {
CDataStream dataStreamTx(SER_NETWORK, PROTOCOL_VERSION); CDataStream dataStreamTx(SER_NETWORK, PROTOCOL_VERSION);
dataStreamTx << tx; dataStreamTx << tx;
std::string txString = dataStreamTx.str(); std::string txString = dataStreamTx.str();
Local<Value> txBuffer = node::Buffer::New(isolate, txString.c_str(), txString.size()); Nan::MaybeLocal<v8::Object> txBuffer = Nan::CopyBuffer((char *)txString.c_str(), txString.size());
transactions->Set(arrayIndex, txBuffer); transactions->Set(arrayIndex, txBuffer.ToLocalChecked());
arrayIndex++; arrayIndex++;
} }
} }
@ -1521,28 +1510,27 @@ set_cooked(void) {
* Init() * Init()
* Initialize the singleton object known as bitcoind. * Initialize the singleton object known as bitcoind.
*/ */
NAN_MODULE_INIT(init) { NAN_MODULE_INIT(init) {
Set(target, New("start").ToLocalChecked(), GetFunction(New<FunctionTemplate>(StartBitcoind)).ToLocalChecked()); Nan::Set(target, New("start").ToLocalChecked(), GetFunction(New<FunctionTemplate>(StartBitcoind)).ToLocalChecked());
Set(target, New("onBlocksReady").ToLocalChecked(), GetFunction(New<FunctionTemplate>(OnBlocksReady)).ToLocalChecked()); Nan::Set(target, New("onBlocksReady").ToLocalChecked(), GetFunction(New<FunctionTemplate>(OnBlocksReady)).ToLocalChecked());
Set(target, New("onTipUpdate").ToLocalChecked(), GetFunction(New<FunctionTemplate>(OnTipUpdate)).ToLocalChecked()); Nan::Set(target, New("onTipUpdate").ToLocalChecked(), GetFunction(New<FunctionTemplate>(OnTipUpdate)).ToLocalChecked());
Set(target, New("stop").ToLocalChecked(), GetFunction(New<FunctionTemplate>(StopBitcoind)).ToLocalChecked()); Nan::Set(target, New("stop").ToLocalChecked(), GetFunction(New<FunctionTemplate>(StopBitcoind)).ToLocalChecked());
Set(target, New("getBlock").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetBlock)).ToLocalChecked()); Nan::Set(target, New("getBlock").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetBlock)).ToLocalChecked());
Set(target, New("getTransaction").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetTransaction)).ToLocalChecked()); Nan::Set(target, New("getTransaction").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetTransaction)).ToLocalChecked());
Set(target, New("getTransactionWithBlockInfo").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetTransactionWithBlockInfo)).ToLocalChecked()); Nan::Set(target, New("getTransactionWithBlockInfo").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetTransactionWithBlockInfo)).ToLocalChecked());
Set(target, New("getInfo").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetInfo)).ToLocalChecked()); Nan::Set(target, New("getInfo").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetInfo)).ToLocalChecked());
Set(target, New("isSpent").ToLocalChecked(), GetFunction(New<FunctionTemplate>(IsSpent)).ToLocalChecked()); Nan::Set(target, New("isSpent").ToLocalChecked(), GetFunction(New<FunctionTemplate>(IsSpent)).ToLocalChecked());
Set(target, New("getBlockIndex").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetBlockIndex)).ToLocalChecked()); Nan::Set(target, New("getBlockIndex").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetBlockIndex)).ToLocalChecked());
Set(target, New("isMainChain").ToLocalChecked(), GetFunction(New<FunctionTemplate>(IsMainChain)).ToLocalChecked()); Nan::Set(target, New("isMainChain").ToLocalChecked(), GetFunction(New<FunctionTemplate>(IsMainChain)).ToLocalChecked());
Set(target, New("getMempoolTransactions").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetMempoolTransactions)).ToLocalChecked()); Nan::Set(target, New("getMempoolTransactions").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetMempoolTransactions)).ToLocalChecked());
Set(target, New("addMempoolUncheckedTransaction").ToLocalChecked(), GetFunction(New<FunctionTemplate>(AddMempoolUncheckedTransaction)).ToLocalChecked()); Nan::Set(target, New("addMempoolUncheckedTransaction").ToLocalChecked(), GetFunction(New<FunctionTemplate>(AddMempoolUncheckedTransaction)).ToLocalChecked());
Set(target, New("sendTransaction").ToLocalChecked(), GetFunction(New<FunctionTemplate>(SendTransaction)).ToLocalChecked()); Nan::Set(target, New("sendTransaction").ToLocalChecked(), GetFunction(New<FunctionTemplate>(SendTransaction)).ToLocalChecked());
Set(target, New("estimateFee").ToLocalChecked(), GetFunction(New<FunctionTemplate>(EstimateFee)).ToLocalChecked()); Nan::Set(target, New("estimateFee").ToLocalChecked(), GetFunction(New<FunctionTemplate>(EstimateFee)).ToLocalChecked());
Set(target, New("startTxMon").ToLocalChecked(), GetFunction(New<FunctionTemplate>(StartTxMon)).ToLocalChecked()); Nan::Set(target, New("startTxMon").ToLocalChecked(), GetFunction(New<FunctionTemplate>(StartTxMon)).ToLocalChecked());
Set(target, New("syncPercentage").ToLocalChecked(), GetFunction(New<FunctionTemplate>(SyncPercentage)).ToLocalChecked()); Nan::Set(target, New("syncPercentage").ToLocalChecked(), GetFunction(New<FunctionTemplate>(SyncPercentage)).ToLocalChecked());
Set(target, New("isSynced").ToLocalChecked(), GetFunction(New<FunctionTemplate>(IsSynced)).ToLocalChecked()); Nan::Set(target, New("isSynced").ToLocalChecked(), GetFunction(New<FunctionTemplate>(IsSynced)).ToLocalChecked());
Set(target, New("getBestBlockHash").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetBestBlockHash)).ToLocalChecked()); Nan::Set(target, New("getBestBlockHash").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetBestBlockHash)).ToLocalChecked());
Set(target, New("getNextBlockHash").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetNextBlockHash)).ToLocalChecked()); Nan::Set(target, New("getNextBlockHash").ToLocalChecked(), GetFunction(New<FunctionTemplate>(GetNextBlockHash)).ToLocalChecked());
} }
NODE_MODULE(libbitcoind, init); NODE_MODULE(libbitcoind, init);

View File

@ -0,0 +1,17 @@
'use strict';
var should = require('chai').should();
var path = require('path');
var getTarballName = require('../../bin/get-tarball-name');
describe('#getTarballName', function() {
it('will return the expected tarball name', function() {
var name = getTarballName();
var version = require(path.resolve(__dirname + '../../../package.json')).version;
var platform = process.platform;
var arch = process.arch;
var abi = process.versions.modules;
var expected = 'libbitcoind-' + version + '-node' + abi + '-' + platform + '-' + arch + '.tgz';
name.should.equal(expected);
});
});