{"_id":"@aragaoi/context-storage","_rev":"5-eb94c81aae61c0919ed877681e7ffe21","name":"@aragaoi/context-storage","dist-tags":{"latest":"1.2.2"},"versions":{"1.0.0":{"name":"@aragaoi/context-storage","version":"1.0.0","keywords":["async-local-storage","context","typescript","nodejs"],"author":{"name":"aragaoi"},"license":"MIT","_id":"@aragaoi/context-storage@1.0.0","maintainers":[{"name":"aragaoi","email":"irenio.limaj@gmail.com"}],"homepage":"https://github.com/aragaoi/context-storage#readme","bugs":{"url":"https://github.com/aragaoi/context-storage/issues"},"dist":{"shasum":"8109ae2c33ff4df59ac6a6e29c13e90d1696cebd","tarball":"https://registry.npmjs.org/@aragaoi/context-storage/-/context-storage-1.0.0.tgz","fileCount":27,"integrity":"sha512-HAx2z/rqV1ySna9q1M8xYf3rK1qxl8bN0EiarjUO1Pd9QjNWEMb59QyAyEr+tsKb5cHnpJgI3x3xfMUM3o1Ykg==","signatures":[{"sig":"MEUCIQDJ3rn1fko4K7G8XdcFmxTHLK03pIkeWvQdA4VRlpzeoAIgOb4/l7Op36kszOy2kexshxKlwV9dnxX3S2/dUOprvTk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36700},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"d11dc737b67a95ff5e569c7aa3e43210fbf3cf73","scripts":{"dev":"tsc --watch","test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"aragaoi","email":"irenio.limaj@gmail.com"},"repository":{"url":"git+https://github.com/aragaoi/context-storage.git","type":"git"},"_npmVersion":"10.8.2","description":"Generic AsyncLocalStorage wrapper for context management","directories":{},"_nodeVersion":"20.19.4","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.5","ts-jest":"^29.4.1","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.3.0"},"peerDependencies":{"node":">=16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/context-storage_1.0.0_1756158706308_0.6604162259258088","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@aragaoi/context-storage","version":"1.0.1","keywords":["async-local-storage","context","typescript","nodejs"],"author":{"name":"aragaoi"},"license":"MIT","_id":"@aragaoi/context-storage@1.0.1","maintainers":[{"name":"aragaoi","email":"irenio.limaj@gmail.com"}],"homepage":"https://github.com/aragaoi/context-storage#readme","bugs":{"url":"https://github.com/aragaoi/context-storage/issues"},"dist":{"shasum":"ade6c5daa89f11ca2d95639f5fae1496c997128f","tarball":"https://registry.npmjs.org/@aragaoi/context-storage/-/context-storage-1.0.1.tgz","fileCount":27,"integrity":"sha512-SemoRy8GqlxextQXWK9z+/YXvulYugBerpNMDnLosPbEpt9vVWkNJJT8Bfm38Sq3/xZOjuHIu186HAxgvQS5jQ==","signatures":[{"sig":"MEUCIG1fSbzji+gU88I1gpUUgB9qGgpHqm7Hk2OZ+PsoW9uxAiEArrsU7z9J+bK71ePl1KFgO87jVnfWQBIsV9A4rdg2Odw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":36700},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"93e0b438186fa484900a63416114334e70f3b620","scripts":{"dev":"tsc --watch","test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"aragaoi","email":"irenio.limaj@gmail.com"},"repository":{"url":"git+https://github.com/aragaoi/context-storage.git","type":"git"},"_npmVersion":"10.8.2","description":"Generic AsyncLocalStorage wrapper for context management","directories":{},"_nodeVersion":"20.19.4","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.5","ts-jest":"^29.4.1","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.3.0"},"peerDependencies":{"node":">=16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/context-storage_1.0.1_1756159335539_0.6176217987069794","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@aragaoi/context-storage","version":"1.0.2","keywords":["async-local-storage","context","typescript","nodejs"],"author":{"name":"aragaoi"},"license":"MIT","_id":"@aragaoi/context-storage@1.0.2","maintainers":[{"name":"aragaoi","email":"irenio.limaj@gmail.com"}],"homepage":"https://github.com/aragaoi/context-storage#readme","bugs":{"url":"https://github.com/aragaoi/context-storage/issues"},"dist":{"shasum":"8c841bfa6c57299d4ecf20116386caa99925ee9f","tarball":"https://registry.npmjs.org/@aragaoi/context-storage/-/context-storage-1.0.2.tgz","fileCount":27,"integrity":"sha512-C0DymtDZfPSxtMuE3dedeXedEr8Ysr7VJ+z/vOGfM4K0zEo1V/bHJmes0RryImfwntdapXxZSpn2fsBZUlEwbA==","signatures":[{"sig":"MEUCIHG8FhRkRKJvRloyX4BFaWSYHK0qDXVIzYumP8R+dyfzAiEA12xZ4hZ4VnGXBiCsoqToZSmtcoHID+ecyZGK8u+mfY0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":37037},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","module":"dist/index.js","gitHead":"c0eecd3b61d246bf784c3e50d0e36217f46d11ab","scripts":{"dev":"tsc --watch","test":"jest","build":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"aragaoi","email":"irenio.limaj@gmail.com"},"repository":{"url":"git+https://github.com/aragaoi/context-storage.git","type":"git"},"_npmVersion":"10.8.2","description":"Generic AsyncLocalStorage wrapper for context management","directories":{},"_nodeVersion":"20.19.4","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.5","ts-jest":"^29.4.1","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.3.0"},"peerDependencies":{"node":">=16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/context-storage_1.0.2_1756161136534_0.9434423730095312","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@aragaoi/context-storage","version":"1.2.0","keywords":["async-local-storage","context","typescript","nodejs"],"author":{"name":"aragaoi"},"license":"MIT","_id":"@aragaoi/context-storage@1.2.0","maintainers":[{"name":"aragaoi","email":"irenio.limaj@gmail.com"}],"homepage":"https://github.com/aragaoi/context-storage#readme","bugs":{"url":"https://github.com/aragaoi/context-storage/issues"},"dist":{"shasum":"5bfd8fb73e7e517eac89727b8e5fecec5ac4e17d","tarball":"https://registry.npmjs.org/@aragaoi/context-storage/-/context-storage-1.2.0.tgz","fileCount":51,"integrity":"sha512-W0y7FonosDYV/Vm6SfQWoa/bXbqfLxr3FP+9zHt29qItVeHrfKNuBsmgqt1np+854JtRYOZVhOLcmseyqz5NsQ==","signatures":[{"sig":"MEYCIQD7BEjziVgDkme+O6GvSADpXYWtpSgugRLOXGJGA/GWewIhAOlxUsy/yRqvhBecHwFxnDNjt2ywwzb3RRv37BRNck+X","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":71192},"main":"./dist-cjs/index.js","type":"module","types":"dist/index.d.ts","module":"./dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist-cjs/index.js"}},"gitHead":"ea71538c7a7b1c9160a73f1b167018246edf864d","scripts":{"dev":"tsc --watch","test":"jest","build":"npm run build:esm && npm run build:cjs","build:cjs":"tsc -p tsconfig.cjs.json","build:esm":"tsc","prepublishOnly":"npm run build"},"_npmUser":{"name":"aragaoi","email":"irenio.limaj@gmail.com"},"repository":{"url":"git+https://github.com/aragaoi/context-storage.git","type":"git"},"_npmVersion":"10.8.2","description":"Generic AsyncLocalStorage wrapper for context management","directories":{},"_nodeVersion":"20.19.4","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.0.5","ts-jest":"^29.4.1","typescript":"^5.9.2","@types/jest":"^30.0.0","@types/node":"^24.3.0"},"peerDependencies":{"node":">=16.0.0"},"_npmOperationalInternal":{"tmp":"tmp/context-storage_1.2.0_1756256528004_0.5615664076666165","host":"s3://npm-registry-packages-npm-production"}},"1.2.2":{"name":"@aragaoi/context-storage","version":"1.2.2","description":"Generic AsyncLocalStorage wrapper for context management","main":"./dist-cjs/index.js","module":"./dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.js","require":"./dist-cjs/index.js","types":"./dist/index.d.ts"}},"scripts":{"build":"npm run build:esm && npm run build:cjs","build:esm":"tsc","build:cjs":"tsc -p tsconfig.cjs.json && node scripts/postbuild-cjs.cjs","dev":"tsc --watch","test":"jest","prepublishOnly":"npm run build"},"publishConfig":{"access":"public"},"keywords":["async-local-storage","context","typescript","nodejs"],"author":{"name":"aragaoi"},"license":"MIT","devDependencies":{"@types/jest":"^30.0.0","@types/node":"^24.3.0","jest":"^30.0.5","ts-jest":"^29.4.1","typescript":"^5.9.2"},"peerDependencies":{"node":">=16.0.0"},"repository":{"type":"git","url":"git+https://github.com/aragaoi/context-storage.git"},"_id":"@aragaoi/context-storage@1.2.2","gitHead":"e9f9f3202c8d8f6bfeab2bfb0ae4463dc4f8e7a0","bugs":{"url":"https://github.com/aragaoi/context-storage/issues"},"homepage":"https://github.com/aragaoi/context-storage#readme","_nodeVersion":"20.19.4","_npmVersion":"10.8.2","dist":{"integrity":"sha512-DzqeIrCKS961awM7jJ69Q8PwY6RRqE7cdxHezLjQH4A/5riJglnG3Q/5HG5GwijcRJG8JI8mPNHRaerMrg8Imw==","shasum":"21009487ae405a07b6b13d4c1bac5d7aa37102f2","tarball":"https://registry.npmjs.org/@aragaoi/context-storage/-/context-storage-1.2.2.tgz","fileCount":52,"unpackedSize":71251,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAI1vXRYMZIsnhf5Vx3UUhkkelIJs2SQOIUryRPCtz4+AiEAv3pfFleQrHlRc83S1G+Cae4vgTSm8y+3o/Q4y+feoQQ="}]},"_npmUser":{"name":"aragaoi","email":"aragaoi@aragaoi.dev"},"directories":{},"maintainers":[{"name":"aragaoi","email":"aragaoi@aragaoi.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/context-storage_1.2.2_1756843563357_0.29621209866329745"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-25T21:51:46.182Z","modified":"2025-09-02T20:06:03.765Z","1.0.0":"2025-08-25T21:51:46.478Z","1.0.1":"2025-08-25T22:02:15.711Z","1.0.2":"2025-08-25T22:32:16.745Z","1.2.0":"2025-08-27T01:02:08.252Z","1.2.2":"2025-09-02T20:06:03.565Z"},"bugs":{"url":"https://github.com/aragaoi/context-storage/issues"},"author":{"name":"aragaoi"},"license":"MIT","homepage":"https://github.com/aragaoi/context-storage#readme","keywords":["async-local-storage","context","typescript","nodejs"],"repository":{"type":"git","url":"git+https://github.com/aragaoi/context-storage.git"},"description":"Generic AsyncLocalStorage wrapper for context management","maintainers":[{"name":"aragaoi","email":"aragaoi@aragaoi.dev"}],"readme":"# @aragaoi/context-storage\n\n[![Coverage](https://img.shields.io/badge/coverage-100%25-brightgreen.svg)](https://github.com/seachegue/context-storage) [![Version](https://img.shields.io/npm/v/@aragaoi/context-storage.svg)](https://www.npmjs.com/package/@aragaoi/context-storage)\n\n> **Documentation**: This package is a wrapper around Node.js [AsyncLocalStorage](https://nodejs.org/download/release/v18.17.1/docs/api/async_context.html). For a detailed explanation of how AsyncLocalStorage works, see our [AsyncLocalStorage Guide](./ASYNC_STORAGE_GUIDE.md).\n- 🔒 **Type-safe**: Full TypeScript support with generics\n- 🚀 **Zero dependencies**: Only uses Node.js built-ins\n- 🧹 **Automatic cleanup**: Context is automatically cleaned up after async operations\n- 🎯 **Simple API**: Easy to use with minimal boilerplate\n- 🔄 **Async support**: Works seamlessly with async/await\n\n## Installation\n\n```bash\nnpm install context-storage\n```\n\n## Quick Start\n\n### Basic Usage\n\n```typescript\nimport { ContextStorage } from \"context-storage\";\n\n// Create a context storage for user data\nconst userContext = new ContextStorage(() => ({\n  userId: \"\",\n  role: \"guest\"\n}));\n\n// Use context in your application\nuserContext.runWithContext(() => {\n  // Set user data\n  userContext.updateContext({ userId: \"user-123\", role: \"admin\" });\n  \n  // Access context anywhere in this scope\n  const user = userContext.getContext();\n  console.log(user); // { userId: \"user-123\", role: \"admin\" }\n});\n```\n\n### Request Context (Pre-configured)\n\n```typescript\nimport { requestContextStorage } from \"context-storage\";\n\n// Use the pre-configured request context\nrequestContextStorage.runWithContext(() => {\n  // Add user info to context\n  requestContextStorage.updateContext({\n    userId: \"user-123\",\n    tenantId: \"tenant-456\"\n  });\n  \n  // Access request context anywhere\n  const context = requestContextStorage.getContext();\n  console.log(context.requestId); // Unique request ID\n  console.log(context.userId); // \"user-123\"\n});\n```\n\n## API Reference\n\n### ContextStorage<T>\n\n#### Constructor\n```typescript\nnew ContextStorage<T>(contextFactory: () => T, contextName?: string)\n```\n\n#### Methods\n\n- `runWithContext<T>(callback: () => T): T` - Run code within a context\n- `getContext(): T | null` - Get current context (nullable)\n- `getContextOrThrow(): T` - Get current context (throws if missing)\n- `updateContext(partial: Partial<T>): void` - Update current context\n\n### RequestContext\n\nPre-configured context type for HTTP requests:\n\n```typescript\ntype RequestContext = {\n  requestId: string;\n  userId?: string;\n  tenantId?: string;\n  startedAt: string;\n  startedAtTimestamp: number;\n  token?: string;\n};\n```\n\n## Examples\n\n### Express.js Middleware\n\n```typescript\nimport { requestContextStorage } from \"context-storage\";\n\napp.use((req, res, next) => {\n  requestContextStorage.runWithContext(() => {\n    // Add request data to context\n    requestContextStorage.updateContext({\n      userId: req.user?.id,\n      token: req.headers.authorization\n    });\n    \n    next();\n  });\n});\n\n// In your route handlers\napp.get(\"/api/data\", (req, res) => {\n  const context = requestContextStorage.getContextOrThrow();\n  console.log(`Request ${context.requestId} from user ${context.userId}`);\n  // ... handle request\n});\n```\n\n### Database Operations\n\n```typescript\nimport { ContextStorage } from \"context-storage\";\n\nconst dbContext = new ContextStorage(() => ({\n  transactionId: \"\",\n  userId: \"\"\n}));\n\nasync function createUser(userData: any) {\n  return dbContext.runWithContext(async () => {\n    dbContext.updateContext({\n      transactionId: generateId(),\n      userId: userData.id\n    });\n    \n    // All database operations have access to context\n    await db.beginTransaction();\n    await db.insertUser(userData);\n    await db.logActivity(\"user_created\");\n    await db.commit();\n  });\n}\n```\n\n## Requirements\n\n- Node.js 16.0.0 or higher\n- TypeScript (recommended)\n\n## License\n\nMIT\n","readmeFilename":"README.md"}