generate-test-invite-qr.cjs 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. const fs = require('node:fs');
  2. const path = require('node:path');
  3. const QRCode = require('../node_modules/qrcode-terminal/vendor/QRCode');
  4. const levels = require('../node_modules/qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel');
  5. const { PNG } = require('pngjs');
  6. const QRReader = require('qrcode-reader');
  7. const url = 'http://192.168.110.245:8787/water-mini/index.html?invite_code=TEST-HC202609&demo=1';
  8. const qr = new QRCode(-1, levels.L);
  9. qr.addData(url);
  10. qr.make();
  11. const scale = 8;
  12. const quiet = 4;
  13. const size = (qr.getModuleCount() + quiet * 2) * scale;
  14. const png = new PNG({ width: size, height: size });
  15. for (let y = 0; y < size; y++) {
  16. for (let x = 0; x < size; x++) {
  17. const row = Math.floor(y / scale) - quiet;
  18. const col = Math.floor(x / scale) - quiet;
  19. const dark = row >= 0 && col >= 0 && row < qr.getModuleCount() && col < qr.getModuleCount() && qr.isDark(row, col);
  20. const offset = (y * size + x) * 4;
  21. const color = dark ? [0, 0, 0] : [255, 255, 255];
  22. png.data[offset] = color[0];
  23. png.data[offset + 1] = color[1];
  24. png.data[offset + 2] = color[2];
  25. png.data[offset + 3] = 255;
  26. }
  27. }
  28. const output = path.resolve(__dirname, '../src/static/invite-test.png');
  29. fs.mkdirSync(path.dirname(output), { recursive: true });
  30. fs.writeFileSync(output, PNG.sync.write(png));
  31. const reader = new QRReader();
  32. reader.callback = (error, result) => {
  33. if (error || result.result !== url) throw error || new Error('QR decode mismatch');
  34. console.log('Verified QR image: ' + output);
  35. console.log('Invite URL: ' + result.result);
  36. };
  37. reader.decode(PNG.sync.read(fs.readFileSync(output)));