serverless-simple-middleware 0.0.52 → 0.0.53

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 (51) hide show
  1. package/.prettierignore +2 -2
  2. package/README.md +4 -4
  3. package/dist/aws/config.d.ts +15 -15
  4. package/dist/aws/config.js +29 -29
  5. package/dist/aws/define.d.ts +21 -21
  6. package/dist/aws/define.js +8 -8
  7. package/dist/aws/index.d.ts +3 -3
  8. package/dist/aws/index.js +8 -8
  9. package/dist/aws/simple.d.ts +44 -42
  10. package/dist/aws/simple.js +656 -590
  11. package/dist/index.d.ts +3 -3
  12. package/dist/index.js +8 -8
  13. package/dist/middleware/aws.d.ts +25 -25
  14. package/dist/middleware/aws.js +128 -128
  15. package/dist/middleware/base.d.ts +54 -54
  16. package/dist/middleware/base.js +140 -140
  17. package/dist/middleware/build.d.ts +3 -3
  18. package/dist/middleware/build.js +234 -234
  19. package/dist/middleware/index.d.ts +12 -12
  20. package/dist/middleware/index.js +22 -22
  21. package/dist/middleware/logger.d.ts +18 -18
  22. package/dist/middleware/logger.js +71 -71
  23. package/dist/middleware/mysql.d.ts +44 -44
  24. package/dist/middleware/mysql.js +289 -289
  25. package/dist/middleware/trace.d.ts +86 -86
  26. package/dist/middleware/trace.js +255 -255
  27. package/dist/utils/index.d.ts +2 -2
  28. package/dist/utils/index.js +7 -7
  29. package/dist/utils/logger.d.ts +26 -26
  30. package/dist/utils/logger.js +73 -73
  31. package/dist/utils/misc.d.ts +1 -1
  32. package/dist/utils/misc.js +9 -9
  33. package/jest.config.js +7 -7
  34. package/package.json +61 -60
  35. package/src/aws/config.ts +46 -46
  36. package/src/aws/define.ts +29 -29
  37. package/src/aws/index.ts +3 -3
  38. package/src/aws/simple.ts +531 -482
  39. package/src/index.ts +3 -3
  40. package/src/middleware/aws.ts +78 -78
  41. package/src/middleware/base.ts +164 -164
  42. package/src/middleware/build.ts +173 -173
  43. package/src/middleware/index.ts +20 -20
  44. package/src/middleware/logger.ts +28 -28
  45. package/src/middleware/mysql.ts +210 -210
  46. package/src/middleware/trace.ts +269 -269
  47. package/src/utils/index.ts +2 -2
  48. package/src/utils/logger.ts +94 -94
  49. package/src/utils/misc.ts +11 -11
  50. package/tsconfig.json +15 -15
  51. package/tslint.json +12 -12
@@ -1,590 +1,656 @@
1
- "use strict";
2
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
- return new (P || (P = Promise))(function (resolve, reject) {
15
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
- 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
- step((generator = generator.apply(thisArg, _arguments || [])).next());
19
- });
20
- };
21
- var __generator = (this && this.__generator) || function (thisArg, body) {
22
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
- function verb(n) { return function (v) { return step([n, v]); }; }
25
- function step(op) {
26
- if (f) throw new TypeError("Generator is already executing.");
27
- while (_) try {
28
- 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
- if (y = 0, t) op = [op[0] & 2, t.value];
30
- switch (op[0]) {
31
- case 0: case 1: t = op; break;
32
- case 4: _.label++; return { value: op[1], done: false };
33
- case 5: _.label++; y = op[1]; op = [0]; continue;
34
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
- default:
36
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
- if (t[2]) _.ops.pop();
41
- _.trys.pop(); continue;
42
- }
43
- op = body.call(thisArg, _);
44
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
- }
47
- };
48
- Object.defineProperty(exports, "__esModule", { value: true });
49
- var AWS = require("aws-sdk"); // tslint:disable-line
50
- var fs = require("fs");
51
- var utils_1 = require("../utils");
52
- var config_1 = require("./config");
53
- var define_1 = require("./define");
54
- var logger = utils_1.getLogger(__filename);
55
- var SimpleAWS = /** @class */ (function () {
56
- function SimpleAWS(config) {
57
- var _this = this;
58
- this.getQueueUrl = function (queueName) { return __awaiter(_this, void 0, void 0, function () {
59
- var urlResult;
60
- return __generator(this, function (_a) {
61
- switch (_a.label) {
62
- case 0:
63
- if (this.queueUrls[queueName] !== undefined) {
64
- return [2 /*return*/, this.queueUrls[queueName]];
65
- }
66
- return [4 /*yield*/, this.sqs
67
- .getQueueUrl({
68
- QueueName: queueName,
69
- })
70
- .promise()];
71
- case 1:
72
- urlResult = _a.sent();
73
- logger.stupid("urlResult", urlResult);
74
- if (!urlResult.QueueUrl) {
75
- throw new Error("No queue url with name[" + queueName + "]");
76
- }
77
- return [2 /*return*/, (this.queueUrls[queueName] = urlResult.QueueUrl)];
78
- }
79
- });
80
- }); };
81
- this.enqueue = function (queueName, data) { return __awaiter(_this, void 0, void 0, function () {
82
- var queueUrl, sendResult, attrResult;
83
- return __generator(this, function (_a) {
84
- switch (_a.label) {
85
- case 0:
86
- logger.debug("Send message[" + data.key + "] to queue.");
87
- logger.stupid("data", data);
88
- return [4 /*yield*/, this.getQueueUrl(queueName)];
89
- case 1:
90
- queueUrl = _a.sent();
91
- return [4 /*yield*/, this.sqs
92
- .sendMessage({
93
- QueueUrl: queueUrl,
94
- MessageBody: JSON.stringify(data),
95
- DelaySeconds: 0,
96
- })
97
- .promise()];
98
- case 2:
99
- sendResult = _a.sent();
100
- logger.stupid("sendResult", sendResult);
101
- return [4 /*yield*/, this.sqs
102
- .getQueueAttributes({
103
- QueueUrl: queueUrl,
104
- AttributeNames: ['ApproximateNumberOfMessages'],
105
- })
106
- .promise()];
107
- case 3:
108
- attrResult = _a.sent();
109
- logger.stupid("attrResult", attrResult);
110
- if (!attrResult.Attributes) {
111
- return [2 /*return*/, 0];
112
- }
113
- return [2 /*return*/, +attrResult.Attributes.ApproximateNumberOfMessages];
114
- }
115
- });
116
- }); };
117
- this.dequeue = function (queueName, fetchSize, waitSeconds, visibilityTimeout) {
118
- if (fetchSize === void 0) { fetchSize = 1; }
119
- if (waitSeconds === void 0) { waitSeconds = 1; }
120
- if (visibilityTimeout === void 0) { visibilityTimeout = 15; }
121
- return __awaiter(_this, void 0, void 0, function () {
122
- var queueUrl, receiveResult, data, _i, _a, each, message;
123
- return __generator(this, function (_b) {
124
- switch (_b.label) {
125
- case 0:
126
- logger.debug("Receive message from queue[" + queueName + "].");
127
- return [4 /*yield*/, this.getQueueUrl(queueName)];
128
- case 1:
129
- queueUrl = _b.sent();
130
- return [4 /*yield*/, this.sqs
131
- .receiveMessage({
132
- QueueUrl: queueUrl,
133
- MaxNumberOfMessages: fetchSize,
134
- WaitTimeSeconds: waitSeconds,
135
- VisibilityTimeout: visibilityTimeout,
136
- })
137
- .promise()];
138
- case 2:
139
- receiveResult = _b.sent();
140
- logger.stupid("receiveResult", receiveResult);
141
- if (receiveResult.Messages === undefined ||
142
- receiveResult.Messages.length === 0) {
143
- return [2 /*return*/, []];
144
- }
145
- data = [];
146
- for (_i = 0, _a = receiveResult.Messages; _i < _a.length; _i++) {
147
- each = _a[_i];
148
- if (!each.ReceiptHandle) {
149
- logger.warn("No receipt handler: " + JSON.stringify(each));
150
- continue;
151
- }
152
- message = {
153
- handle: each.ReceiptHandle,
154
- body: each.Body ? JSON.parse(each.Body) : undefined,
155
- };
156
- data.push(message);
157
- }
158
- logger.verbose("Receive a message[" + JSON.stringify(data) + "] from queue");
159
- return [2 /*return*/, data];
160
- }
161
- });
162
- });
163
- };
164
- this.dequeueAll = function (queueName, limitSize, visibilityTimeout) {
165
- if (limitSize === void 0) { limitSize = Number.MAX_VALUE; }
166
- if (visibilityTimeout === void 0) { visibilityTimeout = 15; }
167
- return __awaiter(_this, void 0, void 0, function () {
168
- var messages, maxFetchSize, eachOfMessages, _i, eachOfMessages_1, each;
169
- return __generator(this, function (_a) {
170
- switch (_a.label) {
171
- case 0:
172
- messages = [];
173
- maxFetchSize = 10;
174
- _a.label = 1;
175
- case 1:
176
- if (!(messages.length < limitSize)) return [3 /*break*/, 3];
177
- return [4 /*yield*/, this.dequeue(queueName, Math.min(limitSize - messages.length, maxFetchSize), 0, visibilityTimeout)];
178
- case 2:
179
- eachOfMessages = _a.sent();
180
- if (!eachOfMessages || eachOfMessages.length === 0) {
181
- return [3 /*break*/, 3];
182
- }
183
- for (_i = 0, eachOfMessages_1 = eachOfMessages; _i < eachOfMessages_1.length; _i++) {
184
- each = eachOfMessages_1[_i];
185
- messages.push(each);
186
- }
187
- return [3 /*break*/, 1];
188
- case 3:
189
- logger.stupid("messages", messages);
190
- return [2 /*return*/, messages];
191
- }
192
- });
193
- });
194
- };
195
- this.retainMessage = function (queueName, handle, seconds) { return __awaiter(_this, void 0, void 0, function () {
196
- var _this = this;
197
- return __generator(this, function (_a) {
198
- return [2 /*return*/, new Promise(function (resolve, reject) { return __awaiter(_this, void 0, void 0, function () {
199
- var _this = this;
200
- return __generator(this, function (_a) {
201
- logger.debug("Change visibilityTimeout of " + handle + " to " + seconds + "secs.");
202
- this.getQueueUrl(queueName)
203
- .then(function (queueUrl) {
204
- _this.sqs.changeMessageVisibility({
205
- QueueUrl: queueUrl,
206
- ReceiptHandle: handle,
207
- VisibilityTimeout: seconds,
208
- }, function (err, changeResult) {
209
- if (err) {
210
- reject(err);
211
- }
212
- else {
213
- logger.stupid("changeResult", changeResult);
214
- resolve(handle);
215
- }
216
- });
217
- })
218
- .catch(reject);
219
- return [2 /*return*/];
220
- });
221
- }); })];
222
- });
223
- }); };
224
- this.completeMessage = function (queueName, handle) { return __awaiter(_this, void 0, void 0, function () {
225
- var queueUrl, deleteResult;
226
- return __generator(this, function (_a) {
227
- switch (_a.label) {
228
- case 0:
229
- logger.debug("Complete a message with handle[" + handle + "]");
230
- return [4 /*yield*/, this.getQueueUrl(queueName)];
231
- case 1:
232
- queueUrl = _a.sent();
233
- return [4 /*yield*/, this.sqs
234
- .deleteMessage({
235
- QueueUrl: queueUrl,
236
- ReceiptHandle: handle,
237
- })
238
- .promise()];
239
- case 2:
240
- deleteResult = _a.sent();
241
- logger.stupid("deleteResult", deleteResult);
242
- return [2 /*return*/, handle];
243
- }
244
- });
245
- }); };
246
- this.completeMessages = function (queueName, handles) { return __awaiter(_this, void 0, void 0, function () {
247
- var chunkSize, index, start, end, sublist, queueUrl, deletesResult;
248
- return __generator(this, function (_a) {
249
- switch (_a.label) {
250
- case 0:
251
- logger.debug("Complete a message with handle[" + handles + "]");
252
- if (!handles) {
253
- return [2 /*return*/, handles];
254
- }
255
- chunkSize = 10;
256
- index = 0;
257
- start = 0;
258
- _a.label = 1;
259
- case 1:
260
- if (!(start < handles.length)) return [3 /*break*/, 5];
261
- end = Math.min(start + chunkSize, handles.length);
262
- sublist = handles.slice(start, end);
263
- return [4 /*yield*/, this.getQueueUrl(queueName)];
264
- case 2:
265
- queueUrl = _a.sent();
266
- return [4 /*yield*/, this.sqs
267
- .deleteMessageBatch({
268
- QueueUrl: queueUrl,
269
- Entries: sublist.map(function (handle) { return ({
270
- Id: (++index).toString(),
271
- ReceiptHandle: handle,
272
- }); }),
273
- })
274
- .promise()];
275
- case 3:
276
- deletesResult = _a.sent();
277
- logger.stupid("deleteResult", deletesResult);
278
- _a.label = 4;
279
- case 4:
280
- start += chunkSize;
281
- return [3 /*break*/, 1];
282
- case 5: return [2 /*return*/, handles];
283
- }
284
- });
285
- }); };
286
- this.download = function (bucketName, key, localPath) { return __awaiter(_this, void 0, void 0, function () {
287
- var stream;
288
- return __generator(this, function (_a) {
289
- logger.debug("Get a stream of item[" + key + "] from bucket[" + bucketName + "]");
290
- stream = this.s3
291
- .getObject({
292
- Bucket: bucketName,
293
- Key: key,
294
- })
295
- .createReadStream();
296
- return [2 /*return*/, new Promise(function (resolve, reject) {
297
- return stream
298
- .on('error', function (error) { return reject(error); })
299
- .pipe(fs.createWriteStream(localPath))
300
- .on('finish', function () { return resolve(localPath); })
301
- .on('error', function (error) { return reject(error); });
302
- })];
303
- });
304
- }); };
305
- this.upload = function (bucketName, localPath, key) { return __awaiter(_this, void 0, void 0, function () {
306
- var putResult;
307
- return __generator(this, function (_a) {
308
- switch (_a.label) {
309
- case 0:
310
- logger.debug("Upload item[" + key + "] into bucket[" + bucketName + "]");
311
- return [4 /*yield*/, this.s3
312
- .upload({
313
- Bucket: bucketName,
314
- Key: key,
315
- Body: fs.createReadStream(localPath),
316
- })
317
- .promise()];
318
- case 1:
319
- putResult = _a.sent();
320
- logger.stupid("putResult", putResult);
321
- return [2 /*return*/, key];
322
- }
323
- });
324
- }); };
325
- this.getSignedUrl = function (bucketName, key, operation, params) {
326
- if (operation === void 0) { operation = 'getObject'; }
327
- return {
328
- key: key,
329
- url: _this.s3.getSignedUrl(operation, __assign({ Bucket: bucketName, Key: key, Expires: 60 * 10 }, (params || {}))),
330
- };
331
- };
332
- this.getSignedCookie = function (keyPairId, privateKey, url, expires) {
333
- var signer = new AWS.CloudFront.Signer(keyPairId, privateKey);
334
- var policy = {
335
- Statement: [
336
- {
337
- Resource: url,
338
- Condition: {
339
- DateLessThan: { 'AWS:EpochTime': expires },
340
- },
341
- },
342
- ],
343
- };
344
- var ret = signer.getSignedCookie({ policy: JSON.stringify(policy) });
345
- return ret;
346
- };
347
- this.getAttachmentUrl = function (bucketName, key, fileName, params) {
348
- return _this.getSignedUrl(bucketName, key, 'getObject', __assign({}, params, { ResponseContentDisposition: "attachment; filename=\"" + fileName + "\"" }));
349
- };
350
- this.getDynamoDbItem = function (tableName, key, defaultValue) { return __awaiter(_this, void 0, void 0, function () {
351
- var getResult, item;
352
- return __generator(this, function (_a) {
353
- switch (_a.label) {
354
- case 0:
355
- logger.debug("Read an item with key[" + JSON.stringify(key) + "] from " + tableName + ".");
356
- return [4 /*yield*/, this.dynamodb
357
- .get({
358
- TableName: tableName,
359
- Key: key,
360
- })
361
- .promise()];
362
- case 1:
363
- getResult = _a.sent();
364
- logger.stupid("getResult", getResult);
365
- item = getResult !== undefined && getResult.Item !== undefined
366
- ? getResult.Item // Casts forcefully.
367
- : defaultValue;
368
- logger.stupid("item", item);
369
- return [2 /*return*/, item];
370
- }
371
- });
372
- }); };
373
- this.updateDynamoDbItem = function (tableName, key, columnValues) { return __awaiter(_this, void 0, void 0, function () {
374
- var expressions, attributeValues, updateResult;
375
- return __generator(this, function (_a) {
376
- switch (_a.label) {
377
- case 0:
378
- logger.debug("Update an item with key[" + JSON.stringify(key) + "] to " + tableName);
379
- logger.stupid("keyValues", columnValues);
380
- expressions = Object.keys(columnValues)
381
- .map(function (column) { return column + " = :" + column; })
382
- .join(', ');
383
- attributeValues = Object.keys(columnValues)
384
- .map(function (column) { return [":" + column, columnValues[column]]; })
385
- .reduce(function (obj, pair) {
386
- var _a;
387
- return (__assign({}, obj, (_a = {}, _a[pair[0]] = pair[1], _a)));
388
- }, {});
389
- logger.stupid("expressions", expressions);
390
- logger.stupid("attributeValues", attributeValues);
391
- return [4 /*yield*/, this.dynamodb
392
- .update({
393
- TableName: tableName,
394
- Key: key,
395
- UpdateExpression: "set " + expressions,
396
- ExpressionAttributeValues: attributeValues,
397
- })
398
- .promise()];
399
- case 1:
400
- updateResult = _a.sent();
401
- logger.stupid("updateResult", updateResult);
402
- return [2 /*return*/, updateResult];
403
- }
404
- });
405
- }); };
406
- // Setup
407
- this.setupQueue = function (queueName) { return __awaiter(_this, void 0, void 0, function () {
408
- var listResult, _i, _a, queueUrl, error_1, createResult;
409
- return __generator(this, function (_b) {
410
- switch (_b.label) {
411
- case 0:
412
- _b.trys.push([0, 2, , 3]);
413
- return [4 /*yield*/, this.sqs
414
- .listQueues({
415
- QueueNamePrefix: queueName,
416
- })
417
- .promise()];
418
- case 1:
419
- listResult = _b.sent();
420
- if (listResult.QueueUrls) {
421
- for (_i = 0, _a = listResult.QueueUrls; _i < _a.length; _i++) {
422
- queueUrl = _a[_i];
423
- if (queueUrl.endsWith(queueName)) {
424
- logger.debug("Queue[" + queueName + " => " + queueUrl + "] already exists.");
425
- return [2 /*return*/, true];
426
- }
427
- }
428
- }
429
- return [3 /*break*/, 3];
430
- case 2:
431
- error_1 = _b.sent();
432
- logger.debug("No Queue[" + queueName + "] exists due to " + error_1);
433
- return [3 /*break*/, 3];
434
- case 3:
435
- logger.debug("Create a queue[" + queueName + "] newly.");
436
- return [4 /*yield*/, this.sqs
437
- .createQueue({
438
- QueueName: queueName,
439
- })
440
- .promise()];
441
- case 4:
442
- createResult = _b.sent();
443
- logger.stupid("createResult", createResult);
444
- return [2 /*return*/, true];
445
- }
446
- });
447
- }); };
448
- this.setupStorage = function (bucketName, cors) { return __awaiter(_this, void 0, void 0, function () {
449
- var listResult, error_2, createResult, corsResult;
450
- return __generator(this, function (_a) {
451
- switch (_a.label) {
452
- case 0:
453
- _a.trys.push([0, 2, , 3]);
454
- return [4 /*yield*/, this.s3.listBuckets().promise()];
455
- case 1:
456
- listResult = _a.sent();
457
- if (listResult.Buckets &&
458
- listResult.Buckets.map(function (each) { return each.Name; }).includes(bucketName)) {
459
- logger.debug("Bucket[" + bucketName + "] already exists.");
460
- return [2 /*return*/, true];
461
- }
462
- return [3 /*break*/, 3];
463
- case 2:
464
- error_2 = _a.sent();
465
- logger.debug("No bucket[" + bucketName + "] exists due to " + error_2);
466
- return [3 /*break*/, 3];
467
- case 3:
468
- logger.debug("Create a bucket[" + bucketName + "] newly.");
469
- return [4 /*yield*/, this.s3
470
- .createBucket({
471
- Bucket: bucketName,
472
- })
473
- .promise()];
474
- case 4:
475
- createResult = _a.sent();
476
- logger.stupid("createResult", createResult);
477
- if (!cors) return [3 /*break*/, 6];
478
- return [4 /*yield*/, this.s3
479
- .putBucketCors({
480
- Bucket: bucketName,
481
- CORSConfiguration: {
482
- CORSRules: [
483
- {
484
- AllowedHeaders: ['*'],
485
- AllowedMethods: cors.methods,
486
- AllowedOrigins: cors.origins,
487
- },
488
- ],
489
- },
490
- })
491
- .promise()];
492
- case 5:
493
- corsResult = _a.sent();
494
- logger.stupid("corsResult", corsResult);
495
- _a.label = 6;
496
- case 6: return [2 /*return*/, true];
497
- }
498
- });
499
- }); };
500
- this.setupDynamoDb = function (tableName, keyColumn) { return __awaiter(_this, void 0, void 0, function () {
501
- var listResult, error_3, createResult;
502
- return __generator(this, function (_a) {
503
- switch (_a.label) {
504
- case 0:
505
- _a.trys.push([0, 2, , 3]);
506
- return [4 /*yield*/, this.dynamodbAdmin.listTables().promise()];
507
- case 1:
508
- listResult = _a.sent();
509
- if (listResult.TableNames && listResult.TableNames.includes(tableName)) {
510
- logger.debug("Table[" + tableName + "] already exists.");
511
- return [2 /*return*/, true];
512
- }
513
- return [3 /*break*/, 3];
514
- case 2:
515
- error_3 = _a.sent();
516
- logger.debug("No table[" + tableName + "] exists due to " + error_3);
517
- return [3 /*break*/, 3];
518
- case 3:
519
- logger.debug("Create a table[" + tableName + "] newly.");
520
- return [4 /*yield*/, this.dynamodbAdmin
521
- .createTable({
522
- TableName: tableName,
523
- KeySchema: [{ AttributeName: keyColumn, KeyType: 'HASH' }],
524
- AttributeDefinitions: [
525
- { AttributeName: keyColumn, AttributeType: 'S' },
526
- ],
527
- ProvisionedThroughput: {
528
- ReadCapacityUnits: 30,
529
- WriteCapacityUnits: 10,
530
- },
531
- })
532
- .promise()];
533
- case 4:
534
- createResult = _a.sent();
535
- logger.stupid("createResult", createResult);
536
- return [2 /*return*/, true];
537
- }
538
- });
539
- }); };
540
- this.config = config || new config_1.SimpleAWSConfig();
541
- /**
542
- * The simple cache for { queueName: queueUrl }.
543
- * It can help in the only case of launching this project as offline.
544
- * @type { { [queueName: string]: string } }
545
- */
546
- this.queueUrls = {};
547
- }
548
- Object.defineProperty(SimpleAWS.prototype, "s3", {
549
- get: function () {
550
- if (this.lazyS3 === undefined) {
551
- this.lazyS3 = new AWS.S3(this.config.get(define_1.AWSComponent.s3));
552
- }
553
- return this.lazyS3;
554
- },
555
- enumerable: true,
556
- configurable: true
557
- });
558
- Object.defineProperty(SimpleAWS.prototype, "sqs", {
559
- get: function () {
560
- if (this.lazySqs === undefined) {
561
- this.lazySqs = new AWS.SQS(this.config.get(define_1.AWSComponent.sqs));
562
- }
563
- return this.lazySqs;
564
- },
565
- enumerable: true,
566
- configurable: true
567
- });
568
- Object.defineProperty(SimpleAWS.prototype, "dynamodb", {
569
- get: function () {
570
- if (this.lazyDynamodb === undefined) {
571
- this.lazyDynamodb = new AWS.DynamoDB.DocumentClient(this.config.get(define_1.AWSComponent.dynamodb));
572
- }
573
- return this.lazyDynamodb;
574
- },
575
- enumerable: true,
576
- configurable: true
577
- });
578
- Object.defineProperty(SimpleAWS.prototype, "dynamodbAdmin", {
579
- get: function () {
580
- if (this.lazyDynamodbAdmin === undefined) {
581
- this.lazyDynamodbAdmin = new AWS.DynamoDB(this.config.get(define_1.AWSComponent.dynamodb));
582
- }
583
- return this.lazyDynamodbAdmin;
584
- },
585
- enumerable: true,
586
- configurable: true
587
- });
588
- return SimpleAWS;
589
- }());
590
- exports.SimpleAWS = SimpleAWS;
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ 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
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (_) try {
28
+ 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
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ Object.defineProperty(exports, "__esModule", { value: true });
49
+ var AWS = require("aws-sdk"); // tslint:disable-line
50
+ var fs = require("fs");
51
+ var os = require("os");
52
+ var non_secure_1 = require("nanoid/non-secure");
53
+ var utils_1 = require("../utils");
54
+ var config_1 = require("./config");
55
+ var define_1 = require("./define");
56
+ var logger = utils_1.getLogger(__filename);
57
+ var SimpleAWS = /** @class */ (function () {
58
+ function SimpleAWS(config) {
59
+ var _this = this;
60
+ this.getQueueUrl = function (queueName) { return __awaiter(_this, void 0, void 0, function () {
61
+ var urlResult;
62
+ return __generator(this, function (_a) {
63
+ switch (_a.label) {
64
+ case 0:
65
+ if (this.queueUrls[queueName] !== undefined) {
66
+ return [2 /*return*/, this.queueUrls[queueName]];
67
+ }
68
+ return [4 /*yield*/, this.sqs
69
+ .getQueueUrl({
70
+ QueueName: queueName,
71
+ })
72
+ .promise()];
73
+ case 1:
74
+ urlResult = _a.sent();
75
+ logger.stupid("urlResult", urlResult);
76
+ if (!urlResult.QueueUrl) {
77
+ throw new Error("No queue url with name[" + queueName + "]");
78
+ }
79
+ return [2 /*return*/, (this.queueUrls[queueName] = urlResult.QueueUrl)];
80
+ }
81
+ });
82
+ }); };
83
+ this.enqueue = function (queueName, data) { return __awaiter(_this, void 0, void 0, function () {
84
+ var queueUrl, sendResult, attrResult;
85
+ return __generator(this, function (_a) {
86
+ switch (_a.label) {
87
+ case 0:
88
+ logger.debug("Send message[" + data.key + "] to queue.");
89
+ logger.stupid("data", data);
90
+ return [4 /*yield*/, this.getQueueUrl(queueName)];
91
+ case 1:
92
+ queueUrl = _a.sent();
93
+ return [4 /*yield*/, this.sqs
94
+ .sendMessage({
95
+ QueueUrl: queueUrl,
96
+ MessageBody: JSON.stringify(data),
97
+ DelaySeconds: 0,
98
+ })
99
+ .promise()];
100
+ case 2:
101
+ sendResult = _a.sent();
102
+ logger.stupid("sendResult", sendResult);
103
+ return [4 /*yield*/, this.sqs
104
+ .getQueueAttributes({
105
+ QueueUrl: queueUrl,
106
+ AttributeNames: ['ApproximateNumberOfMessages'],
107
+ })
108
+ .promise()];
109
+ case 3:
110
+ attrResult = _a.sent();
111
+ logger.stupid("attrResult", attrResult);
112
+ if (!attrResult.Attributes) {
113
+ return [2 /*return*/, 0];
114
+ }
115
+ return [2 /*return*/, +attrResult.Attributes.ApproximateNumberOfMessages];
116
+ }
117
+ });
118
+ }); };
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) {
127
+ case 0:
128
+ logger.debug("Receive message from queue[" + queueName + "].");
129
+ return [4 /*yield*/, this.getQueueUrl(queueName)];
130
+ case 1:
131
+ queueUrl = _b.sent();
132
+ return [4 /*yield*/, this.sqs
133
+ .receiveMessage({
134
+ QueueUrl: queueUrl,
135
+ MaxNumberOfMessages: fetchSize,
136
+ WaitTimeSeconds: waitSeconds,
137
+ VisibilityTimeout: visibilityTimeout,
138
+ })
139
+ .promise()];
140
+ case 2:
141
+ receiveResult = _b.sent();
142
+ logger.stupid("receiveResult", receiveResult);
143
+ if (receiveResult.Messages === undefined ||
144
+ receiveResult.Messages.length === 0) {
145
+ return [2 /*return*/, []];
146
+ }
147
+ data = [];
148
+ for (_i = 0, _a = receiveResult.Messages; _i < _a.length; _i++) {
149
+ each = _a[_i];
150
+ if (!each.ReceiptHandle) {
151
+ logger.warn("No receipt handler: " + JSON.stringify(each));
152
+ continue;
153
+ }
154
+ message = {
155
+ handle: each.ReceiptHandle,
156
+ body: each.Body ? JSON.parse(each.Body) : undefined,
157
+ };
158
+ data.push(message);
159
+ }
160
+ logger.verbose("Receive a message[" + JSON.stringify(data) + "] from queue");
161
+ return [2 /*return*/, data];
162
+ }
163
+ });
164
+ });
165
+ };
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) {
173
+ case 0:
174
+ messages = [];
175
+ maxFetchSize = 10;
176
+ _a.label = 1;
177
+ case 1:
178
+ if (!(messages.length < limitSize)) return [3 /*break*/, 3];
179
+ return [4 /*yield*/, this.dequeue(queueName, Math.min(limitSize - messages.length, maxFetchSize), 0, visibilityTimeout)];
180
+ case 2:
181
+ eachOfMessages = _a.sent();
182
+ if (!eachOfMessages || eachOfMessages.length === 0) {
183
+ return [3 /*break*/, 3];
184
+ }
185
+ for (_i = 0, eachOfMessages_1 = eachOfMessages; _i < eachOfMessages_1.length; _i++) {
186
+ each = eachOfMessages_1[_i];
187
+ messages.push(each);
188
+ }
189
+ return [3 /*break*/, 1];
190
+ case 3:
191
+ logger.stupid("messages", messages);
192
+ return [2 /*return*/, messages];
193
+ }
194
+ });
195
+ });
196
+ };
197
+ this.retainMessage = function (queueName, handle, seconds) { return __awaiter(_this, void 0, void 0, function () {
198
+ var _this = this;
199
+ 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
+ }); })];
224
+ });
225
+ }); };
226
+ this.completeMessage = function (queueName, handle) { return __awaiter(_this, void 0, void 0, function () {
227
+ var queueUrl, deleteResult;
228
+ return __generator(this, function (_a) {
229
+ switch (_a.label) {
230
+ case 0:
231
+ logger.debug("Complete a message with handle[" + handle + "]");
232
+ return [4 /*yield*/, this.getQueueUrl(queueName)];
233
+ case 1:
234
+ queueUrl = _a.sent();
235
+ return [4 /*yield*/, this.sqs
236
+ .deleteMessage({
237
+ QueueUrl: queueUrl,
238
+ ReceiptHandle: handle,
239
+ })
240
+ .promise()];
241
+ case 2:
242
+ deleteResult = _a.sent();
243
+ logger.stupid("deleteResult", deleteResult);
244
+ return [2 /*return*/, handle];
245
+ }
246
+ });
247
+ }); };
248
+ this.completeMessages = function (queueName, handles) { return __awaiter(_this, void 0, void 0, function () {
249
+ var chunkSize, index, start, end, sublist, queueUrl, deletesResult;
250
+ return __generator(this, function (_a) {
251
+ switch (_a.label) {
252
+ case 0:
253
+ logger.debug("Complete a message with handle[" + handles + "]");
254
+ if (!handles) {
255
+ return [2 /*return*/, handles];
256
+ }
257
+ chunkSize = 10;
258
+ index = 0;
259
+ start = 0;
260
+ _a.label = 1;
261
+ case 1:
262
+ if (!(start < handles.length)) return [3 /*break*/, 5];
263
+ end = Math.min(start + chunkSize, handles.length);
264
+ sublist = handles.slice(start, end);
265
+ return [4 /*yield*/, this.getQueueUrl(queueName)];
266
+ case 2:
267
+ queueUrl = _a.sent();
268
+ return [4 /*yield*/, this.sqs
269
+ .deleteMessageBatch({
270
+ QueueUrl: queueUrl,
271
+ Entries: sublist.map(function (handle) { return ({
272
+ Id: (++index).toString(),
273
+ ReceiptHandle: handle,
274
+ }); }),
275
+ })
276
+ .promise()];
277
+ case 3:
278
+ deletesResult = _a.sent();
279
+ logger.stupid("deleteResult", deletesResult);
280
+ _a.label = 4;
281
+ case 4:
282
+ start += chunkSize;
283
+ return [3 /*break*/, 1];
284
+ case 5: return [2 /*return*/, handles];
285
+ }
286
+ });
287
+ }); };
288
+ this.download = function (bucket, key, localPath) { return __awaiter(_this, void 0, void 0, function () {
289
+ var stream;
290
+ 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
+ })];
302
+ });
303
+ }); };
304
+ this.readFile = function (bucket, key) { return __awaiter(_this, void 0, void 0, function () {
305
+ var tempFile, content;
306
+ return __generator(this, function (_a) {
307
+ switch (_a.label) {
308
+ case 0:
309
+ logger.debug("Read item[" + key + "] from bucket[" + bucket + "]");
310
+ tempFile = os.tmpdir() + "/" + non_secure_1.nanoid();
311
+ _a.label = 1;
312
+ case 1:
313
+ _a.trys.push([1, , 4, 5]);
314
+ return [4 /*yield*/, this.download(bucket, key, tempFile)];
315
+ case 2:
316
+ _a.sent();
317
+ return [4 /*yield*/, fs.promises.readFile(tempFile, {
318
+ encoding: 'utf-8',
319
+ })];
320
+ case 3:
321
+ content = _a.sent();
322
+ return [2 /*return*/, content];
323
+ case 4:
324
+ if (!fs.existsSync(tempFile)) {
325
+ fs.unlink(tempFile, function (error) {
326
+ if (!error) {
327
+ return;
328
+ }
329
+ var msg = "Error during readFile: unlink " + tempFile + ": " + utils_1.stringifyError(error);
330
+ logger.error(msg);
331
+ });
332
+ }
333
+ return [7 /*endfinally*/];
334
+ case 5: return [2 /*return*/];
335
+ }
336
+ });
337
+ }); };
338
+ this.upload = function (bucket, localPath, key) { return __awaiter(_this, void 0, void 0, function () {
339
+ var putResult;
340
+ return __generator(this, function (_a) {
341
+ switch (_a.label) {
342
+ case 0:
343
+ logger.debug("Upload item[" + key + "] into bucket[" + bucket + "]");
344
+ return [4 /*yield*/, this.s3
345
+ .upload({
346
+ Bucket: bucket,
347
+ Key: key,
348
+ Body: fs.createReadStream(localPath),
349
+ })
350
+ .promise()];
351
+ case 1:
352
+ putResult = _a.sent();
353
+ logger.stupid("putResult", putResult);
354
+ return [2 /*return*/, key];
355
+ }
356
+ });
357
+ }); };
358
+ this.writeFile = function (bucket, key, content) { return __awaiter(_this, void 0, void 0, function () {
359
+ var tempFile;
360
+ return __generator(this, function (_a) {
361
+ switch (_a.label) {
362
+ case 0:
363
+ logger.debug("Write item[" + key + "] into bucket[" + bucket + "]");
364
+ tempFile = os.tmpdir() + "/" + non_secure_1.nanoid();
365
+ _a.label = 1;
366
+ case 1:
367
+ _a.trys.push([1, , 4, 5]);
368
+ return [4 /*yield*/, fs.promises.writeFile(tempFile, content, 'utf-8')];
369
+ case 2:
370
+ _a.sent();
371
+ return [4 /*yield*/, this.upload(bucket, tempFile, key)];
372
+ case 3:
373
+ _a.sent();
374
+ return [3 /*break*/, 5];
375
+ case 4:
376
+ if (!fs.existsSync(tempFile)) {
377
+ return [2 /*return*/];
378
+ }
379
+ fs.unlink(tempFile, function (error) {
380
+ if (!error) {
381
+ return;
382
+ }
383
+ var msg = "Error during writeFile: unlink file " + tempFile + ": " + utils_1.stringifyError(error);
384
+ logger.error(msg);
385
+ });
386
+ return [7 /*endfinally*/];
387
+ case 5: return [2 /*return*/];
388
+ }
389
+ });
390
+ }); };
391
+ this.getSignedUrl = function (bucketName, key, operation, params) {
392
+ if (operation === void 0) { operation = 'getObject'; }
393
+ return {
394
+ key: key,
395
+ url: _this.s3.getSignedUrl(operation, __assign({ Bucket: bucketName, Key: key, Expires: 60 * 10 }, (params || {}))),
396
+ };
397
+ };
398
+ this.getSignedCookie = function (keyPairId, privateKey, url, expires) {
399
+ var signer = new AWS.CloudFront.Signer(keyPairId, privateKey);
400
+ var policy = {
401
+ Statement: [
402
+ {
403
+ Resource: url,
404
+ Condition: {
405
+ DateLessThan: { 'AWS:EpochTime': expires },
406
+ },
407
+ },
408
+ ],
409
+ };
410
+ var ret = signer.getSignedCookie({ policy: JSON.stringify(policy) });
411
+ return ret;
412
+ };
413
+ this.getAttachmentUrl = function (bucketName, key, fileName, params) {
414
+ return _this.getSignedUrl(bucketName, key, 'getObject', __assign({}, params, { ResponseContentDisposition: "attachment; filename=\"" + fileName + "\"" }));
415
+ };
416
+ this.getDynamoDbItem = function (tableName, key, defaultValue) { return __awaiter(_this, void 0, void 0, function () {
417
+ var getResult, item;
418
+ return __generator(this, function (_a) {
419
+ switch (_a.label) {
420
+ case 0:
421
+ logger.debug("Read an item with key[" + JSON.stringify(key) + "] from " + tableName + ".");
422
+ return [4 /*yield*/, this.dynamodb
423
+ .get({
424
+ TableName: tableName,
425
+ Key: key,
426
+ })
427
+ .promise()];
428
+ case 1:
429
+ getResult = _a.sent();
430
+ logger.stupid("getResult", getResult);
431
+ item = getResult !== undefined && getResult.Item !== undefined
432
+ ? getResult.Item // Casts forcefully.
433
+ : defaultValue;
434
+ logger.stupid("item", item);
435
+ return [2 /*return*/, item];
436
+ }
437
+ });
438
+ }); };
439
+ this.updateDynamoDbItem = function (tableName, key, columnValues) { return __awaiter(_this, void 0, void 0, function () {
440
+ var expressions, attributeValues, updateResult;
441
+ return __generator(this, function (_a) {
442
+ switch (_a.label) {
443
+ case 0:
444
+ logger.debug("Update an item with key[" + JSON.stringify(key) + "] to " + tableName);
445
+ logger.stupid("keyValues", columnValues);
446
+ expressions = Object.keys(columnValues)
447
+ .map(function (column) { return column + " = :" + column; })
448
+ .join(', ');
449
+ attributeValues = Object.keys(columnValues)
450
+ .map(function (column) { return [":" + column, columnValues[column]]; })
451
+ .reduce(function (obj, pair) {
452
+ var _a;
453
+ return (__assign({}, obj, (_a = {}, _a[pair[0]] = pair[1], _a)));
454
+ }, {});
455
+ logger.stupid("expressions", expressions);
456
+ logger.stupid("attributeValues", attributeValues);
457
+ return [4 /*yield*/, this.dynamodb
458
+ .update({
459
+ TableName: tableName,
460
+ Key: key,
461
+ UpdateExpression: "set " + expressions,
462
+ ExpressionAttributeValues: attributeValues,
463
+ })
464
+ .promise()];
465
+ case 1:
466
+ updateResult = _a.sent();
467
+ logger.stupid("updateResult", updateResult);
468
+ return [2 /*return*/, updateResult];
469
+ }
470
+ });
471
+ }); };
472
+ // Setup
473
+ this.setupQueue = function (queueName) { return __awaiter(_this, void 0, void 0, function () {
474
+ var listResult, _i, _a, queueUrl, error_1, createResult;
475
+ return __generator(this, function (_b) {
476
+ switch (_b.label) {
477
+ case 0:
478
+ _b.trys.push([0, 2, , 3]);
479
+ return [4 /*yield*/, this.sqs
480
+ .listQueues({
481
+ QueueNamePrefix: queueName,
482
+ })
483
+ .promise()];
484
+ case 1:
485
+ listResult = _b.sent();
486
+ if (listResult.QueueUrls) {
487
+ for (_i = 0, _a = listResult.QueueUrls; _i < _a.length; _i++) {
488
+ queueUrl = _a[_i];
489
+ if (queueUrl.endsWith(queueName)) {
490
+ logger.debug("Queue[" + queueName + " => " + queueUrl + "] already exists.");
491
+ return [2 /*return*/, true];
492
+ }
493
+ }
494
+ }
495
+ return [3 /*break*/, 3];
496
+ case 2:
497
+ error_1 = _b.sent();
498
+ logger.debug("No Queue[" + queueName + "] exists due to " + error_1);
499
+ return [3 /*break*/, 3];
500
+ case 3:
501
+ logger.debug("Create a queue[" + queueName + "] newly.");
502
+ return [4 /*yield*/, this.sqs
503
+ .createQueue({
504
+ QueueName: queueName,
505
+ })
506
+ .promise()];
507
+ case 4:
508
+ createResult = _b.sent();
509
+ logger.stupid("createResult", createResult);
510
+ return [2 /*return*/, true];
511
+ }
512
+ });
513
+ }); };
514
+ this.setupStorage = function (bucketName, cors) { return __awaiter(_this, void 0, void 0, function () {
515
+ var listResult, error_2, createResult, corsResult;
516
+ return __generator(this, function (_a) {
517
+ switch (_a.label) {
518
+ case 0:
519
+ _a.trys.push([0, 2, , 3]);
520
+ return [4 /*yield*/, this.s3.listBuckets().promise()];
521
+ case 1:
522
+ listResult = _a.sent();
523
+ if (listResult.Buckets &&
524
+ listResult.Buckets.map(function (each) { return each.Name; }).includes(bucketName)) {
525
+ logger.debug("Bucket[" + bucketName + "] already exists.");
526
+ return [2 /*return*/, true];
527
+ }
528
+ return [3 /*break*/, 3];
529
+ case 2:
530
+ error_2 = _a.sent();
531
+ logger.debug("No bucket[" + bucketName + "] exists due to " + error_2);
532
+ return [3 /*break*/, 3];
533
+ case 3:
534
+ logger.debug("Create a bucket[" + bucketName + "] newly.");
535
+ return [4 /*yield*/, this.s3
536
+ .createBucket({
537
+ Bucket: bucketName,
538
+ })
539
+ .promise()];
540
+ case 4:
541
+ createResult = _a.sent();
542
+ logger.stupid("createResult", createResult);
543
+ if (!cors) return [3 /*break*/, 6];
544
+ return [4 /*yield*/, this.s3
545
+ .putBucketCors({
546
+ Bucket: bucketName,
547
+ CORSConfiguration: {
548
+ CORSRules: [
549
+ {
550
+ AllowedHeaders: ['*'],
551
+ AllowedMethods: cors.methods,
552
+ AllowedOrigins: cors.origins,
553
+ },
554
+ ],
555
+ },
556
+ })
557
+ .promise()];
558
+ case 5:
559
+ corsResult = _a.sent();
560
+ logger.stupid("corsResult", corsResult);
561
+ _a.label = 6;
562
+ case 6: return [2 /*return*/, true];
563
+ }
564
+ });
565
+ }); };
566
+ this.setupDynamoDb = function (tableName, keyColumn) { return __awaiter(_this, void 0, void 0, function () {
567
+ var listResult, error_3, createResult;
568
+ return __generator(this, function (_a) {
569
+ switch (_a.label) {
570
+ case 0:
571
+ _a.trys.push([0, 2, , 3]);
572
+ return [4 /*yield*/, this.dynamodbAdmin.listTables().promise()];
573
+ case 1:
574
+ listResult = _a.sent();
575
+ if (listResult.TableNames && listResult.TableNames.includes(tableName)) {
576
+ logger.debug("Table[" + tableName + "] already exists.");
577
+ return [2 /*return*/, true];
578
+ }
579
+ return [3 /*break*/, 3];
580
+ case 2:
581
+ error_3 = _a.sent();
582
+ logger.debug("No table[" + tableName + "] exists due to " + error_3);
583
+ return [3 /*break*/, 3];
584
+ case 3:
585
+ logger.debug("Create a table[" + tableName + "] newly.");
586
+ return [4 /*yield*/, this.dynamodbAdmin
587
+ .createTable({
588
+ TableName: tableName,
589
+ KeySchema: [{ AttributeName: keyColumn, KeyType: 'HASH' }],
590
+ AttributeDefinitions: [
591
+ { AttributeName: keyColumn, AttributeType: 'S' },
592
+ ],
593
+ ProvisionedThroughput: {
594
+ ReadCapacityUnits: 30,
595
+ WriteCapacityUnits: 10,
596
+ },
597
+ })
598
+ .promise()];
599
+ case 4:
600
+ createResult = _a.sent();
601
+ logger.stupid("createResult", createResult);
602
+ return [2 /*return*/, true];
603
+ }
604
+ });
605
+ }); };
606
+ this.config = config || new config_1.SimpleAWSConfig();
607
+ /**
608
+ * The simple cache for { queueName: queueUrl }.
609
+ * It can help in the only case of launching this project as offline.
610
+ * @type { { [queueName: string]: string } }
611
+ */
612
+ this.queueUrls = {};
613
+ }
614
+ Object.defineProperty(SimpleAWS.prototype, "s3", {
615
+ get: function () {
616
+ if (this.lazyS3 === undefined) {
617
+ this.lazyS3 = new AWS.S3(this.config.get(define_1.AWSComponent.s3));
618
+ }
619
+ return this.lazyS3;
620
+ },
621
+ enumerable: true,
622
+ configurable: true
623
+ });
624
+ Object.defineProperty(SimpleAWS.prototype, "sqs", {
625
+ get: function () {
626
+ if (this.lazySqs === undefined) {
627
+ this.lazySqs = new AWS.SQS(this.config.get(define_1.AWSComponent.sqs));
628
+ }
629
+ return this.lazySqs;
630
+ },
631
+ enumerable: true,
632
+ configurable: true
633
+ });
634
+ Object.defineProperty(SimpleAWS.prototype, "dynamodb", {
635
+ get: function () {
636
+ if (this.lazyDynamodb === undefined) {
637
+ this.lazyDynamodb = new AWS.DynamoDB.DocumentClient(this.config.get(define_1.AWSComponent.dynamodb));
638
+ }
639
+ return this.lazyDynamodb;
640
+ },
641
+ enumerable: true,
642
+ configurable: true
643
+ });
644
+ Object.defineProperty(SimpleAWS.prototype, "dynamodbAdmin", {
645
+ get: function () {
646
+ if (this.lazyDynamodbAdmin === undefined) {
647
+ this.lazyDynamodbAdmin = new AWS.DynamoDB(this.config.get(define_1.AWSComponent.dynamodb));
648
+ }
649
+ return this.lazyDynamodbAdmin;
650
+ },
651
+ enumerable: true,
652
+ configurable: true
653
+ });
654
+ return SimpleAWS;
655
+ }());
656
+ exports.SimpleAWS = SimpleAWS;