/* SAMPLE PAYLOAD { "url": "https://google.com" } */ // https://gist.github.com/jonleighton/958841 const base64ArrayBuffer = function(arrayBuffer) { var base64 = ''; var encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; var bytes = new Uint8Array(arrayBuffer); var byteLength = bytes.byteLength; var byteRemainder = byteLength % 3; var mainLength = byteLength - byteRemainder; var a, b, c, d; var chunk; // Main loop deals with bytes in chunks of 3 for (var i = 0; i < mainLength; i = i + 3) { // Combine the three bytes into a single integer chunk = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2]; // Use bitmasks to extract 6-bit segments from the triplet a = (chunk & 16515072) >> 18; // 16515072 = (2^6 - 1) << 18 b = (chunk & 258048) >> 12; // 258048 = (2^6 - 1) << 12 c = (chunk & 4032) >> 6; // 4032 = (2^6 - 1) << 6 d = chunk & 63; // 63 = 2^6 - 1 // Convert the raw binary segments to the appropriate ASCII encoding base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d]; } // Deal with the remaining bytes and padding if (byteRemainder == 1) { chunk = bytes[mainLength]; a = (chunk & 252) >> 2; // 252 = (2^6 - 1) << 2 // Set the 4 least significant bits to zero b = (chunk & 3) << 4; // 3 = 2^2 - 1 base64 += encodings[a] + encodings[b] + '=='; } else if (byteRemainder == 2) { chunk = (bytes[mainLength] << 8) | bytes[mainLength + 1]; a = (chunk & 64512) >> 10; // 64512 = (2^6 - 1) << 10 b = (chunk & 1008) >> 4; // 1008 = (2^6 - 1) << 4 // Set the 2 least significant bits to zero c = (chunk & 15) << 2; // 15 = 2^4 - 1 base64 += encodings[a] + encodings[b] + encodings[c] + '='; } return base64; }; // Declare the Event Handler with the export syntax. The incoming message is called request export default (request) => { const xhr = require("xhr"); const console = require('console'); const db = require('kvstore'); const queryStringCodec = require('codec/query_string'); try { const url = request.message.url; const apiParams = queryStringCodec.stringify({ data: url, size: '150x150', }); console.log(apiParams); return db.get(url).then((obj) => { let promise; if (!obj) { console.log(`The QR code for ${url} does not exist. Creating it...`); promise = new Promise((resolve) => xhr.fetch(`https://api.qrserver.com/v1/create-qr-code/?${apiParams}`, {}) .then((response) => { //console.log(response); const base64 = base64ArrayBuffer(response["$buffer"].data); const newObj = { imgBase64: base64, contentType: response.headers["content-type"], }; db.set(url, newObj).catch((err) => { console.log("An error occured saving the object.", err); }); resolve(newObj); }) ); } else { console.log(`The QR code for ${url} already exists...`); promise = Promise.resolve(obj); } return promise.then((qrObj) => { request.message.qrCode = qrObj; return request.ok(); }); }); } catch (e) { console.error('Uncaught exception:', e); } };