serverless-simple-middleware 0.0.60 → 0.0.62

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/.nvmrc +1 -0
  2. package/README.md +0 -1
  3. package/dist/aws/config.d.ts +2 -2
  4. package/dist/aws/config.js +6 -4
  5. package/dist/aws/define.d.ts +0 -12
  6. package/dist/aws/define.js +2 -1
  7. package/dist/aws/index.js +17 -6
  8. package/dist/aws/simple.d.ts +22 -17
  9. package/dist/aws/simple.js +334 -227
  10. package/dist/index.js +17 -6
  11. package/dist/internal/AwsError.d.ts +5 -0
  12. package/dist/internal/AwsError.js +33 -0
  13. package/dist/internal/s3.d.ts +38 -0
  14. package/dist/internal/s3.js +2 -0
  15. package/dist/middleware/aws.d.ts +2 -2
  16. package/dist/middleware/aws.js +12 -9
  17. package/dist/middleware/base.d.ts +8 -8
  18. package/dist/middleware/base.js +9 -8
  19. package/dist/middleware/build.d.ts +1 -1
  20. package/dist/middleware/build.js +68 -45
  21. package/dist/middleware/index.d.ts +2 -2
  22. package/dist/middleware/index.js +20 -8
  23. package/dist/middleware/logger.js +8 -4
  24. package/dist/middleware/mysql.d.ts +3 -3
  25. package/dist/middleware/mysql.js +17 -13
  26. package/dist/middleware/trace.d.ts +2 -2
  27. package/dist/middleware/trace.js +21 -21
  28. package/dist/utils/index.js +16 -5
  29. package/dist/utils/logger.d.ts +3 -3
  30. package/dist/utils/logger.js +9 -7
  31. package/dist/utils/misc.d.ts +1 -1
  32. package/dist/utils/misc.js +10 -3
  33. package/package.json +18 -10
  34. package/src/aws/config.ts +1 -1
  35. package/src/aws/define.ts +0 -19
  36. package/src/aws/simple.ts +326 -204
  37. package/src/internal/AwsError.ts +13 -0
  38. package/src/internal/s3.ts +75 -0
  39. package/src/middleware/aws.ts +1 -1
  40. package/src/middleware/base.ts +5 -4
  41. package/src/middleware/build.ts +31 -31
  42. package/src/middleware/mysql.ts +11 -7
  43. package/src/middleware/trace.ts +15 -19
  44. package/src/utils/misc.ts +11 -2
@@ -11,10 +11,11 @@ var __assign = (this && this.__assign) || function () {
11
11
  return __assign.apply(this, arguments);
12
12
  };
13
13
  var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
15
  return new (P || (P = Promise))(function (resolve, reject) {
15
16
  function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
17
  function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
- function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
19
  step((generator = generator.apply(thisArg, _arguments || [])).next());
19
20
  });
20
21
  };
@@ -24,7 +25,7 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
24
25
  function verb(n) { return function (v) { return step([n, v]); }; }
25
26
  function step(op) {
26
27
  if (f) throw new TypeError("Generator is already executing.");
27
- while (_) try {
28
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
29
  if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
30
  if (y = 0, t) op = [op[0] & 2, t.value];
30
31
  switch (op[0]) {
@@ -45,18 +46,36 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
45
46
  if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
47
  }
47
48
  };
49
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
50
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
51
+ if (ar || !(i in from)) {
52
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
53
+ ar[i] = from[i];
54
+ }
55
+ }
56
+ return to.concat(ar || Array.prototype.slice.call(from));
57
+ };
48
58
  Object.defineProperty(exports, "__esModule", { value: true });
49
- var AWS = require("aws-sdk"); // tslint:disable-line
59
+ exports.SimpleAWS = void 0;
60
+ var cloudfront_signer_1 = require("@aws-sdk/cloudfront-signer");
61
+ var simple_staging_1 = require("simple-staging");
50
62
  var fs = require("fs");
51
63
  var os = require("os");
52
64
  var non_secure_1 = require("nanoid/non-secure");
53
65
  var utils_1 = require("../utils");
54
66
  var config_1 = require("./config");
55
67
  var define_1 = require("./define");
56
- var logger = utils_1.getLogger(__filename);
68
+ var client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
69
+ var client_s3_1 = require("@aws-sdk/client-s3");
70
+ var client_sqs_1 = require("@aws-sdk/client-sqs");
71
+ var lib_dynamodb_1 = require("@aws-sdk/lib-dynamodb");
72
+ var s3_request_presigner_1 = require("@aws-sdk/s3-request-presigner");
73
+ var lib_storage_1 = require("@aws-sdk/lib-storage");
74
+ var logger = (0, utils_1.getLogger)(__filename);
57
75
  var SimpleAWS = /** @class */ (function () {
58
76
  function SimpleAWS(config) {
59
77
  var _this = this;
78
+ this.queueUrls = {};
60
79
  this.getQueueUrl = function (queueName) { return __awaiter(_this, void 0, void 0, function () {
61
80
  var urlResult;
62
81
  return __generator(this, function (_a) {
@@ -65,16 +84,14 @@ var SimpleAWS = /** @class */ (function () {
65
84
  if (this.queueUrls[queueName] !== undefined) {
66
85
  return [2 /*return*/, this.queueUrls[queueName]];
67
86
  }
68
- return [4 /*yield*/, this.sqs
69
- .getQueueUrl({
87
+ return [4 /*yield*/, this.sqs.getQueueUrl({
70
88
  QueueName: queueName,
71
- })
72
- .promise()];
89
+ })];
73
90
  case 1:
74
91
  urlResult = _a.sent();
75
92
  logger.stupid("urlResult", urlResult);
76
93
  if (!urlResult.QueueUrl) {
77
- throw new Error("No queue url with name[" + queueName + "]");
94
+ throw new Error("No queue url with name[".concat(queueName, "]"));
78
95
  }
79
96
  return [2 /*return*/, (this.queueUrls[queueName] = urlResult.QueueUrl)];
80
97
  }
@@ -82,73 +99,72 @@ var SimpleAWS = /** @class */ (function () {
82
99
  }); };
83
100
  this.enqueue = function (queueName, data) { return __awaiter(_this, void 0, void 0, function () {
84
101
  var queueUrl, sendResult, attrResult;
85
- return __generator(this, function (_a) {
86
- switch (_a.label) {
102
+ var _a;
103
+ return __generator(this, function (_b) {
104
+ switch (_b.label) {
87
105
  case 0:
88
- logger.debug("Send message[" + data.key + "] to queue.");
106
+ logger.debug("Send message[".concat(data.key, "] to queue."));
89
107
  logger.stupid("data", data);
90
108
  return [4 /*yield*/, this.getQueueUrl(queueName)];
91
109
  case 1:
92
- queueUrl = _a.sent();
93
- return [4 /*yield*/, this.sqs
94
- .sendMessage({
110
+ queueUrl = _b.sent();
111
+ return [4 /*yield*/, this.sqs.sendMessage({
95
112
  QueueUrl: queueUrl,
96
113
  MessageBody: JSON.stringify(data),
97
114
  DelaySeconds: 0,
98
- })
99
- .promise()];
115
+ })];
100
116
  case 2:
101
- sendResult = _a.sent();
117
+ sendResult = _b.sent();
102
118
  logger.stupid("sendResult", sendResult);
103
- return [4 /*yield*/, this.sqs
104
- .getQueueAttributes({
119
+ return [4 /*yield*/, this.sqs.getQueueAttributes({
105
120
  QueueUrl: queueUrl,
106
121
  AttributeNames: ['ApproximateNumberOfMessages'],
107
- })
108
- .promise()];
122
+ })];
109
123
  case 3:
110
- attrResult = _a.sent();
124
+ attrResult = _b.sent();
111
125
  logger.stupid("attrResult", attrResult);
112
126
  if (!attrResult.Attributes) {
113
127
  return [2 /*return*/, 0];
114
128
  }
115
- return [2 /*return*/, +attrResult.Attributes.ApproximateNumberOfMessages];
129
+ return [2 /*return*/, +(((_a = attrResult.Attributes) === null || _a === void 0 ? void 0 : _a.ApproximateNumberOfMessages) || 0)];
116
130
  }
117
131
  });
118
132
  }); };
119
- this.dequeue = function (queueName, fetchSize, waitSeconds, visibilityTimeout) {
120
- if (fetchSize === void 0) { fetchSize = 1; }
121
- if (waitSeconds === void 0) { waitSeconds = 1; }
122
- if (visibilityTimeout === void 0) { visibilityTimeout = 15; }
123
- return __awaiter(_this, void 0, void 0, function () {
124
- var queueUrl, receiveResult, data, _i, _a, each, message;
125
- return __generator(this, function (_b) {
126
- switch (_b.label) {
133
+ this.dequeue = function (queueName_1) {
134
+ var args_1 = [];
135
+ for (var _i = 1; _i < arguments.length; _i++) {
136
+ args_1[_i - 1] = arguments[_i];
137
+ }
138
+ return __awaiter(_this, __spreadArray([queueName_1], args_1, true), void 0, function (queueName, fetchSize, waitSeconds, visibilityTimeout) {
139
+ var queueUrl, receiveResult, data, _a, _b, each, message;
140
+ if (fetchSize === void 0) { fetchSize = 1; }
141
+ if (waitSeconds === void 0) { waitSeconds = 1; }
142
+ if (visibilityTimeout === void 0) { visibilityTimeout = 15; }
143
+ return __generator(this, function (_c) {
144
+ switch (_c.label) {
127
145
  case 0:
128
- logger.debug("Receive message from queue[" + queueName + "].");
146
+ logger.debug("Receive message from queue[".concat(queueName, "]."));
129
147
  return [4 /*yield*/, this.getQueueUrl(queueName)];
130
148
  case 1:
131
- queueUrl = _b.sent();
132
- return [4 /*yield*/, this.sqs
133
- .receiveMessage({
149
+ queueUrl = _c.sent();
150
+ return [4 /*yield*/, this.sqs.receiveMessage({
134
151
  QueueUrl: queueUrl,
135
152
  MaxNumberOfMessages: fetchSize,
136
153
  WaitTimeSeconds: waitSeconds,
137
154
  VisibilityTimeout: visibilityTimeout,
138
- })
139
- .promise()];
155
+ })];
140
156
  case 2:
141
- receiveResult = _b.sent();
157
+ receiveResult = _c.sent();
142
158
  logger.stupid("receiveResult", receiveResult);
143
159
  if (receiveResult.Messages === undefined ||
144
160
  receiveResult.Messages.length === 0) {
145
161
  return [2 /*return*/, []];
146
162
  }
147
163
  data = [];
148
- for (_i = 0, _a = receiveResult.Messages; _i < _a.length; _i++) {
149
- each = _a[_i];
164
+ for (_a = 0, _b = receiveResult.Messages; _a < _b.length; _a++) {
165
+ each = _b[_a];
150
166
  if (!each.ReceiptHandle) {
151
- logger.warn("No receipt handler: " + JSON.stringify(each));
167
+ logger.warn("No receipt handler: ".concat(JSON.stringify(each)));
152
168
  continue;
153
169
  }
154
170
  message = {
@@ -157,33 +173,37 @@ var SimpleAWS = /** @class */ (function () {
157
173
  };
158
174
  data.push(message);
159
175
  }
160
- logger.verbose("Receive a message[" + JSON.stringify(data) + "] from queue");
176
+ logger.verbose("Receive a message[".concat(JSON.stringify(data), "] from queue"));
161
177
  return [2 /*return*/, data];
162
178
  }
163
179
  });
164
180
  });
165
181
  };
166
- this.dequeueAll = function (queueName, limitSize, visibilityTimeout) {
167
- if (limitSize === void 0) { limitSize = Number.MAX_VALUE; }
168
- if (visibilityTimeout === void 0) { visibilityTimeout = 15; }
169
- return __awaiter(_this, void 0, void 0, function () {
170
- var messages, maxFetchSize, eachOfMessages, _i, eachOfMessages_1, each;
171
- return __generator(this, function (_a) {
172
- switch (_a.label) {
182
+ this.dequeueAll = function (queueName_1) {
183
+ var args_1 = [];
184
+ for (var _i = 1; _i < arguments.length; _i++) {
185
+ args_1[_i - 1] = arguments[_i];
186
+ }
187
+ return __awaiter(_this, __spreadArray([queueName_1], args_1, true), void 0, function (queueName, limitSize, visibilityTimeout) {
188
+ var messages, maxFetchSize, eachOfMessages, _a, eachOfMessages_1, each;
189
+ if (limitSize === void 0) { limitSize = Number.MAX_VALUE; }
190
+ if (visibilityTimeout === void 0) { visibilityTimeout = 15; }
191
+ return __generator(this, function (_b) {
192
+ switch (_b.label) {
173
193
  case 0:
174
194
  messages = [];
175
195
  maxFetchSize = 10;
176
- _a.label = 1;
196
+ _b.label = 1;
177
197
  case 1:
178
198
  if (!(messages.length < limitSize)) return [3 /*break*/, 3];
179
199
  return [4 /*yield*/, this.dequeue(queueName, Math.min(limitSize - messages.length, maxFetchSize), 0, visibilityTimeout)];
180
200
  case 2:
181
- eachOfMessages = _a.sent();
201
+ eachOfMessages = _b.sent();
182
202
  if (!eachOfMessages || eachOfMessages.length === 0) {
183
203
  return [3 /*break*/, 3];
184
204
  }
185
- for (_i = 0, eachOfMessages_1 = eachOfMessages; _i < eachOfMessages_1.length; _i++) {
186
- each = eachOfMessages_1[_i];
205
+ for (_a = 0, eachOfMessages_1 = eachOfMessages; _a < eachOfMessages_1.length; _a++) {
206
+ each = eachOfMessages_1[_a];
187
207
  messages.push(each);
188
208
  }
189
209
  return [3 /*break*/, 1];
@@ -195,32 +215,23 @@ var SimpleAWS = /** @class */ (function () {
195
215
  });
196
216
  };
197
217
  this.retainMessage = function (queueName, handle, seconds) { return __awaiter(_this, void 0, void 0, function () {
198
- var _this = this;
218
+ var queueUrl;
199
219
  return __generator(this, function (_a) {
200
- return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
201
- var _this = this;
202
- return __generator(this, function (_a) {
203
- logger.debug("Change visibilityTimeout of " + handle + " to " + seconds + "secs.");
204
- this.getQueueUrl(queueName)
205
- .then(function (queueUrl) {
206
- _this.sqs.changeMessageVisibility({
207
- QueueUrl: queueUrl,
208
- ReceiptHandle: handle,
209
- VisibilityTimeout: seconds,
210
- }, function (err, changeResult) {
211
- if (err) {
212
- reject(err);
213
- }
214
- else {
215
- logger.stupid("changeResult", changeResult);
216
- resolve(handle);
217
- }
218
- });
219
- })
220
- .catch(reject);
221
- return [2 /*return*/];
222
- });
223
- }); })];
220
+ switch (_a.label) {
221
+ case 0:
222
+ logger.debug("Change visibilityTimeout of ".concat(handle, " to ").concat(seconds, "secs."));
223
+ return [4 /*yield*/, this.getQueueUrl(queueName)];
224
+ case 1:
225
+ queueUrl = _a.sent();
226
+ return [4 /*yield*/, this.sqs.changeMessageVisibility({
227
+ QueueUrl: queueUrl,
228
+ ReceiptHandle: handle,
229
+ VisibilityTimeout: seconds,
230
+ })];
231
+ case 2:
232
+ _a.sent();
233
+ return [2 /*return*/, handle];
234
+ }
224
235
  });
225
236
  }); };
226
237
  this.completeMessage = function (queueName, handle) { return __awaiter(_this, void 0, void 0, function () {
@@ -228,16 +239,14 @@ var SimpleAWS = /** @class */ (function () {
228
239
  return __generator(this, function (_a) {
229
240
  switch (_a.label) {
230
241
  case 0:
231
- logger.debug("Complete a message with handle[" + handle + "]");
242
+ logger.debug("Complete a message with handle[".concat(handle, "]"));
232
243
  return [4 /*yield*/, this.getQueueUrl(queueName)];
233
244
  case 1:
234
245
  queueUrl = _a.sent();
235
- return [4 /*yield*/, this.sqs
236
- .deleteMessage({
246
+ return [4 /*yield*/, this.sqs.deleteMessage({
237
247
  QueueUrl: queueUrl,
238
248
  ReceiptHandle: handle,
239
- })
240
- .promise()];
249
+ })];
241
250
  case 2:
242
251
  deleteResult = _a.sent();
243
252
  logger.stupid("deleteResult", deleteResult);
@@ -250,7 +259,7 @@ var SimpleAWS = /** @class */ (function () {
250
259
  return __generator(this, function (_a) {
251
260
  switch (_a.label) {
252
261
  case 0:
253
- logger.debug("Complete a message with handle[" + handles + "]");
262
+ logger.debug("Complete a message with handle[".concat(handles, "]"));
254
263
  if (!handles) {
255
264
  return [2 /*return*/, handles];
256
265
  }
@@ -265,15 +274,13 @@ var SimpleAWS = /** @class */ (function () {
265
274
  return [4 /*yield*/, this.getQueueUrl(queueName)];
266
275
  case 2:
267
276
  queueUrl = _a.sent();
268
- return [4 /*yield*/, this.sqs
269
- .deleteMessageBatch({
277
+ return [4 /*yield*/, this.sqs.deleteMessageBatch({
270
278
  QueueUrl: queueUrl,
271
279
  Entries: sublist.map(function (handle) { return ({
272
280
  Id: (++index).toString(),
273
281
  ReceiptHandle: handle,
274
282
  }); }),
275
- })
276
- .promise()];
283
+ })];
277
284
  case 3:
278
285
  deletesResult = _a.sent();
279
286
  logger.stupid("deleteResult", deletesResult);
@@ -286,19 +293,22 @@ var SimpleAWS = /** @class */ (function () {
286
293
  });
287
294
  }); };
288
295
  this.download = function (bucket, key, localPath) { return __awaiter(_this, void 0, void 0, function () {
289
- var stream;
296
+ var Body;
290
297
  return __generator(this, function (_a) {
291
- logger.debug("Get a stream of item[" + key + "] from bucket[" + bucket + "]");
292
- stream = this.s3
293
- .getObject({ Bucket: bucket, Key: key })
294
- .createReadStream();
295
- return [2 /*return*/, new Promise(function (resolve, reject) {
296
- return stream
297
- .on('error', function (error) { return reject(error); })
298
- .pipe(fs.createWriteStream(localPath))
299
- .on('finish', function () { return resolve(localPath); })
300
- .on('error', function (error) { return reject(error); });
301
- })];
298
+ switch (_a.label) {
299
+ case 0:
300
+ logger.debug("Get a stream of item[".concat(key, "] from bucket[").concat(bucket, "]"));
301
+ return [4 /*yield*/, this.s3.getObject({ Bucket: bucket, Key: key })];
302
+ case 1:
303
+ Body = (_a.sent()).Body;
304
+ return [2 /*return*/, new Promise(function (resolve, reject) {
305
+ return Body
306
+ .on('error', function (error) { return reject(error); })
307
+ .pipe(fs.createWriteStream(localPath))
308
+ .on('finish', function () { return resolve(localPath); })
309
+ .on('error', function (error) { return reject(error); });
310
+ })];
311
+ }
302
312
  });
303
313
  }); };
304
314
  this.readFile = function (bucket, key) { return __awaiter(_this, void 0, void 0, function () {
@@ -306,8 +316,8 @@ var SimpleAWS = /** @class */ (function () {
306
316
  return __generator(this, function (_a) {
307
317
  switch (_a.label) {
308
318
  case 0:
309
- logger.debug("Read item[" + key + "] from bucket[" + bucket + "]");
310
- tempFile = os.tmpdir() + "/" + non_secure_1.nanoid();
319
+ logger.debug("Read item[".concat(key, "] from bucket[").concat(bucket, "]"));
320
+ tempFile = "".concat(os.tmpdir(), "/").concat((0, non_secure_1.nanoid)());
311
321
  _a.label = 1;
312
322
  case 1:
313
323
  _a.trys.push([1, , 4, 9]);
@@ -331,7 +341,7 @@ var SimpleAWS = /** @class */ (function () {
331
341
  return [3 /*break*/, 8];
332
342
  case 7:
333
343
  error_1 = _a.sent();
334
- logger.error("Failed to delete temp file " + tempFile + ": " + utils_1.stringifyError(error_1));
344
+ logger.error("Failed to delete temp file ".concat(tempFile, ": ").concat((0, utils_1.stringifyError)(error_1)));
335
345
  return [3 /*break*/, 8];
336
346
  case 8: return [7 /*endfinally*/];
337
347
  case 9: return [2 /*return*/];
@@ -339,111 +349,112 @@ var SimpleAWS = /** @class */ (function () {
339
349
  });
340
350
  }); };
341
351
  this.readFileBuffer = function (bucket, key) { return __awaiter(_this, void 0, void 0, function () {
342
- var params, data;
352
+ var Body, buffer;
343
353
  return __generator(this, function (_a) {
344
354
  switch (_a.label) {
345
355
  case 0:
346
- logger.debug("Read item[" + key + "] from bucket[" + bucket + "]");
347
- params = {
348
- Bucket: bucket,
349
- Key: key,
350
- };
351
- return [4 /*yield*/, this.s3.getObject(params).promise()];
356
+ logger.debug("Read item[".concat(key, "] from bucket[").concat(bucket, "]"));
357
+ return [4 /*yield*/, this.s3.getObject({ Bucket: bucket, Key: key })];
352
358
  case 1:
353
- data = _a.sent();
354
- if (data.Body) {
355
- return [2 /*return*/, data.Body];
356
- }
357
- else {
358
- throw new Error("Failed to read file " + key + " from bucket " + bucket);
359
+ Body = (_a.sent()).Body;
360
+ return [4 /*yield*/, (Body === null || Body === void 0 ? void 0 : Body.transformToByteArray())];
361
+ case 2:
362
+ buffer = _a.sent();
363
+ if (!buffer) {
364
+ throw new Error("Failed to read file ".concat(key, " from bucket ").concat(bucket));
359
365
  }
360
- return [2 /*return*/];
366
+ return [2 /*return*/, Buffer.from(buffer)];
361
367
  }
362
368
  });
363
369
  }); };
364
- this.upload = function (bucket, localPath, key) { return __awaiter(_this, void 0, void 0, function () {
365
- var putResult;
370
+ this.upload = function (bucket, localPath, key, tags) { return __awaiter(_this, void 0, void 0, function () {
371
+ var upload;
366
372
  return __generator(this, function (_a) {
367
373
  switch (_a.label) {
368
374
  case 0:
369
- logger.debug("Upload item[" + key + "] into bucket[" + bucket + "]");
370
- return [4 /*yield*/, this.s3
371
- .upload({
375
+ logger.debug("Upload item[".concat(key, "] into bucket[").concat(bucket, "]"));
376
+ upload = new lib_storage_1.Upload({
377
+ client: this.s3,
378
+ params: {
372
379
  Bucket: bucket,
373
380
  Key: key,
374
381
  Body: fs.createReadStream(localPath),
375
- })
376
- .promise()];
382
+ },
383
+ partSize: 5 * 1024 * 1024, // 5MB
384
+ queueSize: 4,
385
+ tags: __spreadArray([SimpleAWS.stageTag], (tags || []), true),
386
+ });
387
+ return [4 /*yield*/, upload.done()];
377
388
  case 1:
378
- putResult = _a.sent();
379
- logger.stupid("putResult", putResult);
389
+ _a.sent();
380
390
  return [2 /*return*/, key];
381
391
  }
382
392
  });
383
393
  }); };
384
- this.uploadFromBuffer = function (bucket, key, buffer) { return __awaiter(_this, void 0, void 0, function () {
385
- var putResult;
394
+ this.uploadFromBuffer = function (bucket, key, buffer, tags) { return __awaiter(_this, void 0, void 0, function () {
395
+ var upload;
386
396
  return __generator(this, function (_a) {
387
397
  switch (_a.label) {
388
398
  case 0:
389
- logger.debug("Upload item[" + key + "] into bucket[" + bucket + "]");
390
- return [4 /*yield*/, this.s3
391
- .upload({
399
+ logger.debug("Upload item[".concat(key, "] into bucket[").concat(bucket, "]"));
400
+ upload = new lib_storage_1.Upload({
401
+ client: this.s3,
402
+ params: {
392
403
  Bucket: bucket,
393
404
  Key: key,
394
405
  Body: buffer,
395
- })
396
- .promise()];
406
+ },
407
+ partSize: 5 * 1024 * 1024, // 5MB
408
+ queueSize: 4,
409
+ tags: __spreadArray([SimpleAWS.stageTag], (tags || []), true),
410
+ });
411
+ return [4 /*yield*/, upload.done()];
397
412
  case 1:
398
- putResult = _a.sent();
399
- logger.stupid("putResult", putResult);
413
+ _a.sent();
400
414
  return [2 /*return*/, key];
401
415
  }
402
416
  });
403
417
  }); };
404
418
  this.writeFile = function (bucket, key, content) { return __awaiter(_this, void 0, void 0, function () {
405
- var tempFile;
419
+ var tempFile, error_2, msg;
406
420
  return __generator(this, function (_a) {
407
421
  switch (_a.label) {
408
422
  case 0:
409
- logger.debug("Write item[" + key + "] into bucket[" + bucket + "]");
410
- tempFile = os.tmpdir() + "/" + non_secure_1.nanoid();
423
+ logger.debug("Write item[".concat(key, "] into bucket[").concat(bucket, "]"));
424
+ tempFile = "".concat(os.tmpdir(), "/").concat((0, non_secure_1.nanoid)());
411
425
  _a.label = 1;
412
426
  case 1:
413
- _a.trys.push([1, , 4, 5]);
427
+ _a.trys.push([1, , 4, 9]);
414
428
  return [4 /*yield*/, fs.promises.writeFile(tempFile, content, 'utf-8')];
415
429
  case 2:
416
430
  _a.sent();
417
431
  return [4 /*yield*/, this.upload(bucket, tempFile, key)];
418
432
  case 3:
419
433
  _a.sent();
420
- return [3 /*break*/, 5];
434
+ return [3 /*break*/, 9];
421
435
  case 4:
422
436
  if (!fs.existsSync(tempFile)) {
423
437
  return [2 /*return*/];
424
438
  }
425
- fs.unlink(tempFile, function (error) {
426
- if (!error) {
427
- return;
428
- }
429
- var msg = "Error during writeFile: unlink file " + tempFile + ": " + utils_1.stringifyError(error);
430
- logger.error(msg);
431
- });
432
- return [7 /*endfinally*/];
433
- case 5: return [2 /*return*/];
439
+ _a.label = 5;
440
+ case 5:
441
+ _a.trys.push([5, 7, , 8]);
442
+ return [4 /*yield*/, fs.promises.unlink(tempFile)];
443
+ case 6:
444
+ _a.sent();
445
+ return [3 /*break*/, 8];
446
+ case 7:
447
+ error_2 = _a.sent();
448
+ msg = "Error during writeFile: unlink file ".concat(tempFile, ": ").concat((0, utils_1.stringifyError)(error_2));
449
+ logger.error(msg);
450
+ return [3 /*break*/, 8];
451
+ case 8: return [7 /*endfinally*/];
452
+ case 9: return [2 /*return*/];
434
453
  }
435
454
  });
436
455
  }); };
437
- this.getSignedUrl = function (bucketName, key, operation, params) {
438
- if (operation === void 0) { operation = 'getObject'; }
439
- return {
440
- key: key,
441
- url: _this.s3.getSignedUrl(operation, __assign({ Bucket: bucketName, Key: key, Expires: 60 * 10 }, (params || {}))),
442
- };
443
- };
444
456
  this.getSignedCookie = function (keyPairId, privateKey, url, expires) {
445
- var signer = new AWS.CloudFront.Signer(keyPairId, privateKey);
446
- var policy = {
457
+ var policy = JSON.stringify({
447
458
  Statement: [
448
459
  {
449
460
  Resource: url,
@@ -452,25 +463,23 @@ var SimpleAWS = /** @class */ (function () {
452
463
  },
453
464
  },
454
465
  ],
455
- };
456
- var ret = signer.getSignedCookie({ policy: JSON.stringify(policy) });
457
- return ret;
458
- };
459
- this.getAttachmentUrl = function (bucketName, key, fileName, params) {
460
- return _this.getSignedUrl(bucketName, key, 'getObject', __assign({}, params, { ResponseContentDisposition: "attachment; filename=\"" + fileName + "\"" }));
466
+ });
467
+ return (0, cloudfront_signer_1.getSignedCookies)({
468
+ keyPairId: keyPairId,
469
+ privateKey: privateKey,
470
+ policy: policy,
471
+ });
461
472
  };
462
473
  this.getDynamoDbItem = function (tableName, key, defaultValue) { return __awaiter(_this, void 0, void 0, function () {
463
474
  var getResult, item;
464
475
  return __generator(this, function (_a) {
465
476
  switch (_a.label) {
466
477
  case 0:
467
- logger.debug("Read an item with key[" + JSON.stringify(key) + "] from " + tableName + ".");
468
- return [4 /*yield*/, this.dynamodb
469
- .get({
478
+ logger.debug("Read an item with key[".concat(JSON.stringify(key), "] from ").concat(tableName, "."));
479
+ return [4 /*yield*/, this.dynamodb.get({
470
480
  TableName: tableName,
471
481
  Key: key,
472
- })
473
- .promise()];
482
+ })];
474
483
  case 1:
475
484
  getResult = _a.sent();
476
485
  logger.stupid("getResult", getResult);
@@ -487,27 +496,25 @@ var SimpleAWS = /** @class */ (function () {
487
496
  return __generator(this, function (_a) {
488
497
  switch (_a.label) {
489
498
  case 0:
490
- logger.debug("Update an item with key[" + JSON.stringify(key) + "] to " + tableName);
499
+ logger.debug("Update an item with key[".concat(JSON.stringify(key), "] to ").concat(tableName));
491
500
  logger.stupid("keyValues", columnValues);
492
501
  expressions = Object.keys(columnValues)
493
- .map(function (column) { return column + " = :" + column; })
502
+ .map(function (column) { return "".concat(column, " = :").concat(column); })
494
503
  .join(', ');
495
504
  attributeValues = Object.keys(columnValues)
496
- .map(function (column) { return [":" + column, columnValues[column]]; })
505
+ .map(function (column) { return [":".concat(column), columnValues[column]]; })
497
506
  .reduce(function (obj, pair) {
498
507
  var _a;
499
- return (__assign({}, obj, (_a = {}, _a[pair[0]] = pair[1], _a)));
508
+ return (__assign(__assign({}, obj), (_a = {}, _a[pair[0]] = pair[1], _a)));
500
509
  }, {});
501
510
  logger.stupid("expressions", expressions);
502
511
  logger.stupid("attributeValues", attributeValues);
503
- return [4 /*yield*/, this.dynamodb
504
- .update({
512
+ return [4 /*yield*/, this.dynamodb.update({
505
513
  TableName: tableName,
506
514
  Key: key,
507
- UpdateExpression: "set " + expressions,
515
+ UpdateExpression: "set ".concat(expressions),
508
516
  ExpressionAttributeValues: attributeValues,
509
- })
510
- .promise()];
517
+ })];
511
518
  case 1:
512
519
  updateResult = _a.sent();
513
520
  logger.stupid("updateResult", updateResult);
@@ -517,39 +524,35 @@ var SimpleAWS = /** @class */ (function () {
517
524
  }); };
518
525
  // Setup
519
526
  this.setupQueue = function (queueName) { return __awaiter(_this, void 0, void 0, function () {
520
- var listResult, _i, _a, queueUrl, error_2, createResult;
527
+ var listResult, _i, _a, queueUrl, error_3, createResult;
521
528
  return __generator(this, function (_b) {
522
529
  switch (_b.label) {
523
530
  case 0:
524
531
  _b.trys.push([0, 2, , 3]);
525
- return [4 /*yield*/, this.sqs
526
- .listQueues({
532
+ return [4 /*yield*/, this.sqs.listQueues({
527
533
  QueueNamePrefix: queueName,
528
- })
529
- .promise()];
534
+ })];
530
535
  case 1:
531
536
  listResult = _b.sent();
532
537
  if (listResult.QueueUrls) {
533
538
  for (_i = 0, _a = listResult.QueueUrls; _i < _a.length; _i++) {
534
539
  queueUrl = _a[_i];
535
540
  if (queueUrl.endsWith(queueName)) {
536
- logger.debug("Queue[" + queueName + " => " + queueUrl + "] already exists.");
541
+ logger.debug("Queue[".concat(queueName, " => ").concat(queueUrl, "] already exists."));
537
542
  return [2 /*return*/, true];
538
543
  }
539
544
  }
540
545
  }
541
546
  return [3 /*break*/, 3];
542
547
  case 2:
543
- error_2 = _b.sent();
544
- logger.debug("No Queue[" + queueName + "] exists due to " + error_2);
548
+ error_3 = _b.sent();
549
+ logger.debug("No Queue[".concat(queueName, "] exists due to ").concat(error_3));
545
550
  return [3 /*break*/, 3];
546
551
  case 3:
547
- logger.debug("Create a queue[" + queueName + "] newly.");
548
- return [4 /*yield*/, this.sqs
549
- .createQueue({
552
+ logger.debug("Create a queue[".concat(queueName, "] newly."));
553
+ return [4 /*yield*/, this.sqs.createQueue({
550
554
  QueueName: queueName,
551
- })
552
- .promise()];
555
+ })];
553
556
  case 4:
554
557
  createResult = _b.sent();
555
558
  logger.stupid("createResult", createResult);
@@ -558,37 +561,34 @@ var SimpleAWS = /** @class */ (function () {
558
561
  });
559
562
  }); };
560
563
  this.setupStorage = function (bucketName, cors) { return __awaiter(_this, void 0, void 0, function () {
561
- var listResult, error_3, createResult, corsResult;
564
+ var listResult, error_4, createResult, corsResult;
562
565
  return __generator(this, function (_a) {
563
566
  switch (_a.label) {
564
567
  case 0:
565
568
  _a.trys.push([0, 2, , 3]);
566
- return [4 /*yield*/, this.s3.listBuckets().promise()];
569
+ return [4 /*yield*/, this.s3.listBuckets()];
567
570
  case 1:
568
571
  listResult = _a.sent();
569
572
  if (listResult.Buckets &&
570
573
  listResult.Buckets.map(function (each) { return each.Name; }).includes(bucketName)) {
571
- logger.debug("Bucket[" + bucketName + "] already exists.");
574
+ logger.debug("Bucket[".concat(bucketName, "] already exists."));
572
575
  return [2 /*return*/, true];
573
576
  }
574
577
  return [3 /*break*/, 3];
575
578
  case 2:
576
- error_3 = _a.sent();
577
- logger.debug("No bucket[" + bucketName + "] exists due to " + error_3);
579
+ error_4 = _a.sent();
580
+ logger.debug("No bucket[".concat(bucketName, "] exists due to ").concat(error_4));
578
581
  return [3 /*break*/, 3];
579
582
  case 3:
580
- logger.debug("Create a bucket[" + bucketName + "] newly.");
581
- return [4 /*yield*/, this.s3
582
- .createBucket({
583
+ logger.debug("Create a bucket[".concat(bucketName, "] newly."));
584
+ return [4 /*yield*/, this.s3.createBucket({
583
585
  Bucket: bucketName,
584
- })
585
- .promise()];
586
+ })];
586
587
  case 4:
587
588
  createResult = _a.sent();
588
589
  logger.stupid("createResult", createResult);
589
590
  if (!cors) return [3 /*break*/, 6];
590
- return [4 /*yield*/, this.s3
591
- .putBucketCors({
591
+ return [4 /*yield*/, this.s3.putBucketCors({
592
592
  Bucket: bucketName,
593
593
  CORSConfiguration: {
594
594
  CORSRules: [
@@ -599,8 +599,7 @@ var SimpleAWS = /** @class */ (function () {
599
599
  },
600
600
  ],
601
601
  },
602
- })
603
- .promise()];
602
+ })];
604
603
  case 5:
605
604
  corsResult = _a.sent();
606
605
  logger.stupid("corsResult", corsResult);
@@ -610,38 +609,34 @@ var SimpleAWS = /** @class */ (function () {
610
609
  });
611
610
  }); };
612
611
  this.setupDynamoDb = function (tableName, keyColumn) { return __awaiter(_this, void 0, void 0, function () {
613
- var listResult, error_4, createResult;
612
+ var listResult, error_5, createResult;
614
613
  return __generator(this, function (_a) {
615
614
  switch (_a.label) {
616
615
  case 0:
617
616
  _a.trys.push([0, 2, , 3]);
618
- return [4 /*yield*/, this.dynamodbAdmin.listTables().promise()];
617
+ return [4 /*yield*/, this.dynamodbAdmin.listTables()];
619
618
  case 1:
620
619
  listResult = _a.sent();
621
620
  if (listResult.TableNames && listResult.TableNames.includes(tableName)) {
622
- logger.debug("Table[" + tableName + "] already exists.");
621
+ logger.debug("Table[".concat(tableName, "] already exists."));
623
622
  return [2 /*return*/, true];
624
623
  }
625
624
  return [3 /*break*/, 3];
626
625
  case 2:
627
- error_4 = _a.sent();
628
- logger.debug("No table[" + tableName + "] exists due to " + error_4);
626
+ error_5 = _a.sent();
627
+ logger.debug("No table[".concat(tableName, "] exists due to ").concat(error_5));
629
628
  return [3 /*break*/, 3];
630
629
  case 3:
631
- logger.debug("Create a table[" + tableName + "] newly.");
632
- return [4 /*yield*/, this.dynamodbAdmin
633
- .createTable({
630
+ logger.debug("Create a table[".concat(tableName, "] newly."));
631
+ return [4 /*yield*/, this.dynamodbAdmin.createTable({
634
632
  TableName: tableName,
635
633
  KeySchema: [{ AttributeName: keyColumn, KeyType: 'HASH' }],
636
- AttributeDefinitions: [
637
- { AttributeName: keyColumn, AttributeType: 'S' },
638
- ],
634
+ AttributeDefinitions: [{ AttributeName: keyColumn, AttributeType: 'S' }],
639
635
  ProvisionedThroughput: {
640
636
  ReadCapacityUnits: 30,
641
637
  WriteCapacityUnits: 10,
642
638
  },
643
- })
644
- .promise()];
639
+ })];
645
640
  case 4:
646
641
  createResult = _a.sent();
647
642
  logger.stupid("createResult", createResult);
@@ -660,43 +655,155 @@ var SimpleAWS = /** @class */ (function () {
660
655
  Object.defineProperty(SimpleAWS.prototype, "s3", {
661
656
  get: function () {
662
657
  if (this.lazyS3 === undefined) {
663
- this.lazyS3 = new AWS.S3(this.config.get(define_1.AWSComponent.s3));
658
+ this.lazyS3 = new client_s3_1.S3(this.config.get(define_1.AWSComponent.s3) || {});
664
659
  }
665
660
  return this.lazyS3;
666
661
  },
667
- enumerable: true,
662
+ enumerable: false,
668
663
  configurable: true
669
664
  });
670
665
  Object.defineProperty(SimpleAWS.prototype, "sqs", {
671
666
  get: function () {
672
667
  if (this.lazySqs === undefined) {
673
- this.lazySqs = new AWS.SQS(this.config.get(define_1.AWSComponent.sqs));
668
+ this.lazySqs = new client_sqs_1.SQS(this.config.get(define_1.AWSComponent.sqs) || {});
674
669
  }
675
670
  return this.lazySqs;
676
671
  },
677
- enumerable: true,
672
+ enumerable: false,
678
673
  configurable: true
679
674
  });
680
675
  Object.defineProperty(SimpleAWS.prototype, "dynamodb", {
681
676
  get: function () {
682
677
  if (this.lazyDynamodb === undefined) {
683
- this.lazyDynamodb = new AWS.DynamoDB.DocumentClient(this.config.get(define_1.AWSComponent.dynamodb));
678
+ this.lazyDynamodb = lib_dynamodb_1.DynamoDBDocument.from(new client_dynamodb_1.DynamoDBClient(this.config.get(define_1.AWSComponent.dynamodb) || {}), {
679
+ marshallOptions: {
680
+ convertEmptyValues: true,
681
+ removeUndefinedValues: true,
682
+ },
683
+ });
684
684
  }
685
685
  return this.lazyDynamodb;
686
686
  },
687
- enumerable: true,
687
+ enumerable: false,
688
688
  configurable: true
689
689
  });
690
690
  Object.defineProperty(SimpleAWS.prototype, "dynamodbAdmin", {
691
691
  get: function () {
692
692
  if (this.lazyDynamodbAdmin === undefined) {
693
- this.lazyDynamodbAdmin = new AWS.DynamoDB(this.config.get(define_1.AWSComponent.dynamodb));
693
+ this.lazyDynamodbAdmin = new client_dynamodb_1.DynamoDB(this.config.get(define_1.AWSComponent.dynamodb) || {});
694
694
  }
695
695
  return this.lazyDynamodbAdmin;
696
696
  },
697
- enumerable: true,
697
+ enumerable: false,
698
698
  configurable: true
699
699
  });
700
+ SimpleAWS.prototype.getSignedUrl = function (options) {
701
+ return __awaiter(this, void 0, void 0, function () {
702
+ var _a, expiresIn, unhoistableHeaders, tagging, cmd, cmd, cmd, cmd, cmd, cmd, cmd, cmd, tagging, cmd, cmd, cmd, cmd;
703
+ var _b, _c;
704
+ return __generator(this, function (_d) {
705
+ _a = options.expiresIn, expiresIn = _a === void 0 ? 600 : _a, unhoistableHeaders = options.unhoistableHeaders;
706
+ switch (options.operation) {
707
+ case 'putObject': {
708
+ tagging = ((_b = options.params) === null || _b === void 0 ? void 0 : _b.Tagging)
709
+ ? SimpleAWS.stringifiedStageTag + '&' + options.params.Tagging
710
+ : SimpleAWS.stringifiedStageTag;
711
+ cmd = new client_s3_1.PutObjectCommand(__assign(__assign({ Bucket: options.bucket, Key: options.key }, options.params), { Tagging: tagging }));
712
+ return [2 /*return*/, (0, s3_request_presigner_1.getSignedUrl)(this.s3, cmd, {
713
+ expiresIn: expiresIn,
714
+ unhoistableHeaders: unhoistableHeaders,
715
+ })];
716
+ }
717
+ case 'getObject': {
718
+ cmd = new client_s3_1.GetObjectCommand(__assign({ Bucket: options.bucket, Key: options.key }, options.params));
719
+ return [2 /*return*/, (0, s3_request_presigner_1.getSignedUrl)(this.s3, cmd, {
720
+ expiresIn: expiresIn,
721
+ unhoistableHeaders: unhoistableHeaders,
722
+ })];
723
+ }
724
+ case 'deleteObject': {
725
+ cmd = new client_s3_1.DeleteObjectCommand(__assign({ Bucket: options.bucket, Key: options.key }, options.params));
726
+ return [2 /*return*/, (0, s3_request_presigner_1.getSignedUrl)(this.s3, cmd, {
727
+ expiresIn: expiresIn,
728
+ unhoistableHeaders: unhoistableHeaders,
729
+ })];
730
+ }
731
+ case 'headObject': {
732
+ cmd = new client_s3_1.HeadObjectCommand(__assign({ Bucket: options.bucket, Key: options.key }, options.params));
733
+ return [2 /*return*/, (0, s3_request_presigner_1.getSignedUrl)(this.s3, cmd, {
734
+ expiresIn: expiresIn,
735
+ unhoistableHeaders: unhoistableHeaders,
736
+ })];
737
+ }
738
+ case 'copyObject': {
739
+ cmd = new client_s3_1.CopyObjectCommand(__assign({ Bucket: options.bucket, Key: options.key }, options.params));
740
+ return [2 /*return*/, (0, s3_request_presigner_1.getSignedUrl)(this.s3, cmd, {
741
+ expiresIn: expiresIn,
742
+ unhoistableHeaders: unhoistableHeaders,
743
+ })];
744
+ }
745
+ case 'uploadPart': {
746
+ cmd = new client_s3_1.UploadPartCommand(__assign({ Bucket: options.bucket, Key: options.key }, options.params));
747
+ return [2 /*return*/, (0, s3_request_presigner_1.getSignedUrl)(this.s3, cmd, {
748
+ expiresIn: expiresIn,
749
+ unhoistableHeaders: unhoistableHeaders,
750
+ })];
751
+ }
752
+ case 'uploadPartCopy': {
753
+ cmd = new client_s3_1.UploadPartCopyCommand(__assign({ Bucket: options.bucket, Key: options.key }, options.params));
754
+ return [2 /*return*/, (0, s3_request_presigner_1.getSignedUrl)(this.s3, cmd, {
755
+ expiresIn: expiresIn,
756
+ unhoistableHeaders: unhoistableHeaders,
757
+ })];
758
+ }
759
+ case 'listObjectsV2': {
760
+ cmd = new client_s3_1.ListObjectsV2Command(__assign({ Bucket: options.bucket }, options.params));
761
+ return [2 /*return*/, (0, s3_request_presigner_1.getSignedUrl)(this.s3, cmd, {
762
+ expiresIn: expiresIn,
763
+ unhoistableHeaders: unhoistableHeaders,
764
+ })];
765
+ }
766
+ case 'createMultipartUpload': {
767
+ tagging = ((_c = options.params) === null || _c === void 0 ? void 0 : _c.Tagging)
768
+ ? SimpleAWS.stringifiedStageTag + '&' + options.params.Tagging
769
+ : SimpleAWS.stringifiedStageTag;
770
+ cmd = new client_s3_1.CreateMultipartUploadCommand(__assign(__assign({ Bucket: options.bucket, Key: options.key }, options.params), { Tagging: tagging }));
771
+ return [2 /*return*/, (0, s3_request_presigner_1.getSignedUrl)(this.s3, cmd, {
772
+ expiresIn: expiresIn,
773
+ unhoistableHeaders: unhoistableHeaders,
774
+ })];
775
+ }
776
+ case 'completeMultipartUpload': {
777
+ cmd = new client_s3_1.CompleteMultipartUploadCommand(__assign({ Bucket: options.bucket, Key: options.key }, options.params));
778
+ return [2 /*return*/, (0, s3_request_presigner_1.getSignedUrl)(this.s3, cmd, {
779
+ expiresIn: expiresIn,
780
+ unhoistableHeaders: unhoistableHeaders,
781
+ })];
782
+ }
783
+ case 'abortMultipartUpload': {
784
+ cmd = new client_s3_1.AbortMultipartUploadCommand(__assign({ Bucket: options.bucket, Key: options.key }, options.params));
785
+ return [2 /*return*/, (0, s3_request_presigner_1.getSignedUrl)(this.s3, cmd, {
786
+ expiresIn: expiresIn,
787
+ unhoistableHeaders: unhoistableHeaders,
788
+ })];
789
+ }
790
+ case 'listParts': {
791
+ cmd = new client_s3_1.ListPartsCommand(__assign({ Bucket: options.bucket, Key: options.key }, options.params));
792
+ return [2 /*return*/, (0, s3_request_presigner_1.getSignedUrl)(this.s3, cmd, {
793
+ expiresIn: expiresIn,
794
+ unhoistableHeaders: unhoistableHeaders,
795
+ })];
796
+ }
797
+ }
798
+ return [2 /*return*/];
799
+ });
800
+ });
801
+ };
802
+ SimpleAWS.stageTag = {
803
+ Key: 'STAGE',
804
+ Value: simple_staging_1.envDefault.level,
805
+ };
806
+ SimpleAWS.stringifiedStageTag = "STAGE=".concat(simple_staging_1.envDefault.level);
700
807
  return SimpleAWS;
701
808
  }());
702
809
  exports.SimpleAWS = SimpleAWS;