Helpers

Small utilities shipped with the package - optional, not required for routing.

CryptoHelper

  • sha256 / sha512(payload) - lowercase hex
  • hash(payload, algorithm) - SHA-1 | 256 | 384 | 512
  • secureRandom() - float in [0, 1]
import { CryptoHelper } from "jsr:@webtools/expressapi";

const digest = await CryptoHelper.sha256("hello");
const n = CryptoHelper.secureRandom();

StringHelper

  • generateRandomString(pattern?, chars?) - replaces each X (default pattern "XXXX-XXXX-XXXX-XXXX")
  • encodeBase64Url / decodeBase64Url
  • normalizePath(...parts), slugify, escapeHtml / unescape, clean
import { StringHelper } from "jsr:@webtools/expressapi";

const id = StringHelper.generateRandomString(); // e.g. "A3F2-…"
const path = StringHelper.normalizePath("/api/", "/users/"); // "/api/users"
const slug = StringHelper.slugify("Hello World!"); // "hello-world"

JsonToken

JWT-like signer for JSON payloads (SHA-256 + Base64URL): {base64url(payload)}.{signature}. No built-in expiration - use a full JWT library for that.

import { JsonToken, z } from "jsr:@webtools/expressapi";

const tokens = new JsonToken(Deno.env.get("JWT_SECRET")!);
const payloadSchema = z.object({ userId: z.string(), role: z.string() });

const jwt = await tokens.sign({ userId: "1", role: "admin" });
const payload = await tokens.verify(jwt, payloadSchema);
//    ^ { userId: string; role: string } | null

Verify compares signatures in constant time; invalid tokens return null. Pass a schema to validate the decoded payload. Recipe: Auth with JsonToken.