@alienfishconsulting/core-context
Version:
Strongly typed, functional AsyncLocalStorage wrapper with context propagation for Node.js and Express apps
149 lines (106 loc) โข 4.03 kB
Markdown
# @alienfishconsulting/core-context
[](https://www.npmjs.com/package/@alienfishconsulting/core-context)
[](./LICENSE)



> Strongly typed, functional AsyncLocalStorage wrapper for managing request-scoped context in Node.js applications.
---
## โจ Features
- ๐ Immutable `RequestContext` model for tracing and auditing
- ๐ง Type-safe accessors for contextual fields (e.g., `requestId`, `userId`)
- ๐ Async context propagation across call stacks
- ๐ฅ Header integration for tracing across services
- ๐งช CI-enforced test coverage with Vitest & Nx
- โ๏ธ Framework-agnostic (no Express dependency)
---
## ๐ฆ Installation
```bash
pnpm add @alienfishconsulting/core-context
```
Requires Node.js โฅ18.
## ๐งฑ Context Model
The RequestContext defines a consistent schema across async boundaries:
```ts
interface RequestContext {
requestId: string;
correlationId: string;
userId?: string;
accountId?: string;
transactionId?: string;
}
```
All fields are immutable and meant to persist across the request lifecycle.
## ๐ Quick Start
```ts
import {
initWithDefaultContext,
getContext,
getContextField,
runWithContext
} from '@alienfishconsulting/core-context';
initWithDefaultContext(() => {
const ctx = getContext();
console.log('Request ID:', ctx?.requestId);
});
```
Or use a custom context:
```ts
const context = {
requestId: 'abc123',
correlationId: 'xyz456',
};
runWithContext(context, () => {
// context is now available inside this function
});
```
## ๐ฅ Working with HTTP Headers
```ts
import { extractContextFromHeaders, updateContextFromHeaders } from '@alienfishconsulting/core-context';
const headers = {
'x-request-id': 'abc123',
'x-user-id': 'user789',
};
updateContextFromHeaders(headers);
// Later...
const userId = getContextField('userId');
```
### ๐ง API Overview
| Function |Description |
|--|--|
| `runWithContext(ctx, fn)` | Runs fn with the given context |
| `initWithDefaultContext(fn)` | Auto-generates requestId/correlationId |
| `getContext(fallback?: boolean)` | Retrieves the current context |
| `assertContext()` | Returns context or throws if missing |
| `bind(fn)` | Returns a function bound to the current context |
| `extractContextFromHeaders(headers)` | Builds a context from header values |
| `updateContextFromHeaders(headers)` | Extracts + applies context to storage |
| `getContextField(key)` | Retrieves a specific field from the context |
## โ
Best Practices
- Always call runWithContext() at the top level of async workflows
- Use bind() when passing callbacks to preserve context
- Avoid mutating context values โ treat them as read-only
- Integrate context extraction in your HTTP layer (e.g., middleware or handlers)
## ๐งช Testing
This package is managed with Nx and uses Vitest for testing.
```bash
pnpm nx test core-context
```
- โ
80% coverage required
- ๐ฏ 100% coverage target
- CI will fail if coverage is insufficient
## ๐ Project Structure
```bash
core-context/
โโโ src/
โ โโโ accessors.ts # Context getters and safety checks
โ โโโ headers.ts # HTTP header integration
โ โโโ lifecycle.ts # runWithContext(), bind(), initWithDefaultContext()
โ โโโ storage.ts # Shared AsyncLocalStorage instance
โ โโโ types.ts # RequestContext schema
```
## ๐งฉ Related Projects
This package is part of the @alienfishconsulting/core monorepo โ a collection of modular, enterprise-grade TypeScript utilities.
# ๐ License
MIT
ยฉ Terry "Lee" Allen, Jr