feat(iios): email adapter dedup fix + smoke + verification
CI / build (push) Failing after 2m8s

Adds adapter-owned externalEventId extraction to the ChannelAdapter contract
(WebhookAdapter→eventId, EmailAdapter→Message-ID) and uses it in InboundService,
so email replays dedup on Message-ID (previously only payload.eventId worked).
Adds an email-dedup spec + smoke-email.mjs proving inbound → normalized, a reply
joins the same email thread, bad signature rejected, and outbound EMAIL SENT.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-03 20:34:26 +05:30
parent f0afca89e3
commit f0ea1ca553
6 changed files with 113 additions and 1 deletions
@@ -28,7 +28,8 @@ export class InboundService {
const { adapter, config } = reg;
const payload = this.safeParse(rawBody);
const externalEventId = typeof payload?.eventId === 'string' ? payload.eventId : undefined;
// The adapter extracts its provider-native id (eventId, Message-ID, …) for replay dedup.
const externalEventId = adapter.externalEventId?.(payload) ?? (typeof payload?.eventId === 'string' ? payload.eventId : undefined);
// Fail-closed: a bad/absent signature is recorded and rejected — never ingested.
if (!adapter.verifySignature(rawBody, headers, config.secret)) {