Spaces:
Running
Running
| 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, | |
| }; | |