-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
74 lines (69 loc) · 2.19 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
'use strict';
var Assert = require('assert');
var Quorum = require('./binding.node');
function equal(a, aOffset, b, bOffset) {
var size = Quorum.ID;
while (size--) if (a[aOffset++] !== b[bOffset++]) return false;
return true;
}
function zero(buffer, offset) {
var size = Quorum.ID;
while (size--) if (buffer[offset++] !== 0) return false;
return true;
}
// While Quorum.calculate() is written in C, it amortizes the call overhead.
// Quorum.update() is best written in JS since it will be called frequently.
Quorum.update = function(vector, vectorOffset, id) {
if (!Buffer.isBuffer(vector)) {
throw new Error('vector must be a buffer');
}
if (!Number.isInteger(vectorOffset)) {
throw new Error('vectorOffset must be an integer');
}
if (vectorOffset < 0) {
throw new Error('vectorOffset must not be negative');
}
if (vector.length < Quorum.VECTOR) {
throw new Error('vector.length must be at least ' + Quorum.VECTOR);
}
if (vectorOffset + Quorum.VECTOR > vector.length) {
throw new Error('vectorOffset must not overflow');
}
if (zero(vector, vectorOffset)) {
throw new Error('vector[0] must not be zero');
}
if (zero(vector, vectorOffset + Quorum.ID)) {
throw new Error('vector[1] must not be zero');
}
if (equal(vector, vectorOffset, vector, vectorOffset + Quorum.ID)) {
throw new Error('vector[0] must not equal vector[1]');
}
if (!Buffer.isBuffer(id)) {
throw new Error('id must be a buffer');
}
if (id.length !== Quorum.ID) {
throw new Error('id.length must be ' + Quorum.ID);
}
if (zero(id, 0)) {
throw new Error('id must not be zero');
}
if (equal(id, 0, vector, vectorOffset)) {
throw new Error('id must not equal vector[0]');
}
if (equal(id, 0, vector, vectorOffset + Quorum.ID)) {
throw new Error('id must not equal vector[1]');
}
Assert(
vector.copy(
vector,
vectorOffset + Quorum.ID,
vectorOffset,
vectorOffset + Quorum.ID
) === Quorum.ID
);
Assert(equal(vector, vectorOffset, vector, vectorOffset + Quorum.ID));
Assert(id.copy(vector, vectorOffset, 0, Quorum.ID) === Quorum.ID);
Assert(equal(vector, vectorOffset, id, 0));
return vector;
};
module.exports = Quorum;