UNPKG

@dalet-oss/express-http-context

Version:

Modern request-scoped storage support for Express.js based on Asynchronous Local Storage.

69 lines (51 loc) 1.66 kB
import { AsyncLocalStorage } from 'async_hooks'; import type { NextFunction, Request, Response } from 'express'; declare global { // eslint-disable-next-line no-var var expressHttpContextStorage: AsyncLocalStorage<Map<string, any>>; } if (!global.expressHttpContextStorage) { global.expressHttpContextStorage = new AsyncLocalStorage<Map<string, any>>(); } /** * Express.js middleware that is responsible for initializing the context for * each request. * * Declared as type 'any' because otherwise Typescript consumers can get tie * themselves in knots. */ export const middleware: any = ( _req: Request, _res: Response, next: NextFunction ): void => { global.expressHttpContextStorage.run(new Map(), () => next()); } /** * Gets a value from the context by key. * * Will return undefined if the context has not yet been initialized for this * request, or if a value is not found for the specified key. */ export function get<T = any>(key: string): T | undefined { const store = global.expressHttpContextStorage.getStore(); return store?.get(key); } /** * Adds a value to the context by key. * * If the key already exists, its value will be overwritten. * No value will be persisted if the context has not yet been initialized. * * Returns the value that was set, or undefined if the context has not yet been * initialized for this request. */ export function set<T = any>(key: string, value: T): T | undefined { const store = global.expressHttpContextStorage.getStore(); if (store) { store.set(key, value); return value; } return undefined; } export default { get, middleware, set }