Socket
Socket
Sign inDemoInstall

qrloop

Package Overview
Dependencies
Maintainers
1
Versions
30
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

qrloop - npm Package Compare versions

Comparing version 0.9.0 to 1.0.0

lib/__tests__/basic.js

34

lib/Buffer.js

@@ -8,14 +8,20 @@ "use strict";

exports.xor = xor;
exports.default = typeof Buffer !== "undefined" ? Buffer : require("buffer").Buffer;
var _buffer = require("buffer");
function cutAndPad(data, size) {
var numChunks = Math.ceil(data.length / size);
var chunks = new Array(numChunks);
for (var i = 0, o = 0; i < numChunks; ++i, o += size) {
const numChunks = Math.ceil(data.length / size);
const chunks = new Array(numChunks);
for (let i = 0, o = 0; i < numChunks; ++i, o += size) {
chunks[i] = data.slice(o, o + size);
}
var last = numChunks - 1;
var pad = size - chunks[last].length;
const last = numChunks - 1;
const pad = size - chunks[last].length;
if (pad > 0) {
chunks[last] = Buffer.concat([chunks[last], Buffer.from(Array(pad).fill(0))]);
chunks[last] = _buffer.Buffer.concat([chunks[last], _buffer.Buffer.from(Array(pad).fill(0))]);
}
return chunks;

@@ -25,11 +31,13 @@ }

function xor(buffers) {
var result = Buffer.from(buffers[0]);
for (var i = 1; i < buffers.length; ++i) {
var buffer = buffers[i];
for (var j = 0; j < buffer.length; ++j) {
const result = _buffer.Buffer.from(buffers[0]);
for (let i = 1; i < buffers.length; ++i) {
const buffer = buffers[i];
for (let j = 0; j < buffer.length; ++j) {
result[j] ^= buffer[j];
}
}
return result;
}
//# sourceMappingURL=Buffer.js.map
}

@@ -6,4 +6,6 @@ "use strict";

});
var MAX_NONCE = exports.MAX_NONCE = 10;
var FOUNTAIN_V1 = exports.FOUNTAIN_V1 = 100;
//# sourceMappingURL=constants.js.map
exports.FOUNTAIN_V1 = exports.MAX_NONCE = void 0;
const MAX_NONCE = 10;
exports.MAX_NONCE = MAX_NONCE;
const FOUNTAIN_V1 = 100;
exports.FOUNTAIN_V1 = FOUNTAIN_V1;

@@ -11,10 +11,8 @@ "use strict";

var _md = require("md5");
var _md = _interopRequireDefault(require("md5"));
var _md2 = _interopRequireDefault(_md);
var _buffer = require("buffer");
var _Buffer = require("./Buffer");
var _Buffer2 = _interopRequireDefault(_Buffer);
var _constants = require("./constants");

@@ -25,36 +23,43 @@

function makeFountainFrame(dataChunks, selectedFrameIndexes) {
var k = selectedFrameIndexes.length;
var head = _Buffer2.default.alloc(3 + 2 * k);
const k = selectedFrameIndexes.length;
const head = _buffer.Buffer.alloc(3 + 2 * k);
head.writeUInt8(_constants.FOUNTAIN_V1, 0);
head.writeUInt16BE(k, 1);
var selectedFramesData = [];
for (var j = 0; j < k; j++) {
var frameIndex = selectedFrameIndexes[j];
const selectedFramesData = [];
for (let j = 0; j < k; j++) {
const frameIndex = selectedFrameIndexes[j];
selectedFramesData.push(dataChunks[frameIndex]);
head.writeUInt16BE(frameIndex, 3 + 2 * j);
}
var data = (0, _Buffer.xor)(selectedFramesData);
return _Buffer2.default.concat([head, data]).toString("base64");
const data = (0, _Buffer.xor)(selectedFramesData);
return _buffer.Buffer.concat([head, data]).toString("base64");
}
function makeDataFrame(_ref) {
var data = _ref.data,
nonce = _ref.nonce,
totalFrames = _ref.totalFrames,
frameIndex = _ref.frameIndex;
function makeDataFrame({
data,
nonce,
totalFrames,
frameIndex
}) {
const head = _buffer.Buffer.alloc(5);
var head = _Buffer2.default.alloc(5);
head.writeUInt8(nonce, 0);
head.writeUInt16BE(totalFrames, 1);
head.writeUInt16BE(frameIndex, 3);
return _Buffer2.default.concat([head, data]).toString("base64");
return _buffer.Buffer.concat([head, data]).toString("base64");
}
function wrapData(data) {
var lengthBuffer = _Buffer2.default.alloc(4);
const lengthBuffer = _buffer.Buffer.alloc(4);
lengthBuffer.writeUInt32BE(data.length, 0);
var md5Buffer = _Buffer2.default.from((0, _md2.default)(data), "hex");
return _Buffer2.default.concat([lengthBuffer, md5Buffer, data]);
const md5Buffer = _buffer.Buffer.from((0, _md.default)(data), "hex");
return _buffer.Buffer.concat([lengthBuffer, md5Buffer, data]);
}
/**

@@ -80,38 +85,42 @@ * in one loop:

*/
function makeLoop(wrappedData, dataSize, index, random) {
var nonce = index % _constants.MAX_NONCE;
var dataChunks = (0, _Buffer.cutAndPad)(wrappedData, dataSize);
var fountains = [];
const nonce = index % _constants.MAX_NONCE;
const dataChunks = (0, _Buffer.cutAndPad)(wrappedData, dataSize);
const fountains = [];
if (dataChunks.length > 2) {
// TODO optimal number fcount and k still need to be determined
var fcount = Math.floor(dataChunks.length / 6);
var k = Math.ceil(dataChunks.length / 2);
for (var i = 0; i < fcount; i++) {
var distribution = Array(dataChunks.length).fill(null).map(function (_, i) {
return { i: i, n: random() };
}).sort(function (a, b) {
return a.n - b.n;
}).slice(0, k).map(function (o) {
return o.i;
});
const fcount = Math.floor(dataChunks.length / 6);
const k = Math.ceil(dataChunks.length / 2);
for (let i = 0; i < fcount; i++) {
const distribution = Array(dataChunks.length).fill(null).map((_, i) => ({
i,
n: random()
})).sort((a, b) => a.n - b.n).slice(0, k).map(o => o.i);
fountains.push(makeFountainFrame(dataChunks, distribution));
}
}
var result = [];
var j = 0;
var fountainEach = Math.floor(dataChunks.length / fountains.length);
for (var _i = 0; _i < dataChunks.length; _i++) {
const result = [];
let j = 0;
const fountainEach = Math.floor(dataChunks.length / fountains.length);
for (let i = 0; i < dataChunks.length; i++) {
result.push(makeDataFrame({
data: dataChunks[_i],
nonce: nonce,
data: dataChunks[i],
nonce,
totalFrames: dataChunks.length,
frameIndex: _i
frameIndex: i
}));
if (_i % fountainEach === 0 && fountains[j]) {
if (i % fountainEach === 0 && fountains[j]) {
result.push(fountains[j++]);
}
}
return result;
}
/**

@@ -123,21 +132,21 @@ * Export data into one series of chunk of string that you can generate a QR with

*/
function dataToFrames(dataOrStr) {
var dataSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 120;
var loops = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
function dataToFrames(dataOrStr, dataSize = 120, loops = 1) {
// Simple deterministic RNG
var seed = 1;
let seed = 1;
function random() {
var x = Math.sin(seed++) * 10000;
let x = Math.sin(seed++) * 10000;
return x - Math.floor(x);
}
var wrappedData = wrapData(_Buffer2.default.from(dataOrStr));
const wrappedData = wrapData(_buffer.Buffer.from(dataOrStr));
let r = [];
var r = [];
for (var i = 0; i < loops; i++) {
for (let i = 0; i < loops; i++) {
r = r.concat(makeLoop(wrappedData, dataSize, i, random));
}
return r;
}
//# sourceMappingURL=exporter.js.map
}

@@ -6,17 +6,12 @@ "use strict";

});
exports.areFramesComplete = exports.progressOfFrames = exports.currentNumberOfFrames = exports.totalNumberOfFrames = undefined;
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
exports.parseFramesReducer = parseFramesReducer;
exports.framesToData = framesToData;
exports.areFramesComplete = exports.progressOfFrames = exports.currentNumberOfFrames = exports.totalNumberOfFrames = void 0;
var _md = require("md5");
var _md = _interopRequireDefault(require("md5"));
var _md2 = _interopRequireDefault(_md);
var _buffer = require("buffer");
var _Buffer = require("./Buffer");
var _Buffer2 = _interopRequireDefault(_Buffer);
var _constants = require("./constants");

@@ -26,5 +21,9 @@

function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
var initialState = {
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
const initialState = {
frames: [],

@@ -37,31 +36,34 @@ fountainsQueue: [],

if (!state) return state;
var fountainsQueue = state.fountainsQueue.slice(0);
var frames = state.frames.slice(0);
const fountainsQueue = state.fountainsQueue.slice(0);
const frames = state.frames.slice(0);
if (fountainsQueue.length === 0 || frames.length === 0) return state;
var framesCount = frames[0].framesCount;
const {
framesCount
} = frames[0];
const framesByIndex = {};
var framesByIndex = {};
for (var _i = 0; _i < frames.length; ++_i) {
var frame = frames[_i];
for (let i = 0; i < frames.length; ++i) {
const frame = frames[i];
framesByIndex[frame.index] = frame;
}
var i = 0;
let i = 0;
while (i < fountainsQueue.length) {
var fountain = fountainsQueue[i];
var existingFramesData = [];
var missing = [];
for (var j = 0; j < fountain.frameIndexes.length; ++j) {
var _index = fountain.frameIndexes[j];
var f = framesByIndex[_index];
const fountain = fountainsQueue[i];
const existingFramesData = [];
const missing = [];
for (let j = 0; j < fountain.frameIndexes.length; ++j) {
const index = fountain.frameIndexes[j];
const f = framesByIndex[index];
if (f) {
existingFramesData.push(f.data);
} else {
missing.push(_index);
missing.push(index);
}
}
if (existingFramesData.length > 0 && fountain.data.length !== Math.min.apply(Math, _toConsumableArray(existingFramesData.map(function (f) {
return f.length;
})))) {
if (existingFramesData.length > 0 && fountain.data.length !== Math.min(...existingFramesData.map(f => f.length))) {
// drop the fountain that no longer match the frames data length

@@ -75,19 +77,19 @@ fountainsQueue.splice(i, 1);

// found a frame to recover. rebuild it
var _index2 = missing[0];
const [index] = missing;
const recoveredData = (0, _Buffer.xor)(existingFramesData.concat([fountain.data]));
var recoveredData = (0, _Buffer.xor)(existingFramesData.concat([fountain.data]));
var head = _Buffer2.default.alloc(5);
const head = _buffer.Buffer.alloc(5);
head.writeUInt8(0, 0);
head.writeUInt16BE(framesCount, 1);
head.writeUInt16BE(_index2, 3);
var _frame = {
index: _index2,
framesCount: framesCount,
head.writeUInt16BE(index, 3);
const frame = {
index,
framesCount,
data: recoveredData
};
frames.push(_frame);
framesByIndex[_index2] = _frame;
frames.push(frame);
framesByIndex[index] = frame;
fountainsQueue.splice(i, 1); // we start over to see if there is no impacted fountains
fountainsQueue.splice(i, 1);
// we start over to see if there is no impacted fountains
i = 0;

@@ -99,8 +101,7 @@ } else {

return _extends({}, state, {
frames: frames,
fountainsQueue: fountainsQueue
return _objectSpread({}, state, {
frames,
fountainsQueue
});
}
/**

@@ -110,27 +111,34 @@ * reduce frames data array to add on more chunk to it.

*/
function parseFramesReducer(_state, chunkStr) {
var state = _state || initialState;
var chunk = _Buffer2.default.from(chunkStr, "base64");
var head = chunk.slice(0, 5);
var version = head.readUInt8(0);
const state = _state || initialState;
const chunk = _buffer.Buffer.from(chunkStr, "base64");
const head = chunk.slice(0, 5);
const version = head.readUInt8(0);
if (version === _constants.FOUNTAIN_V1) {
if (state.exploredFountains.includes(chunkStr)) return state; // no need to address again
var _exploredFountains = state.exploredFountains.concat(chunkStr);
var k = chunk.readUInt16BE(1);
var _frameIndexes = [];
for (var i = 0; i < k; ++i) {
_frameIndexes.push(chunk.readUInt16BE(3 + 2 * i));
const exploredFountains = state.exploredFountains.concat(chunkStr);
const k = chunk.readUInt16BE(1);
const frameIndexes = [];
for (let i = 0; i < k; ++i) {
frameIndexes.push(chunk.readUInt16BE(3 + 2 * i));
}
var _data = chunk.slice(3 + 2 * k);
var _frames = state.frames;
var fountain = {
frameIndexes: _frameIndexes,
data: _data
const data = chunk.slice(3 + 2 * k);
const frames = state.frames;
const fountain = {
frameIndexes,
data
};
var _fountainsQueue = state.fountainsQueue.concat(fountain);
const fountainsQueue = state.fountainsQueue.concat(fountain);
return resolveFountains({
frames: _frames,
fountainsQueue: _fountainsQueue,
exploredFountains: _exploredFountains
frames,
fountainsQueue,
exploredFountains
});

@@ -142,8 +150,11 @@ }

}
var framesCount = head.readUInt16BE(1);
var index = head.readUInt16BE(3);
var data = chunk.slice(5);
const framesCount = head.readUInt16BE(1);
const index = head.readUInt16BE(3);
const data = chunk.slice(5);
if (framesCount <= 0) {
throw new Error("invalid framesCount");
}
if (index < 0 || index >= framesCount) {

@@ -153,44 +164,52 @@ throw new Error("invalid index");

return resolveFountains(_extends({}, state, {
frames: state.frames
// override frame by index and also make sure all frames have same framesCount. this allows to not be stucked and recover any scenario.
.filter(function (c) {
return c.index !== index && c.framesCount === framesCount;
}).concat({ framesCount: framesCount, index: index, data: data })
return resolveFountains(_objectSpread({}, state, {
frames: state.frames // override frame by index and also make sure all frames have same framesCount. this allows to not be stucked and recover any scenario.
.filter(c => c.index !== index && c.framesCount === framesCount).concat({
framesCount,
index,
data
})
}));
}
/**
* retrieve the total number of frames
*/
var totalNumberOfFrames = exports.totalNumberOfFrames = function totalNumberOfFrames(s) {
return s && s.frames.length > 0 ? s.frames[0].framesCount : null;
};
const totalNumberOfFrames = s => s && s.frames.length > 0 ? s.frames[0].framesCount : null;
/**
* get the currently captured number of frames
*/
var currentNumberOfFrames = exports.currentNumberOfFrames = function currentNumberOfFrames(s) {
return s ? s.frames.length : 0;
};
exports.totalNumberOfFrames = totalNumberOfFrames;
const currentNumberOfFrames = s => s ? s.frames.length : 0;
/**
* get a progress value from 0 to 1
*/
var progressOfFrames = exports.progressOfFrames = function progressOfFrames(s) {
var total = totalNumberOfFrames(s);
exports.currentNumberOfFrames = currentNumberOfFrames;
const progressOfFrames = s => {
const total = totalNumberOfFrames(s);
if (!total) return 0;
return currentNumberOfFrames(s) / total;
};
/**
* check if the frames have all been retrieved
*/
var areFramesComplete = exports.areFramesComplete = function areFramesComplete(s) {
return totalNumberOfFrames(s) === currentNumberOfFrames(s);
};
exports.progressOfFrames = progressOfFrames;
const areFramesComplete = s => totalNumberOfFrames(s) === currentNumberOfFrames(s);
/**
* return final result of the frames. assuming you have checked `areFramesComplete`
*/
exports.areFramesComplete = areFramesComplete;
function framesToData(s) {

@@ -200,13 +219,10 @@ if (!s) {

}
var all = _Buffer2.default.concat(s.frames.slice(0).sort(function (a, b) {
return a.index - b.index;
}).map(function (frame) {
return frame.data;
}));
var length = all.readUInt32BE(0);
var expectedMD5 = all.slice(4, 20).toString("hex");
var data = all.slice(20).slice(0, length);
const all = _buffer.Buffer.concat(s.frames.slice(0).sort((a, b) => a.index - b.index).map(frame => frame.data));
if ((0, _md2.default)(data) !== expectedMD5) {
const length = all.readUInt32BE(0);
const expectedMD5 = all.slice(4, 20).toString("hex");
const data = all.slice(20).slice(0, length);
if ((0, _md.default)(data) !== expectedMD5) {
throw new Error("invalid data: md5 doesn't match");

@@ -216,3 +232,2 @@ }

return data;
}
//# sourceMappingURL=importer.js.map
}

@@ -6,16 +6,14 @@ "use strict";

});
exports.importer = exports.exporter = undefined;
exports.importer = exports.exporter = void 0;
var _exporter = require("./exporter");
var exporter = _interopRequireWildcard(require("./exporter"));
var exporter = _interopRequireWildcard(_exporter);
exports.exporter = exporter;
var _importer = require("./importer");
var importer = _interopRequireWildcard(require("./importer"));
var importer = _interopRequireWildcard(_importer);
exports.importer = importer;
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
exports.exporter = exporter;
exports.importer = importer;
//# sourceMappingURL=index.js.map
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
{
"name": "qrloop",
"version": "0.9.0",
"version": "1.0.0",
"description": "Envelop big blob of data into frames that can be displayed in series of QR Codes",

@@ -13,7 +13,6 @@ "keywords": [

"main": "lib/index.js",
"module": "lib-es/index.js",
"scripts": {
"flow-typed": "flow-typed install -s",
"build": "babel --ignore __tests__ -sd lib src && flow-copy-source -i \"__tests__/**\" src lib",
"build": "./scripts/build.sh",
"prepublish": "yarn build",
"watch": "babel -wsd lib src && flow-copy-source -wv src lib",
"prettier": "prettier --write 'src/**/*.js'",

@@ -41,21 +40,24 @@ "lint": "eslint src",

"dependencies": {
"flow-typed": "^2.5.2",
"buffer": "^5.4.3",
"md5": "^2.2.1"
},
"devDependencies": {
"babel-cli": "^6.26.0",
"babel-core": "^6.26.3",
"babel-eslint": "^10.0.2",
"babel-jest": "^24.8.0",
"babel-preset-env": "^1.7.0",
"babel-preset-flow": "^6.23.0",
"babel-preset-stage-0": "^6.24.1",
"eslint": "^6.0.1",
"@babel/cli": "^7.7.7",
"@babel/core": "^7.7.7",
"@babel/plugin-proposal-class-properties": "^7.7.0",
"@babel/plugin-proposal-export-default-from": "^7.5.2",
"@babel/plugin-proposal-export-namespace-from": "^7.5.2",
"@babel/plugin-syntax-dynamic-import": "^7.2.0",
"@babel/plugin-syntax-import-meta": "^7.2.0",
"@babel/preset-env": "^7.7.7",
"@babel/preset-flow": "^7.0.0",
"babel-eslint": "^10.0.3",
"eslint": "^6.8.0",
"eslint-plugin-babel": "^5.3.0",
"eslint-plugin-flowtype": "^3.11.1",
"flow-bin": "^0.102.0",
"flow-copy-source": "^2.0.7",
"jest": "^24.8.0",
"prettier": "^1.18.2"
"eslint-plugin-flowtype": "^4.5.2",
"flow-bin": "^0.114.0",
"flow-copy-source": "^2.0.9",
"jest": "^24.9.0",
"prettier": "^1.19.1"
}
}

@@ -33,3 +33,3 @@ # qrloop

```js
import { dataToFrames } from "qrloop/exporter";
import { dataToFrames } from "qrloop";

@@ -61,3 +61,3 @@ // examples

progressOfFrames
} from "qrloop/importer";
} from "qrloop";

@@ -64,0 +64,0 @@ const onResult = finalResult => console.log({ finalResult });

// @flow
import { Buffer } from "buffer";
export default (typeof Buffer !== "undefined"
? Buffer
: require("buffer").Buffer);
export function cutAndPad(data: Buffer, size: number): Buffer[] {

@@ -8,0 +5,0 @@ const numChunks = Math.ceil(data.length / size);

// @flow
import md5 from "md5";
import Buffer, { cutAndPad, xor } from "./Buffer";
import { Buffer } from "buffer";
import { cutAndPad, xor } from "./Buffer";
import { MAX_NONCE, FOUNTAIN_V1 } from "./constants";

@@ -6,0 +7,0 @@

// @flow
import md5 from "md5";
import Buffer, { xor } from "./Buffer";
import { Buffer } from "buffer";
import { xor } from "./Buffer";
import { MAX_NONCE, FOUNTAIN_V1 } from "./constants";

@@ -6,0 +7,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with āš”ļø by Socket Inc