3.0 KiB
@suaveplan/license — constants
(no submodules)
Purpose
Wire-format constants for the license package. Every value here
is part of the binary contract: the per-field bit widths
(FIELD_BITS), the Base32 alphabet, the signature lengths, the version
byte, and the day-to-millisecond conversion factor. Changing any
constant breaks every existing license key, so they live in their own
module and are imported by every code path that touches the format.
Features
LICENSE_VERSION(currently2) — pinned by the 3-bit version field;validateLicenserejects any payload with a higher version.FULL_SIGNATURE_BYTES(64) /SIGNATURE_BYTES(20) /MIN_SIGNATURE_BYTES(16) — the three signature-length thresholds honoured by generation and validation.BASE32_ALPHABET— 32-char Crockford-style alphabet (no I/L/O/U) used by both encode and decode.LICENSE_SCHEMA— per-field maximum values, used by Zod schemas and by the bounds checks inpackPayload.FIELD_BITS— per-field bit widths summing to 72, consumed by the bitpacker.PAYLOAD_BYTES(9),OBFUSCATION_PAYLOAD_CHARS(15), andMS_PER_DAY(86 400 000) — derived constants pulled out so callers don't have to recompute them.
Usage: Basic
import { LICENSE_VERSION, BASE32_ALPHABET } from "@suaveplan/license/constants/constants";
console.log(`Targeting wire format v${LICENSE_VERSION}`);
console.log(`Alphabet size: ${BASE32_ALPHABET.length}`); // 32
Usage: Advanced
Bounds-checking a payload field at the application layer before constructing it:
import { LICENSE_SCHEMA } from "@suaveplan/license/constants/constants";
import type { LicensePayload } from "@suaveplan/license/types/license";
function clampPayload(p: LicensePayload): LicensePayload {
return {
...p,
productId: Math.min(p.productId, LICENSE_SCHEMA.productId),
timeValue: Math.min(p.timeValue, LICENSE_SCHEMA.timeValue),
};
}
API Reference
| Symbol | Type | Value |
|---|---|---|
LICENSE_VERSION |
2 |
Current format version |
FULL_SIGNATURE_BYTES |
64 |
secp256k1 compact signature length |
SIGNATURE_BYTES |
20 |
Default truncated-signature length |
MIN_SIGNATURE_BYTES |
16 |
Lowest acceptable truncation |
BASE32_ALPHABET |
string |
0-9A-HJKMNP-TV-Z (32 chars) |
LICENSE_SCHEMA |
Readonly<Record<field, max>> |
Per-field max values |
FIELD_BITS |
Readonly<Record<field, bits>> |
Per-field bit widths |
PAYLOAD_BYTES |
9 |
Packed payload size |
OBFUSCATION_PAYLOAD_CHARS |
15 |
Chars rotated by obfuscation |
MS_PER_DAY |
86_400_000 |
UTC day in milliseconds |
Implementation Notes
Every constant is declared as const, so its TypeScript type is the
literal value (e.g. LICENSE_VERSION: 2), giving exhaustiveness benefits
when compared in switch statements. The two records (LICENSE_SCHEMA
and FIELD_BITS) are also frozen at the type level via as const,
preventing accidental mutation through their Readonly view.