@gandlaf21/bc-ur
Version:
A JS implementation of the Uniform Resources (UR) specification from Blockchain Commons
55 lines (54 loc) • 2.42 kB
JavaScript
;
var __spreadArrays = (this && this.__spreadArrays) || function () {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.chooseFragments = exports.shuffle = exports.chooseDegree = void 0;
var utils_1 = require("./utils");
var xoshiro_1 = __importDefault(require("./xoshiro"));
// @ts-ignore
var alias_sampling_1 = __importDefault(require("@apocentre/alias-sampling"));
var buffer_1 = require("buffer");
var chooseDegree = function (seqLenth, rng) {
var degreeProbabilities = __spreadArrays(new Array(seqLenth)).map(function (_, index) { return 1 / (index + 1); });
var degreeChooser = alias_sampling_1.default(degreeProbabilities, null, rng.nextDouble);
return degreeChooser.next() + 1;
};
exports.chooseDegree = chooseDegree;
var shuffle = function (items, rng) {
var remaining = __spreadArrays(items);
var result = [];
while (remaining.length > 0) {
var index = rng.nextInt(0, remaining.length - 1);
var item = remaining[index];
// remaining.erase(remaining.begin() + index);
remaining.splice(index, 1);
result.push(item);
}
return result;
};
exports.shuffle = shuffle;
var chooseFragments = function (seqNum, seqLength, checksum) {
// The first `seqLenth` parts are the "pure" fragments, not mixed with any
// others. This means that if you only generate the first `seqLenth` parts,
// then you have all the parts you need to decode the message.
if (seqNum <= seqLength) {
return [seqNum - 1];
}
else {
var seed = buffer_1.Buffer.concat([utils_1.intToBytes(seqNum), utils_1.intToBytes(checksum)]);
var rng = new xoshiro_1.default(seed);
var degree = exports.chooseDegree(seqLength, rng);
var indexes = __spreadArrays(new Array(seqLength)).map(function (_, index) { return index; });
var shuffledIndexes = exports.shuffle(indexes, rng);
return shuffledIndexes.slice(0, degree);
}
};
exports.chooseFragments = chooseFragments;