utils: remove some control flow. add base58.
This commit is contained in:
parent
1a8657d131
commit
76a32feb5d
@ -15,9 +15,9 @@ var SENTINEL;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* An iterative red black tree.
|
* An iterative red black tree.
|
||||||
* Used for the mempool. Many of its
|
* Many of its options, parameters,
|
||||||
* options, parameters, and methods
|
* and methods mimic the leveldown
|
||||||
* mimic the leveldown interface.
|
* interface.
|
||||||
* @exports RBT
|
* @exports RBT
|
||||||
* @constructor
|
* @constructor
|
||||||
* @param {String?} location - Phony location.
|
* @param {String?} location - Phony location.
|
||||||
@ -586,7 +586,7 @@ RBT.prototype.open = function open(options, callback) {
|
|||||||
|
|
||||||
this.options = options;
|
this.options = options;
|
||||||
|
|
||||||
return utils.nextTick(callback);
|
utils.nextTick(callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -595,7 +595,7 @@ RBT.prototype.open = function open(options, callback) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
RBT.prototype.close = function close(callback) {
|
RBT.prototype.close = function close(callback) {
|
||||||
return utils.nextTick(callback);
|
utils.nextTick(callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -622,13 +622,18 @@ RBT.prototype.get = function get(key, options, callback) {
|
|||||||
err = new Error('RBT_NOTFOUND: Key not found.');
|
err = new Error('RBT_NOTFOUND: Key not found.');
|
||||||
err.notFound = true;
|
err.notFound = true;
|
||||||
err.type = 'NotFoundError';
|
err.type = 'NotFoundError';
|
||||||
return utils.asyncify(callback)(err);
|
utils.nextTick(function() {
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (options.asBuffer === false)
|
if (options.asBuffer === false)
|
||||||
value = value.toString('utf8');
|
value = value.toString('utf8');
|
||||||
|
|
||||||
return utils.asyncify(callback)(null, value);
|
utils.nextTick(function() {
|
||||||
|
callback(null, value);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -647,7 +652,7 @@ RBT.prototype.put = function put(key, value, options, callback) {
|
|||||||
|
|
||||||
this.insert(key, value);
|
this.insert(key, value);
|
||||||
|
|
||||||
return utils.nextTick(callback);
|
utils.nextTick(callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -665,7 +670,7 @@ RBT.prototype.del = function del(key, options, callback) {
|
|||||||
|
|
||||||
this.remove(key);
|
this.remove(key);
|
||||||
|
|
||||||
return utils.nextTick(callback);
|
utils.nextTick(callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -736,7 +741,9 @@ RBT.prototype.approximateSize = function approximateSize(start, end, callback) {
|
|||||||
size += item.value.length;
|
size += item.value.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
return utils.asyncify(callback)(null, size);
|
utils.nextTick(function() {
|
||||||
|
callback(null, size);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -746,7 +753,7 @@ RBT.prototype.approximateSize = function approximateSize(start, end, callback) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
RBT.destroy = function destroy(location, callback) {
|
RBT.destroy = function destroy(location, callback) {
|
||||||
return utils.nextTick(callback);
|
utils.nextTick(callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -756,7 +763,7 @@ RBT.destroy = function destroy(location, callback) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
RBT.repair = function repair(location, callback) {
|
RBT.repair = function repair(location, callback) {
|
||||||
return utils.nextTick(callback);
|
utils.nextTick(callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -940,17 +947,28 @@ Batch.prototype.del = function del(key) {
|
|||||||
Batch.prototype.write = function write(callback) {
|
Batch.prototype.write = function write(callback) {
|
||||||
var i, op;
|
var i, op;
|
||||||
|
|
||||||
if (!this.tree)
|
if (!this.tree) {
|
||||||
return callback(new Error('Already written.'));
|
utils.nextTick(function() {
|
||||||
|
callback(new Error('Already written.'));
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < this.ops.length; i++) {
|
for (i = 0; i < this.ops.length; i++) {
|
||||||
op = this.ops[i];
|
op = this.ops[i];
|
||||||
if (op.type === 'put')
|
switch (op.type) {
|
||||||
this.tree.insert(op.key, op.value);
|
case 'put':
|
||||||
else if (op.type === 'del')
|
this.tree.insert(op.key, op.value);
|
||||||
this.tree.remove(op.key);
|
break;
|
||||||
else
|
case 'del':
|
||||||
assert(false);
|
this.tree.remove(op.key);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
utils.nextTick(function() {
|
||||||
|
callback(new Error('Bad operation: ' + op.type));
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.ops.length = 0;
|
this.ops.length = 0;
|
||||||
@ -1029,8 +1047,12 @@ function Iterator(tree, options) {
|
|||||||
Iterator.prototype.next = function(callback) {
|
Iterator.prototype.next = function(callback) {
|
||||||
var item, key, value;
|
var item, key, value;
|
||||||
|
|
||||||
if (this.ended)
|
if (this.ended) {
|
||||||
return utils.asyncify(callback)(new Error('Cannot call next after end.'));
|
utils.nextTick(function() {
|
||||||
|
callback(new Error('Cannot call next after end.'));
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (this.options.reverse)
|
if (this.options.reverse)
|
||||||
item = this.snapshot[this.index--];
|
item = this.snapshot[this.index--];
|
||||||
@ -1040,13 +1062,15 @@ Iterator.prototype.next = function(callback) {
|
|||||||
if (this.options.limit != null) {
|
if (this.options.limit != null) {
|
||||||
if (this.total++ >= this.options.limit) {
|
if (this.total++ >= this.options.limit) {
|
||||||
this._end();
|
this._end();
|
||||||
return utils.nextTick(callback);
|
utils.nextTick(callback);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!item) {
|
if (!item) {
|
||||||
this._end();
|
this._end();
|
||||||
return utils.nextTick(callback);
|
utils.nextTick(callback);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
key = item.key;
|
key = item.key;
|
||||||
@ -1064,7 +1088,9 @@ Iterator.prototype.next = function(callback) {
|
|||||||
if (this.options.valueAsBuffer === false)
|
if (this.options.valueAsBuffer === false)
|
||||||
value = value.toString('utf8');
|
value = value.toString('utf8');
|
||||||
|
|
||||||
utils.asyncify(callback)(null, key, value);
|
utils.nextTick(function() {
|
||||||
|
callback(null, key, value);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -1105,13 +1131,17 @@ Iterator.prototype._end = function end() {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
Iterator.prototype.end = function end(callback) {
|
Iterator.prototype.end = function end(callback) {
|
||||||
if (this.ended)
|
if (this.ended) {
|
||||||
return utils.asyncify(callback)(new Error('Already ended.'));
|
utils.nextTick(function() {
|
||||||
|
callback(new Error('Already ended.'));
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
this.ended = true;
|
this.ended = true;
|
||||||
this._end();
|
this._end();
|
||||||
|
|
||||||
return utils.nextTick(callback);
|
utils.nextTick(callback);
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@ -18,7 +18,7 @@ var BufferWriter = require('../utils/writer');
|
|||||||
var BufferReader = require('../utils/reader');
|
var BufferReader = require('../utils/reader');
|
||||||
var opcodes = constants.opcodes;
|
var opcodes = constants.opcodes;
|
||||||
var STACK_TRUE = new Buffer([1]);
|
var STACK_TRUE = new Buffer([1]);
|
||||||
var STACK_FALSE = new Buffer([]);
|
var STACK_FALSE = new Buffer(0);
|
||||||
var STACK_NEGATE = new Buffer([0x81]);
|
var STACK_NEGATE = new Buffer([0x81]);
|
||||||
var ScriptError = require('../utils/errors').ScriptError;
|
var ScriptError = require('../utils/errors').ScriptError;
|
||||||
var scriptTypes = constants.scriptTypes;
|
var scriptTypes = constants.scriptTypes;
|
||||||
@ -1224,7 +1224,7 @@ Script.num = function num(value, flags, size) {
|
|||||||
* numbers to a little-endian buffer while taking into
|
* numbers to a little-endian buffer while taking into
|
||||||
* account negative zero, minimaldata, etc.
|
* account negative zero, minimaldata, etc.
|
||||||
* @example
|
* @example
|
||||||
* assert.deepEqual(Script.array(0), new Buffer([]));
|
* assert.deepEqual(Script.array(0), new Buffer(0));
|
||||||
* assert.deepEqual(Script.array(0xffee), new Buffer([0xee, 0xff, 0x00]));
|
* assert.deepEqual(Script.array(0xffee), new Buffer([0xee, 0xff, 0x00]));
|
||||||
* assert.deepEqual(Script.array(new bn(0xffee)), new Buffer([0xee, 0xff, 0x00]));
|
* assert.deepEqual(Script.array(new bn(0xffee)), new Buffer([0xee, 0xff, 0x00]));
|
||||||
* assert.deepEqual(Script.array(new bn(0x1e).ineg()), new Buffer([0x9e]));
|
* assert.deepEqual(Script.array(new bn(0x1e).ineg()), new Buffer([0x9e]));
|
||||||
|
|||||||
@ -14,7 +14,7 @@ var constants = require('../protocol/constants');
|
|||||||
var utils = require('../utils/utils');
|
var utils = require('../utils/utils');
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
var opcodes = constants.opcodes;
|
var opcodes = constants.opcodes;
|
||||||
var STACK_FALSE = new Buffer([]);
|
var STACK_FALSE = new Buffer(0);
|
||||||
var STACK_NEGATE = new Buffer([0x81]);
|
var STACK_NEGATE = new Buffer([0x81]);
|
||||||
var scriptTypes = constants.scriptTypes;
|
var scriptTypes = constants.scriptTypes;
|
||||||
var Script = require('./script');
|
var Script = require('./script');
|
||||||
|
|||||||
132
lib/utils/base58.js
Normal file
132
lib/utils/base58.js
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
/*!
|
||||||
|
* base58.js - base58 for bcoin
|
||||||
|
* Copyright (c) 2014-2015, Fedor Indutny (MIT License)
|
||||||
|
* Copyright (c) 2014-2016, Christopher Jeffrey (MIT License).
|
||||||
|
* https://github.com/bcoin-org/bcoin
|
||||||
|
*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
var native = require('./native');
|
||||||
|
var assert = require('assert');
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Base58
|
||||||
|
*/
|
||||||
|
|
||||||
|
var base58 = ''
|
||||||
|
+ '123456789'
|
||||||
|
+ 'ABCDEFGHJKLMNPQRSTUVWXYZ'
|
||||||
|
+ 'abcdefghijkmnopqrstuvwxyz';
|
||||||
|
|
||||||
|
var unbase58 = {};
|
||||||
|
|
||||||
|
for (var i = 0; i < base58.length; i++)
|
||||||
|
unbase58[base58[i]] = i;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encode a base58 string.
|
||||||
|
* @see https://github.com/bitcoin/bitcoin/blob/master/src/base58.cpp
|
||||||
|
* @param {Buffer} data
|
||||||
|
* @returns {Base58String}
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.toBase58 = function toBase58(data) {
|
||||||
|
var zeroes = 0;
|
||||||
|
var length = 0;
|
||||||
|
var str = '';
|
||||||
|
var i, b58, carry, j, k;
|
||||||
|
|
||||||
|
for (i = 0; i < data.length; i++) {
|
||||||
|
if (data[i] !== 0)
|
||||||
|
break;
|
||||||
|
zeroes++;
|
||||||
|
}
|
||||||
|
|
||||||
|
b58 = new Buffer(((data.length * 138 / 100) | 0) + 1);
|
||||||
|
b58.fill(0);
|
||||||
|
|
||||||
|
for (; i < data.length; i++) {
|
||||||
|
carry = data[i];
|
||||||
|
j = 0;
|
||||||
|
for (k = b58.length - 1; k >= 0; k--, j++) {
|
||||||
|
if (carry === 0 && j >= length)
|
||||||
|
break;
|
||||||
|
carry += 256 * b58[k];
|
||||||
|
b58[k] = carry % 58;
|
||||||
|
carry = carry / 58 | 0;
|
||||||
|
}
|
||||||
|
assert(carry === 0);
|
||||||
|
length = j;
|
||||||
|
}
|
||||||
|
|
||||||
|
i = b58.length - length;
|
||||||
|
while (i < b58.length && b58[i] === 0)
|
||||||
|
i++;
|
||||||
|
|
||||||
|
for (j = 0; j < zeroes; j++)
|
||||||
|
str += '1';
|
||||||
|
|
||||||
|
for (; i < b58.length; i++)
|
||||||
|
str += base58[b58[i]];
|
||||||
|
|
||||||
|
return str;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (native)
|
||||||
|
exports.toBase58 = native.toBase58;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decode a base58 string.
|
||||||
|
* @see https://github.com/bitcoin/bitcoin/blob/master/src/base58.cpp
|
||||||
|
* @param {Base58String} str
|
||||||
|
* @returns {Buffer}
|
||||||
|
* @throws on non-base58 character.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.fromBase58 = function fromBase58(str) {
|
||||||
|
var zeroes = 0;
|
||||||
|
var i = 0;
|
||||||
|
var b256, ch, carry, j, out;
|
||||||
|
|
||||||
|
for (i = 0; i < str.length; i++) {
|
||||||
|
if (str[i] !== '1')
|
||||||
|
break;
|
||||||
|
zeroes++;
|
||||||
|
}
|
||||||
|
|
||||||
|
b256 = new Buffer(((str.length * 733) / 1000 | 0) + 1);
|
||||||
|
b256.fill(0);
|
||||||
|
|
||||||
|
for (; i < str.length; i++) {
|
||||||
|
ch = unbase58[str[i]];
|
||||||
|
if (ch == null)
|
||||||
|
throw new Error('Non-base58 character.');
|
||||||
|
|
||||||
|
carry = ch;
|
||||||
|
for (j = b256.length - 1; j >= 0; j--) {
|
||||||
|
carry += 58 * b256[j];
|
||||||
|
b256[j] = carry % 256;
|
||||||
|
carry = carry / 256 | 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(carry === 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (i < b256.length && b256[i] === 0)
|
||||||
|
i++;
|
||||||
|
|
||||||
|
out = new Buffer(zeroes + (b256.length - i));
|
||||||
|
|
||||||
|
for (j = 0; j < zeroes; j++)
|
||||||
|
out[j] = 0;
|
||||||
|
|
||||||
|
while (i < b256.length)
|
||||||
|
out[j++] = b256[i++];
|
||||||
|
|
||||||
|
return out;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (native)
|
||||||
|
exports.fromBase58 = native.fromBase58;
|
||||||
@ -16,7 +16,7 @@
|
|||||||
var utils = exports;
|
var utils = exports;
|
||||||
|
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
var native = require('./native');
|
var base58 = require('./base58');
|
||||||
var bn = require('bn.js');
|
var bn = require('bn.js');
|
||||||
var util = require('util');
|
var util = require('util');
|
||||||
var Number, Math, Date;
|
var Number, Math, Date;
|
||||||
@ -103,126 +103,26 @@ utils.copy = function copy(data) {
|
|||||||
return clone;
|
return clone;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
* Base58
|
|
||||||
*/
|
|
||||||
|
|
||||||
var base58 = ''
|
|
||||||
+ '123456789'
|
|
||||||
+ 'ABCDEFGHJKLMNPQRSTUVWXYZ'
|
|
||||||
+ 'abcdefghijkmnopqrstuvwxyz';
|
|
||||||
|
|
||||||
var unbase58 = {};
|
|
||||||
|
|
||||||
for (var i = 0; i < base58.length; i++)
|
|
||||||
unbase58[base58[i]] = i;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encode a base58 string.
|
* Encode a base58 string.
|
||||||
* @see https://github.com/bitcoin/bitcoin/blob/master/src/base58.cpp
|
* @see https://github.com/bitcoin/bitcoin/blob/master/src/base58.cpp
|
||||||
|
* @function
|
||||||
* @param {Buffer} data
|
* @param {Buffer} data
|
||||||
* @returns {Base58String}
|
* @returns {Base58String}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
utils.toBase58 = function toBase58(data) {
|
utils.toBase58 = base58.toBase58;
|
||||||
var zeroes = 0;
|
|
||||||
var length = 0;
|
|
||||||
var str = '';
|
|
||||||
var i, b58, carry, j, k;
|
|
||||||
|
|
||||||
for (i = 0; i < data.length; i++) {
|
|
||||||
if (data[i] !== 0)
|
|
||||||
break;
|
|
||||||
zeroes++;
|
|
||||||
}
|
|
||||||
|
|
||||||
b58 = new Buffer(((data.length * 138 / 100) | 0) + 1);
|
|
||||||
b58.fill(0);
|
|
||||||
|
|
||||||
for (; i < data.length; i++) {
|
|
||||||
carry = data[i];
|
|
||||||
j = 0;
|
|
||||||
for (k = b58.length - 1; k >= 0; k--, j++) {
|
|
||||||
if (carry === 0 && j >= length)
|
|
||||||
break;
|
|
||||||
carry += 256 * b58[k];
|
|
||||||
b58[k] = carry % 58;
|
|
||||||
carry = carry / 58 | 0;
|
|
||||||
}
|
|
||||||
assert(carry === 0);
|
|
||||||
length = j;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = b58.length - length;
|
|
||||||
while (i < b58.length && b58[i] === 0)
|
|
||||||
i++;
|
|
||||||
|
|
||||||
for (j = 0; j < zeroes; j++)
|
|
||||||
str += '1';
|
|
||||||
|
|
||||||
for (; i < b58.length; i++)
|
|
||||||
str += base58[b58[i]];
|
|
||||||
|
|
||||||
return str;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (native)
|
|
||||||
utils.toBase58 = native.toBase58;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decode a base58 string.
|
* Decode a base58 string.
|
||||||
* @see https://github.com/bitcoin/bitcoin/blob/master/src/base58.cpp
|
* @see https://github.com/bitcoin/bitcoin/blob/master/src/base58.cpp
|
||||||
|
* @function
|
||||||
* @param {Base58String} str
|
* @param {Base58String} str
|
||||||
* @returns {Buffer}
|
* @returns {Buffer}
|
||||||
* @throws on non-base58 character.
|
* @throws on non-base58 character.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
utils.fromBase58 = function fromBase58(str) {
|
utils.fromBase58 = base58.fromBase58;
|
||||||
var zeroes = 0;
|
|
||||||
var i = 0;
|
|
||||||
var b256, ch, carry, j, out;
|
|
||||||
|
|
||||||
for (i = 0; i < str.length; i++) {
|
|
||||||
if (str[i] !== '1')
|
|
||||||
break;
|
|
||||||
zeroes++;
|
|
||||||
}
|
|
||||||
|
|
||||||
b256 = new Buffer(((str.length * 733) / 1000 | 0) + 1);
|
|
||||||
b256.fill(0);
|
|
||||||
|
|
||||||
for (; i < str.length; i++) {
|
|
||||||
ch = unbase58[str[i]];
|
|
||||||
if (ch == null)
|
|
||||||
throw new Error('Non-base58 character.');
|
|
||||||
|
|
||||||
carry = ch;
|
|
||||||
for (j = b256.length - 1; j >= 0; j--) {
|
|
||||||
carry += 58 * b256[j];
|
|
||||||
b256[j] = carry % 256;
|
|
||||||
carry = carry / 256 | 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(carry === 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
i = 0;
|
|
||||||
while (i < b256.length && b256[i] === 0)
|
|
||||||
i++;
|
|
||||||
|
|
||||||
out = new Buffer(zeroes + (b256.length - i));
|
|
||||||
|
|
||||||
for (j = 0; j < zeroes; j++)
|
|
||||||
out[j] = 0;
|
|
||||||
|
|
||||||
while (i < b256.length)
|
|
||||||
out[j++] = b256[i++];
|
|
||||||
|
|
||||||
return out;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (native)
|
|
||||||
utils.fromBase58 = native.fromBase58;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test whether a string is base58 (note that you
|
* Test whether a string is base58 (note that you
|
||||||
@ -326,43 +226,6 @@ if (typeof setImmediate === 'function') {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrap a function in a `nextTick`.
|
|
||||||
* @returns {Promise}
|
|
||||||
* @returns {Function} Asyncified function.
|
|
||||||
*/
|
|
||||||
|
|
||||||
utils.asyncify = function asyncify(callback) {
|
|
||||||
if (callback && callback._asyncified)
|
|
||||||
return callback;
|
|
||||||
|
|
||||||
function asyncifyFn(err, result1, result2) {
|
|
||||||
if (!callback)
|
|
||||||
return;
|
|
||||||
utils.nextTick(function() {
|
|
||||||
callback(err, result1, result2);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
asyncifyFn._asyncified = true;
|
|
||||||
if (callback)
|
|
||||||
asyncifyFn._once = callback._once;
|
|
||||||
|
|
||||||
return asyncifyFn;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Ensure a callback exists, return a NOP if not.
|
|
||||||
* @returns {Promise}
|
|
||||||
* @returns {Function}
|
|
||||||
*/
|
|
||||||
|
|
||||||
utils.ensure = function ensure(callback) {
|
|
||||||
if (!callback)
|
|
||||||
return utils.nop;
|
|
||||||
return callback;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reverse a hex-string (used because of
|
* Reverse a hex-string (used because of
|
||||||
* bitcoind's affinity for uint256le).
|
* bitcoind's affinity for uint256le).
|
||||||
@ -1625,199 +1488,6 @@ utils.icmp = function icmp(target, data, start) {
|
|||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Asnchronously iterate over a range in parallel.
|
|
||||||
* @param {Number} from
|
|
||||||
* @param {Number} to
|
|
||||||
* @param {Function} iter
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
|
|
||||||
utils.forRange = function forRange(from, to, iter, callback) {
|
|
||||||
var pending = to - from;
|
|
||||||
var i, error;
|
|
||||||
|
|
||||||
callback = utils.asyncify(callback);
|
|
||||||
|
|
||||||
if (pending <= 0)
|
|
||||||
return callback();
|
|
||||||
|
|
||||||
function next(err) {
|
|
||||||
assert(pending > 0);
|
|
||||||
if (err)
|
|
||||||
error = err;
|
|
||||||
if (!--pending)
|
|
||||||
callback(error);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = from; i < to; i++)
|
|
||||||
iter(i, next, i);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Asynchronously iterate over an array in parallel.
|
|
||||||
* @param {Array} obj
|
|
||||||
* @param {Function} iter
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
|
|
||||||
utils.forEach = function forEach(obj, iter, callback) {
|
|
||||||
var pending = obj.length;
|
|
||||||
var error;
|
|
||||||
|
|
||||||
callback = utils.asyncify(callback);
|
|
||||||
|
|
||||||
if (!pending)
|
|
||||||
return callback();
|
|
||||||
|
|
||||||
function next(err) {
|
|
||||||
assert(pending > 0);
|
|
||||||
if (err)
|
|
||||||
error = err;
|
|
||||||
if (!--pending)
|
|
||||||
callback(error);
|
|
||||||
}
|
|
||||||
|
|
||||||
obj.forEach(function(item, i) {
|
|
||||||
iter(item, next, i);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Asnchronously iterate over a range in serial.
|
|
||||||
* @param {Number} from
|
|
||||||
* @param {Number} to
|
|
||||||
* @param {Function} iter
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
|
|
||||||
utils.forRangeSerial = function forRangeSerial(from, to, iter, callback) {
|
|
||||||
var called = false;
|
|
||||||
|
|
||||||
callback = utils.ensure(callback);
|
|
||||||
|
|
||||||
(function next(err) {
|
|
||||||
assert(!called);
|
|
||||||
if (err) {
|
|
||||||
called = true;
|
|
||||||
return callback(err);
|
|
||||||
}
|
|
||||||
if (from >= to) {
|
|
||||||
called = true;
|
|
||||||
return callback();
|
|
||||||
}
|
|
||||||
from++;
|
|
||||||
utils.nextTick(function() {
|
|
||||||
iter(from - 1, next, from - 1);
|
|
||||||
});
|
|
||||||
})();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Asynchronously iterate over an array in serial.
|
|
||||||
* @param {Array} obj
|
|
||||||
* @param {Function} iter
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
|
|
||||||
utils.forEachSerial = function forEachSerial(obj, iter, callback) {
|
|
||||||
var i = 0;
|
|
||||||
var called = false;
|
|
||||||
|
|
||||||
callback = utils.ensure(callback);
|
|
||||||
|
|
||||||
(function next(err) {
|
|
||||||
var item;
|
|
||||||
assert(!called);
|
|
||||||
if (err) {
|
|
||||||
called = true;
|
|
||||||
return callback(err);
|
|
||||||
}
|
|
||||||
if (i >= obj.length) {
|
|
||||||
called = true;
|
|
||||||
return callback();
|
|
||||||
}
|
|
||||||
item = obj[i];
|
|
||||||
i++;
|
|
||||||
utils.nextTick(function() {
|
|
||||||
iter(item, next, i - 1);
|
|
||||||
});
|
|
||||||
})();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Asynchronously apply a truth test to every
|
|
||||||
* member of an array in parallel.
|
|
||||||
* @param {Array} obj
|
|
||||||
* @param {Function} iter
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
|
|
||||||
utils.every = function every(obj, iter, callback) {
|
|
||||||
var pending = obj.length;
|
|
||||||
var result = true;
|
|
||||||
var error;
|
|
||||||
|
|
||||||
callback = utils.asyncify(callback);
|
|
||||||
|
|
||||||
if (!pending)
|
|
||||||
return callback(null, result);
|
|
||||||
|
|
||||||
function next(err, res) {
|
|
||||||
assert(pending > 0);
|
|
||||||
if (err)
|
|
||||||
error = err;
|
|
||||||
if (!res)
|
|
||||||
result = false;
|
|
||||||
if (!--pending) {
|
|
||||||
if (error)
|
|
||||||
return callback(error);
|
|
||||||
callback(null, result);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
obj.forEach(function(item, i) {
|
|
||||||
iter(item, next, i);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Asynchronously apply a truth test to every
|
|
||||||
* member of an array in serial.
|
|
||||||
* @param {Array} obj
|
|
||||||
* @param {Function} iter
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
|
|
||||||
utils.everySerial = function everySerial(obj, iter, callback) {
|
|
||||||
var i = 0;
|
|
||||||
var called = false;
|
|
||||||
|
|
||||||
callback = utils.ensure(callback);
|
|
||||||
|
|
||||||
(function next(err, res) {
|
|
||||||
var item;
|
|
||||||
assert(!called);
|
|
||||||
if (err) {
|
|
||||||
called = true;
|
|
||||||
return callback(err);
|
|
||||||
}
|
|
||||||
if (!res) {
|
|
||||||
called = true;
|
|
||||||
return callback(null, false);
|
|
||||||
}
|
|
||||||
if (i >= obj.length) {
|
|
||||||
called = true;
|
|
||||||
return callback(null, true);
|
|
||||||
}
|
|
||||||
item = obj[i];
|
|
||||||
i++;
|
|
||||||
utils.nextTick(function() {
|
|
||||||
iter(item, next, i - 1);
|
|
||||||
});
|
|
||||||
})(null, true);
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert bytes to mb.
|
* Convert bytes to mb.
|
||||||
* @param {Number} size
|
* @param {Number} size
|
||||||
@ -1864,33 +1534,6 @@ utils.inherits = function inherits(obj, from) {
|
|||||||
obj.prototype.constructor = obj;
|
obj.prototype.constructor = obj;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrap a callback to ensure it is only called once.
|
|
||||||
* @returns {Promise}
|
|
||||||
* @returns {Function} Wrapped callback.
|
|
||||||
*/
|
|
||||||
|
|
||||||
utils.once = function once(callback) {
|
|
||||||
var called;
|
|
||||||
|
|
||||||
if (callback && callback._once)
|
|
||||||
return callback;
|
|
||||||
|
|
||||||
function onceFn(err, result1, result2) {
|
|
||||||
if (called)
|
|
||||||
return;
|
|
||||||
called = true;
|
|
||||||
if (callback)
|
|
||||||
callback(err, result1, result2);
|
|
||||||
}
|
|
||||||
|
|
||||||
onceFn._once = true;
|
|
||||||
if (callback)
|
|
||||||
onceFn._asyncified = callback._asyncified;
|
|
||||||
|
|
||||||
return onceFn;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Find index of a buffer in an array of buffers.
|
* Find index of a buffer in an array of buffers.
|
||||||
* @param {Buffer[]} obj
|
* @param {Buffer[]} obj
|
||||||
@ -1982,96 +1625,6 @@ utils.hex32 = function hex32(num) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrap a callback with an `unlock` callback.
|
|
||||||
* @see Locker
|
|
||||||
* @returns {Promise}
|
|
||||||
* @param {Function} unlock
|
|
||||||
* @returns {Function} Wrapped callback.
|
|
||||||
*/
|
|
||||||
|
|
||||||
utils.wrap = function wrap(callback, unlock) {
|
|
||||||
return function(err, res1, res2) {
|
|
||||||
unlock();
|
|
||||||
if (callback)
|
|
||||||
callback(err, res1, res2);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute a stack of functions in parallel.
|
|
||||||
* @param {Function[]} stack
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
|
|
||||||
utils.parallel = function parallel(stack, callback) {
|
|
||||||
var pending = stack.length;
|
|
||||||
var error;
|
|
||||||
var i;
|
|
||||||
|
|
||||||
callback = utils.once(callback);
|
|
||||||
|
|
||||||
if (!pending)
|
|
||||||
return utils.nextTick(callback);
|
|
||||||
|
|
||||||
function next(err) {
|
|
||||||
assert(pending > 0);
|
|
||||||
if (err)
|
|
||||||
error = err;
|
|
||||||
if (!--pending)
|
|
||||||
callback(error);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < stack.length; i++) {
|
|
||||||
try {
|
|
||||||
// if (stack[i].length >= 2) {
|
|
||||||
// stack[i](error, next);
|
|
||||||
// error = null;
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
if (error)
|
|
||||||
continue;
|
|
||||||
stack[i](next);
|
|
||||||
} catch (e) {
|
|
||||||
pending--;
|
|
||||||
error = e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Execute a stack of functions in serial.
|
|
||||||
* @param {Function[]} stack
|
|
||||||
* @returns {Promise}
|
|
||||||
*/
|
|
||||||
|
|
||||||
utils.serial = function serial(stack, callback) {
|
|
||||||
var i = 0;
|
|
||||||
(function next(err) {
|
|
||||||
var cb = stack[i++];
|
|
||||||
|
|
||||||
if (!cb)
|
|
||||||
return callback(err);
|
|
||||||
|
|
||||||
// if (cb.length >= 2) {
|
|
||||||
// try {
|
|
||||||
// return cb(err, next);
|
|
||||||
// } catch (e) {
|
|
||||||
// return next(e);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (err)
|
|
||||||
return utils.nextTick(next.bind(null, err));
|
|
||||||
|
|
||||||
try {
|
|
||||||
return cb(next);
|
|
||||||
} catch (e) {
|
|
||||||
return next(e);
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert an array to a map.
|
* Convert an array to a map.
|
||||||
* @param {String[]} obj
|
* @param {String[]} obj
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user