# from-emitter [![logo](https://avatars1.githubusercontent.com/u/31987273?v=4&s=110)][async-url] inform an iterable when it is prematurely terminated by the consumer. [![NPM version][npm-image]][npm-url] [![Travis Status][travis-image]][travis-url] [![Travis Status][codecov-image]][codecov-url] ### Install ``` yarn add @async-generators/from-emitter ``` This package's `main` entry points to a `commonjs` dist. The `module` entry points to a `es2015` module dist. Both require native async-generator support, or be down-compiled with a webpack loader. ## Exports ### (default) from-emitter(emitter, onNext, onError, onDone [,selectNext][,selectError]) from-emitter() subscribes to `onNext`, `onError` and `onDone` and returns a (one-time) iterable-sequence of captured events. When the event listeners are called, the arguments are passed to `selectNext(...args)` and `selectError(...args)` to pick a value (defaults to the first argument). If the sequence completes (`onDone`), or the consumer terminates early, the event listeners are detached from the emitter and the iterable becomes disposed and cannot be iterated again. source must be a node-js compliment event emitter, with the `addListener ` and `removeListener` methods. ## Example example.js ```js const fromEmitter = require('./dist/commonjs').default; const {EventEmitter} = require('events'); async function main() { let events = new EventEmitter(); let source = fromEmitter(events, "data", "error", "close"); let consumer = new Promise(async done => { for await (let item of source) { console.log(item); } console.log("...and we're done!") done(); }); events.emit("data", 1); events.emit("data", 2); events.emit("data", 3); events.emit("data", 4); events.emit("close"); await consumer; } main().catch(console.log); ``` Execute with the latest node.js: ``` node example.js // or... node --harmony-async-iteration example.js ``` output: ``` 1 2 3 4 ...and we're done! ``` ## Typescript This library is fully typed and can be imported using: ```ts import fromEmitter from '@async-generators/from-emitter'); ``` It is also possible to directly execute your [properly configured](https://stackoverflow.com/a/43694282/1657476) typescript with [ts-node](https://www.npmjs.com/package/ts-node): ``` ts-node --harmony_async_iteration example.ts ``` [npm-url]: https://npmjs.org/package/@async-generators/from-emitter [npm-image]: https://img.shields.io/npm/v/@async-generators/from-emitter.svg [npm-downloads]: https://img.shields.io/npm/dm/@async-generators/from-emitter.svg [travis-url]: https://travis-ci.org/async-generators/from-emitter [travis-image]: https://img.shields.io/travis/async-generators/from-emitter/master.svg [codecov-url]: https://codecov.io/gh/async-generators/from-emitter [codecov-image]: https://codecov.io/gh/async-generators/from-emitter/branch/master/graph/badge.svg [async-url]: https://github.com/async-generators