From 19f73ae9cf2afffbbb2abc71eb80c6d5bdccca52 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Mon, 14 Sep 2026 13:19:52 -0700 Subject: printer: publish receipts at QoS 1 and clean LNURL metadata memos Receipts were published at QoS 0, so a printer that was briefly offline (WiFi blip, keepalive timeout) never received them. QoS 1 lets the broker queue them for printers that hold a persistent session. LNURL-pay invoices carry the raw metadata array as their memo when the payer leaves no comment; unwrap the text/plain entry before printing. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_011cCouc5ASRXHDp5esLciEK --- lib/notifications.ts | 19 ++++++++++++++++++- routes/payments.ts | 1 + 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/notifications.ts b/lib/notifications.ts index 3fa880c4..fe245c61 100644 --- a/lib/notifications.ts +++ b/lib/notifications.ts @@ -19,6 +19,22 @@ if (config.vapid) { ); } + +// LNURL-pay invoices carry the raw metadata array as their memo when the +// payer left no comment, e.g. [["text/plain","Paying x@coinos.io"],...]. +// Receipts should show just the human-readable text. +const printerMemo = (memo) => { + if (typeof memo !== "string" || !memo.startsWith("[")) return memo; + try { + const meta = JSON.parse(memo); + if (Array.isArray(meta)) { + const plain = meta.find((m) => Array.isArray(m) && m[0] === "text/plain"); + if (plain) return plain[1]; + } + } catch (e) {} + return memo; +}; + export const notify = async (p, user, withdrawal) => { emit(user.id, "payment", p); let { username } = user; @@ -74,7 +90,8 @@ export const notify = async (p, user, withdrawal) => { if (!mqtt.connected) await mqtt.reconnect(); mqtt.publish( username, - `pay:${p.amount}:${p.tip}:${p.rate}:${p.created}:${p.id}:${p.memo}:${p.items}`, + `pay:${p.amount}:${p.tip}:${p.rate}:${p.created}:${p.id}:${printerMemo(p.memo)}:${p.items}`, + { qos: 1 }, ); } }; diff --git a/routes/payments.ts b/routes/payments.ts index 00230c62..accb09fd 100644 --- a/routes/payments.ts +++ b/routes/payments.ts @@ -740,6 +740,7 @@ export default { mqtt.publish( username, `pay:${p.amount}:${p.tip}:${p.rate}:${p.created}:${p.id}`, + { qos: 1 }, ); res.send({ ok: true }); -- cgit v1.2.3