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
JavaScript
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
;