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.

Administration

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.

Sending

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.