import { AsyncLocalStorage } from "async_hooks" export namespace Context { export class NotFound extends Error { constructor(public override readonly name: string) { super(`No context found for ${name}`) } } export function create(name: string) { const storage = new AsyncLocalStorage() return { use() { const result = storage.getStore() if (!result) { throw new NotFound(name) } return result }, provide(value: T, fn: () => R) { return storage.run(value, fn) }, } } }