UNPKG

quirc-wasm-emcc

Version:

Quirc wasm module compiled using Emscripten written in C programming language.

73 lines (61 loc) 1.96 kB
const Module = require('./quirc.js'); const isEmptyObject = (obj) => { return Object.entries(obj).length === 0 && typeof obj === "object" }; const isReady = () => { return new Promise(resolve => { setInterval(() => { let asmModule = Module.asm; if (!isEmptyObject(asmModule)) resolve(); }, 100); }) }; const decodeQrCode = (rawJpeg) => { let rawJpegObj = {}; /* * Create new unsigned int array of rawJpeg * */ rawJpegObj.asTypedArray = new Uint8Array(rawJpeg); /* * Allocate memory to store the rawJpegAsTypedArray * */ let srcBuf = Module._malloc(rawJpegObj.asTypedArray.length * rawJpegObj.asTypedArray.BYTES_PER_ELEMENT); /* * Write rawJpegAsTypedArray to allocated memory * */ Module.writeArrayToMemory(rawJpegObj.asTypedArray, srcBuf); /* * Load image from allocated memory buffer * */ let pImage = Module._setSrcImage(srcBuf, rawJpegObj.asTypedArray.length); /* * Get the image data such as width, height, and image * */ let width = Module.getValue(pImage + 0, 'i32'); let height = Module.getValue(pImage + 4, 'i32'); let image = Module.getValue(pImage + 8, 'i32'); /* * Decode image data and return the result * */ const QUIRC_MAX_PAYLOAD = 8896; let resultPtr = Module._decode_qr(image, width, height); const strArray = []; for (let pointer = 0; pointer < QUIRC_MAX_PAYLOAD; pointer++) { let char = Module.HEAP8[resultPtr / Uint8Array.BYTES_PER_ELEMENT + pointer]; if (char !== 0) { strArray.push(char); } else { break; } } let resultStr = String.fromCharCode.apply(null, strArray); /* * Clean the buffer * */ Module._free(srcBuf); Module._free(image); Module._free(pImage); delete rawJpegObj.asTypedArray; return resultStr; }; module.exports = {decodeQrCode, isReady};