@hdriel/aws-utils 1.2.3 → 1.3.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/dist/index.cjs +235 -191
- package/dist/index.d.cts +104 -45
- package/dist/index.d.ts +104 -45
- package/dist/index.js +227 -183
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -85,16 +85,19 @@ var index_exports = {};
|
|
|
85
85
|
__export(index_exports, {
|
|
86
86
|
ACLs: () => ACLs,
|
|
87
87
|
AWSConfigSharingUtil: () => AWSConfigSharingUtil,
|
|
88
|
-
|
|
88
|
+
IamUtil: () => IamUtil,
|
|
89
89
|
LambdaUtil: () => LambdaUtil,
|
|
90
90
|
S3LocalstackUtil: () => S3LocalstackUtil,
|
|
91
91
|
S3Util: () => S3Util,
|
|
92
|
-
|
|
93
|
-
|
|
92
|
+
SUPPORTED_IFRAME_EXTENSIONS: () => SUPPORTED_IFRAME_EXTENSIONS,
|
|
93
|
+
SnsUtil: () => SnsUtil
|
|
94
94
|
});
|
|
95
95
|
module.exports = __toCommonJS(index_exports);
|
|
96
96
|
|
|
97
|
-
// src/aws/iam.ts
|
|
97
|
+
// src/aws/iam/iam-commands.ts
|
|
98
|
+
var import_client_iam2 = require("@aws-sdk/client-iam");
|
|
99
|
+
|
|
100
|
+
// src/aws/iam/iam-base.ts
|
|
98
101
|
var import_client_iam = require("@aws-sdk/client-iam");
|
|
99
102
|
|
|
100
103
|
// src/aws/configuration.ts
|
|
@@ -127,149 +130,159 @@ __publicField(_AWSConfigSharingUtil, "endpoint");
|
|
|
127
130
|
__publicField(_AWSConfigSharingUtil, "region");
|
|
128
131
|
var AWSConfigSharingUtil = _AWSConfigSharingUtil;
|
|
129
132
|
|
|
130
|
-
// src/aws/iam.ts
|
|
131
|
-
var
|
|
133
|
+
// src/aws/iam/iam-base.ts
|
|
134
|
+
var IamBase = class {
|
|
132
135
|
constructor({
|
|
136
|
+
logger,
|
|
137
|
+
reqId,
|
|
133
138
|
accessKeyId = AWSConfigSharingUtil.accessKeyId,
|
|
134
139
|
secretAccessKey = AWSConfigSharingUtil.secretAccessKey,
|
|
135
140
|
endpoint = AWSConfigSharingUtil.endpoint,
|
|
136
|
-
region = AWSConfigSharingUtil.region
|
|
137
|
-
|
|
138
|
-
} = {}) {
|
|
141
|
+
region = AWSConfigSharingUtil.region
|
|
142
|
+
}) {
|
|
139
143
|
__publicField(this, "iam");
|
|
144
|
+
__publicField(this, "endpoint");
|
|
145
|
+
__publicField(this, "region");
|
|
146
|
+
__publicField(this, "logger");
|
|
147
|
+
__publicField(this, "reqId");
|
|
140
148
|
const credentials = { accessKeyId, secretAccessKey };
|
|
141
149
|
const options = __spreadValues(__spreadValues(__spreadValues({}, accessKeyId && secretAccessKey && { credentials }), endpoint && { endpoint }), region && { region });
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
150
|
+
this.endpoint = endpoint;
|
|
151
|
+
this.region = region;
|
|
152
|
+
this.logger = logger;
|
|
153
|
+
this.reqId = reqId != null ? reqId : null;
|
|
145
154
|
this.iam = new import_client_iam.IAMClient(options);
|
|
146
155
|
}
|
|
147
|
-
|
|
148
|
-
return this.iam;
|
|
149
|
-
}
|
|
150
|
-
getUserList() {
|
|
156
|
+
execute(command, options) {
|
|
151
157
|
return __async(this, null, function* () {
|
|
152
|
-
|
|
153
|
-
return this.iam.send(command);
|
|
158
|
+
return this.iam.send(command, options);
|
|
154
159
|
});
|
|
155
160
|
}
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
// src/aws/iam/iam-commands.ts
|
|
164
|
+
var IamCommands = class extends IamBase {
|
|
165
|
+
constructor(_a) {
|
|
166
|
+
var props = __objRest(_a, []);
|
|
167
|
+
super(props);
|
|
168
|
+
}
|
|
156
169
|
listUsers(maxItems) {
|
|
157
170
|
return __async(this, null, function* () {
|
|
158
171
|
try {
|
|
159
|
-
const command = new
|
|
160
|
-
const response = yield this.
|
|
172
|
+
const command = new import_client_iam2.ListUsersCommand({ MaxItems: maxItems });
|
|
173
|
+
const response = yield this.execute(command);
|
|
161
174
|
return response.Users;
|
|
162
175
|
} catch (error) {
|
|
163
|
-
console.error("Error
|
|
176
|
+
console.error("Error IAM users list:", error);
|
|
164
177
|
return null;
|
|
165
178
|
}
|
|
166
179
|
});
|
|
167
180
|
}
|
|
168
181
|
};
|
|
169
182
|
|
|
170
|
-
// src/aws/
|
|
171
|
-
var
|
|
183
|
+
// src/aws/iam/iam-util.ts
|
|
184
|
+
var IamUtil = class extends IamCommands {
|
|
185
|
+
constructor(props) {
|
|
186
|
+
super(props);
|
|
187
|
+
}
|
|
188
|
+
get client() {
|
|
189
|
+
return this.iam;
|
|
190
|
+
}
|
|
191
|
+
};
|
|
172
192
|
|
|
173
|
-
// src/
|
|
174
|
-
var
|
|
175
|
-
var includeCloudWatchOptions = process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY && process.env.AWS_REGION && process.env.AWS_LOG_GROUP_NAME && process.env.AWS_LOG_STREAM_NAME;
|
|
176
|
-
var _a;
|
|
177
|
-
var logger = new import_stack_trace_logger.Logger(__spreadValues({
|
|
178
|
-
serviceName: process.env.SERVICE_NAME || "SERVER",
|
|
179
|
-
loggingModeLevel: process.env.LOGGING_MODE,
|
|
180
|
-
lineTraceLevels: (_a = process.env.LOGGING_STACK_TRACE_LEVELS) == null ? void 0 : _a.split(","),
|
|
181
|
-
stackTraceLines: { error: 3, warn: 3, info: 1 },
|
|
182
|
-
tags: ["reqId?", "url?"],
|
|
183
|
-
runLocally: true
|
|
184
|
-
}, includeCloudWatchOptions && {
|
|
185
|
-
transportCloudWatchOptions: {
|
|
186
|
-
awsAccessKeyId: process.env.AWS_ACCESS_KEY_ID,
|
|
187
|
-
awsSecretKey: process.env.AWS_SECRET_ACCESS_KEY,
|
|
188
|
-
awsRegion: process.env.AWS_REGION,
|
|
189
|
-
logGroupName: process.env.AWS_LOG_GROUP_NAME,
|
|
190
|
-
logStreamName: process.env.AWS_LOG_STREAM_NAME,
|
|
191
|
-
retentionInDays: +process.env.AWS_LOG_RETENTION_IN_DAY
|
|
192
|
-
}
|
|
193
|
-
}));
|
|
193
|
+
// src/aws/lambda/lambda-events.ts
|
|
194
|
+
var import_client_lambda2 = require("@aws-sdk/client-lambda");
|
|
194
195
|
|
|
195
|
-
// src/aws/lambda.ts
|
|
196
|
-
var
|
|
196
|
+
// src/aws/lambda/lambda-base.ts
|
|
197
|
+
var import_client_lambda = require("@aws-sdk/client-lambda");
|
|
198
|
+
var LambdaBase = class {
|
|
197
199
|
constructor({
|
|
200
|
+
logger,
|
|
201
|
+
reqId,
|
|
198
202
|
accessKeyId = AWSConfigSharingUtil.accessKeyId,
|
|
199
203
|
secretAccessKey = AWSConfigSharingUtil.secretAccessKey,
|
|
200
204
|
endpoint = AWSConfigSharingUtil.endpoint,
|
|
201
|
-
region = AWSConfigSharingUtil.region
|
|
202
|
-
serviceFunctionName,
|
|
203
|
-
debug = false
|
|
205
|
+
region = AWSConfigSharingUtil.region
|
|
204
206
|
}) {
|
|
205
207
|
__publicField(this, "lambda");
|
|
206
|
-
__publicField(this, "
|
|
208
|
+
__publicField(this, "endpoint");
|
|
209
|
+
__publicField(this, "region");
|
|
210
|
+
__publicField(this, "logger");
|
|
211
|
+
__publicField(this, "reqId");
|
|
207
212
|
const credentials = { accessKeyId, secretAccessKey };
|
|
208
213
|
const options = __spreadValues(__spreadValues(__spreadValues({}, accessKeyId && secretAccessKey && { credentials }), endpoint && { endpoint }), region && { region });
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
214
|
+
this.endpoint = endpoint;
|
|
215
|
+
this.region = region;
|
|
216
|
+
this.logger = logger;
|
|
217
|
+
this.reqId = reqId != null ? reqId : null;
|
|
218
|
+
this.lambda = new import_client_lambda.Lambda(__spreadValues({}, options));
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
|
|
222
|
+
// src/aws/lambda/lambda-events.ts
|
|
223
|
+
var LambdaEvents = class extends LambdaBase {
|
|
224
|
+
constructor(_a) {
|
|
225
|
+
var _b = _a, { serviceFunctionName } = _b, props = __objRest(_b, ["serviceFunctionName"]);
|
|
226
|
+
super(props);
|
|
227
|
+
__publicField(this, "serviceFunctionName");
|
|
212
228
|
this.serviceFunctionName = serviceFunctionName;
|
|
213
|
-
this.lambda = new import_client_lambda.Lambda(__spreadValues(__spreadValues(__spreadValues({}, credentials && { credentials }), endpoint && { endpoint }), region && { region }));
|
|
214
229
|
}
|
|
215
230
|
directInvoke(_0) {
|
|
216
231
|
return __async(this, arguments, function* ({
|
|
217
232
|
payload = {},
|
|
218
|
-
invocationType =
|
|
233
|
+
invocationType = import_client_lambda2.InvocationType.Event
|
|
219
234
|
}) {
|
|
220
|
-
var
|
|
235
|
+
var _a, _b, _c;
|
|
236
|
+
const FunctionName = this.serviceFunctionName;
|
|
221
237
|
const Payload = JSON.stringify(payload);
|
|
222
238
|
try {
|
|
223
|
-
const command = new
|
|
224
|
-
FunctionName: this.serviceFunctionName,
|
|
225
|
-
Payload,
|
|
226
|
-
InvocationType: invocationType
|
|
227
|
-
});
|
|
239
|
+
const command = new import_client_lambda2.InvokeCommand({ FunctionName, Payload, InvocationType: invocationType });
|
|
228
240
|
const data = yield this.lambda.send(command);
|
|
229
|
-
if (invocationType ===
|
|
230
|
-
logger.
|
|
241
|
+
if (invocationType === import_client_lambda2.InvocationType.RequestResponse) {
|
|
242
|
+
(_a = this.logger) == null ? void 0 : _a.debug(null, "directInvoke lambda function response", {
|
|
243
|
+
FunctionName,
|
|
244
|
+
data,
|
|
245
|
+
InvocationType: import_client_lambda2.InvocationType
|
|
246
|
+
});
|
|
231
247
|
}
|
|
232
|
-
const status = (
|
|
248
|
+
const status = (_b = data.StatusCode) != null ? _b : 200;
|
|
233
249
|
const result = data.Payload;
|
|
234
250
|
return status >= 200 && status < 300 ? result : Promise.reject(result);
|
|
235
251
|
} catch (err) {
|
|
236
|
-
logger.error(null, "failed to directInvoke lambda function", {
|
|
237
|
-
err,
|
|
238
|
-
Payload,
|
|
239
|
-
FunctionName
|
|
240
|
-
});
|
|
252
|
+
(_c = this.logger) == null ? void 0 : _c.error(null, "failed to directInvoke lambda function", { err, Payload, FunctionName });
|
|
241
253
|
throw err;
|
|
242
254
|
}
|
|
243
255
|
});
|
|
244
256
|
}
|
|
245
257
|
runLambdaInDryRunMode(payload) {
|
|
246
258
|
return __async(this, null, function* () {
|
|
247
|
-
return this.directInvoke({
|
|
248
|
-
payload,
|
|
249
|
-
invocationType: import_client_lambda.InvocationType.DryRun
|
|
250
|
-
});
|
|
259
|
+
return this.directInvoke({ payload, invocationType: import_client_lambda2.InvocationType.DryRun });
|
|
251
260
|
});
|
|
252
261
|
}
|
|
253
262
|
triggerLambdaEvent(payload) {
|
|
254
263
|
return __async(this, null, function* () {
|
|
255
|
-
return this.directInvoke({
|
|
256
|
-
payload,
|
|
257
|
-
invocationType: import_client_lambda.InvocationType.Event
|
|
258
|
-
});
|
|
264
|
+
return this.directInvoke({ payload, invocationType: import_client_lambda2.InvocationType.Event });
|
|
259
265
|
});
|
|
260
266
|
}
|
|
261
267
|
runAndGetLambdaResponse(payload) {
|
|
262
268
|
return __async(this, null, function* () {
|
|
263
|
-
return this.directInvoke({
|
|
264
|
-
payload,
|
|
265
|
-
invocationType: import_client_lambda.InvocationType.RequestResponse
|
|
266
|
-
});
|
|
269
|
+
return this.directInvoke({ payload, invocationType: import_client_lambda2.InvocationType.RequestResponse });
|
|
267
270
|
});
|
|
268
271
|
}
|
|
269
272
|
};
|
|
270
273
|
|
|
274
|
+
// src/aws/lambda/lambda-util.ts
|
|
275
|
+
var LambdaUtil = class extends LambdaEvents {
|
|
276
|
+
constructor(props) {
|
|
277
|
+
super(props);
|
|
278
|
+
}
|
|
279
|
+
get client() {
|
|
280
|
+
return this.lambda;
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
|
|
271
284
|
// src/aws/s3/s3-util.localstack.ts
|
|
272
|
-
var
|
|
285
|
+
var import_client_s37 = require("@aws-sdk/client-s3");
|
|
273
286
|
|
|
274
287
|
// src/aws/s3/s3-stream.ts
|
|
275
288
|
var import_pathe2 = require("pathe");
|
|
@@ -395,8 +408,8 @@ var getNormalizedPath = (directoryPath) => {
|
|
|
395
408
|
return decodeURIComponent((directoryPath == null ? void 0 : directoryPath.trim().replace(/^\/+/, "").replace(/\/+$/, "").replace(/\/+/g, "/")) || "");
|
|
396
409
|
};
|
|
397
410
|
var getFileSize = (maxFileSize, defaultMaxFileSize) => {
|
|
398
|
-
var
|
|
399
|
-
const fileSizeUnitValue = (
|
|
411
|
+
var _a;
|
|
412
|
+
const fileSizeUnitValue = (_a = maxFileSize != null ? maxFileSize : defaultMaxFileSize) != null ? _a : "";
|
|
400
413
|
const fileSize = typeof fileSizeUnitValue === "number" ? fileSizeUnitValue : (0, import_bytes.default)(fileSizeUnitValue);
|
|
401
414
|
return fileSize != null ? fileSize : void 0;
|
|
402
415
|
};
|
|
@@ -453,7 +466,7 @@ var import_node_http_handler = require("@smithy/node-http-handler");
|
|
|
453
466
|
var import_client_s3 = require("@aws-sdk/client-s3");
|
|
454
467
|
var S3Base = class {
|
|
455
468
|
constructor({
|
|
456
|
-
logger
|
|
469
|
+
logger,
|
|
457
470
|
reqId,
|
|
458
471
|
accessKeyId = AWSConfigSharingUtil.accessKeyId,
|
|
459
472
|
secretAccessKey = AWSConfigSharingUtil.secretAccessKey,
|
|
@@ -473,7 +486,7 @@ var S3Base = class {
|
|
|
473
486
|
const options = __spreadValues(__spreadValues(__spreadValues({}, accessKeyId && secretAccessKey && { credentials }), endpoint && { endpoint }), region && { region });
|
|
474
487
|
this.endpoint = endpoint;
|
|
475
488
|
this.region = region;
|
|
476
|
-
this.logger =
|
|
489
|
+
this.logger = logger;
|
|
477
490
|
this.reqId = reqId != null ? reqId : null;
|
|
478
491
|
this.localstack = localstack;
|
|
479
492
|
const s3ClientParams = __spreadProps(__spreadValues(__spreadValues({}, options), s3ForcePathStyle && { forcePathStyle: s3ForcePathStyle }), {
|
|
@@ -495,8 +508,8 @@ var S3Base = class {
|
|
|
495
508
|
|
|
496
509
|
// src/aws/s3/s3-bucket.ts
|
|
497
510
|
var S3Bucket = class extends S3Base {
|
|
498
|
-
constructor(
|
|
499
|
-
var _b =
|
|
511
|
+
constructor(_a) {
|
|
512
|
+
var _b = _a, { bucket } = _b, props = __objRest(_b, ["bucket"]);
|
|
500
513
|
super(props);
|
|
501
514
|
__publicField(this, "_bucket");
|
|
502
515
|
__publicField(this, "initializedBucket", "");
|
|
@@ -538,13 +551,13 @@ var S3Bucket = class extends S3Base {
|
|
|
538
551
|
}
|
|
539
552
|
isBucketExists() {
|
|
540
553
|
return __async(this, null, function* () {
|
|
541
|
-
var
|
|
554
|
+
var _a, _b;
|
|
542
555
|
const bucketName = this.bucket;
|
|
543
556
|
try {
|
|
544
557
|
yield this.execute(new import_client_s32.HeadBucketCommand({ Bucket: bucketName }));
|
|
545
558
|
return true;
|
|
546
559
|
} catch (err) {
|
|
547
|
-
if (err.name !== "NotFound" && ((
|
|
560
|
+
if (err.name !== "NotFound" && ((_a = err.$metadata) == null ? void 0 : _a.httpStatusCode) !== 404) {
|
|
548
561
|
(_b = this.logger) == null ? void 0 : _b.error(this.reqId, "Error checking bucket:", err);
|
|
549
562
|
throw err;
|
|
550
563
|
} else {
|
|
@@ -555,11 +568,11 @@ var S3Bucket = class extends S3Base {
|
|
|
555
568
|
}
|
|
556
569
|
initAsPublicBucket() {
|
|
557
570
|
return __async(this, null, function* () {
|
|
558
|
-
var
|
|
571
|
+
var _a, _b;
|
|
559
572
|
const bucketName = this.bucket;
|
|
560
573
|
const isExists = yield this.isBucketExists();
|
|
561
574
|
if (isExists) {
|
|
562
|
-
(
|
|
575
|
+
(_a = this.logger) == null ? void 0 : _a.info(this.reqId, `Bucket already exists.`, { bucketName });
|
|
563
576
|
return;
|
|
564
577
|
}
|
|
565
578
|
const data = yield this.execute(new import_client_s32.CreateBucketCommand({ Bucket: bucketName }));
|
|
@@ -597,11 +610,11 @@ var S3Bucket = class extends S3Base {
|
|
|
597
610
|
}
|
|
598
611
|
initAsPrivateBucket(includeConstraintLocation) {
|
|
599
612
|
return __async(this, null, function* () {
|
|
600
|
-
var
|
|
613
|
+
var _a, _b;
|
|
601
614
|
const bucketName = this.bucket;
|
|
602
615
|
const isExists = yield this.isBucketExists();
|
|
603
616
|
if (isExists) {
|
|
604
|
-
(
|
|
617
|
+
(_a = this.logger) == null ? void 0 : _a.info(this.reqId, `Bucket already exists.`, { bucketName });
|
|
605
618
|
return;
|
|
606
619
|
}
|
|
607
620
|
const createParams = __spreadValues({
|
|
@@ -619,14 +632,14 @@ var S3Bucket = class extends S3Base {
|
|
|
619
632
|
includeConstraintLocation = false,
|
|
620
633
|
skipInitializedBucket = false
|
|
621
634
|
} = {}) {
|
|
622
|
-
var
|
|
635
|
+
var _a;
|
|
623
636
|
const bucketName = this.bucket;
|
|
624
637
|
if (skipInitializedBucket && this.initializedBucket === bucketName) {
|
|
625
638
|
return;
|
|
626
639
|
}
|
|
627
640
|
const isExists = yield this.isBucketExists();
|
|
628
641
|
if (isExists) {
|
|
629
|
-
(
|
|
642
|
+
(_a = this.logger) == null ? void 0 : _a.info(this.reqId, `Bucket already exists.`, { bucketName });
|
|
630
643
|
return;
|
|
631
644
|
}
|
|
632
645
|
const data = acl === "private" /* private */ ? yield this.initAsPrivateBucket(includeConstraintLocation) : yield this.initAsPublicBucket();
|
|
@@ -660,7 +673,7 @@ var S3Bucket = class extends S3Base {
|
|
|
660
673
|
}
|
|
661
674
|
bucketInfo(options) {
|
|
662
675
|
return __async(this, null, function* () {
|
|
663
|
-
var
|
|
676
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n, _o, _p, _q, _r, _s, _t, _u;
|
|
664
677
|
const bucketName = this.bucket;
|
|
665
678
|
const info = {
|
|
666
679
|
name: bucketName,
|
|
@@ -673,7 +686,7 @@ var S3Bucket = class extends S3Base {
|
|
|
673
686
|
const headBucketResponse = yield this.execute(
|
|
674
687
|
new import_client_s32.HeadBucketCommand(__spreadValues({ Bucket: bucketName }, options))
|
|
675
688
|
);
|
|
676
|
-
(
|
|
689
|
+
(_a = this.logger) == null ? void 0 : _a.debug("bucketInfo", "HeadBucketCommandOutput", headBucketResponse);
|
|
677
690
|
info.exists = true;
|
|
678
691
|
info.bucketRegion = headBucketResponse.BucketRegion;
|
|
679
692
|
info.accessPointAlias = headBucketResponse.AccessPointAlias;
|
|
@@ -699,9 +712,9 @@ var S3Bucket = class extends S3Base {
|
|
|
699
712
|
);
|
|
700
713
|
(_e = this.logger) == null ? void 0 : _e.debug("bucketInfo", "GetBucketAclCommandOutput", aclResponse);
|
|
701
714
|
info.acl = (_f = aclResponse.Grants) == null ? void 0 : _f.map((grant) => {
|
|
702
|
-
var
|
|
715
|
+
var _a2;
|
|
703
716
|
return {
|
|
704
|
-
grantee: (
|
|
717
|
+
grantee: (_a2 = grant.Grantee) == null ? void 0 : _a2.Type,
|
|
705
718
|
permission: grant.Permission
|
|
706
719
|
};
|
|
707
720
|
});
|
|
@@ -768,11 +781,11 @@ var S3Bucket = class extends S3Base {
|
|
|
768
781
|
}
|
|
769
782
|
destroyBucket(forceDeleteAllFilesBeforeDestroyBucket = false) {
|
|
770
783
|
return __async(this, null, function* () {
|
|
771
|
-
var
|
|
784
|
+
var _a;
|
|
772
785
|
const bucketName = this.bucket;
|
|
773
786
|
const isExists = yield this.isBucketExists();
|
|
774
787
|
if (!isExists) {
|
|
775
|
-
(
|
|
788
|
+
(_a = this.logger) == null ? void 0 : _a.debug(this.reqId, `Bucket not exists.`, { bucketName });
|
|
776
789
|
return;
|
|
777
790
|
}
|
|
778
791
|
if (forceDeleteAllFilesBeforeDestroyBucket) {
|
|
@@ -792,7 +805,7 @@ var S3Directory = class extends S3Bucket {
|
|
|
792
805
|
}
|
|
793
806
|
directoryExists(directoryPath) {
|
|
794
807
|
return __async(this, null, function* () {
|
|
795
|
-
var
|
|
808
|
+
var _a;
|
|
796
809
|
try {
|
|
797
810
|
const normalizedKey = getNormalizedPath(directoryPath);
|
|
798
811
|
if (!normalizedKey || normalizedKey === "/") throw new Error("No file key provided");
|
|
@@ -800,7 +813,7 @@ var S3Directory = class extends S3Bucket {
|
|
|
800
813
|
yield this.execute(command);
|
|
801
814
|
return true;
|
|
802
815
|
} catch (error) {
|
|
803
|
-
if (error.name === "NotFound" || ((
|
|
816
|
+
if (error.name === "NotFound" || ((_a = error.$metadata) == null ? void 0 : _a.httpStatusCode) === 404) {
|
|
804
817
|
return false;
|
|
805
818
|
}
|
|
806
819
|
throw error;
|
|
@@ -818,7 +831,7 @@ var S3Directory = class extends S3Bucket {
|
|
|
818
831
|
}
|
|
819
832
|
deleteDirectory(directoryPath) {
|
|
820
833
|
return __async(this, null, function* () {
|
|
821
|
-
var
|
|
834
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
822
835
|
let normalizedPath = getNormalizedPath(directoryPath);
|
|
823
836
|
if (!normalizedPath) throw new Error("No directory path provided");
|
|
824
837
|
if (normalizedPath === "/") normalizedPath = "";
|
|
@@ -842,7 +855,7 @@ var S3Directory = class extends S3Bucket {
|
|
|
842
855
|
}
|
|
843
856
|
})
|
|
844
857
|
);
|
|
845
|
-
totalDeletedCount += (_b = (
|
|
858
|
+
totalDeletedCount += (_b = (_a = deleteResult.Deleted) == null ? void 0 : _a.length) != null ? _b : 0;
|
|
846
859
|
if (deleteResult.Errors && deleteResult.Errors.length > 0) {
|
|
847
860
|
(_c = this.logger) == null ? void 0 : _c.warn(this.reqId, `Some objects failed to delete`, {
|
|
848
861
|
directoryPath: normalizedPath,
|
|
@@ -887,7 +900,7 @@ var S3Directory = class extends S3Bucket {
|
|
|
887
900
|
}
|
|
888
901
|
directoryList(directoryPath) {
|
|
889
902
|
return __async(this, null, function* () {
|
|
890
|
-
var
|
|
903
|
+
var _a;
|
|
891
904
|
let normalizedPath = getNormalizedPath(directoryPath);
|
|
892
905
|
if (normalizedPath !== "/" && directoryPath !== "" && directoryPath !== void 0) normalizedPath += "/";
|
|
893
906
|
else normalizedPath = this.localstack ? "" : "/";
|
|
@@ -920,7 +933,7 @@ var S3Directory = class extends S3Bucket {
|
|
|
920
933
|
})
|
|
921
934
|
);
|
|
922
935
|
}
|
|
923
|
-
(
|
|
936
|
+
(_a = this.logger) == null ? void 0 : _a.debug(null, "#### directoryList", {
|
|
924
937
|
normalizedPath,
|
|
925
938
|
CommonPrefixes: result.CommonPrefixes,
|
|
926
939
|
ContentFile: result.Contents
|
|
@@ -931,8 +944,8 @@ var S3Directory = class extends S3Bucket {
|
|
|
931
944
|
return dir;
|
|
932
945
|
}).filter((dir) => dir);
|
|
933
946
|
const files = (result.Contents || []).filter((content) => {
|
|
934
|
-
var
|
|
935
|
-
return content.Key !== normalizedPath && !((
|
|
947
|
+
var _a2;
|
|
948
|
+
return content.Key !== normalizedPath && !((_a2 = content.Key) == null ? void 0 : _a2.endsWith("/"));
|
|
936
949
|
}).map((content) => __spreadProps(__spreadValues({}, content), {
|
|
937
950
|
Name: content.Key.replace(normalizedPath, "") || content.Key,
|
|
938
951
|
Location: `${this.link}${content.Key.replace(/^\//, "")}`,
|
|
@@ -971,8 +984,8 @@ var S3Directory = class extends S3Bucket {
|
|
|
971
984
|
return relativePath.replace(/\/$/, "");
|
|
972
985
|
}).filter((dir) => dir);
|
|
973
986
|
allFiles = (result.Contents || []).filter((content) => {
|
|
974
|
-
var
|
|
975
|
-
return content.Key !== normalizedPath && !((
|
|
987
|
+
var _a;
|
|
988
|
+
return content.Key !== normalizedPath && !((_a = content.Key) == null ? void 0 : _a.endsWith("/"));
|
|
976
989
|
}).map((content) => __spreadProps(__spreadValues({}, content), {
|
|
977
990
|
Name: content.Key.replace(normalizedPath, "") || content.Key,
|
|
978
991
|
Location: `${this.link}${content.Key.replace(/^\//, "")}`,
|
|
@@ -1075,7 +1088,7 @@ var S3File = class extends S3Directory {
|
|
|
1075
1088
|
}
|
|
1076
1089
|
fileList(directoryPath, fileNamePrefix) {
|
|
1077
1090
|
return __async(this, null, function* () {
|
|
1078
|
-
var
|
|
1091
|
+
var _a, _b;
|
|
1079
1092
|
let normalizedPath = getNormalizedPath(directoryPath);
|
|
1080
1093
|
if (normalizedPath !== "/" && directoryPath !== "" && directoryPath !== void 0) normalizedPath += "/";
|
|
1081
1094
|
else normalizedPath = this.localstack ? "" : "/";
|
|
@@ -1086,11 +1099,11 @@ var S3File = class extends S3Directory {
|
|
|
1086
1099
|
Delimiter: "/"
|
|
1087
1100
|
});
|
|
1088
1101
|
const result = yield this.execute(command);
|
|
1089
|
-
const files = ((
|
|
1102
|
+
const files = ((_a = result.Contents) != null ? _a : []).filter((v) => v).map(
|
|
1090
1103
|
(content) => {
|
|
1091
|
-
var
|
|
1104
|
+
var _a2, _b2, _c;
|
|
1092
1105
|
return __spreadProps(__spreadValues({}, content), {
|
|
1093
|
-
Name: (_b2 = (
|
|
1106
|
+
Name: (_b2 = (_a2 = content.Key) == null ? void 0 : _a2.replace(prefix, "")) != null ? _b2 : content.Key,
|
|
1094
1107
|
Location: content.Key ? `${this.link}${(_c = content.Key) == null ? void 0 : _c.replace(/^\//, "")}` : "",
|
|
1095
1108
|
LastModified: content.LastModified ? new Date(content.LastModified) : null
|
|
1096
1109
|
});
|
|
@@ -1107,7 +1120,7 @@ var S3File = class extends S3Directory {
|
|
|
1107
1120
|
// 0-based: page 0 = items 0-99, page 1 = items 100-199, page 2 = items 200-299
|
|
1108
1121
|
pageSize = 100
|
|
1109
1122
|
} = {}) {
|
|
1110
|
-
var
|
|
1123
|
+
var _a, _b;
|
|
1111
1124
|
let normalizedPath = getNormalizedPath(directoryPath);
|
|
1112
1125
|
if (normalizedPath !== "/" && directoryPath !== "" && directoryPath !== void 0) normalizedPath += "/";
|
|
1113
1126
|
else normalizedPath = "";
|
|
@@ -1126,11 +1139,11 @@ var S3File = class extends S3Directory {
|
|
|
1126
1139
|
})
|
|
1127
1140
|
);
|
|
1128
1141
|
if (currentPage === pageNumber) {
|
|
1129
|
-
resultFiles = ((
|
|
1142
|
+
resultFiles = ((_a = result.Contents) != null ? _a : []).filter((v) => v).map(
|
|
1130
1143
|
(content) => {
|
|
1131
|
-
var
|
|
1144
|
+
var _a2, _b2;
|
|
1132
1145
|
return __spreadProps(__spreadValues({}, content), {
|
|
1133
|
-
Name: (_b2 = (
|
|
1146
|
+
Name: (_b2 = (_a2 = content.Key) == null ? void 0 : _a2.replace(prefix, "")) != null ? _b2 : content.Key,
|
|
1134
1147
|
Location: content.Key ? `${this.link}${content.Key.replace(/^\//, "")}` : "",
|
|
1135
1148
|
LastModified: content.LastModified ? new Date(content.LastModified) : null
|
|
1136
1149
|
});
|
|
@@ -1157,7 +1170,7 @@ var S3File = class extends S3Directory {
|
|
|
1157
1170
|
}
|
|
1158
1171
|
taggingFile(fileKey, tag) {
|
|
1159
1172
|
return __async(this, null, function* () {
|
|
1160
|
-
var
|
|
1173
|
+
var _a;
|
|
1161
1174
|
let normalizedKey = "";
|
|
1162
1175
|
const tags = [].concat(tag);
|
|
1163
1176
|
try {
|
|
@@ -1171,25 +1184,25 @@ var S3File = class extends S3Directory {
|
|
|
1171
1184
|
yield this.execute(command);
|
|
1172
1185
|
return true;
|
|
1173
1186
|
} catch (error) {
|
|
1174
|
-
(
|
|
1187
|
+
(_a = this.logger) == null ? void 0 : _a.warn(null, "failed to tagging file", { errMsg: error.message, fileKey: normalizedKey, tags });
|
|
1175
1188
|
return false;
|
|
1176
1189
|
}
|
|
1177
1190
|
});
|
|
1178
1191
|
}
|
|
1179
1192
|
fileVersion(fileKey) {
|
|
1180
1193
|
return __async(this, null, function* () {
|
|
1181
|
-
var
|
|
1194
|
+
var _a, _b;
|
|
1182
1195
|
const normalizedKey = getNormalizedPath(fileKey);
|
|
1183
1196
|
if (!normalizedKey || normalizedKey === "/") throw new Error("No file key provided");
|
|
1184
1197
|
const command = new import_client_s34.GetObjectTaggingCommand({ Bucket: this.bucket, Key: normalizedKey });
|
|
1185
1198
|
const result = yield this.execute(command);
|
|
1186
|
-
const tag = (
|
|
1199
|
+
const tag = (_a = result.TagSet) == null ? void 0 : _a.find((tag2) => tag2.Key === "version");
|
|
1187
1200
|
return (_b = tag == null ? void 0 : tag.Value) != null ? _b : "";
|
|
1188
1201
|
});
|
|
1189
1202
|
}
|
|
1190
1203
|
fileUrl(fileKey, expiresIn = "15m") {
|
|
1191
1204
|
return __async(this, null, function* () {
|
|
1192
|
-
var
|
|
1205
|
+
var _a;
|
|
1193
1206
|
let normalizedKey = getNormalizedPath(fileKey);
|
|
1194
1207
|
if (!normalizedKey || normalizedKey === "/") throw new Error("No file key provided");
|
|
1195
1208
|
const expiresInSeconds = typeof expiresIn === "number" ? expiresIn : (0, import_ms2.default)(expiresIn) / 1e3;
|
|
@@ -1198,19 +1211,19 @@ var S3File = class extends S3Directory {
|
|
|
1198
1211
|
expiresIn: expiresInSeconds
|
|
1199
1212
|
// is using 3600 it's will expire in 1 hour (default is 900 seconds = 15 minutes)
|
|
1200
1213
|
});
|
|
1201
|
-
(
|
|
1214
|
+
(_a = this.logger) == null ? void 0 : _a.info(null, "generate signed file url", { url, fileKey: normalizedKey, expiresIn });
|
|
1202
1215
|
return url;
|
|
1203
1216
|
});
|
|
1204
1217
|
}
|
|
1205
1218
|
sizeOf(fileKey, unit = "b") {
|
|
1206
1219
|
return __async(this, null, function* () {
|
|
1207
|
-
var
|
|
1220
|
+
var _a, _b, _c;
|
|
1208
1221
|
const normalizedKey = getNormalizedPath(fileKey);
|
|
1209
1222
|
if (!normalizedKey || normalizedKey === "/") throw new Error("No file key provided");
|
|
1210
1223
|
try {
|
|
1211
1224
|
const command = new import_client_s34.HeadObjectCommand({ Bucket: this.bucket, Key: normalizedKey });
|
|
1212
1225
|
const headObject = yield this.execute(command);
|
|
1213
|
-
const bytes2 = (
|
|
1226
|
+
const bytes2 = (_a = headObject.ContentLength) != null ? _a : 0;
|
|
1214
1227
|
return getUnitBytes(bytes2, unit);
|
|
1215
1228
|
} catch (error) {
|
|
1216
1229
|
if (error.name === "NotFound" || ((_b = error.$metadata) == null ? void 0 : _b.httpStatusCode) === 404) {
|
|
@@ -1223,7 +1236,7 @@ var S3File = class extends S3Directory {
|
|
|
1223
1236
|
}
|
|
1224
1237
|
fileExists(fileKey) {
|
|
1225
1238
|
return __async(this, null, function* () {
|
|
1226
|
-
var
|
|
1239
|
+
var _a;
|
|
1227
1240
|
try {
|
|
1228
1241
|
const normalizedKey = getNormalizedPath(fileKey);
|
|
1229
1242
|
if (!normalizedKey || normalizedKey === "/") throw new Error("No file key provided");
|
|
@@ -1231,7 +1244,7 @@ var S3File = class extends S3Directory {
|
|
|
1231
1244
|
yield this.execute(command);
|
|
1232
1245
|
return true;
|
|
1233
1246
|
} catch (error) {
|
|
1234
|
-
if (error.name === "NotFound" || ((
|
|
1247
|
+
if (error.name === "NotFound" || ((_a = error.$metadata) == null ? void 0 : _a.httpStatusCode) === 404) {
|
|
1235
1248
|
return false;
|
|
1236
1249
|
}
|
|
1237
1250
|
throw error;
|
|
@@ -1323,8 +1336,8 @@ var S3File = class extends S3Directory {
|
|
|
1323
1336
|
// src/aws/s3/s3-stream.ts
|
|
1324
1337
|
var pump = (0, import_util.promisify)(import_stream.pipeline);
|
|
1325
1338
|
var S3Stream = class _S3Stream extends S3File {
|
|
1326
|
-
constructor(
|
|
1327
|
-
var _b =
|
|
1339
|
+
constructor(_a) {
|
|
1340
|
+
var _b = _a, { maxUploadFileSizeRestriction = "10GB", concurrencyVideoLimit = 0 } = _b, props = __objRest(_b, ["maxUploadFileSizeRestriction", "concurrencyVideoLimit"]);
|
|
1328
1341
|
super(props);
|
|
1329
1342
|
__publicField(this, "maxUploadFileSizeRestriction");
|
|
1330
1343
|
__publicField(this, "s3Limiter");
|
|
@@ -1336,8 +1349,8 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1336
1349
|
cachingAge: _cachingAge = "1y"
|
|
1337
1350
|
} = {}) => {
|
|
1338
1351
|
return (req, res, next) => __async(this, null, function* () {
|
|
1339
|
-
var
|
|
1340
|
-
let fileKey = _fileKey || (((
|
|
1352
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
1353
|
+
let fileKey = _fileKey || (((_a = req.params) == null ? void 0 : _a[paramsField]) ? decodeURIComponent((_b = req.params) == null ? void 0 : _b[paramsField]) : void 0) || (((_c = req.query) == null ? void 0 : _c[queryField]) ? decodeURIComponent((_d = req.query) == null ? void 0 : _d[queryField]) : void 0) || (((_e = req.headers) == null ? void 0 : _e[headerField]) ? decodeURIComponent((_f = req.headers) == null ? void 0 : _f[headerField]) : void 0);
|
|
1341
1354
|
if (!fileKey || fileKey === "/") {
|
|
1342
1355
|
(_g = this.logger) == null ? void 0 : _g.warn(req.id, "image fileKey is required");
|
|
1343
1356
|
next(Error("image fileKey is required"));
|
|
@@ -1380,8 +1393,8 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1380
1393
|
cachingAge: _cachingAge = "1h"
|
|
1381
1394
|
} = {}) => {
|
|
1382
1395
|
return (req, res, next) => __async(this, null, function* () {
|
|
1383
|
-
var
|
|
1384
|
-
let fileKey = _fileKey || (((
|
|
1396
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
1397
|
+
let fileKey = _fileKey || (((_a = req.params) == null ? void 0 : _a[paramsField]) ? decodeURIComponent((_b = req.params) == null ? void 0 : _b[paramsField]) : void 0) || (((_c = req.query) == null ? void 0 : _c[queryField]) ? decodeURIComponent((_d = req.query) == null ? void 0 : _d[queryField]) : void 0) || (((_e = req.headers) == null ? void 0 : _e[headerField]) ? decodeURIComponent((_f = req.headers) == null ? void 0 : _f[headerField]) : void 0);
|
|
1385
1398
|
if (!fileKey) {
|
|
1386
1399
|
(_g = this.logger) == null ? void 0 : _g.warn(req.id, "iframe fileKey is required");
|
|
1387
1400
|
next(Error("iframe fileKey is required"));
|
|
@@ -1421,7 +1434,7 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1421
1434
|
this.maxUploadFileSizeRestriction = maxUploadFileSizeRestriction;
|
|
1422
1435
|
this.s3Limiter = concurrencyVideoLimit ? (0, import_p_limit.default)(concurrencyVideoLimit) : null;
|
|
1423
1436
|
}
|
|
1424
|
-
|
|
1437
|
+
getObjectFileStream(_0) {
|
|
1425
1438
|
return __async(this, arguments, function* (fileKey, {
|
|
1426
1439
|
Range,
|
|
1427
1440
|
checkFileExists = true,
|
|
@@ -1449,7 +1462,7 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1449
1462
|
Range,
|
|
1450
1463
|
abortSignal
|
|
1451
1464
|
} = {}) {
|
|
1452
|
-
var
|
|
1465
|
+
var _a;
|
|
1453
1466
|
let normalizedKey = getNormalizedPath(fileKey);
|
|
1454
1467
|
if (!normalizedKey || normalizedKey === "/") throw new Error("No file key provided");
|
|
1455
1468
|
try {
|
|
@@ -1472,7 +1485,7 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1472
1485
|
}
|
|
1473
1486
|
};
|
|
1474
1487
|
} catch (error) {
|
|
1475
|
-
(
|
|
1488
|
+
(_a = this.logger) == null ? void 0 : _a.warn(this.reqId, "streamVideoFile error", {
|
|
1476
1489
|
Bucket: this.bucket,
|
|
1477
1490
|
fileKey: normalizedKey,
|
|
1478
1491
|
Range,
|
|
@@ -1494,8 +1507,8 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1494
1507
|
streamTimeoutMS = 3e4
|
|
1495
1508
|
} = {}) {
|
|
1496
1509
|
return (req, res, next) => __async(this, null, function* () {
|
|
1497
|
-
var
|
|
1498
|
-
let fileKey = _fileKey || (((
|
|
1510
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m;
|
|
1511
|
+
let fileKey = _fileKey || (((_a = req.params) == null ? void 0 : _a[paramsField]) ? (_b = req.params) == null ? void 0 : _b[paramsField] : void 0) || (((_c = req.query) == null ? void 0 : _c[queryField]) ? (_d = req.query) == null ? void 0 : _d[queryField] : void 0);
|
|
1499
1512
|
((_e = req.headers) == null ? void 0 : _e[headerField]) ? (_f = req.headers) == null ? void 0 : _f[headerField] : void 0;
|
|
1500
1513
|
if (!fileKey || fileKey === "/") {
|
|
1501
1514
|
(_g = this.logger) == null ? void 0 : _g.warn(req.id, "fileKey video stream is required");
|
|
@@ -1572,9 +1585,9 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1572
1585
|
res.end();
|
|
1573
1586
|
}, streamTimeoutMS);
|
|
1574
1587
|
res.once("close", () => {
|
|
1575
|
-
var
|
|
1588
|
+
var _a2;
|
|
1576
1589
|
clearTimeout(timeout);
|
|
1577
|
-
(
|
|
1590
|
+
(_a2 = body.destroy) == null ? void 0 : _a2.call(body);
|
|
1578
1591
|
req.off("close", onClose);
|
|
1579
1592
|
});
|
|
1580
1593
|
yield pump(body, res);
|
|
@@ -1617,8 +1630,8 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1617
1630
|
cachingAge: _cachingAge = "1h"
|
|
1618
1631
|
} = {}) {
|
|
1619
1632
|
return (req, res, next) => __async(this, null, function* () {
|
|
1620
|
-
var
|
|
1621
|
-
const fileKey = _fileKey || (((
|
|
1633
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i;
|
|
1634
|
+
const fileKey = _fileKey || (((_a = req.params) == null ? void 0 : _a[paramsField]) ? (_b = req.params) == null ? void 0 : _b[paramsField] : void 0) || (((_c = req.query) == null ? void 0 : _c[queryField]) ? (_d = req.query) == null ? void 0 : _d[queryField] : void 0) || (((_e = req.headers) == null ? void 0 : _e[headerField]) ? decodeURIComponent((_f = req.headers) == null ? void 0 : _f[headerField]) : void 0);
|
|
1622
1635
|
if (!fileKey || fileKey === "/") {
|
|
1623
1636
|
(_g = this.logger) == null ? void 0 : _g.warn(req.id, "fileKey stream is required");
|
|
1624
1637
|
next(Error("fileKey stream is required"));
|
|
@@ -1627,9 +1640,9 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1627
1640
|
const abort = new AbortController();
|
|
1628
1641
|
let stream = null;
|
|
1629
1642
|
const onClose = () => {
|
|
1630
|
-
var
|
|
1643
|
+
var _a2;
|
|
1631
1644
|
abort.abort();
|
|
1632
|
-
(
|
|
1645
|
+
(_a2 = stream == null ? void 0 : stream.destroy) == null ? void 0 : _a2.call(stream);
|
|
1633
1646
|
};
|
|
1634
1647
|
req.once("close", onClose);
|
|
1635
1648
|
let normalizedKey = getNormalizedPath(fileKey);
|
|
@@ -1641,7 +1654,7 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1641
1654
|
next(Error(`File not found: "${normalizedKey}"`));
|
|
1642
1655
|
return;
|
|
1643
1656
|
}
|
|
1644
|
-
stream = yield this.
|
|
1657
|
+
stream = yield this.getObjectFileStream(normalizedKey, {
|
|
1645
1658
|
abortSignal: abort.signal,
|
|
1646
1659
|
checkFileExists: false
|
|
1647
1660
|
});
|
|
@@ -1651,9 +1664,9 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1651
1664
|
return;
|
|
1652
1665
|
}
|
|
1653
1666
|
const fileInfo = yield this.fileInfo(normalizedKey);
|
|
1654
|
-
const fileName = filename || normalizedKey.split("/").pop() || "download";
|
|
1655
1667
|
const contentType = fileInfo.ContentType || "application/octet-stream";
|
|
1656
1668
|
const ext = (0, import_pathe2.extname)(fileKey).slice(1).toLowerCase();
|
|
1669
|
+
const fileName = filename || normalizedKey.split("/").pop() || `${Date.now()}.${ext}`;
|
|
1657
1670
|
const inlineTypes = ["text/", "image/", "application/pdf", "video/", "audio/"];
|
|
1658
1671
|
const canDisplayInline = SUPPORTED_IFRAME_EXTENSIONS.includes(ext) || inlineTypes.some((type) => contentType.startsWith(type));
|
|
1659
1672
|
res.setHeader("Content-Type", contentType);
|
|
@@ -1669,15 +1682,16 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1669
1682
|
if (cachingAge) {
|
|
1670
1683
|
res.setHeader("Cache-Control", `public, max-age=${cachingAge}`);
|
|
1671
1684
|
}
|
|
1685
|
+
res.setHeader("Access-Control-Expose-Headers", "Content-Type, Content-Disposition, Content-Length");
|
|
1672
1686
|
stream.on("error", (err) => {
|
|
1673
|
-
var
|
|
1674
|
-
(
|
|
1687
|
+
var _a2, _b2;
|
|
1688
|
+
(_a2 = this.logger) == null ? void 0 : _a2.warn(this.reqId, "Stream error", { fileKey: normalizedKey, error: err });
|
|
1675
1689
|
abort.abort();
|
|
1676
1690
|
(_b2 = stream == null ? void 0 : stream.destroy) == null ? void 0 : _b2.call(stream);
|
|
1677
1691
|
});
|
|
1678
1692
|
res.once("close", () => {
|
|
1679
|
-
var
|
|
1680
|
-
(
|
|
1693
|
+
var _a2;
|
|
1694
|
+
(_a2 = stream == null ? void 0 : stream.destroy) == null ? void 0 : _a2.call(stream);
|
|
1681
1695
|
req.off("close", onClose);
|
|
1682
1696
|
});
|
|
1683
1697
|
streamMethod || (streamMethod = canDisplayInline ? "pipe" : "pipeline");
|
|
@@ -1721,11 +1735,11 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1721
1735
|
compressionLevel = 5
|
|
1722
1736
|
} = {}) {
|
|
1723
1737
|
return (req, res, next) => __async(this, null, function* () {
|
|
1724
|
-
var
|
|
1738
|
+
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l;
|
|
1725
1739
|
const abort = new AbortController();
|
|
1726
1740
|
const onClose = () => abort.abort();
|
|
1727
1741
|
try {
|
|
1728
|
-
let fileKey = _fileKey || (((
|
|
1742
|
+
let fileKey = _fileKey || (((_a = req.params) == null ? void 0 : _a[paramsField]) ? (_b = req.params) == null ? void 0 : _b[paramsField] : void 0) || (((_c = req.query) == null ? void 0 : _c[queryField]) ? (_d = req.query) == null ? void 0 : _d[queryField] : void 0) || (((_e = req.headers) == null ? void 0 : _e[headerField]) ? decodeURIComponent((_f = req.headers) == null ? void 0 : _f[headerField]) : void 0);
|
|
1729
1743
|
if (!fileKey || fileKey === "/") {
|
|
1730
1744
|
(_g = this.logger) == null ? void 0 : _g.warn(req.id, "fileKey video stream is required");
|
|
1731
1745
|
next(Error("fileKey video stream is required"));
|
|
@@ -1740,12 +1754,12 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1740
1754
|
req.once("close", onClose);
|
|
1741
1755
|
(_h = this.logger) == null ? void 0 : _h.info(this.reqId, "Starting parallel file download...", { fileCount: fileKeys.length });
|
|
1742
1756
|
const downloadPromises = fileKeys.map((fileKey2) => __async(this, null, function* () {
|
|
1743
|
-
var
|
|
1757
|
+
var _a2, _b2, _c2;
|
|
1744
1758
|
try {
|
|
1745
1759
|
if (abort.signal.aborted) return null;
|
|
1746
|
-
const stream = yield this.
|
|
1760
|
+
const stream = yield this.getObjectFileStream(fileKey2, { abortSignal: abort.signal });
|
|
1747
1761
|
if (!stream) {
|
|
1748
|
-
(
|
|
1762
|
+
(_a2 = this.logger) == null ? void 0 : _a2.warn(this.reqId, "File not found", { fileKey: fileKey2 });
|
|
1749
1763
|
return null;
|
|
1750
1764
|
}
|
|
1751
1765
|
const chunks = [];
|
|
@@ -1816,8 +1830,8 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1816
1830
|
res.setHeader("Content-Length", String(actualZipSize));
|
|
1817
1831
|
res.setHeader("Access-Control-Expose-Headers", "Content-Type, Content-Disposition, Content-Length");
|
|
1818
1832
|
actualArchive.on("error", (err) => {
|
|
1819
|
-
var
|
|
1820
|
-
(
|
|
1833
|
+
var _a2;
|
|
1834
|
+
(_a2 = this.logger) == null ? void 0 : _a2.error(this.reqId, "Archive error", { error: err });
|
|
1821
1835
|
abort.abort();
|
|
1822
1836
|
if (!res.headersSent) {
|
|
1823
1837
|
next(err);
|
|
@@ -1933,18 +1947,18 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1933
1947
|
* Adds the uploaded file info to req.s3File
|
|
1934
1948
|
*/
|
|
1935
1949
|
uploadSingleFileMW(fieldName, directoryPath, options = {}) {
|
|
1936
|
-
var
|
|
1950
|
+
var _a;
|
|
1937
1951
|
let normalizedPath = getNormalizedPath(directoryPath);
|
|
1938
1952
|
if (normalizedPath !== "/" && directoryPath !== "" && directoryPath !== void 0) normalizedPath += "/";
|
|
1939
1953
|
else normalizedPath = "";
|
|
1940
|
-
(
|
|
1954
|
+
(_a = this.logger) == null ? void 0 : _a.debug(null, "####### uploadSingleFile", { directoryPath, normalizedPath, fieldName });
|
|
1941
1955
|
const upload = this.getUploadFileMW(normalizedPath, options);
|
|
1942
1956
|
return (req, res, next) => {
|
|
1943
1957
|
const mw = upload.single(fieldName);
|
|
1944
1958
|
mw(req, res, (err) => {
|
|
1945
|
-
var
|
|
1959
|
+
var _a2, _b;
|
|
1946
1960
|
if (err) {
|
|
1947
|
-
(
|
|
1961
|
+
(_a2 = this.logger) == null ? void 0 : _a2.error(this.reqId, "Single file upload error", { fieldName, error: err.message });
|
|
1948
1962
|
return next(err);
|
|
1949
1963
|
}
|
|
1950
1964
|
if (req.file) {
|
|
@@ -1973,9 +1987,9 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
1973
1987
|
return (req, res, next) => {
|
|
1974
1988
|
const mw = upload.array(fieldName, maxFilesCount || void 0);
|
|
1975
1989
|
mw(req, res, (err) => {
|
|
1976
|
-
var
|
|
1990
|
+
var _a, _b;
|
|
1977
1991
|
if (err) {
|
|
1978
|
-
(
|
|
1992
|
+
(_a = this.logger) == null ? void 0 : _a.error(this.reqId, "Multiple files upload error", { fieldName, error: err.message });
|
|
1979
1993
|
return next(err);
|
|
1980
1994
|
}
|
|
1981
1995
|
if (Array.isArray(req.files)) {
|
|
@@ -2002,9 +2016,9 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
2002
2016
|
return (req, res, next) => {
|
|
2003
2017
|
const anyUpload = maxCount ? upload.any() : upload.any();
|
|
2004
2018
|
anyUpload(req, res, (err) => {
|
|
2005
|
-
var
|
|
2019
|
+
var _a, _b;
|
|
2006
2020
|
if (err) {
|
|
2007
|
-
(
|
|
2021
|
+
(_a = this.logger) == null ? void 0 : _a.error(this.reqId, "Any files upload error", { error: err.message });
|
|
2008
2022
|
return next(err);
|
|
2009
2023
|
}
|
|
2010
2024
|
if (req.files && Array.isArray(req.files)) {
|
|
@@ -2083,10 +2097,14 @@ var S3Stream = class _S3Stream extends S3File {
|
|
|
2083
2097
|
};
|
|
2084
2098
|
|
|
2085
2099
|
// src/aws/s3/s3-util.ts
|
|
2100
|
+
var import_client_s36 = require("@aws-sdk/client-s3");
|
|
2086
2101
|
var S3Util = class extends S3Stream {
|
|
2087
2102
|
constructor(props) {
|
|
2088
2103
|
super(props);
|
|
2089
2104
|
}
|
|
2105
|
+
get client() {
|
|
2106
|
+
return this.s3Client;
|
|
2107
|
+
}
|
|
2090
2108
|
};
|
|
2091
2109
|
|
|
2092
2110
|
// src/aws/s3/s3-util.localstack.ts
|
|
@@ -2094,21 +2112,24 @@ var S3LocalstackUtil = class extends S3Util {
|
|
|
2094
2112
|
constructor(props) {
|
|
2095
2113
|
super(__spreadProps(__spreadValues({}, props), { localstack: true }));
|
|
2096
2114
|
}
|
|
2115
|
+
get client() {
|
|
2116
|
+
return this.s3Client;
|
|
2117
|
+
}
|
|
2097
2118
|
directoryList(directoryPath) {
|
|
2098
2119
|
return __async(this, null, function* () {
|
|
2099
|
-
var
|
|
2120
|
+
var _a;
|
|
2100
2121
|
let normalizedPath = getNormalizedPath(directoryPath);
|
|
2101
2122
|
if (normalizedPath !== "/" && directoryPath !== "" && directoryPath !== void 0) normalizedPath += "/";
|
|
2102
2123
|
else normalizedPath = "";
|
|
2103
2124
|
let result;
|
|
2104
2125
|
result = yield this.execute(
|
|
2105
|
-
new
|
|
2126
|
+
new import_client_s37.ListObjectsV2Command({
|
|
2106
2127
|
Bucket: this.bucket,
|
|
2107
2128
|
Prefix: normalizedPath,
|
|
2108
2129
|
Delimiter: "/"
|
|
2109
2130
|
})
|
|
2110
2131
|
);
|
|
2111
|
-
(
|
|
2132
|
+
(_a = this.logger) == null ? void 0 : _a.debug(null, "#### directoryList", {
|
|
2112
2133
|
normalizedPath,
|
|
2113
2134
|
CommonPrefixes: result.CommonPrefixes,
|
|
2114
2135
|
ContentFile: result.Contents
|
|
@@ -2119,8 +2140,8 @@ var S3LocalstackUtil = class extends S3Util {
|
|
|
2119
2140
|
return dir;
|
|
2120
2141
|
}).filter((dir) => dir);
|
|
2121
2142
|
const files = (result.Contents || []).filter((content) => {
|
|
2122
|
-
var
|
|
2123
|
-
return content.Key !== normalizedPath && !((
|
|
2143
|
+
var _a2;
|
|
2144
|
+
return content.Key !== normalizedPath && !((_a2 = content.Key) == null ? void 0 : _a2.endsWith("/"));
|
|
2124
2145
|
}).map((content) => __spreadProps(__spreadValues({}, content), {
|
|
2125
2146
|
Name: content.Key.replace(normalizedPath, "") || content.Key,
|
|
2126
2147
|
Location: `${this.link}${content.Key.replace(/^\//, "")}`,
|
|
@@ -2145,7 +2166,7 @@ var S3LocalstackUtil = class extends S3Util {
|
|
|
2145
2166
|
while (currentPage <= pageNumber) {
|
|
2146
2167
|
let result;
|
|
2147
2168
|
result = yield this.execute(
|
|
2148
|
-
new
|
|
2169
|
+
new import_client_s37.ListObjectsV2Command({
|
|
2149
2170
|
Bucket: this.bucket,
|
|
2150
2171
|
Prefix: normalizedPath,
|
|
2151
2172
|
Delimiter: "/",
|
|
@@ -2159,8 +2180,8 @@ var S3LocalstackUtil = class extends S3Util {
|
|
|
2159
2180
|
return relativePath.replace(/\/$/, "");
|
|
2160
2181
|
}).filter((dir) => dir);
|
|
2161
2182
|
allFiles = (result.Contents || []).filter((content) => {
|
|
2162
|
-
var
|
|
2163
|
-
return content.Key !== normalizedPath && !((
|
|
2183
|
+
var _a;
|
|
2184
|
+
return content.Key !== normalizedPath && !((_a = content.Key) == null ? void 0 : _a.endsWith("/"));
|
|
2164
2185
|
}).map((content) => __spreadProps(__spreadValues({}, content), {
|
|
2165
2186
|
Name: content.Key.replace(normalizedPath, "") || content.Key,
|
|
2166
2187
|
Location: `${this.link}${content.Key.replace(/^\//, "")}`,
|
|
@@ -2182,44 +2203,67 @@ var S3LocalstackUtil = class extends S3Util {
|
|
|
2182
2203
|
}
|
|
2183
2204
|
};
|
|
2184
2205
|
|
|
2185
|
-
// src/aws/sns.ts
|
|
2206
|
+
// src/aws/sns/sns-base.ts
|
|
2186
2207
|
var import_client_sns = require("@aws-sdk/client-sns");
|
|
2187
|
-
var
|
|
2208
|
+
var SnsBase = class {
|
|
2188
2209
|
constructor({
|
|
2210
|
+
logger,
|
|
2211
|
+
reqId,
|
|
2189
2212
|
accessKeyId = AWSConfigSharingUtil.accessKeyId,
|
|
2190
2213
|
secretAccessKey = AWSConfigSharingUtil.secretAccessKey,
|
|
2191
2214
|
endpoint = AWSConfigSharingUtil.endpoint,
|
|
2192
|
-
region = AWSConfigSharingUtil.region
|
|
2193
|
-
topicArn,
|
|
2194
|
-
debug = false
|
|
2215
|
+
region = AWSConfigSharingUtil.region
|
|
2195
2216
|
}) {
|
|
2196
2217
|
__publicField(this, "sns");
|
|
2197
|
-
__publicField(this, "
|
|
2218
|
+
__publicField(this, "endpoint");
|
|
2219
|
+
__publicField(this, "region");
|
|
2220
|
+
__publicField(this, "logger");
|
|
2221
|
+
__publicField(this, "reqId");
|
|
2198
2222
|
const credentials = { accessKeyId, secretAccessKey };
|
|
2199
2223
|
const options = __spreadValues(__spreadValues(__spreadValues({}, accessKeyId && secretAccessKey && { credentials }), endpoint && { endpoint }), region && { region });
|
|
2200
|
-
|
|
2201
|
-
|
|
2202
|
-
|
|
2224
|
+
this.endpoint = endpoint;
|
|
2225
|
+
this.region = region;
|
|
2226
|
+
this.logger = logger;
|
|
2227
|
+
this.reqId = reqId != null ? reqId : null;
|
|
2228
|
+
this.sns = new import_client_sns.SNS(__spreadValues({}, options));
|
|
2229
|
+
}
|
|
2230
|
+
};
|
|
2231
|
+
|
|
2232
|
+
// src/aws/sns/sns-topic.ts
|
|
2233
|
+
var SnsTopic = class extends SnsBase {
|
|
2234
|
+
constructor(_a) {
|
|
2235
|
+
var _b = _a, { topicArn } = _b, props = __objRest(_b, ["topicArn"]);
|
|
2236
|
+
super(props);
|
|
2237
|
+
__publicField(this, "topicArn");
|
|
2203
2238
|
this.topicArn = topicArn;
|
|
2204
|
-
this.sns = new import_client_sns.SNS(__spreadValues(__spreadValues(__spreadValues({}, credentials && { credentials }), endpoint && { endpoint }), region && { region }));
|
|
2205
2239
|
}
|
|
2206
|
-
|
|
2240
|
+
publishMessage(message) {
|
|
2207
2241
|
return __async(this, null, function* () {
|
|
2208
|
-
this.sns.publish({
|
|
2242
|
+
return this.sns.publish({
|
|
2209
2243
|
Message: typeof message === "string" ? message : JSON.stringify(message),
|
|
2210
2244
|
TopicArn: this.topicArn
|
|
2211
2245
|
});
|
|
2212
2246
|
});
|
|
2213
2247
|
}
|
|
2214
2248
|
};
|
|
2249
|
+
|
|
2250
|
+
// src/aws/sns/sns-util.ts
|
|
2251
|
+
var SnsUtil = class extends SnsTopic {
|
|
2252
|
+
constructor(props) {
|
|
2253
|
+
super(props);
|
|
2254
|
+
}
|
|
2255
|
+
get client() {
|
|
2256
|
+
return this.sns;
|
|
2257
|
+
}
|
|
2258
|
+
};
|
|
2215
2259
|
// Annotate the CommonJS export names for ESM import in node:
|
|
2216
2260
|
0 && (module.exports = {
|
|
2217
2261
|
ACLs,
|
|
2218
2262
|
AWSConfigSharingUtil,
|
|
2219
|
-
|
|
2263
|
+
IamUtil,
|
|
2220
2264
|
LambdaUtil,
|
|
2221
2265
|
S3LocalstackUtil,
|
|
2222
2266
|
S3Util,
|
|
2223
|
-
|
|
2224
|
-
|
|
2267
|
+
SUPPORTED_IFRAME_EXTENSIONS,
|
|
2268
|
+
SnsUtil
|
|
2225
2269
|
});
|