cdk-nextjs 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/.jsii +2404 -2723
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +1681 -1930
  4. package/CLAUDE.md +2 -1
  5. package/README.md +429 -130
  6. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +148 -169
  7. package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
  8. package/docs/adapter-runtime.md +185 -0
  9. package/docs/breaking-changes.md +667 -4
  10. package/docs/caching-guide.md +156 -112
  11. package/docs/cdk-nextjs-cfn-exec-policy.json +2 -1
  12. package/docs/development-guide.md +1 -1
  13. package/docs/harness-coverage.md +598 -0
  14. package/docs/init-cache-deployment.md +32 -1
  15. package/docs/next-build-output-guide.md +30 -20
  16. package/examples/README.md +5 -1
  17. package/lib/adapter/__fixtures__/app-playground-base-path.json +4926 -0
  18. package/lib/adapter/__fixtures__/app-playground.json +4917 -0
  19. package/lib/adapter/__fixtures__/pages-i18n.json +1728 -0
  20. package/lib/adapter/adapter.mjs +1548 -185
  21. package/lib/adapter/adapter.test.js +106 -0
  22. package/lib/adapter/aws-cache-store.d.ts +489 -0
  23. package/lib/adapter/aws-cache-store.js +1004 -0
  24. package/lib/adapter/aws-cache-store.test.d.ts +1 -0
  25. package/lib/adapter/aws-cache-store.test.js +361 -0
  26. package/lib/adapter/build-outputs.d.ts +80 -0
  27. package/lib/adapter/build-outputs.js +852 -0
  28. package/lib/adapter/build-outputs.test.d.ts +1 -0
  29. package/lib/adapter/build-outputs.test.js +861 -0
  30. package/lib/adapter/cache-handler.d.ts +9 -2
  31. package/lib/adapter/cache-handler.js +72 -96
  32. package/lib/adapter/cache-handler.mjs +18956 -17774
  33. package/lib/adapter/cache-handler.test.js +263 -31
  34. package/lib/adapter/cache-kinds.d.ts +32 -0
  35. package/lib/adapter/cache-kinds.js +35 -0
  36. package/lib/adapter/cache-kinds.test.d.ts +1 -0
  37. package/lib/adapter/cache-kinds.test.js +69 -0
  38. package/lib/adapter/cache-utils.d.ts +90 -0
  39. package/lib/adapter/cache-utils.js +199 -4
  40. package/lib/adapter/cache-utils.test.d.ts +1 -0
  41. package/lib/adapter/cache-utils.test.js +179 -0
  42. package/lib/adapter/function-groups.d.ts +215 -0
  43. package/lib/adapter/function-groups.js +1099 -0
  44. package/lib/adapter/function-groups.test.d.ts +1 -0
  45. package/lib/adapter/function-groups.test.js +743 -0
  46. package/lib/adapter/init-cache.d.ts +6 -0
  47. package/lib/adapter/init-cache.js +245 -0
  48. package/lib/adapter/init-cache.test.d.ts +1 -0
  49. package/lib/adapter/init-cache.test.js +137 -0
  50. package/lib/adapter/local-file-cache-handler.d.ts +23 -0
  51. package/lib/adapter/local-file-cache-handler.js +52 -1
  52. package/lib/adapter/memory-cache-handler.d.ts +26 -17
  53. package/lib/adapter/memory-cache-handler.js +32 -50
  54. package/lib/adapter/memory-cache-handler.test.js +105 -85
  55. package/lib/adapter/s3-cache-handler.d.ts +179 -40
  56. package/lib/adapter/s3-cache-handler.js +807 -277
  57. package/lib/adapter/s3-cache-handler.test.js +1186 -31
  58. package/lib/adapter/use-cache-common.d.ts +90 -0
  59. package/lib/adapter/use-cache-common.js +250 -0
  60. package/lib/adapter/use-cache-common.test.d.ts +1 -0
  61. package/lib/adapter/use-cache-common.test.js +646 -0
  62. package/lib/adapter/use-cache-default-handler.d.ts +24 -0
  63. package/lib/adapter/use-cache-default-handler.js +90 -0
  64. package/lib/adapter/use-cache-default-handler.mjs +38645 -0
  65. package/lib/adapter/use-cache-handlers.test.d.ts +1 -0
  66. package/lib/adapter/use-cache-handlers.test.js +349 -0
  67. package/lib/adapter/use-cache-remote-handler.d.ts +26 -0
  68. package/lib/adapter/use-cache-remote-handler.js +186 -0
  69. package/lib/{image-optimization/handler.mjs → adapter/use-cache-remote-handler.mjs} +33572 -38798
  70. package/lib/generated-structs/OptionalNextjsApiProps.d.ts +59 -0
  71. package/lib/generated-structs/OptionalNextjsApiProps.js +3 -0
  72. package/lib/generated-structs/OptionalNextjsCacheProps.d.ts +15 -6
  73. package/lib/generated-structs/OptionalNextjsCacheProps.js +1 -1
  74. package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +25 -11
  75. package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
  76. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +31 -9
  77. package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
  78. package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +8 -0
  79. package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
  80. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +6 -4
  81. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +1 -1
  82. package/lib/index.d.ts +6 -7
  83. package/lib/index.js +2 -4
  84. package/lib/lambdas/post-deploy/prune-cache-bucket.d.ts +7 -3
  85. package/lib/lambdas/post-deploy/prune-cache-bucket.js +57 -71
  86. package/lib/lambdas/post-deploy/prune-cache-bucket.test.d.ts +1 -0
  87. package/lib/lambdas/post-deploy/prune-cache-bucket.test.js +114 -0
  88. package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +1 -0
  89. package/lib/lambdas/post-deploy/prune-revalidation-table.js +23 -31
  90. package/lib/lambdas/post-deploy/prune-revalidation-table.test.d.ts +1 -0
  91. package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +71 -0
  92. package/lib/lambdas/post-deploy/prune-s3.d.ts +14 -5
  93. package/lib/lambdas/post-deploy/prune-s3.js +41 -12
  94. package/lib/lambdas/post-deploy/prune-s3.test.js +97 -18
  95. package/lib/lambdas/redeploy-stage/redeploy-stage-function.d.ts +13 -0
  96. package/lib/lambdas/redeploy-stage/redeploy-stage-function.js +55 -0
  97. package/lib/lambdas/redeploy-stage/redeploy-stage.d.ts +24 -0
  98. package/lib/lambdas/redeploy-stage/redeploy-stage.js +68 -0
  99. package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.d.ts +20 -0
  100. package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.js +24 -0
  101. package/lib/lambdas/redeploy-stage/redeploy-stage.test.d.ts +1 -0
  102. package/lib/lambdas/redeploy-stage/redeploy-stage.test.js +93 -0
  103. package/lib/nextjs-api.d.ts +102 -18
  104. package/lib/nextjs-api.js +338 -38
  105. package/lib/nextjs-api.test.js +537 -1
  106. package/lib/nextjs-build/global-containers.Dockerfile +15 -10
  107. package/lib/nextjs-build/nextjs-build.d.ts +339 -63
  108. package/lib/nextjs-build/nextjs-build.js +684 -327
  109. package/lib/nextjs-build/nextjs-build.test.d.ts +1 -0
  110. package/lib/nextjs-build/nextjs-build.test.js +412 -0
  111. package/lib/nextjs-build/patch-fetch.js +1 -1
  112. package/lib/nextjs-build/patch-fetch.test.js +166 -11
  113. package/lib/nextjs-build/regional-containers.Dockerfile +17 -10
  114. package/lib/nextjs-cache.d.ts +82 -4
  115. package/lib/nextjs-cache.js +186 -10
  116. package/lib/nextjs-cache.test.js +176 -1
  117. package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +21 -8
  118. package/lib/nextjs-compute/nextjs-compute-base-props.js +41 -1
  119. package/lib/nextjs-compute/nextjs-compute-base-props.test.d.ts +1 -0
  120. package/lib/nextjs-compute/nextjs-compute-base-props.test.js +44 -0
  121. package/lib/nextjs-compute/nextjs-containers.d.ts +19 -0
  122. package/lib/nextjs-compute/nextjs-containers.js +57 -20
  123. package/lib/nextjs-compute/nextjs-functions.d.ts +122 -7
  124. package/lib/nextjs-compute/nextjs-functions.js +113 -67
  125. package/lib/nextjs-compute/nextjs-functions.test.d.ts +1 -0
  126. package/lib/nextjs-compute/nextjs-functions.test.js +99 -0
  127. package/lib/nextjs-distribution.d.ts +194 -23
  128. package/lib/nextjs-distribution.js +535 -62
  129. package/lib/nextjs-distribution.test.d.ts +1 -0
  130. package/lib/nextjs-distribution.test.js +697 -0
  131. package/lib/nextjs-post-deploy.d.ts +13 -5
  132. package/lib/nextjs-post-deploy.js +13 -10
  133. package/lib/nextjs-post-deploy.test.d.ts +1 -0
  134. package/lib/nextjs-post-deploy.test.js +34 -0
  135. package/lib/nextjs-static-assets.d.ts +17 -4
  136. package/lib/nextjs-static-assets.js +22 -5
  137. package/lib/root-constructs/nextjs-base-construct.d.ts +102 -58
  138. package/lib/root-constructs/nextjs-base-construct.js +139 -47
  139. package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
  140. package/lib/root-constructs/nextjs-global-containers.js +20 -71
  141. package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
  142. package/lib/root-constructs/nextjs-global-functions.js +52 -70
  143. package/lib/root-constructs/nextjs-regional-containers.d.ts +18 -5
  144. package/lib/root-constructs/nextjs-regional-containers.js +8 -15
  145. package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
  146. package/lib/root-constructs/nextjs-regional-functions.js +8 -26
  147. package/lib/runtime/api-gateway-path.d.ts +34 -0
  148. package/lib/runtime/api-gateway-path.js +71 -0
  149. package/lib/runtime/api-gateway-path.test.d.ts +1 -0
  150. package/lib/runtime/api-gateway-path.test.js +65 -0
  151. package/lib/runtime/case-redirect.d.ts +22 -0
  152. package/lib/runtime/case-redirect.js +63 -0
  153. package/lib/runtime/case-redirect.test.d.ts +1 -0
  154. package/lib/runtime/case-redirect.test.js +32 -0
  155. package/lib/runtime/core.d.ts +234 -0
  156. package/lib/runtime/core.js +1213 -0
  157. package/lib/runtime/core.test.d.ts +1 -0
  158. package/lib/runtime/core.test.js +1678 -0
  159. package/lib/runtime/deployment-root.d.ts +13 -0
  160. package/lib/runtime/deployment-root.js +29 -0
  161. package/lib/runtime/dispatch.d.ts +331 -0
  162. package/lib/runtime/dispatch.js +751 -0
  163. package/lib/runtime/dispatch.test.d.ts +1 -0
  164. package/lib/runtime/dispatch.test.js +853 -0
  165. package/lib/runtime/entrypoints.d.ts +57 -0
  166. package/lib/runtime/entrypoints.js +115 -0
  167. package/lib/runtime/http/abort-signal.d.ts +6 -0
  168. package/lib/runtime/http/abort-signal.js +19 -0
  169. package/lib/runtime/http/abort-signal.test.d.ts +1 -0
  170. package/lib/runtime/http/abort-signal.test.js +49 -0
  171. package/lib/runtime/http/node-server.d.ts +38 -0
  172. package/lib/runtime/http/node-server.js +99 -0
  173. package/lib/runtime/http/node-server.test.d.ts +1 -0
  174. package/lib/runtime/http/node-server.test.js +96 -0
  175. package/lib/runtime/http/node-sink.d.ts +16 -0
  176. package/lib/runtime/http/node-sink.js +48 -0
  177. package/lib/runtime/http/node-sink.test.d.ts +1 -0
  178. package/lib/runtime/http/node-sink.test.js +66 -0
  179. package/lib/runtime/http/request.d.ts +62 -0
  180. package/lib/runtime/http/request.js +134 -0
  181. package/lib/runtime/http/request.test.d.ts +1 -0
  182. package/lib/runtime/http/request.test.js +103 -0
  183. package/lib/runtime/http/response.d.ts +77 -0
  184. package/lib/runtime/http/response.js +229 -0
  185. package/lib/runtime/http/response.test.d.ts +1 -0
  186. package/lib/runtime/http/response.test.js +178 -0
  187. package/lib/runtime/http/sink.d.ts +73 -0
  188. package/lib/runtime/http/sink.js +188 -0
  189. package/lib/runtime/http/sink.test.d.ts +1 -0
  190. package/lib/runtime/http/sink.test.js +257 -0
  191. package/lib/runtime/image-utils.d.ts +78 -0
  192. package/lib/runtime/image-utils.js +129 -0
  193. package/lib/runtime/image-utils.test.d.ts +1 -0
  194. package/lib/runtime/image-utils.test.js +237 -0
  195. package/lib/runtime/image.d.ts +76 -0
  196. package/lib/runtime/image.js +296 -0
  197. package/lib/runtime/image.test.d.ts +1 -0
  198. package/lib/runtime/image.test.js +405 -0
  199. package/lib/runtime/lambda-event.d.ts +4 -0
  200. package/lib/runtime/lambda-event.js +113 -0
  201. package/lib/runtime/lambda-event.test.d.ts +1 -0
  202. package/lib/runtime/lambda-event.test.js +119 -0
  203. package/lib/runtime/lambda.mjs +41595 -0
  204. package/lib/runtime/load-module.d.ts +8 -0
  205. package/lib/runtime/load-module.js +35 -0
  206. package/lib/runtime/manifest.d.ts +215 -0
  207. package/lib/runtime/manifest.js +118 -0
  208. package/lib/runtime/middleware.d.ts +43 -0
  209. package/lib/runtime/middleware.js +113 -0
  210. package/lib/runtime/middleware.test.d.ts +1 -0
  211. package/lib/runtime/middleware.test.js +259 -0
  212. package/lib/runtime/next-modules.d.ts +55 -0
  213. package/lib/runtime/next-modules.js +124 -0
  214. package/lib/runtime/next-modules.test.d.ts +1 -0
  215. package/lib/runtime/next-modules.test.js +34 -0
  216. package/lib/runtime/public-files.d.ts +32 -0
  217. package/lib/runtime/public-files.js +117 -0
  218. package/lib/runtime/public-files.test.d.ts +1 -0
  219. package/lib/runtime/public-files.test.js +97 -0
  220. package/lib/runtime/server.mjs +41588 -0
  221. package/lib/runtime/static-files.d.ts +50 -0
  222. package/lib/runtime/static-files.js +266 -0
  223. package/lib/runtime/static-files.test.d.ts +1 -0
  224. package/lib/runtime/static-files.test.js +118 -0
  225. package/lib/runtime/util.d.ts +28 -0
  226. package/lib/runtime/util.js +79 -0
  227. package/lib/utils/base-path.d.ts +106 -13
  228. package/lib/utils/base-path.js +254 -41
  229. package/lib/utils/base-path.test.js +219 -51
  230. package/lib/utils/get-architecture.d.ts +7 -8
  231. package/lib/utils/get-architecture.js +12 -13
  232. package/lib/utils/zip-directory.d.ts +14 -0
  233. package/lib/utils/zip-directory.js +121 -0
  234. package/lib/utils/zip-directory.test.d.ts +1 -0
  235. package/lib/utils/zip-directory.test.js +99 -0
  236. package/package.json +22 -3
  237. package/scripts/capture-adapter-fixture.mjs +325 -0
  238. package/scripts/e2e-deploy.sh +398 -0
  239. package/scripts/e2e-harness/README.md +707 -0
  240. package/scripts/e2e-harness/app.js +370 -0
  241. package/scripts/e2e-harness/common.sh +249 -0
  242. package/scripts/e2e-harness/screen.mjs +302 -0
  243. package/scripts/e2e-harness/stage-proxy.mjs +145 -0
  244. package/scripts/e2e-harness/type-filters.mjs +47 -0
  245. package/scripts/e2e-logs.sh +75 -0
  246. package/scripts/e2e-offline.sh +91 -0
  247. package/scripts/e2e-sweep.sh +370 -0
  248. package/scripts/e2e-warm.sh +114 -0
  249. package/scripts/zero-config-build.mjs +418 -0
  250. package/docs/1k-concurrent-users-executions.png +0 -0
  251. package/docs/plans/adapter-runtime-release.md +0 -362
  252. package/docs/plans/phase-0-image-function-opt-in.md +0 -295
  253. package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +0 -425
  254. package/lib/generated-structs/OptionalDockerImageFunctionProps.js +0 -3
  255. package/lib/image-optimization/handler-utils.d.ts +0 -34
  256. package/lib/image-optimization/handler-utils.js +0 -83
  257. package/lib/image-optimization/handler-utils.test.js +0 -178
  258. package/lib/nextjs-build/functions.Dockerfile +0 -31
  259. package/lib/nextjs-compute/nextjs-image-function.d.ts +0 -53
  260. package/lib/nextjs-compute/nextjs-image-function.js +0 -59
  261. package/lib/utils/experimental-flags.d.ts +0 -24
  262. package/lib/utils/experimental-flags.js +0 -30
  263. /package/lib/{image-optimization/handler-utils.test.d.ts → adapter/adapter.test.d.ts} +0 -0
@@ -0,0 +1,90 @@
1
+ import type { CacheEntry, CacheHandler } from "next/dist/server/lib/cache-handlers/types";
2
+ import { TrackedTagMarkers } from "./aws-cache-store";
3
+ export { markerClock as now } from "./aws-cache-store";
4
+ /** Whether this process is `next build` rather than a deployed server. */
5
+ export declare function isBuildPhase(): boolean;
6
+ /** A positive integer environment variable, or `fallback`. */
7
+ export declare function numberFromEnv(name: string, fallback: number): number;
8
+ /**
9
+ * A `CacheEntry` with its value read to the end: the bytes are what is kept,
10
+ * and every `get` hands out a fresh stream over them.
11
+ */
12
+ export interface StoredEntry extends Omit<CacheEntry, "value"> {
13
+ value: Uint8Array;
14
+ }
15
+ /**
16
+ * Read `stream` to the end, or throw if it errors.
17
+ *
18
+ * `CacheEntry.value` "can error and only have partial data" (Next.js's
19
+ * `cache-handlers/types.d.ts`). Throwing is how a partial entry is kept out:
20
+ * both handlers store nothing when this rejects, which is what Next.js's own
21
+ * default handler does too.
22
+ */
23
+ export declare function readStream(stream: ReadableStream<Uint8Array>): Promise<Uint8Array>;
24
+ /** `pendingEntry` resolved and read to the end. See {@link readStream}. */
25
+ export declare function storedEntryOf(pendingEntry: Promise<CacheEntry>): Promise<StoredEntry>;
26
+ /** `stored` as the `CacheEntry` a `get` returns, with its own stream. */
27
+ export declare function cacheEntryOf(stored: StoredEntry, revalidate?: number): CacheEntry;
28
+ /**
29
+ * Whether Next.js would regenerate `entry` on every read anyway, so storing it
30
+ * is a write nothing reads back. Next.js's default handler skips these the same
31
+ * way, outside the dev server.
32
+ */
33
+ export declare function isDynamicEntry(entry: Pick<CacheEntry, "expire">): boolean;
34
+ /**
35
+ * The in-flight `set`s, by cache key. `CacheHandler.set` receives an entry that
36
+ * may still be streaming, and "if a `get` for the same cache key is called
37
+ * before the pending entry is complete, the cache handler must wait for the
38
+ * `set` operation to finish" (`cache-handlers/types.d.ts`).
39
+ */
40
+ export declare class PendingSets {
41
+ private readonly pending;
42
+ /** Resolves once no `set` for `key` is in flight. */
43
+ wait(key: string): Promise<void>;
44
+ /**
45
+ * Register a `set` for `key` and return the function that ends it. Safe to
46
+ * call more than once: only the registration it made is removed.
47
+ */
48
+ begin(key: string): () => void;
49
+ }
50
+ /**
51
+ * Stored entries by cache key, least recently used evicted first once their
52
+ * bytes pass `maxBytes`. Sized by bytes rather than entries, like Next.js's
53
+ * default handler (`cacheMaxMemorySize`, 50 MB), since a `'use cache'` entry is
54
+ * an RSC payload of any size.
55
+ */
56
+ export declare class EntryLru {
57
+ private readonly maxBytes;
58
+ private readonly entries;
59
+ private bytes;
60
+ constructor(maxBytes: number);
61
+ get(key: string): StoredEntry | undefined;
62
+ set(key: string, entry: StoredEntry): void;
63
+ delete(key: string): void;
64
+ get size(): number;
65
+ }
66
+ /** Default size of each handler's memory store: Next.js's default, 50 MB. */
67
+ export declare const DEFAULT_MEMORY_BYTES: number;
68
+ /**
69
+ * The `cacheHandlers` methods that only go through `tags`, the same for the
70
+ * `default` and `remote` handlers.
71
+ */
72
+ export declare function tagMethods(tags: TrackedTagMarkers): Pick<CacheHandler, "refreshTags" | "getExpiration" | "updateTags">;
73
+ /**
74
+ * A handler built by `create` on first use rather than on import, so loading
75
+ * the module - which jest, and Next.js's config validation, do without using
76
+ * it - neither constructs AWS clients nor warns about missing configuration.
77
+ */
78
+ export declare function lazyHandler(create: () => CacheHandler): CacheHandler;
79
+ /**
80
+ * The process's one {@link TrackedTagMarkers}, from the environment.
81
+ *
82
+ * Kept on `globalThis` because the incremental cache handler and the `default`
83
+ * and `remote` handlers are separate bundles - separate module instances - and
84
+ * should share one manifest: one refresh read for all of them, and one marker
85
+ * write per `revalidateTag`.
86
+ *
87
+ * At build time there is no table to read (and no credentials to read it
88
+ * with), so tags stay local to the process there.
89
+ */
90
+ export declare function sharedTagManifest(): TrackedTagMarkers;
@@ -0,0 +1,250 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DEFAULT_MEMORY_BYTES = exports.EntryLru = exports.PendingSets = exports.now = void 0;
7
+ exports.isBuildPhase = isBuildPhase;
8
+ exports.numberFromEnv = numberFromEnv;
9
+ exports.readStream = readStream;
10
+ exports.storedEntryOf = storedEntryOf;
11
+ exports.cacheEntryOf = cacheEntryOf;
12
+ exports.isDynamicEntry = isDynamicEntry;
13
+ exports.tagMethods = tagMethods;
14
+ exports.lazyHandler = lazyHandler;
15
+ exports.sharedTagManifest = sharedTagManifest;
16
+ /*
17
+ What the two `cacheHandlers` (`'use cache'` and `'use cache: remote'`) share:
18
+ the in-memory entry store, the pending-`set` bookkeeping Next.js requires of
19
+ every handler, and the process's one tag manifest (`TrackedTagMarkers`),
20
+ which makes `revalidateTag` reach every instance through the revalidation
21
+ table's marker rows.
22
+ */
23
+ /* eslint-disable import/no-extraneous-dependencies */
24
+ const client_dynamodb_1 = require("@aws-sdk/client-dynamodb");
25
+ const debug_1 = __importDefault(require("debug"));
26
+ const aws_cache_store_1 = require("./aws-cache-store");
27
+ var aws_cache_store_2 = require("./aws-cache-store");
28
+ Object.defineProperty(exports, "now", { enumerable: true, get: function () { return aws_cache_store_2.markerClock; } });
29
+ /** Whether this process is `next build` rather than a deployed server. */
30
+ function isBuildPhase() {
31
+ return process.env.NEXT_PHASE === "phase-production-build";
32
+ }
33
+ /** A positive integer environment variable, or `fallback`. */
34
+ function numberFromEnv(name, fallback) {
35
+ const raw = process.env[name];
36
+ const value = raw === undefined || raw === "" ? NaN : Number(raw);
37
+ return Number.isFinite(value) && value >= 0 ? value : fallback;
38
+ }
39
+ /**
40
+ * Read `stream` to the end, or throw if it errors.
41
+ *
42
+ * `CacheEntry.value` "can error and only have partial data" (Next.js's
43
+ * `cache-handlers/types.d.ts`). Throwing is how a partial entry is kept out:
44
+ * both handlers store nothing when this rejects, which is what Next.js's own
45
+ * default handler does too.
46
+ */
47
+ async function readStream(stream) {
48
+ const reader = stream.getReader();
49
+ const chunks = [];
50
+ let size = 0;
51
+ for (;;) {
52
+ const { done, value } = await reader.read();
53
+ if (done) {
54
+ break;
55
+ }
56
+ chunks.push(value);
57
+ size += value.byteLength;
58
+ }
59
+ const bytes = new Uint8Array(size);
60
+ let offset = 0;
61
+ for (const chunk of chunks) {
62
+ bytes.set(chunk, offset);
63
+ offset += chunk.byteLength;
64
+ }
65
+ return bytes;
66
+ }
67
+ /** `pendingEntry` resolved and read to the end. See {@link readStream}. */
68
+ async function storedEntryOf(pendingEntry) {
69
+ const entry = await pendingEntry;
70
+ return { ...entry, value: await readStream(entry.value) };
71
+ }
72
+ /** `stored` as the `CacheEntry` a `get` returns, with its own stream. */
73
+ function cacheEntryOf(stored, revalidate = stored.revalidate) {
74
+ const bytes = stored.value;
75
+ return {
76
+ ...stored,
77
+ revalidate,
78
+ value: new ReadableStream({
79
+ start(controller) {
80
+ // A copy: whoever reads the stream may transfer or mutate the chunk.
81
+ controller.enqueue(bytes.slice());
82
+ controller.close();
83
+ },
84
+ }),
85
+ };
86
+ }
87
+ /**
88
+ * Whether Next.js would regenerate `entry` on every read anyway, so storing it
89
+ * is a write nothing reads back. Next.js's default handler skips these the same
90
+ * way, outside the dev server.
91
+ */
92
+ function isDynamicEntry(entry) {
93
+ return entry.expire === 0;
94
+ }
95
+ /**
96
+ * The in-flight `set`s, by cache key. `CacheHandler.set` receives an entry that
97
+ * may still be streaming, and "if a `get` for the same cache key is called
98
+ * before the pending entry is complete, the cache handler must wait for the
99
+ * `set` operation to finish" (`cache-handlers/types.d.ts`).
100
+ */
101
+ class PendingSets {
102
+ pending = new Map();
103
+ /** Resolves once no `set` for `key` is in flight. */
104
+ async wait(key) {
105
+ for (let p = this.pending.get(key); p; p = this.pending.get(key)) {
106
+ await p;
107
+ }
108
+ }
109
+ /**
110
+ * Register a `set` for `key` and return the function that ends it. Safe to
111
+ * call more than once: only the registration it made is removed.
112
+ */
113
+ begin(key) {
114
+ let resolve = () => { };
115
+ const promise = new Promise((r) => (resolve = r));
116
+ this.pending.set(key, promise);
117
+ return () => {
118
+ if (this.pending.get(key) === promise) {
119
+ this.pending.delete(key);
120
+ }
121
+ resolve();
122
+ };
123
+ }
124
+ }
125
+ exports.PendingSets = PendingSets;
126
+ /**
127
+ * Stored entries by cache key, least recently used evicted first once their
128
+ * bytes pass `maxBytes`. Sized by bytes rather than entries, like Next.js's
129
+ * default handler (`cacheMaxMemorySize`, 50 MB), since a `'use cache'` entry is
130
+ * an RSC payload of any size.
131
+ */
132
+ class EntryLru {
133
+ maxBytes;
134
+ entries = new Map();
135
+ bytes = 0;
136
+ constructor(maxBytes) {
137
+ this.maxBytes = maxBytes;
138
+ }
139
+ get(key) {
140
+ const entry = this.entries.get(key);
141
+ if (entry) {
142
+ // Re-inserted to mark it most recently used.
143
+ this.entries.delete(key);
144
+ this.entries.set(key, entry);
145
+ }
146
+ return entry;
147
+ }
148
+ set(key, entry) {
149
+ this.delete(key);
150
+ const size = sizeOf(key, entry);
151
+ if (size > this.maxBytes) {
152
+ return;
153
+ }
154
+ this.entries.set(key, entry);
155
+ this.bytes += size;
156
+ for (const [oldestKey, oldest] of this.entries) {
157
+ if (this.bytes <= this.maxBytes) {
158
+ break;
159
+ }
160
+ this.entries.delete(oldestKey);
161
+ this.bytes -= sizeOf(oldestKey, oldest);
162
+ }
163
+ }
164
+ delete(key) {
165
+ const existing = this.entries.get(key);
166
+ if (existing) {
167
+ this.entries.delete(key);
168
+ this.bytes -= sizeOf(key, existing);
169
+ }
170
+ }
171
+ get size() {
172
+ return this.entries.size;
173
+ }
174
+ }
175
+ exports.EntryLru = EntryLru;
176
+ function sizeOf(key, entry) {
177
+ return entry.value.byteLength + key.length;
178
+ }
179
+ /** Default size of each handler's memory store: Next.js's default, 50 MB. */
180
+ exports.DEFAULT_MEMORY_BYTES = 50 * 1024 * 1024;
181
+ /**
182
+ * The `cacheHandlers` methods that only go through `tags`, the same for the
183
+ * `default` and `remote` handlers.
184
+ */
185
+ function tagMethods(tags) {
186
+ return {
187
+ refreshTags: () => tags.refresh(),
188
+ async getExpiration(implicitTags) {
189
+ await tags.ensure(implicitTags);
190
+ return tags.expiration(implicitTags);
191
+ },
192
+ async updateTags(revalidatedTags, durations) {
193
+ await tags.update(revalidatedTags, durations);
194
+ },
195
+ };
196
+ }
197
+ /**
198
+ * A handler built by `create` on first use rather than on import, so loading
199
+ * the module - which jest, and Next.js's config validation, do without using
200
+ * it - neither constructs AWS clients nor warns about missing configuration.
201
+ */
202
+ function lazyHandler(create) {
203
+ let handler;
204
+ const instance = () => (handler ??= create());
205
+ return {
206
+ get: (cacheKey, softTags) => instance().get(cacheKey, softTags),
207
+ set: (cacheKey, pendingEntry) => instance().set(cacheKey, pendingEntry),
208
+ refreshTags: () => instance().refreshTags(),
209
+ getExpiration: (tags) => instance().getExpiration(tags),
210
+ updateTags: (tags, durations) => instance().updateTags(tags, durations),
211
+ };
212
+ }
213
+ const TAG_MANIFEST_SYMBOL = Symbol.for("cdk-nextjs.use-cache.tag-manifest");
214
+ /**
215
+ * The process's one {@link TrackedTagMarkers}, from the environment.
216
+ *
217
+ * Kept on `globalThis` because the incremental cache handler and the `default`
218
+ * and `remote` handlers are separate bundles - separate module instances - and
219
+ * should share one manifest: one refresh read for all of them, and one marker
220
+ * write per `revalidateTag`.
221
+ *
222
+ * At build time there is no table to read (and no credentials to read it
223
+ * with), so tags stay local to the process there.
224
+ */
225
+ function sharedTagManifest() {
226
+ const global = globalThis;
227
+ if (!global[TAG_MANIFEST_SYMBOL]) {
228
+ const config = (0, aws_cache_store_1.resolveAwsCacheConfig)();
229
+ const refreshIntervalMs = numberFromEnv("CDK_NEXTJS_TAG_REFRESH_MS", aws_cache_store_1.DEFAULT_TAG_REFRESH_MS);
230
+ if (config.tableName && !isBuildPhase()) {
231
+ const client = new client_dynamodb_1.DynamoDBClient({ region: config.region });
232
+ global[TAG_MANIFEST_SYMBOL] = new aws_cache_store_1.TrackedTagMarkers({
233
+ markers: new aws_cache_store_1.TagMarkerTable(client, config.tableName, config.buildId),
234
+ log: new aws_cache_store_1.RevalidationLog(client, config.tableName, config.buildId),
235
+ refreshIntervalMs,
236
+ debug: (0, debug_1.default)("cdk-nextjs:cache-handler:tags"),
237
+ });
238
+ }
239
+ else {
240
+ if (!isBuildPhase()) {
241
+ console.warn("CDK_NEXTJS_REVALIDATION_TABLE_NAME environment variable not set, cache tags are local to each instance");
242
+ }
243
+ global[TAG_MANIFEST_SYMBOL] = new aws_cache_store_1.TrackedTagMarkers({
244
+ refreshIntervalMs,
245
+ });
246
+ }
247
+ }
248
+ return global[TAG_MANIFEST_SYMBOL];
249
+ }
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWNhY2hlLWNvbW1vbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVyL3VzZS1jYWNoZS1jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBeUJBLG9DQUVDO0FBR0Qsc0NBSUM7QUFrQkQsZ0NBcUJDO0FBR0Qsc0NBS0M7QUFHRCxvQ0FnQkM7QUFPRCx3Q0FFQztBQWtHRCxnQ0FhQztBQU9ELGtDQVVDO0FBZUQsOENBNEJDO0FBeFJEOzs7Ozs7RUFNRTtBQUNGLHNEQUFzRDtBQUN0RCw4REFBMEQ7QUFDMUQsa0RBQTZCO0FBSzdCLHVEQU0yQjtBQUUzQixxREFBdUQ7QUFBOUMsc0dBQUEsV0FBVyxPQUFPO0FBRTNCLDBFQUEwRTtBQUMxRSxTQUFnQixZQUFZO0lBQzFCLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEtBQUssd0JBQXdCLENBQUM7QUFDN0QsQ0FBQztBQUVELDhEQUE4RDtBQUM5RCxTQUFnQixhQUFhLENBQUMsSUFBWSxFQUFFLFFBQWdCO0lBQzFELE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNsRSxPQUFPLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7QUFDakUsQ0FBQztBQVVEOzs7Ozs7O0dBT0c7QUFDSSxLQUFLLFVBQVUsVUFBVSxDQUM5QixNQUFrQztJQUVsQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbEMsTUFBTSxNQUFNLEdBQWlCLEVBQUUs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QUFBLHVDQUFxQixHQUFFLENBQUM7UUFDdkMsTUFBTSxpQkFBaUIsR0FBRyxhQUFhLENBQ3JDLDJCQUEyQixFQUMzQix3Q0FBc0IsQ0FDdkIsQ0FBQztRQUNGLElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDLFlBQVksRUFBRSxFQUFFLENBQUM7WUFDeEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxnQ0FBYyxDQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzdELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLElBQUksbUNBQWlCLENBQUM7Z0JBQ2xELE9BQU8sRUFBRSxJQUFJLGdDQUFjLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQztnQkFDckUsR0FBRyxFQUFFLElBQUksaUNBQWUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDO2dCQUNsRSxpQkFBaUI7Z0JBQ2pCLEtBQUssRUFBRSxJQUFBLGVBQVEsRUFBQywrQkFBK0IsQ0FBQzthQUNqRCxDQUFDLENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO2dCQUNwQixPQUFPLENBQUMsSUFBSSxDQUNWLHdHQUF3RyxDQUN6RyxDQUFDO1lBQ0osQ0FBQztZQUNELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLElBQUksbUNBQWlCLENBQUM7Z0JBQ2xELGlCQUFpQjthQUNsQixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIFdoYXQgdGhlIHR3byBgY2FjaGVIYW5kbGVyc2AgKGAndXNlIGNhY2hlJ2AgYW5kIGAndXNlIGNhY2hlOiByZW1vdGUnYCkgc2hhcmU6XG4gIHRoZSBpbi1tZW1vcnkgZW50cnkgc3RvcmUsIHRoZSBwZW5kaW5nLWBzZXRgIGJvb2trZWVwaW5nIE5leHQuanMgcmVxdWlyZXMgb2ZcbiAgZXZlcnkgaGFuZGxlciwgYW5kIHRoZSBwcm9jZXNzJ3Mgb25lIHRhZyBtYW5pZmVzdCAoYFRyYWNrZWRUYWdNYXJrZXJzYCksXG4gIHdoaWNoIG1ha2VzIGByZXZhbGlkYXRlVGFnYCByZWFjaCBldmVyeSBpbnN0YW5jZSB0aHJvdWdoIHRoZSByZXZhbGlkYXRpb25cbiAgdGFibGUncyBtYXJrZXIgcm93cy5cbiovXG4vKiBlc2xpbnQtZGlzYWJsZSBpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMgKi9cbmltcG9ydCB7IER5bmFtb0RCQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1keW5hbW9kYlwiO1xuaW1wb3J0IGdldERlYnVnIGZyb20gXCJkZWJ1Z1wiO1xuaW1wb3J0IHR5cGUge1xuICBDYWNoZUVudHJ5LFxuICBDYWNoZUhhbmRsZXIsXG59IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL2xpYi9jYWNoZS1oYW5kbGVycy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgREVGQVVMVF9UQUdfUkVGUkVTSF9NUyxcbiAgcmVzb2x2ZUF3c0NhY2hlQ29uZmlnLFxuICBSZXZhbGlkYXRpb25Mb2csXG4gIFRhZ01hcmtlclRhYmxlLFxuICBUcmFja2VkVGFnTWFya2Vycyxcbn0gZnJvbSBcIi4vYXdzLWNhY2hlLXN0b3JlXCI7XG5cbmV4cG9ydCB7IG1hcmtlckNsb2NrIGFzIG5vdyB9IGZyb20gXCIuL2F3cy1jYWNoZS1zdG9yZVwiO1xuXG4vKiogV2hldGhlciB0aGlzIHByb2Nlc3MgaXMgYG5leHQgYnVpbGRgIHJhdGhlciB0aGFuIGEgZGVwbG95ZWQgc2VydmVyLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQnVpbGRQaGFzZSgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHByb2Nlc3MuZW52Lk5FWFRfUEhBU0UgPT09IFwicGhhc2UtcHJvZHVjdGlvbi1idWlsZFwiO1xufVxuXG4vKiogQSBwb3NpdGl2ZSBpbnRlZ2VyIGVudmlyb25tZW50IHZhcmlhYmxlLCBvciBgZmFsbGJhY2tgLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckZyb21FbnYobmFtZTogc3RyaW5nLCBmYWxsYmFjazogbnVtYmVyKTogbnVtYmVyIHtcbiAgY29uc3QgcmF3ID0gcHJvY2Vzcy5lbnZbbmFtZV07XG4gIGNvbnN0IHZhbHVlID0gcmF3ID09PSB1bmRlZmluZWQgfHwgcmF3ID09PSBcIlwiID8gTmFOIDogTnVtYmVyKHJhdyk7XG4gIHJldHVybiBOdW1iZXIuaXNGaW5pdGUodmFsdWUpICYmIHZhbHVlID49IDAgPyB2YWx1ZSA6IGZhbGxiYWNrO1xufVxuXG4vKipcbiAqIEEgYENhY2hlRW50cnlgIHdpdGggaXRzIHZhbHVlIHJlYWQgdG8gdGhlIGVuZDogdGhlIGJ5dGVzIGFyZSB3aGF0IGlzIGtlcHQsXG4gKiBhbmQgZXZlcnkgYGdldGAgaGFuZHMgb3V0IGEgZnJlc2ggc3RyZWFtIG92ZXIgdGhlbS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTdG9yZWRFbnRyeSBleHRlbmRzIE9taXQ8Q2FjaGVFbnRyeSwgXCJ2YWx1ZVwiPiB7XG4gIHZhbHVlOiBVaW50OEFycmF5O1xufVxuXG4vKipcbiAqIFJlYWQgYHN0cmVhbWAgdG8gdGhlIGVuZCwgb3IgdGhyb3cgaWYgaXQgZXJyb3JzLlxuICpcbiAqIGBDYWNoZUVudHJ5LnZhbHVlYCBcImNhbiBlcnJvciBhbmQgb25seSBoYXZlIHBhcnRpYWwgZGF0YVwiIChOZXh0LmpzJ3NcbiAqIGBjYWNoZS1oYW5kbGVycy90eXBlcy5kLnRzYCkuIFRocm93aW5nIGlzIGhvdyBhIHBhcnRpYWwgZW50cnkgaXMga2VwdCBvdXQ6XG4gKiBib3RoIGhhbmRsZXJzIHN0b3JlIG5vdGhpbmcgd2hlbiB0aGlzIHJlamVjdHMsIHdoaWNoIGlzIHdoYXQgTmV4dC5qcydzIG93blxuICogZGVmYXVsdCBoYW5kbGVyIGRvZXMgdG9vLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVhZFN0cmVhbShcbiAgc3RyZWFtOiBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pixcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBjb25zdCByZWFkZXIgPSBzdHJlYW0uZ2V0UmVhZGVyKCk7XG4gIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gIGxldCBzaXplID0gMDtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjaHVua3MucHVzaCh2YWx1ZSk7XG4gICAgc2l6ZSArPSB2YWx1ZS5ieXRlTGVuZ3RoO1xuICB9XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgIGJ5dGVzLnNldChjaHVuaywgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5cbi8qKiBgcGVuZGluZ0VudHJ5YCByZXNvbHZlZCBhbmQgcmVhZCB0byB0aGUgZW5kLiBTZWUge0BsaW5rIHJlYWRTdHJlYW19LiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3JlZEVudHJ5T2YoXG4gIHBlbmRpbmdFbnRyeTogUHJvbWlzZTxDYWNoZUVudHJ5Pixcbik6IFByb21pc2U8U3RvcmVkRW50cnk+IHtcbiAgY29uc3QgZW50cnkgPSBhd2FpdCBwZW5kaW5nRW50cnk7XG4gIHJldHVybiB7IC4uLmVudHJ5LCB2YWx1ZTogYXdhaXQgcmVhZFN0cmVhbShlbnRyeS52YWx1ZSkgfTtcbn1cblxuLyoqIGBzdG9yZWRgIGFzIHRoZSBgQ2FjaGVFbnRyeWAgYSBgZ2V0YCByZXR1cm5zLCB3aXRoIGl0cyBvd24gc3RyZWFtLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhY2hlRW50cnlPZihcbiAgc3RvcmVkOiBTdG9yZWRFbnRyeSxcbiAgcmV2YWxpZGF0ZTogbnVtYmVyID0gc3RvcmVkLnJldmFsaWRhdGUsXG4pOiBDYWNoZUVudHJ5IHtcbiAgY29uc3QgYnl0ZXMgPSBzdG9yZWQudmFsdWU7XG4gIHJldHVybiB7XG4gICAgLi4uc3RvcmVkLFxuICAgIHJldmFsaWRhdGUsXG4gICAgdmFsdWU6IG5ldyBSZWFkYWJsZVN0cmVhbTxVaW50OEFycmF5Pih7XG4gICAgICBzdGFydChjb250cm9sbGVyKSB7XG4gICAgICAgIC8vIEEgY29weTogd2hvZXZlciByZWFkcyB0aGUgc3RyZWFtIG1heSB0cmFuc2ZlciBvciBtdXRhdGUgdGhlIGNodW5rLlxuICAgICAgICBjb250cm9sbGVyLmVucXVldWUoYnl0ZXMuc2xpY2UoKSk7XG4gICAgICAgIGNvbnRyb2xsZXIuY2xvc2UoKTtcbiAgICAgIH0sXG4gICAgfSksXG4gIH07XG59XG5cbi8qKlxuICogV2hldGhlciBOZXh0LmpzIHdvdWxkIHJlZ2VuZXJhdGUgYGVudHJ5YCBvbiBldmVyeSByZWFkIGFueXdheSwgc28gc3RvcmluZyBpdFxuICogaXMgYSB3cml0ZSBub3RoaW5nIHJlYWRzIGJhY2suIE5leHQuanMncyBkZWZhdWx0IGhhbmRsZXIgc2tpcHMgdGhlc2UgdGhlIHNhbWVcbiAqIHdheSwgb3V0c2lkZSB0aGUgZGV2IHNlcnZlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRHluYW1pY0VudHJ5KGVudHJ5OiBQaWNrPENhY2hlRW50cnksIFwiZXhwaXJlXCI+KTogYm9vbGVhbiB7XG4gIHJldHVybiBlbnRyeS5leHBpcmUgPT09IDA7XG59XG5cbi8qKlxuICogVGhlIGluLWZsaWdodCBgc2V0YHMsIGJ5IGNhY2hlIGtleS4gYENhY2hlSGFuZGxlci5zZXRgIHJlY2VpdmVzIGFuIGVudHJ5IHRoYXRcbiAqIG1heSBzdGlsbCBiZSBzdHJlYW1pbmcsIGFuZCBcImlmIGEgYGdldGAgZm9yIHRoZSBzYW1lIGNhY2hlIGtleSBpcyBjYWxsZWRcbiAqIGJlZm9yZSB0aGUgcGVuZGluZyBlbnRyeSBpcyBjb21wbGV0ZSwgdGhlIGNhY2hlIGhhbmRsZXIgbXVzdCB3YWl0IGZvciB0aGVcbiAqIGBzZXRgIG9wZXJhdGlvbiB0byBmaW5pc2hcIiAoYGNhY2hlLWhhbmRsZXJzL3R5cGVzLmQudHNgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFBlbmRpbmdTZXRzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBwZW5kaW5nID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG5cbiAgLyoqIFJlc29sdmVzIG9uY2Ugbm8gYHNldGAgZm9yIGBrZXlgIGlzIGluIGZsaWdodC4gKi9cbiAgYXN5bmMgd2FpdChrZXk6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAobGV0IHAgPSB0aGlzLnBlbmRpbmcuZ2V0KGtleSk7IHA7IHAgPSB0aGlzLnBlbmRpbmcuZ2V0KGtleSkpIHtcbiAgICAgIGF3YWl0IHA7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgYHNldGAgZm9yIGBrZXlgIGFuZCByZXR1cm4gdGhlIGZ1bmN0aW9uIHRoYXQgZW5kcyBpdC4gU2FmZSB0b1xuICAgKiBjYWxsIG1vcmUgdGhhbiBvbmNlOiBvbmx5IHRoZSByZWdpc3RyYXRpb24gaXQgbWFkZSBpcyByZW1vdmVkLlxuICAgKi9cbiAgYmVnaW4oa2V5OiBzdHJpbmcpOiAoKSA9PiB2b2lkIHtcbiAgICBsZXQgcmVzb2x2ZTogKCkgPT4gdm9pZCA9ICgpID0+IHt9O1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocikgPT4gKHJlc29sdmUgPSByKSk7XG4gICAgdGhpcy5wZW5kaW5nLnNldChrZXksIHByb21pc2UpO1xuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nLmdldChrZXkpID09PSBwcm9taXNlKSB7XG4gICAgICAgIHRoaXMucGVuZGluZy5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIHJlc29sdmUoKTtcbiAgICB9O1xuICB9XG59XG5cbi8qKlxuICogU3RvcmVkIGVudHJpZXMgYnkgY2FjaGUga2V5LCBsZWFzdCByZWNlbnRseSB1c2VkIGV2aWN0ZWQgZmlyc3Qgb25jZSB0aGVpclxuICogYnl0ZXMgcGFzcyBgbWF4Qnl0ZXNgLiBTaXplZCBieSBieXRlcyByYXRoZXIgdGhhbiBlbnRyaWVzLCBsaWtlIE5leHQuanMnc1xuICogZGVmYXVsdCBoYW5kbGVyIChgY2FjaGVNYXhNZW1vcnlTaXplYCwgNTAgTUIpLCBzaW5jZSBhIGAndXNlIGNhY2hlJ2AgZW50cnkgaXNcbiAqIGFuIFJTQyBwYXlsb2FkIG9mIGFueSBzaXplLlxuICovXG5leHBvcnQgY2xhc3MgRW50cnlMcnUge1xuICBwcml2YXRlIHJlYWRvbmx5IGVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgU3RvcmVkRW50cnk+KCk7XG4gIHByaXZhdGUgYnl0ZXMgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbWF4Qnl0ZXM6IG51bWJlcikge31cblxuICBnZXQoa2V5OiBzdHJpbmcpOiBTdG9yZWRFbnRyeSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KGtleSk7XG4gICAgaWYgKGVudHJ5KSB7XG4gICAgICAvLyBSZS1pbnNlcnRlZCB0byBtYXJrIGl0IG1vc3QgcmVjZW50bHkgdXNlZC5cbiAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuZW50cmllcy5zZXQoa2V5LCBlbnRyeSk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIHNldChrZXk6IHN0cmluZywgZW50cnk6IFN0b3JlZEVudHJ5KTogdm9pZCB7XG4gICAgdGhpcy5kZWxldGUoa2V5KTtcbiAgICBjb25zdCBzaXplID0gc2l6ZU9mKGtleSwgZW50cnkpO1xuICAgIGlmIChzaXplID4gdGhpcy5tYXhCeXRlcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmVudHJpZXMuc2V0KGtleSwgZW50cnkpO1xuICAgIHRoaXMuYnl0ZXMgKz0gc2l6ZTtcbiAgICBmb3IgKGNvbnN0IFtvbGRlc3RLZXksIG9sZGVzdF0gb2YgdGhpcy5lbnRyaWVzKSB7XG4gICAgICBpZiAodGhpcy5ieXRlcyA8PSB0aGlzLm1heEJ5dGVzKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShvbGRlc3RLZXkpO1xuICAgICAgdGhpcy5ieXRlcyAtPSBzaXplT2Yob2xkZXN0S2V5LCBvbGRlc3QpO1xuICAgIH1cbiAgfVxuXG4gIGRlbGV0ZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy5lbnRyaWVzLmdldChrZXkpO1xuICAgIGlmIChleGlzdGluZykge1xuICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShrZXkpO1xuICAgICAgdGhpcy5ieXRlcyAtPSBzaXplT2Yoa2V5LCBleGlzdGluZyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHNpemUoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5lbnRyaWVzLnNpemU7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2l6ZU9mKGtleTogc3RyaW5nLCBlbnRyeTogU3RvcmVkRW50cnkpOiBudW1iZXIge1xuICByZXR1cm4gZW50cnkudmFsdWUuYnl0ZUxlbmd0aCArIGtleS5sZW5ndGg7XG59XG5cbi8qKiBEZWZhdWx0IHNpemUgb2YgZWFjaCBoYW5kbGVyJ3MgbWVtb3J5IHN0b3JlOiBOZXh0LmpzJ3MgZGVmYXVsdCwgNTAgTUIuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9NRU1PUllfQllURVMgPSA1MCAqIDEwMjQgKiAxMDI0O1xuXG4vKipcbiAqIFRoZSBgY2FjaGVIYW5kbGVyc2AgbWV0aG9kcyB0aGF0IG9ubHkgZ28gdGhyb3VnaCBgdGFnc2AsIHRoZSBzYW1lIGZvciB0aGVcbiAqIGBkZWZhdWx0YCBhbmQgYHJlbW90ZWAgaGFuZGxlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0YWdNZXRob2RzKFxuICB0YWdzOiBUcmFja2VkVGFnTWFya2Vycyxcbik6IFBpY2s8Q2FjaGVIYW5kbGVyLCBcInJlZnJlc2hUYWdzXCIgfCBcImdldEV4cGlyYXRpb25cIiB8IFwidXBkYXRlVGFnc1wiPiB7XG4gIHJldHVybiB7XG4gICAgcmVmcmVzaFRhZ3M6ICgpID0+IHRhZ3MucmVmcmVzaCgpLFxuICAgIGFzeW5jIGdldEV4cGlyYXRpb24oaW1wbGljaXRUYWdzKSB7XG4gICAgICBhd2FpdCB0YWdzLmVuc3VyZShpbXBsaWNpdFRhZ3MpO1xuICAgICAgcmV0dXJuIHRhZ3MuZXhwaXJhdGlvbihpbXBsaWNpdFRhZ3MpO1xuICAgIH0sXG4gICAgYXN5bmMgdXBkYXRlVGFncyhyZXZhbGlkYXRlZFRhZ3MsIGR1cmF0aW9ucykge1xuICAgICAgYXdhaXQgdGFncy51cGRhdGUocmV2YWxpZGF0ZWRUYWdzLCBkdXJhdGlvbnMpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogQSBoYW5kbGVyIGJ1aWx0IGJ5IGBjcmVhdGVgIG9uIGZpcnN0IHVzZSByYXRoZXIgdGhhbiBvbiBpbXBvcnQsIHNvIGxvYWRpbmdcbiAqIHRoZSBtb2R1bGUgLSB3aGljaCBqZXN0LCBhbmQgTmV4dC5qcydzIGNvbmZpZyB2YWxpZGF0aW9uLCBkbyB3aXRob3V0IHVzaW5nXG4gKiBpdCAtIG5laXRoZXIgY29uc3RydWN0cyBBV1MgY2xpZW50cyBub3Igd2FybnMgYWJvdXQgbWlzc2luZyBjb25maWd1cmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF6eUhhbmRsZXIoY3JlYXRlOiAoKSA9PiBDYWNoZUhhbmRsZXIpOiBDYWNoZUhhbmRsZXIge1xuICBsZXQgaGFuZGxlcjogQ2FjaGVIYW5kbGVyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBpbnN0YW5jZSA9ICgpID0+IChoYW5kbGVyID8/PSBjcmVhdGUoKSk7XG4gIHJldHVybiB7XG4gICAgZ2V0OiAoY2FjaGVLZXksIHNvZnRUYWdzKSA9PiBpbnN0YW5jZSgpLmdldChjYWNoZUtleSwgc29mdFRhZ3MpLFxuICAgIHNldDogKGNhY2hlS2V5LCBwZW5kaW5nRW50cnkpID0+IGluc3RhbmNlKCkuc2V0KGNhY2hlS2V5LCBwZW5kaW5nRW50cnkpLFxuICAgIHJlZnJlc2hUYWdzOiAoKSA9PiBpbnN0YW5jZSgpLnJlZnJlc2hUYWdzKCksXG4gICAgZ2V0RXhwaXJhdGlvbjogKHRhZ3MpID0+IGluc3RhbmNlKCkuZ2V0RXhwaXJhdGlvbih0YWdzKSxcbiAgICB1cGRhdGVUYWdzOiAodGFncywgZHVyYXRpb25zKSA9PiBpbnN0YW5jZSgpLnVwZGF0ZVRhZ3ModGFncywgZHVyYXRpb25zKSxcbiAgfTtcbn1cblxuY29uc3QgVEFHX01BTklGRVNUX1NZTUJPTCA9IFN5bWJvbC5mb3IoXCJjZGstbmV4dGpzLnVzZS1jYWNoZS50YWctbWFuaWZlc3RcIik7XG5cbi8qKlxuICogVGhlIHByb2Nlc3MncyBvbmUge0BsaW5rIFRyYWNrZWRUYWdNYXJrZXJzfSwgZnJvbSB0aGUgZW52aXJvbm1lbnQuXG4gKlxuICogS2VwdCBvbiBgZ2xvYmFsVGhpc2AgYmVjYXVzZSB0aGUgaW5jcmVtZW50YWwgY2FjaGUgaGFuZGxlciBhbmQgdGhlIGBkZWZhdWx0YFxuICogYW5kIGByZW1vdGVgIGhhbmRsZXJzIGFyZSBzZXBhcmF0ZSBidW5kbGVzIC0gc2VwYXJhdGUgbW9kdWxlIGluc3RhbmNlcyAtIGFuZFxuICogc2hvdWxkIHNoYXJlIG9uZSBtYW5pZmVzdDogb25lIHJlZnJlc2ggcmVhZCBmb3IgYWxsIG9mIHRoZW0sIGFuZCBvbmUgbWFya2VyXG4gKiB3cml0ZSBwZXIgYHJldmFsaWRhdGVUYWdgLlxuICpcbiAqIEF0IGJ1aWxkIHRpbWUgdGhlcmUgaXMgbm8gdGFibGUgdG8gcmVhZCAoYW5kIG5vIGNyZWRlbnRpYWxzIHRvIHJlYWQgaXRcbiAqIHdpdGgpLCBzbyB0YWdzIHN0YXkgbG9jYWwgdG8gdGhlIHByb2Nlc3MgdGhlcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFyZWRUYWdNYW5pZmVzdCgpOiBUcmFja2VkVGFnTWFya2VycyB7XG4gIGNvbnN0IGdsb2JhbCA9IGdsb2JhbFRoaXMgYXMgeyBbVEFHX01BTklGRVNUX1NZTUJPTF0/OiBUcmFja2VkVGFnTWFya2VycyB9O1xuICBpZiAoIWdsb2JhbFtUQUdfTUFOSUZFU1RfU1lNQk9MXSkge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlc29sdmVBd3NDYWNoZUNvbmZpZygpO1xuICAgIGNvbnN0IHJlZnJlc2hJbnRlcnZhbE1zID0gbnVtYmVyRnJvbUVudihcbiAgICAgIFwiQ0RLX05FWFRKU19UQUdfUkVGUkVTSF9NU1wiLFxuICAgICAgREVGQVVMVF9UQUdfUkVGUkVTSF9NUyxcbiAgICApO1xuICAgIGlmIChjb25maWcudGFibGVOYW1lICYmICFpc0J1aWxkUGhhc2UoKSkge1xuICAgICAgY29uc3QgY2xpZW50ID0gbmV3IER5bmFtb0RCQ2xpZW50KHsgcmVnaW9uOiBjb25maWcucmVnaW9uIH0pO1xuICAgICAgZ2xvYmFsW1RBR19NQU5JRkVTVF9TWU1CT0xdID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgICAgbWFya2VyczogbmV3IFRhZ01hcmtlclRhYmxlKGNsaWVudCwgY29uZmlnLnRhYmxlTmFtZSwgY29uZmlnLmJ1aWxkSWQpLFxuICAgICAgICBsb2c6IG5ldyBSZXZhbGlkYXRpb25Mb2coY2xpZW50LCBjb25maWcudGFibGVOYW1lLCBjb25maWcuYnVpbGRJZCksXG4gICAgICAgIHJlZnJlc2hJbnRlcnZhbE1zLFxuICAgICAgICBkZWJ1ZzogZ2V0RGVidWcoXCJjZGstbmV4dGpzOmNhY2hlLWhhbmRsZXI6dGFnc1wiKSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWlzQnVpbGRQaGFzZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBcIkNES19ORVhUSlNfUkVWQUxJREFUSU9OX1RBQkxFX05BTUUgZW52aXJvbm1lbnQgdmFyaWFibGUgbm90IHNldCwgY2FjaGUgdGFncyBhcmUgbG9jYWwgdG8gZWFjaCBpbnN0YW5jZVwiLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZ2xvYmFsW1RBR19NQU5JRkVTVF9TWU1CT0xdID0gbmV3IFRyYWNrZWRUYWdNYXJrZXJzKHtcbiAgICAgICAgcmVmcmVzaEludGVydmFsTXMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdsb2JhbFtUQUdfTUFOSUZFU1RfU1lNQk9MXTtcbn1cbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};