@scaffoldly/serverless-util
Version:
Scaffoldly Serverless Helper Functionality
102 lines • 4.52 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.stringToId = exports.Model = exports.handleDynamoDBStreamRecord = exports.unmarshallDynamoDBImage = exports.dynamoDBStreamEventExtractTableName = exports.Table = void 0;
const dynamodb_1 = require("@scaffoldly/dynamodb");
Object.defineProperty(exports, "Model", { enumerable: true, get: function () { return dynamodb_1.Model; } });
const exports_1 = require("./exports");
const constants_1 = require("./constants");
const timeflake_1 = require("timeflake");
const bn_js_1 = __importDefault(require("bn.js"));
const seedrandom_1 = __importDefault(require("seedrandom"));
const aws_1 = require("./exports/aws");
const boolean_1 = require("boolean");
const createTableName = (tableSuffix, serviceName, stage) => {
return `${stage}-${serviceName}${tableSuffix ? `-${tableSuffix}` : ''}`;
};
class Table {
constructor(tableSuffix = '', serviceName = constants_1.SERVICE_NAME, stage = constants_1.STAGE, schema, hashKey, rangeKey, indexes) {
let options = {};
if (stage === 'local') {
options = {
region: process.env.AWS_DEFAULT_REGION || 'localhost',
endpoint: process.env.AWS_ENDPOINT_URL || 'http://localhost:8100',
accessKeyId: process.env.AWS_ACCESS_KEY_ID || 'DEFAULT_ACCESS_KEY',
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY || 'DEFAULT_SECRET',
};
}
this.tableName = createTableName(tableSuffix, serviceName, stage);
this.tableSuffix = tableSuffix;
this.serviceName = serviceName;
this.stage = stage;
this.model = dynamodb_1.define(this.tableName, {
tableName: this.tableName,
hashKey,
rangeKey,
schema,
indexes,
timestamps: true,
});
let dynamodb = new exports_1.AWS.DynamoDB(options);
if (!boolean_1.boolean(aws_1.LOCALSTACK)) {
options = {
endpoint: process.env.AWS_ENDPOINT_URL || 'http://localhost:4566',
};
}
this.model.config({ dynamodb });
}
matches(fullTableName) {
return fullTableName === createTableName(this.tableSuffix, this.serviceName, this.stage);
}
}
exports.Table = Table;
const dynamoDBStreamEventExtractTableName = (eventSourceARN) => {
if (!eventSourceARN) {
return;
}
if (eventSourceARN.indexOf('/') === -1) {
return eventSourceARN.split(':').slice(-1)[0];
}
const parts = eventSourceARN.split('/');
if (parts.length !== 4) {
return;
}
return parts[1];
};
exports.dynamoDBStreamEventExtractTableName = dynamoDBStreamEventExtractTableName;
const unmarshallDynamoDBImage = (image, options) => {
if (!image) {
throw new Error('Unable to unmarshall an empty object');
}
return exports_1.AWS.DynamoDB.Converter.unmarshall(image, options);
};
exports.unmarshallDynamoDBImage = unmarshallDynamoDBImage;
const handleDynamoDBStreamRecord = async (record, handlers) => {
if (!record || !record.dynamodb) {
throw new Error('Invalid record');
}
if (handlers.canHandle(record.dynamodb)) {
if (record.eventName === 'INSERT' && handlers.onInsert) {
return handlers.onInsert(exports.unmarshallDynamoDBImage(record.dynamodb.NewImage));
}
if (record.eventName === 'MODIFY' && handlers.onModify) {
return handlers.onModify(exports.unmarshallDynamoDBImage(record.dynamodb.NewImage), exports.unmarshallDynamoDBImage(record.dynamodb.OldImage));
}
if (record.eventName === 'REMOVE' && handlers.onRemove) {
return handlers.onRemove(exports.unmarshallDynamoDBImage(record.dynamodb.OldImage));
}
}
return null;
};
exports.handleDynamoDBStreamRecord = handleDynamoDBStreamRecord;
const stringToId = (value, version, namespace) => {
const timestamp = Math.abs(seedrandom_1.default(value).int32());
const random = Math.abs(seedrandom_1.default(version).int32());
const id = timeflake_1.from_values(new bn_js_1.default(timestamp), new bn_js_1.default(random));
const suffix = constants_1.STAGE !== 'live' ? constants_1.STAGE : '';
return `${version}.${namespace}${suffix}.${id.base62}`;
};
exports.stringToId = stringToId;
//# sourceMappingURL=db.js.map
;