first commit

This commit is contained in:
2026-05-29 08:20:56 +01:00
commit 949299f58d
6368 changed files with 527176 additions and 0 deletions

View File

@@ -0,0 +1,53 @@
# common
## Purpose
Internal helpers shared by the four envelope codec modules (`request.ts`, `advertise.ts`, `response.ts`, `error.ts`). Centralising the base64 codec, strict-parse wrapper, and the `DMP_CODES` / `DmpError` re-export keeps each codec module focused on its envelope shape without duplicating utility code.
## Features
- `toBase64(bytes)` — Uint8Array → base64 string for JSON transport.
- `fromBase64(s)` — inverse, returns a fresh Uint8Array.
- `parseStrict(schema, input, code, label)` — throwing variant of Zod's `safeParse` that lifts schema errors into `DmpError(code, "...")`.
- `DMP_CODES` / `DmpError` — re-exported so the codec modules do a single `from "./common.js"`.
- Pure functions, zero side effects, deterministic outputs.
## Usage: Basic Example
```ts
import { fromBase64, toBase64 } from "../codec/common.js";
const bytes = new Uint8Array([1, 2, 3]);
const encoded = toBase64(bytes);
const back = fromBase64(encoded);
```
## Usage: Advanced Example
```ts
import z from "zod";
import { DMP_CODES, parseStrict } from "../codec/common.js";
const Schema = z.object({ id: z.string(), n: z.number().int() }).strict();
function parseHeader(bytes: Uint8Array) {
const parsed = JSON.parse(new TextDecoder().decode(bytes));
return parseStrict<{ id: string; n: number }>(
Schema,
parsed,
DMP_CODES.ENVELOPE_MALFORMED,
"header"
);
}
```
## API Reference
- `toBase64(bytes: Uint8Array): string`.
- `fromBase64(s: string): Uint8Array`.
- `parseStrict<T>(schema, input, code: DmpErrorCode, label: string): T` — throws `DmpError(code, "<label> schema rejected: <reason>")` on failure.
- `DMP_CODES`, `DmpError` — re-exports.
## Implementation Notes
The base64 helpers go through `btoa` / `atob` because the codec is JSON-based; they're correct for any byte sequence including those with high-bit-set bytes. `parseStrict` accepts a generic `T` so call sites get the precisely-typed result of the schema rather than `unknown`. The narrow surface here is deliberate: anything more complex belongs in the specific codec module so the mental model stays "common.ts holds zero protocol-shaped logic".