cdk-nextjs 0.7.4 → 0.7.6
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/.jsii +37 -37
- package/docs/adapter-runtime.md +1 -1
- package/docs/harness-coverage.md +9 -8
- package/lib/adapter/adapter.mjs +220 -149
- package/lib/adapter/aws-cache-store.d.ts +28 -4
- package/lib/adapter/aws-cache-store.js +52 -21
- package/lib/adapter/aws-cache-store.test.js +36 -1
- package/lib/adapter/build-outputs.js +23 -1
- package/lib/adapter/build-outputs.test.js +18 -1
- package/lib/adapter/cache-handler.d.ts +4 -3
- package/lib/adapter/cache-handler.js +1 -1
- package/lib/adapter/cache-handler.mjs +131 -61
- package/lib/adapter/cache-handler.test.js +31 -1
- package/lib/adapter/cache-utils.d.ts +68 -2
- package/lib/adapter/cache-utils.js +108 -2
- package/lib/adapter/cache-utils.test.js +45 -1
- package/lib/adapter/init-cache.d.ts +1 -1
- package/lib/adapter/init-cache.js +60 -37
- package/lib/adapter/init-cache.test.js +55 -2
- package/lib/adapter/local-file-cache-handler.d.ts +2 -2
- package/lib/adapter/local-file-cache-handler.js +4 -5
- package/lib/adapter/s3-cache-handler.d.ts +23 -7
- package/lib/adapter/s3-cache-handler.js +63 -27
- package/lib/adapter/s3-cache-handler.test.js +168 -1
- package/lib/adapter/use-cache-default-handler.mjs +32 -9
- package/lib/adapter/use-cache-remote-handler.js +2 -3
- package/lib/adapter/use-cache-remote-handler.mjs +81 -61
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.d.ts +0 -7
- package/lib/nextjs-build/nextjs-build.js +4 -11
- package/lib/nextjs-build/nextjs-build.test.js +4 -3
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.js +1 -1
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.js +1 -1
- package/lib/root-constructs/nextjs-global-functions.js +1 -1
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +1 -1
- package/lib/runtime/image.d.ts +19 -0
- package/lib/runtime/image.js +28 -2
- package/lib/runtime/image.test.js +43 -1
- package/lib/runtime/lambda.mjs +14 -3
- package/lib/runtime/server.mjs +14 -3
- package/lib/utils/deployment-build-id.d.ts +11 -0
- package/lib/utils/deployment-build-id.js +15 -0
- package/package.json +3 -3
- package/scripts/e2e-harness/README.md +1 -1
|
@@ -26825,7 +26825,7 @@ var require_dist_cjs13 = __commonJS({
|
|
|
26825
26825
|
var { setCredentialFeature: setCredentialFeature2 } = (init_client3(), __toCommonJS(client_exports2));
|
|
26826
26826
|
var { CredentialsProviderError: CredentialsProviderError2, parseKnownFiles: parseKnownFiles2, getProfileName: getProfileName2 } = (init_config2(), __toCommonJS(config_exports));
|
|
26827
26827
|
var { HttpRequest: HttpRequest2 } = (init_protocols(), __toCommonJS(protocols_exports));
|
|
26828
|
-
var { createHash:
|
|
26828
|
+
var { createHash: createHash6, createPrivateKey, createPublicKey, sign: sign2 } = __require("node:crypto");
|
|
26829
26829
|
var { promises } = __require("node:fs");
|
|
26830
26830
|
var { homedir: homedir2 } = __require("node:os");
|
|
26831
26831
|
var { dirname, join: join5 } = __require("node:path");
|
|
@@ -26994,7 +26994,7 @@ var require_dist_cjs13 = __commonJS({
|
|
|
26994
26994
|
getTokenFilePath() {
|
|
26995
26995
|
const directory = process.env.AWS_LOGIN_CACHE_DIRECTORY ?? join5(homedir2(), ".aws", "login", "cache");
|
|
26996
26996
|
const loginSessionBytes = Buffer.from(this.loginSession, "utf8");
|
|
26997
|
-
const loginSessionSha256 =
|
|
26997
|
+
const loginSessionSha256 = createHash6("sha256").update(loginSessionBytes).digest("hex");
|
|
26998
26998
|
return join5(directory, `${loginSessionSha256}.json`);
|
|
26999
26999
|
}
|
|
27000
27000
|
derToRawSignature(derSignature) {
|
|
@@ -34170,6 +34170,14 @@ var import_debug5 = __toESM(require_src());
|
|
|
34170
34170
|
|
|
34171
34171
|
// src/adapter/aws-cache-store.ts
|
|
34172
34172
|
var import_client_dynamodb = __toESM(require_dist_cjs19());
|
|
34173
|
+
|
|
34174
|
+
// src/adapter/cache-utils.ts
|
|
34175
|
+
import { createHash as createHash5 } from "node:crypto";
|
|
34176
|
+
function sha256Hex(value) {
|
|
34177
|
+
return createHash5("sha256").update(value).digest("hex");
|
|
34178
|
+
}
|
|
34179
|
+
|
|
34180
|
+
// src/adapter/aws-cache-store.ts
|
|
34173
34181
|
function resolveAwsCacheConfig() {
|
|
34174
34182
|
return {
|
|
34175
34183
|
bucketName: process.env.CDK_NEXTJS_CACHE_BUCKET_NAME || "",
|
|
@@ -34232,6 +34240,13 @@ function markerOf(item) {
|
|
|
34232
34240
|
}
|
|
34233
34241
|
var BATCH_GET_MAX_KEYS = 100;
|
|
34234
34242
|
var DEFAULT_TAG_REFRESH_MS = 1e3;
|
|
34243
|
+
function hashedTag(tag) {
|
|
34244
|
+
return `#${sha256Hex(tag)}`;
|
|
34245
|
+
}
|
|
34246
|
+
var MAX_TAG_BYTES = 768;
|
|
34247
|
+
function sortKeyTag(tag) {
|
|
34248
|
+
return Buffer.byteLength(tag) <= MAX_TAG_BYTES ? tag : hashedTag(tag);
|
|
34249
|
+
}
|
|
34235
34250
|
var TagMarkerTable = class {
|
|
34236
34251
|
constructor(client, tableName, buildId) {
|
|
34237
34252
|
this.client = client;
|
|
@@ -34254,7 +34269,7 @@ var TagMarkerTable = class {
|
|
|
34254
34269
|
TableName: this.tableName,
|
|
34255
34270
|
Key: {
|
|
34256
34271
|
pk: { S: this.buildId },
|
|
34257
|
-
sk: { S: tag }
|
|
34272
|
+
sk: { S: sortKeyTag(tag) }
|
|
34258
34273
|
},
|
|
34259
34274
|
...markerUpdate(now, durations),
|
|
34260
34275
|
ReturnValues: "ALL_NEW"
|
|
@@ -34274,7 +34289,13 @@ var TagMarkerTable = class {
|
|
|
34274
34289
|
const unique = Array.from(new Set(tags));
|
|
34275
34290
|
const markers = /* @__PURE__ */ new Map();
|
|
34276
34291
|
for (let i5 = 0; i5 < unique.length; i5 += BATCH_GET_MAX_KEYS) {
|
|
34277
|
-
|
|
34292
|
+
const tagBySk = new Map(
|
|
34293
|
+
unique.slice(i5, i5 + BATCH_GET_MAX_KEYS).map((tag) => [sortKeyTag(tag), tag])
|
|
34294
|
+
);
|
|
34295
|
+
let keys = Array.from(
|
|
34296
|
+
tagBySk.keys(),
|
|
34297
|
+
(sk) => ({ pk: { S: buildId }, sk: { S: sk } })
|
|
34298
|
+
);
|
|
34278
34299
|
for (let attempt = 0; keys?.length && attempt < 3; attempt++) {
|
|
34279
34300
|
const response = await this.client.send(
|
|
34280
34301
|
new import_client_dynamodb.BatchGetItemCommand({
|
|
@@ -34287,7 +34308,7 @@ var TagMarkerTable = class {
|
|
|
34287
34308
|
})
|
|
34288
34309
|
);
|
|
34289
34310
|
for (const item of response.Responses?.[tableName] ?? []) {
|
|
34290
|
-
const tag = item.sk?.S;
|
|
34311
|
+
const tag = tagBySk.get(item.sk?.S ?? "");
|
|
34291
34312
|
if (tag !== void 0) {
|
|
34292
34313
|
markers.set(tag, markerOf(item));
|
|
34293
34314
|
}
|
|
@@ -34325,11 +34346,13 @@ var RevalidationLog = class {
|
|
|
34325
34346
|
* to {@link LOG_PUT_ATTEMPTS} times.
|
|
34326
34347
|
*/
|
|
34327
34348
|
async put(tag, at, marker) {
|
|
34349
|
+
const skTag = sortKeyTag(tag);
|
|
34328
34350
|
for (let attempt = 1; ; attempt++) {
|
|
34329
34351
|
const item = {
|
|
34330
34352
|
pk: { S: this.pk },
|
|
34331
|
-
sk: { S: `${logSkPrefix(at)}#${
|
|
34332
|
-
ttl: { N: String(Math.ceil((at + REVALIDATION_LOG_TTL_MS) / 1e3)) }
|
|
34353
|
+
sk: { S: `${logSkPrefix(at)}#${skTag}` },
|
|
34354
|
+
ttl: { N: String(Math.ceil((at + REVALIDATION_LOG_TTL_MS) / 1e3)) },
|
|
34355
|
+
...skTag !== tag && { longTag: { S: tag } }
|
|
34333
34356
|
};
|
|
34334
34357
|
for (const field of MARKER_FIELDS) {
|
|
34335
34358
|
const value = marker[field];
|
|
@@ -34374,7 +34397,7 @@ var RevalidationLog = class {
|
|
|
34374
34397
|
":pk": { S: this.pk },
|
|
34375
34398
|
":since": { S: logSkPrefix(Math.max(0, since)) }
|
|
34376
34399
|
},
|
|
34377
|
-
ProjectionExpression: "sk, revalidatedAt, staleAt, expiredAt",
|
|
34400
|
+
ProjectionExpression: "sk, longTag, revalidatedAt, staleAt, expiredAt",
|
|
34378
34401
|
ExclusiveStartKey: startKey
|
|
34379
34402
|
})
|
|
34380
34403
|
);
|
|
@@ -34386,7 +34409,7 @@ var RevalidationLog = class {
|
|
|
34386
34409
|
rows.push({
|
|
34387
34410
|
sk,
|
|
34388
34411
|
at: Number(sk.slice(0, LOG_SK_DIGITS)),
|
|
34389
|
-
tag: sk.slice(LOG_SK_DIGITS + 1),
|
|
34412
|
+
tag: item.longTag?.S ?? sk.slice(LOG_SK_DIGITS + 1),
|
|
34390
34413
|
marker: markerOf(item)
|
|
34391
34414
|
});
|
|
34392
34415
|
}
|
|
@@ -16,7 +16,6 @@ exports.createRemoteUseCacheHandler = createRemoteUseCacheHandler;
|
|
|
16
16
|
`'use cache'`.
|
|
17
17
|
*/
|
|
18
18
|
/* eslint-disable import/no-extraneous-dependencies */
|
|
19
|
-
const node_crypto_1 = require("node:crypto");
|
|
20
19
|
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
21
20
|
const debug_1 = __importDefault(require("debug"));
|
|
22
21
|
const aws_cache_store_1 = require("./aws-cache-store");
|
|
@@ -60,7 +59,7 @@ function createRemoteUseCacheHandler(options = {}) {
|
|
|
60
59
|
const memory = new use_cache_common_1.EntryLru((0, use_cache_common_1.numberFromEnv)("CDK_NEXTJS_USE_CACHE_MEMORY_BYTES", use_cache_common_1.DEFAULT_MEMORY_BYTES));
|
|
61
60
|
const pending = new use_cache_common_1.PendingSets();
|
|
62
61
|
const debug = (0, debug_1.default)("cdk-nextjs:cache-handler:use-cache:remote");
|
|
63
|
-
const s3Key = (cacheKey) => (0, aws_cache_store_1.useCacheS3Key)(buildId, (0,
|
|
62
|
+
const s3Key = (cacheKey) => (0, aws_cache_store_1.useCacheS3Key)(buildId, (0, cache_utils_1.sha256Hex)(cacheKey));
|
|
64
63
|
async function readFromS3(cacheKey) {
|
|
65
64
|
if (!bucket) {
|
|
66
65
|
return undefined;
|
|
@@ -183,4 +182,4 @@ function createRemoteUseCacheHandler(options = {}) {
|
|
|
183
182
|
};
|
|
184
183
|
}
|
|
185
184
|
exports.default = (0, use_cache_common_1.lazyHandler)(() => createRemoteUseCacheHandler());
|
|
186
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNhY2hlLXJlbW90ZS1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXIvdXNlLWNhY2hlLXJlbW90ZS1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBaUdBLGtFQXlKQztBQTFQRDs7Ozs7Ozs7OztFQVVFO0FBQ0Ysc0RBQXNEO0FBQ3RELDZDQUF5QztBQUN6QyxrREFBOEM7QUFDOUMsa0RBQTZCO0FBSzdCLHVEQUsyQjtBQUMzQiwrQ0FBcUU7QUFDckUseURBYzRCO0FBcUI1QixTQUFTLGFBQWE7SUFDcEIsSUFBSSxJQUFBLCtCQUFZLEdBQUUsRUFBRSxDQUFDO1FBQ25CLHdFQUF3RTtRQUN4RSxpRUFBaUU7UUFDakUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsR0FBRyxJQUFBLHVDQUFxQixHQUFFLENBQUM7SUFDdkQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE9BQU8sQ0FBQyxJQUFJLENBQ1YsbUhBQW1ILENBQ3BILENBQUM7UUFDRixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLElBQUksNkJBQVcsQ0FBQyxJQUFJLG9CQUFRLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCwwRUFBMEU7QUFDMUUsU0FBUyxnQkFBZ0IsQ0FBQyxNQUFtQixFQUFFLEVBQVU7SUFDdkQsT0FBTyxFQUFFLEdBQUcsTUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztBQUMxRCxDQUFDO0FBRUQsNkVBQTZFO0FBQzdFLFNBQVMsWUFBWSxDQUFDLE1BQW1CLEVBQUUsRUFBVTtJQUNuRCxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFD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ciwgZm9yIGAndXNlIGNhY2hlOiByZW1vdGUnYC5cbiAgU2VlOiBodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvYXBpLXJlZmVyZW5jZS9jb25maWcvbmV4dC1jb25maWctanMvY2FjaGVIYW5kbGVyc1xuXG4gIEVudHJpZXMgYXJlIHN0b3JlZCBpbiB0aGUgY2FjaGUgYnVja2V0LCBzbyBldmVyeSBpbnN0YW5jZSByZWFkcyB3aGF0IGFueVxuICBpbnN0YW5jZSB3cm90ZSwgd2l0aCBhIGJvdW5kZWQgaW4tbWVtb3J5IHRpZXIgaW4gZnJvbnQuIFRhZ3MgZ28gdGhyb3VnaCB0aGVcbiAgcmV2YWxpZGF0aW9uIHRhYmxlJ3MgbWFya2VyIHJvd3MsIHNoYXJlZCB3aXRoIHBsYWluIGAndXNlIGNhY2hlJ2AgYW5kIHdpdGggdGhlXG4gIGluY3JlbWVudGFsIGNhY2hlLiBXaXRob3V0IHRoaXMsIE5leHQuanMgbWFwcyBgcmVtb3RlYCB0byBpdHMgaW4tbWVtb3J5XG4gIGRlZmF1bHQgaGFuZGxlciwgYW5kIGAndXNlIGNhY2hlOiByZW1vdGUnYCBpcyBubyBtb3JlIHNoYXJlZCB0aGFuXG4gIGAndXNlIGNhY2hlJ2AuXG4qL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyBjcmVhdGVIYXNoIH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgeyBTM0NsaWVudCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCBnZXREZWJ1ZyBmcm9tIFwiZGVidWdcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ2FjaGVFbnRyeSxcbiAgQ2FjaGVIYW5kbGVyLFxufSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9saWIvY2FjaGUtaGFuZGxlcnMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIENhY2hlQnVja2V0LFxuICByZXNvbHZlQXdzQ2FjaGVDb25maWcsXG4gIFRyYWNrZWRUYWdNYXJrZXJzLFxuICB1c2VDYWNoZVMzS2V5LFxufSBmcm9tIFwiLi9hd3MtY2FjaGUtc3RvcmVcIjtcbmltcG9ydCB7IHBhcnNlQ2FjaGVWYWx1ZSwgc2VyaWFsaXplQ2FjaGVWYWx1ZSB9IGZyb20gXCIuL2NhY2hlLXV0aWxzXCI7XG5pbXBvcnQge1xuICBjYWNoZUVudHJ5T2YsXG4gIERFRkFVTFRfTUVNT1JZX0JZVEVTLFxuICBFbnRyeUxydSxcbiAgaXNCdWlsZFBoYXNlLFxuICBpc0R5bmFtaWNFbnRyeSxcbiAgbGF6eUhhbmRsZXIsXG4gIG5vdyxcbiAgbnVtYmVyRnJvbUVudixcbiAgUGVuZGluZ1NldHMsXG4gIHNoYXJlZFRhZ01hbmlmZXN0LFxuICBTdG9yZWRFbnRyeSxcbiAgc3RvcmVkRW50cnlPZixcbiAgdGFnTWV0aG9kcyxcbn0gZnJvbSBcIi4vdXNlLWNhY2hlLWNvbW1vblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVVzZUNhY2hlSGFuZGxlck9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIGJ1Y2tldCBlbnRyaWVzIGFyZSBzdG9yZWQgaW4sIG9yIGBudWxsYCBmb3IgbWVtb3J5IG9ubHkuIEZyb21cbiAgICogYENES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUVgIGJ5IGRlZmF1bHQsIGFuZCBuZXZlciBhdCBidWlsZCB0aW1lLlxuICAgKi9cbiAgYnVja2V0PzogQ2FjaGVCdWNrZXQgfCBudWxsO1xuICAvKiogUHJlZml4ZXMgZXZlcnkgUzMga2V5OyBgQ0RLX05FWFRKU19CVUlMRF9JRGAgYnkgZGVmYXVsdC4gKi9cbiAgYnVpbGRJZD86IHN0cmluZztcbiAgLyoqIFRhZyBzdGF0ZTsgdGhlIHByb2Nlc3Mtd2lkZSBvbmUgZnJvbSB0aGUgZW52aXJvbm1lbnQgYnkgZGVmYXVsdC4gKi9cbiAgdGFncz86IFRyYWNrZWRUYWdNYXJrZXJzO1xufVxuXG4vKiogV2hhdCBpcyB3cml0dGVuIHRvIFMzIGZvciBvbmUgZW50cnkuICovXG5pbnRlcmZhY2UgU2VyaWFsaXplZEVudHJ5IGV4dGVuZHMgT21pdDxTdG9yZWRFbnRyeSwgXCJ2YWx1ZVwiPiB7XG4gIC8qKiBUaGUgZnVsbCBjYWNoZSBrZXksIGNoZWNrZWQgb24gcmVhZDsgdGhlIG9iamVjdCBrZXkgaXMgb25seSBpdHMgaGFzaC4gKi9cbiAga2V5OiBzdHJpbmc7XG4gIHZhbHVlOiBCdWZmZXI7XG59XG5cbmZ1bmN0aW9uIGJ1Y2tldEZyb21FbnYoKTogQ2FjaGVCdWNrZXQgfCBudWxsIHtcbiAgaWYgKGlzQnVpbGRQaGFzZSgpKSB7XG4gICAgLy8gTm8gY3JlZGVudGlhbHMsIGFuZCBub3RoaW5nIGEgYnVpbGQtdGltZSBlbnRyeSBjb3VsZCBiZSByZWFkIGJhY2sgYnk6XG4gICAgLy8gcHJlcmVuZGVycyBrZWVwIHdoYXQgdGhleSBuZWVkIGluIHRoZWlyIG93biByZXN1bWUgZGF0YSBjYWNoZS5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCB7IGJ1Y2tldE5hbWUsIHJlZ2lvbiB9ID0gcmVzb2x2ZUF3c0NhY2hlQ29uZmlnKCk7XG4gIGlmICghYnVja2V0TmFtZSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIFwiQ0RLX05FWFRKU19DQUNIRV9CVUNLRVRfTkFNRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBub3Qgc2V0LCAndXNlIGNhY2hlOiByZW1vdGUnIGVudHJpZXMgYXJlIGxvY2FsIHRvIGVhY2ggaW5zdGFuY2VcIixcbiAgICApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBuZXcgQ2FjaGVCdWNrZXQobmV3IFMzQ2xpZW50KHsgcmVnaW9uIH0pLCBidWNrZXROYW1lKTtcbn1cblxuLyoqIFdoZXRoZXIgYHN0b3JlZGAgaXMgcGFzdCBgcmV2YWxpZGF0ZWAsIHNvIGEgZnJlc2hlciBjb3B5IG1heSBleGlzdC4gKi9cbmZ1bmN0aW9uIGlzUGFzdFJldmFsaWRhdGUoc3RvcmVkOiBTdG9yZWRFbnRyeSwgYXQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gYXQgPiBzdG9yZWQudGltZXN0YW1wICsgc3RvcmVkLnJldmFsaWRhdGUgKiAxMDAwO1xufVxuXG4vKiogV2hldGhlciBgc3RvcmVkYCBpcyBwYXN0IGBleHBpcmVgLCBhbmQgbWF5IG5vIGxvbmdlciBiZSBzZXJ2ZWQgYXQgYWxsLiAqL1xuZnVuY3Rpb24gaXNQYXN0RXhwaXJlKHN0b3JlZDogU3RvcmVkRW50cnksIGF0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGF0ID4gc3RvcmVkLnRpbWVzdGFtcCArIHN0b3JlZC5leHBpcmUgKiAxMDAwO1xufVxuXG4vKipcbiAqIEEgYCd1c2UgY2FjaGU6IHJlbW90ZSdgIGhhbmRsZXI6IFMzIGZvciBzdG9yYWdlLCBtZW1vcnkgaW4gZnJvbnQsIGFuZCB0aGVcbiAqIHJldmFsaWRhdGlvbiB0YWJsZSBmb3IgdGFncy5cbiAqXG4gKiBVbmxpa2UgdGhlIGRlZmF1bHQgaGFuZGxlciBhbiBlbnRyeSBpcyBzZXJ2ZWQgdW50aWwgYGV4cGlyZWAsIG5vdCBkcm9wcGVkIGF0XG4gKiBgcmV2YWxpZGF0ZWA6IGEgcmVtb3RlIHJlYWQgaXMgd29ydGggc2VydmluZyBzdGFsZSB3aGlsZSBOZXh0LmpzJ3Mgd3JhcHBlclxuICogcmVnZW5lcmF0ZXMgaXQgaW4gdGhlIGJhY2tncm91bmQsIHdoaWNoIGlzIHdoYXQgYHJldmFsaWRhdGVgIGlzIGZvci4gQSBtZW1vcnlcbiAqIGNvcHkgcGFzdCBgcmV2YWxpZGF0ZWAgaXMgY2hlY2tlZCBhZ2FpbnN0IFMzIGZpcnN0LCBzaW5jZSBhbm90aGVyIGluc3RhbmNlIG1heVxuICogYWxyZWFkeSBoYXZlIHdyaXR0ZW4gdGhlIHJlZ2VuZXJhdGVkIGVudHJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVtb3RlVXNlQ2FjaGVIYW5kbGVyKFxuICBvcHRpb25zOiBSZW1vdGVVc2VDYWNoZUhhbmRsZXJPcHRpb25zID0ge30sXG4pOiBDYWNoZUhhbmRsZXIge1xuICBjb25zdCBidWNrZXQgPVxuICAgIG9wdGlvbnMuYnVja2V0ID09PSB1bmRlZmluZWQgPyBidWNrZXRGcm9tRW52KCkgOiBvcHRpb25zLmJ1Y2tldDtcbiAgY29uc3QgYnVpbGRJZCA9IG9wdGlvbnMuYnVpbGRJZCA/PyByZXNvbHZlQXdzQ2FjaGVDb25maWcoKS5idWlsZElkO1xuICBjb25zdCB0YWdzID0gb3B0aW9ucy50YWdzID8/IHNoYXJlZFRhZ01hbmlmZXN0KCk7XG4gIGNvbnN0IG1lbW9yeSA9IG5ldyBFbnRyeUxydShcbiAgICBudW1iZXJGcm9tRW52KFwiQ0RLX05FWFRKU19VU0VfQ0FDSEVfTUVNT1JZX0JZVEVTXCIsIERFRkFVTFRfTUVNT1JZX0JZVEVTKSxcbiAgKTtcbiAgY29uc3QgcGVuZGluZyA9IG5ldyBQZW5kaW5nU2V0cygpO1xuICBjb25zdCBkZWJ1ZyA9IGdldERlYnVnKFwiY2RrLW5leHRqczpjYWNoZS1oYW5kbGVyOnVzZS1jYWNoZTpyZW1vdGVcIik7XG5cbiAgY29uc3QgczNLZXkgPSAoY2FjaGVLZXk6IHN0cmluZykgPT5cbiAgICB1c2VDYWNoZVMzS2V5KGJ1aWxkSWQsIGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGNhY2hlS2V5KS5kaWdlc3QoXCJoZXhcIikpO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHJlYWRGcm9tUzMoXG4gICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxTdG9yZWRFbnRyeSB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICghYnVja2V0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBzM0tleShjYWNoZUtleSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9iamVjdCA9IGF3YWl0IGJ1Y2tldC5nZXQoa2V5KTtcbiAgICAgIGlmICghb2JqZWN0KSB7XG4gICAgICAgIGRlYnVnKGBTMyBNSVNTICR7Y2FjaGVLZXl9YCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZUNhY2hlVmFsdWUob2JqZWN0KSBhcyBTZXJpYWxpemVkRW50cnk7XG4gICAgICBpZiAocGFyc2VkLmtleSAhPT0gY2FjaGVLZXkpIHtcbiAgICAgICAgLy8gQSBoYXNoIGNvbGxpc2lvbiwgb3IgYW4gb2JqZWN0IHRoYXQgaXMgbm90IG91cnM6IG5ldmVyIHNlcnZlIGl0LlxuICAgICAgICBjb25zb2xlLndhcm4oYCd1c2UgY2FjaGU6IHJlbW90ZScgZW50cnkgJHtrZXl9IGlzIGZvciBhbm90aGVyIGtleWApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFnczogcGFyc2VkLnRhZ3MsXG4gICAgICAgIHN0YWxlOiBwYXJzZWQuc3RhbGUsXG4gICAgICAgIHRpbWVzdGFtcDogcGFyc2VkLnRpbWVzdGFtcCxcbiAgICAgICAgZXhwaXJlOiBwYXJzZWQuZXhwaXJlLFxuICAgICAgICByZXZhbGlkYXRlOiBwYXJzZWQucmV2YWxpZGF0ZSxcbiAgICAgICAgdmFsdWU6IG5ldyBVaW50OEFycmF5KHBhcnNlZC52YWx1ZSksXG4gICAgICB9O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICBgRXJyb3IgcmVhZGluZyAndXNlIGNhY2hlOiByZW1vdGUnIGVudHJ5ICR7a2V5fSBmcm9tIFMzOmAsXG4gICAgICAgIGVycm9yLFxuICAgICAgKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd3JpdGVUb1MzKGNhY2hlS2V5OiBzdHJpbmcsIHN0b3JlZDogU3RvcmVkRW50cnkpIHtcbiAgICBpZiAoIWJ1Y2tldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBrZXkgPSBzM0tleShjYWNoZUtleSk7XG4gICAgY29uc3Qgc2VyaWFsaXplZDogU2VyaWFsaXplZEVudHJ5ID0ge1xuICAgICAgLi4uc3RvcmVkLFxuICAgICAga2V5OiBjYWNoZUtleSxcbiAgICAgIHZhbHVlOiBCdWZmZXIuZnJvbShzdG9yZWQudmFsdWUpLFxuICAgIH07XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGJ1Y2tldC5wdXRKc29uKGtleSwgc2VyaWFsaXplQ2FjaGVWYWx1ZShzZXJpYWxpemVkKSk7XG4gICAgICBkZWJ1ZyhgUzMgU0VUICR7Y2FjaGVLZXl9ICgke2tleX0pYCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIFRoZSBlbnRyeSBpcyBzdGlsbCBpbiBtZW1vcnkgaGVyZTsgb3RoZXIgaW5zdGFuY2VzIGp1c3QgbWlzcy5cbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBFcnJvciB3cml0aW5nICd1c2UgY2FjaGU6IHJlbW90ZScgZW50cnkgJHtrZXl9IHRvIFMzOmAsXG4gICAgICAgIGVycm9yLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGFzeW5jIGdldChjYWNoZUtleTogc3RyaW5nKTogUHJvbWlzZTxDYWNoZUVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gICAgICBhd2FpdCBwZW5kaW5nLndhaXQoY2FjaGVLZXkpO1xuICAgICAgY29uc3QgYXQgPSBub3coKTtcblxuICAgICAgbGV0IHN0b3JlZCA9IG1lbW9yeS5nZXQoY2FjaGVLZXkpO1xuICAgICAgaWYgKHN0b3JlZCkge1xuICAgICAgICBhd2FpdCB0YWdzLmVuc3VyZShzdG9yZWQudGFncyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFBhc3QgYHJldmFsaWRhdGVgLCBvciBzdGFsZSBvciBleHBpcmVkIGJ5IHRhZzogYW5vdGhlciBpbnN0YW5jZSBtYXlcbiAgICAgIC8vIGFscmVhZHkgaGF2ZSB3cml0dGVuIHRoZSByZWdlbmVyYXRlZCBlbnRyeSwgYW5kIHNlcnZpbmcgdGhhdCBiZWF0c1xuICAgICAgLy8gcmVnZW5lcmF0aW5nIGl0IGhlcmUgdG9vLiBBbiBleHBpcmVkIGVudHJ5IFMzIGhhcyBub3RoaW5nIG5ld2VyIGZvciBpc1xuICAgICAgLy8gZHJvcHBlZCBiZWxvdy5cbiAgICAgIGlmIChcbiAgICAgICAgIXN0b3JlZCB8fFxuICAgICAgICBpc1Bhc3RSZXZhbGlkYXRlKHN0b3JlZCwgYXQpIHx8XG4gICAgICAgIHRhZ3Muc3RhdGUoc3RvcmVkLnRhZ3MsIHN0b3JlZC50aW1lc3RhbXApICE9PSBcImZyZXNoXCJcbiAgICAgICkge1xuICAgICAgICBjb25zdCBmcm9tUzMgPSBhd2FpdCByZWFkRnJvbVMzKGNhY2hlS2V5KTtcbiAgICAgICAgaWYgKGZyb21TMyAmJiAoIXN0b3JlZCB8fCBmcm9tUzMudGltZXN0YW1wID4gc3RvcmVkLnRpbWVzdGFtcCkpIHtcbiAgICAgICAgICBzdG9yZWQgPSBmcm9tUzM7XG4gICAgICAgICAgLy8gQW4gZW50cnkgd3JpdHRlbiBieSBhbm90aGVyIGluc3RhbmNlOiBpdHMgdGFncyBtYXkgaGF2ZSBiZWVuXG4gICAgICAgICAgLy8gcmV2YWxpZGF0ZWQgYXQgYW55IHRpbWUgc2luY2UsIHNvIHRoZXkgYXJlIHJlYWQgYmVmb3JlIGp1ZGdpbmcgaXQuXG4gICAgICAgICAgYXdhaXQgdGFncy5lbnN1cmUoc3RvcmVkLnRhZ3MpO1xuICAgICAgICAgIG1lbW9yeS5zZXQoY2FjaGVLZXksIHN0b3JlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKCFzdG9yZWQpIHtcbiAgICAgICAgZGVidWcoYE1JU1MgJHtjYWNoZUtleX1gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGlmIChpc1Bhc3RFeHBpcmUoc3RvcmVkLCBhdCkpIHtcbiAgICAgICAgZGVidWcoYEVYUElSRUQgJHtjYWNoZUtleX1gKTtcbiAgICAgICAgbWVtb3J5LmRlbGV0ZShjYWNoZUtleSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBzdGF0ZSA9IHRhZ3Muc3RhdGUoc3RvcmVkLnRhZ3MsIHN0b3JlZC50aW1lc3RhbXApO1xuICAgICAgaWYgKHN0YXRlID09PSBcImV4cGlyZWRcIikge1xuICAgICAgICBkZWJ1ZyhgRVhQSVJFRCBCWSBUQUcgJHtjYWNoZUtleX1gKTtcbiAgICAgICAgbWVtb3J5LmRlbGV0ZShjYWNoZUtleSk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBkZWJ1ZyhgSElUICR7Y2FjaGVLZXl9JHtzdGF0ZSA9PT0gXCJzdGFsZVwiID8gXCIgKHN0YWxlIHRhZylcIiA6IFwiXCJ9YCk7XG4gICAgICAvLyBgcmV2YWxpZGF0ZTogLTFgIG1ha2VzIHRoZSB3cmFwcGVyIHNlcnZlIHRoZSBlbnRyeSBhbmQgcmVnZW5lcmF0ZSBpdCBpblxuICAgICAgLy8gdGhlIGJhY2tncm91bmQsIHRoZSBidWlsdC1pbiBoYW5kbGVyJ3MgYW5zd2VyIHRvIGEgc3RhbGUgdGFnLlxuICAgICAgcmV0dXJuIGNhY2hlRW50cnlPZihzdG9yZWQsIHN0YXRlID09PSBcInN0YWxlXCIgPyAtMSA6IHN0b3JlZC5yZXZhbGlkYXRlKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2V0KFxuICAgICAgY2FjaGVLZXk6IHN0cmluZyxcbiAgICAgIHBlbmRpbmdFbnRyeTogUHJvbWlzZTxDYWNoZUVudHJ5PixcbiAgICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IGRvbmUgPSBwZW5kaW5nLmJlZ2luKGNhY2hlS2V5KTtcbiAgICAgIGxldCBzdG9yZWQ6IFN0b3JlZEVudHJ5O1xuICAgICAgdHJ5IHtcbiAgICAgICAgc3RvcmVkID0gYXdhaXQgc3RvcmVkRW50cnlPZihwZW5kaW5nRW50cnkpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgLy8gVGhlIHN0cmVhbSBlcnJvcmVkOiBzdG9yZSBub3RoaW5nIHJhdGhlciB0aGFuIGEgcGFydGlhbCBlbnRyeS5cbiAgICAgICAgZGVidWcoYFNFVCBGQUlMRUQgJHtjYWNoZUtleX1gLCBlcnJvcik7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKGlzRHluYW1pY0VudHJ5KHN0b3JlZCkpIHtcbiAgICAgICAgZGVidWcoYFNLSVAgZHluYW1pYyBlbnRyeSAke2NhY2hlS2V5fWApO1xuICAgICAgICBkb25lKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG1lbW9yeS5zZXQoY2FjaGVLZXksIHN0b3JlZCk7XG4gICAgICB0YWdzLnRyYWNrKHN0b3JlZC50YWdzKTtcbiAgICAgIC8vIEEgYGdldGAgd2FpdGluZyBvbiB0aGlzIGBzZXRgIGNhbiBiZSBhbnN3ZXJlZCBmcm9tIG1lbW9yeSBub3c7IG9ubHlcbiAgICAgIC8vIG90aGVyIGluc3RhbmNlcyBuZWVkIHRoZSBTMyBjb3B5LlxuICAgICAgZG9uZSgpO1xuICAgICAgYXdhaXQgd3JpdGVUb1MzKGNhY2hlS2V5LCBzdG9yZWQpO1xuICAgIH0sXG5cbiAgICAuLi50YWdNZXRob2RzKHRhZ3MpLFxuICB9O1xufVxuXG5leHBvcnQgZGVmYXVsdCBsYXp5SGFuZGxlcigoKSA9PiBjcmVhdGVSZW1vdGVVc2VDYWNoZUhhbmRsZXIoKSk7XG4iXX0=
|
|
185
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNhY2hlLXJlbW90ZS1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXIvdXNlLWNhY2hlLXJlbW90ZS1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBZ0dBLGtFQXlKQztBQXpQRDs7Ozs7Ozs7OztFQVVFO0FBQ0Ysc0RBQXNEO0FBQ3RELGtEQUE4QztBQUM5QyxrREFBNkI7QUFLN0IsdURBSzJCO0FBQzNCLCtDQUFnRjtBQUNoRix5REFjNEI7QUFxQjVCLFNBQVMsYUFBYTtJQUNwQixJQUFJLElBQUEsK0JBQVksR0FBRSxFQUFFLENBQUM7UUFDbkIsd0VBQXdFO1FBQ3hFLGlFQUFpRTtRQUNqRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUEsdUNBQXFCLEdBQUUsQ0FBQztJQUN2RCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDaEIsT0FBTyxDQUFDLElBQUksQ0FDVixtSEFBbUgsQ0FDcEgsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU8sSUFBSSw2QkFBVyxDQUFDLElBQUksb0JBQVEsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELDBFQUEwRTtBQUMxRSxTQUFTLGdCQUFnQixDQUFDLE1BQW1CLEVBQUUsRUFBVTtJQUN2RCxPQUFPLEVBQUUsR0FBRyxNQUFNLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0FBQzFELENBQUM7QUFFRCw2RUFBNkU7QUFDN0UsU0FBUyxZQUFZLENBQUMsTUFBbUIsRUFBRSxFQUFVO0lBQ25ELE9BQU8sRUFBRSxHQUFHLE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7QUFDdEQsQ0FBQztB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QyxHQUFHLENBQ1AsUUFBZ0IsRUFDaEIsWUFBaUM7WUFFakMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNyQyxJQUFJLE1BQW1CLENBQUM7WUFDeEIsSUFBSSxDQUFDO2dCQUNILE1BQU0sR0FBRyxNQUFNLElBQUEsZ0NBQWEsRUFBQyxZQUFZLENBQUMsQ0FBQztZQUM3QyxDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixpRUFBaUU7Z0JBQ2pFLEtBQUssQ0FBQyxjQUFjLFFBQVEsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUN2QyxJQUFJLEVBQUUsQ0FBQztnQkFDUCxPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksSUFBQSxpQ0FBYyxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQzNCLEtBQUssQ0FBQyxzQkFBc0IsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxFQUFFLENBQUM7Z0JBQ1AsT0FBTztZQUNULENBQUM7WUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN4QixzRUFBc0U7WUFDdEUsb0NBQW9DO1lBQ3BDLElBQUksRUFBRSxDQUFDO1lBQ1AsTUFBTSxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3BDLENBQUM7UUFFRCxHQUFHLElBQUEsNkJBQVUsRUFBQyxJQUFJLENBQUM7S0FDcEIsQ0FBQztBQUNKLENBQUM7QUFFRCxrQkFBZSxJQUFBLDhCQUFXLEVBQUMsR0FBRyxFQUFFLENBQUMsMkJBQTJCLEVBQUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgVGhlIGBjYWNoZUhhbmRsZXJzLnJlbW90ZWAgaGFuZGxlciwgZm9yIGAndXNlIGNhY2hlOiByZW1vdGUnYC5cbiAgU2VlOiBodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvYXBpLXJlZmVyZW5jZS9jb25maWcvbmV4dC1jb25maWctanMvY2FjaGVIYW5kbGVyc1xuXG4gIEVudHJpZXMgYXJlIHN0b3JlZCBpbiB0aGUgY2FjaGUgYnVja2V0LCBzbyBldmVyeSBpbnN0YW5jZSByZWFkcyB3aGF0IGFueVxuICBpbnN0YW5jZSB3cm90ZSwgd2l0aCBhIGJvdW5kZWQgaW4tbWVtb3J5IHRpZXIgaW4gZnJvbnQuIFRhZ3MgZ28gdGhyb3VnaCB0aGVcbiAgcmV2YWxpZGF0aW9uIHRhYmxlJ3MgbWFya2VyIHJvd3MsIHNoYXJlZCB3aXRoIHBsYWluIGAndXNlIGNhY2hlJ2AgYW5kIHdpdGggdGhlXG4gIGluY3JlbWVudGFsIGNhY2hlLiBXaXRob3V0IHRoaXMsIE5leHQuanMgbWFwcyBgcmVtb3RlYCB0byBpdHMgaW4tbWVtb3J5XG4gIGRlZmF1bHQgaGFuZGxlciwgYW5kIGAndXNlIGNhY2hlOiByZW1vdGUnYCBpcyBubyBtb3JlIHNoYXJlZCB0aGFuXG4gIGAndXNlIGNhY2hlJ2AuXG4qL1xuLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG5pbXBvcnQgeyBTM0NsaWVudCB9IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbmltcG9ydCBnZXREZWJ1ZyBmcm9tIFwiZGVidWdcIjtcbmltcG9ydCB0eXBlIHtcbiAgQ2FjaGVFbnRyeSxcbiAgQ2FjaGVIYW5kbGVyLFxufSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9saWIvY2FjaGUtaGFuZGxlcnMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIENhY2hlQnVja2V0LFxuICByZXNvbHZlQXdzQ2FjaGVDb25maWcsXG4gIFRyYWNrZWRUYWdNYXJrZXJzLFxuICB1c2VDYWNoZVMzS2V5LFxufSBmcm9tIFwiLi9hd3MtY2FjaGUtc3RvcmVcIjtcbmltcG9ydCB7IHBhcnNlQ2FjaGVWYWx1ZSwgc2VyaWFsaXplQ2FjaGVWYWx1ZSwgc2hhMjU2SGV4IH0gZnJvbSBcIi4vY2FjaGUtdXRpbHNcIjtcbmltcG9ydCB7XG4gIGNhY2hlRW50cnlPZixcbiAgREVGQVVMVF9NRU1PUllfQllURVMsXG4gIEVudHJ5THJ1LFxuICBpc0J1aWxkUGhhc2UsXG4gIGlzRHluYW1pY0VudHJ5LFxuICBsYXp5SGFuZGxlcixcbiAgbm93LFxuICBudW1iZXJGcm9tRW52LFxuICBQZW5kaW5nU2V0cyxcbiAgc2hhcmVkVGFnTWFuaWZlc3QsXG4gIFN0b3JlZEVudHJ5LFxuICBzdG9yZWRFbnRyeU9mLFxuICB0YWdNZXRob2RzLFxufSBmcm9tIFwiLi91c2UtY2FjaGUtY29tbW9uXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVtb3RlVXNlQ2FjaGVIYW5kbGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgYnVja2V0IGVudHJpZXMgYXJlIHN0b3JlZCBpbiwgb3IgYG51bGxgIGZvciBtZW1vcnkgb25seS4gRnJvbVxuICAgKiBgQ0RLX05FWFRKU19DQUNIRV9CVUNLRVRfTkFNRWAgYnkgZGVmYXVsdCwgYW5kIG5ldmVyIGF0IGJ1aWxkIHRpbWUuXG4gICAqL1xuICBidWNrZXQ/OiBDYWNoZUJ1Y2tldCB8IG51bGw7XG4gIC8qKiBQcmVmaXhlcyBldmVyeSBTMyBrZXk7IGBDREtfTkVYVEpTX0JVSUxEX0lEYCBieSBkZWZhdWx0LiAqL1xuICBidWlsZElkPzogc3RyaW5nO1xuICAvKiogVGFnIHN0YXRlOyB0aGUgcHJvY2Vzcy13aWRlIG9uZSBmcm9tIHRoZSBlbnZpcm9ubWVudCBieSBkZWZhdWx0LiAqL1xuICB0YWdzPzogVHJhY2tlZFRhZ01hcmtlcnM7XG59XG5cbi8qKiBXaGF0IGlzIHdyaXR0ZW4gdG8gUzMgZm9yIG9uZSBlbnRyeS4gKi9cbmludGVyZmFjZSBTZXJpYWxpemVkRW50cnkgZXh0ZW5kcyBPbWl0PFN0b3JlZEVudHJ5LCBcInZhbHVlXCI+IHtcbiAgLyoqIFRoZSBmdWxsIGNhY2hlIGtleSwgY2hlY2tlZCBvbiByZWFkOyB0aGUgb2JqZWN0IGtleSBpcyBvbmx5IGl0cyBoYXNoLiAqL1xuICBrZXk6IHN0cmluZztcbiAgdmFsdWU6IEJ1ZmZlcjtcbn1cblxuZnVuY3Rpb24gYnVja2V0RnJvbUVudigpOiBDYWNoZUJ1Y2tldCB8IG51bGwge1xuICBpZiAoaXNCdWlsZFBoYXNlKCkpIHtcbiAgICAvLyBObyBjcmVkZW50aWFscywgYW5kIG5vdGhpbmcgYSBidWlsZC10aW1lIGVudHJ5IGNvdWxkIGJlIHJlYWQgYmFjayBieTpcbiAgICAvLyBwcmVyZW5kZXJzIGtlZXAgd2hhdCB0aGV5IG5lZWQgaW4gdGhlaXIgb3duIHJlc3VtZSBkYXRhIGNhY2hlLlxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHsgYnVja2V0TmFtZSwgcmVnaW9uIH0gPSByZXNvbHZlQXdzQ2FjaGVDb25maWcoKTtcbiAgaWYgKCFidWNrZXROYW1lKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJDREtfTkVYVEpTX0NBQ0hFX0JVQ0tFVF9OQU1FIGVudmlyb25tZW50IHZhcmlhYmxlIG5vdCBzZXQsICd1c2UgY2FjaGU6IHJlbW90ZScgZW50cmllcyBhcmUgbG9jYWwgdG8gZWFjaCBpbnN0YW5jZVwiLFxuICAgICk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIG5ldyBDYWNoZUJ1Y2tldChuZXcgUzNDbGllbnQoeyByZWdpb24gfSksIGJ1Y2tldE5hbWUpO1xufVxuXG4vKiogV2hldGhlciBgc3RvcmVkYCBpcyBwYXN0IGByZXZhbGlkYXRlYCwgc28gYSBmcmVzaGVyIGNvcHkgbWF5IGV4aXN0LiAqL1xuZnVuY3Rpb24gaXNQYXN0UmV2YWxpZGF0ZShzdG9yZWQ6IFN0b3JlZEVudHJ5LCBhdDogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBhdCA+IHN0b3JlZC50aW1lc3RhbXAgKyBzdG9yZWQucmV2YWxpZGF0ZSAqIDEwMDA7XG59XG5cbi8qKiBXaGV0aGVyIGBzdG9yZWRgIGlzIHBhc3QgYGV4cGlyZWAsIGFuZCBtYXkgbm8gbG9uZ2VyIGJlIHNlcnZlZCBhdCBhbGwuICovXG5mdW5jdGlvbiBpc1Bhc3RFeHBpcmUoc3RvcmVkOiBTdG9yZWRFbnRyeSwgYXQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gYXQgPiBzdG9yZWQudGltZXN0YW1wICsgc3RvcmVkLmV4cGlyZSAqIDEwMDA7XG59XG5cbi8qKlxuICogQSBgJ3VzZSBjYWNoZTogcmVtb3RlJ2AgaGFuZGxlcjogUzMgZm9yIHN0b3JhZ2UsIG1lbW9yeSBpbiBmcm9udCwgYW5kIHRoZVxuICogcmV2YWxpZGF0aW9uIHRhYmxlIGZvciB0YWdzLlxuICpcbiAqIFVubGlrZSB0aGUgZGVmYXVsdCBoYW5kbGVyIGFuIGVudHJ5IGlzIHNlcnZlZCB1bnRpbCBgZXhwaXJlYCwgbm90IGRyb3BwZWQgYXRcbiAqIGByZXZhbGlkYXRlYDogYSByZW1vdGUgcmVhZCBpcyB3b3J0aCBzZXJ2aW5nIHN0YWxlIHdoaWxlIE5leHQuanMncyB3cmFwcGVyXG4gKiByZWdlbmVyYXRlcyBpdCBpbiB0aGUgYmFja2dyb3VuZCwgd2hpY2ggaXMgd2hhdCBgcmV2YWxpZGF0ZWAgaXMgZm9yLiBBIG1lbW9yeVxuICogY29weSBwYXN0IGByZXZhbGlkYXRlYCBpcyBjaGVja2VkIGFnYWluc3QgUzMgZmlyc3QsIHNpbmNlIGFub3RoZXIgaW5zdGFuY2UgbWF5XG4gKiBhbHJlYWR5IGhhdmUgd3JpdHRlbiB0aGUgcmVnZW5lcmF0ZWQgZW50cnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW1vdGVVc2VDYWNoZUhhbmRsZXIoXG4gIG9wdGlvbnM6IFJlbW90ZVVzZUNhY2hlSGFuZGxlck9wdGlvbnMgPSB7fSxcbik6IENhY2hlSGFuZGxlciB7XG4gIGNvbnN0IGJ1Y2tldCA9XG4gICAgb3B0aW9ucy5idWNrZXQgPT09IHVuZGVmaW5lZCA/IGJ1Y2tldEZyb21FbnYoKSA6IG9wdGlvbnMuYnVja2V0O1xuICBjb25zdCBidWlsZElkID0gb3B0aW9ucy5idWlsZElkID8/IHJlc29sdmVBd3NDYWNoZUNvbmZpZygpLmJ1aWxkSWQ7XG4gIGNvbnN0IHRhZ3MgPSBvcHRpb25zLnRhZ3MgPz8gc2hhcmVkVGFnTWFuaWZlc3QoKTtcbiAgY29uc3QgbWVtb3J5ID0gbmV3IEVudHJ5THJ1KFxuICAgIG51bWJlckZyb21FbnYoXCJDREtfTkVYVEpTX1VTRV9DQUNIRV9NRU1PUllfQllURVNcIiwgREVGQVVMVF9NRU1PUllfQllURVMpLFxuICApO1xuICBjb25zdCBwZW5kaW5nID0gbmV3IFBlbmRpbmdTZXRzKCk7XG4gIGNvbnN0IGRlYnVnID0gZ2V0RGVidWcoXCJjZGstbmV4dGpzOmNhY2hlLWhhbmRsZXI6dXNlLWNhY2hlOnJlbW90ZVwiKTtcblxuICBjb25zdCBzM0tleSA9IChjYWNoZUtleTogc3RyaW5nKSA9PlxuICAgIHVzZUNhY2hlUzNLZXkoYnVpbGRJZCwgc2hhMjU2SGV4KGNhY2hlS2V5KSk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gcmVhZEZyb21TMyhcbiAgICBjYWNoZUtleTogc3RyaW5nLFxuICApOiBQcm9taXNlPFN0b3JlZEVudHJ5IHwgdW5kZWZpbmVkPiB7XG4gICAgaWYgKCFidWNrZXQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHMzS2V5KGNhY2hlS2V5KTtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb2JqZWN0ID0gYXdhaXQgYnVja2V0LmdldChrZXkpO1xuICAgICAgaWYgKCFvYmplY3QpIHtcbiAgICAgICAgZGVidWcoYFMzIE1JU1MgJHtjYWNoZUtleX1gKTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlQ2FjaGVWYWx1ZShvYmplY3QpIGFzIFNlcmlhbGl6ZWRFbnRyeTtcbiAgICAgIGlmIChwYXJzZWQua2V5ICE9PSBjYWNoZUtleSkge1xuICAgICAgICAvLyBBIGhhc2ggY29sbGlzaW9uLCBvciBhbiBvYmplY3QgdGhhdCBpcyBub3Qgb3VyczogbmV2ZXIgc2VydmUgaXQuXG4gICAgICAgIGNvbnNvbGUud2FybihgJ3VzZSBjYWNoZTogcmVtb3RlJyBlbnRyeSAke2tleX0gaXMgZm9yIGFub3RoZXIga2V5YCk7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YWdzOiBwYXJzZWQudGFncyxcbiAgICAgICAgc3RhbGU6IHBhcnNlZC5zdGFsZSxcbiAgICAgICAgdGltZXN0YW1wOiBwYXJzZWQudGltZXN0YW1wLFxuICAgICAgICBleHBpcmU6IHBhcnNlZC5leHBpcmUsXG4gICAgICAgIHJldmFsaWRhdGU6IHBhcnNlZC5yZXZhbGlkYXRlLFxuICAgICAgICB2YWx1ZTogbmV3IFVpbnQ4QXJyYXkocGFyc2VkLnZhbHVlKSxcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBFcnJvciByZWFkaW5nICd1c2UgY2FjaGU6IHJlbW90ZScgZW50cnkgJHtrZXl9IGZyb20gUzM6YCxcbiAgICAgICAgZXJyb3IsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB3cml0ZVRvUzMoY2FjaGVLZXk6IHN0cmluZywgc3RvcmVkOiBTdG9yZWRFbnRyeSkge1xuICAgIGlmICghYnVja2V0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGtleSA9IHMzS2V5KGNhY2hlS2V5KTtcbiAgICBjb25zdCBzZXJpYWxpemVkOiBTZXJpYWxpemVkRW50cnkgPSB7XG4gICAgICAuLi5zdG9yZWQsXG4gICAgICBrZXk6IGNhY2hlS2V5LFxuICAgICAgdmFsdWU6IEJ1ZmZlci5mcm9tKHN0b3JlZC52YWx1ZSksXG4gICAgfTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYnVja2V0LnB1dEpzb24oa2V5LCBzZXJpYWxpemVDYWNoZVZhbHVlKHNlcmlhbGl6ZWQpKTtcbiAgICAgIGRlYnVnKGBTMyBTRVQgJHtjYWNoZUtleX0gKCR7a2V5fSlgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gVGhlIGVudHJ5IGlzIHN0aWxsIGluIG1lbW9yeSBoZXJlOyBvdGhlciBpbnN0YW5jZXMganVzdCBtaXNzLlxuICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgYEVycm9yIHdyaXRpbmcgJ3VzZSBjYWNoZTogcmVtb3RlJyBlbnRyeSAke2tleX0gdG8gUzM6YCxcbiAgICAgICAgZXJyb3IsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXN5bmMgZ2V0KGNhY2hlS2V5OiBzdHJpbmcpOiBQcm9taXNlPENhY2hlRW50cnkgfCB1bmRlZmluZWQ+IHtcbiAgICAgIGF3YWl0IHBlbmRpbmcud2FpdChjYWNoZUtleSk7XG4gICAgICBjb25zdCBhdCA9IG5vdygpO1xuXG4gICAgICBsZXQgc3RvcmVkID0gbWVtb3J5LmdldChjYWNoZUtleSk7XG4gICAgICBpZiAoc3RvcmVkKSB7XG4gICAgICAgIGF3YWl0IHRhZ3MuZW5zdXJlKHN0b3JlZC50YWdzKTtcbiAgICAgIH1cblxuICAgICAgLy8gUGFzdCBgcmV2YWxpZGF0ZWAsIG9yIHN0YWxlIG9yIGV4cGlyZWQgYnkgdGFnOiBhbm90aGVyIGluc3RhbmNlIG1heVxuICAgICAgLy8gYWxyZWFkeSBoYXZlIHdyaXR0ZW4gdGhlIHJlZ2VuZXJhdGVkIGVudHJ5LCBhbmQgc2VydmluZyB0aGF0IGJlYXRzXG4gICAgICAvLyByZWdlbmVyYXRpbmcgaXQgaGVyZSB0b28uIEFuIGV4cGlyZWQgZW50cnkgUzMgaGFzIG5vdGhpbmcgbmV3ZXIgZm9yIGlzXG4gICAgICAvLyBkcm9wcGVkIGJlbG93LlxuICAgICAgaWYgKFxuICAgICAgICAhc3RvcmVkIHx8XG4gICAgICAgIGlzUGFzdFJldmFsaWRhdGUoc3RvcmVkLCBhdCkgfHxcbiAgICAgICAgdGFncy5zdGF0ZShzdG9yZWQudGFncywgc3RvcmVkLnRpbWVzdGFtcCkgIT09IFwiZnJlc2hcIlxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IGZyb21TMyA9IGF3YWl0IHJlYWRGcm9tUzMoY2FjaGVLZXkpO1xuICAgICAgICBpZiAoZnJvbVMzICYmICghc3RvcmVkIHx8IGZyb21TMy50aW1lc3RhbXAgPiBzdG9yZWQudGltZXN0YW1wKSkge1xuICAgICAgICAgIHN0b3JlZCA9IGZyb21TMztcbiAgICAgICAgICAvLyBBbiBlbnRyeSB3cml0dGVuIGJ5IGFub3RoZXIgaW5zdGFuY2U6IGl0cyB0YWdzIG1heSBoYXZlIGJlZW5cbiAgICAgICAgICAvLyByZXZhbGlkYXRlZCBhdCBhbnkgdGltZSBzaW5jZSwgc28gdGhleSBhcmUgcmVhZCBiZWZvcmUganVkZ2luZyBpdC5cbiAgICAgICAgICBhd2FpdCB0YWdzLmVuc3VyZShzdG9yZWQudGFncyk7XG4gICAgICAgICAgbWVtb3J5LnNldChjYWNoZUtleSwgc3RvcmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIXN0b3JlZCkge1xuICAgICAgICBkZWJ1ZyhgTUlTUyAke2NhY2hlS2V5fWApO1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgaWYgKGlzUGFzdEV4cGlyZShzdG9yZWQsIGF0KSkge1xuICAgICAgICBkZWJ1ZyhgRVhQSVJFRCAke2NhY2hlS2V5fWApO1xuICAgICAgICBtZW1vcnkuZGVsZXRlKGNhY2hlS2V5KTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0YXRlID0gdGFncy5zdGF0ZShzdG9yZWQudGFncywgc3RvcmVkLnRpbWVzdGFtcCk7XG4gICAgICBpZiAoc3RhdGUgPT09IFwiZXhwaXJlZFwiKSB7XG4gICAgICAgIGRlYnVnKGBFWFBJUkVEIEJZIFRBRyAke2NhY2hlS2V5fWApO1xuICAgICAgICBtZW1vcnkuZGVsZXRlKGNhY2hlS2V5KTtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGRlYnVnKGBISVQgJHtjYWNoZUtleX0ke3N0YXRlID09PSBcInN0YWxlXCIgPyBcIiAoc3RhbGUgdGFnKVwiIDogXCJcIn1gKTtcbiAgICAgIC8vIGByZXZhbGlkYXRlOiAtMWAgbWFrZXMgdGhlIHdyYXBwZXIgc2VydmUgdGhlIGVudHJ5IGFuZCByZWdlbmVyYXRlIGl0IGluXG4gICAgICAvLyB0aGUgYmFja2dyb3VuZCwgdGhlIGJ1aWx0LWluIGhhbmRsZXIncyBhbnN3ZXIgdG8gYSBzdGFsZSB0YWcuXG4gICAgICByZXR1cm4gY2FjaGVFbnRyeU9mKHN0b3JlZCwgc3RhdGUgPT09IFwic3RhbGVcIiA/IC0xIDogc3RvcmVkLnJldmFsaWRhdGUpO1xuICAgIH0sXG5cbiAgICBhc3luYyBzZXQoXG4gICAgICBjYWNoZUtleTogc3RyaW5nLFxuICAgICAgcGVuZGluZ0VudHJ5OiBQcm9taXNlPENhY2hlRW50cnk+LFxuICAgICk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3QgZG9uZSA9IHBlbmRpbmcuYmVnaW4oY2FjaGVLZXkpO1xuICAgICAgbGV0IHN0b3JlZDogU3RvcmVkRW50cnk7XG4gICAgICB0cnkge1xuICAgICAgICBzdG9yZWQgPSBhd2FpdCBzdG9yZWRFbnRyeU9mKHBlbmRpbmdFbnRyeSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBUaGUgc3RyZWFtIGVycm9yZWQ6IHN0b3JlIG5vdGhpbmcgcmF0aGVyIHRoYW4gYSBwYXJ0aWFsIGVudHJ5LlxuICAgICAgICBkZWJ1ZyhgU0VUIEZBSUxFRCAke2NhY2hlS2V5fWAsIGVycm9yKTtcbiAgICAgICAgZG9uZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNEeW5hbWljRW50cnkoc3RvcmVkKSkge1xuICAgICAgICBkZWJ1ZyhgU0tJUCBkeW5hbWljIGVudHJ5ICR7Y2FjaGVLZXl9YCk7XG4gICAgICAgIGRvbmUoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbWVtb3J5LnNldChjYWNoZUtleSwgc3RvcmVkKTtcbiAgICAgIHRhZ3MudHJhY2soc3RvcmVkLnRhZ3MpO1xuICAgICAgLy8gQSBgZ2V0YCB3YWl0aW5nIG9uIHRoaXMgYHNldGAgY2FuIGJlIGFuc3dlcmVkIGZyb20gbWVtb3J5IG5vdzsgb25seVxuICAgICAgLy8gb3RoZXIgaW5zdGFuY2VzIG5lZWQgdGhlIFMzIGNvcHkuXG4gICAgICBkb25lKCk7XG4gICAgICBhd2FpdCB3cml0ZVRvUzMoY2FjaGVLZXksIHN0b3JlZCk7XG4gICAgfSxcblxuICAgIC4uLnRhZ01ldGhvZHModGFncyksXG4gIH07XG59XG5cbmV4cG9ydCBkZWZhdWx0IGxhenlIYW5kbGVyKCgpID0+IGNyZWF0ZVJlbW90ZVVzZUNhY2hlSGFuZGxlcigpKTtcbiJdfQ==
|
|
@@ -46261,12 +46261,69 @@ var require_dist_cjs20 = __commonJS({
|
|
|
46261
46261
|
// src/adapter/use-cache-remote-handler.ts
|
|
46262
46262
|
var import_client_s32 = __toESM(require_dist_cjs16());
|
|
46263
46263
|
var import_debug6 = __toESM(require_src());
|
|
46264
|
-
import { createHash as createHash6 } from "node:crypto";
|
|
46265
46264
|
|
|
46266
46265
|
// src/adapter/aws-cache-store.ts
|
|
46267
46266
|
var import_client_dynamodb = __toESM(require_dist_cjs20());
|
|
46268
46267
|
var import_client_s3 = __toESM(require_dist_cjs16());
|
|
46269
46268
|
import { join as join5 } from "node:path";
|
|
46269
|
+
|
|
46270
|
+
// src/adapter/cache-utils.ts
|
|
46271
|
+
import { createHash as createHash6 } from "node:crypto";
|
|
46272
|
+
function preprocessValue(value) {
|
|
46273
|
+
if (value == null) {
|
|
46274
|
+
return value;
|
|
46275
|
+
}
|
|
46276
|
+
if (Buffer.isBuffer(value)) {
|
|
46277
|
+
return {
|
|
46278
|
+
__type: "Buffer",
|
|
46279
|
+
base64: value.toString("base64")
|
|
46280
|
+
};
|
|
46281
|
+
}
|
|
46282
|
+
if (value instanceof Map) {
|
|
46283
|
+
const entries = {};
|
|
46284
|
+
for (const [key, val] of value.entries()) {
|
|
46285
|
+
entries[key] = preprocessValue(val);
|
|
46286
|
+
}
|
|
46287
|
+
return {
|
|
46288
|
+
__type: "Map",
|
|
46289
|
+
data: entries
|
|
46290
|
+
};
|
|
46291
|
+
}
|
|
46292
|
+
if (Array.isArray(value)) {
|
|
46293
|
+
return value.map((item) => preprocessValue(item));
|
|
46294
|
+
}
|
|
46295
|
+
if (typeof value === "object") {
|
|
46296
|
+
const processed = {};
|
|
46297
|
+
for (const [key, val] of Object.entries(value)) {
|
|
46298
|
+
processed[key] = preprocessValue(val);
|
|
46299
|
+
}
|
|
46300
|
+
return processed;
|
|
46301
|
+
}
|
|
46302
|
+
return value;
|
|
46303
|
+
}
|
|
46304
|
+
function serializeCacheValue(value) {
|
|
46305
|
+
const processed = preprocessValue(value);
|
|
46306
|
+
return JSON.stringify(processed);
|
|
46307
|
+
}
|
|
46308
|
+
function parseCacheValue(jsonString) {
|
|
46309
|
+
return JSON.parse(jsonString, (_key, val) => {
|
|
46310
|
+
if (val && typeof val === "object" && val.__type === "Map") {
|
|
46311
|
+
return new Map(Object.entries(val.data));
|
|
46312
|
+
}
|
|
46313
|
+
if (val && typeof val === "object" && val.__type === "Buffer") {
|
|
46314
|
+
return typeof val.base64 === "string" ? Buffer.from(val.base64, "base64") : Buffer.from(val.data);
|
|
46315
|
+
}
|
|
46316
|
+
if (val && typeof val === "object" && val.type === "Buffer" && Array.isArray(val.data)) {
|
|
46317
|
+
return Buffer.from(val.data);
|
|
46318
|
+
}
|
|
46319
|
+
return val;
|
|
46320
|
+
});
|
|
46321
|
+
}
|
|
46322
|
+
function sha256Hex(value) {
|
|
46323
|
+
return createHash6("sha256").update(value).digest("hex");
|
|
46324
|
+
}
|
|
46325
|
+
|
|
46326
|
+
// src/adapter/aws-cache-store.ts
|
|
46270
46327
|
function resolveAwsCacheConfig() {
|
|
46271
46328
|
return {
|
|
46272
46329
|
bucketName: process.env.CDK_NEXTJS_CACHE_BUCKET_NAME || "",
|
|
@@ -46333,6 +46390,13 @@ function markerOf(item) {
|
|
|
46333
46390
|
}
|
|
46334
46391
|
var BATCH_GET_MAX_KEYS = 100;
|
|
46335
46392
|
var DEFAULT_TAG_REFRESH_MS = 1e3;
|
|
46393
|
+
function hashedTag(tag) {
|
|
46394
|
+
return `#${sha256Hex(tag)}`;
|
|
46395
|
+
}
|
|
46396
|
+
var MAX_TAG_BYTES = 768;
|
|
46397
|
+
function sortKeyTag(tag) {
|
|
46398
|
+
return Buffer.byteLength(tag) <= MAX_TAG_BYTES ? tag : hashedTag(tag);
|
|
46399
|
+
}
|
|
46336
46400
|
var TagMarkerTable = class {
|
|
46337
46401
|
constructor(client, tableName, buildId) {
|
|
46338
46402
|
this.client = client;
|
|
@@ -46355,7 +46419,7 @@ var TagMarkerTable = class {
|
|
|
46355
46419
|
TableName: this.tableName,
|
|
46356
46420
|
Key: {
|
|
46357
46421
|
pk: { S: this.buildId },
|
|
46358
|
-
sk: { S: tag }
|
|
46422
|
+
sk: { S: sortKeyTag(tag) }
|
|
46359
46423
|
},
|
|
46360
46424
|
...markerUpdate(now, durations),
|
|
46361
46425
|
ReturnValues: "ALL_NEW"
|
|
@@ -46375,7 +46439,13 @@ var TagMarkerTable = class {
|
|
|
46375
46439
|
const unique = Array.from(new Set(tags));
|
|
46376
46440
|
const markers = /* @__PURE__ */ new Map();
|
|
46377
46441
|
for (let i5 = 0; i5 < unique.length; i5 += BATCH_GET_MAX_KEYS) {
|
|
46378
|
-
|
|
46442
|
+
const tagBySk = new Map(
|
|
46443
|
+
unique.slice(i5, i5 + BATCH_GET_MAX_KEYS).map((tag) => [sortKeyTag(tag), tag])
|
|
46444
|
+
);
|
|
46445
|
+
let keys = Array.from(
|
|
46446
|
+
tagBySk.keys(),
|
|
46447
|
+
(sk) => ({ pk: { S: buildId }, sk: { S: sk } })
|
|
46448
|
+
);
|
|
46379
46449
|
for (let attempt = 0; keys?.length && attempt < 3; attempt++) {
|
|
46380
46450
|
const response = await this.client.send(
|
|
46381
46451
|
new import_client_dynamodb.BatchGetItemCommand({
|
|
@@ -46388,7 +46458,7 @@ var TagMarkerTable = class {
|
|
|
46388
46458
|
})
|
|
46389
46459
|
);
|
|
46390
46460
|
for (const item of response.Responses?.[tableName] ?? []) {
|
|
46391
|
-
const tag = item.sk?.S;
|
|
46461
|
+
const tag = tagBySk.get(item.sk?.S ?? "");
|
|
46392
46462
|
if (tag !== void 0) {
|
|
46393
46463
|
markers.set(tag, markerOf(item));
|
|
46394
46464
|
}
|
|
@@ -46426,11 +46496,13 @@ var RevalidationLog = class {
|
|
|
46426
46496
|
* to {@link LOG_PUT_ATTEMPTS} times.
|
|
46427
46497
|
*/
|
|
46428
46498
|
async put(tag, at, marker) {
|
|
46499
|
+
const skTag = sortKeyTag(tag);
|
|
46429
46500
|
for (let attempt = 1; ; attempt++) {
|
|
46430
46501
|
const item = {
|
|
46431
46502
|
pk: { S: this.pk },
|
|
46432
|
-
sk: { S: `${logSkPrefix(at)}#${
|
|
46433
|
-
ttl: { N: String(Math.ceil((at + REVALIDATION_LOG_TTL_MS) / 1e3)) }
|
|
46503
|
+
sk: { S: `${logSkPrefix(at)}#${skTag}` },
|
|
46504
|
+
ttl: { N: String(Math.ceil((at + REVALIDATION_LOG_TTL_MS) / 1e3)) },
|
|
46505
|
+
...skTag !== tag && { longTag: { S: tag } }
|
|
46434
46506
|
};
|
|
46435
46507
|
for (const field of MARKER_FIELDS) {
|
|
46436
46508
|
const value = marker[field];
|
|
@@ -46475,7 +46547,7 @@ var RevalidationLog = class {
|
|
|
46475
46547
|
":pk": { S: this.pk },
|
|
46476
46548
|
":since": { S: logSkPrefix(Math.max(0, since)) }
|
|
46477
46549
|
},
|
|
46478
|
-
ProjectionExpression: "sk, revalidatedAt, staleAt, expiredAt",
|
|
46550
|
+
ProjectionExpression: "sk, longTag, revalidatedAt, staleAt, expiredAt",
|
|
46479
46551
|
ExclusiveStartKey: startKey
|
|
46480
46552
|
})
|
|
46481
46553
|
);
|
|
@@ -46487,7 +46559,7 @@ var RevalidationLog = class {
|
|
|
46487
46559
|
rows.push({
|
|
46488
46560
|
sk,
|
|
46489
46561
|
at: Number(sk.slice(0, LOG_SK_DIGITS)),
|
|
46490
|
-
tag: sk.slice(LOG_SK_DIGITS + 1),
|
|
46562
|
+
tag: item.longTag?.S ?? sk.slice(LOG_SK_DIGITS + 1),
|
|
46491
46563
|
marker: markerOf(item)
|
|
46492
46564
|
});
|
|
46493
46565
|
}
|
|
@@ -47036,58 +47108,6 @@ var CacheBucket = class {
|
|
|
47036
47108
|
}
|
|
47037
47109
|
};
|
|
47038
47110
|
|
|
47039
|
-
// src/adapter/cache-utils.ts
|
|
47040
|
-
function preprocessValue(value) {
|
|
47041
|
-
if (value == null) {
|
|
47042
|
-
return value;
|
|
47043
|
-
}
|
|
47044
|
-
if (Buffer.isBuffer(value)) {
|
|
47045
|
-
return {
|
|
47046
|
-
__type: "Buffer",
|
|
47047
|
-
base64: value.toString("base64")
|
|
47048
|
-
};
|
|
47049
|
-
}
|
|
47050
|
-
if (value instanceof Map) {
|
|
47051
|
-
const entries = {};
|
|
47052
|
-
for (const [key, val] of value.entries()) {
|
|
47053
|
-
entries[key] = preprocessValue(val);
|
|
47054
|
-
}
|
|
47055
|
-
return {
|
|
47056
|
-
__type: "Map",
|
|
47057
|
-
data: entries
|
|
47058
|
-
};
|
|
47059
|
-
}
|
|
47060
|
-
if (Array.isArray(value)) {
|
|
47061
|
-
return value.map((item) => preprocessValue(item));
|
|
47062
|
-
}
|
|
47063
|
-
if (typeof value === "object") {
|
|
47064
|
-
const processed = {};
|
|
47065
|
-
for (const [key, val] of Object.entries(value)) {
|
|
47066
|
-
processed[key] = preprocessValue(val);
|
|
47067
|
-
}
|
|
47068
|
-
return processed;
|
|
47069
|
-
}
|
|
47070
|
-
return value;
|
|
47071
|
-
}
|
|
47072
|
-
function serializeCacheValue(value) {
|
|
47073
|
-
const processed = preprocessValue(value);
|
|
47074
|
-
return JSON.stringify(processed);
|
|
47075
|
-
}
|
|
47076
|
-
function parseCacheValue(jsonString) {
|
|
47077
|
-
return JSON.parse(jsonString, (_key, val) => {
|
|
47078
|
-
if (val && typeof val === "object" && val.__type === "Map") {
|
|
47079
|
-
return new Map(Object.entries(val.data));
|
|
47080
|
-
}
|
|
47081
|
-
if (val && typeof val === "object" && val.__type === "Buffer") {
|
|
47082
|
-
return typeof val.base64 === "string" ? Buffer.from(val.base64, "base64") : Buffer.from(val.data);
|
|
47083
|
-
}
|
|
47084
|
-
if (val && typeof val === "object" && val.type === "Buffer" && Array.isArray(val.data)) {
|
|
47085
|
-
return Buffer.from(val.data);
|
|
47086
|
-
}
|
|
47087
|
-
return val;
|
|
47088
|
-
});
|
|
47089
|
-
}
|
|
47090
|
-
|
|
47091
47111
|
// src/adapter/use-cache-common.ts
|
|
47092
47112
|
var import_client_dynamodb2 = __toESM(require_dist_cjs20());
|
|
47093
47113
|
var import_debug5 = __toESM(require_src());
|
|
@@ -47293,7 +47313,7 @@ function createRemoteUseCacheHandler(options = {}) {
|
|
|
47293
47313
|
);
|
|
47294
47314
|
const pending = new PendingSets();
|
|
47295
47315
|
const debug = (0, import_debug6.default)("cdk-nextjs:cache-handler:use-cache:remote");
|
|
47296
|
-
const s3Key = (cacheKey) => useCacheS3Key(buildId,
|
|
47316
|
+
const s3Key = (cacheKey) => useCacheS3Key(buildId, sha256Hex(cacheKey));
|
|
47297
47317
|
async function readFromS3(cacheKey) {
|
|
47298
47318
|
if (!bucket) {
|
|
47299
47319
|
return void 0;
|
package/lib/nextjs-api.js
CHANGED
|
@@ -22,7 +22,7 @@ const API_PATH_PART = /^[a-zA-Z0-9:._\-$]+$/;
|
|
|
22
22
|
* Creates an API Gateway REST API for Next.js applications
|
|
23
23
|
*/
|
|
24
24
|
class NextjsApi extends constructs_1.Construct {
|
|
25
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsApi", version: "0.7.
|
|
25
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsApi", version: "0.7.6" };
|
|
26
26
|
/**
|
|
27
27
|
* The API Gateway REST API
|
|
28
28
|
*/
|
|
@@ -81,13 +81,6 @@ export interface NextjsFunctionGroupBehavior {
|
|
|
81
81
|
* natively, so it can only match the synth machine.
|
|
82
82
|
*/
|
|
83
83
|
export declare function deploymentArchitecture(props: NextjsBuildProps): Architecture;
|
|
84
|
-
/** {@link NextjsBuild.buildId}: Next.js's build ID, suffixed with the app's `deploymentId`. */
|
|
85
|
-
export declare function deploymentBuildId(manifest: {
|
|
86
|
-
readonly buildId: string;
|
|
87
|
-
readonly config: {
|
|
88
|
-
readonly deploymentId: string;
|
|
89
|
-
};
|
|
90
|
-
}): string;
|
|
91
84
|
export interface PublicDirEntry {
|
|
92
85
|
readonly name: string;
|
|
93
86
|
readonly isDirectory: boolean;
|