UNPKG

heapstash

Version:

HeapStash is a library that allows for easy caching in Node.js, with many advanced features such as TTL, maximum items in memory cache, external cache support, and more.

158 lines 6.41 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; const debug_1 = __importDefault(require("debug")); const primaryDebugGet = (0, debug_1.default)("HeapStash:Plugin:DynamoDB:Get"); const primaryDebugPut = (0, debug_1.default)("HeapStash:Plugin:DynamoDB:Put"); const AWS = require("aws-sdk"); const index_1 = __importDefault(require("./index")); function awsWrapper(func) { if (func.promise) { return func.promise(); } else { return func; } } module.exports = (settings) => { const plugin = new index_1.default(); plugin._ = Object.assign({}, settings); plugin._.primaryKey = plugin._.primaryKey || "id"; plugin._.ttlAttribute = plugin._.ttlAttribute || "ttl"; plugin._.dynamodb = plugin._.dynamodb || new AWS.DynamoDB(); plugin.tasks.get = async (id) => { const getItemRequest = { "Key": { [plugin._.primaryKey]: { "S": id } }, "TableName": plugin._.tableName }; primaryDebugGet("getItem request: %o", getItemRequest); const result = await awsWrapper(plugin._.dynamodb.getItem(getItemRequest)); primaryDebugGet("getItem result: %o", result); const item = AWS.DynamoDB.Converter.unmarshall(result.Item); primaryDebugGet("unmarshall: %o", item); if (item[plugin._.ttlAttribute]) { item.ttl = item[plugin._.ttlAttribute] * 1000; } if (plugin._.ttlAttribute !== "ttl") { delete item[plugin._.ttlAttribute]; } if ((item._ || {}).stringified) { item.data = JSON.parse(item.data); } delete item._; primaryDebugGet("return item: %o", item); return item; }; plugin.tasks.put = async (id, data) => { data = Object.assign({}, data); if (data.ttl) { data.ttl = Math.round(data.ttl / 1000); } if (plugin._.ttlAttribute !== "ttl") { data[plugin._.ttlAttribute] = data.ttl; delete data.ttl; } try { if (Array.isArray(id)) { await awsWrapper(plugin._.dynamodb.batchWriteItem({ "RequestItems": { [plugin._.tableName]: id.map((id) => { return { "PutRequest": { "Item": AWS.DynamoDB.Converter.marshall(Object.assign(Object.assign({}, data), { [plugin._.primaryKey]: id })) } }; }) } })); } else { const dynamoObject = AWS.DynamoDB.Converter.marshall(Object.assign(Object.assign({}, data), { [plugin._.primaryKey]: id })); primaryDebugPut("marshalled object: %o", dynamoObject); const putItemRequest = { "Item": dynamoObject, "TableName": plugin._.tableName }; primaryDebugPut("putItem request: %o", putItemRequest); await awsWrapper(plugin._.dynamodb.putItem(putItemRequest)); } } catch (e) { if (e.code === "ValidationException") { if (Array.isArray(id)) { await awsWrapper(plugin._.dynamodb.batchWriteItem({ "RequestItems": { [plugin._.tableName]: id.map((id) => { const dynamoPreObject = { "data": JSON.stringify(data.data), "_": { "stringified": true }, [plugin._.primaryKey]: id }; if (data[plugin._.ttlAttribute]) { dynamoPreObject[plugin._.ttlAttribute] = data[plugin._.ttlAttribute]; } return { "PutRequest": { "Item": AWS.DynamoDB.Converter.marshall(dynamoPreObject) } }; }) } })); } else { const dynamoPreObject = { "data": JSON.stringify(data.data), "_": { "stringified": true }, [plugin._.primaryKey]: id }; if (data[plugin._.ttlAttribute]) { dynamoPreObject[plugin._.ttlAttribute] = data[plugin._.ttlAttribute]; } const dynamoObject = AWS.DynamoDB.Converter.marshall(dynamoPreObject); await awsWrapper(plugin._.dynamodb.putItem({ "Item": dynamoObject, "TableName": plugin._.tableName })); } } else { throw e; } } }; plugin.tasks.remove = (id) => { return awsWrapper(plugin._.dynamodb.deleteItem({ "Key": { [plugin._.primaryKey]: { "S": id } }, "TableName": plugin._.tableName })); }; plugin.tasks.clear = async () => { let items = [], lastEvaluatedKey; do { const obj = { "TableName": plugin._.tableName }; if (lastEvaluatedKey) { obj.ExclusiveStartKey = lastEvaluatedKey; } const res = await awsWrapper(plugin._.dynamodb.scan(obj)); items = [...items, ...res.Items]; lastEvaluatedKey = res.LastEvaluatedKey; } while (lastEvaluatedKey); await Promise.all(items.map((item) => item.id).map((id) => awsWrapper(plugin._.dynamodb.deleteItem({ "Key": { id }, "TableName": plugin._.tableName })))); }; return plugin; }; //# sourceMappingURL=DynamoDB.js.map