quickchart / lib /qr.js
glutamatt's picture
glutamatt HF Staff
Initial deployment of QuickChart service
ecdd7f6 verified
const qrcode = require('qrcode');
const toSJIS = require('qrcode/helper/to-sjis');
const { logger } = require('../logging');
// Default size of QR image in pixels.
const DEFAULT_QR_SIZE = 150;
function renderQr(format, mode, qrData, qrOpts) {
logger.debug('QR code', format, mode, qrOpts);
let finalQrData = qrData;
const finalQrOpts = qrOpts;
if (mode === 'sjis') {
finalQrData = [
{
data: qrData,
mode: 'kanji',
},
];
finalQrOpts.toSJISFunc = toSJIS;
}
finalQrOpts.type = format === 'png' ? 'png' : 'svg';
return new Promise((resolve, reject) => {
if (format === 'svg') {
qrcode
.toString(finalQrData, finalQrOpts)
.then(qrStr => {
resolve(Buffer.from(qrStr, 'utf8'));
})
.catch(err => {
logger.error('QR render error (SVG)', err);
reject(new Error(`Could not generate QR\n${err}`));
});
} else {
qrcode
.toDataURL(finalQrData, finalQrOpts)
.then(dataUrl => {
resolve(Buffer.from(dataUrl.split(',')[1], 'base64'));
})
.catch(err => {
logger.error('QR render error (PNG)', err);
reject(new Error(`Could not generate QR\n${err}`));
});
}
});
}
module.exports = {
renderQr,
DEFAULT_QR_SIZE,
};