{"_id":"@async-kit/eventx","name":"@async-kit/eventx","dist-tags":{"latest":"0.2.0"},"versions":{"0.2.0":{"name":"@async-kit/eventx","version":"0.2.0","description":"Typed async event bus with error isolation, concurrency control, middleware, and AbortSignal support for JavaScript/TypeScript","keywords":["async","events","event-bus","typed","pubsub","middleware","emitter"],"license":"MIT","repository":{"type":"git","url":"git+https://github.com/NexaLeaf/async-kit.git","directory":"packages/eventx"},"homepage":"https://github.com/NexaLeaf/async-kit/tree/main/packages/eventx#readme","main":"./dist/index.cjs","module":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}}},"publishConfig":{"access":"public"},"sideEffects":false,"scripts":{"build":"tsup","typecheck":"tsc -p tsconfig.lib.json --noEmit"},"devDependencies":{},"gitHead":"f589ca61f0ee8b4e74e94cb2019745f6b63fc39e","_id":"@async-kit/eventx@0.2.0","bugs":{"url":"https://github.com/NexaLeaf/async-kit/issues"},"_nodeVersion":"24.14.0","_npmVersion":"11.9.0","dist":{"integrity":"sha512-HZ5bhSR0eoiwz/jUV+AzKSXMN+uZZzSXuZxod0XEg/CATD3OC3x/jSPss1FnZEWQpd20QDadpGPtAJ1gjtynjw==","shasum":"8959476aee5d7a23cb26136bfd383fff6f322312","tarball":"https://registry.npmjs.org/@async-kit/eventx/-/eventx-0.2.0.tgz","fileCount":9,"unpackedSize":50283,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@async-kit%2feventx@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDw0riz42J1FYDfMQwfRQhm4KaGmedK3rvJeffI3+4eNQIhAO0IFwiWmkc+wcMqTTWfm7voMnyVfvMOzMTz7ujqBCv+"}]},"_npmUser":{"name":"palanisamym14","email":"palanisamym14@gmail.com"},"directories":{},"maintainers":[{"name":"palanisamym14","email":"palanisamym14@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/eventx_0.2.0_1773298981806_0.9948398814175439"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-12T07:03:01.734Z","0.2.0":"2026-03-12T07:03:02.069Z","modified":"2026-03-12T07:03:02.442Z"},"maintainers":[{"name":"palanisamym14","email":"palanisamym14@gmail.com"}],"description":"Typed async event bus with error isolation, concurrency control, middleware, and AbortSignal support for JavaScript/TypeScript","homepage":"https://github.com/NexaLeaf/async-kit/tree/main/packages/eventx#readme","keywords":["async","events","event-bus","typed","pubsub","middleware","emitter"],"repository":{"type":"git","url":"git+https://github.com/NexaLeaf/async-kit.git","directory":"packages/eventx"},"bugs":{"url":"https://github.com/NexaLeaf/async-kit/issues"},"license":"MIT","readme":"# @async-kit/eventx\n\nTyped publish/subscribe event bus with **middleware**, **concurrency control**, **once subscriptions**, **sequential/parallel emit**, and **AbortSignal** support.\n\n## Install\n\n```bash\nnpm install @async-kit/eventx\n```\n\n## Quick start\n\n```ts\nimport { createBus } from '@async-kit/eventx';\n\ntype AppEvents = {\n  userCreated: { id: number; email: string };\n  orderPaid:   { orderId: string; amount: number };\n};\n\nconst bus = createBus<AppEvents>();\n\nbus.on('userCreated', async ({ id, email }) => {\n  await sendWelcomeEmail(email);\n});\n\nawait bus.emit('userCreated', { id: 1, email: 'hi@example.com' });\n```\n\n## Features\n\n| Feature | Description |\n|---|---|\n| **Typed events** | Full TypeScript inference — payload types enforced per event |\n| **Parallel / sequential** | Choose emit mode per-call or set a global default |\n| **Concurrency control** | `concurrency: 1` makes a listener process events one at a time |\n| **Once** | Auto-unsubscribe after first invocation |\n| **Middleware** | Intercept every listener call (logging, auth, tracing) |\n| **AbortSignal** | Cancel sequential dispatches mid-flight |\n| **Error handling** | Global `onError` or per-listener `ignoreErrors` |\n| **Stats** | `emitted`, `dispatched`, `errors`, `listeners` snapshot |\n\n## API\n\n### `createBus<Events>(options?)`\n\n```ts\nconst bus = createBus<AppEvents>({\n  defaultMode: 'parallel',       // or 'sequential'\n  onError: (event, err, ctx) => logger.error({ event, err }),\n  middleware: [loggingMiddleware],\n});\n```\n\n### `bus.on(event, listener, options?)`\n\n```ts\nconst off = bus.on('userCreated', async (payload, ctx) => {\n  console.log(ctx.seq, ctx.emittedAt);\n}, { concurrency: 2, ignoreErrors: false });\n\noff(); // unsubscribe\n```\n\n### `bus.once(event, listener, options?)`\n\nFires once, then auto-removes.\n\n### `bus.emit(event, payload, options?)`\n\n```ts\nconst ac = new AbortController();\nawait bus.emit('orderPaid', { orderId: 'x', amount: 100 }, {\n  mode: 'sequential',\n  signal: ac.signal,\n});\n```\n\n### `bus.off(event?)`\n\nRemove all listeners for one event, or all events.\n\n### `bus.listenerCount(event)`\n\n### `bus.stats()`\n\n```ts\n{ emitted: number; dispatched: number; errors: number; listeners: number }\n```\n\n## Middleware\n\n```ts\nimport type { Middleware } from '@async-kit/eventx';\n\nconst timing: Middleware<AppEvents> = async (event, payload, next) => {\n  const start = Date.now();\n  await next();\n  console.log(event, Date.now() - start, 'ms');\n};\n\nconst bus = createBus<AppEvents>({ middleware: [timing] });\n```\n\n## `EventContext`\n\nEvery listener receives a second `ctx` argument:\n\n```ts\ninterface EventContext {\n  event: string;    // event name\n  seq: number;      // monotonically increasing emit sequence\n  emittedAt: number; // ms since epoch\n  signal: AbortSignal;\n}\n```\n\n## Examples\n\n### Fan-out with concurrency guard\n\n```ts\nbus.on('orderPaid', processOrder, { concurrency: 1 }); // queue, never parallel\n```\n\n### One-time setup listener\n\n```ts\nbus.once('appReady', () => startHealthChecks());\n```\n\n### Sequential audit log\n\n```ts\nawait bus.emit('userDeleted', { id }, { mode: 'sequential' });\n// each listener finishes before the next starts\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-d3b071fe84293dbc780b1d49cc125340"}