botframework-s3storage
Version:
This is a library to store botframework bot state to s3
83 lines (82 loc) • 2.31 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const aws_sdk_1 = require("aws-sdk");
class S3Storage {
constructor(bucketName, options = {}) {
this.bucketName = bucketName;
this.s3Client = new aws_sdk_1.S3({
...options,
});
}
async getJsonObject(key) {
const object = await this.s3Client
.getObject({
Bucket: this.bucketName,
Key: key.replace(/\/$/, ''),
})
.promise();
const item = JSON.parse(object.Body.toString());
item.eTag = object.ETag;
return item;
}
async putObject(key, payload) {
return this.s3Client
.putObject({
Bucket: this.bucketName,
Key: key.replace(/\/$/, ''),
Body: JSON.stringify(payload),
})
.promise();
}
async read(keys) {
const data = {};
for (let key of keys) {
try {
data[key] = await this.getJsonObject(key);
}
catch (e) {
// console.log(e);
}
}
return data;
}
async write(changes) {
let oldItem;
for (let key of Object.keys(changes)) {
const newItem = changes[key];
try {
oldItem = await this.getJsonObject(key);
}
catch {
oldItem = false;
}
if (!oldItem || newItem.eTag === '*') {
await this.putObject(key, newItem);
}
else {
if (newItem.eTag === oldItem.eTag) {
await this.putObject(key, newItem);
}
else {
throw new Error(`Storage: error writing "${key}" due to eTag conflict.`);
}
}
}
}
async delete(keys) {
for (let key of keys) {
try {
await this.s3Client
.deleteObject({
Bucket: this.bucketName,
Key: key.replace(/\/$/, ''),
})
.promise();
}
catch (e) {
// console.log(e);
}
}
}
}
exports.default = S3Storage;