-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathindex.js
77 lines (68 loc) · 2.4 KB
/
index.js
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
'use strict'
/**
* DynamoDB Streams Processor: A simple tool for working with DynamoDB Streams
* @author Jeremy Daly <[email protected]>
* @license MIT
*/
// Require the DynamoDB library and Converter
require('aws-sdk/clients/dynamodb')
const converter = require('aws-sdk/lib/dynamodb/converter')
// Require Set for instanceof comparison
const Set = require('aws-sdk/lib/dynamodb/set')
// Require deep-object-diff library for comparing records
const { diff, addedDiff, deletedDiff, detailedDiff, updatedDiff } = require('deep-object-diff')
// Export main function
module.exports = (records,diffType=false,options={}) => {
if (Array.isArray(records)) {
return records.map(rec => {
// unmarshall dynamodb items if they exist
let Keys = rec.dynamodb && rec.dynamodb.Keys ? unmarshall(rec.dynamodb.Keys,options) : {}
let NewImage = rec.dynamodb && rec.dynamodb.NewImage ? unmarshall(rec.dynamodb.NewImage,options) : {}
let OldImage = rec.dynamodb && rec.dynamodb.OldImage ? unmarshall(rec.dynamodb.OldImage,options) : {}
// return new record with unmarshalled items
return Object.assign(
{},
rec,
rec.dynamodb ? {
dynamodb: Object.assign(
{},
rec.dynamodb,
{ Keys }, // should always be there
rec.dynamodb.NewImage ? { NewImage } : {},
rec.dynamodb.OldImage ? { OldImage } : {},
diffType ? { Diff: compare(OldImage,NewImage,diffType) } : {}
)
} : {}
)
})
} else {
throw 'records must be an array'
}
}
// unmarshalls the object and converts sets into arrays
const unmarshall = (obj,options) => {
// unmarshall the object
let item = converter.unmarshall(obj,options)
// check each top level key for sets and convert appropriately
return options.wrapSets ? item
: Object.keys(item).reduce((acc,key) => {
return Object.assign(acc,{
[key]: item[key] instanceof Set ? item[key].values : item[key]
})
},{})
}
// Use deep-object-diff to compare records
const compare = (OldImage,NewImage,diffType) => {
switch(diffType) {
case 'added':
return addedDiff(OldImage,NewImage)
case 'deleted':
return deletedDiff(OldImage,NewImage)
case 'updated':
return updatedDiff(OldImage,NewImage)
case 'detailed':
return detailedDiff(OldImage,NewImage)
default:
return diff(OldImage,NewImage)
}
}