qrloop
Version:
Envelop big blob of data into frames that can be displayed in series of QR Codes
97 lines • 4.45 kB
JavaScript
;
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