@gandlaf21/bc-ur
Version:
A JS implementation of the Uniform Resources (UR) specification from Blockchain Commons
46 lines • 1.98 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;
};
import { intToBytes } from "./utils";
import Xoshiro from "./xoshiro";
// @ts-ignore
import randomSampler from '@apocentre/alias-sampling';
import { Buffer } from "buffer";
export var chooseDegree = function (seqLenth, rng) {
var degreeProbabilities = __spreadArrays(new Array(seqLenth)).map(function (_, index) { return 1 / (index + 1); });
var degreeChooser = randomSampler(degreeProbabilities, null, rng.nextDouble);
return degreeChooser.next() + 1;
};
export 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;
};
export 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.concat([intToBytes(seqNum), intToBytes(checksum)]);
var rng = new Xoshiro(seed);
var degree = chooseDegree(seqLength, rng);
var indexes = __spreadArrays(new Array(seqLength)).map(function (_, index) { return index; });
var shuffledIndexes = shuffle(indexes, rng);
return shuffledIndexes.slice(0, degree);
}
};
//# sourceMappingURL=fountainUtils.js.map