UNPKG

ltcode

Version:

Luby Transform Code implementation.

47 lines (46 loc) 1.5 kB
"use strict"; 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;