{"_id":"@elumixor/event-emitter","_rev":"5-0a5cfc36a6e5286c2e74b3d94baa9537","name":"@elumixor/event-emitter","dist-tags":{"latest":"1.0.7"},"versions":{"1.0.2":{"name":"@elumixor/event-emitter","version":"1.0.2","author":"","license":"ISC","_id":"@elumixor/event-emitter@1.0.2","maintainers":[{"name":"elumixor","email":"vladogim97@gmail.com"}],"homepage":"https://github.com/elumixor/event-emitter#readme","bugs":{"url":"https://github.com/elumixor/event-emitter/issues"},"dist":{"shasum":"995fef360e6105366ea292677fbac8e18fcde7fd","tarball":"https://registry.npmjs.org/@elumixor/event-emitter/-/event-emitter-1.0.2.tgz","fileCount":5,"integrity":"sha512-fWAP1IixG8WmQ1t9E4vvAwG0HJEIybgU9pYQr/Nv2AcMtlGXd0kraNUxfmTfCz0E/fxpiLURsyXJEZWALK4fxQ==","signatures":[{"sig":"MEQCIDxeZcTFKXIO+Li9c5MiXq5p5ZXVd66VNNZCJjJQiio7AiBKFlHPUTCRxvxY2JCGvK3Vr05hZQqZu/0m94AQCiGRPA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14010},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"351ef6e1ac857ad9cc9bb573f693561e1f9d249e","scripts":{"lint":"biome check . --fix","build":"bun run build:clean && bun run build:bundle && bun run build:declaration","check":"tsc --noEmit && bun run lint && biome format .","format":"biome format . --write","build:clean":"rm -rf ./dist","build:bundle":"bun build ./src/index.ts --outdir ./dist --minify","release:major":"npm version major -m \"Release v%s\" && git push --tags","release:minor":"npm version minor -m \"Release v%s\" && git push --tags","release:patch":"npm version patch -m \"Release v%s\" && git push --tags","build:declaration":"tsc --project tsconfig.build.json"},"_npmUser":{"name":"elumixor","email":"vladogim97@gmail.com"},"repository":{"url":"git+https://github.com/elumixor/event-emitter.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal event emitter","directories":{},"_nodeVersion":"20.19.5","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.21","typescript":"^5","@biomejs/biome":"2.2.4"},"_npmOperationalInternal":{"tmp":"tmp/event-emitter_1.0.2_1758021292363_0.14076981314283366","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@elumixor/event-emitter","version":"1.0.3","author":"","license":"ISC","_id":"@elumixor/event-emitter@1.0.3","maintainers":[{"name":"elumixor","email":"vladogim97@gmail.com"}],"homepage":"https://github.com/elumixor/event-emitter#readme","bugs":{"url":"https://github.com/elumixor/event-emitter/issues"},"dist":{"shasum":"3b345848e9c7a5be52389f396b153c37300b76be","tarball":"https://registry.npmjs.org/@elumixor/event-emitter/-/event-emitter-1.0.3.tgz","fileCount":5,"integrity":"sha512-tL1vMAMIr9M1WZhI04F7IkTU/XDtxjrDIaofA1Pi1MHSMp5vBHB4jt/SLBJOepM3HiuViTohxLd4boWf+XayVw==","signatures":[{"sig":"MEUCIQD0b9SjFzHN58tUbHlsfqAE9AhWwaJbbPW7z38TehzN2gIgU6MeRQ328OyAPrrl7k6lc+FncmawwQOBAe3A7lTVoRA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14040},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"dcd4d4b6df85500c4e9a55a92dcb42fe24bc7f95","scripts":{"lint":"biome check . --fix","build":"bun run build:clean && bun run build:bundle && bun run build:declaration","check":"tsc --noEmit && bun run lint && biome format .","format":"biome format . --write","build:clean":"rm -rf ./dist","build:bundle":"bun build ./src/index.ts --outdir ./dist --minify","release:major":"npm version major -m \"Release v%s\" && git push --tags","release:minor":"npm version minor -m \"Release v%s\" && git push --tags","release:patch":"npm version patch -m \"Release v%s\" && git push --tags","build:declaration":"tsc --project tsconfig.build.json"},"_npmUser":{"name":"elumixor","email":"vladogim97@gmail.com"},"repository":{"url":"git+https://github.com/elumixor/event-emitter.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal event emitter","directories":{},"_nodeVersion":"20.19.5","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.21","typescript":"^5","@biomejs/biome":"2.2.4"},"_npmOperationalInternal":{"tmp":"tmp/event-emitter_1.0.3_1758102087925_0.8868782789796759","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@elumixor/event-emitter","version":"1.0.4","author":"","license":"ISC","_id":"@elumixor/event-emitter@1.0.4","maintainers":[{"name":"elumixor","email":"vladogim97@gmail.com"}],"homepage":"https://github.com/elumixor/event-emitter#readme","bugs":{"url":"https://github.com/elumixor/event-emitter/issues"},"dist":{"shasum":"372a66e4e7aa71e8c0a1c4f4c1f786e3f7249790","tarball":"https://registry.npmjs.org/@elumixor/event-emitter/-/event-emitter-1.0.4.tgz","fileCount":5,"integrity":"sha512-7bF/G6+7Hk804Ab8UxAvmt6cMJglQNTOoAKQ9YCs7Zw3x93tS8ZGvWb1VMM3MWwggTPEZ8gHG/Uw09e2E1Z0gQ==","signatures":[{"sig":"MEQCIHFVuIvDzWM3ykF+rliZJagbc4EljoE+q64fjNcE+GaqAiAUodwRHaBmu7E7duIynvcIIfKTPTn+jkxRjLnUBt5rjg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14084},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"1ae4ef6977f97cc6a22a205aba113b250a986a3f","scripts":{"lint":"biome check . --fix","build":"bun run build:clean && bun run build:bundle && bun run build:declaration","check":"tsc --noEmit && bun run lint && biome format .","format":"biome format . --write","build:clean":"rm -rf ./dist","build:bundle":"bun build ./src/index.ts --outdir ./dist --minify","release:major":"npm version major -m \"Release v%s\" && git push --tags","release:minor":"npm version minor -m \"Release v%s\" && git push --tags","release:patch":"npm version patch -m \"Release v%s\" && git push --tags","build:declaration":"tsc --project tsconfig.build.json"},"_npmUser":{"name":"elumixor","email":"vladogim97@gmail.com"},"repository":{"url":"git+https://github.com/elumixor/event-emitter.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal event emitter","directories":{},"_nodeVersion":"20.19.5","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.21","typescript":"^5","@biomejs/biome":"2.2.4"},"_npmOperationalInternal":{"tmp":"tmp/event-emitter_1.0.4_1759914341750_0.7394478092145991","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@elumixor/event-emitter","version":"1.0.5","author":"","license":"ISC","_id":"@elumixor/event-emitter@1.0.5","maintainers":[{"name":"elumixor","email":"vladogim97@gmail.com"}],"homepage":"https://github.com/elumixor/event-emitter#readme","bugs":{"url":"https://github.com/elumixor/event-emitter/issues"},"dist":{"shasum":"a3ad8e7e48e7c3f50c0f9cbb586810e442d9f700","tarball":"https://registry.npmjs.org/@elumixor/event-emitter/-/event-emitter-1.0.5.tgz","fileCount":5,"integrity":"sha512-91tvoWcBlNzKL2EXeZzGs2o71r017fR/GGINWGrUoSvnByNcS0sKm/QU1ZZZRXmFIxx9JKzUqZk8kEm58to54w==","signatures":[{"sig":"MEUCIQD66CrHIabjAgivzglXqoTkNRiq68xhlrtEUlb7aFFi+gIgKvKBMJIaRxt3lcHS2JZXdKEZSfAAE2fDo8auPNQM8HI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":14084},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","gitHead":"9b4d38bed569051a7434e01eb75325d221ccd9e6","scripts":{"lint":"biome check . --fix","build":"bun run build:clean && bun run build:bundle && bun run build:declaration","check":"tsc --noEmit && bun run lint && biome format .","format":"biome format . --write","build:clean":"rm -rf ./dist","build:bundle":"bun build ./src/index.ts --outdir ./dist --minify","release:major":"npm version major -m \"Release v%s\" && git push --tags","release:minor":"npm version minor -m \"Release v%s\" && git push --tags","release:patch":"npm version patch -m \"Release v%s\" && git push --tags","build:declaration":"tsc --project tsconfig.build.json"},"_npmUser":{"name":"elumixor","email":"vladogim97@gmail.com"},"repository":{"url":"git+https://github.com/elumixor/event-emitter.git","type":"git"},"_npmVersion":"10.8.2","description":"Minimal event emitter","directories":{},"_nodeVersion":"20.19.5","_hasShrinkwrap":false,"devDependencies":{"@types/bun":"^1.2.21","typescript":"^5","@biomejs/biome":"2.2.4"},"_npmOperationalInternal":{"tmp":"tmp/event-emitter_1.0.5_1759915339783_0.8424894422389977","host":"s3://npm-registry-packages-npm-production"}},"1.0.7":{"name":"@elumixor/event-emitter","version":"1.0.7","description":"Minimal event emitter","main":"dist/index.js","types":"dist/index.d.ts","type":"module","repository":{"type":"git","url":"git+https://github.com/elumixor/event-emitter.git"},"scripts":{"build":"bun run build:clean && bun run build:bundle && bun run build:declaration","build:clean":"rm -rf ./dist","build:bundle":"bun build ./src/index.ts --outdir ./dist --minify","build:declaration":"tsc --project tsconfig.build.json","check":"tsc --noEmit && bun run lint && biome format .","lint":"biome check . --fix","format":"biome format . --write","release:patch":"npm version patch -m \"Release v%s\" && git push --tags","release:minor":"npm version minor -m \"Release v%s\" && git push --tags","release:major":"npm version major -m \"Release v%s\" && git push --tags"},"author":"","license":"ISC","devDependencies":{"@biomejs/biome":"2.2.4","@types/bun":"^1.2.21","typescript":"^5"},"gitHead":"3eea616cf9b53df99484625a2344b9606527cd58","_id":"@elumixor/event-emitter@1.0.7","bugs":{"url":"https://github.com/elumixor/event-emitter/issues"},"homepage":"https://github.com/elumixor/event-emitter#readme","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-mlnDlcuHuo4qYdp48vKOJBFUpNWtMYtUMh8lVCIKyt5/20SfIM3lx/3T0gedfiko20JDJbnP7lvL+1P8M8i2Lw==","shasum":"13a67072ef604f877f98e688cbda0f4116c3f8b0","tarball":"https://registry.npmjs.org/@elumixor/event-emitter/-/event-emitter-1.0.7.tgz","fileCount":5,"unpackedSize":14084,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@elumixor%2fevent-emitter@1.0.7","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCrcu15/ukN6ZqDF/TzHg2sJN1dTcz/D5TShakryJFq+gIgeZ+Gn7foO3mlISHyY5+jFHgc7ypnEZot0TaCG4A1+R0="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:853bad50-97e0-418a-bae0-7197c2670a9c"}},"directories":{},"maintainers":[{"name":"elumixor","email":"vladogim97@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/event-emitter_1.0.7_1766103664466_0.6217522722359214"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-16T11:14:52.270Z","modified":"2025-12-19T00:21:05.075Z","1.0.2":"2025-09-16T11:14:52.537Z","1.0.3":"2025-09-17T09:41:28.089Z","1.0.4":"2025-10-08T09:05:41.966Z","1.0.5":"2025-10-08T09:22:19.991Z","1.0.7":"2025-12-19T00:21:04.653Z"},"bugs":{"url":"https://github.com/elumixor/event-emitter/issues"},"license":"ISC","homepage":"https://github.com/elumixor/event-emitter#readme","repository":{"type":"git","url":"git+https://github.com/elumixor/event-emitter.git"},"description":"Minimal event emitter","maintainers":[{"name":"elumixor","email":"vladogim97@gmail.com"}],"readme":"# Event Emitter\n\n[![Build](https://github.com/elumixor/event-emitter/actions/workflows/build.yml/badge.svg)](https://github.com/elumixor/event-emitter/actions/workflows/build.yml)\n[![Latest NPM version](https://img.shields.io/npm/v/@elumixor/event-emitter.svg)](https://www.npmjs.com/package/@elumixor/event-emitter)\n\nA minimal, type-safe event emitter for TypeScript/JavaScript with both synchronous and asynchronous support.\n\n## Installation\n\n```bash\nnpm install @elumixor/event-emitter\n```\n\n## Basic Usage\n\n### EventEmitter\n\nThe `EventEmitter` class provides synchronous event handling:\n\n```typescript\nimport { EventEmitter } from \"@elumixor/event-emitter\";\n\n// Create an event emitter for string events\nconst userLoggedIn = new EventEmitter<string>();\n\n// Subscribe to events\nconst subscription = userLoggedIn.subscribe((username) => {\n  console.log(`User ${username} logged in!`);\n});\n\n// Emit an event\nuserLoggedIn.emit(\"john_doe\");\n\n// Unsubscribe when done\nsubscription.unsubscribe();\n```\n\n### AsyncEventEmitter\n\nFor asynchronous event handling with sequential or parallel execution:\n\n```typescript\nimport { AsyncEventEmitter } from \"@elumixor/event-emitter\";\n\n// Sequential execution (default)\nconst fileProcessor = new AsyncEventEmitter<string>(\"sequential\");\n\nfileProcessor.subscribe(async (filePath) => {\n  console.log(`Processing ${filePath}...`);\n  await processFile(filePath);\n});\n\nfileProcessor.subscribe(async (filePath) => {\n  console.log(`Saving ${filePath}...`);\n  await saveFile(filePath);\n});\n\n// Parallel execution\nconst notificationEmitter = new AsyncEventEmitter<string>(\"parallel\");\n\nnotificationEmitter.subscribe(async (message) => {\n  await sendEmail(message);\n});\n\nnotificationEmitter.subscribe(async (message) => {\n  await sendSMS(message);\n});\n```\n\n## Advanced Usage\n\n### Event Data Types\n\nYou can use any type for event data:\n\n```typescript\n// Void events (no data)\nconst appReady = new EventEmitter<void>();\nappReady.subscribe(() => console.log(\"App is ready!\"));\n\n// Object events\ninterface UserEvent {\n  id: number;\n  name: string;\n  action: \"login\" | \"logout\";\n}\n\nconst userEvents = new EventEmitter<UserEvent>();\nuserEvents.subscribe((event) => {\n  console.log(`${event.name} performed ${event.action}`);\n});\n\n// Union types\nconst statusEvents = new EventEmitter<\"connected\" | \"disconnected\" | \"error\">();\n```\n\n### Promise-based Event Handling\n\n```typescript\nconst dataLoaded = new EventEmitter<string>();\n\n// Wait for the next event\nasync function waitForData() {\n  const data = await dataLoaded.nextEvent;\n  console.log(\"Data received:\", data);\n}\n\n// The first event (one-time promise)\nasync function initialize() {\n  await dataLoaded.first; // Resolves when first event is emitted\n  console.log(\"First data loaded, app initialized\");\n}\n\n// Emit data\nsetTimeout(() => dataLoaded.emit(\"Hello World!\"), 1000);\n```\n\n### Subscribe Once\n\n```typescript\nconst buttonClicked = new EventEmitter<void>();\n\nbuttonClicked.subscribeOnce(() => {\n  console.log(\"Button clicked for the first time!\");\n  // This callback will only be called once\n});\n\nbuttonClicked.emit(); // Logs: \"Button clicked for the first time!\"\nbuttonClicked.emit(); // Nothing happens\n```\n\n### Subscribe Immediate\n\n```typescript\nconst configLoaded = new EventEmitter<object>();\n\n// Load configuration\nsetTimeout(() => configLoaded.emit({ theme: \"dark\" }), 1000);\n\n// This will be called immediately if event was already emitted\nconfigLoaded.subscribeImmediate((config) => {\n  console.log(\"Config received:\", config);\n});\n```\n\n### Event Piping\n\nChain event emitters together:\n\n```typescript\nconst userInput = new EventEmitter<string>();\nconst processedInput = userInput.pipe((input) => input.toUpperCase());\nconst validatedInput = processedInput.pipe((input) =>\n  input.length > 0 ? input : null\n);\n\n// Subscribe to the final processed event\nvalidatedInput.subscribe((input) => {\n  if (input) {\n    console.log(\"Valid input:\", input);\n  }\n});\n\n// Emit original event\nuserInput.emit(\"hello world\"); // Logs: \"Valid input: HELLO WORLD\"\n```\n\n### Async Event Piping\n\n```typescript\nconst rawData = new AsyncEventEmitter<string>();\nconst processedData = rawData.pipe(async (data) => {\n  const result = await fetch(`/api/process?data=${data}`);\n  return result.json();\n});\n\nprocessedData.subscribe((processed) => {\n  console.log(\"Processed data:\", processed);\n});\n```\n\n## API Reference\n\n### EventEmitter<TEventData>\n\n#### Methods\n\n- `subscribe(callback: (eventData: TEventData) => unknown): ISubscription<TEventData>`\n\n  - Subscribes a callback to the event\n  - Returns a subscription object with `unsubscribe()` method\n\n- `subscribeImmediate(callback: (eventData: TEventData) => unknown): ISubscription<TEventData>`\n\n  - Subscribes a callback and immediately calls it if the event was already emitted\n\n- `subscribeOnce(callback: (eventData: TEventData) => unknown): ISubscription<TEventData>`\n\n  - Subscribes a callback that will only be called once\n\n- `emit(eventData: TEventData): void`\n\n  - Emits an event with the provided data\n\n- `unsubscribe(callback: (eventData: TEventData) => unknown): void`\n\n  - Unsubscribes a specific callback\n\n- `pipe(): EventEmitter<TEventData>`\n- `pipe<TOut>(callback: (eventData: TEventData) => TOut): EventEmitter<TOut>`\n  - Creates a new EventEmitter that receives transformed events\n\n#### Properties\n\n- `nextEvent: PromiseLike<TEventData>`\n\n  - Promise that resolves with the next emitted event data\n\n- `first: PromiseLike<void>`\n\n  - Promise that resolves when the first event is emitted\n\n- `value: TEventData | undefined`\n  - The last emitted event data (undefined if no events emitted)\n\n### AsyncEventEmitter<TEventData>\n\nExtends EventEmitter with async support.\n\n#### Constructor\n\n```typescript\nnew AsyncEventEmitter<TEventData>(strategy?: 'sequential' | 'parallel')\n```\n\n- `strategy`: Execution strategy for callbacks\n  - `'sequential'` (default): Callbacks are executed one after another\n  - `'parallel'`: All callbacks are executed simultaneously\n\n#### Additional Methods\n\n- `emit(eventData: TEventData): Promise<void>`\n\n  - Emits an event asynchronously\n\n- `pipe(): AsyncEventEmitter<TEventData>`\n- `pipe<TOut>(callback: (eventData: TEventData) => TOut): AsyncEventEmitter<TOut>`\n  - Creates a new AsyncEventEmitter that receives transformed events\n\n### ISubscription<TEventData>\n\n```typescript\ninterface ISubscription<TEventData> {\n  callback: (eventData: TEventData) => unknown;\n  unsubscribe(): void;\n}\n```\n\n## Examples\n\n### Real-world Usage Patterns\n\n#### User Authentication Events\n\n```typescript\nimport { EventEmitter } from \"@elumixor/event-emitter\";\n\ninterface AuthEvent {\n  userId: string;\n  timestamp: Date;\n  action: \"login\" | \"logout\" | \"register\";\n}\n\nclass AuthService {\n  private authEvents = new EventEmitter<AuthEvent>();\n\n  onAuthEvent(callback: (event: AuthEvent) => void) {\n    return this.authEvents.subscribe(callback);\n  }\n\n  async login(username: string, password: string) {\n    // ... authentication logic\n    this.authEvents.emit({\n      userId: \"user123\",\n      timestamp: new Date(),\n      action: \"login\",\n    });\n  }\n}\n```\n\n#### File Upload Progress\n\n```typescript\nimport { AsyncEventEmitter } from \"@elumixor/event-emitter\";\n\ninterface UploadProgress {\n  fileName: string;\n  progress: number; // 0-100\n  status: \"uploading\" | \"completed\" | \"error\";\n}\n\nclass FileUploader {\n  private progressEmitter = new AsyncEventEmitter<UploadProgress>(\"parallel\");\n\n  onProgress(callback: (progress: UploadProgress) => void) {\n    return this.progressEmitter.subscribe(callback);\n  }\n\n  async uploadFile(file: File) {\n    // Simulate upload with progress updates\n    for (let progress = 0; progress <= 100; progress += 10) {\n      await new Promise((resolve) => setTimeout(resolve, 100));\n      this.progressEmitter.emit({\n        fileName: file.name,\n        progress,\n        status: progress === 100 ? \"completed\" : \"uploading\",\n      });\n    }\n  }\n}\n```\n\n#### Reactive State Management\n\n```typescript\nimport { EventEmitter } from \"@elumixor/event-emitter\";\n\nclass Store<T> {\n  private stateEmitter = new EventEmitter<T>();\n  private _state: T;\n\n  constructor(initialState: T) {\n    this._state = initialState;\n  }\n\n  get state() {\n    return this._state;\n  }\n\n  subscribe(callback: (state: T) => void) {\n    return this.stateEmitter.subscribeImmediate(callback);\n  }\n\n  update(updater: (currentState: T) => T) {\n    this._state = updater(this._state);\n    this.stateEmitter.emit(this._state);\n  }\n}\n\n// Usage\nconst counterStore = new Store(0);\n\ncounterStore.subscribe((count) => {\n  console.log(\"Count changed:\", count);\n});\n\ncounterStore.update((count) => count + 1); // Logs: \"Count changed: 1\"\n```\n\n## License\n\nISCEmitter\n\n[![Build](https://github.com/elumixor/event-emitter/actions/workflows/build.yml/badge.svg)](https://github.com/elumixor/event-emitter/actions/workflows/build.yml)\n[![Latest NPM version](https://img.shields.io/npm/v/@elumixor/event-emitter.svg)](https://www.npmjs.com/package/@elumixor/event-emitter)\n\nMinimal event emitter.\n\nUsage:\n","readmeFilename":"README.md"}