API Events
No Kafka.
@platformatic/kafkais declared inpackage.jsonbut there is no producer/consumer wiring insrc/. All eventing is in-process (eventemitter3EventBus) fanning out to BullMQ queues, with real-time fan-out over WebSocket. See ADR-0001.
1. Inbound — Kafka
None. The service consumes no Kafka topics.
2. Outbound — Kafka
None. The service produces no Kafka topics.
3. In-process Events (EventBus)
EventBus(eventemitter3) — emitted byTicketEmitter, handled by listeners insrc/application/events/listeners/. Event types areTicketEventTypes(dotted strings) from@nx/core. Synchronous within the API process; listener failures are caught and logged (never crash the emitter).
| Event type | Emitter method | Listener(s) | Side effects |
|---|---|---|---|
ticket.created | TicketEmitter.ticketCreated | TicketCreatedListener | Increment category/tag counts; enqueue context-enrichment + assignment jobs |
ticket.status_changed | TicketEmitter.ticketChangedStatus | TicketStatusChangedListener | Status side effects (notifications, survey trigger) |
ticket.assigned | TicketEmitter.ticketAssigned | TicketAssignedListener | Assignment notifications |
ticket.message.created | TicketEmitter.ticketMessageCreated | TicketMessageCreatedListener | Reply notifications, SLA first-response marking |
4. Inbound — BullMQ
Queues created by
QueueComponent; consumed by workers insrc/components/workers/(worker process,RUN_MODE=worker). Concurrency fromWORKER_CONFIG.
| Queue | Job name(s) | Producer | Worker → Use-case | Concurrency | Retries |
|---|---|---|---|---|---|
helpdesk.sla-monitor | sla-monitor | Cron (repeatable) + manual trigger | sla-monitor.worker → RunSlaMonitorUseCase | 1 | 2, fixed 60s |
helpdesk.escalation | escalation, escalation-batch | sla-monitor / escalation manager | escalation.worker → ProcessEscalationUseCase | 5 | 3, exp 5s (priority 1) |
helpdesk.assignment | assign | TicketCreatedListener | assignment.worker → AutoAssignTicketUseCase | 5 | 3, exp 5s |
helpdesk.notification | notification, notification-batch, notification-digest | many | notification.worker → ProcessNotificationService | 10 | 5, exp 5s (priority 10) |
helpdesk.context-enrichment | enrich | TicketCreatedListener | context-enrichment.worker → EnrichTicketContextUseCase | 30 | 3, exp 5s |
helpdesk.survey-trigger | survey-trigger | status-changed flow | survey-trigger.worker → TriggerSurveyUseCase | 3 | 3, exp 10s |
A
helpdesk.analytics-updatequeue name (ANALYTICS_UPDATE) exists inQUEUE_NAME, but no worker/queue is wired for it. Failed jobs route toHandleDeadLetterUseCaseviadlq.helper.ts.
5. Outbound — BullMQ
Jobs are enqueued via
JobDispatcherHelper(publish/publishAll) and the typed job builders insrc/shared/helpers/jobs/.
| Job builder | Queue | Trigger |
|---|---|---|
ContextEnrichmentJob.enrich | context-enrichment | Ticket created with context |
AssignmentJob.assign | assignment | Ticket created (strategy LOAD_BALANCED) |
NotificationJob.* | notification | SLA warnings/breaches, assignment, replies, escalation |
EscalationJob.* | escalation | SLA breach by sla-monitor |
SurveyTriggerJob.* | survey-trigger | Ticket resolved/closed |
| SLA monitor cron | sla-monitor | QueueComponent.scheduleSlaMonitoring() (jobId sla-monitor-cron) |
6. WebSocket Emissions
Delivered by
ApplicationWebSocketComponent+socket-event.service.ts. Topics/rooms built from@nx/corehelpers.
| Topic | Room | Trigger |
|---|---|---|
HelpdeskWebSocketTopics.HELP_DESK (observation/helpdesk) | HelpdeskWebSocketRooms.getHelpdeskRooms({ ticketId, messageId }) (helpdesk/:ticketId/:messageId) | New message / status change / assignment / SLA event |
7. Payload Schemas
In-process event payloads are TS interfaces in
src/shared/common/interfaces/(not centralized message contracts, since there is no Kafka). Representative shapes:
// ticket.created — ITicketCreatedEventData
interface ITicketCreatedEventData {
ticketId: string;
merchantId: string;
categoryId: string;
priority: TTicketPriorities;
context?: Record<string, unknown>;
categoryRouting?: unknown;
metadata: { tagIds: string[]; [k: string]: unknown };
}8. Idempotency & Ordering
| Channel | Guarantee | Ordering | Recovery |
|---|---|---|---|
| EventBus | in-process, at-most-once | emit order, synchronous | none — listener errors logged, not retried |
| BullMQ jobs | at-least-once (retries per queue) | per-queue, no global order | retry w/ backoff → DLQ via HandleDeadLetterUseCase; worker idempotency helpers de-dupe |
| SLA cron | exactly-one schedule | n/a | fixed jobId: 'sla-monitor-cron' prevents duplicate repeatables |