all files / lib/mixins/ event.js

96.3% Statements 26/27
87.5% Branches 14/16
100% Functions 5/5
96.3% Lines 26/27
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58                33×   33×   33× 33× 31×       33×       33×     33× 132×   132×   37× 37×   37×   37× 81× 81× 81×   81× 83×                  
'use strict';
 
var _ = require('lodash');
var rubberduck = require('rubberduck');
var EventEmitter = require('events').EventEmitter;
var hookObject = require('feathers-commons').hooks.hookObject;
var eventMappings = {
  create: 'created',
  update: 'updated',
  remove: 'removed',
  patch: 'patched'
};
 
module.exports = function (service) {
  var isEmitter = typeof service.on === 'function' &&
    typeof service.emit === 'function';
  var emitter = service._rubberDuck = rubberduck.emitter(service);
 
  Eif (typeof service.mixin === 'function') {
    if(!isEmitter) {
      service.mixin(EventEmitter.prototype);
    }
  }
 
  service._serviceEvents = _.isArray(service.events) ? service.events.slice() : [];
 
  // Pass the Rubberduck error event through
  // TODO deal with error events properly
  emitter.on('error', function (errors) {
    service.emit('serviceError', errors[0]);
  });
 
  _.each(eventMappings, function (event, method) {
    var alreadyEmits = service._serviceEvents.indexOf(event) !== -1;
 
    if (typeof service[method] === 'function' && !alreadyEmits) {
      // The Rubberduck event name (e.g. afterCreate, afterUpdate or afterDestroy)
      var eventName = 'after' + method.charAt(0).toUpperCase() + method.substring(1);
      service._serviceEvents.push(event);
      // Punch the given method
      emitter.punch(method, -1);
      // Pass the event and error event through
      emitter.on(eventName, function (results, args) {
        Eif (!results[0]) { // callback without error
          var hook = hookObject(method, 'after', args);
          var data = Array.isArray(results[1]) ? results[1] : [ results[1] ];
 
          data.forEach(function(current) {
            service.emit(event, current, hook);
          });
        } else {
          service.emit('serviceError', results[0]);
        }
      });
    }
  });
};