@rollercoaster-dev/rd-logger
Version:
A neurodivergent-friendly logger for Rollercoaster.dev projects
47 lines (46 loc) • 1.66 kB
JavaScript
import { AsyncLocalStorage } from 'async_hooks';
import { randomUUID } from 'crypto';
// Create an AsyncLocalStorage instance to hold the context for each request
const requestContext = new AsyncLocalStorage();
/**
* Runs a function within an asynchronous request context.
* Creates a new context with a unique request ID and start time.
*
* @param fn The function to execute within the context.
* @param existingRequestId Optional request ID from headers (e.g., 'x-request-id')
* @returns The return value of the executed function.
*/
export function runWithRequestContext(fn, existingRequestId) {
const store = {
requestId: existingRequestId || randomUUID(),
requestStartTime: Date.now(),
};
return requestContext.run(store, fn);
}
/**
* Gets the current request context store.
* Returns undefined if called outside a context created by runWithRequestContext.
*
* @returns The current request store or undefined.
*/
export function getRequestStore() {
return requestContext.getStore();
}
/**
* Gets the current request ID.
*
* @returns The current request ID or 'unknown' if not in a request context.
*/
export function getCurrentRequestId() {
var _a;
return ((_a = getRequestStore()) === null || _a === void 0 ? void 0 : _a.requestId) || 'unknown';
}
/**
* Gets the start time of the current request.
*
* @returns The request start timestamp (milliseconds since epoch) or the current time if not in a request context.
*/
export function getCurrentRequestStartTime() {
var _a;
return ((_a = getRequestStore()) === null || _a === void 0 ? void 0 : _a.requestStartTime) || Date.now();
}