@pi-r/aws 0.3.0 → 0.6.0
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.
- package/client/index.d.ts +1 -0
- package/client/index.js +28 -14
- package/package.json +5 -5
- package/upload/index.js +43 -3
package/client/index.d.ts
CHANGED
|
@@ -31,6 +31,7 @@ declare namespace AWS {
|
|
|
31
31
|
function executeBatchQuery(this: ICloud, credential: AWSDatabaseCredential, batch: AWSDatabaseQuery[], sessionKey?: string): Promise<BatchQueryResult>;
|
|
32
32
|
function setDatabaseEndpoint(config: ServiceConfigurationOptions | DynamoDBClientConfig): void;
|
|
33
33
|
function checkBucketCannedACL(value: unknown): BucketCannedACL | undefined;
|
|
34
|
+
function writeMessageDefaultRetention(this: IModule, bucket: string, retention: s3.DefaultRetention, service?: string): void;
|
|
34
35
|
function getBucketKey(credential: unknown, Bucket: string, acl: string | undefined, service: string, sdk: string): string;
|
|
35
36
|
function isNoSuchBucket(err: unknown): boolean;
|
|
36
37
|
}
|
package/client/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.isNoSuchBucket = exports.getBucketKey = exports.checkBucketCannedACL = exports.setDatabaseEndpoint = exports.executeBatchQuery = exports.executeQuery = exports.deleteObjectsV2 = exports.deleteObjects = exports.setBucketWebsite = exports.setBucketPolicy = exports.createBucketV2 = exports.createBucket = exports.createDatabaseClient = exports.createStorageClient = exports.validateDatabase = exports.validateStorage = exports.getPrivatePolicy = exports.getBucketPublicReadPolicy = exports.getPublicReadPolicy = exports.isDatabaseDefined = exports.isEnvDefined = exports.isAccessDefined = void 0;
|
|
3
|
+
exports.isNoSuchBucket = exports.getBucketKey = exports.writeMessageDefaultRetention = exports.checkBucketCannedACL = exports.setDatabaseEndpoint = exports.executeBatchQuery = exports.executeQuery = exports.deleteObjectsV2 = exports.deleteObjects = exports.setBucketWebsite = exports.setBucketPolicy = exports.createBucketV2 = exports.createBucket = exports.createDatabaseClient = exports.createStorageClient = exports.validateDatabase = exports.validateStorage = exports.getPrivatePolicy = exports.getBucketPublicReadPolicy = exports.getPublicReadPolicy = exports.isDatabaseDefined = exports.isEnvDefined = exports.isAccessDefined = void 0;
|
|
4
4
|
const aws = require("aws-sdk");
|
|
5
5
|
const types_1 = require("@e-mc/types");
|
|
6
6
|
const util_1 = require("@e-mc/cloud/util");
|
|
@@ -22,7 +22,7 @@ async function setCannedAcl(S3, Bucket, ACL, service = 'aws', recursive) {
|
|
|
22
22
|
}
|
|
23
23
|
else if (!recursive) {
|
|
24
24
|
if (err instanceof Error && err.code === 'OperationAborted') {
|
|
25
|
-
setTimeout(() => setCannedAcl.call(this, S3, Bucket, ACL, service, true), 60000 /* TIME.m */);
|
|
25
|
+
setTimeout(async () => setCannedAcl.call(this, S3, Bucket, ACL, service, true), 60000 /* TIME.m */);
|
|
26
26
|
this.formatMessage(64 /* LOG_TYPE.CLOUD */, service, [`Grant ${ACL} (delayed)`, Bucket], err, { ...Cloud.LOG_CLOUD_DELAYED });
|
|
27
27
|
}
|
|
28
28
|
else {
|
|
@@ -158,11 +158,11 @@ function createDatabaseClient(credential) {
|
|
|
158
158
|
return new aws.DynamoDB.DocumentClient(options);
|
|
159
159
|
}
|
|
160
160
|
exports.createDatabaseClient = createDatabaseClient;
|
|
161
|
-
function createBucket(credential, Bucket, publicRead, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
161
|
+
async function createBucket(credential, Bucket, publicRead, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
162
162
|
return createBucketV2.call(this, credential, Bucket, publicRead ? 'public-read' : undefined, undefined, service, sdk);
|
|
163
163
|
}
|
|
164
164
|
exports.createBucket = createBucket;
|
|
165
|
-
function createBucketV2(credential, Bucket, ACL, options, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
165
|
+
async function createBucketV2(credential, Bucket, ACL, options, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
166
166
|
ACL = ACL === 1 ? 1 : checkBucketCannedACL(ACL);
|
|
167
167
|
const S3 = createStorageClient.call(this, credential, service, sdk);
|
|
168
168
|
return S3.headBucket({ Bucket }).promise()
|
|
@@ -172,7 +172,7 @@ function createBucketV2(credential, Bucket, ACL, options, service = 'aws', sdk =
|
|
|
172
172
|
}
|
|
173
173
|
return true;
|
|
174
174
|
})
|
|
175
|
-
.catch(() => {
|
|
175
|
+
.catch(async () => {
|
|
176
176
|
const input = { ...options, Bucket };
|
|
177
177
|
const region = credential.region;
|
|
178
178
|
if (region && (region !== 'us-east-1' || service !== 'aws')) {
|
|
@@ -202,7 +202,7 @@ function createBucketV2(credential, Bucket, ACL, options, service = 'aws', sdk =
|
|
|
202
202
|
});
|
|
203
203
|
}
|
|
204
204
|
exports.createBucketV2 = createBucketV2;
|
|
205
|
-
function setBucketPolicy(credential, Bucket, options, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
205
|
+
async function setBucketPolicy(credential, Bucket, options, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
206
206
|
const ibm = service === 'ibm';
|
|
207
207
|
const S3 = createStorageClient.call(this, credential, service, sdk);
|
|
208
208
|
options.Bucket = Bucket;
|
|
@@ -223,7 +223,7 @@ function setBucketPolicy(credential, Bucket, options, service = 'aws', sdk = 'aw
|
|
|
223
223
|
});
|
|
224
224
|
}
|
|
225
225
|
exports.setBucketPolicy = setBucketPolicy;
|
|
226
|
-
function setBucketWebsite(credential, Bucket, options, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
226
|
+
async function setBucketWebsite(credential, Bucket, options, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
227
227
|
const S3 = createStorageClient.call(this, credential, service, sdk);
|
|
228
228
|
const WebsiteConfiguration = {};
|
|
229
229
|
const { indexPage: Suffix, errorPage: Key } = options;
|
|
@@ -246,18 +246,18 @@ function setBucketWebsite(credential, Bucket, options, service = 'aws', sdk = 'a
|
|
|
246
246
|
});
|
|
247
247
|
}
|
|
248
248
|
exports.setBucketWebsite = setBucketWebsite;
|
|
249
|
-
function deleteObjects(credential, Bucket, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
249
|
+
async function deleteObjects(credential, Bucket, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
250
250
|
return deleteObjectsV2.call(this, credential, Bucket, true, service, sdk);
|
|
251
251
|
}
|
|
252
252
|
exports.deleteObjects = deleteObjects;
|
|
253
253
|
async function deleteObjectsV2(credential, Bucket, recursive = true, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
254
254
|
const S3 = createStorageClient.call(this, credential, service, sdk);
|
|
255
255
|
return S3.listObjects({ Bucket }).promise()
|
|
256
|
-
.then(({ Contents }) => {
|
|
256
|
+
.then(async ({ Contents }) => {
|
|
257
257
|
if (Contents?.length) {
|
|
258
258
|
let Objects = Contents.map(data => ({ Key: data.Key }));
|
|
259
259
|
if (!recursive) {
|
|
260
|
-
Objects = Objects.filter(value => value.Key.
|
|
260
|
+
Objects = Objects.filter(value => !value.Key.includes('/'));
|
|
261
261
|
}
|
|
262
262
|
return S3.deleteObjects({ Bucket, Delete: { Objects } }).promise()
|
|
263
263
|
.then(data => {
|
|
@@ -301,11 +301,10 @@ async function executeBatchQuery(credential, batch, sessionKey) {
|
|
|
301
301
|
}
|
|
302
302
|
const renewCache = ignoreCache === 0;
|
|
303
303
|
const getCache = (value) => {
|
|
304
|
-
if (ignoreCache
|
|
305
|
-
|
|
304
|
+
if (ignoreCache !== 1) {
|
|
305
|
+
cacheValue.renewCache = renewCache;
|
|
306
|
+
return this.getQueryResult(service, credential, value, cacheValue);
|
|
306
307
|
}
|
|
307
|
-
cacheValue.renewCache = renewCache;
|
|
308
|
-
return this.getQueryResult(service, credential, value, cacheValue);
|
|
309
308
|
};
|
|
310
309
|
let rows, queryString = caching && ignoreCache !== true || ignoreCache === false || ignoreCache === 1 || renewCache ? table + '_' : '';
|
|
311
310
|
if (key && (id || (0, types_1.isPlainObject)(key))) {
|
|
@@ -370,6 +369,21 @@ function checkBucketCannedACL(value) {
|
|
|
370
369
|
}
|
|
371
370
|
}
|
|
372
371
|
exports.checkBucketCannedACL = checkBucketCannedACL;
|
|
372
|
+
function writeMessageDefaultRetention(bucket, retention, service = 'aws') {
|
|
373
|
+
const { Years = 0, Days = 0, Mode } = retention;
|
|
374
|
+
const status = [];
|
|
375
|
+
if (Years > 0) {
|
|
376
|
+
status.push(Years.toString() + 'Y');
|
|
377
|
+
}
|
|
378
|
+
if (Days > 0) {
|
|
379
|
+
status.push(Days.toString() + 'D');
|
|
380
|
+
}
|
|
381
|
+
if (Mode) {
|
|
382
|
+
status.push(status.length ? `(${Mode})` : Mode);
|
|
383
|
+
}
|
|
384
|
+
this.formatMessage(64 /* LOG_TYPE.CLOUD */, service, ["Bucket configured" /* VAL_CLOUD.CONFIGURE_BUCKET */ + ' (retention policy)', bucket], status.join(' '), { ...Cloud.LOG_CLOUD_COMMAND });
|
|
385
|
+
}
|
|
386
|
+
exports.writeMessageDefaultRetention = writeMessageDefaultRetention;
|
|
373
387
|
const getBucketKey = (credential, Bucket, acl, service, sdk) => Module.asString(credential, true) + Bucket + '_' + (acl || '') + service + sdk;
|
|
374
388
|
exports.getBucketKey = getBucketKey;
|
|
375
389
|
const isNoSuchBucket = (err) => err instanceof Error && err.code === 'NoSuchBucket';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-r/aws",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "AWS V2 cloud functions for E-mc.",
|
|
5
5
|
"main": "client/index.js",
|
|
6
6
|
"types": "client/index.d.ts",
|
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
"license": "MIT",
|
|
22
22
|
"homepage": "https://github.com/anpham6/pi-r#readme",
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@e-mc/cloud": "^0.
|
|
25
|
-
"@e-mc/module": "^0.
|
|
26
|
-
"@e-mc/types": "^0.
|
|
27
|
-
"aws-sdk": "^2.
|
|
24
|
+
"@e-mc/cloud": "^0.8.0",
|
|
25
|
+
"@e-mc/module": "^0.8.0",
|
|
26
|
+
"@e-mc/types": "^0.8.0",
|
|
27
|
+
"aws-sdk": "^2.1524.0"
|
|
28
28
|
}
|
|
29
29
|
}
|
package/upload/index.js
CHANGED
|
@@ -14,7 +14,7 @@ function upload(credential, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
|
14
14
|
return async (data, callback) => {
|
|
15
15
|
var _a;
|
|
16
16
|
const { bucket: Bucket, localUri } = data;
|
|
17
|
-
const { pathname = '', fileGroup, contentType, metadata, endpoint, active, publicRead, acl, admin = {}, overwrite, options } = data.upload;
|
|
17
|
+
const { pathname = '', fileGroup, contentType, metadata, tags, endpoint, active, publicRead, acl, admin = {}, overwrite, options } = data.upload;
|
|
18
18
|
let filename = data.upload.filename || path.basename(localUri), bucketKey;
|
|
19
19
|
const cleanup = () => {
|
|
20
20
|
BUCKET_SESSION.delete(service + Bucket);
|
|
@@ -26,15 +26,30 @@ function upload(credential, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
|
26
26
|
cleanup();
|
|
27
27
|
callback(err);
|
|
28
28
|
};
|
|
29
|
+
const addLog = (err) => err instanceof Error && this.addLog(this.statusType.WARN, err, service, Bucket);
|
|
30
|
+
const configBucket = admin.configBucket;
|
|
29
31
|
if (!BUCKET_SESSION.has(service + Bucket)) {
|
|
30
32
|
const bucketAcl = admin.publicRead ? 'public-read' : admin.acl;
|
|
31
|
-
const response = BUCKET_RESPONSE[_a = bucketKey = (0, client_1.getBucketKey)(credential, Bucket, bucketAcl, service, sdk)] || (BUCKET_RESPONSE[_a] = client_1.createBucketV2.call(this, credential, Bucket, bucketAcl,
|
|
33
|
+
const response = BUCKET_RESPONSE[_a = bucketKey = (0, client_1.getBucketKey)(credential, Bucket, bucketAcl, service, sdk)] || (BUCKET_RESPONSE[_a] = client_1.createBucketV2.call(this, credential, Bucket, bucketAcl, configBucket?.create, service, sdk));
|
|
32
34
|
if (!await response) {
|
|
33
35
|
errorResponse(null);
|
|
34
36
|
return;
|
|
35
37
|
}
|
|
36
38
|
BUCKET_SESSION.add(service + Bucket);
|
|
37
39
|
}
|
|
40
|
+
if (service !== 'oci') {
|
|
41
|
+
const DefaultRetention = configBucket?.retentionPolicy;
|
|
42
|
+
if ((0, types_1.isPlainObject)(DefaultRetention)) {
|
|
43
|
+
s3.putObjectLockConfiguration({ Bucket, ObjectLockConfiguration: { ObjectLockEnabled: 'Enabled', Rule: { DefaultRetention } }, ExpectedBucketOwner: options?.ExpectedBucketOwner, RequestPayer: options?.RequestPayer }, err => {
|
|
44
|
+
if (!err) {
|
|
45
|
+
client_1.writeMessageDefaultRetention.call(this, Bucket, DefaultRetention, service);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
addLog(err);
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
38
53
|
if (!overwrite) {
|
|
39
54
|
const current = filename;
|
|
40
55
|
const next = (0, util_1.generateFilename)(filename);
|
|
@@ -65,7 +80,6 @@ function upload(credential, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
|
65
80
|
const Key = [filename];
|
|
66
81
|
const Body = [data.buffer];
|
|
67
82
|
const ContentType = [contentType];
|
|
68
|
-
const addLog = (err) => err instanceof Error && this.addLog(this.statusType.WARN, err.message, service + ': ' + Bucket);
|
|
69
83
|
if (fileGroup) {
|
|
70
84
|
for (const [content, ext, localFile] of fileGroup) {
|
|
71
85
|
try {
|
|
@@ -115,6 +129,32 @@ function upload(credential, service = 'aws', sdk = 'aws-sdk/clients/s3') {
|
|
|
115
129
|
const url = endpoint ? Module.joinPath(endpoint, result.Key) : result.Location;
|
|
116
130
|
this.formatMessage(64 /* LOG_TYPE.CLOUD */, service, "Upload success" /* VAL_CLOUD.UPLOAD_FILE */, url, { ...Cloud.LOG_CLOUD_UPLOAD });
|
|
117
131
|
if (first) {
|
|
132
|
+
if (service !== 'oci') {
|
|
133
|
+
if ((0, types_1.isPlainObject)(tags)) {
|
|
134
|
+
const TagSet = [];
|
|
135
|
+
for (const name in tags) {
|
|
136
|
+
TagSet.push({ Key: name, Value: tags[name] });
|
|
137
|
+
}
|
|
138
|
+
s3.putObjectTagging({ Bucket, Key: result.Key, Tagging: { TagSet }, ExpectedBucketOwner: params.ExpectedBucketOwner, RequestPayer: params.RequestPayer }, error => {
|
|
139
|
+
if (!error) {
|
|
140
|
+
this.formatMessage(64 /* LOG_TYPE.CLOUD */, service, ["Tags created" /* VAL_CLOUD.CREATE_TAG */, Bucket], result.Key, { ...Cloud.LOG_CLOUD_COMMAND });
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
addLog(error);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
else if (tags === false) {
|
|
148
|
+
s3.deleteObjectTagging({ Bucket, Key: result.Key, ExpectedBucketOwner: params.ExpectedBucketOwner }, error => {
|
|
149
|
+
if (!error) {
|
|
150
|
+
this.formatMessage(64 /* LOG_TYPE.CLOUD */, service, ["Tags deleted" /* VAL_CLOUD.DELETE_TAG */, Bucket], result.Key, { ...Cloud.LOG_CLOUD_COMMAND });
|
|
151
|
+
}
|
|
152
|
+
else {
|
|
153
|
+
addLog(error);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
}
|
|
118
158
|
cleanup();
|
|
119
159
|
callback(null, url);
|
|
120
160
|
}
|