UNPKG

@incdevco/framework

Version:
155 lines (79 loc) 2.84 kB
'use strict'; var Logger = require('../logger'); var Promise = require('bluebird'); class TableStreamListener { constructor(logger) { this.handlers = {}; this.logger = logger || new Logger(); } attributeToData(attribute) { if (attribute.BOOL) { return attribute.BOOL; } else if (attribute.L) { var array = new Array(attribute.L.length), self = this; attribute.L.forEach(function (item, index) { array[index] = self.attributeToData(item); }); return array; } else if (attribute.M) { return this.itemToObject(attribute.M); } else if (attribute.N) { return parseFloat(attribute.N); } else if (attribute.NULL) { return null; } else if (attribute.S) { return attribute.S; } else { return undefined; } } getTableName(record) { return record.eventSourceARN.split('/')[1]; } handleEvent(event) { var promise = Promise.resolve(true); var self = this; event.Records.forEach(function (record, index) { promise = promise.then(function () { return self.handleRecord(record) .catch(function (exception) { exception.recordIndex = index; throw exception; }); }); }); return promise; } handleRecord(record) { var self = this; return Promise.try(function () { var eventName = record.eventName; var key, newImage, oldImage; var tableName = self.getTableName(record); if (!self.handlers[tableName]) { self.logger.log('no handlers for ' + tableName); return false; } if (!self.handlers[tableName][eventName]) { self.logger.log('no handler for ' + tableName + '.' + eventName); return false; } key = self.itemToObject(record.dynamodb.Keys); if (record.dynamodb.NewImage) { newImage = self.itemToObject(record.dynamodb.NewImage); } if (record.dynamodb.OldImage) { oldImage = self.itemToObject(record.dynamodb.OldImage); } return self.handlers[tableName][eventName](key, newImage, oldImage, record); }); } itemToObject(item) { var obj = {}, self = this; Object.keys(item).forEach(function (key) { obj[key] = self.attributeToData(item[key]); }); return obj; } } module.exports = TableStreamListener;