pairing qr

This commit is contained in:
seb
2026-07-20 18:05:44 +02:00
parent 7bd8df22d1
commit 538ecf7a80
4 changed files with 397 additions and 1 deletions

View File

@@ -0,0 +1,73 @@
#!/usr/bin/env node
/**
* Generate a pairing QR code for JTL-POS.
*
* Usage:
* node scripts/create-pairing-qr.mjs <host-ip>
* npm run qr -- 192.168.1.50
*
* Reads PORT / PAIRING_CODE from .env and the TLS cert from certs/cert.pem.
*/
import fs from 'node:fs';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import dotenv from 'dotenv';
import QRCode from 'qrcode';
const root = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '..');
dotenv.config({ path: path.join(root, '.env') });
const host = process.argv[2];
if (!host) {
console.error('Usage: node scripts/create-pairing-qr.mjs <host-ip>');
process.exit(1);
}
const port = String(process.env.PORT || '4443');
const pin = String(process.env.PAIRING_CODE || '307018');
const certPath = path.join(root, 'certs', 'cert.pem');
// Compact: base64 DER only (no PEM headers / line wraps) — client can re-wrap if needed
const cert = fs
.readFileSync(certPath, 'utf8')
.replace(/-----BEGIN CERTIFICATE-----/g, '')
.replace(/-----END CERTIFICATE-----/g, '')
.replace(/\s+/g, '');
const payload = {
v: 1,
host,
port,
pin,
cert,
};
const content = JSON.stringify(payload);
const outDir = path.join(root, 'certs');
const pngPath = path.join(outDir, 'pairing-qr.png');
const jsonPath = path.join(outDir, 'pairing-qr.json');
const qrOpts = {
errorCorrectionLevel: 'L', // ~7% recovery — smallest size for the payload
margin: 1,
};
const qr = QRCode.create(content, qrOpts);
// Scale by module count so fewer modules actually looks smaller (not stretched to 512)
const modulePx = 4;
const width = qr.modules.size * modulePx;
await QRCode.toFile(pngPath, content, {
...qrOpts,
type: 'png',
width,
});
fs.writeFileSync(jsonPath, `${JSON.stringify(payload, null, 2)}\n`);
console.log(await QRCode.toString(content, { type: 'terminal', small: true, ...qrOpts }));
console.log(content);
console.log(`host=${host} port=${port} pin=${pin}`);
console.log(`QR version=${qr.version} modules=${qr.modules.size} png=${width}px`);
console.log(`Wrote ${pngPath}`);
console.log(`Wrote ${jsonPath}`);