UNPKG

rwsdk

Version:

Build fast, server-driven webapps on Cloudflare with SSR, RSC, and realtime

42 lines (41 loc) 1.39 kB
import { AsyncLocalStorage } from "async_hooks"; const requestInfoDeferred = Promise.withResolvers(); const requestInfoStore = new AsyncLocalStorage(); const requestInfoBase = {}; const REQUEST_INFO_KEYS = ["request", "params", "ctx", "headers", "rw", "cf", "response"]; REQUEST_INFO_KEYS.forEach((key) => { Object.defineProperty(requestInfoBase, key, { enumerable: true, configurable: false, get: function () { const store = requestInfoStore.getStore(); return store ? store[key] : undefined; }, }); }); export const requestInfo = Object.freeze(requestInfoBase); export function getRequestInfo() { const store = requestInfoStore.getStore(); if (!store) { throw new Error("Request context not found"); } return store; } export function waitForRequestInfo() { return requestInfoDeferred.promise; } export function runWithRequestInfo(nextRequestInfo, fn) { const runWithRequestInfoFn = () => { requestInfoDeferred.resolve(nextRequestInfo); return fn(); }; return requestInfoStore.run(nextRequestInfo, runWithRequestInfoFn); } export function runWithRequestInfoOverrides(overrides, fn) { const requestInfo = requestInfoStore.getStore(); const newRequestInfo = { ...requestInfo, ...overrides, }; return runWithRequestInfo(newRequestInfo, fn); }