cdk-nextjs 0.6.2 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +2404 -2723
- package/.jsii.tabl.json +1 -1
- package/API.md +1681 -1930
- package/CLAUDE.md +2 -1
- package/README.md +429 -130
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +148 -169
- package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
- package/docs/adapter-runtime.md +185 -0
- package/docs/breaking-changes.md +667 -4
- package/docs/caching-guide.md +156 -112
- package/docs/cdk-nextjs-cfn-exec-policy.json +2 -1
- package/docs/development-guide.md +1 -1
- package/docs/harness-coverage.md +598 -0
- package/docs/init-cache-deployment.md +32 -1
- package/docs/next-build-output-guide.md +30 -20
- package/examples/README.md +5 -1
- package/lib/adapter/__fixtures__/app-playground-base-path.json +4926 -0
- package/lib/adapter/__fixtures__/app-playground.json +4917 -0
- package/lib/adapter/__fixtures__/pages-i18n.json +1728 -0
- package/lib/adapter/adapter.mjs +1551 -185
- package/lib/adapter/adapter.test.js +106 -0
- package/lib/adapter/aws-cache-store.d.ts +489 -0
- package/lib/adapter/aws-cache-store.js +1004 -0
- package/lib/adapter/aws-cache-store.test.d.ts +1 -0
- package/lib/adapter/aws-cache-store.test.js +361 -0
- package/lib/adapter/build-outputs.d.ts +80 -0
- package/lib/adapter/build-outputs.js +857 -0
- package/lib/adapter/build-outputs.test.d.ts +1 -0
- package/lib/adapter/build-outputs.test.js +863 -0
- package/lib/adapter/cache-handler.d.ts +9 -2
- package/lib/adapter/cache-handler.js +72 -96
- package/lib/adapter/cache-handler.mjs +18956 -17774
- package/lib/adapter/cache-handler.test.js +263 -31
- package/lib/adapter/cache-kinds.d.ts +32 -0
- package/lib/adapter/cache-kinds.js +35 -0
- package/lib/adapter/cache-kinds.test.d.ts +1 -0
- package/lib/adapter/cache-kinds.test.js +69 -0
- package/lib/adapter/cache-utils.d.ts +90 -0
- package/lib/adapter/cache-utils.js +199 -4
- package/lib/adapter/cache-utils.test.d.ts +1 -0
- package/lib/adapter/cache-utils.test.js +179 -0
- package/lib/adapter/function-groups.d.ts +215 -0
- package/lib/adapter/function-groups.js +1099 -0
- package/lib/adapter/function-groups.test.d.ts +1 -0
- package/lib/adapter/function-groups.test.js +743 -0
- package/lib/adapter/init-cache.d.ts +6 -0
- package/lib/adapter/init-cache.js +245 -0
- package/lib/adapter/init-cache.test.d.ts +1 -0
- package/lib/adapter/init-cache.test.js +137 -0
- package/lib/adapter/local-file-cache-handler.d.ts +23 -0
- package/lib/adapter/local-file-cache-handler.js +52 -1
- package/lib/adapter/memory-cache-handler.d.ts +26 -17
- package/lib/adapter/memory-cache-handler.js +32 -50
- package/lib/adapter/memory-cache-handler.test.js +105 -85
- package/lib/adapter/s3-cache-handler.d.ts +179 -40
- package/lib/adapter/s3-cache-handler.js +807 -277
- package/lib/adapter/s3-cache-handler.test.js +1186 -31
- package/lib/adapter/use-cache-common.d.ts +90 -0
- package/lib/adapter/use-cache-common.js +250 -0
- package/lib/adapter/use-cache-common.test.d.ts +1 -0
- package/lib/adapter/use-cache-common.test.js +646 -0
- package/lib/adapter/use-cache-default-handler.d.ts +24 -0
- package/lib/adapter/use-cache-default-handler.js +90 -0
- package/lib/adapter/use-cache-default-handler.mjs +38645 -0
- package/lib/adapter/use-cache-handlers.test.d.ts +1 -0
- package/lib/adapter/use-cache-handlers.test.js +349 -0
- package/lib/adapter/use-cache-remote-handler.d.ts +26 -0
- package/lib/adapter/use-cache-remote-handler.js +186 -0
- package/lib/{image-optimization/handler.mjs → adapter/use-cache-remote-handler.mjs} +33572 -38798
- package/lib/generated-structs/OptionalNextjsApiProps.d.ts +59 -0
- package/lib/generated-structs/OptionalNextjsApiProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsCacheProps.d.ts +15 -6
- package/lib/generated-structs/OptionalNextjsCacheProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +25 -11
- package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +31 -9
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +8 -0
- package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +6 -4
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +1 -1
- package/lib/index.d.ts +6 -7
- package/lib/index.js +2 -4
- package/lib/lambdas/post-deploy/prune-cache-bucket.d.ts +7 -3
- package/lib/lambdas/post-deploy/prune-cache-bucket.js +57 -71
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.js +114 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.js +23 -31
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +71 -0
- package/lib/lambdas/post-deploy/prune-s3.d.ts +14 -5
- package/lib/lambdas/post-deploy/prune-s3.js +41 -12
- package/lib/lambdas/post-deploy/prune-s3.test.js +97 -18
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.d.ts +13 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.js +55 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.d.ts +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.js +68 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.d.ts +20 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.js +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.d.ts +1 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.js +93 -0
- package/lib/nextjs-api.d.ts +102 -18
- package/lib/nextjs-api.js +338 -38
- package/lib/nextjs-api.test.js +537 -1
- package/lib/nextjs-build/global-containers.Dockerfile +15 -10
- package/lib/nextjs-build/nextjs-build.d.ts +339 -63
- package/lib/nextjs-build/nextjs-build.js +684 -327
- package/lib/nextjs-build/nextjs-build.test.d.ts +1 -0
- package/lib/nextjs-build/nextjs-build.test.js +412 -0
- package/lib/nextjs-build/patch-fetch.js +1 -1
- package/lib/nextjs-build/patch-fetch.test.js +166 -11
- package/lib/nextjs-build/regional-containers.Dockerfile +17 -10
- package/lib/nextjs-cache.d.ts +82 -4
- package/lib/nextjs-cache.js +186 -10
- package/lib/nextjs-cache.test.js +176 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +21 -8
- package/lib/nextjs-compute/nextjs-compute-base-props.js +41 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-compute-base-props.test.js +44 -0
- package/lib/nextjs-compute/nextjs-containers.d.ts +19 -0
- package/lib/nextjs-compute/nextjs-containers.js +57 -20
- package/lib/nextjs-compute/nextjs-functions.d.ts +122 -7
- package/lib/nextjs-compute/nextjs-functions.js +113 -67
- package/lib/nextjs-compute/nextjs-functions.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-functions.test.js +99 -0
- package/lib/nextjs-distribution.d.ts +194 -23
- package/lib/nextjs-distribution.js +535 -62
- package/lib/nextjs-distribution.test.d.ts +1 -0
- package/lib/nextjs-distribution.test.js +697 -0
- package/lib/nextjs-post-deploy.d.ts +13 -5
- package/lib/nextjs-post-deploy.js +13 -10
- package/lib/nextjs-post-deploy.test.d.ts +1 -0
- package/lib/nextjs-post-deploy.test.js +34 -0
- package/lib/nextjs-static-assets.d.ts +17 -4
- package/lib/nextjs-static-assets.js +22 -5
- package/lib/root-constructs/nextjs-base-construct.d.ts +102 -58
- package/lib/root-constructs/nextjs-base-construct.js +139 -47
- package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
- package/lib/root-constructs/nextjs-global-containers.js +20 -71
- package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
- package/lib/root-constructs/nextjs-global-functions.js +52 -70
- package/lib/root-constructs/nextjs-regional-containers.d.ts +18 -5
- package/lib/root-constructs/nextjs-regional-containers.js +8 -15
- package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
- package/lib/root-constructs/nextjs-regional-functions.js +8 -26
- package/lib/runtime/api-gateway-path.d.ts +34 -0
- package/lib/runtime/api-gateway-path.js +71 -0
- package/lib/runtime/api-gateway-path.test.d.ts +1 -0
- package/lib/runtime/api-gateway-path.test.js +65 -0
- package/lib/runtime/case-redirect.d.ts +22 -0
- package/lib/runtime/case-redirect.js +63 -0
- package/lib/runtime/case-redirect.test.d.ts +1 -0
- package/lib/runtime/case-redirect.test.js +32 -0
- package/lib/runtime/core.d.ts +234 -0
- package/lib/runtime/core.js +1216 -0
- package/lib/runtime/core.test.d.ts +1 -0
- package/lib/runtime/core.test.js +1686 -0
- package/lib/runtime/deployment-root.d.ts +13 -0
- package/lib/runtime/deployment-root.js +29 -0
- package/lib/runtime/dispatch.d.ts +331 -0
- package/lib/runtime/dispatch.js +751 -0
- package/lib/runtime/dispatch.test.d.ts +1 -0
- package/lib/runtime/dispatch.test.js +853 -0
- package/lib/runtime/entrypoints.d.ts +57 -0
- package/lib/runtime/entrypoints.js +115 -0
- package/lib/runtime/http/abort-signal.d.ts +6 -0
- package/lib/runtime/http/abort-signal.js +19 -0
- package/lib/runtime/http/abort-signal.test.d.ts +1 -0
- package/lib/runtime/http/abort-signal.test.js +49 -0
- package/lib/runtime/http/node-server.d.ts +38 -0
- package/lib/runtime/http/node-server.js +99 -0
- package/lib/runtime/http/node-server.test.d.ts +1 -0
- package/lib/runtime/http/node-server.test.js +96 -0
- package/lib/runtime/http/node-sink.d.ts +16 -0
- package/lib/runtime/http/node-sink.js +48 -0
- package/lib/runtime/http/node-sink.test.d.ts +1 -0
- package/lib/runtime/http/node-sink.test.js +66 -0
- package/lib/runtime/http/request.d.ts +62 -0
- package/lib/runtime/http/request.js +134 -0
- package/lib/runtime/http/request.test.d.ts +1 -0
- package/lib/runtime/http/request.test.js +103 -0
- package/lib/runtime/http/response.d.ts +77 -0
- package/lib/runtime/http/response.js +229 -0
- package/lib/runtime/http/response.test.d.ts +1 -0
- package/lib/runtime/http/response.test.js +178 -0
- package/lib/runtime/http/sink.d.ts +73 -0
- package/lib/runtime/http/sink.js +188 -0
- package/lib/runtime/http/sink.test.d.ts +1 -0
- package/lib/runtime/http/sink.test.js +257 -0
- package/lib/runtime/image-utils.d.ts +78 -0
- package/lib/runtime/image-utils.js +129 -0
- package/lib/runtime/image-utils.test.d.ts +1 -0
- package/lib/runtime/image-utils.test.js +237 -0
- package/lib/runtime/image.d.ts +76 -0
- package/lib/runtime/image.js +296 -0
- package/lib/runtime/image.test.d.ts +1 -0
- package/lib/runtime/image.test.js +405 -0
- package/lib/runtime/lambda-event.d.ts +4 -0
- package/lib/runtime/lambda-event.js +113 -0
- package/lib/runtime/lambda-event.test.d.ts +1 -0
- package/lib/runtime/lambda-event.test.js +119 -0
- package/lib/runtime/lambda.mjs +41600 -0
- package/lib/runtime/load-module.d.ts +8 -0
- package/lib/runtime/load-module.js +35 -0
- package/lib/runtime/manifest.d.ts +215 -0
- package/lib/runtime/manifest.js +118 -0
- package/lib/runtime/middleware.d.ts +43 -0
- package/lib/runtime/middleware.js +113 -0
- package/lib/runtime/middleware.test.d.ts +1 -0
- package/lib/runtime/middleware.test.js +259 -0
- package/lib/runtime/next-modules.d.ts +71 -0
- package/lib/runtime/next-modules.js +144 -0
- package/lib/runtime/next-modules.test.d.ts +1 -0
- package/lib/runtime/next-modules.test.js +34 -0
- package/lib/runtime/public-files.d.ts +32 -0
- package/lib/runtime/public-files.js +117 -0
- package/lib/runtime/public-files.test.d.ts +1 -0
- package/lib/runtime/public-files.test.js +97 -0
- package/lib/runtime/server.mjs +41593 -0
- package/lib/runtime/static-files.d.ts +50 -0
- package/lib/runtime/static-files.js +266 -0
- package/lib/runtime/static-files.test.d.ts +1 -0
- package/lib/runtime/static-files.test.js +118 -0
- package/lib/runtime/util.d.ts +28 -0
- package/lib/runtime/util.js +79 -0
- package/lib/utils/base-path.d.ts +106 -13
- package/lib/utils/base-path.js +254 -41
- package/lib/utils/base-path.test.js +219 -51
- package/lib/utils/get-architecture.d.ts +7 -8
- package/lib/utils/get-architecture.js +12 -13
- package/lib/utils/zip-directory.d.ts +14 -0
- package/lib/utils/zip-directory.js +121 -0
- package/lib/utils/zip-directory.test.d.ts +1 -0
- package/lib/utils/zip-directory.test.js +99 -0
- package/package.json +22 -3
- package/scripts/capture-adapter-fixture.mjs +325 -0
- package/scripts/e2e-deploy.sh +398 -0
- package/scripts/e2e-harness/README.md +707 -0
- package/scripts/e2e-harness/app.js +370 -0
- package/scripts/e2e-harness/common.sh +249 -0
- package/scripts/e2e-harness/screen.mjs +302 -0
- package/scripts/e2e-harness/stage-proxy.mjs +145 -0
- package/scripts/e2e-harness/type-filters.mjs +47 -0
- package/scripts/e2e-logs.sh +75 -0
- package/scripts/e2e-offline.sh +91 -0
- package/scripts/e2e-sweep.sh +370 -0
- package/scripts/e2e-warm.sh +114 -0
- package/scripts/zero-config-build.mjs +418 -0
- package/docs/1k-concurrent-users-executions.png +0 -0
- package/docs/plans/adapter-runtime-release.md +0 -362
- package/docs/plans/phase-0-image-function-opt-in.md +0 -295
- package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +0 -425
- package/lib/generated-structs/OptionalDockerImageFunctionProps.js +0 -3
- package/lib/image-optimization/handler-utils.d.ts +0 -34
- package/lib/image-optimization/handler-utils.js +0 -83
- package/lib/image-optimization/handler-utils.test.js +0 -178
- package/lib/nextjs-build/functions.Dockerfile +0 -31
- package/lib/nextjs-compute/nextjs-image-function.d.ts +0 -53
- package/lib/nextjs-compute/nextjs-image-function.js +0 -59
- package/lib/utils/experimental-flags.d.ts +0 -24
- package/lib/utils/experimental-flags.js +0 -30
- /package/lib/{image-optimization/handler-utils.test.d.ts → adapter/adapter.test.d.ts} +0 -0
|
@@ -10,89 +10,75 @@ const client_s3_1 = require("@aws-sdk/client-s3");
|
|
|
10
10
|
const debug_1 = __importDefault(require("debug"));
|
|
11
11
|
const debug = (0, debug_1.default)("cdk-nextjs:post-deploy:prune-cache-bucket");
|
|
12
12
|
const s3Client = new client_s3_1.S3Client();
|
|
13
|
+
const PRUNE_BUDGET_MS = 3 * 60_000;
|
|
13
14
|
/**
|
|
14
|
-
* Given `bucketName` and `currentBuildId`,
|
|
15
|
-
*
|
|
16
|
-
*
|
|
15
|
+
* Given `bucketName` and `currentBuildId`, delete every cache object that isn't
|
|
16
|
+
* under the current build's `{buildId}/` prefix (no leading slash).
|
|
17
|
+
*
|
|
18
|
+
* The top level is listed with a delimiter, so the current build, which can
|
|
19
|
+
* hold any number of `'use cache: remote'` entries, is never walked. Each old
|
|
20
|
+
* build prefix is then listed and deleted page by page. Top-level keys outside
|
|
21
|
+
* any build prefix (legacy objects) are deleted too.
|
|
17
22
|
*/
|
|
18
23
|
async function pruneCacheBucket(props) {
|
|
19
24
|
const { bucketName, currentBuildId } = props;
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
let
|
|
25
|
+
const deadline = Date.now() + PRUNE_BUDGET_MS;
|
|
26
|
+
const oldPrefixes = [];
|
|
27
|
+
let deleted = 0;
|
|
28
|
+
let continuationToken;
|
|
23
29
|
do {
|
|
24
|
-
|
|
25
|
-
const listObjectsV2Input = {
|
|
30
|
+
const page = await s3Client.send(new client_s3_1.ListObjectsV2Command({
|
|
26
31
|
Bucket: bucketName,
|
|
32
|
+
Delimiter: "/",
|
|
27
33
|
ContinuationToken: continuationToken,
|
|
28
|
-
};
|
|
29
|
-
const
|
|
30
|
-
|
|
31
|
-
|
|
34
|
+
}));
|
|
35
|
+
for (const { Prefix } of page.CommonPrefixes ?? []) {
|
|
36
|
+
if (Prefix && Prefix !== `${currentBuildId}/`)
|
|
37
|
+
oldPrefixes.push(Prefix);
|
|
32
38
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const objectBuildId = buildIdMatch[1]; // Extract BUILD_ID from capture group
|
|
44
|
-
// Delete if it's not the current build ID
|
|
45
|
-
return objectBuildId !== currentBuildId;
|
|
39
|
+
deleted += await deleteObjects(bucketName, page.Contents);
|
|
40
|
+
continuationToken = page.NextContinuationToken;
|
|
41
|
+
} while (continuationToken);
|
|
42
|
+
debug(`Found ${oldPrefixes.length} old build prefixes to delete`);
|
|
43
|
+
for (const [i, prefix] of oldPrefixes.entries()) {
|
|
44
|
+
continuationToken = undefined;
|
|
45
|
+
do {
|
|
46
|
+
if (Date.now() > deadline) {
|
|
47
|
+
console.warn(`Cache bucket pruning stopped at its time budget after deleting ${deleted} objects; ${oldPrefixes.length - i} old build prefixes are left for the next deploy`);
|
|
48
|
+
return;
|
|
46
49
|
}
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
.map((obj) => ({ Key: obj.Key })));
|
|
56
|
-
if (listResponse.NextContinuationToken) {
|
|
57
|
-
continuationToken = listResponse.NextContinuationToken;
|
|
58
|
-
}
|
|
59
|
-
listObjectsCount++;
|
|
60
|
-
// assume less than 100K objects (100 * 1K objects per ListObjectsV2Command = 100K)
|
|
61
|
-
} while (continuationToken && listObjectsCount <= 100);
|
|
62
|
-
// Delete objects in parallel batches (respecting S3's 1000 objects per request limit)
|
|
63
|
-
if (objectsToDelete.length > 0) {
|
|
64
|
-
const deleteBatches = [];
|
|
65
|
-
for (let i = 0; i < objectsToDelete.length; i += 1000) {
|
|
66
|
-
const batch = objectsToDelete.slice(i, i + 1000);
|
|
67
|
-
deleteBatches.push(batch);
|
|
68
|
-
}
|
|
69
|
-
await processBatch(deleteBatches, 5, // Process up to 5 delete batches in parallel
|
|
70
|
-
async (batch) => {
|
|
71
|
-
try {
|
|
72
|
-
debug(`Deleting cache objects: ${batch.map((b) => b.Key)} from ${bucketName}`);
|
|
73
|
-
await s3Client.send(new client_s3_1.DeleteObjectsCommand({
|
|
74
|
-
Bucket: bucketName,
|
|
75
|
-
Delete: { Objects: batch },
|
|
76
|
-
}));
|
|
77
|
-
debug(`Deleted ${batch.length} cache objects from ${bucketName}`);
|
|
78
|
-
}
|
|
79
|
-
catch (error) {
|
|
80
|
-
console.error("Error deleting cache objects:", error);
|
|
81
|
-
}
|
|
82
|
-
});
|
|
50
|
+
const page = await s3Client.send(new client_s3_1.ListObjectsV2Command({
|
|
51
|
+
Bucket: bucketName,
|
|
52
|
+
Prefix: prefix,
|
|
53
|
+
ContinuationToken: continuationToken,
|
|
54
|
+
}));
|
|
55
|
+
deleted += await deleteObjects(bucketName, page.Contents);
|
|
56
|
+
continuationToken = page.NextContinuationToken;
|
|
57
|
+
} while (continuationToken);
|
|
83
58
|
}
|
|
84
|
-
debug(`Cache bucket pruning complete. Deleted ${
|
|
59
|
+
debug(`Cache bucket pruning complete. Deleted ${deleted} objects from ${bucketName}`);
|
|
85
60
|
}
|
|
86
61
|
/**
|
|
87
|
-
*
|
|
62
|
+
* Delete one listed page of objects. ListObjectsV2 returns at most 1000 keys a
|
|
63
|
+
* page, which is also the DeleteObjects limit, so a page is one request.
|
|
64
|
+
* Returns how many objects were sent for deletion.
|
|
88
65
|
*/
|
|
89
|
-
async function
|
|
90
|
-
const
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
66
|
+
async function deleteObjects(bucketName, contents = []) {
|
|
67
|
+
const objects = contents
|
|
68
|
+
.filter((obj) => obj.Key)
|
|
69
|
+
.map((obj) => ({ Key: obj.Key }));
|
|
70
|
+
if (objects.length === 0)
|
|
71
|
+
return 0;
|
|
72
|
+
try {
|
|
73
|
+
debug(`Deleting cache objects: ${objects.map((o) => o.Key)} from ${bucketName}`);
|
|
74
|
+
await s3Client.send(new client_s3_1.DeleteObjectsCommand({
|
|
75
|
+
Bucket: bucketName,
|
|
76
|
+
Delete: { Objects: objects },
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error("Error deleting cache objects:", error);
|
|
95
81
|
}
|
|
96
|
-
return
|
|
82
|
+
return objects.length;
|
|
97
83
|
}
|
|
98
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJ1bmUtY2FjaGUtYnVja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xhbWJkYXMvcG9zdC1kZXBsb3kvcHJ1bmUtY2FjaGUtYnVja2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBd0JBLDRDQTZGQztBQXJIRCw2REFBNkQ7QUFDN0Qsa0RBSzRCO0FBQzVCLDZEQUE2RDtBQUM3RCxrREFBNkI7QUFFN0IsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFRLEVBQUMsMkNBQTJDLENBQUMsQ0FBQztBQUVwRSxNQUFNLFFBQVEsR0FBRyxJQUFJLG9CQUFRLEVBQUUsQ0FBQztBQU9oQzs7OztHQUlHO0FBQ0ksS0FBSyxVQUFVLGdCQUFnQixDQUFDLEtBQTRCO0lBQ2pFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBRTdDLE1BQU0sZUFBZSxHQUFzQixFQUFFLENBQUM7SUFDOUMsSUFBSSxpQkFBaUIsR0FBdUIsU0FBUyxDQUFDO0lBQ3RELElBQUksZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDO0lBRXpCLEdBQUcsQ0FBQztRQUNGLDZCQUE2QjtRQUM3QixNQUFNLGtCQUFrQixHQUE4QjtZQUNwRCxNQUFNLEVBQUUsVUFBVTtZQUNsQixpQkFBaUIsRUFBRSxpQkFBaUI7U0FDckMsQ0FBQztRQUNGLE1BQU0sWUFBWSxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksQ0FDdEMsSUFBSSxnQ0FBb0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUM3QyxDQUFDO1FBRUYsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDakUsTUFBTTtRQUNSLENBQUM7UUFFRCxpREFBaUQ7UUFDakQsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUMzRCxJ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QUFNLE9BQU8sR0FBUSxFQUFFLENBQUM7SUFFeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUM1QyxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzdELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCB7XG4gIFMzQ2xpZW50LFxuICBMaXN0T2JqZWN0c1YyQ29tbWFuZCxcbiAgRGVsZXRlT2JqZWN0c0NvbW1hbmQsXG4gIExpc3RPYmplY3RzVjJDb21tYW5kSW5wdXQsXG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCBnZXREZWJ1ZyBmcm9tIFwiZGVidWdcIjtcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZyhcImNkay1uZXh0anM6cG9zdC1kZXBsb3k6cHJ1bmUtY2FjaGUtYnVja2V0XCIpO1xuXG5jb25zdCBzM0NsaWVudCA9IG5ldyBTM0NsaWVudCgpO1xuXG5pbnRlcmZhY2UgUHJ1bmVDYWNoZUJ1Y2tldFByb3BzIHtcbiAgYnVja2V0TmFtZTogc3RyaW5nO1xuICBjdXJyZW50QnVpbGRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEdpdmVuIGBidWNrZXROYW1lYCBhbmQgYGN1cnJlbnRCdWlsZElkYCwgbGlzdCBhbGwgb2JqZWN0cyBpbiB0aGUgY2FjaGUgYnVja2V0XG4gKiBhbmQgZGVsZXRlIGFueSB0aGF0IGhhdmUgQlVJTERfSUQgcHJlZml4ZXMgdGhhdCBkb24ndCBtYXRjaCB0aGUgY3VycmVudCBidWlsZCBJRC5cbiAqIENhY2hlIG9iamVjdHMgYXJlIHByZWZpeGVkIHdpdGgge2J1aWxkSWR9LyBwYXR0ZXJuIChubyBsZWFkaW5nIHNsYXNoKS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBydW5lQ2FjaGVCdWNrZXQocHJvcHM6IFBydW5lQ2FjaGVCdWNrZXRQcm9wcykge1xuICBjb25zdCB7IGJ1Y2tldE5hbWUsIGN1cnJlbnRCdWlsZElkIH0gPSBwcm9wcztcblxuICBjb25zdCBvYmplY3RzVG9EZWxldGU6IHsgS2V5OiBzdHJpbmcgfVtdID0gW107XG4gIGxldCBjb250aW51YXRpb25Ub2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBsZXQgbGlzdE9iamVjdHNDb3VudCA9IDA7XG5cbiAgZG8ge1xuICAgIC8vIExpc3Qgb2JqZWN0cyBpbiB0aGUgYnVja2V0XG4gICAgY29uc3QgbGlzdE9iamVjdHNWMklucHV0OiBMaXN0T2JqZWN0c1YyQ29tbWFuZElucHV0ID0ge1xuICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgQ29udGludWF0aW9uVG9rZW46IGNvbnRpbnVhdGlvblRva2VuLFxuICAgIH07XG4gICAgY29uc3QgbGlzdFJlc3BvbnNlID0gYXdhaXQgczNDbGllbnQuc2VuZChcbiAgICAgIG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZChsaXN0T2JqZWN0c1YySW5wdXQpLFxuICAgICk7XG5cbiAgICBpZiAoIWxpc3RSZXNwb25zZS5Db250ZW50cyB8fCBsaXN0UmVzcG9uc2UuQ29udGVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBGaWx0ZXIgb2JqZWN0cyB0aGF0IGhhdmUgb2xkIEJVSUxEX0lEIHByZWZpeGVzXG4gICAgY29uc3Qgb2xkQ2FjaGVPYmplY3RzID0gbGlzdFJlc3BvbnNlLkNvbnRlbnRzLmZpbHRlcigob2JqKSA9PiB7XG4gICAgICBpZiAoIW9iai5LZXkpIHJldHVybiBmYWxzZTtcblxuICAgICAgLy8gQ2hlY2sgaWYgdGhlIG9iamVjdCBrZXkgc3RhcnRzIHdpdGggYSBCVUlMRF9JRCBwcmVmaXggcGF0dGVyblxuICAgICAgLy8gRXhwZWN0ZWQgcGF0dGVybjoge2J1aWxkSWR9LyogKGJ1aWxkSWQgZm9sbG93ZWQgYnkgc2xhc2gsIG5vIGxlYWRpbmcgc2xhc2gpXG4gICAgICAvLyBSZWdleCAvXihbXlxcL10rKVxcLy8gbWF0Y2hlczogQlVJTERfSUQvLi4uIGFuZCBjYXB0dXJlcyBCVUlMRF9JRCBpbiBncm91cCAxXG4gICAgICAvLyBFeGFtcGxlOiBcImFiYzEyM2RlZjQ1Ni9wYWdlcy9pbmRleC5odG1sXCIgY2FwdHVyZXMgXCJhYmMxMjNkZWY0NTZcIlxuICAgICAgY29uc3QgYnVpbGRJZE1hdGNoID0gb2JqLktleS5tYXRjaCgvXihbXlxcL10rKVxcLy8pO1xuICAgICAgaWYgKGJ1aWxkSWRNYXRjaCkge1xuICAgICAgICBjb25zdCBvYmplY3RCdWlsZElkID0gYnVpbGRJZE1hdGNoWzFdOyAvLyBFeHRyYWN0IEJVSUxEX0lEIGZyb20gY2FwdHVyZSBncm91cFxuICAgICAgICAvLyBEZWxldGUgaWYgaXQncyBub3QgdGhlIGN1cnJlbnQgYnVpbGQgSURcbiAgICAgICAgcmV0dXJuIG9iamVjdEJ1aWxkSWQgIT09IGN1cnJlbnRCdWlsZElkO1xuICAgICAgfVxuXG4gICAgICAvLyBBbHNvIGRlbGV0ZSBvYmplY3RzIHRoYXQgZG9uJ3QgZm9sbG93IHRoZSBCVUlMRF9JRCBwcmVmaXggcGF0dGVyblxuICAgICAgLy8gVGhlc2UgbWlnaHQgYmUgbGVnYWN5IGNhY2hlIG9iamVjdHMgb3Igb2JqZWN0cyB3aXRoIGxlYWRpbmcgc2xhc2hlc1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICBkZWJ1ZyhcbiAgICAgIGBGb3VuZCAke29sZENhY2hlT2JqZWN0cy5sZW5ndGh9IGNhY2hlIG9iamVjdHMgd2l0aCBvbGQgQlVJTERfSUQgcHJlZml4ZXMgdG8gZGVsZXRlYCxcbiAgICApO1xuXG4gICAgLy8gQWRkIG9iamVjdHMgdG8gZGVsZXRlIGxpc3RcbiAgICBvYmplY3RzVG9EZWxldGUucHVzaChcbiAgICAgIC4uLm9sZENhY2hlT2JqZWN0c1xuICAgICAgICAuZmlsdGVyKChvYmopID0+IG9iai5LZXkpXG4gICAgICAgIC5tYXAoKG9iaikgPT4gKHsgS2V5OiBvYmouS2V5ISB9KSksXG4gICAgKTtcblxuICAgIGlmIChsaXN0UmVzcG9uc2UuTmV4dENvbnRpbnVhdGlvblRva2VuKSB7XG4gICAgICBjb250aW51YXRpb25Ub2tlbiA9IGxpc3RSZXNwb25zZS5OZXh0Q29udGludWF0aW9uVG9rZW47XG4gICAgfVxuICAgIGxpc3RPYmplY3RzQ291bnQrKztcbiAgICAvLyBhc3N1bWUgbGVzcyB0aGFuIDEwMEsgb2JqZWN0cyAoMTAwICogMUsgb2JqZWN0cyBwZXIgTGlzdE9iamVjdHNWMkNvbW1hbmQgPSAxMDBLKVxuICB9IHdoaWxlIChjb250aW51YXRpb25Ub2tlbiAmJiBsaXN0T2JqZWN0c0NvdW50IDw9IDEwMCk7XG5cbiAgLy8gRGVsZXRlIG9iamVjdHMgaW4gcGFyYWxsZWwgYmF0Y2hlcyAocmVzcGVjdGluZyBTMydzIDEwMDAgb2JqZWN0cyBwZXIgcmVxdWVzdCBsaW1pdClcbiAgaWYgKG9iamVjdHNUb0RlbGV0ZS5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgZGVsZXRlQmF0Y2hlcyA9IFtdO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmplY3RzVG9EZWxldGUubGVuZ3RoOyBpICs9IDEwMDApIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gb2JqZWN0c1RvRGVsZXRlLnNsaWNlKGksIGkgKyAxMDAwKTtcbiAgICAgIGRlbGV0ZUJhdGNoZXMucHVzaChiYXRjaCk7XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvY2Vzc0JhdGNoKFxuICAgICAgZGVsZXRlQmF0Y2hlcyxcbiAgICAgIDUsIC8vIFByb2Nlc3MgdXAgdG8gNSBkZWxldGUgYmF0Y2hlcyBpbiBwYXJhbGxlbFxuICAgICAgYXN5bmMgKGJhdGNoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZGVidWcoXG4gICAgICAgICAgICBgRGVsZXRpbmcgY2FjaGUgb2JqZWN0czogJHtiYXRjaC5tYXAoKGIpID0+IGIuS2V5KX0gZnJvbSAke2J1Y2tldE5hbWV9YCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IHMzQ2xpZW50LnNlbmQoXG4gICAgICAgICAgICBuZXcgRGVsZXRlT2JqZWN0c0NvbW1hbmQoe1xuICAgICAgICAgICAgICBCdWNrZXQ6IGJ1Y2tldE5hbWUsXG4gICAgICAgICAgICAgIERlbGV0ZTogeyBPYmplY3RzOiBiYXRjaCB9LFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBkZWJ1ZyhgRGVsZXRlZCAke2JhdGNoLmxlbmd0aH0gY2FjaGUgb2JqZWN0cyBmcm9tICR7YnVja2V0TmFtZX1gKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZGVsZXRpbmcgY2FjaGUgb2JqZWN0czpcIiwgZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBkZWJ1ZyhcbiAgICBgQ2FjaGUgYnVja2V0IHBydW5pbmcgY29tcGxldGUuIERlbGV0ZWQgJHtvYmplY3RzVG9EZWxldGUubGVuZ3RofSBvYmplY3RzIGZyb20gJHtidWNrZXROYW1lfWAsXG4gICk7XG59XG5cbi8qKlxuICogUHJvY2VzcyBvYmplY3RzIGluIGJhdGNoZXMgdG8gYXZvaWQgb3ZlcndoZWxtaW5nIHRoZSBzeXN0ZW1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0JhdGNoPFQsIFI+KFxuICBpdGVtczogVFtdLFxuICBiYXRjaFNpemU6IG51bWJlcixcbiAgcHJvY2Vzc0ZuOiAoaXRlbTogVCkgPT4gUHJvbWlzZTxSPixcbik6IFByb21pc2U8UltdPiB7XG4gIGNvbnN0IHJlc3VsdHM6IFJbXSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpICs9IGJhdGNoU2l6ZSkge1xuICAgIGNvbnN0IGJhdGNoID0gaXRlbXMuc2xpY2UoaSwgaSArIGJhdGNoU2l6ZSk7XG4gICAgY29uc3QgYmF0Y2hSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoYmF0Y2gubWFwKHByb2Nlc3NGbikpO1xuICAgIHJlc3VsdHMucHVzaCguLi5iYXRjaFJlc3VsdHMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdHM7XG59XG4iXX0=
|
|
84
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJ1bmUtY2FjaGUtYnVja2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xhbWJkYXMvcG9zdC1kZXBsb3kvcHJ1bmUtY2FjaGUtYnVja2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBK0JBLDRDQWdEQztBQS9FRCw2REFBNkQ7QUFDN0Qsa0RBTTRCO0FBQzVCLDZEQUE2RDtBQUM3RCxrREFBNkI7QUFFN0IsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFRLEVBQUMsMkNBQTJDLENBQUMsQ0FBQztBQUVwRSxNQUFNLFFBQVEsR0FBRyxJQUFJLG9CQUFRLEVBQUUsQ0FBQztBQUVoQyxNQUFNLGVBQWUsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDO0FBT25DOzs7Ozs7OztHQVFHO0FBQ0ksS0FBSyxVQUFVLGdCQUFnQixDQUFDLEtBQTRCO0lBQ2pFLE1BQU0sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBQzdDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxlQUFlLENBQUM7SUFFOUMsTUFBTSxXQUFXLEdBQWEsRUFBRSxDQUFDO0lBQ2pDLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztJQUNoQixJQUFJLGlCQUFxQyxDQUFDO0lBQzFDLEdBQUcsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUErQixNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQzFELElBQUksZ0NBQW9CLENBQUM7WUFDdkIsTUFBTSxFQUFFLFVBQVU7WUFDbEIsU0FBUyxFQUFFLEdBQUc7WUFDZCxpQkFBaUIsRUFBRSxpQkFBaUI7U0FDckMsQ0FBQyxDQUNILENBQUM7UUFDRixLQUFLLE1BQU0sRUFBRSxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ25ELElBQUksTUFBTSxJQUFJLE1BQU0sS0FBSyxHQUFHLGNBQWMsR0FBRztnQkFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFDRCxPQUFPLElBQUksTUFBTSxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxRCxpQkFBaUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7SUFDakQsQ0FBQyxRQUFRLGlCQUFpQixFQUFFO0lBRTVCLEtBQUssQ0FBQyxTQUFTLFdBQVcsQ0FBQyxNQUFNLCtCQUErQixDQUFDLENBQUM7SUFFbEUsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ2hELGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUM5QixHQUFHLENBQUM7WUFDRixJQUFJLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxRQUFRLEVBQUUsQ0FBQztnQkFDMUIsT0FBTyxDQUFDLElBQUksQ0FDVixrRUFBa0UsT0FBTyxhQUFhLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxrREFBa0QsQ0FDL0osQ0FBQztnQkFDRixPQUFPO1lBQ1QsQ0FBQztZQUNELE1BQU0sSUFBSSxHQUErQixNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQzFELElBQUksZ0NBQW9CLENBQUM7Z0JBQ3ZCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixNQUFNLEVBQUUsTUFBTTtnQkFDZCxpQkFBaUIsRUFBRSxpQkFBaUI7YUFDckMsQ0FBQyxDQUNILENBQUM7WUFDRixPQUFPLElBQUksTUFBTSxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxRCxpQkFBaUIsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUM7UUFDakQsQ0FBQyxRQUFRLGlCQUFpQixFQUFFO0lBQzlCLENBQUM7SUFFRCxLQUFLLENBQ0gsMENBQTBDLE9BQU8saUJBQWlCLFVBQVUsRUFBRSxDQUMvRSxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxLQUFLLFVBQVUsYUFBYSxDQUFDLFVBQWtCLEVBQUUsV0FBc0IsRUFBRTtJQUN2RSxNQUFNLE9BQU8sR0FBRyxRQUFRO1NBQ3JCLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztTQUN4QixHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyQyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLElBQUksQ0FBQztRQUNILEtBQUssQ0FDSCwyQkFBMkIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLFVBQVUsRUFBRSxDQUMxRSxDQUFDO1FBQ0YsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUNqQixJQUFJLGdDQUFvQixDQUFDO1lBQ3ZCLE1BQU0sRUFBRSxVQUFVO1lBQ2xCLE1BQU0sRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUU7U0FDN0IsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0JBQStCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llc1xuaW1wb3J0IHtcbiAgUzNDbGllbnQsXG4gIExpc3RPYmplY3RzVjJDb21tYW5kLFxuICBMaXN0T2JqZWN0c1YyQ29tbWFuZE91dHB1dCxcbiAgRGVsZXRlT2JqZWN0c0NvbW1hbmQsXG4gIF9PYmplY3QsXG59IGZyb20gXCJAYXdzLXNkay9jbGllbnQtczNcIjtcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCBnZXREZWJ1ZyBmcm9tIFwiZGVidWdcIjtcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZyhcImNkay1uZXh0anM6cG9zdC1kZXBsb3k6cHJ1bmUtY2FjaGUtYnVja2V0XCIpO1xuXG5jb25zdCBzM0NsaWVudCA9IG5ldyBTM0NsaWVudCgpO1xuXG5jb25zdCBQUlVORV9CVURHRVRfTVMgPSAzICogNjBfMDAwO1xuXG5pbnRlcmZhY2UgUHJ1bmVDYWNoZUJ1Y2tldFByb3BzIHtcbiAgYnVja2V0TmFtZTogc3RyaW5nO1xuICBjdXJyZW50QnVpbGRJZDogc3RyaW5nO1xufVxuXG4vKipcbiAqIEdpdmVuIGBidWNrZXROYW1lYCBhbmQgYGN1cnJlbnRCdWlsZElkYCwgZGVsZXRlIGV2ZXJ5IGNhY2hlIG9iamVjdCB0aGF0IGlzbid0XG4gKiB1bmRlciB0aGUgY3VycmVudCBidWlsZCdzIGB7YnVpbGRJZH0vYCBwcmVmaXggKG5vIGxlYWRpbmcgc2xhc2gpLlxuICpcbiAqIFRoZSB0b3AgbGV2ZWwgaXMgbGlzdGVkIHdpdGggYSBkZWxpbWl0ZXIsIHNvIHRoZSBjdXJyZW50IGJ1aWxkLCB3aGljaCBjYW5cbiAqIGhvbGQgYW55IG51bWJlciBvZiBgJ3VzZSBjYWNoZTogcmVtb3RlJ2AgZW50cmllcywgaXMgbmV2ZXIgd2Fsa2VkLiBFYWNoIG9sZFxuICogYnVpbGQgcHJlZml4IGlzIHRoZW4gbGlzdGVkIGFuZCBkZWxldGVkIHBhZ2UgYnkgcGFnZS4gVG9wLWxldmVsIGtleXMgb3V0c2lkZVxuICogYW55IGJ1aWxkIHByZWZpeCAobGVnYWN5IG9iamVjdHMpIGFyZSBkZWxldGVkIHRvby5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBydW5lQ2FjaGVCdWNrZXQocHJvcHM6IFBydW5lQ2FjaGVCdWNrZXRQcm9wcykge1xuICBjb25zdCB7IGJ1Y2tldE5hbWUsIGN1cnJlbnRCdWlsZElkIH0gPSBwcm9wcztcbiAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgUFJVTkVfQlVER0VUX01TO1xuXG4gIGNvbnN0IG9sZFByZWZpeGVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgZGVsZXRlZCA9IDA7XG4gIGxldCBjb250aW51YXRpb25Ub2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBkbyB7XG4gICAgY29uc3QgcGFnZTogTGlzdE9iamVjdHNWMkNvbW1hbmRPdXRwdXQgPSBhd2FpdCBzM0NsaWVudC5zZW5kKFxuICAgICAgbmV3IExpc3RPYmplY3RzVjJDb21tYW5kKHtcbiAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICBEZWxpbWl0ZXI6IFwiL1wiLFxuICAgICAgICBDb250aW51YXRpb25Ub2tlbjogY29udGludWF0aW9uVG9rZW4sXG4gICAgICB9KSxcbiAgICApO1xuICAgIGZvciAoY29uc3QgeyBQcmVmaXggfSBvZiBwYWdlLkNvbW1vblByZWZpeGVzID8/IFtdKSB7XG4gICAgICBpZiAoUHJlZml4ICYmIFByZWZpeCAhPT0gYCR7Y3VycmVudEJ1aWxkSWR9L2ApIG9sZFByZWZpeGVzLnB1c2goUHJlZml4KTtcbiAgICB9XG4gICAgZGVsZXRlZCArPSBhd2FpdCBkZWxldGVPYmplY3RzKGJ1Y2tldE5hbWUsIHBhZ2UuQ29udGVudHMpO1xuICAgIGNvbnRpbnVhdGlvblRva2VuID0gcGFnZS5OZXh0Q29udGludWF0aW9uVG9rZW47XG4gIH0gd2hpbGUgKGNvbnRpbnVhdGlvblRva2VuKTtcblxuICBkZWJ1ZyhgRm91bmQgJHtvbGRQcmVmaXhlcy5sZW5ndGh9IG9sZCBidWlsZCBwcmVmaXhlcyB0byBkZWxldGVgKTtcblxuICBmb3IgKGNvbnN0IFtpLCBwcmVmaXhdIG9mIG9sZFByZWZpeGVzLmVudHJpZXMoKSkge1xuICAgIGNvbnRpbnVhdGlvblRva2VuID0gdW5kZWZpbmVkO1xuICAgIGRvIHtcbiAgICAgIGlmIChEYXRlLm5vdygpID4gZGVhZGxpbmUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBDYWNoZSBidWNrZXQgcHJ1bmluZyBzdG9wcGVkIGF0IGl0cyB0aW1lIGJ1ZGdldCBhZnRlciBkZWxldGluZyAke2RlbGV0ZWR9IG9iamVjdHM7ICR7b2xkUHJlZml4ZXMubGVuZ3RoIC0gaX0gb2xkIGJ1aWxkIHByZWZpeGVzIGFyZSBsZWZ0IGZvciB0aGUgbmV4dCBkZXBsb3lgLFxuICAgICAgICApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBwYWdlOiBMaXN0T2JqZWN0c1YyQ29tbWFuZE91dHB1dCA9IGF3YWl0IHMzQ2xpZW50LnNlbmQoXG4gICAgICAgIG5ldyBMaXN0T2JqZWN0c1YyQ29tbWFuZCh7XG4gICAgICAgICAgQnVja2V0OiBidWNrZXROYW1lLFxuICAgICAgICAgIFByZWZpeDogcHJlZml4LFxuICAgICAgICAgIENvbnRpbnVhdGlvblRva2VuOiBjb250aW51YXRpb25Ub2tlbixcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgICAgZGVsZXRlZCArPSBhd2FpdCBkZWxldGVPYmplY3RzKGJ1Y2tldE5hbWUsIHBhZ2UuQ29udGVudHMpO1xuICAgICAgY29udGludWF0aW9uVG9rZW4gPSBwYWdlLk5leHRDb250aW51YXRpb25Ub2tlbjtcbiAgICB9IHdoaWxlIChjb250aW51YXRpb25Ub2tlbik7XG4gIH1cblxuICBkZWJ1ZyhcbiAgICBgQ2FjaGUgYnVja2V0IHBydW5pbmcgY29tcGxldGUuIERlbGV0ZWQgJHtkZWxldGVkfSBvYmplY3RzIGZyb20gJHtidWNrZXROYW1lfWAsXG4gICk7XG59XG5cbi8qKlxuICogRGVsZXRlIG9uZSBsaXN0ZWQgcGFnZSBvZiBvYmplY3RzLiBMaXN0T2JqZWN0c1YyIHJldHVybnMgYXQgbW9zdCAxMDAwIGtleXMgYVxuICogcGFnZSwgd2hpY2ggaXMgYWxzbyB0aGUgRGVsZXRlT2JqZWN0cyBsaW1pdCwgc28gYSBwYWdlIGlzIG9uZSByZXF1ZXN0LlxuICogUmV0dXJucyBob3cgbWFueSBvYmplY3RzIHdlcmUgc2VudCBmb3IgZGVsZXRpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZU9iamVjdHMoYnVja2V0TmFtZTogc3RyaW5nLCBjb250ZW50czogX09iamVjdFtdID0gW10pIHtcbiAgY29uc3Qgb2JqZWN0cyA9IGNvbnRlbnRzXG4gICAgLmZpbHRlcigob2JqKSA9PiBvYmouS2V5KVxuICAgIC5tYXAoKG9iaikgPT4gKHsgS2V5OiBvYmouS2V5ISB9KSk7XG4gIGlmIChvYmplY3RzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDA7XG4gIHRyeSB7XG4gICAgZGVidWcoXG4gICAgICBgRGVsZXRpbmcgY2FjaGUgb2JqZWN0czogJHtvYmplY3RzLm1hcCgobykgPT4gby5LZXkpfSBmcm9tICR7YnVja2V0TmFtZX1gLFxuICAgICk7XG4gICAgYXdhaXQgczNDbGllbnQuc2VuZChcbiAgICAgIG5ldyBEZWxldGVPYmplY3RzQ29tbWFuZCh7XG4gICAgICAgIEJ1Y2tldDogYnVja2V0TmFtZSxcbiAgICAgICAgRGVsZXRlOiB7IE9iamVjdHM6IG9iamVjdHMgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgY29uc29sZS5lcnJvcihcIkVycm9yIGRlbGV0aW5nIGNhY2hlIG9iamVjdHM6XCIsIGVycm9yKTtcbiAgfVxuICByZXR1cm4gb2JqZWN0cy5sZW5ndGg7XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable import/no-extraneous-dependencies */
|
|
4
|
+
// Only the client is mocked, as in `prune-s3.test.ts`: `prune-cache-bucket`
|
|
5
|
+
// constructs its client at module scope, before the mock variables exist.
|
|
6
|
+
jest.mock("@aws-sdk/client-s3", () => ({
|
|
7
|
+
...jest.requireActual("@aws-sdk/client-s3"),
|
|
8
|
+
S3Client: jest.fn(() => ({
|
|
9
|
+
send: (...args) => holder.send(...args),
|
|
10
|
+
})),
|
|
11
|
+
}));
|
|
12
|
+
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
13
|
+
const prune_cache_bucket_1 = require("./prune-cache-bucket");
|
|
14
|
+
const holder = { send: jest.fn() };
|
|
15
|
+
/**
|
|
16
|
+
* A fake bucket: ListObjectsV2 honours `Prefix` and `Delimiter`, and pages
|
|
17
|
+
* `pageSize` keys at a time via the token `<offset>`; the last page carries no
|
|
18
|
+
* NextContinuationToken, as S3 returns it.
|
|
19
|
+
*/
|
|
20
|
+
function stubBucket(keys, pageSize = 2) {
|
|
21
|
+
holder.send.mockImplementation((command) => {
|
|
22
|
+
if (!(command instanceof client_s3_1.ListObjectsV2Command))
|
|
23
|
+
return Promise.resolve({});
|
|
24
|
+
const { Prefix = "", Delimiter, ContinuationToken } = command.input;
|
|
25
|
+
const entries = [];
|
|
26
|
+
for (const key of keys.filter((k) => k.startsWith(Prefix))) {
|
|
27
|
+
const cut = Delimiter ? key.indexOf(Delimiter, Prefix.length) : -1;
|
|
28
|
+
if (cut < 0) {
|
|
29
|
+
entries.push({ key });
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
const prefix = key.slice(0, cut + 1);
|
|
33
|
+
if (!entries.some((entry) => entry.prefix === prefix)) {
|
|
34
|
+
entries.push({ prefix });
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
const offset = Number(ContinuationToken ?? 0);
|
|
39
|
+
const page = entries.slice(offset, offset + pageSize);
|
|
40
|
+
return Promise.resolve({
|
|
41
|
+
Contents: page.filter((e) => e.key).map((e) => ({ Key: e.key })),
|
|
42
|
+
CommonPrefixes: page
|
|
43
|
+
.filter((e) => e.prefix)
|
|
44
|
+
.map((e) => ({ Prefix: e.prefix })),
|
|
45
|
+
NextContinuationToken: offset + pageSize < entries.length
|
|
46
|
+
? String(offset + pageSize)
|
|
47
|
+
: undefined,
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function sent(type) {
|
|
52
|
+
return holder.send.mock.calls
|
|
53
|
+
.map(([command]) => command)
|
|
54
|
+
.filter((command) => command instanceof type);
|
|
55
|
+
}
|
|
56
|
+
function deletedKeys() {
|
|
57
|
+
return sent(client_s3_1.DeleteObjectsCommand).flatMap((command) => command.input.Delete.Objects.map((object) => object.Key));
|
|
58
|
+
}
|
|
59
|
+
describe("pruneCacheBucket", () => {
|
|
60
|
+
beforeEach(() => {
|
|
61
|
+
holder.send.mockReset();
|
|
62
|
+
});
|
|
63
|
+
it("deletes every old build prefix across pages, and loose keys", async () => {
|
|
64
|
+
stubBucket([
|
|
65
|
+
"current/a.json",
|
|
66
|
+
"current/_use-cache/1.entry",
|
|
67
|
+
"old1/a.json",
|
|
68
|
+
"old1/_use-cache/1.entry",
|
|
69
|
+
"old1/_use-cache/2.entry",
|
|
70
|
+
"old2/a.json",
|
|
71
|
+
"loose.json",
|
|
72
|
+
"/leading-slash.json",
|
|
73
|
+
]);
|
|
74
|
+
await (0, prune_cache_bucket_1.pruneCacheBucket)({ bucketName: "cache", currentBuildId: "current" });
|
|
75
|
+
expect(deletedKeys().sort()).toEqual([
|
|
76
|
+
"/leading-slash.json",
|
|
77
|
+
"loose.json",
|
|
78
|
+
"old1/_use-cache/1.entry",
|
|
79
|
+
"old1/_use-cache/2.entry",
|
|
80
|
+
"old1/a.json",
|
|
81
|
+
"old2/a.json",
|
|
82
|
+
].sort());
|
|
83
|
+
});
|
|
84
|
+
// The current build can hold unbounded 'use cache: remote' entries, so it
|
|
85
|
+
// must never be walked: the delimited top-level listing only names it.
|
|
86
|
+
it("never lists inside the current build", async () => {
|
|
87
|
+
stubBucket([
|
|
88
|
+
...Array.from({ length: 10 }, (_, i) => `current/_use-cache/${i}.entry`),
|
|
89
|
+
"old/a.json",
|
|
90
|
+
]);
|
|
91
|
+
await (0, prune_cache_bucket_1.pruneCacheBucket)({ bucketName: "cache", currentBuildId: "current" });
|
|
92
|
+
expect(sent(client_s3_1.ListObjectsV2Command).map(({ input }) => input.Delimiter ?? input.Prefix)).toEqual(["/", "old/"]);
|
|
93
|
+
expect(deletedKeys()).toEqual(["old/a.json"]);
|
|
94
|
+
});
|
|
95
|
+
// A huge old build must not run the Lambda into its timeout, which would
|
|
96
|
+
// leave CloudFormation waiting on the custom resource.
|
|
97
|
+
it("stops at its time budget and leaves the rest for the next deploy", async () => {
|
|
98
|
+
stubBucket(["old/a.json", "old/b.json", "old/c.json"], 1);
|
|
99
|
+
let clock = 0;
|
|
100
|
+
const nowSpy = jest.spyOn(Date, "now").mockImplementation(() => clock);
|
|
101
|
+
const warnSpy = jest.spyOn(console, "warn").mockImplementation(() => { });
|
|
102
|
+
holder.send.mockImplementation(((stub) => (command) => {
|
|
103
|
+
if (command instanceof client_s3_1.DeleteObjectsCommand)
|
|
104
|
+
clock += 2 * 60_000;
|
|
105
|
+
return stub(command);
|
|
106
|
+
})(holder.send.getMockImplementation()));
|
|
107
|
+
await (0, prune_cache_bucket_1.pruneCacheBucket)({ bucketName: "cache", currentBuildId: "current" });
|
|
108
|
+
expect(deletedKeys()).toEqual(["old/a.json", "old/b.json"]);
|
|
109
|
+
expect(warnSpy).toHaveBeenCalled();
|
|
110
|
+
nowSpy.mockRestore();
|
|
111
|
+
warnSpy.mockRestore();
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJ1bmUtY2FjaGUtYnVja2V0LnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9wb3N0LWRlcGxveS9wcnVuZS1jYWNoZS1idWNrZXQudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCw0RUFBNEU7QUFDNUUsMEVBQTBFO0FBQzFFLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNyQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUM7SUFDM0MsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN2QixJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQWUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztLQUNuRCxDQUFDLENBQUM7Q0FDSixDQUFDLENBQUMsQ0FBQztBQUVKLGtEQUFnRjtBQUNoRiw2REFBd0Q7QUFFeEQsTUFBTSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFFbkM7Ozs7R0FJRztBQUNILFNBQVMsVUFBVSxDQUFDLElBQWMsRUFBRSxRQUFRLEdBQUcsQ0FBQztJQUM5QyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsT0FBZ0IsRUFBRSxFQUFFO1FBQ2xELElBQUksQ0FBQyxDQUFDLE9BQU8sWUFBWSxnQ0FBb0IsQ0FBQztZQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMzRSxNQUFNLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3BFLE1BQU0sT0FBTyxHQUF3QyxFQUFFLENBQUM7UUFDeEQsS0FBSyxN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QUFDLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDNUQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDbkMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG4vLyBPbmx5IHRoZSBjbGllbnQgaXMgbW9ja2VkLCBhcyBpbiBgcHJ1bmUtczMudGVzdC50c2A6IGBwcnVuZS1jYWNoZS1idWNrZXRgXG4vLyBjb25zdHJ1Y3RzIGl0cyBjbGllbnQgYXQgbW9kdWxlIHNjb3BlLCBiZWZvcmUgdGhlIG1vY2sgdmFyaWFibGVzIGV4aXN0LlxuamVzdC5tb2NrKFwiQGF3cy1zZGsvY2xpZW50LXMzXCIsICgpID0+ICh7XG4gIC4uLmplc3QucmVxdWlyZUFjdHVhbChcIkBhd3Mtc2RrL2NsaWVudC1zM1wiKSxcbiAgUzNDbGllbnQ6IGplc3QuZm4oKCkgPT4gKHtcbiAgICBzZW5kOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBob2xkZXIuc2VuZCguLi5hcmdzKSxcbiAgfSkpLFxufSkpO1xuXG5pbXBvcnQgeyBEZWxldGVPYmplY3RzQ29tbWFuZCwgTGlzdE9iamVjdHNWMkNvbW1hbmQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXMzXCI7XG5pbXBvcnQgeyBwcnVuZUNhY2hlQnVja2V0IH0gZnJvbSBcIi4vcHJ1bmUtY2FjaGUtYnVja2V0XCI7XG5cbmNvbnN0IGhvbGRlciA9IHsgc2VuZDogamVzdC5mbigpIH07XG5cbi8qKlxuICogQSBmYWtlIGJ1Y2tldDogTGlzdE9iamVjdHNWMiBob25vdXJzIGBQcmVmaXhgIGFuZCBgRGVsaW1pdGVyYCwgYW5kIHBhZ2VzXG4gKiBgcGFnZVNpemVgIGtleXMgYXQgYSB0aW1lIHZpYSB0aGUgdG9rZW4gYDxvZmZzZXQ+YDsgdGhlIGxhc3QgcGFnZSBjYXJyaWVzIG5vXG4gKiBOZXh0Q29udGludWF0aW9uVG9rZW4sIGFzIFMzIHJldHVybnMgaXQuXG4gKi9cbmZ1bmN0aW9uIHN0dWJCdWNrZXQoa2V5czogc3RyaW5nW10sIHBhZ2VTaXplID0gMik6IHZvaWQge1xuICBob2xkZXIuc2VuZC5tb2NrSW1wbGVtZW50YXRpb24oKGNvbW1hbmQ6IHVua25vd24pID0+IHtcbiAgICBpZiAoIShjb21tYW5kIGluc3RhbmNlb2YgTGlzdE9iamVjdHNWMkNvbW1hbmQpKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICBjb25zdCB7IFByZWZpeCA9IFwiXCIsIERlbGltaXRlciwgQ29udGludWF0aW9uVG9rZW4gfSA9IGNvbW1hbmQuaW5wdXQ7XG4gICAgY29uc3QgZW50cmllczogeyBrZXk/OiBzdHJpbmc7IHByZWZpeD86IHN0cmluZyB9W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzLmZpbHRlcigoaykgPT4gay5zdGFydHNXaXRoKFByZWZpeCkpKSB7XG4gICAgICBjb25zdCBjdXQgPSBEZWxpbWl0ZXIgPyBrZXkuaW5kZXhPZihEZWxpbWl0ZXIsIFByZWZpeC5sZW5ndGgpIDogLTE7XG4gICAgICBpZiAoY3V0IDwgMCkge1xuICAgICAgICBlbnRyaWVzLnB1c2goeyBrZXkgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcmVmaXggPSBrZXkuc2xpY2UoMCwgY3V0ICsgMSk7XG4gICAgICAgIGlmICghZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkucHJlZml4ID09PSBwcmVmaXgpKSB7XG4gICAgICAgICAgZW50cmllcy5wdXNoKHsgcHJlZml4IH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IG9mZnNldCA9IE51bWJlcihDb250aW51YXRpb25Ub2tlbiA/PyAwKTtcbiAgICBjb25zdCBwYWdlID0gZW50cmllcy5zbGljZShvZmZzZXQsIG9mZnNldCArIHBhZ2VTaXplKTtcbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgIENvbnRlbnRzOiBwYWdlLmZpbHRlcigoZSkgPT4gZS5rZXkpLm1hcCgoZSkgPT4gKHsgS2V5OiBlLmtleSB9KSksXG4gICAgICBDb21tb25QcmVmaXhlczogcGFnZVxuICAgICAgICAuZmlsdGVyKChlKSA9PiBlLnByZWZpeClcbiAgICAgICAgLm1hcCgoZSkgPT4gKHsgUHJlZml4OiBlLnByZWZpeCB9KSksXG4gICAgICBOZXh0Q29udGludWF0aW9uVG9rZW46XG4gICAgICAgIG9mZnNldCArIHBhZ2VTaXplIDwgZW50cmllcy5sZW5ndGhcbiAgICAgICAgICA/IFN0cmluZyhvZmZzZXQgKyBwYWdlU2l6ZSlcbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHNlbnQ8VD4odHlwZTogbmV3ICguLi5hcmdzOiBhbnlbXSkgPT4gVCk6IFRbXSB7XG4gIHJldHVybiBob2xkZXIuc2VuZC5tb2NrLmNhbGxzXG4gICAgLm1hcCgoW2NvbW1hbmRdKSA9PiBjb21tYW5kKVxuICAgIC5maWx0ZXIoKGNvbW1hbmQpOiBjb21tYW5kIGlzIFQgPT4gY29tbWFuZCBpbnN0YW5jZW9mIHR5cGUpO1xufVxuXG5mdW5jdGlvbiBkZWxldGVkS2V5cygpOiAoc3RyaW5nIHwgdW5kZWZpbmVkKVtdIHtcbiAgcmV0dXJuIHNlbnQoRGVsZXRlT2JqZWN0c0NvbW1hbmQpLmZsYXRNYXAoKGNvbW1hbmQpID0+XG4gICAgY29tbWFuZC5pbnB1dC5EZWxldGUhLk9iamVjdHMhLm1hcCgob2JqZWN0KSA9PiBvYmplY3QuS2V5KSxcbiAgKTtcbn1cblxuZGVzY3JpYmUoXCJwcnVuZUNhY2hlQnVja2V0XCIsICgpID0+IHtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgaG9sZGVyLnNlbmQubW9ja1Jlc2V0KCk7XG4gIH0pO1xuXG4gIGl0KFwiZGVsZXRlcyBldmVyeSBvbGQgYnVpbGQgcHJlZml4IGFjcm9zcyBwYWdlcywgYW5kIGxvb3NlIGtleXNcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHN0dWJCdWNrZXQoW1xuICAgICAgXCJjdXJyZW50L2EuanNvblwiLFxuICAgICAgXCJjdXJyZW50L191c2UtY2FjaGUvMS5lbnRyeVwiLFxuICAgICAgXCJvbGQxL2EuanNvblwiLFxuICAgICAgXCJvbGQxL191c2UtY2FjaGUvMS5lbnRyeVwiLFxuICAgICAgXCJvbGQxL191c2UtY2FjaGUvMi5lbnRyeVwiLFxuICAgICAgXCJvbGQyL2EuanNvblwiLFxuICAgICAgXCJsb29zZS5qc29uXCIsXG4gICAgICBcIi9sZWFkaW5nLXNsYXNoLmpzb25cIixcbiAgICBdKTtcblxuICAgIGF3YWl0IHBydW5lQ2FjaGVCdWNrZXQoeyBidWNrZXROYW1lOiBcImNhY2hlXCIsIGN1cnJlbnRCdWlsZElkOiBcImN1cnJlbnRcIiB9KTtcblxuICAgIGV4cGVjdChkZWxldGVkS2V5cygpLnNvcnQoKSkudG9FcXVhbChcbiAgICAgIFtcbiAgICAgICAgXCIvbGVhZGluZy1zbGFzaC5qc29uXCIsXG4gICAgICAgIFwibG9vc2UuanNvblwiLFxuICAgICAgICBcIm9sZDEvX3VzZS1jYWNoZS8xLmVudHJ5XCIsXG4gICAgICAgIFwib2xkMS9fdXNlLWNhY2hlLzIuZW50cnlcIixcbiAgICAgICAgXCJvbGQxL2EuanNvblwiLFxuICAgICAgICBcIm9sZDIvYS5qc29uXCIsXG4gICAgICBdLnNvcnQoKSxcbiAgICApO1xuICB9KTtcblxuICAvLyBUaGUgY3VycmVudCBidWlsZCBjYW4gaG9sZCB1bmJvdW5kZWQgJ3VzZSBjYWNoZTogcmVtb3RlJyBlbnRyaWVzLCBzbyBpdFxuICAvLyBtdXN0IG5ldmVyIGJlIHdhbGtlZDogdGhlIGRlbGltaXRlZCB0b3AtbGV2ZWwgbGlzdGluZyBvbmx5IG5hbWVzIGl0LlxuICBpdChcIm5ldmVyIGxpc3RzIGluc2lkZSB0aGUgY3VycmVudCBidWlsZFwiLCBhc3luYyAoKSA9PiB7XG4gICAgc3R1YkJ1Y2tldChbXG4gICAgICAuLi5BcnJheS5mcm9tKHsgbGVuZ3RoOiAxMCB9LCAoXywgaSkgPT4gYGN1cnJlbnQvX3VzZS1jYWNoZS8ke2l9LmVudHJ5YCksXG4gICAgICBcIm9sZC9hLmpzb25cIixcbiAgICBdKTtcblxuICAgIGF3YWl0IHBydW5lQ2FjaGVCdWNrZXQoeyBidWNrZXROYW1lOiBcImNhY2hlXCIsIGN1cnJlbnRCdWlsZElkOiBcImN1cnJlbnRcIiB9KTtcblxuICAgIGV4cGVjdChcbiAgICAgIHNlbnQoTGlzdE9iamVjdHNWMkNvbW1hbmQpLm1hcChcbiAgICAgICAgKHsgaW5wdXQgfSkgPT4gaW5wdXQuRGVsaW1pdGVyID8/IGlucHV0LlByZWZpeCxcbiAgICAgICksXG4gICAgKS50b0VxdWFsKFtcIi9cIiwgXCJvbGQvXCJdKTtcbiAgICBleHBlY3QoZGVsZXRlZEtleXMoKSkudG9FcXVhbChbXCJvbGQvYS5qc29uXCJdKTtcbiAgfSk7XG5cbiAgLy8gQSBodWdlIG9sZCBidWlsZCBtdXN0IG5vdCBydW4gdGhlIExhbWJkYSBpbnRvIGl0cyB0aW1lb3V0LCB3aGljaCB3b3VsZFxuICAvLyBsZWF2ZSBDbG91ZEZvcm1hdGlvbiB3YWl0aW5nIG9uIHRoZSBjdXN0b20gcmVzb3VyY2UuXG4gIGl0KFwic3RvcHMgYXQgaXRzIHRpbWUgYnVkZ2V0IGFuZCBsZWF2ZXMgdGhlIHJlc3QgZm9yIHRoZSBuZXh0IGRlcGxveVwiLCBhc3luYyAoKSA9PiB7XG4gICAgc3R1YkJ1Y2tldChbXCJvbGQvYS5qc29uXCIsIFwib2xkL2IuanNvblwiLCBcIm9sZC9jLmpzb25cIl0sIDEpO1xuICAgIGxldCBjbG9jayA9IDA7XG4gICAgY29uc3Qgbm93U3B5ID0gamVzdC5zcHlPbihEYXRlLCBcIm5vd1wiKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4gY2xvY2spO1xuICAgIGNvbnN0IHdhcm5TcHkgPSBqZXN0LnNweU9uKGNvbnNvbGUsIFwid2FyblwiKS5tb2NrSW1wbGVtZW50YXRpb24oKCkgPT4ge30pO1xuICAgIGhvbGRlci5zZW5kLm1vY2tJbXBsZW1lbnRhdGlvbihcbiAgICAgICgoc3R1YikgPT4gKGNvbW1hbmQ6IHVua25vd24pID0+IHtcbiAgICAgICAgaWYgKGNvbW1hbmQgaW5zdGFuY2VvZiBEZWxldGVPYmplY3RzQ29tbWFuZCkgY2xvY2sgKz0gMiAqIDYwXzAwMDtcbiAgICAgICAgcmV0dXJuIHN0dWIoY29tbWFuZCk7XG4gICAgICB9KShob2xkZXIuc2VuZC5nZXRNb2NrSW1wbGVtZW50YXRpb24oKSEpLFxuICAgICk7XG5cbiAgICBhd2FpdCBwcnVuZUNhY2hlQnVja2V0KHsgYnVja2V0TmFtZTogXCJjYWNoZVwiLCBjdXJyZW50QnVpbGRJZDogXCJjdXJyZW50XCIgfSk7XG5cbiAgICBleHBlY3QoZGVsZXRlZEtleXMoKSkudG9FcXVhbChbXCJvbGQvYS5qc29uXCIsIFwib2xkL2IuanNvblwiXSk7XG4gICAgZXhwZWN0KHdhcm5TcHkpLnRvSGF2ZUJlZW5DYWxsZWQoKTtcbiAgICBub3dTcHkubW9ja1Jlc3RvcmUoKTtcbiAgICB3YXJuU3B5Lm1vY2tSZXN0b3JlKCk7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -8,6 +8,7 @@ interface PruneRevalidationTableProps {
|
|
|
8
8
|
*
|
|
9
9
|
* Schema:
|
|
10
10
|
* - Revalidation entries: pk=buildId, sk=tag#cacheKey
|
|
11
|
+
* - Revalidation log rows: pk=buildId#log, sk=timestamp#tag
|
|
11
12
|
* - Metadata entry: pk="METADATA", sk="CURRENT_BUILD", buildId=currentBuildId
|
|
12
13
|
*/
|
|
13
14
|
export declare function pruneRevalidationTable(props: PruneRevalidationTableProps): Promise<void>;
|
|
@@ -8,6 +8,7 @@ exports.pruneRevalidationTable = pruneRevalidationTable;
|
|
|
8
8
|
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
9
9
|
// eslint-disable-next-line import/no-extraneous-dependencies
|
|
10
10
|
const debug_1 = __importDefault(require("debug"));
|
|
11
|
+
const prune_s3_1 = require("./prune-s3");
|
|
11
12
|
const debug = (0, debug_1.default)("cdk-nextjs:post-deploy:prune-revalidation-table");
|
|
12
13
|
const dynamoClient = new client_dynamodb_1.DynamoDBClient();
|
|
13
14
|
/**
|
|
@@ -16,6 +17,7 @@ const dynamoClient = new client_dynamodb_1.DynamoDBClient();
|
|
|
16
17
|
*
|
|
17
18
|
* Schema:
|
|
18
19
|
* - Revalidation entries: pk=buildId, sk=tag#cacheKey
|
|
20
|
+
* - Revalidation log rows: pk=buildId#log, sk=timestamp#tag
|
|
19
21
|
* - Metadata entry: pk="METADATA", sk="CURRENT_BUILD", buildId=currentBuildId
|
|
20
22
|
*/
|
|
21
23
|
async function pruneRevalidationTable(props) {
|
|
@@ -47,21 +49,23 @@ async function pruneRevalidationTable(props) {
|
|
|
47
49
|
return;
|
|
48
50
|
}
|
|
49
51
|
debug(`Pruning revalidation entries for previous build: ${previousBuildId}`);
|
|
50
|
-
// 2. Query all items for previous build ID (efficient partition
|
|
52
|
+
// 2. Query all items for previous build ID (efficient partition queries):
|
|
53
|
+
// its marker rows, and its revalidation log rows, which a table without TTL
|
|
54
|
+
// would otherwise keep forever.
|
|
51
55
|
const itemsToDelete = [];
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
for (const item of response.Items) {
|
|
56
|
+
for (const pk of [previousBuildId, `${previousBuildId}#log`]) {
|
|
57
|
+
let lastEvaluatedKey = undefined;
|
|
58
|
+
do {
|
|
59
|
+
const queryCommand = new client_dynamodb_1.QueryCommand({
|
|
60
|
+
TableName: tableName,
|
|
61
|
+
KeyConditionExpression: "pk = :pk",
|
|
62
|
+
ExpressionAttributeValues: {
|
|
63
|
+
":pk": { S: pk },
|
|
64
|
+
},
|
|
65
|
+
ExclusiveStartKey: lastEvaluatedKey,
|
|
66
|
+
});
|
|
67
|
+
const response = await dynamoClient.send(queryCommand);
|
|
68
|
+
for (const item of response.Items ?? []) {
|
|
65
69
|
if (item.pk?.S && item.sk?.S) {
|
|
66
70
|
itemsToDelete.push({
|
|
67
71
|
pk: { S: item.pk.S },
|
|
@@ -69,9 +73,9 @@ async function pruneRevalidationTable(props) {
|
|
|
69
73
|
});
|
|
70
74
|
}
|
|
71
75
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
}
|
|
76
|
+
lastEvaluatedKey = response.LastEvaluatedKey;
|
|
77
|
+
} while (lastEvaluatedKey);
|
|
78
|
+
}
|
|
75
79
|
debug(`Found ${itemsToDelete.length} revalidation entries to delete for build ${previousBuildId}`);
|
|
76
80
|
// 3. Delete items in batches (respecting DynamoDB's 25 items per batch limit)
|
|
77
81
|
if (itemsToDelete.length > 0) {
|
|
@@ -80,7 +84,7 @@ async function pruneRevalidationTable(props) {
|
|
|
80
84
|
const batch = itemsToDelete.slice(i, i + 25);
|
|
81
85
|
deleteBatches.push(batch);
|
|
82
86
|
}
|
|
83
|
-
await processBatch(deleteBatches, 5, // Process up to 5 delete batches in parallel
|
|
87
|
+
await (0, prune_s3_1.processBatch)(deleteBatches, 5, // Process up to 5 delete batches in parallel
|
|
84
88
|
async (batch) => {
|
|
85
89
|
try {
|
|
86
90
|
const deleteRequests = batch.map((item) => ({
|
|
@@ -121,16 +125,4 @@ async function updateMetadata(tableName, currentBuildId) {
|
|
|
121
125
|
await dynamoClient.send(putCommand);
|
|
122
126
|
debug(`Updated metadata with current build ID: ${currentBuildId}`);
|
|
123
127
|
}
|
|
124
|
-
/**
|
|
125
|
-
* Process items in batches to avoid overwhelming the system
|
|
126
|
-
*/
|
|
127
|
-
async function processBatch(items, batchSize, processFn) {
|
|
128
|
-
const results = [];
|
|
129
|
-
for (let i = 0; i < items.length; i += batchSize) {
|
|
130
|
-
const batch = items.slice(i, i + batchSize);
|
|
131
|
-
const batchResults = await Promise.all(batch.map(processFn));
|
|
132
|
-
results.push(...batchResults);
|
|
133
|
-
}
|
|
134
|
-
return results;
|
|
135
|
-
}
|
|
136
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJ1bmUtcmV2YWxpZGF0aW9uLXRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xhbWJkYXMvcG9zdC1kZXBsb3kvcHJ1bmUtcmV2YWxpZGF0aW9uLXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBNEJBLHdEQXdIQztBQXBKRCw2REFBNkQ7QUFDN0QsOERBTWtDO0FBQ2xDLDZEQUE2RDtBQUM3RCxrREFBNkI7QUFFN0IsTUFBTSxLQUFLLEdBQUcsSUFBQSxlQUFRLEVBQUMsaURBQWlELENBQUMsQ0FBQztBQUUxRSxNQUFNLFlBQVksR0FBRyxJQUFJLGdDQUFjLEVBQUUsQ0FBQztBQU8xQzs7Ozs7OztHQU9HO0FBQ0ksS0FBSyxVQUFVLHNCQUFzQixDQUMxQyxLQUFrQztJQUVsQyxNQUFNLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRSxHQUFHLEtBQUssQ0FBQztJQUU1Qyw0Q0FBNEM7SUFDNUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxnQ0FBYyxDQUFDO1FBQ3BDLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLEdBQUcsRUFBRTtZQUNILEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUU7WUFDckIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLGVBQWUsRUFBRTtTQUMzQjtLQUNGLENBQUMsQ0FBQztJQUVILElBQUksZUFBbUMsQ0FBQztJQUN4QyxJQUFJLENBQUM7UUFDSCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM3RCxlQUFlLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDdEQsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3JCLEtBQUssQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO1FBQ3BDLDREQUE0RDtRQUM1RCxNQUFNLGNBQWMsQ0FBQyxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDaEQsT0FBTztJQUNULENBQUM7SUFFRCxJQUFJLGVBQWUsS0FBSyxjQUFjLEVBQUUsQ0FBQztRQUN2QyxLQUFLLENBQ0gsK0NBQStDLGNBQWMscUJBQXFCLENBQ25GLENBQUM7UUFDRixPQUFPO0lBQ1QsQ0FBQztJQUVELEtBQUssQ0FBQyxvREFBb0QsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUU3RSx1RUFBdUU7SUFDdkUsTUFBTSxhQUFhLEdBQW9ELEVBQUUsQ0FBQztJQUMxRSxJQUFJLGdCQUFnQixHQUFvQyxTQUFTLENBQUM7SUFFbEUsR0FBRyxDQUFDO1FBQ0YsTUFBTSxZQUFZLEdBQWlCLElBQUksOEJBQVksQ0FBQztZQUNsRCxTQUFTLEVBQUUsU0FBUztZQUNwQixzQkFBc0IsRUFBRSxVQUFVO1lBQ2xDLHlCQUF5QixFQUFFO2dCQUN6QixLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUUsZUFBZSxFQUFFO2FBQzlCO1lBQ0QsaUJBQWlCLEVBQUUsZ0JBQWdCO1NBQ3BDLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHLE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUV2RCxJQUFJLFFBQVEsQ0FBQyxLQUFLLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDaEQsS0FBSyxNQUFNLElBQUksSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7Z0JBQ2xDLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQztvQkFDN0IsYUFBYSxDQUFDLElBQUksQ0FBQzt3QkFDakIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFO3dCQUNwQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7cUJBQ3JCLENBQUMsQ0FBQztnQkFDTCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUM7SUFDL0MsQ0FBQyxRQUFRLGdCQUFnQixFQUFFO0lBRTNCLEtBQUssQ0FDSCxTQUFTLGFBQWEsQ0FBQyxNQUFNLDZDQUE2QyxlQUFlLEVBQUUsQ0FDNUYsQ0FBQztJQUVGLDhFQUE4RTtJQUM5RSxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDN0IsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBRXpCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUNsRCxNQUFNLEtBQUssR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDN0MsYUFBYSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixDQUFDO1FBRUQsTUFBTSxZQUFZLENBQ2hCLGFBQWEsRUFDYixDQUFDLEVBQUUsNkNBQTZDO1FBQ2hELEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtZQUNkLElBQUksQ0FBQztnQkFDSCxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO29CQUMxQyxhQUFhLEVBQUU7d0JBQ2IsR0FBRyxFQUFFLElBQUk7cUJBQ1Y7aUJBQ0YsQ0FBQyxDQUFDLENBQUM7Z0JBRUosS0FBSyxDQUNILGtDQUFrQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsU0FBUyxFQUFFLENBQ3pHLENBQUM7Z0JBRUYsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUNyQixJQUFJLHVDQUFxQixDQUFDO29CQUN4QixZQUFZLEVBQUU7d0JBQ1osQ0FBQyxTQUFTLENBQUMsRUFBRSxjQUFjO3FCQUM1QjtpQkFDRixDQUFDLENBQ0gsQ0FBQztnQkFFRixLQUFLLENBQ0gsV0FBVyxLQUFLLENBQUMsTUFBTSw4QkFBOEIsU0FBUyxFQUFFLENBQ2pFLENBQUM7WUFDSixDQUFDO1lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQy9ELENBQUM7UUFDSCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFRCx1Q0FBdUM7SUFDdkMsTUFBTSxjQUFjLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRWhELEtBQUssQ0FDSCxnREFBZ0QsYUFBYSxDQUFDLE1BQU0saUJBQWlCLFNBQVMsRUFBRSxDQUNqRyxDQUFDO0FBQ0osQ0FBQztBQUVEOztHQUVHO0FBQ0gsS0FBSyxVQUFVLGNBQWMsQ0FDM0IsU0FBaUIsRUFDakIsY0FBc0I7SUFFdEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxnQ0FBYyxDQUFDO1FBQ3BDLFNBQVMsRUFBRSxTQUFTO1FBQ3BCLElBQUksRUFBRTtZQUNKLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUU7WUFDckIsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLGVBQWUsRUFBRTtZQUMxQixPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUUsY0FBYyxFQUFFO1lBQzlCLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLEVBQUU7U0FDeEM7S0FDRixDQUFDLENBQUM7SUFFSCxNQUFNLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEMsS0FBSyxDQUFDLDJDQUEyQyxjQUFjLEVBQUUsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRDs7R0FFRztBQUNILEtBQUssVUFBVSxZQUFZLENBQ3pCLEtBQVUsRUFDVixTQUFpQixFQUNqQixTQUFrQztJQUVsQyxNQUFNLE9BQU8sR0FBUSxFQUFFLENBQUM7SUFFeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLFNBQVMsRUFBRSxDQUFDO1FBQ2pELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztRQUM1QyxNQUFNLFlBQVksR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzdELE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCB7XG4gIER5bmFtb0RCQ2xpZW50LFxuICBRdWVyeUNvbW1hbmQsXG4gIEdldEl0ZW1Db21tYW5kLFxuICBQdXRJdGVtQ29tbWFuZCxcbiAgQmF0Y2hXcml0ZUl0ZW1Db21tYW5kLFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgZ2V0RGVidWcgZnJvbSBcImRlYnVnXCI7XG5cbmNvbnN0IGRlYnVnID0gZ2V0RGVidWcoXCJjZGstbmV4dGpzOnBvc3QtZGVwbG95OnBydW5lLXJldmFsaWRhdGlvbi10YWJsZVwiKTtcblxuY29uc3QgZHluYW1vQ2xpZW50ID0gbmV3IER5bmFtb0RCQ2xpZW50KCk7XG5cbmludGVyZmFjZSBQcnVuZVJldmFsaWRhdGlvblRhYmxlUHJvcHMge1xuICB0YWJsZU5hbWU6IHN0cmluZztcbiAgY3VycmVudEJ1aWxkSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBHaXZlbiBgdGFibGVOYW1lYCBhbmQgYGN1cnJlbnRCdWlsZElkYCwgcXVlcnkgdGhlIHByZXZpb3VzIGJ1aWxkJ3MgcmV2YWxpZGF0aW9uIGVudHJpZXNcbiAqIGFuZCBkZWxldGUgdGhlbSBlZmZpY2llbnRseS4gVXNlcyBtZXRhZGF0YSBlbnRyeSB0byB0cmFjayBjdXJyZW50IGJ1aWxkIElELlxuICpcbiAqIFNjaGVtYTpcbiAqIC0gUmV2YWxpZGF0aW9uIGVudHJpZXM6IHBrPWJ1aWxkSWQsIHNrPXRhZyNjYWNoZUtleVxuICogLSBNZXRhZGF0YSBlbnRyeTogcGs9XCJNRVRBREFUQVwiLCBzaz1cIkNVUlJFTlRfQlVJTERcIiwgYnVpbGRJZD1jdXJyZW50QnVpbGRJZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJ1bmVSZXZhbGlkYXRpb25UYWJsZShcbiAgcHJvcHM6IFBydW5lUmV2YWxpZGF0aW9uVGFibGVQcm9wcyxcbikge1xuICBjb25zdCB7IHRhYmxlTmFtZSwgY3VycmVudEJ1aWxkSWQgfSA9IHByb3BzO1xuXG4gIC8vIDEuIFJlYWQgbWV0YWRhdGEgdG8gZ2V0IHByZXZpb3VzIGJ1aWxkIElEXG4gIGNvbnN0IGdldENvbW1hbmQgPSBuZXcgR2V0SXRlbUNvbW1hbmQoe1xuICAgIFRhYmxlTmFtZTogdGFibGVOYW1lLFxuICAgIEtleToge1xuICAgICAgcGs6IHsgUzogXCJNRVRBREFUQVwiIH0sXG4gICAgICBzazogeyBTOiBcIkNVUlJFTlRfQlVJTERcIiB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGxldCBwcmV2aW91c0J1aWxkSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBtZXRhZGF0YVJlc3BvbnNlID0gYXdhaXQgZHluYW1vQ2xpZW50LnNlbmQoZ2V0Q29tbWFuZCk7XG4gICAgcHJldmlvdXNCdWlsZElkID0gbWV0YWRhdGFSZXNwb25zZS5JdGVtPy5idWlsZElkPy5TO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGRlYnVnKFwiTm8gbWV0YWRhdGEgZW50cnkgZm91bmQsIHRoaXMgbWF5IGJlIHRoZSBmaXJzdCBkZXBsb3ltZW50XCIpO1xuICB9XG5cbiAgaWYgKCFwcmV2aW91c0J1aWxkSWQpIHtcbiAgICBkZWJ1ZyhcIk5vIHByZXZpb3VzIGJ1aWxkIHRvIHBydW5lXCIpO1xuICAgIC8vIFVwZGF0ZSBtZXRhZGF0YSB3aXRoIGN1cnJlbnQgYnVpbGQgSUQgZm9yIG5leHQgZGVwbG95bWVudFxuICAgIGF3YWl0IHVwZGF0ZU1ldGFkYXRhKHRhYmxlTmFtZSwgY3VycmVudEJ1aWxkSWQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwcmV2aW91c0J1aWxkSWQgPT09IGN1cnJlbnRCdWlsZElkKSB7XG4gICAgZGVidWcoXG4gICAgICBgUHJldmlvdXMgYnVpbGQgSUQgbWF0Y2hlcyBjdXJyZW50IGJ1aWxkIElEICgke2N1cnJlbnRCdWlsZElkfSksIG5vdGhpbmcgdG8gcHJ1bmVgLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZGVidWcoYFBydW5pbmcgcmV2YWxpZGF0aW9uIGVudHJpZXMgZm9yIHByZXZpb3VzIGJ1aWxkOiAke3ByZXZpb3VzQnVpbGRJZH1gKTtcblxuICAvLyAyLiBRdWVyeSBhbGwgaXRlbXMgZm9yIHByZXZpb3VzIGJ1aWxkIElEIChlZmZpY2llbnQgcGFydGl0aW9uIHF1ZXJ5KVxuICBjb25zdCBpdGVtc1RvRGVsZXRlOiBBcnJheTx7IHBrOiB7IFM6IHN0cmluZyB9OyBzazogeyBTOiBzdHJpbmcgfSB9PiA9IFtdO1xuICBsZXQgbGFzdEV2YWx1YXRlZEtleTogUmVjb3JkPHN0cmluZywgYW55PiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICBkbyB7XG4gICAgY29uc3QgcXVlcnlDb21tYW5kOiBRdWVyeUNvbW1hbmQgPSBuZXcgUXVlcnlDb21tYW5kKHtcbiAgICAgIFRhYmxlTmFtZTogdGFibGVOYW1lLFxuICAgICAgS2V5Q29uZGl0aW9uRXhwcmVzc2lvbjogXCJwayA9IDpwa1wiLFxuICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICBcIjpwa1wiOiB7IFM6IHByZXZpb3VzQnVpbGRJZCB9LFxuICAgICAgfSxcbiAgICAgIEV4Y2x1c2l2ZVN0YXJ0S2V5OiBsYXN0RXZhbHVhdGVkS2V5LFxuICAgIH0pO1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBkeW5hbW9DbGllbnQuc2VuZChxdWVyeUNvbW1hbmQpO1xuXG4gICAgaWYgKHJlc3BvbnNlLkl0ZW1zICYmIHJlc3BvbnNlLkl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoY29uc3QgaXRlbSBvZiByZXNwb25zZS5JdGVtcykge1xuICAgICAgICBpZiAoaXRlbS5waz8uUyAmJiBpdGVtLnNrPy5TKSB7XG4gICAgICAgICAgaXRlbXNUb0RlbGV0ZS5wdXNoKHtcbiAgICAgICAgICAgIHBrOiB7IFM6IGl0ZW0ucGsuUyB9LFxuICAgICAgICAgICAgc2s6IHsgUzogaXRlbS5zay5TIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsYXN0RXZhbHVhdGVkS2V5ID0gcmVzcG9uc2UuTGFzdEV2YWx1YXRlZEtleTtcbiAgfSB3aGlsZSAobGFzdEV2YWx1YXRlZEtleSk7XG5cbiAgZGVidWcoXG4gICAgYEZvdW5kICR7aXRlbXNUb0RlbGV0ZS5sZW5ndGh9IHJldmFsaWRhdGlvbiBlbnRyaWVzIHRvIGRlbGV0ZSBmb3IgYnVpbGQgJHtwcmV2aW91c0J1aWxkSWR9YCxcbiAgKTtcblxuICAvLyAzLiBEZWxldGUgaXRlbXMgaW4gYmF0Y2hlcyAocmVzcGVjdGluZyBEeW5hbW9EQidzIDI1IGl0ZW1zIHBlciBiYXRjaCBsaW1pdClcbiAgaWYgKGl0ZW1zVG9EZWxldGUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRlbGV0ZUJhdGNoZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNUb0RlbGV0ZS5sZW5ndGg7IGkgKz0gMjUpIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gaXRlbXNUb0RlbGV0ZS5zbGljZShpLCBpICsgMjUpO1xuICAgICAgZGVsZXRlQmF0Y2hlcy5wdXNoKGJhdGNoKTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9jZXNzQmF0Y2goXG4gICAgICBkZWxldGVCYXRjaGVzLFxuICAgICAgNSwgLy8gUHJvY2VzcyB1cCB0byA1IGRlbGV0ZSBiYXRjaGVzIGluIHBhcmFsbGVsXG4gICAgICBhc3luYyAoYmF0Y2gpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkZWxldGVSZXF1ZXN0cyA9IGJhdGNoLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgIERlbGV0ZVJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgS2V5OiBpdGVtLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGBEZWxldGluZyByZXZhbGlkYXRpb24gZW50cmllczogJHtiYXRjaC5tYXAoKGIpID0+IGAke2IucGsuU30vJHtiLnNrLlN9YCkuam9pbihcIiwgXCIpfSBmcm9tICR7dGFibGVOYW1lfWAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGF3YWl0IGR5bmFtb0NsaWVudC5zZW5kKFxuICAgICAgICAgICAgbmV3IEJhdGNoV3JpdGVJdGVtQ29tbWFuZCh7XG4gICAgICAgICAgICAgIFJlcXVlc3RJdGVtczoge1xuICAgICAgICAgICAgICAgIFt0YWJsZU5hbWVdOiBkZWxldGVSZXF1ZXN0cyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGBEZWxldGVkICR7YmF0Y2gubGVuZ3RofSByZXZhbGlkYXRpb24gZW50cmllcyBmcm9tICR7dGFibGVOYW1lfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZGVsZXRpbmcgcmV2YWxpZGF0aW9uIGVudHJpZXM6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gNC4gVXBkYXRlIG1ldGFkYXRhIHdpdGggbmV3IGJ1aWxkIElEXG4gIGF3YWl0IHVwZGF0ZU1ldGFkYXRhKHRhYmxlTmFtZSwgY3VycmVudEJ1aWxkSWQpO1xuXG4gIGRlYnVnKFxuICAgIGBSZXZhbGlkYXRpb24gdGFibGUgcHJ1bmluZyBjb21wbGV0ZS4gRGVsZXRlZCAke2l0ZW1zVG9EZWxldGUubGVuZ3RofSBlbnRyaWVzIGZyb20gJHt0YWJsZU5hbWV9YCxcbiAgKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIG1ldGFkYXRhIGVudHJ5IHdpdGggdGhlIGN1cnJlbnQgYnVpbGQgSURcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWV0YWRhdGEoXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBjdXJyZW50QnVpbGRJZDogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHB1dENvbW1hbmQgPSBuZXcgUHV0SXRlbUNvbW1hbmQoe1xuICAgIFRhYmxlTmFtZTogdGFibGVOYW1lLFxuICAgIEl0ZW06IHtcbiAgICAgIHBrOiB7IFM6IFwiTUVUQURBVEFcIiB9LFxuICAgICAgc2s6IHsgUzogXCJDVVJSRU5UX0JVSUxEXCIgfSxcbiAgICAgIGJ1aWxkSWQ6IHsgUzogY3VycmVudEJ1aWxkSWQgfSxcbiAgICAgIHVwZGF0ZWRBdDogeyBOOiBEYXRlLm5vdygpLnRvU3RyaW5nKCkgfSxcbiAgICB9LFxuICB9KTtcblxuICBhd2FpdCBkeW5hbW9DbGllbnQuc2VuZChwdXRDb21tYW5kKTtcbiAgZGVidWcoYFVwZGF0ZWQgbWV0YWRhdGEgd2l0aCBjdXJyZW50IGJ1aWxkIElEOiAke2N1cnJlbnRCdWlsZElkfWApO1xufVxuXG4vKipcbiAqIFByb2Nlc3MgaXRlbXMgaW4gYmF0Y2hlcyB0byBhdm9pZCBvdmVyd2hlbG1pbmcgdGhlIHN5c3RlbVxuICovXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzQmF0Y2g8VCwgUj4oXG4gIGl0ZW1zOiBUW10sXG4gIGJhdGNoU2l6ZTogbnVtYmVyLFxuICBwcm9jZXNzRm46IChpdGVtOiBUKSA9PiBQcm9taXNlPFI+LFxuKTogUHJvbWlzZTxSW10+IHtcbiAgY29uc3QgcmVzdWx0czogUltdID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkgKz0gYmF0Y2hTaXplKSB7XG4gICAgY29uc3QgYmF0Y2ggPSBpdGVtcy5zbGljZShpLCBpICsgYmF0Y2hTaXplKTtcbiAgICBjb25zdCBiYXRjaFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChiYXRjaC5tYXAocHJvY2Vzc0ZuKSk7XG4gICAgcmVzdWx0cy5wdXNoKC4uLmJhdGNoUmVzdWx0cyk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0cztcbn1cbiJdfQ==
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJ1bmUtcmV2YWxpZGF0aW9uLXRhYmxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xhbWJkYXMvcG9zdC1kZXBsb3kvcHJ1bmUtcmV2YWxpZGF0aW9uLXRhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBOEJBLHdEQTBIQztBQXhKRCw2REFBNkQ7QUFDN0QsOERBTWtDO0FBQ2xDLDZEQUE2RDtBQUM3RCxrREFBNkI7QUFDN0IseUNBQTBDO0FBRTFDLE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBUSxFQUFDLGlEQUFpRCxDQUFDLENBQUM7QUFFMUUsTUFBTSxZQUFZLEdBQUcsSUFBSSxnQ0FBYyxFQUFFLENBQUM7QUFPMUM7Ozs7Ozs7O0dBUUc7QUFDSSxLQUFLLFVBQVUsc0JBQXNCLENBQzFDLEtBQWtDO0lBRWxDLE1BQU0sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLEdBQUcsS0FBSyxDQUFDO0lBRTVDLDRDQUE0QztJQUM1QyxNQUFNLFVBQVUsR0FBRyxJQUFJLGdDQUFjLENBQUM7UUFDcEMsU0FBUyxFQUFFLFNBQVM7UUFDcEIsR0FBRyxFQUFFO1lBQ0gsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRTtZQUNyQixFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsZUFBZSxFQUFFO1NBQzNCO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsSUFBSSxlQUFtQyxDQUFDO0lBQ3hDLElBQUksQ0FBQztRQUNILE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzdELGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLEtBQUssQ0FBQywyREFBMkQsQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7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LE1BQU0sWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwQyxLQUFLLENBQUMsMkNBQTJDLGNBQWMsRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcbmltcG9ydCB7XG4gIER5bmFtb0RCQ2xpZW50LFxuICBRdWVyeUNvbW1hbmQsXG4gIEdldEl0ZW1Db21tYW5kLFxuICBQdXRJdGVtQ29tbWFuZCxcbiAgQmF0Y2hXcml0ZUl0ZW1Db21tYW5kLFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgZ2V0RGVidWcgZnJvbSBcImRlYnVnXCI7XG5pbXBvcnQgeyBwcm9jZXNzQmF0Y2ggfSBmcm9tIFwiLi9wcnVuZS1zM1wiO1xuXG5jb25zdCBkZWJ1ZyA9IGdldERlYnVnKFwiY2RrLW5leHRqczpwb3N0LWRlcGxveTpwcnVuZS1yZXZhbGlkYXRpb24tdGFibGVcIik7XG5cbmNvbnN0IGR5bmFtb0NsaWVudCA9IG5ldyBEeW5hbW9EQkNsaWVudCgpO1xuXG5pbnRlcmZhY2UgUHJ1bmVSZXZhbGlkYXRpb25UYWJsZVByb3BzIHtcbiAgdGFibGVOYW1lOiBzdHJpbmc7XG4gIGN1cnJlbnRCdWlsZElkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogR2l2ZW4gYHRhYmxlTmFtZWAgYW5kIGBjdXJyZW50QnVpbGRJZGAsIHF1ZXJ5IHRoZSBwcmV2aW91cyBidWlsZCdzIHJldmFsaWRhdGlvbiBlbnRyaWVzXG4gKiBhbmQgZGVsZXRlIHRoZW0gZWZmaWNpZW50bHkuIFVzZXMgbWV0YWRhdGEgZW50cnkgdG8gdHJhY2sgY3VycmVudCBidWlsZCBJRC5cbiAqXG4gKiBTY2hlbWE6XG4gKiAtIFJldmFsaWRhdGlvbiBlbnRyaWVzOiBwaz1idWlsZElkLCBzaz10YWcjY2FjaGVLZXlcbiAqIC0gUmV2YWxpZGF0aW9uIGxvZyByb3dzOiBwaz1idWlsZElkI2xvZywgc2s9dGltZXN0YW1wI3RhZ1xuICogLSBNZXRhZGF0YSBlbnRyeTogcGs9XCJNRVRBREFUQVwiLCBzaz1cIkNVUlJFTlRfQlVJTERcIiwgYnVpbGRJZD1jdXJyZW50QnVpbGRJZFxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcHJ1bmVSZXZhbGlkYXRpb25UYWJsZShcbiAgcHJvcHM6IFBydW5lUmV2YWxpZGF0aW9uVGFibGVQcm9wcyxcbikge1xuICBjb25zdCB7IHRhYmxlTmFtZSwgY3VycmVudEJ1aWxkSWQgfSA9IHByb3BzO1xuXG4gIC8vIDEuIFJlYWQgbWV0YWRhdGEgdG8gZ2V0IHByZXZpb3VzIGJ1aWxkIElEXG4gIGNvbnN0IGdldENvbW1hbmQgPSBuZXcgR2V0SXRlbUNvbW1hbmQoe1xuICAgIFRhYmxlTmFtZTogdGFibGVOYW1lLFxuICAgIEtleToge1xuICAgICAgcGs6IHsgUzogXCJNRVRBREFUQVwiIH0sXG4gICAgICBzazogeyBTOiBcIkNVUlJFTlRfQlVJTERcIiB9LFxuICAgIH0sXG4gIH0pO1xuXG4gIGxldCBwcmV2aW91c0J1aWxkSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBtZXRhZGF0YVJlc3BvbnNlID0gYXdhaXQgZHluYW1vQ2xpZW50LnNlbmQoZ2V0Q29tbWFuZCk7XG4gICAgcHJldmlvdXNCdWlsZElkID0gbWV0YWRhdGFSZXNwb25zZS5JdGVtPy5idWlsZElkPy5TO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGRlYnVnKFwiTm8gbWV0YWRhdGEgZW50cnkgZm91bmQsIHRoaXMgbWF5IGJlIHRoZSBmaXJzdCBkZXBsb3ltZW50XCIpO1xuICB9XG5cbiAgaWYgKCFwcmV2aW91c0J1aWxkSWQpIHtcbiAgICBkZWJ1ZyhcIk5vIHByZXZpb3VzIGJ1aWxkIHRvIHBydW5lXCIpO1xuICAgIC8vIFVwZGF0ZSBtZXRhZGF0YSB3aXRoIGN1cnJlbnQgYnVpbGQgSUQgZm9yIG5leHQgZGVwbG95bWVudFxuICAgIGF3YWl0IHVwZGF0ZU1ldGFkYXRhKHRhYmxlTmFtZSwgY3VycmVudEJ1aWxkSWQpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChwcmV2aW91c0J1aWxkSWQgPT09IGN1cnJlbnRCdWlsZElkKSB7XG4gICAgZGVidWcoXG4gICAgICBgUHJldmlvdXMgYnVpbGQgSUQgbWF0Y2hlcyBjdXJyZW50IGJ1aWxkIElEICgke2N1cnJlbnRCdWlsZElkfSksIG5vdGhpbmcgdG8gcHJ1bmVgLFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZGVidWcoYFBydW5pbmcgcmV2YWxpZGF0aW9uIGVudHJpZXMgZm9yIHByZXZpb3VzIGJ1aWxkOiAke3ByZXZpb3VzQnVpbGRJZH1gKTtcblxuICAvLyAyLiBRdWVyeSBhbGwgaXRlbXMgZm9yIHByZXZpb3VzIGJ1aWxkIElEIChlZmZpY2llbnQgcGFydGl0aW9uIHF1ZXJpZXMpOlxuICAvLyBpdHMgbWFya2VyIHJvd3MsIGFuZCBpdHMgcmV2YWxpZGF0aW9uIGxvZyByb3dzLCB3aGljaCBhIHRhYmxlIHdpdGhvdXQgVFRMXG4gIC8vIHdvdWxkIG90aGVyd2lzZSBrZWVwIGZvcmV2ZXIuXG4gIGNvbnN0IGl0ZW1zVG9EZWxldGU6IEFycmF5PHsgcGs6IHsgUzogc3RyaW5nIH07IHNrOiB7IFM6IHN0cmluZyB9IH0+ID0gW107XG5cbiAgZm9yIChjb25zdCBwayBvZiBbcHJldmlvdXNCdWlsZElkLCBgJHtwcmV2aW91c0J1aWxkSWR9I2xvZ2BdKSB7XG4gICAgbGV0IGxhc3RFdmFsdWF0ZWRLZXk6IFJlY29yZDxzdHJpbmcsIGFueT4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgZG8ge1xuICAgICAgY29uc3QgcXVlcnlDb21tYW5kOiBRdWVyeUNvbW1hbmQgPSBuZXcgUXVlcnlDb21tYW5kKHtcbiAgICAgICAgVGFibGVOYW1lOiB0YWJsZU5hbWUsXG4gICAgICAgIEtleUNvbmRpdGlvbkV4cHJlc3Npb246IFwicGsgPSA6cGtcIixcbiAgICAgICAgRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlczoge1xuICAgICAgICAgIFwiOnBrXCI6IHsgUzogcGsgfSxcbiAgICAgICAgfSxcbiAgICAgICAgRXhjbHVzaXZlU3RhcnRLZXk6IGxhc3RFdmFsdWF0ZWRLZXksXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBkeW5hbW9DbGllbnQuc2VuZChxdWVyeUNvbW1hbmQpO1xuXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcmVzcG9uc2UuSXRlbXMgPz8gW10pIHtcbiAgICAgICAgaWYgKGl0ZW0ucGs/LlMgJiYgaXRlbS5zaz8uUykge1xuICAgICAgICAgIGl0ZW1zVG9EZWxldGUucHVzaCh7XG4gICAgICAgICAgICBwazogeyBTOiBpdGVtLnBrLlMgfSxcbiAgICAgICAgICAgIHNrOiB7IFM6IGl0ZW0uc2suUyB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGxhc3RFdmFsdWF0ZWRLZXkgPSByZXNwb25zZS5MYXN0RXZhbHVhdGVkS2V5O1xuICAgIH0gd2hpbGUgKGxhc3RFdmFsdWF0ZWRLZXkpO1xuICB9XG5cbiAgZGVidWcoXG4gICAgYEZvdW5kICR7aXRlbXNUb0RlbGV0ZS5sZW5ndGh9IHJldmFsaWRhdGlvbiBlbnRyaWVzIHRvIGRlbGV0ZSBmb3IgYnVpbGQgJHtwcmV2aW91c0J1aWxkSWR9YCxcbiAgKTtcblxuICAvLyAzLiBEZWxldGUgaXRlbXMgaW4gYmF0Y2hlcyAocmVzcGVjdGluZyBEeW5hbW9EQidzIDI1IGl0ZW1zIHBlciBiYXRjaCBsaW1pdClcbiAgaWYgKGl0ZW1zVG9EZWxldGUubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGRlbGV0ZUJhdGNoZXMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXNUb0RlbGV0ZS5sZW5ndGg7IGkgKz0gMjUpIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gaXRlbXNUb0RlbGV0ZS5zbGljZShpLCBpICsgMjUpO1xuICAgICAgZGVsZXRlQmF0Y2hlcy5wdXNoKGJhdGNoKTtcbiAgICB9XG5cbiAgICBhd2FpdCBwcm9jZXNzQmF0Y2goXG4gICAgICBkZWxldGVCYXRjaGVzLFxuICAgICAgNSwgLy8gUHJvY2VzcyB1cCB0byA1IGRlbGV0ZSBiYXRjaGVzIGluIHBhcmFsbGVsXG4gICAgICBhc3luYyAoYmF0Y2gpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkZWxldGVSZXF1ZXN0cyA9IGJhdGNoLm1hcCgoaXRlbSkgPT4gKHtcbiAgICAgICAgICAgIERlbGV0ZVJlcXVlc3Q6IHtcbiAgICAgICAgICAgICAgS2V5OiBpdGVtLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGBEZWxldGluZyByZXZhbGlkYXRpb24gZW50cmllczogJHtiYXRjaC5tYXAoKGIpID0+IGAke2IucGsuU30vJHtiLnNrLlN9YCkuam9pbihcIiwgXCIpfSBmcm9tICR7dGFibGVOYW1lfWAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGF3YWl0IGR5bmFtb0NsaWVudC5zZW5kKFxuICAgICAgICAgICAgbmV3IEJhdGNoV3JpdGVJdGVtQ29tbWFuZCh7XG4gICAgICAgICAgICAgIFJlcXVlc3RJdGVtczoge1xuICAgICAgICAgICAgICAgIFt0YWJsZU5hbWVdOiBkZWxldGVSZXF1ZXN0cyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGBEZWxldGVkICR7YmF0Y2gubGVuZ3RofSByZXZhbGlkYXRpb24gZW50cmllcyBmcm9tICR7dGFibGVOYW1lfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFwiRXJyb3IgZGVsZXRpbmcgcmV2YWxpZGF0aW9uIGVudHJpZXM6XCIsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgLy8gNC4gVXBkYXRlIG1ldGFkYXRhIHdpdGggbmV3IGJ1aWxkIElEXG4gIGF3YWl0IHVwZGF0ZU1ldGFkYXRhKHRhYmxlTmFtZSwgY3VycmVudEJ1aWxkSWQpO1xuXG4gIGRlYnVnKFxuICAgIGBSZXZhbGlkYXRpb24gdGFibGUgcHJ1bmluZyBjb21wbGV0ZS4gRGVsZXRlZCAke2l0ZW1zVG9EZWxldGUubGVuZ3RofSBlbnRyaWVzIGZyb20gJHt0YWJsZU5hbWV9YCxcbiAgKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIG1ldGFkYXRhIGVudHJ5IHdpdGggdGhlIGN1cnJlbnQgYnVpbGQgSURcbiAqL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlTWV0YWRhdGEoXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBjdXJyZW50QnVpbGRJZDogc3RyaW5nLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHB1dENvbW1hbmQgPSBuZXcgUHV0SXRlbUNvbW1hbmQoe1xuICAgIFRhYmxlTmFtZTogdGFibGVOYW1lLFxuICAgIEl0ZW06IHtcbiAgICAgIHBrOiB7IFM6IFwiTUVUQURBVEFcIiB9LFxuICAgICAgc2s6IHsgUzogXCJDVVJSRU5UX0JVSUxEXCIgfSxcbiAgICAgIGJ1aWxkSWQ6IHsgUzogY3VycmVudEJ1aWxkSWQgfSxcbiAgICAgIHVwZGF0ZWRBdDogeyBOOiBEYXRlLm5vdygpLnRvU3RyaW5nKCkgfSxcbiAgICB9LFxuICB9KTtcblxuICBhd2FpdCBkeW5hbW9DbGllbnQuc2VuZChwdXRDb21tYW5kKTtcbiAgZGVidWcoYFVwZGF0ZWQgbWV0YWRhdGEgd2l0aCBjdXJyZW50IGJ1aWxkIElEOiAke2N1cnJlbnRCdWlsZElkfWApO1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable import/no-extraneous-dependencies */
|
|
4
|
+
// Only the client is mocked, as in `prune-cache-bucket.test.ts`: the module
|
|
5
|
+
// constructs its client at module scope, before the mock variables exist.
|
|
6
|
+
jest.mock("@aws-sdk/client-dynamodb", () => ({
|
|
7
|
+
...jest.requireActual("@aws-sdk/client-dynamodb"),
|
|
8
|
+
DynamoDBClient: jest.fn(() => ({
|
|
9
|
+
send: (...args) => holder.send(...args),
|
|
10
|
+
})),
|
|
11
|
+
}));
|
|
12
|
+
const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
|
|
13
|
+
const prune_revalidation_table_1 = require("./prune-revalidation-table");
|
|
14
|
+
const holder = { send: jest.fn() };
|
|
15
|
+
/**
|
|
16
|
+
* A fake table whose metadata names `previousBuildId`; each Query pages
|
|
17
|
+
* `pageSize` rows at a time of the partition asked for.
|
|
18
|
+
*/
|
|
19
|
+
function stubTable(previousBuildId, rows, pageSize = 2) {
|
|
20
|
+
holder.send.mockImplementation((command) => {
|
|
21
|
+
if (command instanceof client_dynamodb_1.GetItemCommand) {
|
|
22
|
+
return Promise.resolve({ Item: { buildId: { S: previousBuildId } } });
|
|
23
|
+
}
|
|
24
|
+
if (command instanceof client_dynamodb_1.QueryCommand) {
|
|
25
|
+
const pk = command.input.ExpressionAttributeValues[":pk"].S;
|
|
26
|
+
const offset = Number(command.input.ExclusiveStartKey?.offset.N ?? 0);
|
|
27
|
+
const sks = rows[pk] ?? [];
|
|
28
|
+
return Promise.resolve({
|
|
29
|
+
Items: sks
|
|
30
|
+
.slice(offset, offset + pageSize)
|
|
31
|
+
.map((sk) => ({ pk: { S: pk }, sk: { S: sk } })),
|
|
32
|
+
LastEvaluatedKey: offset + pageSize < sks.length
|
|
33
|
+
? { offset: { N: String(offset + pageSize) } }
|
|
34
|
+
: undefined,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
return Promise.resolve({});
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function sent(type) {
|
|
41
|
+
return holder.send.mock.calls
|
|
42
|
+
.map(([command]) => command)
|
|
43
|
+
.filter((command) => command instanceof type);
|
|
44
|
+
}
|
|
45
|
+
describe("pruneRevalidationTable", () => {
|
|
46
|
+
beforeEach(() => {
|
|
47
|
+
holder.send.mockReset();
|
|
48
|
+
});
|
|
49
|
+
it("deletes the previous build's marker and log rows, then records the current build", async () => {
|
|
50
|
+
stubTable("old", {
|
|
51
|
+
old: ["tag-a", "tag-b", "tag-c"],
|
|
52
|
+
"old#log": ["000000000000001#tag-a", "000000000000002#tag-b"],
|
|
53
|
+
current: ["tag-a"],
|
|
54
|
+
"current#log": ["000000000000003#tag-a"],
|
|
55
|
+
});
|
|
56
|
+
await (0, prune_revalidation_table_1.pruneRevalidationTable)({
|
|
57
|
+
tableName: "table",
|
|
58
|
+
currentBuildId: "current",
|
|
59
|
+
});
|
|
60
|
+
const deleted = sent(client_dynamodb_1.BatchWriteItemCommand).flatMap((command) => command.input.RequestItems.table.map((request) => `${request.DeleteRequest.Key.pk.S}/${request.DeleteRequest.Key.sk.S}`));
|
|
61
|
+
expect(deleted.sort()).toEqual([
|
|
62
|
+
"old/tag-a",
|
|
63
|
+
"old/tag-b",
|
|
64
|
+
"old/tag-c",
|
|
65
|
+
"old#log/000000000000001#tag-a",
|
|
66
|
+
"old#log/000000000000002#tag-b",
|
|
67
|
+
].sort());
|
|
68
|
+
expect(sent(client_dynamodb_1.PutItemCommand)[0].input.Item.buildId.S).toBe("current");
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJ1bmUtcmV2YWxpZGF0aW9uLXRhYmxlLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGFtYmRhcy9wb3N0LWRlcGxveS9wcnVuZS1yZXZhbGlkYXRpb24tdGFibGUudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCw0RUFBNEU7QUFDNUUsMEVBQTBFO0FBQzFFLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUMzQyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsMEJBQTBCLENBQUM7SUFDakQsY0FBYyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUM3QixJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQWUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztLQUNuRCxDQUFDLENBQUM7Q0FDSixDQUFDLENBQUMsQ0FBQztBQUVKLDhEQUtrQztBQUNsQyx5RUFBb0U7QUFFcEUsTUFBTSxNQUFNLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUM7QUFFbkM7OztHQUdHO0FBQ0gsU0FBUyxTQUFTLENBQ2hCLGVBQXVCLEVBQ3ZCLElBQThCLEVBQzlCLFFBQVEsR0FBRyxDQUFDO0lBRVosTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQWdCLEVBQUUsRUFBRTtRQUNsRCxJQUFJLE9BQU8sWUFBWSxnQ0FBYyxFQUFFLENBQUM7WUFDdEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFDRCxJQUFJLE9BQU8sWUFBWSw4QkFBWSxFQUFFLENBQUM7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QUMsSUFBSSxFQUFFLENBQ1QsQ0FBQztRQUNGLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0NBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4RSxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzICovXG4vLyBPbmx5IHRoZSBjbGllbnQgaXMgbW9ja2VkLCBhcyBpbiBgcHJ1bmUtY2FjaGUtYnVja2V0LnRlc3QudHNgOiB0aGUgbW9kdWxlXG4vLyBjb25zdHJ1Y3RzIGl0cyBjbGllbnQgYXQgbW9kdWxlIHNjb3BlLCBiZWZvcmUgdGhlIG1vY2sgdmFyaWFibGVzIGV4aXN0LlxuamVzdC5tb2NrKFwiQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiXCIsICgpID0+ICh7XG4gIC4uLmplc3QucmVxdWlyZUFjdHVhbChcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiKSxcbiAgRHluYW1vREJDbGllbnQ6IGplc3QuZm4oKCkgPT4gKHtcbiAgICBzZW5kOiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBob2xkZXIuc2VuZCguLi5hcmdzKSxcbiAgfSkpLFxufSkpO1xuXG5pbXBvcnQge1xuICBCYXRjaFdyaXRlSXRlbUNvbW1hbmQsXG4gIEdldEl0ZW1Db21tYW5kLFxuICBQdXRJdGVtQ29tbWFuZCxcbiAgUXVlcnlDb21tYW5kLFxufSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LWR5bmFtb2RiXCI7XG5pbXBvcnQgeyBwcnVuZVJldmFsaWRhdGlvblRhYmxlIH0gZnJvbSBcIi4vcHJ1bmUtcmV2YWxpZGF0aW9uLXRhYmxlXCI7XG5cbmNvbnN0IGhvbGRlciA9IHsgc2VuZDogamVzdC5mbigpIH07XG5cbi8qKlxuICogQSBmYWtlIHRhYmxlIHdob3NlIG1ldGFkYXRhIG5hbWVzIGBwcmV2aW91c0J1aWxkSWRgOyBlYWNoIFF1ZXJ5IHBhZ2VzXG4gKiBgcGFnZVNpemVgIHJvd3MgYXQgYSB0aW1lIG9mIHRoZSBwYXJ0aXRpb24gYXNrZWQgZm9yLlxuICovXG5mdW5jdGlvbiBzdHViVGFibGUoXG4gIHByZXZpb3VzQnVpbGRJZDogc3RyaW5nLFxuICByb3dzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4sXG4gIHBhZ2VTaXplID0gMixcbik6IHZvaWQge1xuICBob2xkZXIuc2VuZC5tb2NrSW1wbGVtZW50YXRpb24oKGNvbW1hbmQ6IHVua25vd24pID0+IHtcbiAgICBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIEdldEl0ZW1Db21tYW5kKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgSXRlbTogeyBidWlsZElkOiB7IFM6IHByZXZpb3VzQnVpbGRJZCB9IH0gfSk7XG4gICAgfVxuICAgIGlmIChjb21tYW5kIGluc3RhbmNlb2YgUXVlcnlDb21tYW5kKSB7XG4gICAgICBjb25zdCBwayA9IGNvbW1hbmQuaW5wdXQuRXhwcmVzc2lvbkF0dHJpYnV0ZVZhbHVlcyFbXCI6cGtcIl0uUyE7XG4gICAgICBjb25zdCBvZmZzZXQgPSBOdW1iZXIoY29tbWFuZC5pbnB1dC5FeGNsdXNpdmVTdGFydEtleT8ub2Zmc2V0Lk4gPz8gMCk7XG4gICAgICBjb25zdCBza3MgPSByb3dzW3BrXSA/PyBbXTtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe1xuICAgICAgICBJdGVtczogc2tzXG4gICAgICAgICAgLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgcGFnZVNpemUpXG4gICAgICAgICAgLm1hcCgoc2spID0+ICh7IHBrOiB7IFM6IHBrIH0sIHNrOiB7IFM6IHNrIH0gfSkpLFxuICAgICAgICBMYXN0RXZhbHVhdGVkS2V5OlxuICAgICAgICAgIG9mZnNldCArIHBhZ2VTaXplIDwgc2tzLmxlbmd0aFxuICAgICAgICAgICAgPyB7IG9mZnNldDogeyBOOiBTdHJpbmcob2Zmc2V0ICsgcGFnZVNpemUpIH0gfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBzZW50PFQ+KHR5cGU6IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQpOiBUW10ge1xuICByZXR1cm4gaG9sZGVyLnNlbmQubW9jay5jYWxsc1xuICAgIC5tYXAoKFtjb21tYW5kXSkgPT4gY29tbWFuZClcbiAgICAuZmlsdGVyKChjb21tYW5kKTogY29tbWFuZCBpcyBUID0+IGNvbW1hbmQgaW5zdGFuY2VvZiB0eXBlKTtcbn1cblxuZGVzY3JpYmUoXCJwcnVuZVJldmFsaWRhdGlvblRhYmxlXCIsICgpID0+IHtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgaG9sZGVyLnNlbmQubW9ja1Jlc2V0KCk7XG4gIH0pO1xuXG4gIGl0KFwiZGVsZXRlcyB0aGUgcHJldmlvdXMgYnVpbGQncyBtYXJrZXIgYW5kIGxvZyByb3dzLCB0aGVuIHJlY29yZHMgdGhlIGN1cnJlbnQgYnVpbGRcIiwgYXN5bmMgKCkgPT4ge1xuICAgIHN0dWJUYWJsZShcIm9sZFwiLCB7XG4gICAgICBvbGQ6IFtcInRhZy1hXCIsIFwidGFnLWJcIiwgXCJ0YWctY1wiXSxcbiAgICAgIFwib2xkI2xvZ1wiOiBbXCIwMDAwMDAwMDAwMDAwMDEjdGFnLWFcIiwgXCIwMDAwMDAwMDAwMDAwMDIjdGFnLWJcIl0sXG4gICAgICBjdXJyZW50OiBbXCJ0YWctYVwiXSxcbiAgICAgIFwiY3VycmVudCNsb2dcIjogW1wiMDAwMDAwMDAwMDAwMDAzI3RhZy1hXCJdLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgcHJ1bmVSZXZhbGlkYXRpb25UYWJsZSh7XG4gICAgICB0YWJsZU5hbWU6IFwidGFibGVcIixcbiAgICAgIGN1cnJlbnRCdWlsZElkOiBcImN1cnJlbnRcIixcbiAgICB9KTtcblxuICAgIGNvbnN0IGRlbGV0ZWQgPSBzZW50KEJhdGNoV3JpdGVJdGVtQ29tbWFuZCkuZmxhdE1hcCgoY29tbWFuZCkgPT5cbiAgICAgIGNvbW1hbmQuaW5wdXQuUmVxdWVzdEl0ZW1zIS50YWJsZS5tYXAoXG4gICAgICAgIChyZXF1ZXN0KSA9PlxuICAgICAgICAgIGAke3JlcXVlc3QuRGVsZXRlUmVxdWVzdCEuS2V5IS5way5TfS8ke3JlcXVlc3QuRGVsZXRlUmVxdWVzdCEuS2V5IS5zay5TfWAsXG4gICAgICApLFxuICAgICk7XG4gICAgZXhwZWN0KGRlbGV0ZWQuc29ydCgpKS50b0VxdWFsKFxuICAgICAgW1xuICAgICAgICBcIm9sZC90YWctYVwiLFxuICAgICAgICBcIm9sZC90YWctYlwiLFxuICAgICAgICBcIm9sZC90YWctY1wiLFxuICAgICAgICBcIm9sZCNsb2cvMDAwMDAwMDAwMDAwMDAxI3RhZy1hXCIsXG4gICAgICAgIFwib2xkI2xvZy8wMDAwMDAwMDAwMDAwMDIjdGFnLWJcIixcbiAgICAgIF0uc29ydCgpLFxuICAgICk7XG4gICAgZXhwZWN0KHNlbnQoUHV0SXRlbUNvbW1hbmQpWzBdLmlucHV0Lkl0ZW0hLmJ1aWxkSWQuUykudG9CZShcImN1cnJlbnRcIik7XG4gIH0pO1xufSk7XG4iXX0=
|
|
@@ -7,16 +7,25 @@ interface PruneS3Props {
|
|
|
7
7
|
msTtl: number;
|
|
8
8
|
/**
|
|
9
9
|
* S3 key prefix the app's static assets live under. Surrounding slashes are
|
|
10
|
-
* normalized away. Scopes pruning to this app's objects so that apps
|
|
11
|
-
* branches sharing one bucket under different `basePath`s don't delete
|
|
12
|
-
* other's assets. Empty or omitted prunes the
|
|
10
|
+
* normalized away. Scopes pruning to this app's `_next/` objects so that apps
|
|
11
|
+
* or branches sharing one bucket under different `basePath`s don't delete
|
|
12
|
+
* each other's assets. Empty or omitted prunes `_next/` at the bucket root.
|
|
13
13
|
*/
|
|
14
14
|
keyPrefix?: string;
|
|
15
15
|
}
|
|
16
16
|
/**
|
|
17
17
|
* Given `bucketName`, `currentBuildId`, and `msTtl`, list the objects under
|
|
18
|
-
* `keyPrefix` and delete any that 1/
|
|
19
|
-
*
|
|
18
|
+
* `keyPrefix`'s `_next/` and delete any that 1/ carry a build id that is not
|
|
19
|
+
* `currentBuildId` and 2/ were created more than `msTtl` ago.
|
|
20
|
+
*
|
|
21
|
+
* An object with no build id at all is kept. It was not uploaded by this
|
|
22
|
+
* construct's `BucketDeployment` — which stamps every object it writes — so
|
|
23
|
+
* nothing here knows whether some other stack is serving it, and deleting a live
|
|
24
|
+
* asset 404s a page while keeping a stale one only costs storage.
|
|
20
25
|
*/
|
|
21
26
|
export declare function pruneS3(props: PruneS3Props): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Process objects in batches to avoid overwhelming the system
|
|
29
|
+
*/
|
|
30
|
+
export declare function processBatch<T, R>(items: T[], batchSize: number, processFn: (item: T) => Promise<R>): Promise<R[]>;
|
|
22
31
|
export {};
|