UNPKG

qrloop

Version:

Envelop big blob of data into frames that can be displayed in series of QR Codes

97 lines 4.45 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const __1 = require(".."); const Buffer_1 = require("../Buffer"); test("there is at least one fountain frame and it's recovering one frame", () => { [1000, 5000, 99999].forEach((size) => { const data = Buffer.from(Array(size) .fill(null) .map((_, i) => i % 256)); const framesExport = (0, __1.dataToFrames)(data, 200, 4); let acc = null; for (let i = 0; i < framesExport.length; i++) { acc = (0, __1.parseFramesReducer)(acc, framesExport[i]); } if (!acc) throw new Error("falsy acc"); expect(acc.fountainsQueue.length).toBe(0); expect(acc.exploredFountains.length).toBeGreaterThan(0); }); }); test("wrapData", () => { const data = Buffer.from(Array(2000) .fill(null) .map((_, i) => i % 256)); const wrappedData = (0, __1.wrapData)(data); const buffers = (0, Buffer_1.cutAndPad)(wrappedData, 200); const frames = buffers.map((data, frameIndex) => (0, __1.makeDataFrame)({ data, nonce: 0, frameIndex, totalFrames: buffers.length, })); const r = frames.reduce(__1.parseFramesReducer, null); expect((0, __1.areFramesComplete)(r)).toBe(true); expect((0, __1.framesToData)(r).toString("hex")).toBe(data.toString("hex")); }); test("a fountain can recover one missing frame", () => { const data = Buffer.from(Array(2000) .fill(null) .map((_, i) => i % 256)); const wrappedData = (0, __1.wrapData)(data); const buffers = (0, Buffer_1.cutAndPad)(wrappedData, 200); const frames = buffers.map((data, frameIndex) => ({ frame: (0, __1.makeDataFrame)({ data, nonce: 0, frameIndex, totalFrames: buffers.length, }), frameIndex, })); for (let i = 0; i < buffers.length - 1; i++) { const framesMissingOne = frames.slice(0, i).concat(frames.slice(i + 1)); const fountainFrame = (0, __1.makeFountainFrame)(buffers, frames.map((o) => o.frameIndex)); const missingOne = framesMissingOne .map((o) => o.frame) .reduce(__1.parseFramesReducer, null); expect((0, __1.areFramesComplete)(missingOne)).toBe(false); expect((0, __1.currentNumberOfFrames)(missingOne)).toBe(buffers.length - 1); const withFountains = (0, __1.parseFramesReducer)(missingOne, fountainFrame); expect((0, __1.areFramesComplete)(withFountains)).toBe(true); expect((0, __1.currentNumberOfFrames)(withFountains)).toBe(buffers.length); expect((0, __1.framesToData)(withFountains).toString("hex")).toBe(data.toString("hex")); } }); test("2 fountains cascading", () => { const data = Buffer.from(Array(2000) .fill(null) .map((_, i) => i % 256)); const wrappedData = (0, __1.wrapData)(data); const buffers = (0, Buffer_1.cutAndPad)(wrappedData, 200); const frames = buffers.map((data, frameIndex) => ({ frame: (0, __1.makeDataFrame)({ data, nonce: 0, frameIndex, totalFrames: buffers.length, }), frameIndex, })); const framesMissingThree = frames.slice(2, frames.length - 1); const fountain1Frame = (0, __1.makeFountainFrame)(buffers, frames.map((o) => o.frameIndex).slice(0, frames.length / 2)); const fountainAllFrame = (0, __1.makeFountainFrame)(buffers, frames.map((o) => o.frameIndex)); const missingThree = framesMissingThree .map((o) => o.frame) .reduce(__1.parseFramesReducer, null); expect((0, __1.areFramesComplete)(missingThree)).toBe(false); expect((0, __1.currentNumberOfFrames)(missingThree)).toBe(buffers.length - 3); const withFountains = [fountain1Frame, fountainAllFrame].reduce(__1.parseFramesReducer, missingThree); expect((0, __1.areFramesComplete)(withFountains)).toBe(false); expect((0, __1.currentNumberOfFrames)(withFountains)).toBe(buffers.length - 3); const withOneMoreFrame = (0, __1.parseFramesReducer)(withFountains, frames[0].frame); expect((0, __1.areFramesComplete)(withOneMoreFrame)).toBe(true); expect((0, __1.currentNumberOfFrames)(withOneMoreFrame)).toBe(buffers.length); expect((0, __1.framesToData)(withOneMoreFrame).toString("hex")).toBe(data.toString("hex")); }); //# sourceMappingURL=fountain.js.map