diff --git a/index.js b/index.js index 80f8330c..a52e200e 100644 --- a/index.js +++ b/index.js @@ -1,2 +1 @@ -var os = process.platform === 'win32' ? '_win' : ''; -module.exports = require('./lib/pty'+ os +'.js'); +module.exports = require('./lib/bitcoind.js'); diff --git a/lib/bitcoind.js b/lib/bitcoind.js index e6f8143c..d0f5c51b 100644 --- a/lib/bitcoind.js +++ b/lib/bitcoind.js @@ -15,14 +15,14 @@ var bitcoindjs = require('../build/Release/bitcoindjs.node'); function Bitcoin(flag) { var self = this; - if (!(this instanceof Bitcoind)) { - return new Bitcoind(flag); + if (!(this instanceof Bitcoin)) { + return new Bitcoin(flag); } EventEmitter.call(this); - var ret = bitcoindjs.start(function() { - self.emit('open'); + var ret = bitcoindjs.start(function(err, status) { + self.emit('open', status); }); this.ret = ret; diff --git a/package.json b/package.json index eb5afdc5..1cd088ba 100644 --- a/package.json +++ b/package.json @@ -9,11 +9,6 @@ "bugs": { "url": "https://github.com/chjj/bitcoind.js/issues" }, - "keywords": [ - "pty", - "tty", - "terminal" - ], "scripts": { "test": "NODE_ENV=test mocha -R spec" }, diff --git a/src/bitcoindjs.cc b/src/bitcoindjs.cc index 992f79a8..6da615d3 100644 --- a/src/bitcoindjs.cc +++ b/src/bitcoindjs.cc @@ -8,6 +8,9 @@ #include "nan.h" +#include +#include + #include #include #include @@ -22,12 +25,22 @@ using namespace v8; NAN_METHOD(StartBitcoind); -static int -misc_func(const char *); +void +async_work(uv_work_t *req); + +void +async_after(uv_work_t *req); extern "C" void init(Handle); +struct async_data { + Persistent callback; + bool err; + std::string err_msg; + char *result; +}; + /** * StartBitcoind * bitcoind.start(callback) @@ -41,19 +54,75 @@ NAN_METHOD(StartBitcoind) { "Usage: bitcoind.start(callback)"); } - Local obj = NanNew(); - obj->Set(NanNew("foo"), NanNew(100)); + Local callback = Local::Cast(args[0]); - NanReturnValue(obj); + // Local err = Exception::Error(String::New("Bad input")); + // err->ToObject()->Set(NODE_PSYMBOL("errno"), Integer::New(0)); + // const unsigned argc = 1; + // Local argv[1] = { err }; + // callback->Call(Context::GetCurrent()->Global(), argc, argv); + + // const unsigned argc = 2; + // Local argv[2] = { + // Local::New(Null()), + // Local::New(String::New("opened")) + // }; + // callback->Call(Context::GetCurrent()->Global(), argc, argv); + + async_data* data = new async_data(); + data->err = false; + data->callback = Persistent::New(callback); + + uv_work_t *req = new uv_work_t(); + req->data = data; + + int status = uv_queue_work(uv_default_loop(), + req, async_work, (uv_after_work_cb)async_after); + + assert(status == 0); + + NanReturnValue(Undefined()); } -/** - * misc_func - */ +void async_work(uv_work_t *req) { + async_data* data = static_cast(req->data); + data->result = (char *)strdup("opened"); +} -static int -misc_func(const char *file) { - return 0; +void async_after(uv_work_t *req) { + NanScope(); + async_data* data = static_cast(req->data); + + if (data->err) { + Local err = Exception::Error(String::New(data->err_msg.c_str())); + const unsigned argc = 1; + Local argv[1] = { err }; + TryCatch try_catch; + data->callback->Call(Context::GetCurrent()->Global(), argc, argv); + if (try_catch.HasCaught()) { + node::FatalException(try_catch); + } + } else { + const unsigned argc = 2; + Local argv[2] = { + Local::New(Null()), + Local::New(String::New(data->result)) + }; + TryCatch try_catch; + data->callback->Call(Context::GetCurrent()->Global(), argc, argv); + if (try_catch.HasCaught()) { + node::FatalException(try_catch); + } + } + + data->callback.Dispose(); + + if (data->result != NULL) { + free(data->result); + } + + delete data; + delete req; } /**