@hestia-earth/pipeline-utils 0.15.5 → 0.16.1
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/dist/ec2.d.ts +1 -1
- package/dist/ec2.js +3 -6
- package/dist/ec2.js.map +1 -1
- package/dist/find-nodes.js +5 -6
- package/dist/find-nodes.js.map +1 -1
- package/dist/lambda.d.ts +1 -1
- package/dist/lambda.js +5 -7
- package/dist/lambda.js.map +1 -1
- package/dist/progress.d.ts +2 -2
- package/dist/progress.js +3 -4
- package/dist/progress.js.map +1 -1
- package/dist/s3.d.ts +16 -15
- package/dist/s3.js +95 -69
- package/dist/s3.js.map +1 -1
- package/dist/sns.d.ts +1 -1
- package/dist/sns.js +4 -7
- package/dist/sns.js.map +1 -1
- package/dist/sqs.d.ts +2 -2
- package/dist/sqs.js +3 -6
- package/dist/sqs.js.map +1 -1
- package/dist/write-json-stream.d.ts +1 -1
- package/dist/write-json-stream.js +1 -1
- package/dist/write-json-stream.js.map +1 -1
- package/jest.setup.js +15 -0
- package/package.json +16 -14
- package/src/ec2.ts +5 -6
- package/src/find-nodes.ts +1 -2
- package/src/lambda.ts +7 -7
- package/src/progress.ts +1 -2
- package/src/s3.ts +148 -105
- package/src/sns.ts +5 -6
- package/src/sqs.ts +6 -7
- package/src/write-json-stream.ts +2 -2
package/dist/sns.js
CHANGED
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.publishSnsMessage = void 0;
|
|
4
|
-
const
|
|
4
|
+
const client_sns_1 = require("@aws-sdk/client-sns");
|
|
5
5
|
const rxjs_1 = require("rxjs");
|
|
6
|
-
const operators_1 = require("rxjs/operators");
|
|
7
6
|
const log_1 = require("./log");
|
|
8
7
|
const s3_1 = require("./s3");
|
|
9
8
|
const utils_1 = require("./utils");
|
|
10
9
|
const publishSnsMessage = (functionName, params, topicArn = process.env.SNS_TOPIC, extras = {}) => s3_1.isS3Mode
|
|
11
|
-
? (0, rxjs_1.from)(new
|
|
12
|
-
.publish({
|
|
10
|
+
? (0, rxjs_1.from)(new client_sns_1.SNSClient({}).send(new client_sns_1.PublishCommand({
|
|
13
11
|
TopicArn: topicArn,
|
|
14
12
|
Message: JSON.stringify(params),
|
|
15
13
|
MessageAttributes: {
|
|
@@ -25,11 +23,10 @@ const publishSnsMessage = (functionName, params, topicArn = process.env.SNS_TOPI
|
|
|
25
23
|
}
|
|
26
24
|
]))
|
|
27
25
|
}
|
|
28
|
-
})
|
|
29
|
-
.promise()).pipe((0, operators_1.take)(1), (0, operators_1.map)(res => {
|
|
26
|
+
}))).pipe((0, rxjs_1.take)(1), (0, rxjs_1.map)(res => {
|
|
30
27
|
(0, log_1.info)(`SNS publish ${functionName}`, { params }, ', params byte size:', (0, utils_1.byteSize)(params), res);
|
|
31
28
|
return res;
|
|
32
|
-
}), (0,
|
|
29
|
+
}), (0, rxjs_1.catchError)(err => {
|
|
33
30
|
(0, log_1.error)(`SNS publish ${functionName}`, { params }, ', params byte size:', (0, utils_1.byteSize)(params), err);
|
|
34
31
|
return (0, rxjs_1.throwError)(err);
|
|
35
32
|
}))
|
package/dist/sns.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sns.js","sourceRoot":"","sources":["../src/sns.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"sns.js","sourceRoot":"","sources":["../src/sns.ts"],"names":[],"mappings":";;;AAAA,oDAAgE;AAChE,+BAAmE;AAEnE,+BAAoC;AACpC,6BAAgD;AAChD,mCAAmC;AAM5B,MAAM,iBAAiB,GAAG,CAC/B,YAAoB,EACpB,MAA4C,EAC5C,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,SAAS,EAChC,SAAqB,EAAE,EACvB,EAAE,CACF,aAAQ;IACN,CAAC,CAAC,IAAA,WAAI,EACF,IAAI,sBAAS,CAAC,EAAE,CAAC,CAAC,IAAI,CACpB,IAAI,2BAAc,CAAC;QACjB,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QAC/B,iBAAiB,EAAE;YACjB,YAAY,EAAE;gBACZ,QAAQ,EAAE,QAAQ;gBAClB,WAAW,EAAE,YAAY;aAC1B;YACD,GAAG,MAAM,CAAC,WAAW,CACnB,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;gBACjD,GAAG;gBACH;oBACE,QAAQ,EAAE,QAAQ;oBAClB,WAAW,EAAE,KAAK;iBACnB;aACF,CAAC,CACH;SACF;KACF,CAAC,CACH,CACF,CAAC,IAAI,CACJ,IAAA,WAAI,EAAC,CAAC,CAAC,EACP,IAAA,UAAG,EAAC,GAAG,CAAC,EAAE;QACR,IAAA,UAAI,EAAC,eAAe,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,qBAAqB,EAAE,IAAA,gBAAQ,EAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QAC9F,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,EACF,IAAA,iBAAU,EAAC,GAAG,CAAC,EAAE;QACf,IAAA,WAAK,EAAC,eAAe,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,qBAAqB,EAAE,IAAA,gBAAQ,EAAC,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/F,OAAO,IAAA,iBAAU,EAAC,GAAG,CAAC,CAAC;IACzB,CAAC,CAAC,CACH;IACH,CAAC,CAAC,IAAA,SAAE,EAAC,IAAI,CAAC,CAAC;AAxCF,QAAA,iBAAiB,qBAwCf"}
|
package/dist/sqs.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { SendMessageCommandInput } from '@aws-sdk/client-sqs';
|
|
2
2
|
import { IFunctionParam } from './s3';
|
|
3
3
|
type attributes = {
|
|
4
4
|
[key: string]: string;
|
|
5
5
|
};
|
|
6
|
-
export declare const sendSqsMessage: (functionName: string, params: IFunctionParam | Record<string, any>, queueUrl?: string, extras?: attributes, requestParams?: Partial<Omit<
|
|
6
|
+
export declare const sendSqsMessage: (functionName: string, params: IFunctionParam | Record<string, any>, queueUrl?: string, extras?: attributes, requestParams?: Partial<Omit<SendMessageCommandInput, 'QueueUrl' | 'MessageBody' | 'MessageAttributes'>>) => import("rxjs").Observable<import("@aws-sdk/client-sqs").SendMessageCommandOutput>;
|
|
7
7
|
export {};
|
package/dist/sqs.js
CHANGED
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.sendSqsMessage = void 0;
|
|
4
|
-
const
|
|
4
|
+
const client_sqs_1 = require("@aws-sdk/client-sqs");
|
|
5
5
|
const rxjs_1 = require("rxjs");
|
|
6
|
-
const operators_1 = require("rxjs/operators");
|
|
7
6
|
const log_1 = require("./log");
|
|
8
7
|
const s3_1 = require("./s3");
|
|
9
8
|
const sendSqsMessage = (functionName, params, queueUrl = process.env.SQS_URL, extras = {}, requestParams = {}) => s3_1.isS3Mode
|
|
10
|
-
? (0, rxjs_1.from)(new
|
|
11
|
-
.sendMessage({
|
|
9
|
+
? (0, rxjs_1.from)(new client_sqs_1.SQSClient({ region: s3_1.region }).send(new client_sqs_1.SendMessageCommand({
|
|
12
10
|
QueueUrl: queueUrl,
|
|
13
11
|
MessageBody: JSON.stringify(params),
|
|
14
12
|
MessageAttributes: {
|
|
@@ -25,8 +23,7 @@ const sendSqsMessage = (functionName, params, queueUrl = process.env.SQS_URL, ex
|
|
|
25
23
|
]))
|
|
26
24
|
},
|
|
27
25
|
...requestParams
|
|
28
|
-
})
|
|
29
|
-
.promise()).pipe((0, operators_1.take)(1), (0, operators_1.map)(res => {
|
|
26
|
+
}))).pipe((0, rxjs_1.take)(1), (0, rxjs_1.map)(res => {
|
|
30
27
|
(0, log_1.info)(`SQS send message ${functionName}`, { params }, res);
|
|
31
28
|
return res;
|
|
32
29
|
}))
|
package/dist/sqs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqs.js","sourceRoot":"","sources":["../src/sqs.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"sqs.js","sourceRoot":"","sources":["../src/sqs.ts"],"names":[],"mappings":";;;AAAA,oDAA6F;AAC7F,+BAA2C;AAE3C,+BAA6B;AAC7B,6BAAwD;AAMjD,MAAM,cAAc,GAAG,CAC5B,YAAoB,EACpB,MAA4C,EAC5C,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAC9B,SAAqB,EAAE,EACvB,gBAA0G,EAAE,EAC5G,EAAE,CACF,aAAQ;IACN,CAAC,CAAC,IAAA,WAAI,EACF,IAAI,sBAAS,CAAC,EAAE,MAAM,EAAN,WAAM,EAAE,CAAC,CAAC,IAAI,CAC5B,IAAI,+BAAkB,CAAC;QACrB,QAAQ,EAAE,QAAQ;QAClB,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QACnC,iBAAiB,EAAE;YACjB,YAAY,EAAE;gBACZ,QAAQ,EAAE,QAAQ;gBAClB,WAAW,EAAE,YAAY;aAC1B;YACD,GAAG,MAAM,CAAC,WAAW,CACnB,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC;gBACjD,GAAG;gBACH;oBACE,QAAQ,EAAE,QAAQ;oBAClB,WAAW,EAAE,KAAK;iBACnB;aACF,CAAC,CACH;SACF;QACD,GAAG,aAAa;KACjB,CAAC,CACH,CACF,CAAC,IAAI,CACJ,IAAA,WAAI,EAAC,CAAC,CAAC,EACP,IAAA,UAAG,EAAC,GAAG,CAAC,EAAE;QACR,IAAA,UAAI,EAAC,oBAAoB,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1D,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CACH;IACH,CAAC,CAAC,IAAA,SAAE,EAAC,IAAI,CAAC,CAAC;AAtCF,QAAA,cAAc,kBAsCZ"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare const streamJSONToFile: (filepath: string, data: Record<string, any>) => Promise<
|
|
1
|
+
export declare const streamJSONToFile: (filepath: string, data: Record<string, any>) => Promise<void>;
|
|
@@ -34,7 +34,7 @@ const stringify = (writeStream, data) => data !== null && typeof data === 'objec
|
|
|
34
34
|
: writeStream.write(JSON.stringify(data), encoding);
|
|
35
35
|
const streamJSONToFile = (filepath, data) => new Promise((resolve, reject) => {
|
|
36
36
|
const writeStream = (0, fs_1.createWriteStream)(filepath);
|
|
37
|
-
writeStream.on('finish', resolve);
|
|
37
|
+
writeStream.on('finish', () => resolve());
|
|
38
38
|
writeStream.on('error', reject);
|
|
39
39
|
stringify(writeStream, data);
|
|
40
40
|
writeStream.end();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write-json-stream.js","sourceRoot":"","sources":["../src/write-json-stream.ts"],"names":[],"mappings":";;;AAAA,2BAAoD;AAEpD,MAAM,QAAQ,GAAG,OAAO,CAAC;AAEzB,MAAM,WAAW,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,WAAW,CAAC;AAEjE,MAAM,cAAc,GAAG,CAAC,WAAwB,EAAE,IAAW,EAAE,EAAE;IAC/D,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAEjC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAChD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;QACD,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,WAAwB,EAAE,IAAyB,EAAE,EAAE;IAC9E,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAEjC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SACjB,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAC7C,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE;QAC/B,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;QACD,WAAW,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC;QACzC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IACL,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,WAAwB,EAAE,IAAS,EAAE,EAAE,CACxD,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;IACvC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACnB,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC;QACnC,CAAC,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC;IACtC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;AAEjD,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,IAAyB,EAAE,EAAE,CAC9E,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"write-json-stream.js","sourceRoot":"","sources":["../src/write-json-stream.ts"],"names":[],"mappings":";;;AAAA,2BAAoD;AAEpD,MAAM,QAAQ,GAAG,OAAO,CAAC;AAEzB,MAAM,WAAW,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,WAAW,CAAC;AAEjE,MAAM,cAAc,GAAG,CAAC,WAAwB,EAAE,IAAW,EAAE,EAAE;IAC/D,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAEjC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAChD,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;QACD,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,WAAwB,EAAE,IAAyB,EAAE,EAAE;IAC9E,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IAEjC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SACjB,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAC7C,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE;QAC/B,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC;QACD,WAAW,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC;QACzC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IACL,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC,WAAwB,EAAE,IAAS,EAAE,EAAE,CACxD,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;IACvC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;QACnB,CAAC,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,CAAC;QACnC,CAAC,CAAC,eAAe,CAAC,WAAW,EAAE,IAAI,CAAC;IACtC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;AAEjD,MAAM,gBAAgB,GAAG,CAAC,QAAgB,EAAE,IAAyB,EAAE,EAAE,CAC9E,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IACpC,MAAM,WAAW,GAAG,IAAA,sBAAiB,EAAC,QAAQ,CAAC,CAAC;IAChD,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC7B,WAAW,CAAC,GAAG,EAAE,CAAC;AACpB,CAAC,CAAC,CAAC;AAPQ,QAAA,gBAAgB,oBAOxB"}
|
package/jest.setup.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const defaultEnv = (key, value) => {
|
|
2
|
+
process.env[key] = process.env[key] || value;
|
|
3
|
+
return process.env[key];
|
|
4
|
+
};
|
|
5
|
+
|
|
6
|
+
defaultEnv('TMP_DIR', './');
|
|
7
|
+
defaultEnv('ELASTICSEARCH_URL', 'http://localhost:9200');
|
|
8
|
+
defaultEnv('ELASTICSEARCH_INDEX', 'test');
|
|
9
|
+
// enable search by normalized field
|
|
10
|
+
defaultEnv('SEARCH_NORMALIZED', 'true');
|
|
11
|
+
// enable search by API
|
|
12
|
+
defaultEnv('API_URL', 'http://localhost:3001');
|
|
13
|
+
defaultEnv('API_ACCESS_TOKEN', 'token');
|
|
14
|
+
// enable cache requests
|
|
15
|
+
defaultEnv('CACHE_MAX_SIZE', '1');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hestia-earth/pipeline-utils",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.16.1",
|
|
4
4
|
"description": "Utilities for running pipelines",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
@@ -8,8 +8,8 @@
|
|
|
8
8
|
"build": "rimraf ./dist && tsc -p tsconfig.dist.json",
|
|
9
9
|
"lint": "eslint \"src/**/*.ts\"",
|
|
10
10
|
"lint:fix": "npm run lint -- --fix",
|
|
11
|
-
"test": "
|
|
12
|
-
"test:watch": "
|
|
11
|
+
"test": "jest",
|
|
12
|
+
"test:watch": "jest --watch",
|
|
13
13
|
"release": "standard-version",
|
|
14
14
|
"postrelease": "git push origin master --follow-tags"
|
|
15
15
|
},
|
|
@@ -28,9 +28,15 @@
|
|
|
28
28
|
},
|
|
29
29
|
"homepage": "https://gitlab.com/hestia-earth/hestia-pipeline-utils#readme",
|
|
30
30
|
"dependencies": {
|
|
31
|
+
"@aws-sdk/client-ec2": "^3.525.0",
|
|
32
|
+
"@aws-sdk/client-lambda": "^3.525.0",
|
|
33
|
+
"@aws-sdk/client-s3": "^3.525.0",
|
|
34
|
+
"@aws-sdk/client-sns": "^3.525.0",
|
|
35
|
+
"@aws-sdk/client-sqs": "^3.525.0",
|
|
36
|
+
"@aws-sdk/lib-storage": "^3.525.0",
|
|
37
|
+
"@aws-sdk/util-utf8-node": "^3.259.0",
|
|
31
38
|
"@elastic/elasticsearch": "7.13.0",
|
|
32
39
|
"@slack/web-api": "^7.7.0",
|
|
33
|
-
"aws-sdk": "^2.1692.0",
|
|
34
40
|
"axios": "^1.4.0",
|
|
35
41
|
"bson": "^4.7.2",
|
|
36
42
|
"lodash.get": "^4.4.2",
|
|
@@ -38,7 +44,7 @@
|
|
|
38
44
|
"lodash.pick": "^4.4.0",
|
|
39
45
|
"memory-cache": "^0.2.0",
|
|
40
46
|
"mongodb": "^3.7.4",
|
|
41
|
-
"rxjs": "^
|
|
47
|
+
"rxjs": "^7.8.1"
|
|
42
48
|
},
|
|
43
49
|
"peerDependencies": {
|
|
44
50
|
"@hestia-earth/api": ">=0.21.0",
|
|
@@ -55,26 +61,22 @@
|
|
|
55
61
|
"@hestia-earth/schema": "^30.3.2",
|
|
56
62
|
"@hestia-earth/utils": "^0.13.9",
|
|
57
63
|
"@types/aws-lambda": "^8.10.130",
|
|
58
|
-
"@types/
|
|
64
|
+
"@types/jest": "^30.0.0",
|
|
59
65
|
"@types/lodash.get": "^4.4.9",
|
|
60
66
|
"@types/lodash.omit": "^4.5.9",
|
|
61
67
|
"@types/lodash.pick": "^4.4.9",
|
|
62
|
-
"@types/mocha": "^10.0.6",
|
|
63
68
|
"@types/mongodb": "^3.6.20",
|
|
64
|
-
"@types/node": "^
|
|
69
|
+
"@types/node": "^22.19.3",
|
|
65
70
|
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
|
66
71
|
"@typescript-eslint/parser": "^5.62.0",
|
|
67
|
-
"chai": "^4.3.10",
|
|
68
72
|
"dotenv": "^16.4.7",
|
|
69
73
|
"eslint": "^7.32.0",
|
|
70
74
|
"eslint-plugin-jsdoc": "^30.7.13",
|
|
71
75
|
"husky": "^4.3.8",
|
|
72
|
-
"
|
|
73
|
-
"nyc": "^15.1.0",
|
|
76
|
+
"jest": "^30.2.0",
|
|
74
77
|
"prettier": "^3.1.1",
|
|
75
|
-
"sinon": "^15.2.0",
|
|
76
|
-
"source-map-support": "^0.5.21",
|
|
77
78
|
"standard-version": "^9.5.0",
|
|
79
|
+
"ts-jest": "^29.4.6",
|
|
78
80
|
"ts-node": "^10.9.2",
|
|
79
81
|
"typescript": "^5.3.3"
|
|
80
82
|
},
|
|
@@ -86,6 +88,6 @@
|
|
|
86
88
|
"prettier": "@hestia-earth/eslint-config/prettier.json",
|
|
87
89
|
"engines": {
|
|
88
90
|
"npm": ">=8.0.0",
|
|
89
|
-
"node": ">=
|
|
91
|
+
"node": ">=22.0.0"
|
|
90
92
|
}
|
|
91
93
|
}
|
package/src/ec2.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { from, of } from 'rxjs';
|
|
3
|
-
import { take, map } from 'rxjs/operators';
|
|
1
|
+
import { EC2Client, StartInstancesCommand } from '@aws-sdk/client-ec2';
|
|
2
|
+
import { from, of, take, map } from 'rxjs';
|
|
4
3
|
|
|
5
4
|
import { debug } from './log';
|
|
6
5
|
import { isS3Mode } from './s3';
|
|
@@ -10,11 +9,11 @@ const defaultInstanceIds = (process.env.START_INSTANCE_ID || '').split(',');
|
|
|
10
9
|
export const startInstances = (functionName: string, instanceIds = defaultInstanceIds) =>
|
|
11
10
|
isS3Mode
|
|
12
11
|
? from(
|
|
13
|
-
new
|
|
14
|
-
|
|
12
|
+
new EC2Client({}).send(
|
|
13
|
+
new StartInstancesCommand({
|
|
15
14
|
InstanceIds: instanceIds
|
|
16
15
|
})
|
|
17
|
-
|
|
16
|
+
)
|
|
18
17
|
).pipe(
|
|
19
18
|
take(1),
|
|
20
19
|
map(res => {
|
package/src/find-nodes.ts
CHANGED
|
@@ -5,8 +5,7 @@ const cache = require('memory-cache');
|
|
|
5
5
|
import { SchemaType, JSON as HestiaJson, isExpandable, NodeType, isTypeValid, isTypeNode } from '@hestia-earth/schema';
|
|
6
6
|
import { definitions, uniqueProperties, extendableProperties } from '@hestia-earth/json-schema';
|
|
7
7
|
import { reduceUndefinedValues } from '@hestia-earth/utils';
|
|
8
|
-
import { from, of } from 'rxjs';
|
|
9
|
-
import { filter, map, mergeMap, reduce, toArray } from 'rxjs/operators';
|
|
8
|
+
import { from, of, filter, map, mergeMap, reduce, toArray } from 'rxjs';
|
|
10
9
|
|
|
11
10
|
import { debug, error } from './log';
|
|
12
11
|
import { client, indexName } from './es';
|
package/src/lambda.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { from, of } from 'rxjs';
|
|
3
|
-
import {
|
|
1
|
+
import { LambdaClient, InvokeCommand } from '@aws-sdk/client-lambda';
|
|
2
|
+
import { from, of, take, map } from 'rxjs';
|
|
3
|
+
import { fromUtf8 } from '@aws-sdk/util-utf8-node';
|
|
4
4
|
|
|
5
5
|
import { info } from './log';
|
|
6
6
|
import { IFunctionParam, isS3Mode } from './s3';
|
|
@@ -8,14 +8,14 @@ import { IFunctionParam, isS3Mode } from './s3';
|
|
|
8
8
|
export const invoke = (functionName: string, params: IFunctionParam | Record<string, any>) =>
|
|
9
9
|
isS3Mode
|
|
10
10
|
? from(
|
|
11
|
-
new
|
|
12
|
-
|
|
11
|
+
new LambdaClient({}).send(
|
|
12
|
+
new InvokeCommand({
|
|
13
13
|
FunctionName: functionName,
|
|
14
14
|
InvocationType: 'Event',
|
|
15
15
|
LogType: 'None',
|
|
16
|
-
Payload: JSON.stringify(params)
|
|
16
|
+
Payload: fromUtf8(JSON.stringify(params))
|
|
17
17
|
})
|
|
18
|
-
|
|
18
|
+
)
|
|
19
19
|
).pipe(
|
|
20
20
|
take(1),
|
|
21
21
|
map(res => {
|
package/src/progress.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { catchError, mergeMap } from 'rxjs
|
|
2
|
-
import { of, throwError } from 'rxjs';
|
|
1
|
+
import { catchError, mergeMap, of, throwError } from 'rxjs';
|
|
3
2
|
import { FileProgress, fileToExt, HestiaExtensions } from '@hestia-earth/api';
|
|
4
3
|
import { NodeType } from '@hestia-earth/schema';
|
|
5
4
|
|
package/src/s3.ts
CHANGED
|
@@ -1,16 +1,46 @@
|
|
|
1
1
|
/* eslint-disable complexity */
|
|
2
|
-
import
|
|
2
|
+
import {
|
|
3
|
+
S3Client,
|
|
4
|
+
GetObjectCommand,
|
|
5
|
+
GetObjectCommandInput,
|
|
6
|
+
PutObjectCommand,
|
|
7
|
+
PutObjectCommandInput,
|
|
8
|
+
DeleteObjectsCommand,
|
|
9
|
+
CopyObjectCommand,
|
|
10
|
+
waitUntilObjectExists,
|
|
11
|
+
HeadObjectCommand,
|
|
12
|
+
DeleteObjectCommand,
|
|
13
|
+
ListObjectsV2Command,
|
|
14
|
+
MetadataDirective,
|
|
15
|
+
_Object,
|
|
16
|
+
ObjectIdentifier,
|
|
17
|
+
DeletedObject
|
|
18
|
+
} from '@aws-sdk/client-s3';
|
|
19
|
+
import { Upload } from '@aws-sdk/lib-storage';
|
|
3
20
|
import { createReadStream, unlinkSync } from 'fs';
|
|
4
21
|
import { join } from 'path';
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
22
|
+
import {
|
|
23
|
+
from,
|
|
24
|
+
of,
|
|
25
|
+
Observable,
|
|
26
|
+
Subject,
|
|
27
|
+
catchError,
|
|
28
|
+
map,
|
|
29
|
+
mergeMap,
|
|
30
|
+
tap,
|
|
31
|
+
take,
|
|
32
|
+
bufferCount,
|
|
33
|
+
concatMap,
|
|
34
|
+
delay,
|
|
35
|
+
toArray
|
|
36
|
+
} from 'rxjs';
|
|
8
37
|
import { filenameFromPath, fileToExt, sizeInMb } from '@hestia-earth/api';
|
|
9
38
|
|
|
10
39
|
import { debug } from './log';
|
|
11
40
|
import * as local from './local';
|
|
12
41
|
import { stripBOM } from './utils';
|
|
13
42
|
import { streamJSONToFile } from './write-json-stream';
|
|
43
|
+
import { PassThrough, Readable } from 'stream';
|
|
14
44
|
|
|
15
45
|
const encoding = 'utf-8';
|
|
16
46
|
export const isS3Mode = (process.env.SOURCE_MODE || 's3') === 's3';
|
|
@@ -29,79 +59,83 @@ export interface IFunctionParam {
|
|
|
29
59
|
/**
|
|
30
60
|
* Unsafe, but needed otherwise it is impossible to run unit tests
|
|
31
61
|
*/
|
|
32
|
-
let _s3:
|
|
62
|
+
let _s3: S3Client;
|
|
33
63
|
|
|
34
64
|
export const getS3 = () => {
|
|
35
|
-
_s3 = _s3 || new
|
|
65
|
+
_s3 = _s3 || new S3Client({ region });
|
|
36
66
|
return _s3;
|
|
37
67
|
};
|
|
38
68
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
map(({ Body }) => Body.toString())
|
|
47
|
-
);
|
|
69
|
+
const getBody = async (command: GetObjectCommand) => {
|
|
70
|
+
const response = await getS3().send(command);
|
|
71
|
+
return response.Body.transformToString();
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const getObject = ({ Key, Bucket, ...params }: GetObjectCommandInput) =>
|
|
75
|
+
from(getBody(new GetObjectCommand({ ...params, Key: decodeURI(Key), Bucket }))).pipe(map(Body => Body.toString()));
|
|
48
76
|
|
|
49
|
-
export const putObject = ({ Key, ...params }:
|
|
77
|
+
export const putObject = ({ Key, Bucket, ...params }: PutObjectCommandInput) =>
|
|
78
|
+
from(getS3().send(new PutObjectCommand({ ...params, Key: decodeURI(Key), Bucket })));
|
|
79
|
+
|
|
80
|
+
const execDeleteObjects = (Bucket: string, Objects: ObjectIdentifier[]) =>
|
|
50
81
|
from(
|
|
51
|
-
getS3()
|
|
52
|
-
|
|
53
|
-
|
|
82
|
+
getS3().send(
|
|
83
|
+
new DeleteObjectsCommand({
|
|
84
|
+
Bucket,
|
|
85
|
+
Delete: { Objects }
|
|
86
|
+
})
|
|
87
|
+
)
|
|
54
88
|
).pipe(
|
|
55
89
|
take(1),
|
|
56
|
-
map(res =>
|
|
90
|
+
map(res => res.Deleted || [])
|
|
57
91
|
);
|
|
58
92
|
|
|
59
|
-
export const deleteObjects = (objects:
|
|
93
|
+
export const deleteObjects = (objects: ObjectIdentifier[], Bucket = bucket) =>
|
|
60
94
|
objects.length === 0
|
|
61
|
-
? of(
|
|
95
|
+
? of([] as DeletedObject[])
|
|
62
96
|
: from(objects).pipe(
|
|
63
97
|
// max objects to delete is 1000
|
|
64
98
|
bufferCount(1000),
|
|
65
99
|
// delay each operation by 500ms to avoid "Slow down" errors
|
|
66
100
|
concatMap(values => of(values.map(({ Key }) => ({ Key }))).pipe(delay(500))),
|
|
67
|
-
mergeMap(Objects =>
|
|
68
|
-
from(getS3().deleteObjects({ Bucket, Delete: { Objects } }).promise()).pipe(
|
|
69
|
-
take(1),
|
|
70
|
-
map(res => (res.$response.data || '').toString())
|
|
71
|
-
)
|
|
72
|
-
),
|
|
101
|
+
mergeMap(Objects => execDeleteObjects(Bucket, Objects)),
|
|
73
102
|
toArray(),
|
|
74
|
-
map(res => res.
|
|
103
|
+
map(res => res.flat())
|
|
75
104
|
);
|
|
76
105
|
|
|
77
106
|
export const copyObject = (
|
|
78
107
|
fromParams: { bucket: string; key: string },
|
|
79
108
|
toParams: { bucket: string; key: string },
|
|
80
|
-
|
|
81
|
-
MetadataDirective = 'REPLACE'
|
|
109
|
+
metadata: any = {},
|
|
110
|
+
metadataDirective: MetadataDirective = 'REPLACE'
|
|
82
111
|
) =>
|
|
83
112
|
from(
|
|
84
|
-
getS3()
|
|
85
|
-
|
|
113
|
+
getS3().send(
|
|
114
|
+
new CopyObjectCommand({
|
|
86
115
|
Bucket: toParams.bucket,
|
|
87
116
|
Key: decodeURI(toParams.key),
|
|
88
117
|
CopySource: `${fromParams.bucket}/${fromParams.key}`,
|
|
89
|
-
Metadata,
|
|
90
|
-
MetadataDirective
|
|
118
|
+
Metadata: metadata,
|
|
119
|
+
MetadataDirective: metadataDirective
|
|
91
120
|
})
|
|
92
|
-
|
|
93
|
-
).pipe(
|
|
94
|
-
take(1),
|
|
95
|
-
map(res => (res.$response.data || '').toString())
|
|
121
|
+
)
|
|
96
122
|
);
|
|
97
123
|
|
|
98
|
-
export const loadStream = (key: string, Bucket = bucket) =>
|
|
124
|
+
export const loadStream = (key: string, Bucket = bucket): Readable => {
|
|
125
|
+
const stream = new PassThrough();
|
|
126
|
+
|
|
127
|
+
const command = new GetObjectCommand({
|
|
128
|
+
Bucket,
|
|
129
|
+
Key: decodeURI(key)
|
|
130
|
+
});
|
|
131
|
+
|
|
99
132
|
getS3()
|
|
100
|
-
.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
133
|
+
.send(command)
|
|
134
|
+
.then(response => (response.Body as Readable).pipe(stream))
|
|
135
|
+
.catch(err => stream.emit('error', err));
|
|
136
|
+
|
|
137
|
+
return stream;
|
|
138
|
+
};
|
|
105
139
|
|
|
106
140
|
export const loadFile = (key: string, Bucket = bucket) => {
|
|
107
141
|
const stream = loadStream(key, Bucket);
|
|
@@ -183,24 +217,7 @@ export const uploadText = (key: string, data: string, Bucket = bucket) =>
|
|
|
183
217
|
})
|
|
184
218
|
: local.uploadText(Bucket)(key, data);
|
|
185
219
|
|
|
186
|
-
|
|
187
|
-
* Use this method to upload large JSON files.
|
|
188
|
-
*
|
|
189
|
-
* @param Key
|
|
190
|
-
* @param data
|
|
191
|
-
* @param Bucket
|
|
192
|
-
* @returns
|
|
193
|
-
*/
|
|
194
|
-
export const uploadStreamJSON = (Key: string, data: Record<string, any>, Bucket = bucket) => {
|
|
195
|
-
const stream = new PassThrough();
|
|
196
|
-
|
|
197
|
-
const uploader = getS3().upload({
|
|
198
|
-
Bucket,
|
|
199
|
-
Key,
|
|
200
|
-
Body: stream,
|
|
201
|
-
ContentType: 'application/json'
|
|
202
|
-
});
|
|
203
|
-
|
|
220
|
+
const uploadDataToStream = (stream: PassThrough, data: Record<string, any>) => {
|
|
204
221
|
// beginning of JSON object
|
|
205
222
|
stream.write('{', encoding);
|
|
206
223
|
|
|
@@ -224,8 +241,30 @@ export const uploadStreamJSON = (Key: string, data: Record<string, any>, Bucket
|
|
|
224
241
|
// end of JSON object
|
|
225
242
|
stream.write('}', encoding);
|
|
226
243
|
stream.end();
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
export const uploadStreamJSON = (Key: string, data: Record<string, any>, Bucket = bucket) => {
|
|
247
|
+
const stream = new PassThrough();
|
|
248
|
+
|
|
249
|
+
const uploader = new Upload({
|
|
250
|
+
client: getS3(),
|
|
251
|
+
params: {
|
|
252
|
+
Bucket,
|
|
253
|
+
Key,
|
|
254
|
+
Body: stream,
|
|
255
|
+
ContentType: 'application/json'
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
process.nextTick(() => {
|
|
260
|
+
try {
|
|
261
|
+
uploadDataToStream(stream, data);
|
|
262
|
+
} catch (err) {
|
|
263
|
+
stream.destroy(err as Error);
|
|
264
|
+
}
|
|
265
|
+
});
|
|
227
266
|
|
|
228
|
-
return from(uploader.
|
|
267
|
+
return from(uploader.done());
|
|
229
268
|
};
|
|
230
269
|
|
|
231
270
|
/**
|
|
@@ -243,23 +282,21 @@ export const uploadFileStream = (
|
|
|
243
282
|
type = 'application/json',
|
|
244
283
|
Bucket = bucket,
|
|
245
284
|
partSize = 100 * 1024 * 1024
|
|
246
|
-
) =>
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
.promise()
|
|
262
|
-
);
|
|
285
|
+
) => {
|
|
286
|
+
const fileStream = createReadStream(filepath);
|
|
287
|
+
const upload = new Upload({
|
|
288
|
+
client: getS3(),
|
|
289
|
+
params: {
|
|
290
|
+
Bucket,
|
|
291
|
+
Key: key,
|
|
292
|
+
Body: fileStream,
|
|
293
|
+
ContentType: type
|
|
294
|
+
},
|
|
295
|
+
partSize,
|
|
296
|
+
queueSize: 1
|
|
297
|
+
});
|
|
298
|
+
return from(upload.done());
|
|
299
|
+
};
|
|
263
300
|
|
|
264
301
|
export const uploadJSON = (key: string, data: any, type = 'application/json', Bucket = bucket) =>
|
|
265
302
|
isS3Mode
|
|
@@ -283,26 +320,27 @@ export const uploadJSONLarge = (key: string, data: any, type = 'application/json
|
|
|
283
320
|
export const waitObjectCreated = (key: string, Bucket = bucket) =>
|
|
284
321
|
isS3Mode
|
|
285
322
|
? from(
|
|
286
|
-
|
|
287
|
-
|
|
323
|
+
waitUntilObjectExists(
|
|
324
|
+
{
|
|
325
|
+
client: getS3(),
|
|
326
|
+
maxWaitTime: 20
|
|
327
|
+
},
|
|
328
|
+
{
|
|
288
329
|
Bucket,
|
|
289
330
|
Key: decodeURI(key)
|
|
290
|
-
}
|
|
291
|
-
|
|
292
|
-
).pipe(
|
|
293
|
-
take(1),
|
|
294
|
-
map(() => true)
|
|
295
|
-
)
|
|
331
|
+
}
|
|
332
|
+
)
|
|
333
|
+
).pipe(map(() => true))
|
|
296
334
|
: of(true);
|
|
297
335
|
|
|
298
336
|
export const headObject = (key: string, Bucket = bucket) =>
|
|
299
337
|
from(
|
|
300
|
-
getS3()
|
|
301
|
-
|
|
338
|
+
getS3().send(
|
|
339
|
+
new HeadObjectCommand({
|
|
302
340
|
Bucket,
|
|
303
341
|
Key: decodeURI(key)
|
|
304
342
|
})
|
|
305
|
-
|
|
343
|
+
)
|
|
306
344
|
);
|
|
307
345
|
|
|
308
346
|
export const lastModified = (key: string, Bucket = bucket) =>
|
|
@@ -318,8 +356,7 @@ export const fileExists = (key: string, Bucket = bucket) =>
|
|
|
318
356
|
isS3Mode
|
|
319
357
|
? headObject(key, Bucket).pipe(
|
|
320
358
|
map(() => true),
|
|
321
|
-
catchError(() => of(false))
|
|
322
|
-
take(1)
|
|
359
|
+
catchError(() => of(false))
|
|
323
360
|
)
|
|
324
361
|
: local.fileExists(Bucket)(key);
|
|
325
362
|
|
|
@@ -327,37 +364,43 @@ export const fileSize = (key: string, Bucket = bucket) =>
|
|
|
327
364
|
isS3Mode
|
|
328
365
|
? headObject(key, Bucket).pipe(
|
|
329
366
|
map(({ ContentLength }) => ContentLength),
|
|
330
|
-
catchError(() => of(undefined as number))
|
|
331
|
-
take(1)
|
|
367
|
+
catchError(() => of(undefined as number))
|
|
332
368
|
)
|
|
333
369
|
: local.fileSize(Bucket)(key);
|
|
334
370
|
|
|
335
371
|
export const deleteObject = (key: string, Bucket = bucket) =>
|
|
336
372
|
isS3Mode
|
|
337
373
|
? from(
|
|
338
|
-
getS3()
|
|
339
|
-
|
|
374
|
+
getS3().send(
|
|
375
|
+
new DeleteObjectCommand({
|
|
340
376
|
Bucket,
|
|
341
377
|
Key: decodeURI(key)
|
|
342
378
|
})
|
|
343
|
-
|
|
379
|
+
)
|
|
344
380
|
)
|
|
345
381
|
: local.deleteFile(Bucket)(key);
|
|
346
382
|
|
|
347
|
-
export const listFolder = async (Prefix = '', Bucket = bucket, nextToken?: string): Promise<
|
|
348
|
-
const { Contents, IsTruncated, NextContinuationToken } = await getS3()
|
|
349
|
-
|
|
383
|
+
export const listFolder = async (Prefix = '', Bucket = bucket, nextToken?: string): Promise<_Object[]> => {
|
|
384
|
+
const { Contents, IsTruncated, NextContinuationToken } = await getS3().send(
|
|
385
|
+
new ListObjectsV2Command({
|
|
350
386
|
Bucket,
|
|
351
387
|
Prefix,
|
|
352
388
|
ContinuationToken: nextToken,
|
|
353
389
|
MaxKeys: 1000
|
|
354
390
|
})
|
|
355
|
-
|
|
356
|
-
return [...Contents, ...(IsTruncated ? await listFolder(Prefix, bucket, NextContinuationToken) : [])];
|
|
391
|
+
);
|
|
392
|
+
return [...(Contents || []), ...(IsTruncated ? await listFolder(Prefix, bucket, NextContinuationToken) : [])];
|
|
357
393
|
};
|
|
358
394
|
|
|
359
395
|
export const listFolders = async (Bucket = bucket) =>
|
|
360
|
-
(
|
|
396
|
+
(
|
|
397
|
+
await getS3().send(
|
|
398
|
+
new ListObjectsV2Command({
|
|
399
|
+
Bucket,
|
|
400
|
+
Delimiter: '/'
|
|
401
|
+
})
|
|
402
|
+
)
|
|
403
|
+
).CommonPrefixes?.map(({ Prefix }) => Prefix);
|
|
361
404
|
|
|
362
405
|
export const largeFileSize = +(process.env.LARGE_SIZE_MB || '100');
|
|
363
406
|
|