Architecture
A modular NestJS monolith, a separate worker
A React SPA consumes a NestJS REST API; only the dedicated modules talk to the gateway. Asynchronous work — campaigns, dispatch, delivery receipts — is handled by a worker process attached to RabbitMQ.
Jasmin integration
Two paths to the gateway, both wrapped
Users see neither telnet nor HTTP: they work with screens, the platform translates.
jcli over telnet (port 8990)
Connectors, routes, filters, interceptors and jcli users are driven through Jasmin’s administration protocol — wrapped so the user never sees it.
HTTP API (POST /secure/send)
Sends go through Jasmin’s HTTP API. The platform does not implement SMPP itself: it orchestrates the engine.
Overview
The flow, from screen to engine
Every request passes through the guards before reaching the services; only the Jasmin module and the gateway module open a channel to the gateway.
React / Vite SPA
Interface — shadcn/ui, Zustand, Tailwind
NestJS API
JWT + RBAC + PLAN guards → domain services
Jasmin module · RabbitMQ · Workers
telnet + jcli parser · DLX/DLQ queues · separate process
Jasmin Gateway · MongoDB
SMS engine · single database + jasmin_state cache
The jcli parser is the known fragility. It is built with TDD and requires 100% coverage: a command is never sent to the gateway without being validated, and a failed validation leaves the gateway unchanged.