@cqrs-ddd/pipeline-tenant
Διατηρεί το τρέχον tenant μιας εκτέλεσης στο AsyncLocalStorage. Η συνάρτηση runWithTenant(id, fn) το ορίζει για οτιδήποτε καλείται από τη fn, σύγχρονα ή ασύγχρονα. Το currentTenantId() το διαβάζει, και το tenantSource το παραδίδει στο pipeline, ώστε κάθε pipeline να εκτελείται στο tenant της εργασίας που το ξεκίνησε. Το πακέτο δεν έχει εξωτερικές εξαρτήσεις.
Εγκατάσταση
Ενότητα με τίτλο «Εγκατάσταση»pnpm add @cqrs-ddd/pipeline-tenantimport { 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));Σημασιολογία (Semantics)
Ενότητα με τίτλο «Σημασιολογία (Semantics)»- Το
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.