UNPKG

@scaffoldly/serverless-util

Version:
102 lines 4.52 kB
"use strict"; 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