Skip to content

Deno.serve QRCode Server Example for All #17

Description

@suchislife801

The following code snippet serves a QRCode using Deno.

URL Params Example:

http://localhost:4000/?d=Hello+World!&v=5&e=L&s=250&m=Byte

import { qrcode } from "https://deno.land/x/qrcode/mod.ts";
import { decodeBase64 } from "https://deno.land/std@0.204.0/encoding/base64.ts";

// Deno.serve() handler
async function handler(request: Request, connInfo: Deno.ServeHandlerInfo): Promise<Response> {

  // Information for a HTTP request.
  const remoteAddr = connInfo.remoteAddr;

  const url = new URL(request.url);
  // Data to encode...
  const d = url.searchParams.get("d") || "Hello World!";
  // Version of barcode 0 (Automatic type number) - 40
  // https://www.qrcode.com/en/about/version.html
  const v = Math.min(40, Math.max(0, Number(url.searchParams.get("v")) || 0));
  // Error Correction L = 7% | M = 15% | Q = 25% | H = 30%
  const e = ["L", "M", "Q", "H"].includes(url.searchParams.get("e")) ? url.searchParams.get("e") : "M";
  // Size of barcode 250 - 500
  const s = Math.min(500, Math.max(250, Number(url.searchParams.get("s")) || 250));
  // Mode = 'Numeric' | 'Alphanumeric' | 'Byte' | 'Kanji'
  const m = ['Numeric', 'Alphanumeric', 'Byte', 'Kanji'].includes(url.searchParams.get("m")) ? url.searchParams.get("m") : "Byte";

  const base64Image = await qrcode(d, { typeNumber: v, errorCorrectLevel: e, size: s, mode: m }); // data:image/gif;base64,...
  const binaryImage = new Uint8Array(decodeBase64(base64Image.split(",")[1]));

  return new Response(binaryImage, {
    status: 200,
    headers: {
      "Server": `Deno v${Deno.version.deno}`,
      "Allow": "HEAD, GET, OPTIONS",
      "Cache-Control": "no-store",
      "Content-Language": "en-US",
      "Access-Control-Allow-Origin": "*",
      "Access-Control-Allow-Methods": "HEAD, GET, OPTIONS",
      "Access-Control-Allow-Headers": "Content-Type",
      "Access-Control-Allow-Credentials": "false",
      "Content-Type": "image/gif",
    },
  })

}

// Start the QRCode server of Port 4000
Deno.serve({
  port: 4000,
  hostname: "0.0.0.0",
  onListen({ port, hostname }) {
    console.log(`Application..... QR Code - Model 2 - A QR Code Model 2 Server
Deno v${Deno.version.deno} : Typescript v${Deno.version.typescript} : V8 v${Deno.version.v8}
Permissions..... --allow-net
Gateway URL..... http://${hostname}:${port}\n\n`);
  },
  onError(error: unknown) {
    console.error(error);
    return new Response("HTTP 500: Internal Server Error", {
      status: 500,
      headers: { "Content-Type": "text/plain" },
    });
  },
}, handler);

// deno run --allow-net qrServe.ts

Hello World!

sample

Metadata

Metadata

Assignees

No one assigned

    Labels

    documentationImprovements or additions to documentationhelp wantedExtra attention is needed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions