UNPKG

dynamodb-ts-model

Version:

A DynamoDB model/client with full TypeScript typings

121 lines 4.76 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DynamoWriteTransaction = exports.DynamoGetTransaction = exports.DynamoTransaction = exports.DynamoTransactionProxy = void 0; const lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb"); const DynamoWrapper_1 = require("./DynamoWrapper"); const requests_1 = require("./requests"); const utils_1 = require("./utils"); class DynamoTransactionProxy extends DynamoWrapper_1.DynamoWrapper { put(model, ...paramsList) { return new DynamoWriteTransaction(this.client, this.name).put(model, ...paramsList); } update(model, ...paramsList) { return new DynamoWriteTransaction(this.client, this.name).update(model, ...paramsList); } delete(model, ...paramsList) { return new DynamoWriteTransaction(this.client, this.name).delete(model, ...paramsList); } get(model, ...paramsList) { return new DynamoGetTransaction(this.client, this.name).get(model, ...paramsList); } } exports.DynamoTransactionProxy = DynamoTransactionProxy; class DynamoTransaction extends DynamoWrapper_1.DynamoWrapper { static isTransactionCancelled(err) { return (err === null || err === void 0 ? void 0 : err.name) === 'TransactionCanceledException'; } static conditionalCheckFailed(err) { var _a; return !!(DynamoTransaction.isTransactionCancelled(err) && ((_a = err.CancellationReasons) === null || _a === void 0 ? void 0 : _a.some(r => r.Code === 'ConditionalCheckFailed'))); } /** * Check if the most recent commit threw a transaction cancelled error, e.g. due to conditions failing or * concurrency constraints not being fulfilled. */ isTransactionCancelled() { return DynamoTransaction.isTransactionCancelled(this.err); } /** * Check if the most recent commit threw an error containing at least one failed condition check */ conditionalCheckFailed() { return DynamoTransaction.conditionalCheckFailed(this.err); } } exports.DynamoTransaction = DynamoTransaction; class DynamoGetTransaction extends DynamoTransaction { constructor() { super(...arguments); this.items = []; } get(model, ...paramsList) { this.items.push(...paramsList.map(params => ({ Get: (0, requests_1.createGetRequest)(model, params) }))); return this; } async commit() { try { await this.command(new lib_dynamodb_1.TransactGetCommand({ TransactItems: this.items, ReturnConsumedCapacity: (0, requests_1.getReturnedConsumedCapacity)(this) })); } catch (err) { this.err = err; throw err; } } } exports.DynamoGetTransaction = DynamoGetTransaction; class DynamoWriteTransaction extends DynamoTransaction { constructor() { super(...arguments); this.items = []; this.modelMap = new Map(); } put(model, ...paramsList) { this.items.push(...paramsList.map(params => ({ Put: (0, requests_1.createPutRequest)(model, params) }))); this.modelMap.set(model.tableName, model); return this; } update(model, ...paramsList) { this.items.push(...paramsList.map(params => ({ Update: (0, requests_1.createUpdateRequest)(model, params) }))); this.modelMap.set(model.tableName, model); return this; } delete(model, ...paramsList) { this.items.push(...paramsList.map(params => ({ Delete: (0, requests_1.createDeleteRequest)(model, params) }))); this.modelMap.set(model.tableName, model); return this; } condition(model, ...paramsList) { this.items.push(...paramsList.map(params => ({ ConditionCheck: (0, requests_1.createConditionCheckRequest)(model, params) }))); return this; } async commit(token) { try { await this.command(new lib_dynamodb_1.TransactWriteCommand({ TransactItems: this.items, ClientRequestToken: token, ReturnConsumedCapacity: (0, requests_1.getReturnedConsumedCapacity)(this) })); } catch (err) { this.err = err; throw err; } this.items.forEach(item => { const { tableName, key, command } = (0, utils_1.parseRequest)(item); const model = this.modelMap.get(tableName); model === null || model === void 0 ? void 0 : model.params.triggers.forEach(trigger => trigger(key, command, model)); }); } } exports.DynamoWriteTransaction = DynamoWriteTransaction; //# sourceMappingURL=DynamoTransaction.js.map