File size: 1,323 Bytes
ecdd7f6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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,
};