const fs = require('node:fs'); const path = require('node:path'); const QRCode = require('../node_modules/qrcode-terminal/vendor/QRCode'); const levels = require('../node_modules/qrcode-terminal/vendor/QRCode/QRErrorCorrectLevel'); const { PNG } = require('pngjs'); const QRReader = require('qrcode-reader'); const url = 'http://192.168.110.245:8787/water-mini/index.html?invite_code=TEST-HC202609&demo=1'; const qr = new QRCode(-1, levels.L); qr.addData(url); qr.make(); const scale = 8; const quiet = 4; const size = (qr.getModuleCount() + quiet * 2) * scale; const png = new PNG({ width: size, height: size }); for (let y = 0; y < size; y++) { for (let x = 0; x < size; x++) { const row = Math.floor(y / scale) - quiet; const col = Math.floor(x / scale) - quiet; const dark = row >= 0 && col >= 0 && row < qr.getModuleCount() && col < qr.getModuleCount() && qr.isDark(row, col); const offset = (y * size + x) * 4; const color = dark ? [0, 0, 0] : [255, 255, 255]; png.data[offset] = color[0]; png.data[offset + 1] = color[1]; png.data[offset + 2] = color[2]; png.data[offset + 3] = 255; } } const output = path.resolve(__dirname, '../src/static/invite-test.png'); fs.mkdirSync(path.dirname(output), { recursive: true }); fs.writeFileSync(output, PNG.sync.write(png)); const reader = new QRReader(); reader.callback = (error, result) => { if (error || result.result !== url) throw error || new Error('QR decode mismatch'); console.log('Verified QR image: ' + output); console.log('Invite URL: ' + result.result); }; reader.decode(PNG.sync.read(fs.readFileSync(output)));