diff --git a/index.js b/index.js index c4ebcdc..00a4812 100644 --- a/index.js +++ b/index.js @@ -2,6 +2,7 @@ const got = require('got'); const uniqueRandomArray = require('unique-random-array'); +const EventEmitter = require('eventemitter3'); const randomCache = {}; @@ -32,6 +33,23 @@ function randomPuppy(subreddit) { .then(getRandomImage => formatResult(getRandomImage)); } +// silly feature to play with observables +function all(subreddit) { + const eventEmitter = new EventEmitter(); + + function emitRandomImage(subreddit) { + randomPuppy(subreddit).then(imageUrl => { + eventEmitter.emit('data', imageUrl + '#' + subreddit); + if (eventEmitter.listeners('data').length) { + setTimeout(() => emitRandomImage(subreddit), 200); + } + }); + } + + emitRandomImage(subreddit); + return eventEmitter; +} + function callback(subreddit, cb) { randomPuppy(subreddit) .then(url => cb(null, url)) @@ -49,3 +67,5 @@ module.exports = (subreddit, cb) => { return randomPuppy(subreddit); } }; + +module.exports.all = all; diff --git a/package.json b/package.json index eeacb79..d76d4cc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "random-puppy", - "version": "1.0.1", - "description": "Get a random puppy image url.", + "version": "1.1.0", + "description": "Get a random imgur image url, by default a puppy.", "license": "MIT", "repository": "dylang/random-puppy", "author": { @@ -13,7 +13,8 @@ "node": ">=4.0.0" }, "scripts": { - "test": "xo && ava" + "test": "xo && ava", + "watch": "ava --watch" }, "files": [ "index.js" @@ -27,11 +28,13 @@ "placeholder" ], "dependencies": { + "eventemitter3": "^1.2.0", "got": "^6.3.0", "unique-random-array": "^1.0.0" }, "devDependencies": { "ava": "^0.14.0", + "rx-lite": "^4.0.8", "xo": "^0.14.0" }, "xo": { diff --git a/readme.md b/readme.md index 3741fb3..d404ed5 100644 --- a/readme.md +++ b/readme.md @@ -27,14 +27,33 @@ randomPuppy() ## API -### randomPuppy() +### `randomPuppy()` Returns a `promise` for a random puppy image url from http://imgur.com/ from https://www.reddit.com/r/puppy -### randomPuppy(subreddit) +### `randomPuppy(subreddit)` Returns a `promise` for a random image url from the selected subreddit. *Warning: We cannot promise it will be a image of a puppy!* +### `randomPuppy.all(subreddit)` + +Returns an `eventemitter` for getting all random images for a subreddit. + +```js +const event = randomPuppy.all(subreddit); +event.on('data', url => console.log(url)); +``` + +Or: +```js +const event = randomPuppy.all('puppies'); + +Observable.fromEvent(event, 'data') + .subscribe(data => { + console.log(data); + }); +``` + ## Notes * Node 4 or newer. diff --git a/test.js b/test.js index 63ea031..f4d36c2 100644 --- a/test.js +++ b/test.js @@ -1,7 +1,8 @@ import test from 'ava'; +import {Observable} from 'rx-lite'; import randomPuppy from './'; -const imgurRegEx = /^https?:\/\/(\w+\.)?imgur.com\/[a-zA-Z0-9]+(\.[a-zA-Z]{3})?$/; +const imgurRegEx = /^https?:\/\/(\w+\.)?imgur.com\/[a-zA-Z0-9]+(\.[a-zA-Z]{3})?(#[a-zA-Z]*)?$/; test('get random', async t => { const result = await randomPuppy(); @@ -58,3 +59,22 @@ test('invalid subreddit', async t => { const result4 = await randomPuppy(false); t.regex(result4, imgurRegEx); }); + +test('all', t => { + t.plan(10); + const puppyEmitter = randomPuppy.all('puppies'); + const robotEmitter = randomPuppy.all('robots'); + + const puppySource = Observable.fromEvent(puppyEmitter, 'data'); + const robotSource = Observable.fromEvent(robotEmitter, 'data'); + + const sharedSource = Observable + .merge(puppySource, robotSource) + .take(10); + + sharedSource.subscribe(data => { + t.regex(data, imgurRegEx); + // console.log(data); + }); + return sharedSource.toPromise(); +});