Skip to content

Commit

Permalink
fix: Provide correct return value from source.emit()
Browse files Browse the repository at this point in the history
Thanks to @rbrtribeiro for the fix! This rebases the work from #8 with minor modifications, and tests the return values directly (rather than adding a wide-bracket integration test).

Close #8 Close #9
  • Loading branch information
paulmelnikow committed Apr 12, 2019
1 parent 8639a87 commit 00a2e63
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 45 deletions.
13 changes: 9 additions & 4 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,17 @@ function propagate(events, source, dest) {

var oldEmit = source.emit

source.emit = function(eventType) {
oldEmit.apply(source, arguments)
// Returns true if the event had listeners, false otherwise.
// https://nodejs.org/api/events.html#events_emitter_emit_eventname_args
source.emit = (eventName, ...args) => {
let oldHandled = oldEmit.call(source, eventName, ...args)

if (!events || ~events.indexOf(eventType)) {
dest.emit.apply(dest, arguments)
let destHandled = false
if (events === undefined || !~events.indexOf(eventType)) {
destHandled = dest.emit.call(dest, eventName, ...args)
}

return oldHandled || destHandled
}

function end() {
Expand Down
82 changes: 41 additions & 41 deletions tests/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,64 +2,64 @@ var test = require('tap').test
var EventEmitter = require('events').EventEmitter
var propagate = require('..')

test('propagates events', function(t) {
t.plan(12)
test('propagates events', t => {
t.plan(16)
var ee1 = new EventEmitter()
var ee2 = new EventEmitter()
propagate(ee1, ee2)

ee2.on('event-1', function(a, b, c) {
ee2.on('event-1', (a, b, c) => {
t.equal(a, 'a')
t.equal(b, 'b')
t.equal(c, undefined)
})

ee2.on('event-2', function(a, b, c) {
ee2.on('event-2', (a, b, c) => {
t.equal(a, 'c')
t.equal(b, 'd')
t.equal(c, undefined)
})

ee1.emit('event-1', 'a', 'b')
ee1.emit('event-1', 'a', 'b')
ee1.emit('event-2', 'c', 'd')
ee1.emit('event-2', 'c', 'd')
t.true(ee1.emit('event-1', 'a', 'b'))
t.true(ee1.emit('event-1', 'a', 'b'))
t.true(ee1.emit('event-2', 'c', 'd'))
t.true(ee1.emit('event-2', 'c', 'd'))
})

test('propagates can end', function(t) {
t.plan(1)
test('propagates can end', t => {
t.plan(3)

var ee1 = new EventEmitter()
var ee2 = new EventEmitter()
var prop = propagate(ee1, ee2)

ee2.on('event', function() {
ee2.on('event', () => {
t.ok('true', 'propagated')
})

ee1.emit('event')
t.true(ee1.emit('event'))
prop.end()
ee1.emit('event')
t.false(ee1.emit('event'))
})

test('after propagation old one still emits', function(t) {
t.plan(2)
test('after propagation old one still emits', t => {
t.plan(4)

var ee1 = new EventEmitter()
var ee2 = new EventEmitter()
var prop = propagate(ee1, ee2)

ee1.on('event', function() {
ee1.on('event', () => {
t.ok('true', 'propagated')
})

ee1.emit('event')
t.true(ee1.emit('event'))
prop.end()
ee1.emit('event')
t.true(ee1.emit('event'))
})

test('emit on source before destination', function(t) {
t.plan(1)
test('emit on source before destination', t => {
t.plan(2)

var source = new EventEmitter()
var dest = new EventEmitter()
Expand All @@ -68,47 +68,47 @@ test('emit on source before destination', function(t) {
// `count` should have been incremented by handler on source when handler on dest is invoked
var count = 0
propagate(source, dest)
source.on('event', function() {
source.on('event', () => {
count++
})
dest.on('event', function() {
dest.on('event', () => {
t.equal(count, 1, 'emit on source first')
})

// Emit the events for assertion
source.emit('event')
t.true(source.emit('event'))
})

test('is able to propagate only certain events', function(t) {
t.plan(2)
test('is able to propagate only certain events', t => {
t.plan(6)
var ee1 = new EventEmitter()
var ee2 = new EventEmitter()
// propagate only event-1 and event-2, leaving out
var p = propagate(['event-1', 'event-2'], ee1, ee2)

ee2.on('event-1', function() {
ee2.on('event-1', () => {
t.ok(true, 'event 1 received')
})

ee2.on('event-2', function(a, b, c) {
ee2.on('event-2', (a, b, c) => {
t.ok(true, 'event 2 received')
})

ee2.on('event-3', function(a, b, c) {
ee2.on('event-3', (a, b, c) => {
t.ok(false, 'event 3 should not have been received')
})

ee1.emit('event-1')
ee1.emit('event-2')
ee1.emit('event-3')
t.true(ee1.emit('event-1'))
t.true(ee1.emit('event-2'))
t.false(ee1.emit('event-3'))

p.end()

ee1.emit('event-1')
t.false(ee1.emit('event-1'))
})

test('is able to propagate and map certain events', function(t) {
t.plan(2)
test('is able to propagate and map certain events', t => {
t.plan(6)
var ee1 = new EventEmitter()
var ee2 = new EventEmitter()
// propagate only event-1 and event-2, leaving out
Expand All @@ -121,23 +121,23 @@ test('is able to propagate and map certain events', function(t) {
ee2
)

ee2.on('other-event-1', function() {
ee2.on('other-event-1', () => {
t.ok(true, 'event 1 received')
})

ee2.on('other-event-2', function(a, b, c) {
ee2.on('other-event-2', (a, b, c) => {
t.ok(true, 'event 2 received')
})

ee2.on('event-3', function(a, b, c) {
ee2.on('event-3', (a, b, c) => {
t.ok(false, 'event 3 should not have been received')
})

ee1.emit('event-1')
ee1.emit('event-2')
ee1.emit('event-3')
t.true(ee1.emit('event-1'))
t.true(ee1.emit('event-2'))
t.false(ee1.emit('event-3'))

p.end()

ee1.emit('event-1')
t.false(ee1.emit('event-1'))
})

0 comments on commit 00a2e63

Please sign in to comment.