@incdevco/framework
Version:
node.js lambda framework
155 lines (79 loc) • 2.84 kB
JavaScript
;
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;