UNPKG

2.08 kBJavaScriptView Raw
1var async = require('async')
2var _ = require('lodash')
3var errback = require('serialize-error')
4
5function trigger(types) {
6 return function() {
7
8 // grab all the functions
9 var fns = [].slice.call(arguments, 0)
10
11 // fail loudly for programmer not passing anything
12 if (fns.length === 0) {
13 throw Error('lambda requires at least one callback function')
14 }
15 // fail loud if the programmer passes something other than a fn
16 var notOnlyFns = _.reject(fns, _.isFunction)
17 if (notOnlyFns.length) {
18 throw Error('lambda only accepts callback functions as arguments')
19 }
20
21 // return an AWS Lambda fn sig
22 return function(event, context) {
23
24 // fail if there's no records
25 if (!event.Records) {
26 throw Error('event.Records is undefined')
27 }
28
29 // construct handlers for each record
30 var handlers = event.Records.map(function(record) {
31 // pass the record to the handler chain
32 var locals = fns.slice()
33 locals.unshift(function(callback) {
34 callback(null, record)
35 })
36 return function(callback) {
37 // if isInvoking we invoke the handler with the record
38 var isInvoking = types.indexOf(event.eventName) > -1
39 if (isInvoking) {
40 async.waterfall(locals, callback)
41 }
42 else {
43 callback() // if not we just call the continuation (callback)
44 }
45 }
46 })
47
48 // execute the handlers in parallel for all the records
49 async.parallel(handlers, function done(err, result) {
50 if (err) {
51 var errors = (_.isArray(err)? err : [err]).map(errback)
52 context.succeed({ok:false, errors:errors})
53 }
54 else {
55 context.succeed(result)
56 }
57 })
58 }
59 }
60}
61
62module.exports = {
63 insert: trigger(['INSERT' ]),
64 modify: trigger(['MODIFY' ]),
65 remove: trigger(['REMOVE' ]),
66 save: trigger(['INSERT', 'MODIFY' ]),
67 all: trigger(['INSERT', 'MODIFY', 'REMOVE'])
68}