const Polynomial = require('./polynomial') function ReedSolomonEncoder (degree) { this.genPoly = undefined this.degree = degree if (this.degree) this.initialize(this.degree) } /** * Initialize the encoder. * The input param should correspond to the number of error correction codewords. * * @param {Number} degree */ ReedSolomonEncoder.prototype.initialize = function initialize (degree) { // create an irreducible generator polynomial this.degree = degree this.genPoly = Polynomial.generateECPolynomial(this.degree) } /** * Encodes a chunk of data * * @param {Uint8Array} data Buffer containing input data * @return {Uint8Array} Buffer containing encoded data */ ReedSolomonEncoder.prototype.encode = function encode (data) { if (!this.genPoly) { throw new Error('Encoder not initialized') } // Calculate EC for this data block // extends data size to data+genPoly size const paddedData = new Uint8Array(data.length + this.degree) paddedData.set(data) // The error correction codewords are the remainder after dividing the data codewords // by a generator polynomial const remainder = Polynomial.mod(paddedData, this.genPoly) // return EC data blocks (last n byte, where n is the degree of genPoly) // If coefficients number in remainder are less than genPoly degree, // pad with 0s to the left to reach the needed number of coefficients const start = this.degree - remainder.length if (start > 0) { const buff = new Uint8Array(this.degree) buff.set(remainder, start) return buff } return remainder } module.exports = ReedSolomonEncoder