Compare commits

...

10 Commits

Author SHA1 Message Date
Kagami Hiiragi
399e227815 0.6.6 2015-11-13 22:36:13 +03:00
Kagami Hiiragi
d2c0cebc96 Add missed "use strict" 2015-11-13 22:04:56 +03:00
Kagami Hiiragi
8310ff1a9c Fix for latest nan and eccrypto
Fixes #17
2015-11-13 21:32:32 +03:00
Kagami Hiiragi
4c184c2a25 Use newer GCC
See nodejs/nan#435
2015-09-29 17:39:34 +03:00
Kagami Hiiragi
bf76d6fcf9 Run tests on Node v4 on travis too 2015-09-29 17:24:33 +03:00
Kagami Hiiragi
5b6899e24b Bump bignum 2015-09-29 17:18:21 +03:00
Kagami Hiiragi
6e74d4f1af Merge pull request #16 from echom/master
wrapping ntohll in ifndef for mac
2015-09-29 17:17:11 +03:00
Jörg Hösel
b3239d25a1 wrapping ntohll in ifndef for mac 2015-09-29 15:32:36 +02:00
Kagami Hiiragi
cdd490ee02 0.6.5 2015-07-13 22:11:48 +03:00
Kagami Hiiragi
651ce9b981 Fix POW test 2015-07-13 22:11:18 +03:00
6 changed files with 45 additions and 37 deletions

View File

@ -3,9 +3,17 @@ node_js:
- "0.10" - "0.10"
- "0.12" - "0.12"
- "iojs" - "iojs"
- "4"
sudo: false sudo: false
addons: addons:
firefox: "34.0" firefox: "34.0"
apt:
sources:
- ubuntu-toolchain-r-test
packages:
- g++-4.8
env:
- CXX=g++-4.8
notifications: notifications:
email: email:
on_success: never on_success: never

View File

@ -3,10 +3,12 @@
* addon and makes it available for Node. * addon and makes it available for Node.
*/ */
"use strict";
try { try {
module.exports = require("../build/Release/worker"); module.exports = require("../build/Release/worker");
} catch(e) { } catch(e) {
// Do nothing for a moment. Everything will work except the functions // Do nothing for a moment. Everything will work except the functions
// that uses worker routines. // that use worker routines.
// TODO(Kagami) Provide pure JS fallback. // TODO(Kagami) Provide pure JS fallback.
} }

View File

@ -1,6 +1,6 @@
{ {
"name": "bitmessage", "name": "bitmessage",
"version": "0.6.4", "version": "0.6.6",
"description": "JavaScript Bitmessage library", "description": "JavaScript Bitmessage library",
"main": "./lib/index.js", "main": "./lib/index.js",
"browser": { "browser": {
@ -50,15 +50,15 @@
"bn.js": "^3.0.1", "bn.js": "^3.0.1",
"bs58": "^2.0.0", "bs58": "^2.0.0",
"buffer-equal": "~0.0.1", "buffer-equal": "~0.0.1",
"eccrypto": "^1.0.1", "eccrypto": "^1.0.3",
"es6-promise": "^2.0.1", "es6-promise": "^3.0.2",
"hash.js": "^1.0.2", "hash.js": "^1.0.2",
"nan": "^1.4.1", "nan": "^2.1.0",
"object-assign": "^2.0.0", "object-assign": "^2.0.0",
"sha.js": "^2.3.1", "sha.js": "^2.3.1",
"webworkify": "^1.0.1" "webworkify": "^1.0.1"
}, },
"optionalDependencies": { "optionalDependencies": {
"bignum": "^0.9.0" "bignum": "^0.11.0"
} }
} }

View File

@ -36,12 +36,14 @@ typedef struct {
PowArgs* pow_args; PowArgs* pow_args;
} ThreadArgs; } ThreadArgs;
#ifndef ntohll
inline uint64_t ntohll(uint64_t x) { inline uint64_t ntohll(uint64_t x) {
return ( return (
((uint64_t)(ntohl( (unsigned int)((x << 32) >> 32) )) << 32) | ((uint64_t)(ntohl( (unsigned int)((x << 32) >> 32) )) << 32) |
ntohl( ((unsigned int)(x >> 32)) ) ntohl( ((unsigned int)(x >> 32)) )
); );
} }
#endif
// Set POW computation result in a thread-safe way. // Set POW computation result in a thread-safe way.
void set_result(PowArgs* pow_args, PowResult res, uint64_t nonce) { void set_result(PowArgs* pow_args, PowResult res, uint64_t nonce) {

View File

@ -13,13 +13,13 @@ using v8::Number;
static const uint64_t MAX_SAFE_INTEGER = 9007199254740991ULL; static const uint64_t MAX_SAFE_INTEGER = 9007199254740991ULL;
class PowWorker : public NanAsyncWorker { class PowWorker : public Nan::AsyncWorker {
public: public:
PowWorker(NanCallback* callback, PowWorker(Nan::Callback* callback,
size_t pool_size, size_t pool_size,
uint64_t target, uint64_t target,
uint8_t* initial_hash) uint8_t* initial_hash)
: NanAsyncWorker(callback), : Nan::AsyncWorker(callback),
pool_size(pool_size), pool_size(pool_size),
target(target), target(target),
initial_hash(initial_hash) {} initial_hash(initial_hash) {}
@ -40,17 +40,16 @@ class PowWorker : public NanAsyncWorker {
// this function will be run inside the main event loop // this function will be run inside the main event loop
// so it is safe to use V8 again // so it is safe to use V8 again
void HandleOKCallback () { void HandleOKCallback () {
NanScope();
if (error) { if (error) {
Local<Value> argv[1]; Local<Value> argv[1];
if (error == -1) { if (error == -1) {
argv[0] = NanError("Max safe integer overflow"); argv[0] = Nan::Error("Max safe integer overflow");
} else { } else {
argv[0] = NanError("Internal error"); argv[0] = Nan::Error("Internal error");
} }
callback->Call(1, argv); callback->Call(1, argv);
} else { } else {
Local<Value> argv[] = {NanNull(), NanNew<Number>(nonce)}; Local<Value> argv[] = {Nan::Null(), Nan::New<Number>(nonce)};
callback->Call(2, argv); callback->Call(2, argv);
} }
} }
@ -64,39 +63,35 @@ class PowWorker : public NanAsyncWorker {
}; };
NAN_METHOD(PowAsync) { NAN_METHOD(PowAsync) {
NanScope(); if (info.Length() != 4 ||
!info[0]->IsNumber() || // pool_size
if (args.Length() != 4 || !info[1]->IsNumber() || // target
!args[0]->IsNumber() || // pool_size !node::Buffer::HasInstance(info[2]) || // initial_hash
!args[1]->IsNumber() || // target !info[3]->IsFunction()) { // cb
!node::Buffer::HasInstance(args[2]) || // initial_hash return Nan::ThrowError("Bad input");
!args[3]->IsFunction()) { // cb
return NanThrowError("Bad input");
} }
size_t pool_size = args[0]->Uint32Value(); size_t pool_size = info[0]->Uint32Value();
uint64_t target = args[1]->IntegerValue(); uint64_t target = info[1]->IntegerValue();
char* buf = node::Buffer::Data(args[2]); char* buf = node::Buffer::Data(info[2]);
size_t length = node::Buffer::Length(args[2]); size_t length = node::Buffer::Length(info[2]);
if (pool_size < 1 || if (pool_size < 1 ||
pool_size > MAX_POOL_SIZE || pool_size > MAX_POOL_SIZE ||
buf == NULL || buf == NULL ||
length != HASH_SIZE) { length != HASH_SIZE) {
return NanThrowError("Bad input"); return Nan::ThrowError("Bad input");
} }
// TODO(Kagami): Do we need to process `std::bad_alloc`?
uint8_t* initial_hash = new uint8_t[length]; uint8_t* initial_hash = new uint8_t[length];
memcpy(initial_hash, buf, length); memcpy(initial_hash, buf, length);
NanCallback* callback = new NanCallback(args[3].As<Function>()); Nan::Callback* callback = new Nan::Callback(info[3].As<Function>());
NanAsyncQueueWorker(new PowWorker(callback, pool_size, target, initial_hash)); Nan::AsyncQueueWorker(
NanReturnUndefined(); new PowWorker(callback, pool_size, target, initial_hash));
} }
void InitAll(Handle<Object> exports) { NAN_MODULE_INIT(InitAll) {
exports->Set( Nan::Set(target, Nan::New<String>("powAsync").ToLocalChecked(),
NanNew<String>("powAsync"), Nan::GetFunction(Nan::New<FunctionTemplate>(PowAsync)).ToLocalChecked());
NanNew<FunctionTemplate>(PowAsync)->GetFunction());
} }
NODE_MODULE(worker, InitAll) NODE_MODULE(worker, InitAll)

View File

@ -1194,9 +1194,10 @@ describe("POW", function() {
// computed nonces may vary in a big range (since target is // computed nonces may vary in a big range (since target is
// simple, there are a lot of valid nonces). Probably because // simple, there are a lot of valid nonces). Probably because
// some spawned web workers get blocked for some reason. // some spawned web workers get blocked for some reason.
if (typeof window === "undefined") { // FIXME(Kagami): Local runs started to fail here too.
expect(nonce).to.equal(21997550); // if (typeof window === "undefined") {
} // expect(nonce).to.equal(21997550);
// }
expect(POW.check({ expect(POW.check({
nonce: nonce, nonce: nonce,
target: target, target: target,