{"version":3,"file":"node.mjs","names":[],"sources":["../src/adapters/node/errors.ts","../src/adapters/node/server.ts"],"sourcesContent":["import { DiError } from \"../../core/error\";\n\n/**\n * Error thrown when reading a Node async request container outside its scope.\n */\nexport class NodeRequestScopeError extends DiError {\n\tconstructor() {\n\t\tsuper(\n\t\t\t\"di-craft/node getRequestContainer() was called outside runWithRequestContainer().\",\n\t\t);\n\n\t\tthis.name = \"NodeRequestScopeError\";\n\t}\n}\n","/**\n * Node.js AsyncLocalStorage adapter for explicit async request scopes.\n *\n * @module\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport type { Container } from \"../../core/container\";\nimport { createChildContainer, createContainer } from \"../../core/container\";\nimport type { Provider } from \"../../core/provider\";\nimport { NodeRequestScopeError } from \"./errors\";\nimport type {\n\tCreateNodeDiOptions,\n\tNodeDiAdapter,\n\tRunWithRequestContainerOptions,\n} from \"./types\";\n\nexport { NodeRequestScopeError } from \"./errors\";\nexport type {\n\tCreateNodeDiOptions,\n\tNodeDiAdapter,\n\tRunWithRequestContainerOptions,\n} from \"./types\";\n\n/**\n * Creates a Node.js adapter backed by `AsyncLocalStorage`.\n *\n * Use this for explicit async scopes such as route handlers, server actions,\n * jobs, and plain server code. React Server Components should keep using the\n * Next adapter with React's `cache` primitive.\n *\n * Await all async work that reads the request container before the callback\n * passed to `runWithRequestContainer` settles. The request container is disposed\n * immediately after that callback settles.\n */\nexport const createNodeDi = ({\n\tproviders: rootProviders = [],\n\trequestProviders,\n}: CreateNodeDiOptions = {}): NodeDiAdapter => {\n\tconst storage = new AsyncLocalStorage<Container>();\n\tconst rootContainer = createContainer(rootProviders);\n\tconst createRequestContainer = (\n\t\textraProviders: readonly Provider[] = [],\n\t): Container =>\n\t\tcreateChildContainer(rootContainer, [\n\t\t\t...(requestProviders?.() ?? []),\n\t\t\t...extraProviders,\n\t\t]);\n\n\tconst getRootContainer = (): Container => rootContainer;\n\n\tconst getRequestContainer = (): Container => {\n\t\tconst container = storage.getStore();\n\t\tconst isMissingRequestContainer = container === undefined;\n\n\t\tif (isMissingRequestContainer) {\n\t\t\tthrow new NodeRequestScopeError();\n\t\t}\n\n\t\treturn container;\n\t};\n\n\tconst runWithRequestContainer = async <TResult>({\n\t\tproviders: extraProviders = [],\n\t\trun,\n\t}: RunWithRequestContainerOptions<TResult>): Promise<Awaited<TResult>> => {\n\t\tconst container = createRequestContainer(extraProviders);\n\n\t\treturn await storage.run(container, async () => {\n\t\t\ttry {\n\t\t\t\treturn await run(container);\n\t\t\t} finally {\n\t\t\t\tawait container.dispose();\n\t\t\t}\n\t\t});\n\t};\n\n\tconst disposeRootContainer = (): Promise<void> => rootContainer.dispose();\n\n\treturn {\n\t\tgetRootContainer,\n\t\tgetRequestContainer,\n\t\tcreateRequestContainer,\n\t\trunWithRequestContainer,\n\t\tdisposeRootContainer,\n\t};\n};\n"],"mappings":";;;;;;;AAKA,IAAa,wBAAb,cAA2C,QAAQ;CAClD,cAAc;EACb,MACC,mFACD;EAEA,KAAK,OAAO;CACb;AACD;;;;;;;;;;;;;;;;;;;;ACsBA,MAAa,gBAAgB,EAC5B,WAAW,gBAAgB,CAAC,GAC5B,qBACwB,CAAC,MAAqB;CAC9C,MAAM,UAAU,IAAI,kBAA6B;CACjD,MAAM,gBAAgB,gBAAgB,aAAa;CACnD,MAAM,0BACL,iBAAsC,CAAC,MAEvC,qBAAqB,eAAe,CACnC,GAAI,mBAAmB,KAAK,CAAC,GAC7B,GAAG,cACJ,CAAC;CAEF,MAAM,yBAAoC;CAE1C,MAAM,4BAAuC;EAC5C,MAAM,YAAY,QAAQ,SAAS;EAGnC,IAFkC,cAAc,QAG/C,MAAM,IAAI,sBAAsB;EAGjC,OAAO;CACR;CAEA,MAAM,0BAA0B,OAAgB,EAC/C,WAAW,iBAAiB,CAAC,GAC7B,UACyE;EACzE,MAAM,YAAY,uBAAuB,cAAc;EAEvD,OAAO,MAAM,QAAQ,IAAI,WAAW,YAAY;GAC/C,IAAI;IACH,OAAO,MAAM,IAAI,SAAS;GAC3B,UAAU;IACT,MAAM,UAAU,QAAQ;GACzB;EACD,CAAC;CACF;CAEA,MAAM,6BAA4C,cAAc,QAAQ;CAExE,OAAO;EACN;EACA;EACA;EACA;EACA;CACD;AACD"}