Documentation: This package is a wrapper around Node.js AsyncLocalStorage. For a detailed explanation of how AsyncLocalStorage works, see our AsyncLocalStorage Guide.
- ๐ Type-safe: Full TypeScript support with generics
- ๐ Zero dependencies: Only uses Node.js built-ins
- ๐งน Automatic cleanup: Context is automatically cleaned up after async operations
- ๐ฏ Simple API: Easy to use with minimal boilerplate
- ๐ Async support: Works seamlessly with async/await
npm install context-storage
import { ContextStorage } from "context-storage";
// Create a context storage for user data
const userContext = new ContextStorage(() => ({
userId: "",
role: "guest"
}));
// Use context in your application
userContext.runWithContext(() => {
// Set user data
userContext.updateContext({ userId: "user-123", role: "admin" });
// Access context anywhere in this scope
const user = userContext.getContext();
console.log(user); // { userId: "user-123", role: "admin" }
});
import { requestContextStorage } from "context-storage";
// Use the pre-configured request context
requestContextStorage.runWithContext(() => {
// Add user info to context
requestContextStorage.updateContext({
userId: "user-123",
tenantId: "tenant-456"
});
// Access request context anywhere
const context = requestContextStorage.getContext();
console.log(context.requestId); // Unique request ID
console.log(context.userId); // "user-123"
});
new ContextStorage<T>(contextFactory: () => T, contextName?: string)
runWithContext<T>(callback: () => T): T
- Run code within a contextgetContext(): T | null
- Get current context (nullable)getContextOrThrow(): T
- Get current context (throws if missing)updateContext(partial: Partial<T>): void
- Update current context
Pre-configured context type for HTTP requests:
type RequestContext = {
requestId: string;
userId?: string;
tenantId?: string;
startedAt: string;
startedAtTimestamp: number;
token?: string;
};
import { requestContextStorage } from "context-storage";
app.use((req, res, next) => {
requestContextStorage.runWithContext(() => {
// Add request data to context
requestContextStorage.updateContext({
userId: req.user?.id,
token: req.headers.authorization
});
next();
});
});
// In your route handlers
app.get("/api/data", (req, res) => {
const context = requestContextStorage.getContextOrThrow();
console.log(`Request ${context.requestId} from user ${context.userId}`);
// ... handle request
});
import { ContextStorage } from "context-storage";
const dbContext = new ContextStorage(() => ({
transactionId: "",
userId: ""
}));
async function createUser(userData: any) {
return dbContext.runWithContext(async () => {
dbContext.updateContext({
transactionId: generateId(),
userId: userData.id
});
// All database operations have access to context
await db.beginTransaction();
await db.insertUser(userData);
await db.logActivity("user_created");
await db.commit();
});
}
- Node.js 16.0.0 or higher
- TypeScript (recommended)
MIT