Created
March 29, 2017 18:37
-
-
Save eh3rrera/a9ee3d26b96c0527b0b097f43fd6d752 to your computer and use it in GitHub Desktop.
Code for the event handler of a PubNub Block that returns the base64 representation of the QR code of an URL
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
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); | |
} | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment