@pi-r/aws-v3 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.js CHANGED
@@ -8,7 +8,7 @@ const util_1 = require("@e-mc/cloud/util");
8
8
  const types_1 = require("@e-mc/types");
9
9
  const Module = require("@e-mc/module");
10
10
  const Cloud = require("@e-mc/cloud");
11
- function setCannedAcl(S3, client, Bucket, ACL, service = 'aws-v3', recursive) {
11
+ async function setCannedAcl(S3, client, Bucket, ACL, service = 'aws-v3', recursive) {
12
12
  let Policy;
13
13
  switch (ACL) {
14
14
  case 1:
@@ -28,7 +28,7 @@ function setCannedAcl(S3, client, Bucket, ACL, service = 'aws-v3', recursive) {
28
28
  .catch((err) => {
29
29
  if (!recursive && err instanceof Error) {
30
30
  if (err.name === 'OperationAborted') {
31
- setTimeout(() => setCannedAcl.call(this, S3, client, Bucket, ACL, service, true), 60000 /* TIME.m */);
31
+ setTimeout(async () => setCannedAcl.call(this, S3, client, Bucket, ACL, service, true), 60000 /* TIME.m */);
32
32
  this.formatMessage(64 /* LOG_TYPE.CLOUD */, service, [`Grant ${ACL} (delayed)`, err.Endpoint || Bucket], err, { ...Cloud.LOG_CLOUD_DELAYED });
33
33
  }
34
34
  else {
@@ -90,11 +90,11 @@ function validateDatabase(credential, data) {
90
90
  return (0, aws_1.isDatabaseDefined)(credential, data) && validateStorage(credential);
91
91
  }
92
92
  exports.validateDatabase = validateDatabase;
93
- function createBucket(credential, Bucket, publicRead, service = 'aws-v3', sdk = '@aws-sdk/client-s3') {
93
+ async function createBucket(credential, Bucket, publicRead, service = 'aws-v3', sdk = '@aws-sdk/client-s3') {
94
94
  return createBucketV2.call(this, credential, Bucket, publicRead ? 'public-read' : undefined, undefined, service, sdk);
95
95
  }
96
96
  exports.createBucket = createBucket;
97
- function createBucketV2(credential, Bucket, ACL, options, service = 'aws-v3', sdk = '@aws-sdk/client-s3') {
97
+ async function createBucketV2(credential, Bucket, ACL, options, service = 'aws-v3', sdk = '@aws-sdk/client-s3') {
98
98
  ACL = ACL === 1 ? 1 : (0, aws_1.checkBucketCannedACL)(ACL);
99
99
  const [client, AWS] = createStorageClient.call(this, credential, service, sdk);
100
100
  return client.send(new AWS.HeadBucketCommand({ Bucket }))
@@ -104,7 +104,7 @@ function createBucketV2(credential, Bucket, ACL, options, service = 'aws-v3', sd
104
104
  }
105
105
  return true;
106
106
  })
107
- .catch(() => {
107
+ .catch(async () => {
108
108
  const input = { ...options, Bucket };
109
109
  const region = credential.region;
110
110
  if (typeof region === 'string' && region !== 'us-east-1') {
@@ -134,7 +134,7 @@ function createBucketV2(credential, Bucket, ACL, options, service = 'aws-v3', sd
134
134
  });
135
135
  }
136
136
  exports.createBucketV2 = createBucketV2;
137
- function setBucketPolicy(credential, Bucket, options, service = 'aws', sdk = 'aws-sdk/clients/s3') {
137
+ async function setBucketPolicy(credential, Bucket, options, service = 'aws', sdk = 'aws-sdk/clients/s3') {
138
138
  const [client, AWS] = createStorageClient.call(this, credential, service, sdk);
139
139
  const block = 'PublicAccessBlockConfiguration' in options;
140
140
  const policy = !block && 'Policy' in options && !('ACL' in options);
@@ -152,7 +152,7 @@ function setBucketPolicy(credential, Bucket, options, service = 'aws', sdk = 'aw
152
152
  });
153
153
  }
154
154
  exports.setBucketPolicy = setBucketPolicy;
155
- function setBucketWebsite(credential, Bucket, options, service = 'aws', sdk = 'aws-sdk/clients/s3') {
155
+ async function setBucketWebsite(credential, Bucket, options, service = 'aws', sdk = 'aws-sdk/clients/s3') {
156
156
  const [client, AWS] = createStorageClient.call(this, credential, service, sdk);
157
157
  const WebsiteConfiguration = {};
158
158
  const { indexPage: Suffix, errorPage: Key } = options;
@@ -175,18 +175,18 @@ function setBucketWebsite(credential, Bucket, options, service = 'aws', sdk = 'a
175
175
  });
176
176
  }
177
177
  exports.setBucketWebsite = setBucketWebsite;
178
- function deleteObjects(credential, Bucket, service, sdk) {
178
+ async function deleteObjects(credential, Bucket, service, sdk) {
179
179
  return deleteObjectsV2.call(this, credential, Bucket, true, service, sdk);
180
180
  }
181
181
  exports.deleteObjects = deleteObjects;
182
182
  async function deleteObjectsV2(credential, Bucket, recursive = true, service = 'aws-v3', sdk = '@aws-sdk/client-s3') {
183
183
  const [client, AWS] = createStorageClient.call(this, credential, service, sdk);
184
184
  return client.send(new AWS.ListObjectsCommand({ Bucket }))
185
- .then(({ Contents }) => {
185
+ .then(async ({ Contents }) => {
186
186
  if (Contents?.length) {
187
187
  let Objects = Contents.map(data => ({ Key: data.Key }));
188
188
  if (!recursive) {
189
- Objects = Objects.filter(value => value.Key.indexOf('/') === -1);
189
+ Objects = Objects.filter(value => !value.Key.includes('/'));
190
190
  }
191
191
  return client.send(new AWS.DeleteObjectsCommand({ Bucket, Delete: { Objects } }))
192
192
  .then(data => {
@@ -230,11 +230,10 @@ async function executeBatchQuery(credential, batch, sessionKey) {
230
230
  (0, aws_1.setDatabaseEndpoint)(credential);
231
231
  const renewCache = ignoreCache === 0;
232
232
  const getCache = (value) => {
233
- if (ignoreCache === 1) {
234
- return;
233
+ if (ignoreCache !== 1) {
234
+ cacheValue.renewCache = renewCache;
235
+ return this.getQueryResult(service, credential, value, cacheValue);
235
236
  }
236
- cacheValue.renewCache = renewCache;
237
- return this.getQueryResult(service, credential, value, cacheValue);
238
237
  };
239
238
  let rows, queryString = caching && ignoreCache !== true || ignoreCache === false || ignoreCache === 1 || renewCache ? table + '_' : '';
240
239
  if (key && (id || (0, types_1.isPlainObject)(key))) {
package/download/index.js CHANGED
@@ -16,9 +16,7 @@ function download(config, service = 'aws-v3', sdk = '@aws-sdk/client-s3') {
16
16
  }
17
17
  const location = Module.joinPath(Bucket, Key);
18
18
  let input = { Bucket, Key, VersionId: target.versionId };
19
- // @ts-ignore
20
- client
21
- .send(new AWS.GetObjectCommand(input), { abortSignal: this.signal })
19
+ client.send(new AWS.GetObjectCommand(input), { abortSignal: this.signal })
22
20
  .then(result => {
23
21
  (0, util_1.readableAsBuffer)(result.Body).then(buffer => callback(null, buffer)).catch(err => callback(err));
24
22
  const deleteObject = target.deleteObject;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pi-r/aws-v3",
3
- "version": "0.3.0",
3
+ "version": "0.6.0",
4
4
  "description": "AWS V3 cloud functions for E-mc.",
5
5
  "main": "client/index.js",
6
6
  "publishConfig": {
@@ -20,12 +20,12 @@
20
20
  "license": "MIT",
21
21
  "homepage": "https://github.com/anpham6/pi-r#readme",
22
22
  "dependencies": {
23
- "@e-mc/cloud": "^0.6.0",
24
- "@e-mc/module": "^0.6.0",
25
- "@e-mc/types": "^0.6.0",
26
- "@pi-r/aws": "^0.3.0",
27
- "@aws-sdk/client-dynamodb": "^3.385.0",
28
- "@aws-sdk/client-s3": "^3.385.0",
29
- "@aws-sdk/lib-dynamodb": "^3.385.0"
23
+ "@e-mc/cloud": "^0.8.0",
24
+ "@e-mc/module": "^0.8.0",
25
+ "@e-mc/types": "^0.8.0",
26
+ "@pi-r/aws": "^0.6.0",
27
+ "@aws-sdk/client-dynamodb": "^3.478.0",
28
+ "@aws-sdk/client-s3": "^3.478.0",
29
+ "@aws-sdk/lib-dynamodb": "^3.478.0"
30
30
  }
31
31
  }
package/upload/index.js CHANGED
@@ -16,7 +16,7 @@ function upload(credential, service = 'aws-v3', sdk = '@aws-sdk/client-s3') {
16
16
  return async (data, callback) => {
17
17
  var _a;
18
18
  const { bucket: Bucket, localUri } = data;
19
- const { pathname = '', fileGroup, contentType, metadata, endpoint, active, publicRead, acl, admin = {}, overwrite, options } = data.upload;
19
+ const { pathname = '', fileGroup, contentType, metadata, tags, endpoint, active, publicRead, acl, admin = {}, overwrite, options } = data.upload;
20
20
  let filename = data.upload.filename || path.basename(localUri), bucketKey;
21
21
  const cleanup = () => {
22
22
  BUCKET_SESSION.delete(service + Bucket);
@@ -29,15 +29,25 @@ function upload(credential, service = 'aws-v3', sdk = '@aws-sdk/client-s3') {
29
29
  callback(err);
30
30
  return false;
31
31
  };
32
+ const addLog = (err) => err instanceof Error && this.addLog(this.statusType.WARN, err, service, Bucket);
33
+ const configBucket = admin.configBucket;
32
34
  if (!BUCKET_SESSION.has(service + Bucket)) {
33
35
  const bucketAcl = admin.publicRead ? 'public-read' : admin.acl;
34
- const response = BUCKET_RESPONSE[_a = bucketKey = (0, aws_1.getBucketKey)(credential, Bucket, bucketAcl, service, sdk)] || (BUCKET_RESPONSE[_a] = client_1.createBucketV2.call(this, credential, Bucket, bucketAcl, admin.configBucket?.create, service, sdk));
36
+ const response = BUCKET_RESPONSE[_a = bucketKey = (0, aws_1.getBucketKey)(credential, Bucket, bucketAcl, service, sdk)] || (BUCKET_RESPONSE[_a] = client_1.createBucketV2.call(this, credential, Bucket, bucketAcl, configBucket?.create, service, sdk));
35
37
  if (!await response) {
36
38
  errorResponse(null);
37
39
  return;
38
40
  }
39
41
  BUCKET_SESSION.add(service + Bucket);
40
42
  }
43
+ const DefaultRetention = configBucket?.retentionPolicy;
44
+ if ((0, types_1.isPlainObject)(DefaultRetention)) {
45
+ client.send(new AWS.PutObjectLockConfigurationCommand({ Bucket, ObjectLockConfiguration: { ObjectLockEnabled: 'Enabled', Rule: { DefaultRetention } }, ExpectedBucketOwner: options?.ExpectedBucketOwner, RequestPayer: options?.RequestPayer }))
46
+ .then(() => {
47
+ aws_1.writeMessageDefaultRetention.call(this, Bucket, DefaultRetention, service);
48
+ })
49
+ .catch(err => addLog(err));
50
+ }
41
51
  if (!overwrite) {
42
52
  const current = filename;
43
53
  const next = (0, util_1.generateFilename)(filename);
@@ -69,7 +79,6 @@ function upload(credential, service = 'aws-v3', sdk = '@aws-sdk/client-s3') {
69
79
  const Key = [filename];
70
80
  const Body = [data.buffer];
71
81
  const ContentType = [contentType];
72
- const addLog = (err) => err instanceof Error && this.addLog(this.statusType.WARN, err.message, service + ': ' + Bucket);
73
82
  if (fileGroup) {
74
83
  for (const [content, ext, localFile] of fileGroup) {
75
84
  try {
@@ -128,11 +137,34 @@ function upload(credential, service = 'aws-v3', sdk = '@aws-sdk/client-s3') {
128
137
  }
129
138
  continue;
130
139
  }
131
- // @ts-ignore
132
140
  client.send(new AWS.PutObjectCommand(params), { abortSignal: this.signal })
133
141
  .then(() => {
134
142
  const url = endpoint ? Module.joinPath(endpoint, objectKey) : Module.joinPath(`https://${Bucket}.s3.${!credential.region || credential.region === 'us-east-1' ? 'us-east-1.' : ''}amazonaws.com`, objectKey);
135
143
  if (first) {
144
+ if ((0, types_1.isPlainObject)(tags)) {
145
+ const TagSet = [];
146
+ for (const name in tags) {
147
+ TagSet.push({ Key: name, Value: tags[name] });
148
+ }
149
+ client.send(new AWS.PutObjectTaggingCommand({ Bucket, Key: params.Key, ExpectedBucketOwner: params.ExpectedBucketOwner, Tagging: { TagSet }, RequestPayer: params.RequestPayer }), error => {
150
+ if (!error) {
151
+ this.formatMessage(64 /* LOG_TYPE.CLOUD */, service, ["Tags created" /* VAL_CLOUD.CREATE_TAG */, Bucket], params.Key, { ...Cloud.LOG_CLOUD_COMMAND });
152
+ }
153
+ else {
154
+ addLog(error);
155
+ }
156
+ });
157
+ }
158
+ else if (tags === false) {
159
+ client.send(new AWS.DeleteObjectTaggingCommand({ Bucket, Key: params.Key, ExpectedBucketOwner: params.ExpectedBucketOwner }), error => {
160
+ if (!error) {
161
+ this.formatMessage(64 /* LOG_TYPE.CLOUD */, service, ["Tags deleted" /* VAL_CLOUD.DELETE_TAG */, Bucket], params.Key, { ...Cloud.LOG_CLOUD_COMMAND });
162
+ }
163
+ else {
164
+ addLog(error);
165
+ }
166
+ });
167
+ }
136
168
  cleanup();
137
169
  callback(null, url);
138
170
  }