local-context.ts 568 B

12345678910111213141516171819202122232425
  1. import { AsyncLocalStorage } from "async_hooks"
  2. export class NotFound extends Error {
  3. constructor(public override readonly name: string) {
  4. super(`No context found for ${name}`)
  5. }
  6. }
  7. export function create<T>(name: string) {
  8. const storage = new AsyncLocalStorage<T>()
  9. return {
  10. use() {
  11. const result = storage.getStore()
  12. if (!result) {
  13. throw new NotFound(name)
  14. }
  15. return result
  16. },
  17. provide<R>(value: T, fn: () => R) {
  18. return storage.run(value, fn)
  19. },
  20. }
  21. }
  22. export * as LocalContext from "./local-context"