From dd1eb711df98a8583e0ff31217e958fcfcb0235f Mon Sep 17 00:00:00 2001 From: yiekheng Date: Sat, 9 May 2026 16:16:09 +0800 Subject: [PATCH] feat(bot): add QR PNG renderer --- apps/bot/src/whatsapp/qr-renderer.test.ts | 15 +++++++++++++++ apps/bot/src/whatsapp/qr-renderer.ts | 6 ++++++ 2 files changed, 21 insertions(+) create mode 100644 apps/bot/src/whatsapp/qr-renderer.test.ts create mode 100644 apps/bot/src/whatsapp/qr-renderer.ts diff --git a/apps/bot/src/whatsapp/qr-renderer.test.ts b/apps/bot/src/whatsapp/qr-renderer.test.ts new file mode 100644 index 0000000..f5f51ff --- /dev/null +++ b/apps/bot/src/whatsapp/qr-renderer.test.ts @@ -0,0 +1,15 @@ +import { describe, expect, it } from "vitest"; +import { renderQrPng } from "./qr-renderer.js"; + +describe("renderQrPng", () => { + it("returns a PNG buffer for a non-empty string", async () => { + const png = await renderQrPng("test-qr-payload"); + expect(png).toBeInstanceOf(Buffer); + expect(png[0]).toBe(0x89); + expect(png.subarray(1, 4).toString("ascii")).toBe("PNG"); + }); + + it("rejects empty input", async () => { + await expect(renderQrPng("")).rejects.toThrow(); + }); +}); diff --git a/apps/bot/src/whatsapp/qr-renderer.ts b/apps/bot/src/whatsapp/qr-renderer.ts new file mode 100644 index 0000000..70050c6 --- /dev/null +++ b/apps/bot/src/whatsapp/qr-renderer.ts @@ -0,0 +1,6 @@ +import QRCode from "qrcode"; + +export async function renderQrPng(payload: string): Promise { + if (!payload) throw new Error("renderQrPng: payload is empty"); + return await QRCode.toBuffer(payload, { type: "png", width: 512, margin: 2 }); +}