dynamodb-ts-model
Version:
A DynamoDB model/client with full TypeScript typings
121 lines • 4.76 kB
JavaScript
"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