Μετάβαση στο περιεχόμενο

@cqrs-ddd/pipeline-tenant

Διατηρεί το τρέχον tenant μιας εκτέλεσης στο AsyncLocalStorage. Η συνάρτηση runWithTenant(id, fn) το ορίζει για οτιδήποτε καλείται από τη fn, σύγχρονα ή ασύγχρονα. Το currentTenantId() το διαβάζει, και το tenantSource το παραδίδει στο pipeline, ώστε κάθε pipeline να εκτελείται στο tenant της εργασίας που το ξεκίνησε. Το πακέτο δεν έχει εξωτερικές εξαρτήσεις.

Terminal window
pnpm add @cqrs-ddd/pipeline-tenant
import { createPipeline } from '@cqrs-ddd/pipeline';
import { currentTenantId, runWithTenant, tenantSource } from '@cqrs-ddd/pipeline-tenant';
const pipeline = createPipeline({ sources: { tenantId: tenantSource } });
const listOrders = pipeline.wrap({ name: 'listOrders', kind: 'query' })(async () =>
orders.findByTenant(currentTenantId()),
);
await runWithTenant('acme', () => listOrders());

Ένα HTTP middleware ή queue consumer ορίζει το tenant στην είσοδο (edge):

app.use((req, res, next) => runWithTenant(req.auth.tenantId, next));
  • Το runWithTenant(tenantId, fn) επιστρέφει ό,τι επιστρέφει η fn. Μια ένθετη κλήση αντικαθιστά το tenant μόνο για το δικό της callback. Με undefined εκτελεί τη fn χωρίς tenant.
  • Το currentTenantId() επιστρέφει το tenant της πιο εσωτερικής κλήσης runWithTenant ή του εκτελούμενου pipeline, ή undefined εκτός αυτών.
  • Μέσα σε ένα pipeline, το context.tenantId είναι το tenant που έλαβε η εκτέλεση από την πηγή κατά την έναρξή της.

Τα behaviors cache, idempotency και rate-limit οργανώνουν τα κλειδιά τους με βάση αυτό το tenant και αποτυγχάνουν με ασφάλεια (fail closed) όταν απαιτείται tenant αλλά δεν υπάρχει. Δείτε Το pipeline context.

API reference