{"_id":"@bitr/awaitable-event-emitter","_rev":"3-d78c74f34c5dd8f75c0e5b2829780053","name":"@bitr/awaitable-event-emitter","description":"An enhanced event emitter with awaitable emit methods.","dist-tags":{"latest":"1.0.3"},"versions":{"1.0.0":{"name":"@bitr/awaitable-event-emitter","version":"1.0.0","description":"An enhanced event emitter with awaitable emit methods.","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest --coverage --runInBand && cat ./coverage/lcov.info | coveralls","jest":"jest --runInBand","cov":"jest --coverage --runInBand"},"keywords":["await","typescript","event","emitter"],"repository":{"type":"git","url":"git+https://github.com/bitrinjani/awaitable-event-emitter.git"},"author":{"name":"bitrinjani","email":"bitrinjani@gmail.com"},"license":"MIT","dependencies":{"lodash":"^4.17.4"},"devDependencies":{"@types/jest":"^21.1.4","@types/lodash":"^4.14.91","@types/node":"^8.0.46","coveralls":"^3.0.0","jest":"^21.0.3","ts-jest":"^21.0.0","typescript":"^2.5.3"},"jest":{"transform":{"^.+\\.tsx?$":"<rootDir>/node_modules/ts-jest/preprocessor.js"},"testRegex":"/__tests__/.*\\.(jsx?|tsx?)$","moduleFileExtensions":["ts","tsx","js","jsx","json"],"mapCoverage":true,"collectCoverageFrom":["**/*.{ts,tsx}","!**/__tests__/**","!**/node_modules/**","!**/*.d.ts","!**/types.ts"]},"gitHead":"b3d63d9e25d0de3a3e060e4666ab7c353841a135","bugs":{"url":"https://github.com/bitrinjani/awaitable-event-emitter/issues"},"homepage":"https://github.com/bitrinjani/awaitable-event-emitter#readme","_id":"@bitr/awaitable-event-emitter@1.0.0","_npmVersion":"5.5.1","_nodeVersion":"8.9.1","_npmUser":{"name":"bitr","email":"bit.rinjani@gmail.com"},"dist":{"integrity":"sha512-mLvJAHhvxF+40yTizyyL7mQiZ0K3x86oMZqzD6Ew/XHKLDXwdOXW/wnNXoETg8P9niLJTzOJIbMKWEtJbvNJ6w==","shasum":"0801598f74b7ebc5b6be6fd550f74e8c0afc5541","tarball":"https://registry.npmjs.org/@bitr/awaitable-event-emitter/-/awaitable-event-emitter-1.0.0.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDB4HzKOiuaBYnEp5TtZBNYfgEP3298V4gJM1QaubiJswIgR2tW22BGhtpO7TGpAHWOa+NlpuZ87ewGIVXbzmP6WnI="}]},"maintainers":[{"name":"bitr","email":"bit.rinjani@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/awaitable-event-emitter-1.0.0.tgz_1515930554171_0.1646610728930682"}},"1.0.1":{"name":"@bitr/awaitable-event-emitter","version":"1.0.1","description":"An enhanced event emitter with awaitable emit methods.","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","test":"jest --coverage --runInBand && cat ./coverage/lcov.info | coveralls","jest":"jest --runInBand","cov":"jest --coverage --runInBand"},"keywords":["await","typescript","event","emitter"],"repository":{"type":"git","url":"git+https://github.com/bitrinjani/awaitable-event-emitter.git"},"author":{"name":"bitrinjani","email":"bitrinjani@gmail.com"},"license":"MIT","dependencies":{"lodash":"^4.17.4"},"devDependencies":{"@types/jest":"^21.1.4","@types/lodash":"^4.14.91","@types/node":"^8.0.46","coveralls":"^3.0.0","jest":"^21.0.3","ts-jest":"^21.0.0","typescript":"^2.5.3"},"jest":{"transform":{"^.+\\.tsx?$":"<rootDir>/node_modules/ts-jest/preprocessor.js"},"testRegex":"/__tests__/.*\\.(jsx?|tsx?)$","moduleFileExtensions":["ts","tsx","js","jsx","json"],"mapCoverage":true,"collectCoverageFrom":["**/*.{ts,tsx}","!**/__tests__/**","!**/node_modules/**","!**/*.d.ts","!**/types.ts"]},"gitHead":"ebb9094a0c1f28e545901697caa3c8d74abff13a","bugs":{"url":"https://github.com/bitrinjani/awaitable-event-emitter/issues"},"homepage":"https://github.com/bitrinjani/awaitable-event-emitter#readme","_id":"@bitr/awaitable-event-emitter@1.0.1","_npmVersion":"5.5.1","_nodeVersion":"8.9.1","_npmUser":{"name":"bitr","email":"bit.rinjani@gmail.com"},"dist":{"integrity":"sha512-utQZUnoHtK8AhL65BtAYIdpyOZZ+2B0kTiJ673jd4tUZywyjNKwEbttYPmN8bxj+bmhqXCcz3buVke5saZTjEQ==","shasum":"7d476d00ac9b1449f1d0a74e1628af9554c46b46","tarball":"https://registry.npmjs.org/@bitr/awaitable-event-emitter/-/awaitable-event-emitter-1.0.1.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDuZXNK7tLsyH5bK1VwzX0TvrTVp8FULQYJHQqUGaSoVgIgVrhrcAy/Z9JAOH9d8sPffzZD63jlHV5o78pWN2IRsko="}]},"maintainers":[{"name":"bitr","email":"bit.rinjani@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/awaitable-event-emitter-1.0.1.tgz_1515931977232_0.4117564894258976"}},"1.0.3":{"name":"@bitr/awaitable-event-emitter","version":"1.0.3","description":"An enhanced event emitter with awaitable emit methods.","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"prebuild":"rimraf dist","build":"tsc","pub":"npm publish --access public","prepublishOnly":"npm run build","test":"jest --coverage --runInBand && cat ./coverage/lcov.info | coveralls","jest":"jest --runInBand","cov":"jest --coverage --runInBand"},"keywords":["await","typescript","event","emitter"],"repository":{"type":"git","url":"git+https://github.com/bitrinjani/awaitable-event-emitter.git"},"author":{"name":"bitrinjani","email":"bitrinjani@gmail.com"},"license":"MIT","dependencies":{"lodash":"^4.17.4"},"devDependencies":{"@types/jest":"^21.1.4","@types/lodash":"^4.14.91","@types/node":"^8.0.46","coveralls":"^3.0.0","jest":"^21.0.3","ts-jest":"^21.0.0","tslint-config-airbnb":"^5.5.0","typescript":"^2.5.3"},"jest":{"transform":{"^.+\\.tsx?$":"<rootDir>/node_modules/ts-jest/preprocessor.js"},"testRegex":"/__tests__/.*\\.(jsx?|tsx?)$","moduleFileExtensions":["ts","tsx","js","jsx","json"],"mapCoverage":true,"collectCoverageFrom":["**/*.{ts,tsx}","!**/__tests__/**","!**/node_modules/**","!**/*.d.ts","!**/types.ts"]},"gitHead":"3b58c90c0cbf2a362fb9c9fced0887d4e3ca23f9","bugs":{"url":"https://github.com/bitrinjani/awaitable-event-emitter/issues"},"homepage":"https://github.com/bitrinjani/awaitable-event-emitter#readme","_id":"@bitr/awaitable-event-emitter@1.0.3","_npmVersion":"5.5.1","_nodeVersion":"8.9.1","_npmUser":{"name":"bitr","email":"bit.rinjani@gmail.com"},"dist":{"integrity":"sha512-nxxoBrFaj/VtYDdJeHzM4KRuZnE980VEMtyjKP5CbyokUKAw2C/0Ohn+P4nj5xr5Ge8qkXAXIw25XoD5bbeySg==","shasum":"78d5e1057e9796934d0e82a07ed23bf5622060fa","tarball":"https://registry.npmjs.org/@bitr/awaitable-event-emitter/-/awaitable-event-emitter-1.0.3.tgz","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGHMCuWOSD11Dwoj1ELFgM33cKqjK+2Nh/tj6UXzox4qAiA6+94vp/DWtzcNrLZKX63FCk4BBtDu4Wob7WEvsCjZjQ=="}]},"maintainers":[{"name":"bitr","email":"bit.rinjani@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/awaitable-event-emitter-1.0.3.tgz_1517878809491_0.4707355769351125"}}},"readme":"[![Build Status](https://travis-ci.org/bitrinjani/awaitable-event-emitter.svg?branch=master)](https://travis-ci.org/bitrinjani/awaitable-event-emitter) [![Coverage Status](https://coveralls.io/repos/github/bitrinjani/awaitable-event-emitter/badge.svg?branch=master&i=2)](https://coveralls.io/github/bitrinjani/awaitable-event-emitter?branch=master) [![npm version](https://badge.fury.io/js/%40bitr%2Fawaitable-event-emitter.svg)](https://badge.fury.io/js/%40bitr%2Fawaitable-event-emitter)\r\n\r\n# Awaitable Event Emitter\r\nAwaitable Event Emitter is an enhanced version of node.js EventEmitter. It allows you to await `emit` methods, unlike fire-and-foget `emit` of the native EventEmitter.\r\n\r\n# Install\r\n\r\n```bash\r\nnpm install @bitr/awaitable-event-emitter \r\n```\r\n\r\n# Why do you need this library?\r\n\r\nIn the native EventEmitter, it is not easy to know when `emit` has finished executing async listeners because `emit` returns immediately without waiting for promises. In this enhanced version, you can await `emitParallel`/`emitSerial` that returns Promise.\r\n\r\n```typescript\r\nclass Awaitable extends AwaitableEventEmitter {\r\n  ...\r\n}\r\n\r\nconst awaitable = new Awaitable();\r\n\r\n// Register async functions that returns Promise.\r\nawaitable.on('event', async () => { ... });\r\nawaitable.on('event', async () => { ... });\r\n\r\n// Emit an event, execute listeners in parallel, and await until all listeners have finished. \r\nawait awaitable.emitParallel('event');\r\n\r\n// Or execute listeners in serial order\r\nawait awaitable.emitSerial('event');\r\n```\r\n\r\n# Implementation\r\n\r\n`emitParallel` is implemented with Promise.all. \r\n\r\n```typescript\r\nasync emitParallel(event: string | symbol, ...args: any[]): Promise<void> {\r\n  ...\r\n  const tasks = listeners.map(l => l.fn(...args))\r\n  await Promise.all(tasks);  \r\n  ...\r\n}\r\n```\r\n\r\n`emitSerial` is just a for-loop with await inside.\r\n\r\n```typescript\r\nasync emitSerial(event: string | symbol, ...args: any[]): Promise<void> {\r\n  ...\r\n  for (const listener of listeners) {\r\n    await listener.fn(...args);\r\n  }\r\n  ...\r\n} \r\n```\r\n\r\n\r\n","maintainers":[{"name":"bitr","email":"bit.rinjani@gmail.com"}],"time":{"modified":"2022-04-04T19:13:02.763Z","created":"2018-01-14T11:49:14.231Z","1.0.0":"2018-01-14T11:49:14.231Z","1.0.1":"2018-01-14T12:12:57.334Z","1.0.3":"2018-02-06T01:00:09.649Z"},"homepage":"https://github.com/bitrinjani/awaitable-event-emitter#readme","keywords":["await","typescript","event","emitter"],"repository":{"type":"git","url":"git+https://github.com/bitrinjani/awaitable-event-emitter.git"},"author":{"name":"bitrinjani","email":"bitrinjani@gmail.com"},"bugs":{"url":"https://github.com/bitrinjani/awaitable-event-emitter/issues"},"license":"MIT","readmeFilename":"README.md"}