ltcode
Version:
Luby Transform Code implementation.
47 lines (46 loc) • 1.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Encoder = void 0;
const utils_1 = require("./utils");
const prng_1 = require("./prng");
class Encoder {
constructor(size = 100, seed) {
this.seed = seed || this.randomSeed(1073741824);
this.blockSize = size;
}
randomSeed(max) {
const min = 0;
const number = Math.random() * (max - min) + min;
return Math.floor(number);
}
splitToBlocks(data) {
const blocks = [];
for (let i = 0; i < data.length; i += this.blockSize) {
let block = data.subarray(i, i + this.blockSize);
const n = (0, utils_1.intFromBytes)(block, "little");
blocks.push(n);
}
return blocks;
}
generateEncodedBlock(data, blocks, prng) {
const [blockseed, sampledBlocks] = prng.sample_source_blocks(null);
let blockData = BigInt(0);
for (const x of sampledBlocks) {
blockData ^= blocks[x];
}
return JSON.stringify({
length: data.length,
size: this.blockSize,
seed: blockseed,
data: blockData.toString()
});
}
*encode(data) {
const blocks = this.splitToBlocks(new TextEncoder().encode(data));
const prng = new prng_1.PRNG(blocks.length, this.seed);
while (true) {
yield this.generateEncodedBlock(data, blocks, prng);
}
}
}
exports.Encoder = Encoder;