evOo-local/packages/adapters/src/email-emulator.ts
cynarAI 6c7eed7580 Initial clean evOo-local from f00577b
Fresh history cut from cynarAI/evoo antigravity-handoff/project-timeline
(Voice First + project timeline). Brand docs/titles as evOo; keep @rakazo/*
packages as tech debt. Excludes node_modules, caches, secrets, voice blobs.
2026-09-20 17:15:16 +02:00

33 lines
958 B
TypeScript

import type { TransactionalEmail, TransactionalEmailProvider } from "@rakazo/adapter-kit";
/** Deterministic, offline transactional-email emulator for tests and local development. */
export class EmailEmulator implements TransactionalEmailProvider {
readonly sent: TransactionalEmail[] = [];
private failuresRemaining = 0;
constructor(private readonly onSend?: (message: TransactionalEmail) => void) {}
describe() {
return {
id: "email-emulator",
contractVersion: "1",
adapterVersion: "0.1.0",
capabilities: { transactional: true },
};
}
async send(message: TransactionalEmail): Promise<void> {
if (this.failuresRemaining > 0) {
this.failuresRemaining -= 1;
throw new Error("Emulated email delivery failure");
}
const captured = { ...message };
this.sent.push(captured);
this.onSend?.(captured);
}
failNextSends(count = 1): void {
this.failuresRemaining = count;
}
}