UNPKG

@gandlaf21/bc-ur

Version:

A JS implementation of the Uniform Resources (UR) specification from Blockchain Commons

55 lines (54 loc) 2.42 kB
"use strict"; 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;