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.
33 lines
958 B
TypeScript
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;
|
|
}
|
|
}
|