@hanzo/s3 0.6.4 → 8.0.7
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/LICENSE +202 -0
- package/MAINTAINERS.md +62 -0
- package/README.md +262 -0
- package/README_zh_CN.md +192 -0
- package/dist/esm/AssumeRoleProvider.d.mts +86 -0
- package/dist/esm/AssumeRoleProvider.mjs +183 -0
- package/dist/esm/CredentialProvider.d.mts +22 -0
- package/dist/esm/CredentialProvider.mjs +48 -0
- package/dist/esm/Credentials.d.mts +22 -0
- package/dist/esm/Credentials.mjs +38 -0
- package/dist/esm/IamAwsProvider.d.mts +27 -0
- package/dist/esm/IamAwsProvider.mjs +189 -0
- package/dist/esm/errors.d.mts +82 -0
- package/dist/esm/errors.mjs +117 -0
- package/dist/esm/helpers.d.mts +156 -0
- package/dist/esm/helpers.mjs +218 -0
- package/dist/esm/internal/async.d.mts +9 -0
- package/dist/esm/internal/async.mjs +14 -0
- package/dist/esm/internal/callbackify.d.mts +1 -0
- package/dist/esm/internal/callbackify.mjs +15 -0
- package/dist/esm/internal/client.d.mts +394 -0
- package/dist/esm/internal/client.mjs +3007 -0
- package/dist/esm/internal/copy-conditions.d.mts +10 -0
- package/dist/esm/internal/copy-conditions.mjs +25 -0
- package/dist/esm/internal/extensions.d.mts +18 -0
- package/dist/esm/internal/extensions.mjs +114 -0
- package/dist/esm/internal/helper.d.mts +177 -0
- package/dist/esm/internal/helper.mjs +552 -0
- package/dist/esm/internal/join-host-port.d.mts +11 -0
- package/dist/esm/internal/join-host-port.mjs +23 -0
- package/dist/esm/internal/post-policy.d.mts +17 -0
- package/dist/esm/internal/post-policy.mjs +98 -0
- package/dist/esm/internal/request.d.mts +11 -0
- package/dist/esm/internal/request.mjs +75 -0
- package/dist/esm/internal/response.d.mts +8 -0
- package/dist/esm/internal/response.mjs +16 -0
- package/dist/esm/internal/s3-endpoints.d.mts +38 -0
- package/dist/esm/internal/s3-endpoints.mjs +68 -0
- package/dist/esm/internal/type.d.mts +482 -0
- package/dist/esm/internal/type.mjs +30 -0
- package/dist/esm/internal/xml-parser.d.mts +93 -0
- package/dist/esm/internal/xml-parser.mjs +819 -0
- package/dist/esm/notification.d.mts +58 -0
- package/dist/esm/notification.mjs +209 -0
- package/dist/esm/s3.d.mts +40 -0
- package/dist/esm/s3.mjs +86 -0
- package/dist/esm/signing.d.mts +5 -0
- package/dist/esm/signing.mjs +258 -0
- package/dist/main/AssumeRoleProvider.d.ts +86 -0
- package/dist/main/AssumeRoleProvider.js +191 -0
- package/dist/main/CredentialProvider.d.ts +22 -0
- package/dist/main/CredentialProvider.js +55 -0
- package/dist/main/Credentials.d.ts +22 -0
- package/dist/main/Credentials.js +45 -0
- package/dist/main/IamAwsProvider.d.ts +27 -0
- package/dist/main/IamAwsProvider.js +198 -0
- package/dist/main/errors.d.ts +82 -0
- package/dist/main/errors.js +138 -0
- package/dist/main/helpers.d.ts +156 -0
- package/dist/main/helpers.js +233 -0
- package/dist/main/internal/async.d.ts +9 -0
- package/dist/main/internal/async.js +24 -0
- package/dist/main/internal/callbackify.d.ts +1 -0
- package/dist/main/internal/callbackify.js +21 -0
- package/dist/main/internal/client.d.ts +394 -0
- package/dist/main/internal/client.js +3014 -0
- package/dist/main/internal/copy-conditions.d.ts +10 -0
- package/dist/main/internal/copy-conditions.js +31 -0
- package/dist/main/internal/extensions.d.ts +18 -0
- package/dist/main/internal/extensions.js +122 -0
- package/dist/main/internal/helper.d.ts +177 -0
- package/dist/main/internal/helper.js +608 -0
- package/dist/main/internal/join-host-port.d.ts +11 -0
- package/dist/main/internal/join-host-port.js +29 -0
- package/dist/main/internal/post-policy.d.ts +17 -0
- package/dist/main/internal/post-policy.js +107 -0
- package/dist/main/internal/request.d.ts +11 -0
- package/dist/main/internal/request.js +83 -0
- package/dist/main/internal/response.d.ts +8 -0
- package/dist/main/internal/response.js +24 -0
- package/dist/main/internal/s3-endpoints.d.ts +38 -0
- package/dist/main/internal/s3-endpoints.js +73 -0
- package/dist/main/internal/type.d.ts +482 -0
- package/dist/main/internal/type.js +42 -0
- package/dist/main/internal/xml-parser.d.ts +93 -0
- package/dist/main/internal/xml-parser.js +849 -0
- package/dist/main/notification.d.ts +58 -0
- package/dist/main/notification.js +230 -0
- package/dist/main/s3.d.ts +40 -0
- package/dist/main/s3.js +117 -0
- package/dist/main/signing.d.ts +5 -0
- package/dist/main/signing.js +269 -0
- package/package.json +146 -39
- package/src/AssumeRoleProvider.ts +262 -0
- package/src/CredentialProvider.ts +54 -0
- package/src/Credentials.ts +44 -0
- package/src/IamAwsProvider.ts +234 -0
- package/src/errors.ts +120 -0
- package/src/helpers.ts +354 -0
- package/src/internal/async.ts +14 -0
- package/src/internal/callbackify.ts +19 -0
- package/src/internal/client.ts +3412 -0
- package/src/internal/copy-conditions.ts +30 -0
- package/src/internal/extensions.ts +140 -0
- package/src/internal/helper.ts +606 -0
- package/src/internal/join-host-port.ts +23 -0
- package/src/internal/post-policy.ts +99 -0
- package/src/internal/request.ts +102 -0
- package/src/internal/response.ts +26 -0
- package/src/internal/s3-endpoints.ts +70 -0
- package/src/internal/type.ts +577 -0
- package/src/internal/xml-parser.ts +871 -0
- package/src/notification.ts +254 -0
- package/src/s3.ts +155 -0
- package/src/signing.ts +325 -0
- package/lib/index.js +0 -450
- package/lib/index.js.map +0 -7
- package/lib/perfTest.js +0 -91
- package/lib/perfTest.js.map +0 -7
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ObjectMetaData } from "./type.mjs";
|
|
2
|
+
export declare class PostPolicy {
|
|
3
|
+
policy: {
|
|
4
|
+
conditions: (string | number)[][];
|
|
5
|
+
expiration?: string;
|
|
6
|
+
};
|
|
7
|
+
formData: Record<string, string>;
|
|
8
|
+
setExpires(date: Date): void;
|
|
9
|
+
setKey(objectName: string): void;
|
|
10
|
+
setKeyStartsWith(prefix: string): void;
|
|
11
|
+
setBucket(bucketName: string): void;
|
|
12
|
+
setContentType(type: string): void;
|
|
13
|
+
setContentTypeStartsWith(prefix: string): void;
|
|
14
|
+
setContentDisposition(value: string): void;
|
|
15
|
+
setContentLengthRange(min: number, max: number): void;
|
|
16
|
+
setUserMetaData(metaData: ObjectMetaData): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// Build PostPolicy object that can be signed by presignedPostPolicy
|
|
2
|
+
import * as errors from "../errors.mjs";
|
|
3
|
+
import { isObject, isValidBucketName, isValidObjectName, isValidPrefix } from "./helper.mjs";
|
|
4
|
+
export class PostPolicy {
|
|
5
|
+
policy = {
|
|
6
|
+
conditions: []
|
|
7
|
+
};
|
|
8
|
+
formData = {};
|
|
9
|
+
|
|
10
|
+
// set expiration date
|
|
11
|
+
setExpires(date) {
|
|
12
|
+
if (!date) {
|
|
13
|
+
throw new errors.InvalidDateError('Invalid date: cannot be null');
|
|
14
|
+
}
|
|
15
|
+
this.policy.expiration = date.toISOString();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// set object name
|
|
19
|
+
setKey(objectName) {
|
|
20
|
+
if (!isValidObjectName(objectName)) {
|
|
21
|
+
throw new errors.InvalidObjectNameError(`Invalid object name : ${objectName}`);
|
|
22
|
+
}
|
|
23
|
+
this.policy.conditions.push(['eq', '$key', objectName]);
|
|
24
|
+
this.formData.key = objectName;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// set object name prefix, i.e policy allows any keys with this prefix
|
|
28
|
+
setKeyStartsWith(prefix) {
|
|
29
|
+
if (!isValidPrefix(prefix)) {
|
|
30
|
+
throw new errors.InvalidPrefixError(`Invalid prefix : ${prefix}`);
|
|
31
|
+
}
|
|
32
|
+
this.policy.conditions.push(['starts-with', '$key', prefix]);
|
|
33
|
+
this.formData.key = prefix;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// set bucket name
|
|
37
|
+
setBucket(bucketName) {
|
|
38
|
+
if (!isValidBucketName(bucketName)) {
|
|
39
|
+
throw new errors.InvalidBucketNameError(`Invalid bucket name : ${bucketName}`);
|
|
40
|
+
}
|
|
41
|
+
this.policy.conditions.push(['eq', '$bucket', bucketName]);
|
|
42
|
+
this.formData.bucket = bucketName;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// set Content-Type
|
|
46
|
+
setContentType(type) {
|
|
47
|
+
if (!type) {
|
|
48
|
+
throw new Error('content-type cannot be null');
|
|
49
|
+
}
|
|
50
|
+
this.policy.conditions.push(['eq', '$Content-Type', type]);
|
|
51
|
+
this.formData['Content-Type'] = type;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// set Content-Type prefix, i.e image/ allows any image
|
|
55
|
+
setContentTypeStartsWith(prefix) {
|
|
56
|
+
if (!prefix) {
|
|
57
|
+
throw new Error('content-type cannot be null');
|
|
58
|
+
}
|
|
59
|
+
this.policy.conditions.push(['starts-with', '$Content-Type', prefix]);
|
|
60
|
+
this.formData['Content-Type'] = prefix;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
// set Content-Disposition
|
|
64
|
+
setContentDisposition(value) {
|
|
65
|
+
if (!value) {
|
|
66
|
+
throw new Error('content-disposition cannot be null');
|
|
67
|
+
}
|
|
68
|
+
this.policy.conditions.push(['eq', '$Content-Disposition', value]);
|
|
69
|
+
this.formData['Content-Disposition'] = value;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// set minimum/maximum length of what Content-Length can be.
|
|
73
|
+
setContentLengthRange(min, max) {
|
|
74
|
+
if (min > max) {
|
|
75
|
+
throw new Error('min cannot be more than max');
|
|
76
|
+
}
|
|
77
|
+
if (min < 0) {
|
|
78
|
+
throw new Error('min should be > 0');
|
|
79
|
+
}
|
|
80
|
+
if (max < 0) {
|
|
81
|
+
throw new Error('max should be > 0');
|
|
82
|
+
}
|
|
83
|
+
this.policy.conditions.push(['content-length-range', min, max]);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// set user defined metadata
|
|
87
|
+
setUserMetaData(metaData) {
|
|
88
|
+
if (!isObject(metaData)) {
|
|
89
|
+
throw new TypeError('metadata should be of type "object"');
|
|
90
|
+
}
|
|
91
|
+
Object.entries(metaData).forEach(([key, value]) => {
|
|
92
|
+
const amzMetaDataKey = `x-amz-meta-${key}`;
|
|
93
|
+
this.policy.conditions.push(['eq', `$${amzMetaDataKey}`, value]);
|
|
94
|
+
this.formData[amzMetaDataKey] = value.toString();
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlcnJvcnMiLCJpc09iamVjdCIsImlzVmFsaWRCdWNrZXROYW1lIiwiaXNWYWxpZE9iamVjdE5hbWUiLCJpc1ZhbGlkUHJlZml4IiwiUG9zdFBvbGljeSIsInBvbGljeSIsImNvbmRpdGlvbnMiLCJmb3JtRGF0YSIsInNldEV4cGlyZXMiLCJkYXRlIiwiSW52YWxpZERhdGVFcnJvciIsImV4cGlyYXRpb24iLCJ0b0lTT1N0cmluZyIsInNldEtleSIsIm9iamVjdE5hbWUiLCJJbnZhbGlkT2JqZWN0TmFtZUVycm9yIiwicHVzaCIsImtleSIsInNldEtleVN0YXJ0c1dpdGgiLCJwcmVmaXgiLCJJbnZhbGlkUHJlZml4RXJyb3IiLCJzZXRCdWNrZXQiLCJidWNrZXROYW1lIiwiSW52YWxpZEJ1Y2tldE5hbWVFcnJvciIsImJ1Y2tldCIsInNldENvbnRlbnRUeXBlIiwidHlwZSIsIkVycm9yIiwic2V0Q29udGVudFR5cGVTdGFydHNXaXRoIiwic2V0Q29udGVudERpc3Bvc2l0aW9uIiwidmFsdWUiLCJzZXRDb250ZW50TGVuZ3RoUmFuZ2UiLCJtaW4iLCJtYXgiLCJzZXRVc2VyTWV0YURhdGEiLCJtZXRhRGF0YSIsIlR5cGVFcnJvciIsIk9iamVjdCIsImVudHJpZXMiLCJmb3JFYWNoIiwiYW16TWV0YURhdGFLZXkiLCJ0b1N0cmluZyJdLCJzb3VyY2VzIjpbInBvc3QtcG9saWN5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIEJ1aWxkIFBvc3RQb2xpY3kgb2JqZWN0IHRoYXQgY2FuIGJlIHNpZ25lZCBieSBwcmVzaWduZWRQb3N0UG9saWN5XG5pbXBvcnQgKiBhcyBlcnJvcnMgZnJvbSAnLi4vZXJyb3JzLnRzJ1xuaW1wb3J0IHsgaXNPYmplY3QsIGlzVmFsaWRCdWNrZXROYW1lLCBpc1ZhbGlkT2JqZWN0TmFtZSwgaXNWYWxpZFByZWZpeCB9IGZyb20gJy4vaGVscGVyLnRzJ1xuaW1wb3J0IHR5cGUgeyBPYmplY3RNZXRhRGF0YSB9IGZyb20gJy4vdHlwZS50cydcblxuZXhwb3J0IGNsYXNzIFBvc3RQb2xpY3kge1xuICBwdWJsaWMgcG9saWN5OiB7IGNvbmRpdGlvbnM6IChzdHJpbmcgfCBudW1iZXIpW11bXTsgZXhwaXJhdGlvbj86IHN0cmluZyB9ID0ge1xuICAgIGNvbmRpdGlvbnM6IFtdLFxuICB9XG4gIHB1YmxpYyBmb3JtRGF0YTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9XG5cbiAgLy8gc2V0IGV4cGlyYXRpb24gZGF0ZVxuICBzZXRFeHBpcmVzKGRhdGU6IERhdGUpIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZERhdGVFcnJvcignSW52YWxpZCBkYXRlOiBjYW5ub3QgYmUgbnVsbCcpXG4gICAgfVxuICAgIHRoaXMucG9saWN5LmV4cGlyYXRpb24gPSBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxuXG4gIC8vIHNldCBvYmplY3QgbmFtZVxuICBzZXRLZXkob2JqZWN0TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZShvYmplY3ROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIG9iamVjdCBuYW1lIDogJHtvYmplY3ROYW1lfWApXG4gICAgfVxuICAgIHRoaXMucG9saWN5LmNvbmRpdGlvbnMucHVzaChbJ2VxJywgJyRrZXknLCBvYmplY3ROYW1lXSlcbiAgICB0aGlzLmZvcm1EYXRhLmtleSA9IG9iamVjdE5hbWVcbiAgfVxuXG4gIC8vIHNldCBvYmplY3QgbmFtZSBwcmVmaXgsIGkuZSBwb2xpY3kgYWxsb3dzIGFueSBrZXlzIHdpdGggdGhpcyBwcmVmaXhcbiAgc2V0S2V5U3RhcnRzV2l0aChwcmVmaXg6IHN0cmluZykge1xuICAgIGlmICghaXNWYWxpZFByZWZpeChwcmVmaXgpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRQcmVmaXhFcnJvcihgSW52YWxpZCBwcmVmaXggOiAke3ByZWZpeH1gKVxuICAgIH1cbiAgICB0aGlzLnBvbGljeS5jb25kaXRpb25zLnB1c2goWydzdGFydHMtd2l0aCcsICcka2V5JywgcHJlZml4XSlcbiAgICB0aGlzLmZvcm1EYXRhLmtleSA9IHByZWZpeFxuICB9XG5cbiAgLy8gc2V0IGJ1Y2tldCBuYW1lXG4gIHNldEJ1Y2tldChidWNrZXROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKGJ1Y2tldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoYEludmFsaWQgYnVja2V0IG5hbWUgOiAke2J1Y2tldE5hbWV9YClcbiAgICB9XG4gICAgdGhpcy5wb2xpY3kuY29uZGl0aW9ucy5wdXNoKFsnZXEnLCAnJGJ1Y2tldCcsIGJ1Y2tldE5hbWVdKVxuICAgIHRoaXMuZm9ybURhdGEuYnVja2V0ID0gYnVja2V0TmFtZVxuICB9XG5cbiAgLy8gc2V0IENvbnRlbnQtVHlwZVxuICBzZXRDb250ZW50VHlwZSh0eXBlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignY29udGVudC10eXBlIGNhbm5vdCBiZSBudWxsJylcbiAgICB9XG4gICAgdGhpcy5wb2xpY3kuY29uZGl0aW9ucy5wdXNoKFsnZXEnLCAnJENvbnRlbnQtVHlwZScsIHR5cGVdKVxuICAgIHRoaXMuZm9ybURhdGFbJ0NvbnRlbnQtVHlwZSddID0gdHlwZVxuICB9XG5cbiAgLy8gc2V0IENvbnRlbnQtVHlwZSBwcmVmaXgsIGkuZSBpbWFnZS8gYWxsb3dzIGFueSBpbWFnZVxuICBzZXRDb250ZW50VHlwZVN0YXJ0c1dpdGgocHJlZml4OiBzdHJpbmcpIHtcbiAgICBpZiAoIXByZWZpeCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdjb250ZW50LXR5cGUgY2Fubm90IGJlIG51bGwnKVxuICAgIH1cbiAgICB0aGlzLnBvbGljeS5jb25kaXRpb25zLnB1c2goWydzdGFydHMtd2l0aCcsICckQ29udGVudC1UeXBlJywgcHJlZml4XSlcbiAgICB0aGlzLmZvcm1EYXRhWydDb250ZW50LVR5cGUnXSA9IHByZWZpeFxuICB9XG5cbiAgLy8gc2V0IENvbnRlbnQtRGlzcG9zaXRpb25cbiAgc2V0Q29udGVudERpc3Bvc2l0aW9uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvbnRlbnQtZGlzcG9zaXRpb24gY2Fubm90IGJlIG51bGwnKVxuICAgIH1cbiAgICB0aGlzLnBvbGljeS5jb25kaXRpb25zLnB1c2goWydlcScsICckQ29udGVudC1EaXNwb3NpdGlvbicsIHZhbHVlXSlcbiAgICB0aGlzLmZvcm1EYXRhWydDb250ZW50LURpc3Bvc2l0aW9uJ10gPSB2YWx1ZVxuICB9XG5cbiAgLy8gc2V0IG1pbmltdW0vbWF4aW11bSBsZW5ndGggb2Ygd2hhdCBDb250ZW50LUxlbmd0aCBjYW4gYmUuXG4gIHNldENvbnRlbnRMZW5ndGhSYW5nZShtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICBpZiAobWluID4gbWF4KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbiBjYW5ub3QgYmUgbW9yZSB0aGFuIG1heCcpXG4gICAgfVxuICAgIGlmIChtaW4gPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21pbiBzaG91bGQgYmUgPiAwJylcbiAgICB9XG4gICAgaWYgKG1heCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWF4IHNob3VsZCBiZSA+IDAnKVxuICAgIH1cbiAgICB0aGlzLnBvbGljeS5jb25kaXRpb25zLnB1c2goWydjb250ZW50LWxlbmd0aC1yYW5nZScsIG1pbiwgbWF4XSlcbiAgfVxuXG4gIC8vIHNldCB1c2VyIGRlZmluZWQgbWV0YWRhdGFcbiAgc2V0VXNlck1ldGFEYXRhKG1ldGFEYXRhOiBPYmplY3RNZXRhRGF0YSkge1xuICAgIGlmICghaXNPYmplY3QobWV0YURhdGEpKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdtZXRhZGF0YSBzaG91bGQgYmUgb2YgdHlwZSBcIm9iamVjdFwiJylcbiAgICB9XG4gICAgT2JqZWN0LmVudHJpZXMobWV0YURhdGEpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgY29uc3QgYW16TWV0YURhdGFLZXkgPSBgeC1hbXotbWV0YS0ke2tleX1gXG4gICAgICB0aGlzLnBvbGljeS5jb25kaXRpb25zLnB1c2goWydlcScsIGAkJHthbXpNZXRhRGF0YUtleX1gLCB2YWx1ZV0pXG4gICAgICB0aGlzLmZvcm1EYXRhW2Ftek1ldGFEYXRhS2V5XSA9IHZhbHVlLnRvU3RyaW5nKClcbiAgICB9KVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0EsT0FBTyxLQUFLQSxNQUFNLE1BQU0sZUFBYztBQUN0QyxTQUFTQyxRQUFRLEVBQUVDLGlCQUFpQixFQUFFQyxpQkFBaUIsRUFBRUMsYUFBYSxRQUFRLGNBQWE7QUFHM0YsT0FBTyxNQUFNQyxVQUFVLENBQUM7RUFDZkMsTUFBTSxHQUErRDtJQUMxRUMsVUFBVSxFQUFFO0VBQ2QsQ0FBQztFQUNNQyxRQUFRLEdBQTJCLENBQUMsQ0FBQzs7RUFFNUM7RUFDQUMsVUFBVUEsQ0FBQ0MsSUFBVSxFQUFFO0lBQ3JCLElBQUksQ0FBQ0EsSUFBSSxFQUFFO01BQ1QsTUFBTSxJQUFJVixNQUFNLENBQUNXLGdCQUFnQixDQUFDLDhCQUE4QixDQUFDO0lBQ25FO0lBQ0EsSUFBSSxDQUFDTCxNQUFNLENBQUNNLFVBQVUsR0FBR0YsSUFBSSxDQUFDRyxXQUFXLENBQUMsQ0FBQztFQUM3Qzs7RUFFQTtFQUNBQyxNQUFNQSxDQUFDQyxVQUFrQixFQUFFO0lBQ3pCLElBQUksQ0FBQ1osaUJBQWlCLENBQUNZLFVBQVUsQ0FBQyxFQUFFO01BQ2xDLE1BQU0sSUFBSWYsTUFBTSxDQUFDZ0Isc0JBQXNCLENBQUUseUJBQXdCRCxVQUFXLEVBQUMsQ0FBQztJQUNoRjtJQUNBLElBQUksQ0FBQ1Qs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
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
/// <reference types="node" />
|
|
5
|
+
import type * as http from 'node:http';
|
|
6
|
+
import type * as https from 'node:https';
|
|
7
|
+
import type * as stream from 'node:stream';
|
|
8
|
+
import type { Transport } from "./type.mjs";
|
|
9
|
+
export declare function request(transport: Transport, opt: https.RequestOptions, body?: Buffer | string | stream.Readable | null): Promise<http.IncomingMessage>;
|
|
10
|
+
export declare const retryHttpCodes: Record<string, boolean>;
|
|
11
|
+
export declare function requestWithRetry(transport: Transport, opt: https.RequestOptions, body?: Buffer | string | stream.Readable | null, maxRetries?: number, baseDelayMs?: number, maximumDelayMs?: number): Promise<http.IncomingMessage>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { pipeline } from "stream";
|
|
2
|
+
import { promisify } from "util";
|
|
3
|
+
const pipelineAsync = promisify(pipeline);
|
|
4
|
+
export async function request(transport, opt, body = null) {
|
|
5
|
+
return new Promise((resolve, reject) => {
|
|
6
|
+
const requestObj = transport.request(opt, response => {
|
|
7
|
+
resolve(response);
|
|
8
|
+
});
|
|
9
|
+
requestObj.on('error', reject);
|
|
10
|
+
if (!body || Buffer.isBuffer(body) || typeof body === 'string') {
|
|
11
|
+
requestObj.end(body);
|
|
12
|
+
} else {
|
|
13
|
+
pipelineAsync(body, requestObj).catch(reject);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
const MAX_RETRIES = 1;
|
|
18
|
+
const BASE_DELAY_MS = 100; // Base delay for exponential backoff
|
|
19
|
+
const MAX_DELAY_MS = 60000; // Max delay for exponential backoff
|
|
20
|
+
|
|
21
|
+
// Retryable error codes for HTTP (ref: Go SDK)
|
|
22
|
+
export const retryHttpCodes = {
|
|
23
|
+
408: true,
|
|
24
|
+
429: true,
|
|
25
|
+
499: true,
|
|
26
|
+
500: true,
|
|
27
|
+
502: true,
|
|
28
|
+
503: true,
|
|
29
|
+
504: true,
|
|
30
|
+
520: true
|
|
31
|
+
};
|
|
32
|
+
const isHttpRetryable = httpResCode => {
|
|
33
|
+
return retryHttpCodes[httpResCode] !== undefined;
|
|
34
|
+
};
|
|
35
|
+
const sleep = ms => {
|
|
36
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
37
|
+
};
|
|
38
|
+
const getExpBackOffDelay = (retryCount, baseDelayMs, maximumDelayMs) => {
|
|
39
|
+
const backOffBy = baseDelayMs * (1 << retryCount);
|
|
40
|
+
const additionalDelay = Math.random() * backOffBy;
|
|
41
|
+
return Math.min(backOffBy + additionalDelay, maximumDelayMs);
|
|
42
|
+
};
|
|
43
|
+
export async function requestWithRetry(transport, opt, body = null, maxRetries = MAX_RETRIES, baseDelayMs = BASE_DELAY_MS, maximumDelayMs = MAX_DELAY_MS) {
|
|
44
|
+
let attempt = 0;
|
|
45
|
+
let isRetryable = false;
|
|
46
|
+
while (attempt <= maxRetries) {
|
|
47
|
+
try {
|
|
48
|
+
const response = await request(transport, opt, body);
|
|
49
|
+
// Check if the HTTP status code is retryable
|
|
50
|
+
if (isHttpRetryable(response.statusCode)) {
|
|
51
|
+
isRetryable = true;
|
|
52
|
+
throw new Error(`Retryable HTTP status: ${response.statusCode}`); // trigger retry attempt with calculated delay
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return response; // Success, return the raw response
|
|
56
|
+
} catch (err) {
|
|
57
|
+
if (isRetryable) {
|
|
58
|
+
attempt++;
|
|
59
|
+
isRetryable = false;
|
|
60
|
+
if (attempt > maxRetries) {
|
|
61
|
+
throw new Error(`Request failed after ${maxRetries} retries: ${err}`);
|
|
62
|
+
}
|
|
63
|
+
const delay = getExpBackOffDelay(attempt, baseDelayMs, maximumDelayMs);
|
|
64
|
+
// eslint-disable-next-line no-console
|
|
65
|
+
console.warn(`${new Date().toLocaleString()} Retrying request (attempt ${attempt}/${maxRetries}) after ${delay}ms due to: ${err}`);
|
|
66
|
+
await sleep(delay);
|
|
67
|
+
} else {
|
|
68
|
+
throw err; // re-throw if any request, syntax errors
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
throw new Error(`${MAX_RETRIES} Retries exhausted, request failed.`);
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJwaXBlbGluZSIsInByb21pc2lmeSIsInBpcGVsaW5lQXN5bmMiLCJyZXF1ZXN0IiwidHJhbnNwb3J0Iiwib3B0IiwiYm9keSIsIlByb21pc2UiLCJyZXNvbHZlIiwicmVqZWN0IiwicmVxdWVzdE9iaiIsInJlc3BvbnNlIiwib24iLCJCdWZmZXIiLCJpc0J1ZmZlciIsImVuZCIsImNhdGNoIiwiTUFYX1JFVFJJRVMiLCJCQVNFX0RFTEFZX01TIiwiTUFYX0RFTEFZX01TIiwicmV0cnlIdHRwQ29kZXMiLCJpc0h0dHBSZXRyeWFibGUiLCJodHRwUmVzQ29kZSIsInVuZGVmaW5lZCIsInNsZWVwIiwibXMiLCJzZXRUaW1lb3V0IiwiZ2V0RXhwQmFja09mZkRlbGF5IiwicmV0cnlDb3VudCIsImJhc2VEZWxheU1zIiwibWF4aW11bURlbGF5TXMiLCJiYWNrT2ZmQnkiLCJhZGRpdGlvbmFsRGVsYXkiLCJNYXRoIiwicmFuZG9tIiwibWluIiwicmVxdWVzdFdpdGhSZXRyeSIsIm1heFJldHJpZXMiLCJhdHRlbXB0IiwiaXNSZXRyeWFibGUiLCJzdGF0dXNDb2RlIiwiRXJyb3IiLCJlcnIiLCJkZWxheSIsImNvbnNvbGUiLCJ3YXJuIiwiRGF0ZSIsInRvTG9jYWxlU3RyaW5nIl0sInNvdXJjZXMiOlsicmVxdWVzdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSAqIGFzIGh0dHAgZnJvbSAnbm9kZTpodHRwJ1xuaW1wb3J0IHR5cGUgKiBhcyBodHRwcyBmcm9tICdub2RlOmh0dHBzJ1xuaW1wb3J0IHR5cGUgKiBhcyBzdHJlYW0gZnJvbSAnbm9kZTpzdHJlYW0nXG5pbXBvcnQgeyBwaXBlbGluZSB9IGZyb20gJ25vZGU6c3RyZWFtJ1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJ1xuXG5pbXBvcnQgdHlwZSB7IFRyYW5zcG9ydCB9IGZyb20gJy4vdHlwZS50cydcblxuY29uc3QgcGlwZWxpbmVBc3luYyA9IHByb21pc2lmeShwaXBlbGluZSlcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3QoXG4gIHRyYW5zcG9ydDogVHJhbnNwb3J0LFxuICBvcHQ6IGh0dHBzLlJlcXVlc3RPcHRpb25zLFxuICBib2R5OiBCdWZmZXIgfCBzdHJpbmcgfCBzdHJlYW0uUmVhZGFibGUgfCBudWxsID0gbnVsbCxcbik6IFByb21pc2U8aHR0cC5JbmNvbWluZ01lc3NhZ2U+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPGh0dHAuSW5jb21pbmdNZXNzYWdlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdE9iaiA9IHRyYW5zcG9ydC5yZXF1ZXN0KG9wdCwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXNvbHZlKHJlc3BvbnNlKVxuICAgIH0pXG5cbiAgICByZXF1ZXN0T2JqLm9uKCdlcnJvcicsIHJlamVjdClcblxuICAgIGlmICghYm9keSB8fCBCdWZmZXIuaXNCdWZmZXIoYm9keSkgfHwgdHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXF1ZXN0T2JqLmVuZChib2R5KVxuICAgIH0gZWxzZSB7XG4gICAgICBwaXBlbGluZUFzeW5jKGJvZHksIHJlcXVlc3RPYmopLmNhdGNoKHJlamVjdClcbiAgICB9XG4gIH0pXG59XG5cbmNvbnN0IE1BWF9SRVRSSUVTID0gMVxuY29uc3QgQkFTRV9ERUxBWV9NUyA9IDEwMCAvLyBCYXNlIGRlbGF5IGZvciBleHBvbmVudGlhbCBiYWNrb2ZmXG5jb25zdCBNQVhfREVMQVlfTVMgPSA2MDAwMCAvLyBNYXggZGVsYXkgZm9yIGV4cG9uZW50aWFsIGJhY2tvZmZcblxuLy8gUmV0cnlhYmxlIGVycm9yIGNvZGVzIGZvciBIVFRQIChyZWY6IEdvIFNESylcbmV4cG9ydCBjb25zdCByZXRyeUh0dHBDb2RlczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj4gPSB7XG4gIDQwODogdHJ1ZSxcbiAgNDI5OiB0cnVlLFxuICA0OTk6IHRydWUsXG4gIDUwMDogdHJ1ZSxcbiAgNTAyOiB0cnVlLFxuICA1MDM6IHRydWUsXG4gIDUwNDogdHJ1ZSxcbiAgNTIwOiB0cnVlLFxufVxuXG5jb25zdCBpc0h0dHBSZXRyeWFibGUgPSAoaHR0cFJlc0NvZGU6IG51bWJlcikgPT4ge1xuICByZXR1cm4gcmV0cnlIdHRwQ29kZXNbaHR0cFJlc0NvZGVdICE9PSB1bmRlZmluZWRcbn1cblxuY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKVxufVxuXG5jb25zdCBnZXRFeHBCYWNrT2ZmRGVsYXkgPSAocmV0cnlDb3VudDogbnVtYmVyLCBiYXNlRGVsYXlNczogbnVtYmVyLCBtYXhpbXVtRGVsYXlNczogbnVtYmVyKSA9PiB7XG4gIGNvbnN0IGJhY2tPZmZCeSA9IGJhc2VEZWxheU1zICogKDEgPDwgcmV0cnlDb3VudClcbiAgY29uc3QgYWRkaXRpb25hbERlbGF5ID0gTWF0aC5yYW5kb20oKSAqIGJhY2tPZmZCeVxuICByZXR1cm4gTWF0aC5taW4oYmFja09mZkJ5ICsgYWRkaXRpb25hbERlbGF5LCBtYXhpbXVtRGVsYXlNcylcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RXaXRoUmV0cnkoXG4gIHRyYW5zcG9ydDogVHJhbnNwb3J0LFxuICBvcHQ6IGh0dHBzLlJlcXVlc3RPcHRpb25zLFxuICBib2R5OiBCdWZmZXIgfCBzdHJpbmcgfCBzdHJlYW0uUmVhZGFibGUgfCBudWxsID0gbnVsbCxcbiAgbWF4UmV0cmllczogbnVtYmVyID0gTUFYX1JFVFJJRVMsXG4gIGJhc2VEZWxheU1zOiBudW1iZXIgPSBCQVNFX0RFTEFZX01TLFxuICBtYXhpbXVtRGVsYXlNczogbnVtYmVyID0gTUFYX0RFTEFZX01TLFxuKTogUHJvbWlzZTxodHRwLkluY29taW5nTWVzc2FnZT4ge1xuICBsZXQgYXR0ZW1wdCA9IDBcbiAgbGV0IGlzUmV0cnlhYmxlID0gZmFsc2VcbiAgd2hpbGUgKGF0dGVtcHQgPD0gbWF4UmV0cmllcykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHJlcXVlc3QodHJhbnNwb3J0LCBvcHQsIGJvZHkpXG4gICAgICAvLyBDaGVjayBpZiB0aGUgSFRUUCBzdGF0dXMgY29kZSBpcyByZXRyeWFibGVcbiAgICAgIGlmIChpc0h0dHBSZXRyeWFibGUocmVzcG9uc2Uuc3RhdHVzQ29kZSBhcyBudW1iZXIpKSB7XG4gICAgICAgIGlzUmV0cnlhYmxlID0gdHJ1ZVxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJldHJ5YWJsZSBIVFRQIHN0YXR1czogJHtyZXNwb25zZS5zdGF0dXNDb2RlfWApIC8vIHRyaWdnZXIgcmV0cnkgYXR0ZW1wdCB3aXRoIGNhbGN1bGF0ZWQgZGVsYXlcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3BvbnNlIC8vIFN1Y2Nlc3MsIHJldHVybiB0aGUgcmF3IHJlc3BvbnNlXG4gICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICBpZiAoaXNSZXRyeWFibGUpIHtcbiAgICAgICAgYXR0ZW1wdCsrXG4gICAgICAgIGlzUmV0cnlhYmxlID0gZmFsc2VcblxuICAgICAgICBpZiAoYXR0ZW1wdCA+IG1heFJldHJpZXMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJlcXVlc3QgZmFpbGVkIGFmdGVyICR7bWF4UmV0cmllc30gcmV0cmllczogJHtlcnJ9YClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWxheSA9IGdldEV4cEJhY2tPZmZEZWxheShhdHRlbXB0LCBiYXNlRGVsYXlNcywgbWF4aW11bURlbGF5TXMpXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgJHtuZXcgRGF0ZSgpLnRvTG9jYWxlU3RyaW5nKCl9IFJldHJ5aW5nIHJlcXVlc3QgKGF0dGVtcHQgJHthdHRlbXB0fS8ke21heFJldHJpZXN9KSBhZnRlciAke2RlbGF5fW1zIGR1ZSB0bzogJHtlcnJ9YCxcbiAgICAgICAgKVxuICAgICAgICBhd2FpdCBzbGVlcChkZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVyciAvLyByZS10aHJvdyBpZiBhbnkgcmVxdWVzdCwgc3ludGF4IGVycm9yc1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgJHtNQVhfUkVUUklFU30gUmV0cmllcyBleGhhdXN0ZWQsIHJlcXVlc3QgZmFpbGVkLmApXG59XG4iXSwibWFwcGluZ3MiOiJBQUdBLFNBQVNBLFFBQVE7QUFDakIsU0FBU0MsU0FBUztBQUlsQixNQUFNQyxhQUFhLEdBQUdELFNBQVMsQ0FBQ0QsUUFBUSxDQUFDO0FBRXpDLE9BQU8sZUFBZUcsT0FBT0EsQ0FDM0JDLFNBQW9CLEVBQ3BCQyxHQUF5QixFQUN6QkMsSUFBOEMsR0FBRyxJQUFJLEVBQ3RCO0VBQy9CLE9BQU8sSUFBSUMsT0FBTyxDQUF1QixDQUFDQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztJQUM1RCxNQUFNQyxVQUFVLEdBQUdOLFNBQVMsQ0FBQ0QsT0FBTyxDQUFDRSxHQUFHLEVBQUdNLFFBQVEsSUFBSztNQUN0REgsT0FBTyxDQUFDRyxRQUFRLENBQUM7SUFDbkIsQ0FBQyxDQUFDO0lBRUZELFVBQVUsQ0FBQ0UsRUFBRSxDQUFDLE9BQU8sRUFBRUgsTUFBTSxDQUFDO0lBRTlCLElBQUksQ0FBQ0gsSUFBSSxJQUFJTyxNQUFNLENBQUNDLFFBQVEsQ0FBQ1IsSUFBSSxDQUFDLElBQUksT0FBT0EsSUFBSSxLQUFLLFFBQVEsRUFBRTtNQUM5REksVUFBVSxDQUFDSyxHQUFHLENBQUNULElBQUksQ0FBQztJQUN0QixDQUFDLE1BQU07TUFDTEosYUFBYSxDQUFDSSxJQUFJLEVBQUVJLFVBQVUsQ0FBQyxDQUFDTSxLQUFLLENBQUNQLE1BQU0sQ0FBQztJQUMvQztFQUNGLENBQUMsQ0FBQztBQUNKO0FBRUEsTUFBTVEsV0FBVyxH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
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/// <reference types="node" />
|
|
4
|
+
import type http from 'node:http';
|
|
5
|
+
import type stream from 'node:stream';
|
|
6
|
+
export declare function readAsBuffer(res: stream.Readable): Promise<Buffer>;
|
|
7
|
+
export declare function readAsString(res: http.IncomingMessage): Promise<string>;
|
|
8
|
+
export declare function drainResponse(res: stream.Readable): Promise<void>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export async function readAsBuffer(res) {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
const body = [];
|
|
4
|
+
res.on('data', chunk => body.push(chunk)).on('error', e => reject(e)).on('end', () => resolve(Buffer.concat(body)));
|
|
5
|
+
});
|
|
6
|
+
}
|
|
7
|
+
export async function readAsString(res) {
|
|
8
|
+
const body = await readAsBuffer(res);
|
|
9
|
+
return body.toString();
|
|
10
|
+
}
|
|
11
|
+
export async function drainResponse(res) {
|
|
12
|
+
return new Promise((resolve, reject) => {
|
|
13
|
+
res.on('data', () => {}).on('error', e => reject(e)).on('end', () => resolve());
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJyZWFkQXNCdWZmZXIiLCJyZXMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsImJvZHkiLCJvbiIsImNodW5rIiwicHVzaCIsImUiLCJCdWZmZXIiLCJjb25jYXQiLCJyZWFkQXNTdHJpbmciLCJ0b1N0cmluZyIsImRyYWluUmVzcG9uc2UiXSwic291cmNlcyI6WyJyZXNwb25zZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSBodHRwIGZyb20gJ25vZGU6aHR0cCdcbmltcG9ydCB0eXBlIHN0cmVhbSBmcm9tICdub2RlOnN0cmVhbSdcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBc0J1ZmZlcihyZXM6IHN0cmVhbS5SZWFkYWJsZSk6IFByb21pc2U8QnVmZmVyPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgYm9keTogQnVmZmVyW10gPSBbXVxuICAgIHJlc1xuICAgICAgLm9uKCdkYXRhJywgKGNodW5rOiBCdWZmZXIpID0+IGJvZHkucHVzaChjaHVuaykpXG4gICAgICAub24oJ2Vycm9yJywgKGUpID0+IHJlamVjdChlKSlcbiAgICAgIC5vbignZW5kJywgKCkgPT4gcmVzb2x2ZShCdWZmZXIuY29uY2F0KGJvZHkpKSlcbiAgfSlcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYWRBc1N0cmluZyhyZXM6IGh0dHAuSW5jb21pbmdNZXNzYWdlKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgYm9keSA9IGF3YWl0IHJlYWRBc0J1ZmZlcihyZXMpXG4gIHJldHVybiBib2R5LnRvU3RyaW5nKClcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRyYWluUmVzcG9uc2UocmVzOiBzdHJlYW0uUmVhZGFibGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICByZXNcbiAgICAgIC5vbignZGF0YScsICgpID0+IHt9KVxuICAgICAgLm9uKCdlcnJvcicsIChlKSA9PiByZWplY3QoZSkpXG4gICAgICAub24oJ2VuZCcsICgpID0+IHJlc29sdmUoKSlcbiAgfSlcbn1cbiJdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxlQUFlQSxZQUFZQSxDQUFDQyxHQUFvQixFQUFtQjtFQUN4RSxPQUFPLElBQUlDLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztJQUN0QyxNQUFNQyxJQUFjLEdBQUcsRUFBRTtJQUN6QkosR0FBRyxDQUNBSyxFQUFFLENBQUMsTUFBTSxFQUFHQyxLQUFhLElBQUtGLElBQUksQ0FBQ0csSUFBSSxDQUFDRCxLQUFLLENBQUMsQ0FBQyxDQUMvQ0QsRUFBRSxDQUFDLE9BQU8sRUFBR0csQ0FBQyxJQUFLTCxNQUFNLENBQUNLLENBQUMsQ0FBQyxDQUFDLENBQzdCSCxFQUFFLENBQUMsS0FBSyxFQUFFLE1BQU1ILE9BQU8sQ0FBQ08sTUFBTSxDQUFDQyxNQUFNLENBQUNOLElBQUksQ0FBQyxDQUFDLENBQUM7RUFDbEQsQ0FBQyxDQUFDO0FBQ0o7QUFFQSxPQUFPLGVBQWVPLFlBQVlBLENBQUNYLEdBQXlCLEVBQW1CO0VBQzdFLE1BQU1JLElBQUksR0FBRyxNQUFNTCxZQUFZLENBQUNDLEdBQUcsQ0FBQztFQUNwQyxPQUFPSSxJQUFJLENBQUNRLFFBQVEsQ0FBQyxDQUFDO0FBQ3hCO0FBRUEsT0FBTyxlQUFlQyxhQUFhQSxDQUFDYixHQUFvQixFQUFpQjtFQUN2RSxPQUFPLElBQUlDLE9BQU8sQ0FBQyxDQUFDQyxPQUFPLEVBQUVDLE1BQU0sS0FBSztJQUN0Q0gsR0FBRyxDQUNBSyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FDcEJBLEVBQUUsQ0FBQyxPQUFPLEVBQUdHLENBQUMsSUFBS0wsTUFBTSxDQUFDSyxDQUFDLENBQUMsQ0FBQyxDQUM3QkgsRUFBRSxDQUFDLEtBQUssRUFBRSxNQUFNSCxPQUFPLENBQUMsQ0FBQyxDQUFDO0VBQy9CLENBQUMsQ0FBQztBQUNKIn0=
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
declare const awsS3Endpoint: {
|
|
2
|
+
'af-south-1': string;
|
|
3
|
+
'ap-east-1': string;
|
|
4
|
+
'ap-south-1': string;
|
|
5
|
+
'ap-south-2': string;
|
|
6
|
+
'ap-southeast-1': string;
|
|
7
|
+
'ap-southeast-2': string;
|
|
8
|
+
'ap-southeast-3': string;
|
|
9
|
+
'ap-southeast-4': string;
|
|
10
|
+
'ap-southeast-5': string;
|
|
11
|
+
'ap-northeast-1': string;
|
|
12
|
+
'ap-northeast-2': string;
|
|
13
|
+
'ap-northeast-3': string;
|
|
14
|
+
'ca-central-1': string;
|
|
15
|
+
'ca-west-1': string;
|
|
16
|
+
'cn-north-1': string;
|
|
17
|
+
'eu-central-1': string;
|
|
18
|
+
'eu-central-2': string;
|
|
19
|
+
'eu-north-1': string;
|
|
20
|
+
'eu-south-1': string;
|
|
21
|
+
'eu-south-2': string;
|
|
22
|
+
'eu-west-1': string;
|
|
23
|
+
'eu-west-2': string;
|
|
24
|
+
'eu-west-3': string;
|
|
25
|
+
'il-central-1': string;
|
|
26
|
+
'me-central-1': string;
|
|
27
|
+
'me-south-1': string;
|
|
28
|
+
'sa-east-1': string;
|
|
29
|
+
'us-east-1': string;
|
|
30
|
+
'us-east-2': string;
|
|
31
|
+
'us-west-1': string;
|
|
32
|
+
'us-west-2': string;
|
|
33
|
+
'us-gov-east-1': string;
|
|
34
|
+
'us-gov-west-1': string;
|
|
35
|
+
};
|
|
36
|
+
export type Region = keyof typeof awsS3Endpoint | string;
|
|
37
|
+
export declare function getS3Endpoint(region: Region): string;
|
|
38
|
+
export {};
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Hanzo S3 Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2015, 2016 Hanzo AI, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { isString } from "./helper.mjs";
|
|
18
|
+
|
|
19
|
+
// List of currently supported endpoints.
|
|
20
|
+
const awsS3Endpoint = {
|
|
21
|
+
'af-south-1': 's3.af-south-1.amazonaws.com',
|
|
22
|
+
'ap-east-1': 's3.ap-east-1.amazonaws.com',
|
|
23
|
+
'ap-south-1': 's3.ap-south-1.amazonaws.com',
|
|
24
|
+
'ap-south-2': 's3.ap-south-2.amazonaws.com',
|
|
25
|
+
'ap-southeast-1': 's3.ap-southeast-1.amazonaws.com',
|
|
26
|
+
'ap-southeast-2': 's3.ap-southeast-2.amazonaws.com',
|
|
27
|
+
'ap-southeast-3': 's3.ap-southeast-3.amazonaws.com',
|
|
28
|
+
'ap-southeast-4': 's3.ap-southeast-4.amazonaws.com',
|
|
29
|
+
'ap-southeast-5': 's3.ap-southeast-5.amazonaws.com',
|
|
30
|
+
'ap-northeast-1': 's3.ap-northeast-1.amazonaws.com',
|
|
31
|
+
'ap-northeast-2': 's3.ap-northeast-2.amazonaws.com',
|
|
32
|
+
'ap-northeast-3': 's3.ap-northeast-3.amazonaws.com',
|
|
33
|
+
'ca-central-1': 's3.ca-central-1.amazonaws.com',
|
|
34
|
+
'ca-west-1': 's3.ca-west-1.amazonaws.com',
|
|
35
|
+
'cn-north-1': 's3.cn-north-1.amazonaws.com.cn',
|
|
36
|
+
'eu-central-1': 's3.eu-central-1.amazonaws.com',
|
|
37
|
+
'eu-central-2': 's3.eu-central-2.amazonaws.com',
|
|
38
|
+
'eu-north-1': 's3.eu-north-1.amazonaws.com',
|
|
39
|
+
'eu-south-1': 's3.eu-south-1.amazonaws.com',
|
|
40
|
+
'eu-south-2': 's3.eu-south-2.amazonaws.com',
|
|
41
|
+
'eu-west-1': 's3.eu-west-1.amazonaws.com',
|
|
42
|
+
'eu-west-2': 's3.eu-west-2.amazonaws.com',
|
|
43
|
+
'eu-west-3': 's3.eu-west-3.amazonaws.com',
|
|
44
|
+
'il-central-1': 's3.il-central-1.amazonaws.com',
|
|
45
|
+
'me-central-1': 's3.me-central-1.amazonaws.com',
|
|
46
|
+
'me-south-1': 's3.me-south-1.amazonaws.com',
|
|
47
|
+
'sa-east-1': 's3.sa-east-1.amazonaws.com',
|
|
48
|
+
'us-east-1': 's3.us-east-1.amazonaws.com',
|
|
49
|
+
'us-east-2': 's3.us-east-2.amazonaws.com',
|
|
50
|
+
'us-west-1': 's3.us-west-1.amazonaws.com',
|
|
51
|
+
'us-west-2': 's3.us-west-2.amazonaws.com',
|
|
52
|
+
'us-gov-east-1': 's3.us-gov-east-1.amazonaws.com',
|
|
53
|
+
'us-gov-west-1': 's3.us-gov-west-1.amazonaws.com'
|
|
54
|
+
// Add new endpoints here.
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// getS3Endpoint get relevant endpoint for the region.
|
|
58
|
+
export function getS3Endpoint(region) {
|
|
59
|
+
if (!isString(region)) {
|
|
60
|
+
throw new TypeError(`Invalid region: ${region}`);
|
|
61
|
+
}
|
|
62
|
+
const endpoint = awsS3Endpoint[region];
|
|
63
|
+
if (endpoint) {
|
|
64
|
+
return endpoint;
|
|
65
|
+
}
|
|
66
|
+
return 's3.amazonaws.com';
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJpc1N0cmluZyIsImF3c1MzRW5kcG9pbnQiLCJnZXRTM0VuZHBvaW50IiwicmVnaW9uIiwiVHlwZUVycm9yIiwiZW5kcG9pbnQiXSwic291cmNlcyI6WyJzMy1lbmRwb2ludHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIEhhbnpvIFMzIEphdmFzY3JpcHQgTGlicmFyeSBmb3IgQW1hem9uIFMzIENvbXBhdGlibGUgQ2xvdWQgU3RvcmFnZSwgKEMpIDIwMTUsIDIwMTYgSGFuem8gQUksIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKi9cblxuaW1wb3J0IHsgaXNTdHJpbmcgfSBmcm9tICcuL2hlbHBlci50cydcblxuLy8gTGlzdCBvZiBjdXJyZW50bHkgc3VwcG9ydGVkIGVuZHBvaW50cy5cbmNvbnN0IGF3c1MzRW5kcG9pbnQgPSB7XG4gICdhZi1zb3V0aC0xJzogJ3MzLmFmLXNvdXRoLTEuYW1hem9uYXdzLmNvbScsXG4gICdhcC1lYXN0LTEnOiAnczMuYXAtZWFzdC0xLmFtYXpvbmF3cy5jb20nLFxuICAnYXAtc291dGgtMSc6ICdzMy5hcC1zb3V0aC0xLmFtYXpvbmF3cy5jb20nLFxuICAnYXAtc291dGgtMic6ICdzMy5hcC1zb3V0aC0yLmFtYXpvbmF3cy5jb20nLFxuICAnYXAtc291dGhlYXN0LTEnOiAnczMuYXAtc291dGhlYXN0LTEuYW1hem9uYXdzLmNvbScsXG4gICdhcC1zb3V0aGVhc3QtMic6ICdzMy5hcC1zb3V0aGVhc3QtMi5hbWF6b25hd3MuY29tJyxcbiAgJ2FwLXNvdXRoZWFzdC0zJzogJ3MzLmFwLXNvdXRoZWFzdC0zLmFtYXpvbmF3cy5jb20nLFxuICAnYXAtc291dGhlYXN0LTQnOiAnczMuYXAtc291dGhlYXN0LTQuYW1hem9uYXdzLmNvbScsXG4gICdhcC1zb3V0aGVhc3QtNSc6ICdzMy5hcC1zb3V0aGVhc3QtNS5hbWF6b25hd3MuY29tJyxcbiAgJ2FwLW5vcnRoZWFzdC0xJzogJ3MzLmFwLW5vcnRoZWFzdC0xLmFtYXpvbmF3cy5jb20nLFxuICAnYXAtbm9ydGhlYXN0LTInOiAnczMuYXAtbm9ydGhlYXN0LTIuYW1hem9uYXdzLmNvbScsXG4gICdhcC1ub3J0aGVhc3QtMyc6ICdzMy5hcC1ub3J0aGVhc3QtMy5hbWF6b25hd3MuY29tJyxcbiAgJ2NhLWNlbnRyYWwtMSc6ICdzMy5jYS1jZW50cmFsLTEuYW1hem9uYXdzLmNvbScsXG4gICdjYS13ZXN0LTEnOiAnczMuY2Etd2VzdC0xLmFtYXpvbmF3cy5jb20nLFxuICAnY24tbm9ydGgtMSc6ICdzMy5jbi1ub3J0aC0xLmFtYXpvbmF3cy5jb20uY24nLFxuICAnZXUtY2VudHJhbC0xJzogJ3MzLmV1LWNlbnRyYWwtMS5hbWF6b25hd3MuY29tJyxcbiAgJ2V1LWNlbnRyYWwtMic6ICdzMy5ldS1jZW50cmFsLTIuYW1hem9uYXdzLmNvbScsXG4gICdldS1ub3J0aC0xJzogJ3MzLmV1LW5vcnRoLTEuYW1hem9uYXdzLmNvbScsXG4gICdldS1zb3V0aC0xJzogJ3MzLmV1LXNvdXRoLTEuYW1hem9uYXdzLmNvbScsXG4gICdldS1zb3V0aC0yJzogJ3MzLmV1LXNvdXRoLTIuYW1hem9uYXdzLmNvbScsXG4gICdldS13ZXN0LTEnOiAnczMuZXUtd2VzdC0xLmFtYXpvbmF3cy5jb20nLFxuICAnZXUtd2VzdC0yJzogJ3MzLmV1LXdlc3QtMi5hbWF6b25hd3MuY29tJyxcbiAgJ2V1LXdlc3QtMyc6ICdzMy5ldS13ZXN0LTMuYW1hem9uYXdzLmNvbScsXG4gICdpbC1jZW50cmFsLTEnOiAnczMuaWwtY2VudHJhbC0xLmFtYXpvbmF3cy5jb20nLFxuICAnbWUtY2VudHJhbC0xJzogJ3MzLm1lLWNlbnRyYWwtMS5hbWF6b25hd3MuY29tJyxcbiAgJ21lLXNvdXRoLTEnOiAnczMubWUtc291dGgtMS5hbWF6b25hd3MuY29tJyxcbiAgJ3NhLWVhc3QtMSc6ICdzMy5zYS1lYXN0LTEuYW1hem9uYXdzLmNvbScsXG4gICd1cy1lYXN0LTEnOiAnczMudXMtZWFzdC0xLmFtYXpvbmF3cy5jb20nLFxuICAndXMtZWFzdC0yJzogJ3MzLnVzLWVhc3QtMi5hbWF6b25hd3MuY29tJyxcbiAgJ3VzLXdlc3QtMSc6ICdzMy51cy13ZXN0LTEuYW1hem9uYXdzLmNvbScsXG4gICd1cy13ZXN0LTInOiAnczMudXMtd2VzdC0yLmFtYXpvbmF3cy5jb20nLFxuICAndXMtZ292LWVhc3QtMSc6ICdzMy51cy1nb3YtZWFzdC0xLmFtYXpvbmF3cy5jb20nLFxuICAndXMtZ292LXdlc3QtMSc6ICdzMy51cy1nb3Ytd2VzdC0xLmFtYXpvbmF3cy5jb20nLFxuICAvLyBBZGQgbmV3IGVuZHBvaW50cyBoZXJlLlxufVxuXG5leHBvcnQgdHlwZSBSZWdpb24gPSBrZXlvZiB0eXBlb2YgYXdzUzNFbmRwb2ludCB8IHN0cmluZ1xuXG4vLyBnZXRTM0VuZHBvaW50IGdldCByZWxldmFudCBlbmRwb2ludCBmb3IgdGhlIHJlZ2lvbi5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTM0VuZHBvaW50KHJlZ2lvbjogUmVnaW9uKTogc3RyaW5nIHtcbiAgaWYgKCFpc1N0cmluZyhyZWdpb24pKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCByZWdpb246ICR7cmVnaW9ufWApXG4gIH1cblxuICBjb25zdCBlbmRwb2ludCA9IChhd3NTM0VuZHBvaW50IGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pW3JlZ2lvbl1cbiAgaWYgKGVuZHBvaW50KSB7XG4gICAgcmV0dXJuIGVuZHBvaW50XG4gIH1cbiAgcmV0dXJuICdzMy5hbWF6b25hd3MuY29tJ1xufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsU0FBU0EsUUFBUSxRQUFRLGNBQWE7O0FBRXRDO0FBQ0EsTUFBTUMsYUFBYSxHQUFHO0VBQ3BCLFlBQVksRUFBRSw2QkFBNkI7RUFDM0MsV0FBVyxFQUFFLDRCQUE0QjtFQUN6QyxZQUFZLEVBQUUsNkJBQTZCO0VBQzNDLFlBQVksRUFBRSw2QkFBNkI7RUFDM0MsZ0JBQWdCLEVBQUUsaUNBQWlDO0VBQ25ELGdCQUFnQixFQUFFLGlDQUFpQztFQUNuRCxnQkFBZ0IsRUFBRSxpQ0FBaUM7RUFDbkQsZ0JBQWdCLEVBQUUsaUNBQWlDO0VBQ25ELGdCQUFnQixFQUFFLGlDQUFpQztFQUNuRCxnQkFBZ0IsRUFBRSxpQ0FBaUM7RUFDbkQsZ0JBQWdCLEVBQUUsaUNBQWlDO0VBQ25ELGdCQUFnQixFQUFFLGlDQUFpQztFQUNuRCxjQUFjLEVBQUUsK0JBQStCO0VBQy9DLFdBQVcsRUFBRSw0QkFBNEI7RUFDekMsWUFBWSxFQUFFLGdDQUFnQztFQUM5QyxjQUFjLEVBQUUsK0JBQStCO0VBQy9DLGNBQWMsRUFBRSwrQkFBK0I7RUFDL0MsWUFBWSxFQUFFLDZCQUE2QjtFQUMzQyxZQUFZLEVBQUUsNkJBQTZCO0VBQzNDLFlBQVksRUFBRSw2QkFBNkI7RUFDM0MsV0FBVyxFQUFFLDRCQUE0QjtFQUN6QyxXQUFXLEVBQUUsNEJBQTRCO0VBQ3pDLFdBQVcsRUFBRSw0QkFBNEI7RUFDekMsY0FBYyxFQUFFLCtCQUErQjtFQUMvQyxjQUFjLEVBQUUsK0JBQStCO0VBQy9DLFlBQVksRUFBRSw2QkFBNkI7RUFDM0MsV0FBVyxFQUFFLDRCQUE0QjtFQUN6QyxXQUFXLEVBQUUsNEJBQTRCO0VBQ3pDLFdBQVcsRUFBRSw0QkFBNEI7RUFDekMsV0FBVyxFQUFFLDRCQUE0QjtFQUN6QyxXQUFXLEVBQUUsNEJBQTRCO0VBQ3pDLGVBQWUsRUFBRSxnQ0FBZ0M7RUFDakQsZUFBZSxFQUFFO0VBQ2pCO0FBQ0YsQ0FBQzs7QUFJRDtBQUNBLE9BQU8sU0FBU0MsYUFBYUEsQ0FBQ0MsTUFBYyxFQUFVO0VBQ3BELElBQUksQ0FBQ0gsUUFBUSxDQUFDRyxNQUFNLENBQUMsRUFBRTtJQUNyQixNQUFNLElBQUlDLFNBQVMsQ0FBRSxtQkFBa0JELE1BQU8sRUFBQyxDQUFDO0VBQ2xEO0VBRUEsTUFBTUUsUUFBUSxHQUFJSixhQUFhLENBQTRCRSxNQUFNLENBQUM7RUFDbEUsSUFBSUUsUUFBUSxFQUFFO0lBQ1osT0FBT0EsUUFBUTtFQUNqQjtFQUNBLE9BQU8sa0JBQWtCO0FBQzNCIn0=
|