Runtime del contratto NRPC
NRPC è il livello di chiamate remote tipizzate di Converged. Trasforma un contratto
di servizio TypeScript in client corrispondenti e metadati del servizio, così che
un browser, un microservizio, un workflow o un runtime nativo possano chiamare
la stessa funzionalità senza mantenere definizioni API separate basate su stringhe.
Perché esiste
La piattaforma è composta da moduli distribuiti indipendentemente. Chiamare
direttamente un modulo tramite un indirizzo farebbe dipendere i chiamanti da dove
viene eseguito e dal trasporto utilizzato. NRPC separa queste responsabilità: un
contratto identifica il servizio e i suoi metodi, mentre il runtime recapita una
chiamata al processo che attualmente gestisce la destinazione richiesta.
Questo mantiene l'accordo tra chiamanti e implementazioni in un unico luogo. I
parametri di un metodo, il tipo restituito, il comportamento di streaming e il
livello di accesso sono noti alla generazione del codice e disponibili per ogni
client supportato.
Dal contratto alla chiamata
I contratti sono interfacce TypeScript nella directory . Eseguendomodules/types/<domain> in bun run gen, queste interfacce vengono analizzate e vienecore/tools/nrpc
creato un pacchetto . Il pacchetto contiene i metadatimodules/generated/g-<service>
del contratto, un'interfaccia server e factory di client sicure rispetto ai tipi per
ogni runtime.
TypeScript interface
|
v
NRPC generator -> g-<service> package
| |
| +-> browser client
| +-> cluster client
| +-> workflow RT client
v
service implementation -> messaging backend
Un servizio registra la propria implementazione con . NRPCcreateMessagingBackend
usa i metadati generati per trovare il metodo richiesto, convalida la struttura
della chiamata al confine del client, ripristina i valori tipizzati e invoca il
metodo corrispondente dell'implementazione. Un metodo che restituisce AsyncIterable
viene consegnato come stream; i metodi ordinari producono una sola risposta.
Percorsi di consegna
NRPC conserva lo stesso contratto in diversi ambienti di esecuzione:
- I client browser usano un canale WebSocket condiviso per inviare richieste a Fujin.
- I client di servizio e nativi usano il trasporto del cluster tramite Fujin, indirizzati
a una destinazione di processo logica anziché a un indirizzo host. - I client dei workflow usano l'entry point RT, che effettua la chiamata tramite il
trasporto host QuickJS/Zig e rimane sincrono per una singola valutazione del workflow.
Fujin instrada una richiesta verso la connessione di destinazione. Il processo
ricevente sceglie il servizio e il metodo NRPC dai metadati della richiesta; Fujin
non deve comprendere i servizi di dominio della piattaforma. ècreateHttpBackend
disponibile quando è richiesto un edge HTTP e può registrare la stessa implementazione
del servizio sul runtime di messaggistica, mantenendo allineate le chiamate HTTP e
quelle interne.
Contesto e accesso
Le chiamate trasportano nell'inviluppo dati di correlazione, scadenze e un contesto
attendibile di workspace o ambito. Il servizio ricevente viene eseguito con quel
contesto, consentendo al codice di storage e autorizzazione di usare lo stesso
confine del tenant stabilito all'edge. I servizi non devono ricavare l'identità del
workspace da un payload di business.
Il decoratore dichiara una classe o un metodo come @Access, public ouser. NRPC risolve il livello dichiarato più specifico e applica le regole diinternal
permesso configurate prima di invocare l'implementazione. In questo modo la policy
di accesso diventa parte del confine del servizio anziché una convenzione incoerente
del client.
Confine delle responsabilità
NRPC gestisce i metadati dei contratti, i client tipizzati generati, la serializzazione
dei valori, l'instradamento delle chiamate e gli adattatori di trasporto utilizzati
da tali chiamate. Non gestisce le regole di business, l'individuazione dei servizi,
il posizionamento delle distribuzioni, la persistenza del dominio o l'instradamento
del message bus. Queste responsabilità rimangono rispettivamente al servizio, al
piano di controllo della distribuzione, al livello di storage e a Fujin.