Multijet
Un framework per monorepo a microservizi in TypeScript, dove il contratto OpenAPI genera i tipi e il compilatore garantisce che nessuno lo violi.
Multijet è un framework opinionated per costruire monorepo a microservizi in TypeScript. La struttura è semplice e volutamente rigida: ogni microservizio è un progetto Node.js indipendente basato su Fastify, e ogni pacchetto condiviso vive in libs/ come progetto a sé, importabile da un microservizio o da un'altra lib.
Il punto centrale del progetto, però, non è la struttura. È il fatto che la type safety attraversi l'intero sistema, senza interruzioni e senza dover essere mantenuta a mano.
Il problema dei contratti tra servizi
In un'architettura a microservizi il confine tra due componenti è il punto più fragile del sistema. Il servizio A chiama il servizio B: da qualche parte esiste un'idea condivisa di come sia fatta quella richiesta e quella risposta, ma il linguaggio non la conosce. Esiste in un documento, in un file di tipi copiato a mano, o nella testa di chi ha scritto entrambe le parti.
Quando quel contratto cambia (un campo rinominato, un tipo che diventa opzionale, un enum con un valore in più) nulla si accorge della rottura. Il codice compila, i test passano se non coprono quel percorso, e l'errore arriva a runtime, in un ambiente diverso da quello di chi ha fatto la modifica. Più servizi ci sono, più questo scenario diventa frequente e più diventa costoso da diagnosticare.
OpenAPI come unica fonte di verità
In Multijet il contratto non è documentazione: è il sorgente da cui tutto il resto viene generato.
Ogni microservizio parte dalla propria specifica OpenAPI. Da lì vengono generati i tipi delle richieste e delle risposte, le firme degli handler e i client che gli altri servizi useranno per chiamarlo. Il risultato è una catena di tipi continua: dallo schema alla route, dalla route all'handler, dall'handler al client, dal client al chiamante.
La conseguenza pratica è che rompere un contratto diventa impossibile in silenzio. Se una risposta cambia forma, il servizio che la consuma smette di compilare: immediatamente, sulla macchina di chi ha fatto la modifica, non in staging tre giorni dopo. L'errore che era il più difficile da trovare diventa il più facile: lo segnala l'editor mentre si scrive.
Ne deriva anche che la documentazione API non può divergere dal codice, perché è il codice a derivare da lei. E che aggiungere un endpoint significa descriverlo una volta sola, invece di scriverlo, tipizzarlo, documentarlo e replicarlo nel client.
Build veloci
Un monorepo con molti servizi diventa rapidamente lento da costruire, e a quel punto la struttura modulare inizia a costare invece di rendere. Multijet usa turborepo per la cache e l'orchestrazione dei task ed esbuild per il bundling: ogni microservizio viene compilato in un singolo file, dipendenze incluse, nell'ordine dei millisecondi.
Il bundle singolo semplifica anche il deploy, che di default supporta sia AWS Lambda sia Docker, senza modifiche al codice applicativo.
Cosa include
Una CLI per generare e gestire servizi e librerie, moduli opzionali attivabili per singolo servizio, configurazione centralizzata, e pipeline Jenkins e integrazione SonarCloud disponibili come opzione.