UNPKG

botframework-s3storage

Version:

This is a library to store botframework bot state to s3

83 lines (82 loc) 2.31 kB
"use strict"; 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;