feat(iios): wire projectors + relay into DLQ (P9 chaos-safe)
Projectors register a replay handler and route bus errors to dlq.onConsumerFailure (dead-letter + clear the claim-then-fail claim) instead of swallowing them. Relay dead-letters an outbox event after IIOS_OUTBOX_MAX_ATTEMPTS instead of retrying forever. Chaos test proves poison → DLQ → replay resolves while sibling events keep flowing (KG-13/KG-06). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
import { randomUUID } from 'node:crypto';
|
||||
import { describe, it, expect, beforeAll, afterAll, beforeEach } from 'vitest';
|
||||
import { PrismaClient, IiosRouteMode } from '@prisma/client';
|
||||
import { DlqService } from '../outbox/dlq.service';
|
||||
import { resetDb } from '../test-utils/reset-db';
|
||||
import { makeFakePorts } from '@insignia/iios-testkit';
|
||||
import { MessageService, type MessagePrincipal } from '../messaging/message.service';
|
||||
@@ -159,7 +160,7 @@ describe('RouteService approve/deny → execute (P6)', () => {
|
||||
|
||||
describe('RouteProjector — AUTOMATIC forwarding (P6)', () => {
|
||||
const routeSvc = () => new RouteService(asService, new RouteSimulator(asService, new RuleEngine()), new OutboundService(asService, new CapabilityBroker(makeFakePorts(), new CapabilityProviderRegistry())), actors);
|
||||
const projector = () => new RouteProjector(asService, new OutboxBus(), routeSvc());
|
||||
const projector = () => new RouteProjector(asService, new OutboxBus(), new DlqService(asService), routeSvc());
|
||||
|
||||
// Ingest an inbound (channel-bearing) interaction — routable, unlike native DMs.
|
||||
async function ingestInbound(text: string): Promise<{ interactionId: string; scopeId: string; event: CloudEvent }> {
|
||||
|
||||
Reference in New Issue
Block a user