Skip to content

Instantly share code, notes, and snippets.

@eh3rrera
Created March 29, 2017 18:37
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save eh3rrera/a9ee3d26b96c0527b0b097f43fd6d752 to your computer and use it in GitHub Desktop.
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
/*
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