Salta ai contenuti

Panoramica dell'Architettura

Rebase è una piattaforma full-stack con quattro livelli:

┌─────────────────────────────────────────────────────────────────┐
│ Frontend Layer │
│ React Admin UI • Custom Views • Plugins • Your App │
│ @rebasepro/core • @rebasepro/ui • @rebasepro/studio │
└───────────────────────────┬─────────────────────────────────────┘
│ HTTP + WebSocket
┌─────────────────────────────────────────────────────────────────┐
│ Backend Layer │
│ Hono HTTP Server • REST API • Auth • Storage • WS │
│ @rebasepro/server-core │
└───────────────────────────┬─────────────────────────────────────┘
│ Drizzle ORM
┌─────────────────────────────────────────────────────────────────┐
│ Database Layer │
│ PostgreSQL • Tables • RLS Policies • Realtime sync │
└─────────────────────────────────────────────────────────────────┘

Il backend si inizializza tramite un sistema di bootstrapper basato su plugin. La logica specifica del database è disaccoppiata in un proprio pacchetto, e i bootstrappers gestiscono l’inizializzazione del database, dell’autenticazione e dei servizi interni.

import { createPostgresAdapter } from "@rebasepro/server-postgresql";
database: createPostgresAdapter({
connectionString: process.env.DATABASE_URL!
})

Le collezioni si risolvono automaticamente rispetto al bootstrapper configurato tramite il registro interno di iniezione delle dipendenze.

Il BackendCollectionRegistry è l’indice runtime di tutte le collezioni, le loro tabelle PostgreSQL, gli enum e le relazioni Drizzle. Viene popolato all’avvio dalle tue definizioni di collezione.

La sincronizzazione in tempo reale utilizza il meccanismo nativo LISTEN/NOTIFY di PostgreSQL:

  1. Avviene una mutazione dei dati (inserimento, aggiornamento, eliminazione)
  2. Il backend emette un NOTIFY su un canale
  3. Il RealtimeService riceve la notifica
  4. Trasmette la modifica a tutti i client WebSocket connessi
  5. I componenti React si ri-renderizzano con i nuovi dati

Per deployments multi-istanza (ad esempio, Cloud Run con più repliche), fornisci una connectionString nel tuo PostgresBootstrapper in modo che tutte le repliche condividano la stessa connessione LISTEN.

Come i driver, i backend di storage sono registrati in un registro. Puoi avere più provider di storage (locale, S3) e instradare diversi campi file a diversi backend usando storageId.

PackageRuoloUsato da
@rebasepro/typesInterfacce TypeScript per collezioni, proprietà, entità, pluginTutto
@rebasepro/server-coreInizializzazione del server backend, REST API, autenticazione, storage, WebSocketBackend
@rebasepro/clientSDK client — Trasporto HTTP, WebSocket, autenticazioneFrontend
@rebasepro/coreFramework React — Scaffold, controller, moduli, routing, hookFrontend
@rebasepro/uiLibreria di componenti UI standalone (Tailwind v4 + Radix)Frontend
@rebasepro/authViste di login, hook del controller di autenticazione, gestione utentiFrontend
@rebasepro/studioEditor di collezioni, console SQL, console JS, editor RLS, browser di storageFrontend
@rebasepro/cliCLI per generazione schema, migrazioni DB, generazione SDKStrumenti di sviluppo
@rebasepro/formexGestione dello stato dei form React leggeraFrontend
@rebasepro/data_enhancementPlugin di autocompletamento campi basato su AIFrontend
@rebasepro/data_import_exportImportazione ed esportazione CSV/JSON/ExcelFrontend
@rebasepro/schema_inferenceRilevamento automatico dello schema dai dati del database esistentiBackend/CLI
  1. L’utente apre una collezione nell’interfaccia utente di amministrazione
  2. L’SDK client invia GET /api/data/:slug + apre una sottoscrizione WebSocket
  3. Il backend interroga PostgreSQL tramite Drizzle ORM
  4. Il trasformatore di dati deserializza i record del database nel formato entità
  5. La risposta viene inviata al frontend, i componenti vengono renderizzati
  6. WebSocket mantiene la vista sincronizzata in tempo reale
  1. L’utente modifica un’entità nel form
  2. Vengono eseguiti i callback beforeSave (validazione, trasformazione)
  3. L’SDK client invia PUT /api/data/:slug/:id
  4. Il backend serializza i valori, esegue l’UPDATE di Drizzle
  5. Vengono eseguiti i callback afterSave (effetti collaterali)
  6. La trasmissione NOTIFY attiva l’aggiornamento WebSocket a tutti i client
  7. Se la cronologia è abilitata, viene registrato uno snapshot