@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,218 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import * as querystring from 'query-string';
|
|
4
|
+
import * as errors from "./errors.mjs";
|
|
5
|
+
import { getEncryptionHeaders, isEmpty, isEmptyObject, isNumber, isObject, isString, isValidBucketName, isValidObjectName } from "./internal/helper.mjs";
|
|
6
|
+
import { RETENTION_MODES } from "./internal/type.mjs";
|
|
7
|
+
export { ENCRYPTION_TYPES, LEGAL_HOLD_STATUS, RETENTION_MODES, RETENTION_VALIDITY_UNITS } from "./internal/type.mjs";
|
|
8
|
+
export const DEFAULT_REGION = 'us-east-1';
|
|
9
|
+
export const PRESIGN_EXPIRY_DAYS_MAX = 24 * 60 * 60 * 7; // 7 days in seconds
|
|
10
|
+
|
|
11
|
+
export class CopySourceOptions {
|
|
12
|
+
constructor({
|
|
13
|
+
Bucket,
|
|
14
|
+
Object,
|
|
15
|
+
VersionID = '',
|
|
16
|
+
MatchETag = '',
|
|
17
|
+
NoMatchETag = '',
|
|
18
|
+
MatchModifiedSince = null,
|
|
19
|
+
MatchUnmodifiedSince = null,
|
|
20
|
+
MatchRange = false,
|
|
21
|
+
Start = 0,
|
|
22
|
+
End = 0,
|
|
23
|
+
Encryption = undefined
|
|
24
|
+
}) {
|
|
25
|
+
this.Bucket = Bucket;
|
|
26
|
+
this.Object = Object;
|
|
27
|
+
this.VersionID = VersionID;
|
|
28
|
+
this.MatchETag = MatchETag;
|
|
29
|
+
this.NoMatchETag = NoMatchETag;
|
|
30
|
+
this.MatchModifiedSince = MatchModifiedSince;
|
|
31
|
+
this.MatchUnmodifiedSince = MatchUnmodifiedSince;
|
|
32
|
+
this.MatchRange = MatchRange;
|
|
33
|
+
this.Start = Start;
|
|
34
|
+
this.End = End;
|
|
35
|
+
this.Encryption = Encryption;
|
|
36
|
+
}
|
|
37
|
+
validate() {
|
|
38
|
+
if (!isValidBucketName(this.Bucket)) {
|
|
39
|
+
throw new errors.InvalidBucketNameError('Invalid Source bucket name: ' + this.Bucket);
|
|
40
|
+
}
|
|
41
|
+
if (!isValidObjectName(this.Object)) {
|
|
42
|
+
throw new errors.InvalidObjectNameError(`Invalid Source object name: ${this.Object}`);
|
|
43
|
+
}
|
|
44
|
+
if (this.MatchRange && this.Start !== -1 && this.End !== -1 && this.Start > this.End || this.Start < 0) {
|
|
45
|
+
throw new errors.InvalidObjectNameError('Source start must be non-negative, and start must be at most end.');
|
|
46
|
+
} else if (this.MatchRange && !isNumber(this.Start) || !isNumber(this.End)) {
|
|
47
|
+
throw new errors.InvalidObjectNameError('MatchRange is specified. But Invalid Start and End values are specified.');
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
getHeaders() {
|
|
52
|
+
const headerOptions = {};
|
|
53
|
+
headerOptions['x-amz-copy-source'] = encodeURI(this.Bucket + '/' + this.Object);
|
|
54
|
+
if (!isEmpty(this.VersionID)) {
|
|
55
|
+
headerOptions['x-amz-copy-source'] = `${encodeURI(this.Bucket + '/' + this.Object)}?versionId=${this.VersionID}`;
|
|
56
|
+
}
|
|
57
|
+
if (!isEmpty(this.MatchETag)) {
|
|
58
|
+
headerOptions['x-amz-copy-source-if-match'] = this.MatchETag;
|
|
59
|
+
}
|
|
60
|
+
if (!isEmpty(this.NoMatchETag)) {
|
|
61
|
+
headerOptions['x-amz-copy-source-if-none-match'] = this.NoMatchETag;
|
|
62
|
+
}
|
|
63
|
+
if (!isEmpty(this.MatchModifiedSince)) {
|
|
64
|
+
headerOptions['x-amz-copy-source-if-modified-since'] = this.MatchModifiedSince;
|
|
65
|
+
}
|
|
66
|
+
if (!isEmpty(this.MatchUnmodifiedSince)) {
|
|
67
|
+
headerOptions['x-amz-copy-source-if-unmodified-since'] = this.MatchUnmodifiedSince;
|
|
68
|
+
}
|
|
69
|
+
return headerOptions;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @deprecated use nodejs fs module
|
|
75
|
+
*/
|
|
76
|
+
export function removeDirAndFiles(dirPath, removeSelf = true) {
|
|
77
|
+
if (removeSelf) {
|
|
78
|
+
return fs.rmSync(dirPath, {
|
|
79
|
+
recursive: true,
|
|
80
|
+
force: true
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
fs.readdirSync(dirPath).forEach(item => {
|
|
84
|
+
fs.rmSync(path.join(dirPath, item), {
|
|
85
|
+
recursive: true,
|
|
86
|
+
force: true
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
export class CopyDestinationOptions {
|
|
91
|
+
constructor({
|
|
92
|
+
Bucket,
|
|
93
|
+
Object,
|
|
94
|
+
Encryption,
|
|
95
|
+
UserMetadata,
|
|
96
|
+
UserTags,
|
|
97
|
+
LegalHold,
|
|
98
|
+
RetainUntilDate,
|
|
99
|
+
Mode,
|
|
100
|
+
MetadataDirective,
|
|
101
|
+
Headers
|
|
102
|
+
}) {
|
|
103
|
+
this.Bucket = Bucket;
|
|
104
|
+
this.Object = Object;
|
|
105
|
+
this.Encryption = Encryption ?? undefined; // null input will become undefined, easy for runtime assert
|
|
106
|
+
this.UserMetadata = UserMetadata;
|
|
107
|
+
this.UserTags = UserTags;
|
|
108
|
+
this.LegalHold = LegalHold;
|
|
109
|
+
this.Mode = Mode; // retention mode
|
|
110
|
+
this.RetainUntilDate = RetainUntilDate;
|
|
111
|
+
this.MetadataDirective = MetadataDirective;
|
|
112
|
+
this.Headers = Headers;
|
|
113
|
+
}
|
|
114
|
+
getHeaders() {
|
|
115
|
+
const replaceDirective = 'REPLACE';
|
|
116
|
+
const headerOptions = {};
|
|
117
|
+
const userTags = this.UserTags;
|
|
118
|
+
if (!isEmpty(userTags)) {
|
|
119
|
+
headerOptions['X-Amz-Tagging-Directive'] = replaceDirective;
|
|
120
|
+
headerOptions['X-Amz-Tagging'] = isObject(userTags) ? querystring.stringify(userTags) : isString(userTags) ? userTags : '';
|
|
121
|
+
}
|
|
122
|
+
if (this.Mode) {
|
|
123
|
+
headerOptions['X-Amz-Object-Lock-Mode'] = this.Mode; // GOVERNANCE or COMPLIANCE
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (this.RetainUntilDate) {
|
|
127
|
+
headerOptions['X-Amz-Object-Lock-Retain-Until-Date'] = this.RetainUntilDate; // needs to be UTC.
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (this.LegalHold) {
|
|
131
|
+
headerOptions['X-Amz-Object-Lock-Legal-Hold'] = this.LegalHold; // ON or OFF
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (this.UserMetadata) {
|
|
135
|
+
for (const [key, value] of Object.entries(this.UserMetadata)) {
|
|
136
|
+
headerOptions[`X-Amz-Meta-${key}`] = value.toString();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (this.MetadataDirective) {
|
|
140
|
+
headerOptions[`X-Amz-Metadata-Directive`] = this.MetadataDirective;
|
|
141
|
+
}
|
|
142
|
+
if (this.Encryption) {
|
|
143
|
+
const encryptionHeaders = getEncryptionHeaders(this.Encryption);
|
|
144
|
+
for (const [key, value] of Object.entries(encryptionHeaders)) {
|
|
145
|
+
headerOptions[key] = value;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (this.Headers) {
|
|
149
|
+
for (const [key, value] of Object.entries(this.Headers)) {
|
|
150
|
+
headerOptions[key] = value;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return headerOptions;
|
|
154
|
+
}
|
|
155
|
+
validate() {
|
|
156
|
+
if (!isValidBucketName(this.Bucket)) {
|
|
157
|
+
throw new errors.InvalidBucketNameError('Invalid Destination bucket name: ' + this.Bucket);
|
|
158
|
+
}
|
|
159
|
+
if (!isValidObjectName(this.Object)) {
|
|
160
|
+
throw new errors.InvalidObjectNameError(`Invalid Destination object name: ${this.Object}`);
|
|
161
|
+
}
|
|
162
|
+
if (!isEmpty(this.UserMetadata) && !isObject(this.UserMetadata)) {
|
|
163
|
+
throw new errors.InvalidObjectNameError(`Destination UserMetadata should be an object with key value pairs`);
|
|
164
|
+
}
|
|
165
|
+
if (!isEmpty(this.Mode) && ![RETENTION_MODES.GOVERNANCE, RETENTION_MODES.COMPLIANCE].includes(this.Mode)) {
|
|
166
|
+
throw new errors.InvalidObjectNameError(`Invalid Mode specified for destination object it should be one of [GOVERNANCE,COMPLIANCE]`);
|
|
167
|
+
}
|
|
168
|
+
if (this.Encryption !== undefined && isEmptyObject(this.Encryption)) {
|
|
169
|
+
throw new errors.InvalidObjectNameError(`Invalid Encryption configuration for destination object `);
|
|
170
|
+
}
|
|
171
|
+
return true;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* maybe this should be a generic type for Records, leave it for later refactor
|
|
177
|
+
*/
|
|
178
|
+
export class SelectResults {
|
|
179
|
+
constructor({
|
|
180
|
+
records,
|
|
181
|
+
// parsed data as stream
|
|
182
|
+
response,
|
|
183
|
+
// original response stream
|
|
184
|
+
stats,
|
|
185
|
+
// stats as xml
|
|
186
|
+
progress // stats as xml
|
|
187
|
+
}) {
|
|
188
|
+
this.records = records;
|
|
189
|
+
this.response = response;
|
|
190
|
+
this.stats = stats;
|
|
191
|
+
this.progress = progress;
|
|
192
|
+
}
|
|
193
|
+
setStats(stats) {
|
|
194
|
+
this.stats = stats;
|
|
195
|
+
}
|
|
196
|
+
getStats() {
|
|
197
|
+
return this.stats;
|
|
198
|
+
}
|
|
199
|
+
setProgress(progress) {
|
|
200
|
+
this.progress = progress;
|
|
201
|
+
}
|
|
202
|
+
getProgress() {
|
|
203
|
+
return this.progress;
|
|
204
|
+
}
|
|
205
|
+
setResponse(response) {
|
|
206
|
+
this.response = response;
|
|
207
|
+
}
|
|
208
|
+
getResponse() {
|
|
209
|
+
return this.response;
|
|
210
|
+
}
|
|
211
|
+
setRecords(records) {
|
|
212
|
+
this.records = records;
|
|
213
|
+
}
|
|
214
|
+
getRecords() {
|
|
215
|
+
return this.records;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmcyIsInBhdGgiLCJxdWVyeXN0cmluZyIsImVycm9ycyIsImdldEVuY3J5cHRpb25IZWFkZXJzIiwiaXNFbXB0eSIsImlzRW1wdHlPYmplY3QiLCJpc051bWJlciIsImlzT2JqZWN0IiwiaXNTdHJpbmciLCJpc1ZhbGlkQnVja2V0TmFtZSIsImlzVmFsaWRPYmplY3ROYW1lIiwiUkVURU5USU9OX01PREVTIiwiRU5DUllQVElPTl9UWVBFUyIsIkxFR0FMX0hPTERfU1RBVFVTIiwiUkVURU5USU9OX1ZBTElESVRZX1VOSVRTIiwiREVGQVVMVF9SRUdJT04iLCJQUkVTSUdOX0VYUElSWV9EQVlTX01BWCIsIkNvcHlTb3VyY2VPcHRpb25zIiwiY29uc3RydWN0b3IiLCJCdWNrZXQiLCJPYmplY3QiLCJWZXJzaW9uSUQiLCJNYXRjaEVUYWciLCJOb01hdGNoRVRhZyIsIk1hdGNoTW9kaWZpZWRTaW5jZSIsIk1hdGNoVW5tb2RpZmllZFNpbmNlIiwiTWF0Y2hSYW5nZSIsIlN0YXJ0IiwiRW5kIiwiRW5jcnlwdGlvbiIsInVuZGVmaW5lZCIsInZhbGlkYXRlIiwiSW52YWxpZEJ1Y2tldE5hbWVFcnJvciIsIkludmFsaWRPYmplY3ROYW1lRXJyb3IiLCJnZXRIZWFkZXJzIiwiaGVhZGVyT3B0aW9ucyIsImVuY29kZVVSSSIsInJlbW92ZURpckFuZEZpbGVzIiwiZGlyUGF0aCIsInJlbW92ZVNlbGYiLCJybVN5bmMiLCJyZWN1cnNpdmUiLCJmb3JjZSIsInJlYWRkaXJTeW5jIiwiZm9yRWFjaCIsIml0ZW0iLCJqb2luIiwiQ29weURlc3RpbmF0aW9uT3B0aW9ucyIsIlVzZXJNZXRhZGF0YSIsIlVzZXJUYWdzIiwiTGVnYWxIb2xkIiwiUmV0YWluVW50aWxEYXRlIiwiTW9kZSIsIk1ldGFkYXRhRGlyZWN0aXZlIiwiSGVhZGVycyIsInJlcGxhY2VEaXJlY3RpdmUiLCJ1c2VyVGFncyIsInN0cmluZ2lmeSIsImtleSIsInZhbHVlIiwiZW50cmllcyIsInRvU3RyaW5nIiwiZW5jcnlwdGlvbkhlYWRlcnMiLCJHT1ZFUk5BTkNFIiwiQ09NUExJQU5DRSIsImluY2x1ZGVzIiwiU2VsZWN0UmVzdWx0cyIsInJlY29yZHMiLCJyZXNwb25zZSIsInN0YXRzIiwicHJvZ3Jlc3MiLCJzZXRTdGF0cyIsImdldFN0YXRzIiwic2V0UHJvZ3Jlc3MiLCJnZXRQcm9ncmVzcyIsInNldFJlc3BvbnNlIiwiZ2V0UmVzcG9uc2UiLCJzZXRSZWNvcmRzIiwiZ2V0UmVjb3JkcyJdLCJzb3VyY2VzIjpbImhlbHBlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnbm9kZTpmcydcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAnbm9kZTpwYXRoJ1xuXG5pbXBvcnQgKiBhcyBxdWVyeXN0cmluZyBmcm9tICdxdWVyeS1zdHJpbmcnXG5cbmltcG9ydCAqIGFzIGVycm9ycyBmcm9tICcuL2Vycm9ycy50cydcbmltcG9ydCB7XG4gIGdldEVuY3J5cHRpb25IZWFkZXJzLFxuICBpc0VtcHR5LFxuICBpc0VtcHR5T2JqZWN0LFxuICBpc051bWJlcixcbiAgaXNPYmplY3QsXG4gIGlzU3RyaW5nLFxuICBpc1ZhbGlkQnVja2V0TmFtZSxcbiAgaXNWYWxpZE9iamVjdE5hbWUsXG59IGZyb20gJy4vaW50ZXJuYWwvaGVscGVyLnRzJ1xuaW1wb3J0IHR5cGUgeyBFbmNyeXB0aW9uLCBPYmplY3RNZXRhRGF0YSwgUmVxdWVzdEhlYWRlcnMgfSBmcm9tICcuL2ludGVybmFsL3R5cGUudHMnXG5pbXBvcnQgeyBSRVRFTlRJT05fTU9ERVMgfSBmcm9tICcuL2ludGVybmFsL3R5cGUudHMnXG5cbmV4cG9ydCB7IEVOQ1JZUFRJT05fVFlQRVMsIExFR0FMX0hPTERfU1RBVFVTLCBSRVRFTlRJT05fTU9ERVMsIFJFVEVOVElPTl9WQUxJRElUWV9VTklUUyB9IGZyb20gJy4vaW50ZXJuYWwvdHlwZS50cydcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfUkVHSU9OID0gJ3VzLWVhc3QtMSdcblxuZXhwb3J0IGNvbnN0IFBSRVNJR05fRVhQSVJZX0RBWVNfTUFYID0gMjQgKiA2MCAqIDYwICogNyAvLyA3IGRheXMgaW4gc2Vjb25kc1xuXG5leHBvcnQgaW50ZXJmYWNlIElDb3B5U291cmNlT3B0aW9ucyB7XG4gIEJ1Y2tldDogc3RyaW5nXG4gIE9iamVjdDogc3RyaW5nXG4gIC8qKlxuICAgKiBWYWxpZCB2ZXJzaW9uSWRcbiAgICovXG4gIFZlcnNpb25JRD86IHN0cmluZ1xuICAvKipcbiAgICogRXRhZyB0byBtYXRjaFxuICAgKi9cbiAgTWF0Y2hFVGFnPzogc3RyaW5nXG4gIC8qKlxuICAgKiBFdGFnIHRvIGV4Y2x1ZGVcbiAgICovXG4gIE5vTWF0Y2hFVGFnPzogc3RyaW5nXG4gIC8qKlxuICAgKiBNb2RpZmllZCBEYXRlIG9mIHRoZSBvYmplY3QvcGFydC4gIFVUQyBEYXRlIGluIHN0cmluZyBmb3JtYXRcbiAgICovXG4gIE1hdGNoTW9kaWZpZWRTaW5jZT86IHN0cmluZyB8IG51bGxcbiAgLyoqXG4gICAqIE1vZGlmaWVkIERhdGUgb2YgdGhlIG9iamVjdC9wYXJ0IHRvIGV4Y2x1ZGUgVVRDIERhdGUgaW4gc3RyaW5nIGZvcm1hdFxuICAgKi9cbiAgTWF0Y2hVbm1vZGlmaWVkU2luY2U/OiBzdHJpbmcgfCBudWxsXG4gIC8qKlxuICAgKiB0cnVlIG9yIGZhbHNlIE9iamVjdCByYW5nZSB0byBtYXRjaFxuICAgKi9cbiAgTWF0Y2hSYW5nZT86IGJvb2xlYW5cbiAgU3RhcnQ/OiBudW1iZXJcbiAgRW5kPzogbnVtYmVyXG4gIEVuY3J5cHRpb24/OiBFbmNyeXB0aW9uXG59XG5cbmV4cG9ydCBjbGFzcyBDb3B5U291cmNlT3B0aW9ucyB7XG4gIHB1YmxpYyByZWFkb25seSBCdWNrZXQ6IHN0cmluZ1xuICBwdWJsaWMgcmVhZG9ubHkgT2JqZWN0OiBzdHJpbmdcbiAgcHVibGljIHJlYWRvbmx5IFZlcnNpb25JRDogc3RyaW5nXG4gIHB1YmxpYyBNYXRjaEVUYWc6IHN0cmluZ1xuICBwcml2YXRlIHJlYWRvbmx5IE5vTWF0Y2hFVGFnOiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBNYXRjaE1vZGlmaWVkU2luY2U6IHN0cmluZyB8IG51bGxcbiAgcHJpdmF0ZSByZWFkb25seSBNYXRjaFVubW9kaWZpZWRTaW5jZTogc3RyaW5nIHwgbnVsbFxuICBwdWJsaWMgcmVhZG9ubHkgTWF0Y2hSYW5nZTogYm9vbGVhblxuICBwdWJsaWMgcmVhZG9ubHkgU3RhcnQ6IG51bWJlclxuICBwdWJsaWMgcmVhZG9ubHkgRW5kOiBudW1iZXJcbiAgcHJpdmF0ZSByZWFkb25seSBFbmNyeXB0aW9uPzogRW5jcnlwdGlvblxuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBCdWNrZXQsXG4gICAgT2JqZWN0LFxuICAgIFZlcnNpb25JRCA9ICcnLFxuICAgIE1hdGNoRVRhZyA9ICcnLFxuICAgIE5vTWF0Y2hFVGFnID0gJycsXG4gICAgTWF0Y2hNb2RpZmllZFNpbmNlID0gbnVsbCxcbiAgICBNYXRjaFVubW9kaWZpZWRTaW5jZSA9IG51bGwsXG4gICAgTWF0Y2hSYW5nZSA9IGZhbHNlLFxuICAgIFN0YXJ0ID0gMCxcbiAgICBFbmQgPSAwLFxuICAgIEVuY3J5cHRpb24gPSB1bmRlZmluZWQsXG4gIH06IElDb3B5U291cmNlT3B0aW9ucykge1xuICAgIHRoaXMuQnVja2V0ID0gQnVja2V0XG4gICAgdGhpcy5PYmplY3QgPSBPYmplY3RcbiAgICB0aGlzLlZlcnNpb25JRCA9IFZlcnNpb25JRFxuICAgIHRoaXMuTWF0Y2hFVGFnID0gTWF0Y2hFVGFnXG4gICAgdGhpcy5Ob01hdGNoRVRhZyA9IE5vTWF0Y2hFVGFnXG4gICAgdGhpcy5NYXRjaE1vZGlmaWVkU2luY2UgPSBNYXRjaE1vZGlmaWVkU2luY2VcbiAgICB0aGlzLk1hdGNoVW5tb2RpZmllZFNpbmNlID0gTWF0Y2hVbm1vZGlmaWVkU2luY2VcbiAgICB0aGlzLk1hdGNoUmFuZ2UgPSBNYXRjaFJhbmdlXG4gICAgdGhpcy5TdGFydCA9IFN0YXJ0XG4gICAgdGhpcy5FbmQgPSBFbmRcbiAgICB0aGlzLkVuY3J5cHRpb24gPSBFbmNyeXB0aW9uXG4gIH1cblxuICB2YWxpZGF0ZSgpIHtcbiAgICBpZiAoIWlzVmFsaWRCdWNrZXROYW1lKHRoaXMuQnVja2V0KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkQnVja2V0TmFtZUVycm9yKCdJbnZhbGlkIFNvdXJjZSBidWNrZXQgbmFtZTogJyArIHRoaXMuQnVja2V0KVxuICAgIH1cbiAgICBpZiAoIWlzVmFsaWRPYmplY3ROYW1lKHRoaXMuT2JqZWN0KSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIFNvdXJjZSBvYmplY3QgbmFtZTogJHt0aGlzLk9iamVjdH1gKVxuICAgIH1cbiAgICBpZiAoKHRoaXMuTWF0Y2hSYW5nZSAmJiB0aGlzLlN0YXJ0ICE9PSAtMSAmJiB0aGlzLkVuZCAhPT0gLTEgJiYgdGhpcy5TdGFydCA+IHRoaXMuRW5kKSB8fCB0aGlzLlN0YXJ0IDwgMCkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKCdTb3VyY2Ugc3RhcnQgbXVzdCBiZSBub24tbmVnYXRpdmUsIGFuZCBzdGFydCBtdXN0IGJlIGF0IG1vc3QgZW5kLicpXG4gICAgfSBlbHNlIGlmICgodGhpcy5NYXRjaFJhbmdlICYmICFpc051bWJlcih0aGlzLlN0YXJ0KSkgfHwgIWlzTnVtYmVyKHRoaXMuRW5kKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKFxuICAgICAgICAnTWF0Y2hSYW5nZSBpcyBzcGVjaWZpZWQuIEJ1dCBJbnZhbGlkIFN0YXJ0IGFuZCBFbmQgdmFsdWVzIGFyZSBzcGVjaWZpZWQuJyxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgZ2V0SGVhZGVycygpOiBSZXF1ZXN0SGVhZGVycyB7XG4gICAgY29uc3QgaGVhZGVyT3B0aW9uczogUmVxdWVzdEhlYWRlcnMgPSB7fVxuICAgIGhlYWRlck9wdGlvbnNbJ3gtYW16LWNvcHktc291cmNlJ10gPSBlbmNvZGVVUkkodGhpcy5CdWNrZXQgKyAnLycgKyB0aGlzLk9iamVjdClcblxuICAgIGlmICghaXNFbXB0eSh0aGlzLlZlcnNpb25JRCkpIHtcbiAgICAgIGhlYWRlck9wdGlvbnNbJ3gtYW16LWNvcHktc291cmNlJ10gPSBgJHtlbmNvZGVVUkkodGhpcy5CdWNrZXQgKyAnLycgKyB0aGlzLk9iamVjdCl9P3ZlcnNpb25JZD0ke3RoaXMuVmVyc2lvbklEfWBcbiAgICB9XG5cbiAgICBpZiAoIWlzRW1wdHkodGhpcy5NYXRjaEVUYWcpKSB7XG4gICAgICBoZWFkZXJPcHRpb25zWyd4LWFtei1jb3B5LXNvdXJjZS1pZi1tYXRjaCddID0gdGhpcy5NYXRjaEVUYWdcbiAgICB9XG4gICAgaWYgKCFpc0VtcHR5KHRoaXMuTm9NYXRjaEVUYWcpKSB7XG4gICAgICBoZWFkZXJPcHRpb25zWyd4LWFtei1jb3B5LXNvdXJjZS1pZi1ub25lLW1hdGNoJ10gPSB0aGlzLk5vTWF0Y2hFVGFnXG4gICAgfVxuXG4gICAgaWYgKCFpc0VtcHR5KHRoaXMuTWF0Y2hNb2RpZmllZFNpbmNlKSkge1xuICAgICAgaGVhZGVyT3B0aW9uc1sneC1hbXotY29weS1zb3VyY2UtaWYtbW9kaWZpZWQtc2luY2UnXSA9IHRoaXMuTWF0Y2hNb2RpZmllZFNpbmNlXG4gICAgfVxuICAgIGlmICghaXNFbXB0eSh0aGlzLk1hdGNoVW5tb2RpZmllZFNpbmNlKSkge1xuICAgICAgaGVhZGVyT3B0aW9uc1sneC1hbXotY29weS1zb3VyY2UtaWYtdW5tb2RpZmllZC1zaW5jZSddID0gdGhpcy5NYXRjaFVubW9kaWZpZWRTaW5jZVxuICAgIH1cblxuICAgIHJldHVybiBoZWFkZXJPcHRpb25zXG4gIH1cbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2Ugbm9kZWpzIGZzIG1vZHVsZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlRGlyQW5kRmlsZXMoZGlyUGF0aDogc3RyaW5nLCByZW1vdmVTZWxmID0gdHJ1ZSkge1xuICBpZiAocmVtb3ZlU2VsZikge1xuICAgIHJldHVybiBmcy5ybVN5bmMoZGlyUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gIH1cblxuICBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgZnMucm1TeW5jKHBhdGguam9pbihkaXJQYXRoLCBpdGVtKSwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pXG4gIH0pXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvcHlEZXN0aW5hdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogQnVja2V0IG5hbWVcbiAgICovXG4gIEJ1Y2tldDogc3RyaW5nXG4gIC8qKlxuICAgKiBPYmplY3QgTmFtZSBmb3IgdGhlIGRlc3RpbmF0aW9uIChjb21wb3NlZC9jb3BpZWQpIG9iamVjdCBkZWZhdWx0c1xuICAgKi9cbiAgT2JqZWN0OiBzdHJpbmdcbiAgLyoqXG4gICAqIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBkZWZhdWx0cyB0byB7fVxuICAgKiBAZGVmYXVsdCB7fVxuICAgKi9cbiAgRW5jcnlwdGlvbj86IEVuY3J5cHRpb25cbiAgVXNlck1ldGFkYXRhPzogT2JqZWN0TWV0YURhdGFcbiAgLyoqXG4gICAqIHF1ZXJ5LXN0cmluZyBlbmNvZGVkIHN0cmluZyBvciBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IE9iamVjdFxuICAgKi9cbiAgVXNlclRhZ3M/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHwgc3RyaW5nXG4gIExlZ2FsSG9sZD86ICdvbicgfCAnb2ZmJ1xuICAvKipcbiAgICogVVRDIERhdGUgU3RyaW5nXG4gICAqL1xuICBSZXRhaW5VbnRpbERhdGU/OiBzdHJpbmdcbiAgTW9kZT86IFJFVEVOVElPTl9NT0RFU1xuICBNZXRhZGF0YURpcmVjdGl2ZT86ICdDT1BZJyB8ICdSRVBMQUNFJ1xuICAvKipcbiAgICogRXh0cmEgaGVhZGVycyBmb3IgdGhlIHRhcmdldCBvYmplY3RcbiAgICovXG4gIEhlYWRlcnM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+XG59XG5cbmV4cG9ydCBjbGFzcyBDb3B5RGVzdGluYXRpb25PcHRpb25zIHtcbiAgcHVibGljIHJlYWRvbmx5IEJ1Y2tldDogc3RyaW5nXG4gIHB1YmxpYyByZWFkb25seSBPYmplY3Q6IHN0cmluZ1xuICBwcml2YXRlIHJlYWRvbmx5IEVuY3J5cHRpb24/OiBFbmNyeXB0aW9uXG4gIHByaXZhdGUgcmVhZG9ubHkgVXNlck1ldGFkYXRhPzogT2JqZWN0TWV0YURhdGFcbiAgcHJpdmF0ZSByZWFkb25seSBVc2VyVGFncz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBMZWdhbEhvbGQ/OiAnb24nIHwgJ29mZidcbiAgcHJpdmF0ZSByZWFkb25seSBSZXRhaW5VbnRpbERhdGU/OiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBNb2RlPzogUkVURU5USU9OX01PREVTXG4gIHByaXZhdGUgcmVhZG9ubHkgTWV0YWRhdGFEaXJlY3RpdmU/OiBzdHJpbmdcbiAgcHJpdmF0ZSByZWFkb25seSBIZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPlxuXG4gIGNvbnN0cnVjdG9yKHtcbiAgICBCdWNrZXQsXG4gICAgT2JqZWN0LFxuICAgIEVuY3J5cHRpb24sXG4gICAgVXNlck1ldGFkYXRhLFxuICAgIFVzZXJUYWdzLFxuICAgIExlZ2FsSG9sZCxcbiAgICBSZXRhaW5VbnRpbERhdGUsXG4gICAgTW9kZSxcbiAgICBNZXRhZGF0YURpcmVjdGl2ZSxcbiAgICBIZWFkZXJzLFxuICB9OiBJQ29weURlc3RpbmF0aW9uT3B0aW9ucykge1xuICAgIHRoaXMuQnVja2V0ID0gQnVja2V0XG4gICAgdGhpcy5PYmplY3QgPSBPYmplY3RcbiAgICB0aGlzLkVuY3J5cHRpb24gPSBFbmNyeXB0aW9uID8/IHVuZGVmaW5lZCAvLyBudWxsIGlucHV0IHdpbGwgYmVjb21lIHVuZGVmaW5lZCwgZWFzeSBmb3IgcnVudGltZSBhc3NlcnRcbiAgICB0aGlzLlVzZXJNZXRhZGF0YSA9IFVzZXJNZXRhZGF0YVxuICAgIHRoaXMuVXNlclRhZ3MgPSBVc2VyVGFnc1xuICAgIHRoaXMuTGVnYWxIb2xkID0gTGVnYWxIb2xkXG4gICAgdGhpcy5Nb2RlID0gTW9kZSAvLyByZXRlbnRpb24gbW9kZVxuICAgIHRoaXMuUmV0YWluVW50aWxEYXRlID0gUmV0YWluVW50aWxEYXRlXG4gICAgdGhpcy5NZXRhZGF0YURpcmVjdGl2ZSA9IE1ldGFkYXRhRGlyZWN0aXZlXG4gICAgdGhpcy5IZWFkZXJzID0gSGVhZGVyc1xuICB9XG5cbiAgZ2V0SGVhZGVycygpOiBSZXF1ZXN0SGVhZGVycyB7XG4gICAgY29uc3QgcmVwbGFjZURpcmVjdGl2ZSA9ICdSRVBMQUNFJ1xuICAgIGNvbnN0IGhlYWRlck9wdGlvbnM6IFJlcXVlc3RIZWFkZXJzID0ge31cblxuICAgIGNvbnN0IHVzZXJUYWdzID0gdGhpcy5Vc2VyVGFnc1xuICAgIGlmICghaXNFbXB0eSh1c2VyVGFncykpIHtcbiAgICAgIGhlYWRlck9wdGlvbnNbJ1gtQW16LVRhZ2dpbmctRGlyZWN0aXZlJ10gPSByZXBsYWNlRGlyZWN0aXZlXG4gICAgICBoZWFkZXJPcHRpb25zWydYLUFtei1UYWdnaW5nJ10gPSBpc09iamVjdCh1c2VyVGFncylcbiAgICAgICAgPyBxdWVyeXN0cmluZy5zdHJpbmdpZnkodXNlclRhZ3MpXG4gICAgICAgIDogaXNTdHJpbmcodXNlclRhZ3MpXG4gICAgICAgID8gdXNlclRhZ3NcbiAgICAgICAgOiAnJ1xuICAgIH1cblxuICAgIGlmICh0aGlzLk1vZGUpIHtcbiAgICAgIGhlYWRlck9wdGlvbnNbJ1gtQW16LU9iamVjdC1Mb2NrLU1vZGUnXSA9IHRoaXMuTW9kZSAvLyBHT1ZFUk5BTkNFIG9yIENPTVBMSUFOQ0VcbiAgICB9XG5cbiAgICBpZiAodGhpcy5SZXRhaW5VbnRpbERhdGUpIHtcbiAgICAgIGhlYWRlck9wdGlvbnNbJ1gtQW16LU9iamVjdC1Mb2NrLVJldGFpbi1VbnRpbC1EYXRlJ10gPSB0aGlzLlJldGFpblVudGlsRGF0ZSAvLyBuZWVkcyB0byBiZSBVVEMuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuTGVnYWxIb2xkKSB7XG4gICAgICBoZWFkZXJPcHRpb25zWydYLUFtei1PYmplY3QtTG9jay1MZWdhbC1Ib2xkJ10gPSB0aGlzLkxlZ2FsSG9sZCAvLyBPTiBvciBPRkZcbiAgICB9XG5cbiAgICBpZiAodGhpcy5Vc2VyTWV0YWRhdGEpIHtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuVXNlck1ldGFkYXRhKSkge1xuICAgICAgICBoZWFkZXJPcHRpb25zW2BYLUFtei1NZXRhLSR7a2V5fWBdID0gdmFsdWUudG9TdHJpbmcoKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLk1ldGFkYXRhRGlyZWN0aXZlKSB7XG4gICAgICBoZWFkZXJPcHRpb25zW2BYLUFtei1NZXRhZGF0YS1EaXJlY3RpdmVgXSA9IHRoaXMuTWV0YWRhdGFEaXJlY3RpdmVcbiAgICB9XG5cbiAgICBpZiAodGhpcy5FbmNyeXB0aW9uKSB7XG4gICAgICBjb25zdCBlbmNyeXB0aW9uSGVhZGVycyA9IGdldEVuY3J5cHRpb25IZWFkZXJzKHRoaXMuRW5jcnlwdGlvbilcbiAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGVuY3J5cHRpb25IZWFkZXJzKSkge1xuICAgICAgICBoZWFkZXJPcHRpb25zW2tleV0gPSB2YWx1ZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5IZWFkZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLkhlYWRlcnMpKSB7XG4gICAgICAgIGhlYWRlck9wdGlvbnNba2V5XSA9IHZhbHVlXG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGhlYWRlck9wdGlvbnNcbiAgfVxuXG4gIHZhbGlkYXRlKCkge1xuICAgIGlmICghaXNWYWxpZEJ1Y2tldE5hbWUodGhpcy5CdWNrZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRCdWNrZXROYW1lRXJyb3IoJ0ludmFsaWQgRGVzdGluYXRpb24gYnVja2V0IG5hbWU6ICcgKyB0aGlzLkJ1Y2tldClcbiAgICB9XG4gICAgaWYgKCFpc1ZhbGlkT2JqZWN0TmFtZSh0aGlzLk9iamVjdCkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgSW52YWxpZCBEZXN0aW5hdGlvbiBvYmplY3QgbmFtZTogJHt0aGlzLk9iamVjdH1gKVxuICAgIH1cbiAgICBpZiAoIWlzRW1wdHkodGhpcy5Vc2VyTWV0YWRhdGEpICYmICFpc09iamVjdCh0aGlzLlVzZXJNZXRhZGF0YSkpIHtcbiAgICAgIHRocm93IG5ldyBlcnJvcnMuSW52YWxpZE9iamVjdE5hbWVFcnJvcihgRGVzdGluYXRpb24gVXNlck1ldGFkYXRhIHNob3VsZCBiZSBhbiBvYmplY3Qgd2l0aCBrZXkgdmFsdWUgcGFpcnNgKVxuICAgIH1cblxuICAgIGlmICghaXNFbXB0eSh0aGlzLk1vZGUpICYmICFbUkVURU5USU9OX01PREVTLkdPVkVSTkFOQ0UsIFJFVEVOVElPTl9NT0RFUy5DT01QTElBTkNFXS5pbmNsdWRlcyh0aGlzLk1vZGUpKSB7XG4gICAgICB0aHJvdyBuZXcgZXJyb3JzLkludmFsaWRPYmplY3ROYW1lRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIE1vZGUgc3BlY2lmaWVkIGZvciBkZXN0aW5hdGlvbiBvYmplY3QgaXQgc2hvdWxkIGJlIG9uZSBvZiBbR09WRVJOQU5DRSxDT01QTElBTkNFXWAsXG4gICAgICApXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuRW5jcnlwdGlvbiAhPT0gdW5kZWZpbmVkICYmIGlzRW1wdHlPYmplY3QodGhpcy5FbmNyeXB0aW9uKSkge1xuICAgICAgdGhyb3cgbmV3IGVycm9ycy5JbnZhbGlkT2JqZWN0TmFtZUVycm9yKGBJbnZhbGlkIEVuY3J5cHRpb24gY29uZmlndXJhdGlvbiBmb3IgZGVzdGluYXRpb24gb2JqZWN0IGApXG4gICAgfVxuICAgIHJldHVybiB0cnVlXG4gIH1cbn1cblxuLyoqXG4gKiBtYXliZSB0aGlzIHNob3VsZCBiZSBhIGdlbmVyaWMgdHlwZSBmb3IgUmVjb3JkcywgbGVhdmUgaXQgZm9yIGxhdGVyIHJlZmFjdG9yXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWxlY3RSZXN1bHRzIHtcbiAgcHJpdmF0ZSByZWNvcmRzPzogdW5rbm93blxuICBwcml2YXRlIHJlc3BvbnNlPzogdW5rbm93blxuICBwcml2YXRlIHN0YXRzPzogc3RyaW5nXG4gIHByaXZhdGUgcHJvZ3Jlc3M/OiB1bmtub3duXG5cbiAgY29uc3RydWN0b3Ioe1xuICAgIHJlY29yZHMsIC8vIHBhcnNlZCBkYXRhIGFzIHN0cmVhbVxuICAgIHJlc3BvbnNlLCAvLyBvcmlnaW5hbCByZXNwb25zZSBzdHJlYW1cbiAgICBzdGF0cywgLy8gc3RhdHMgYXMgeG1sXG4gICAgcHJvZ3Jlc3MsIC8vIHN0YXRzIGFzIHhtbFxuICB9OiB7XG4gICAgcmVjb3Jkcz86IHVua25vd25cbiAgICByZXNwb25zZT86IHVua25vd25cbiAgICBzdGF0cz86IHN0cmluZ1xuICAgIHByb2dyZXNzPzogdW5rbm93blxuICB9KSB7XG4gICAgdGhpcy5yZWNvcmRzID0gcmVjb3Jkc1xuICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZVxuICAgIHRoaXMuc3RhdHMgPSBzdGF0c1xuICAgIHRoaXMucHJvZ3Jlc3MgPSBwcm9ncmVzc1xuICB9XG5cbiAgc2V0U3RhdHMoc3RhdHM6IHN0cmluZykge1xuICAgIHRoaXMuc3RhdHMgPSBzdGF0c1xuICB9XG5cbiAgZ2V0U3RhdHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdHNcbiAgfVxuXG4gIHNldFByb2dyZXNzKHByb2dyZXNzOiB1bmtub3duKSB7XG4gICAgdGhpcy5wcm9ncmVzcyA9IHByb2dyZXNzXG4gIH1cblxuICBnZXRQcm9ncmVzcygpIHtcbiAgICByZXR1cm4gdGhpcy5wcm9ncmVzc1xuICB9XG5cbiAgc2V0UmVzcG9uc2UocmVzcG9uc2U6IHVua25vd24pIHtcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2VcbiAgfVxuXG4gIGdldFJlc3BvbnNlKCkge1xuICAgIHJldHVybiB0aGlzLnJlc3BvbnNlXG4gIH1cblxuICBzZXRSZWNvcmRzKHJlY29yZHM6IHVua25vd24pIHtcbiAgICB0aGlzLnJlY29yZHMgPSByZWNvcmRzXG4gIH1cblxuICBnZXRSZWNvcmRzKCk6IHVua25vd24ge1xuICAgIHJldHVybiB0aGlzLnJlY29yZHNcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUtBLEVBQUU7QUFDZCxPQUFPLEtBQUtDLElBQUk7QUFFaEIsT0FBTyxLQUFLQyxXQUFXLE1BQU0sY0FBYztBQUUzQyxPQUFPLEtBQUtDLE1BQU0sTUFBTSxjQUFhO0FBQ3JDLFNBQ0VDLG9CQUFvQixFQUNwQkMsT0FBTyxFQUNQQyxhQUFhLEVBQ2JDLFFBQVEsRUFDUkMsUUFBUSxFQUNSQyxRQUFRLEVBQ1JDLGlCQUFpQixFQUNqQkMsaUJBQWlCLFFBQ1osdUJBQXNCO0FBRTdCLFNBQVNDLGVBQWUsUUFBUSxxQkFBb0I7QUFFcEQsU0FBU0MsZ0JBQWdCLEVBQUVDLGlCQUFpQixFQUFFRixlQUFlLEVBQUVHLHdCQUF3QixRQUFRLHFCQUFvQjtBQUVuSCxPQUFPLE1BQU1DLGNBQWMsR0FBRyxXQUFXO0FBRXpDLE9BQU8sTUFBTUMsdUJBQXVCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFDOztBQWtDeEQsT0FBTyxNQUFNQyxpQkFBaUIsQ0FBQztFQWE3QkMsV0FBV0EsQ0FBQztJQUNWQyxNQUFNO0lBQ05DLE1BQU07SUFDTkMsU0FBUyxHQUFHLEVBQUU7SUFDZEMs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
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
import * as fs from 'node:fs';
|
|
4
|
+
import * as stream from 'node:stream';
|
|
5
|
+
export { promises as fsp } from 'node:fs';
|
|
6
|
+
export declare const streamPromise: {
|
|
7
|
+
pipeline: typeof stream.pipeline.__promisify__;
|
|
8
|
+
};
|
|
9
|
+
export declare const fstat: typeof fs.fstat.__promisify__;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
// promise helper for stdlib
|
|
2
|
+
|
|
3
|
+
import * as fs from "fs";
|
|
4
|
+
import * as stream from "stream";
|
|
5
|
+
import { promisify } from "util";
|
|
6
|
+
|
|
7
|
+
// TODO: use "node:fs/promise" directly after we stop testing on nodejs 12
|
|
8
|
+
export { promises as fsp } from 'node:fs';
|
|
9
|
+
export const streamPromise = {
|
|
10
|
+
// node:stream/promises Added in: v15.0.0
|
|
11
|
+
pipeline: promisify(stream.pipeline)
|
|
12
|
+
};
|
|
13
|
+
export const fstat = promisify(fs.fstat);
|
|
14
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJmcyIsInN0cmVhbSIsInByb21pc2lmeSIsInByb21pc2VzIiwiZnNwIiwic3RyZWFtUHJvbWlzZSIsInBpcGVsaW5lIiwiZnN0YXQiXSwic291cmNlcyI6WyJhc3luYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBwcm9taXNlIGhlbHBlciBmb3Igc3RkbGliXG5cbmltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnXG5pbXBvcnQgKiBhcyBzdHJlYW0gZnJvbSAnbm9kZTpzdHJlYW0nXG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICdub2RlOnV0aWwnXG5cbi8vIFRPRE86IHVzZSBcIm5vZGU6ZnMvcHJvbWlzZVwiIGRpcmVjdGx5IGFmdGVyIHdlIHN0b3AgdGVzdGluZyBvbiBub2RlanMgMTJcbmV4cG9ydCB7IHByb21pc2VzIGFzIGZzcCB9IGZyb20gJ25vZGU6ZnMnXG5leHBvcnQgY29uc3Qgc3RyZWFtUHJvbWlzZSA9IHtcbiAgLy8gbm9kZTpzdHJlYW0vcHJvbWlzZXMgQWRkZWQgaW46IHYxNS4wLjBcbiAgcGlwZWxpbmU6IHByb21pc2lmeShzdHJlYW0ucGlwZWxpbmUpLFxufVxuXG5leHBvcnQgY29uc3QgZnN0YXQgPSBwcm9taXNpZnkoZnMuZnN0YXQpXG4iXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBLE9BQU8sS0FBS0EsRUFBRTtBQUNkLE9BQU8sS0FBS0MsTUFBTTtBQUNsQixTQUFTQyxTQUFTOztBQUVsQjtBQUNBLFNBQVNDLFFBQVEsSUFBSUMsR0FBRyxRQUFRLFNBQVM7QUFDekMsT0FBTyxNQUFNQyxhQUFhLEdBQUc7RUFDM0I7RUFDQUMsUUFBUSxFQUFFSixTQUFTLENBQUNELE1BQU0sQ0FBQ0ssUUFBUTtBQUNyQyxDQUFDO0FBRUQsT0FBTyxNQUFNQyxLQUFLLEdBQUdMLFNBQVMsQ0FBQ0YsRUFBRSxDQUFDTyxLQUFLLENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function callbackify(fn: (...args: any[]) => any): (this: any, ...args: any[]) => any;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
|
|
3
|
+
// Wrapper for an async function that supports callback style API.
|
|
4
|
+
// It will preserve 'this'.
|
|
5
|
+
export function callbackify(fn) {
|
|
6
|
+
return function (...args) {
|
|
7
|
+
const lastArg = args[args.length - 1];
|
|
8
|
+
if (typeof lastArg === 'function') {
|
|
9
|
+
const callback = args.pop();
|
|
10
|
+
return fn.apply(this, args).then(result => callback(null, result), err => callback(err));
|
|
11
|
+
}
|
|
12
|
+
return fn.apply(this, args);
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjYWxsYmFja2lmeSIsImZuIiwiYXJncyIsImxhc3RBcmciLCJsZW5ndGgiLCJjYWxsYmFjayIsInBvcCIsImFwcGx5IiwidGhlbiIsInJlc3VsdCIsImVyciJdLCJzb3VyY2VzIjpbImNhbGxiYWNraWZ5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnkgKi9cblxuLy8gV3JhcHBlciBmb3IgYW4gYXN5bmMgZnVuY3Rpb24gdGhhdCBzdXBwb3J0cyBjYWxsYmFjayBzdHlsZSBBUEkuXG4vLyBJdCB3aWxsIHByZXNlcnZlICd0aGlzJy5cbmV4cG9ydCBmdW5jdGlvbiBjYWxsYmFja2lmeShmbjogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgY29uc3QgbGFzdEFyZyA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXVxuXG4gICAgaWYgKHR5cGVvZiBsYXN0QXJnID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBjYWxsYmFjayA9IGFyZ3MucG9wKClcbiAgICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmdzKS50aGVuKFxuICAgICAgICAocmVzdWx0OiBhbnkpID0+IGNhbGxiYWNrKG51bGwsIHJlc3VsdCksXG4gICAgICAgIChlcnI6IGFueSkgPT4gY2FsbGJhY2soZXJyKSxcbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJncylcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQTtBQUNBO0FBQ0EsT0FBTyxTQUFTQSxXQUFXQSxDQUFDQyxFQUEyQixFQUFFO0VBQ3ZELE9BQU8sVUFBcUIsR0FBR0MsSUFBVyxFQUFFO0lBQzFDLE1BQU1DLE9BQU8sR0FBR0QsSUFBSSxDQUFDQSxJQUFJLENBQUNFLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFFckMsSUFBSSxPQUFPRCxPQUFPLEtBQUssVUFBVSxFQUFFO01BQ2pDLE1BQU1FLFFBQVEsR0FBR0gsSUFBSSxDQUFDSSxHQUFHLENBQUMsQ0FBQztNQUMzQixPQUFPTCxFQUFFLENBQUNNLEtBQUssQ0FBQyxJQUFJLEVBQUVMLElBQUksQ0FBQyxDQUFDTSxJQUFJLENBQzdCQyxNQUFXLElBQUtKLFFBQVEsQ0FBQyxJQUFJLEVBQUVJLE1BQU0sQ0FBQyxFQUN0Q0MsR0FBUSxJQUFLTCxRQUFRLENBQUNLLEdBQUcsQ0FDNUIsQ0FBQztJQUNIO0lBRUEsT0FBT1QsRUFBRSxDQUFDTSxLQUFLLENBQUMsSUFBSSxFQUFFTCxJQUFJLENBQUM7RUFDN0IsQ0FBQztBQUNIIn0=
|