context.ts 467 B

123456789101112131415161718192021
  1. import { AsyncLocalStorage } from "node:async_hooks"
  2. export namespace Context {
  3. export class NotFound extends Error {}
  4. export function create<T>() {
  5. const storage = new AsyncLocalStorage<T>()
  6. return {
  7. use() {
  8. const result = storage.getStore()
  9. if (!result) {
  10. throw new NotFound()
  11. }
  12. return result
  13. },
  14. provide<R>(value: T, fn: () => R) {
  15. return storage.run(value, fn)
  16. },
  17. }
  18. }
  19. }