esa-pcg-cli 0.1.2 → 0.1.4
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/README.md +10 -24
- package/dist/_inline-overrides.js +2 -2
- package/dist/_protocol/types.d.ts +3 -0
- package/dist/_protocol/types.js +1 -1
- package/dist/adapters/wrappers/node-server.js +6 -2
- package/dist/commands/build.js +25 -1
- package/dist/overrides/tagCache/gateway.d.ts +3 -0
- package/dist/overrides/tagCache/gateway.js +31 -1
- package/dist/runtime/cdn-purge.d.ts +53 -0
- package/dist/runtime/cdn-purge.js +259 -0
- package/dist/runtime/edge-context.d.ts +26 -0
- package/dist/runtime/edge-context.js +77 -0
- package/dist/runtime/image-config.d.ts +45 -0
- package/dist/runtime/image-config.js +144 -0
- package/dist/runtime/image-proxy.js +15 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -12,38 +12,24 @@ npm install --save-dev esa-pcg-cli
|
|
|
12
12
|
pnpm add -D esa-pcg-cli
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
`@opennextjs/aws` is
|
|
15
|
+
`@opennextjs/aws` is bundled as a regular dependency, so you don't need to add it yourself.
|
|
16
16
|
|
|
17
17
|
## Quick start
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
// `pcg build` copies the loader here automatically — your source tree
|
|
28
|
-
// and package.json stay untouched.
|
|
29
|
-
loaderFile: 'node_modules/.pcg/pcg-image-loader.js',
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
export default nextConfig;
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
2. Build and deploy:
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
npx pcg build --dir .
|
|
39
|
-
npx pcg deploy --dir . # or --local-dev for local-gateway mode
|
|
40
|
-
```
|
|
19
|
+
Most projects need **zero** `next.config` changes — `<Image>` continues to use Next's built-in `/_next/image` route and the wrapper transparently signs the request to the gateway.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
npx pcg build --dir .
|
|
23
|
+
npx pcg deploy --dir . # or --local-dev for local-gateway mode
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Declare image hosts as usual via `next.config.images.{remotePatterns,domains}`; the wrapper reuses that config to allow / reject incoming `url=` values, matching the semantics of `next dev`.
|
|
41
27
|
|
|
42
28
|
## Commands
|
|
43
29
|
|
|
44
30
|
| Command | What it does |
|
|
45
31
|
|---|---|
|
|
46
|
-
| `pcg build` | Runs OpenNext build with PCG overrides auto-injected. Generates `.open-next
|
|
32
|
+
| `pcg build` | Runs OpenNext build with PCG overrides auto-injected. Generates `.open-next/`. |
|
|
47
33
|
| `pcg deploy` | Uploads cache artifacts to OSS (via gateway-issued STS or local mode). |
|
|
48
34
|
| `pcg serve` | Local dev server backed by the built `.open-next/` (assets + spawned server function). |
|
|
49
35
|
| `pcg upload-cache` / `upload-assets` | Lower-level upload primitives. |
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
exports.INLINE_OVERRIDES = {
|
|
3
|
-
"adapters/wrappers/node-server.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/runtime/image-proxy.js\nvar require_image_proxy = __commonJS({\n \"dist/runtime/image-proxy.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.handleImageProxy = void 0;\n var stream_1 = require(\"stream\");\n var gateway_auth_1 = require_gateway_auth();\n var GATEWAY_TIMEOUT_MS = 1e4;\n var PASSTHROUGH_HEADERS = [\n \"content-type\",\n \"content-length\",\n \"cache-control\",\n \"etag\",\n \"vary\",\n \"last-modified\",\n \"content-security-policy\"\n ];\n function resolveAbsoluteUrl(rawUrl, req) {\n if (rawUrl.startsWith(\"http://\") || rawUrl.startsWith(\"https://\")) {\n return rawUrl;\n }\n const host = req.headers[\"host\"];\n if (!host)\n return null;\n const protoHeader = req.headers[\"x-forwarded-proto\"];\n const proto = (Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) || (Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) || \"https\";\n const path2 = rawUrl.startsWith(\"/\") ? rawUrl : `/${rawUrl}`;\n return `${proto}://${host}${path2}`;\n }\n function writeJson(res, status, body) {\n res.statusCode = status;\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n }\n async function handleImageProxy(req, res) {\n const reqUrl = req.url || \"\";\n const qIdx = reqUrl.indexOf(\"?\");\n if (qIdx === -1) {\n return writeJson(res, 400, { error: \"Missing query parameters\" });\n }\n const params = new URLSearchParams(reqUrl.slice(qIdx + 1));\n const rawUrl = params.get(\"url\");\n const w = params.get(\"w\");\n const q = params.get(\"q\");\n if (!rawUrl || !w) {\n return writeJson(res, 400, {\n error: \"Missing required parameters: url, w\"\n });\n }\n const absoluteUrl = resolveAbsoluteUrl(rawUrl, req);\n if (!absoluteUrl) {\n return writeJson(res, 500, {\n error: \"Cannot resolve absolute URL: missing Host header\"\n });\n }\n const cfg = (0, gateway_auth_1.loadGatewayAuthConfig)();\n if (!cfg) {\n return writeJson(res, 500, {\n error: \"Gateway auth config missing\"\n });\n }\n const upstreamParams = new URLSearchParams({ url: absoluteUrl, w });\n if (q)\n upstreamParams.set(\"q\", q);\n const upstreamPath = `/image/optimize?${upstreamParams}`;\n const ifNoneMatch = req.headers[\"if-none-match\"];\n const upstreamHeaders = {};\n if (typeof ifNoneMatch === \"string\") {\n upstreamHeaders[\"if-none-match\"] = ifNoneMatch;\n }\n const accept = req.headers[\"accept\"];\n if (typeof accept === \"string\") {\n upstreamHeaders[\"accept\"] = accept;\n }\n let upstream;\n try {\n upstream = await (0, gateway_auth_1.gatewayFetch)(cfg, upstreamPath, {\n method: \"GET\",\n headers: upstreamHeaders,\n timeoutMs: GATEWAY_TIMEOUT_MS\n });\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[image-proxy] Gateway timeout after ${GATEWAY_TIMEOUT_MS}ms: ${absoluteUrl}`);\n return writeJson(res, 504, { error: \"Upstream timeout\" });\n }\n console.warn(`[image-proxy] Gateway fetch error: ${err.message} (url=${absoluteUrl})`);\n return writeJson(res, 502, { error: \"Bad gateway\" });\n }\n res.statusCode = upstream.status;\n for (const name of PASSTHROUGH_HEADERS) {\n const value = upstream.headers.get(name);\n if (value !== null) {\n res.setHeader(name, value);\n }\n }\n if (upstream.status === 304 || !upstream.body) {\n res.end();\n return;\n }\n try {\n const nodeStream = stream_1.Readable.fromWeb(upstream.body);\n nodeStream.on(\"error\", (err) => {\n console.warn(`[image-proxy] Stream error: ${err.message}`);\n if (!res.writableEnded)\n res.end();\n });\n nodeStream.pipe(res);\n } catch (err) {\n console.warn(`[image-proxy] Pipe setup failed: ${err.message}`);\n if (!res.headersSent) {\n writeJson(res, 502, { error: \"Stream setup failed\" });\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n }\n exports2.handleImageProxy = handleImageProxy;\n }\n});\n\n// dist/adapters/wrappers/node-server.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar http = require(\"http\");\nvar fs = require(\"fs\");\nvar path = require(\"path\");\nvar image_proxy_1 = require_image_proxy();\nvar MIME_TYPES = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".map\": \"application/json\",\n \".txt\": \"text/plain\",\n \".webp\": \"image/webp\"\n};\nfunction parseQuery(url) {\n const idx = url.indexOf(\"?\");\n if (idx === -1)\n return {};\n const params = {};\n const searchParams = new URLSearchParams(url.slice(idx + 1));\n for (const [key, value] of searchParams) {\n const existing = params[key];\n if (existing === void 0) {\n params[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n params[key] = [existing, value];\n }\n }\n return params;\n}\nfunction parseCookies(cookieHeader) {\n if (!cookieHeader)\n return {};\n const cookies = {};\n for (const pair of cookieHeader.split(\";\")) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx === -1)\n continue;\n const name = pair.slice(0, eqIdx).trim();\n const value = pair.slice(eqIdx + 1).trim();\n if (name)\n cookies[name] = value;\n }\n return cookies;\n}\nfunction flattenHeaders(rawHeaders) {\n const headers = {};\n for (const [key, value] of Object.entries(rawHeaders)) {\n if (value === void 0)\n continue;\n headers[key.toLowerCase()] = Array.isArray(value) ? value.join(\", \") : value;\n }\n return headers;\n}\nasync function readBody(req) {\n if (req.method === \"GET\" || req.method === \"HEAD\")\n return void 0;\n return new Promise((resolve, reject) => {\n const chunks = [];\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n req.on(\"error\", reject);\n });\n}\nfunction serveStaticFile(assetsDir, req, res) {\n var _a, _b;\n const urlPath = (_b = (_a = req.url) === null || _a === void 0 ? void 0 : _a.split(\"?\")[0]) !== null && _b !== void 0 ? _b : \"/\";\n if (urlPath === \"/\" || !urlPath.startsWith(\"/\"))\n return false;\n const filePath = path.join(assetsDir, urlPath);\n const normalizedPath = path.normalize(filePath);\n if (!normalizedPath.startsWith(assetsDir)) {\n res.writeHead(403);\n res.end();\n return true;\n }\n let stat;\n try {\n stat = fs.statSync(normalizedPath);\n } catch (_c) {\n return false;\n }\n if (!stat.isFile())\n return false;\n const ext = path.extname(normalizedPath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n const isHashedAsset = urlPath.startsWith(\"/_next/static/\");\n res.writeHead(200, {\n \"Content-Type\": contentType,\n \"Content-Length\": stat.size,\n \"Cache-Control\": isHashedAsset ? \"public, max-age=31536000, immutable\" : \"public, max-age=60\"\n });\n fs.createReadStream(normalizedPath).pipe(res);\n return true;\n}\nfunction bridgeOpenNextHandler(handler) {\n return async (req, res) => {\n var _a, _b, _c, _d, _e, _f;\n try {\n const rawUrl = req.url || \"/\";\n const headers = flattenHeaders(req.headers);\n const body = await readBody(req);\n const host = headers[\"host\"] || `localhost:${(_a = process.env.PORT) !== null && _a !== void 0 ? _a : \"3000\"}`;\n const proto = ((_c = (_b = headers[\"x-forwarded-proto\"]) === null || _b === void 0 ? void 0 : _b.split(\",\")[0]) === null || _c === void 0 ? void 0 : _c.trim()) || \"http\";\n const absoluteUrl = new URL(`${proto}://${host}${rawUrl}`);\n const event = {\n type: \"core\",\n method: req.method || \"GET\",\n rawPath: absoluteUrl.pathname,\n url: absoluteUrl.href,\n body,\n headers,\n query: parseQuery(rawUrl),\n cookies: parseCookies(headers[\"cookie\"]),\n remoteAddress: ((_e = (_d = headers[\"x-forwarded-for\"]) === null || _d === void 0 ? void 0 : _d.split(\",\")[0]) === null || _e === void 0 ? void 0 : _e.trim()) || headers[\"x-real-ip\"] || ((_f = req.socket) === null || _f === void 0 ? void 0 : _f.remoteAddress) || \"127.0.0.1\"\n };\n const abortController = new AbortController();\n res.on(\"close\", () => abortController.abort());\n const streamCreator = {\n writeHeaders(prelude) {\n res.setHeader(\"Set-Cookie\", prelude.cookies);\n res.writeHead(prelude.statusCode, prelude.headers);\n res.flushHeaders();\n return res;\n },\n abortSignal: abortController.signal\n };\n await handler(event, { streamCreator });\n } catch (err) {\n if (!res.headersSent) {\n const isDev = process.env.NODE_ENV !== \"production\";\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: \"Internal Server Error\",\n ...isDev && { message: err.message, stack: err.stack }\n }));\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n };\n}\nasync function wrapper(handler) {\n var _a;\n const port = parseInt((_a = process.env.PORT) !== null && _a !== void 0 ? _a : \"3000\", 10);\n const assetsDir = path.resolve(process.cwd(), \"..\", \"..\", \"assets\");\n if (!fs.existsSync(assetsDir)) {\n console.warn(`[pcg-node] assets directory not found at ${assetsDir} \\u2014 static file requests will fall through to Next handler`);\n }\n const dispatchToNext = bridgeOpenNextHandler(handler);\n const server = http.createServer(async (req, res) => {\n var _a2, _b;\n const urlPath = (_b = (_a2 = req.url) === null || _a2 === void 0 ? void 0 : _a2.split(\"?\")[0]) !== null && _b !== void 0 ? _b : \"/\";\n if (urlPath === \"/__health\") {\n res.writeHead(200, { \"Content-Type\": \"text/plain\" });\n res.end(\"OK\");\n return;\n }\n if (urlPath === \"/_next/image\") {\n try {\n await (0, image_proxy_1.handleImageProxy)(req, res);\n } catch (err) {\n console.error(\"[pcg-node] image-proxy error:\", err);\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Image proxy failed\" }));\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n return;\n }\n if (serveStaticFile(assetsDir, req, res))\n return;\n await dispatchToNext(req, res);\n });\n let shuttingDown = false;\n const shutdown = (signal) => {\n if (shuttingDown)\n return;\n shuttingDown = true;\n console.log(`[pcg-node] ${signal} received, shutting down...`);\n server.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 5e3).unref();\n };\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n await new Promise((resolve) => {\n server.listen(port, () => {\n console.log(`[pcg-node] Listening on port ${port}`);\n console.log(`[pcg-node] assets: ${assetsDir}`);\n console.log(`[pcg-node] routes: /__health, /_next/image, /_next/static/*, <next>`);\n resolve();\n });\n });\n}\nvar wrapperDef = {\n wrapper,\n name: \"pcg-node\",\n supportStreaming: true\n};\nexports.default = wrapperDef;\n",
|
|
3
|
+
"adapters/wrappers/node-server.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod2) => function __require() {\n return mod2 || (0, cb[__getOwnPropNames(cb)[0]])((mod2 = { exports: {} }).exports, mod2), mod2.exports;\n};\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/runtime/image-config.js\nvar require_image_config = __commonJS({\n \"dist/runtime/image-config.js\"(exports, module) {\n \"use strict\";\n Object.defineProperty(exports, \"__esModule\", { value: true });\n exports._setMatcherForTests = exports._resetImageConfigCacheForTests = exports.validateImageUrl = void 0;\n var fs = require(\"fs\");\n var path = require(\"path\");\n var cachedConfig;\n var cachedMatcher;\n var warnedMatcherMissing = false;\n function configFilePath() {\n return path.resolve(process.cwd(), \".next\", \"required-server-files.json\");\n }\n function loadImageConfig() {\n var _a, _b, _c;\n if (cachedConfig !== void 0)\n return cachedConfig;\n const filePath = configFilePath();\n let raw;\n try {\n raw = fs.readFileSync(filePath, \"utf-8\");\n } catch (err) {\n console.warn(`[image-config] required-server-files.json not found at ${filePath} \\u2014 allowing all image URLs (${(_a = err.code) !== null && _a !== void 0 ? _a : err.message})`);\n cachedConfig = { mode: \"config-missing\" };\n return cachedConfig;\n }\n try {\n const parsed = JSON.parse(raw);\n const images = (_c = (_b = parsed === null || parsed === void 0 ? void 0 : parsed.config) === null || _b === void 0 ? void 0 : _b.images) !== null && _c !== void 0 ? _c : {};\n cachedConfig = {\n mode: \"loaded\",\n images: {\n remotePatterns: Array.isArray(images.remotePatterns) ? images.remotePatterns : [],\n domains: Array.isArray(images.domains) ? images.domains : [],\n unoptimized: images.unoptimized === true\n }\n };\n return cachedConfig;\n } catch (err) {\n console.warn(`[image-config] failed to parse ${filePath}: ${err.message} \\u2014 allowing all image URLs`);\n cachedConfig = { mode: \"config-missing\" };\n return cachedConfig;\n }\n }\n function loadMatcher() {\n if (cachedMatcher !== void 0)\n return cachedMatcher;\n try {\n const dynamicRequire = eval(\"require\");\n const mod = dynamicRequire(\"next/dist/shared/lib/match-remote-pattern\");\n const hasRemoteMatch = mod === null || mod === void 0 ? void 0 : mod.hasRemoteMatch;\n if (typeof hasRemoteMatch !== \"function\") {\n throw new Error(\"hasRemoteMatch not exported\");\n }\n cachedMatcher = hasRemoteMatch;\n return cachedMatcher;\n } catch (err) {\n if (!warnedMatcherMissing) {\n warnedMatcherMissing = true;\n console.warn(`[image-config] cannot load next/dist/shared/lib/match-remote-pattern (${err.message}) \\u2014 falling back to deny-external-only mode`);\n }\n cachedMatcher = null;\n return null;\n }\n }\n function validateImageUrl(absoluteUrl, hostHeader) {\n const cfg = loadImageConfig();\n if (cfg.mode === \"config-missing\") {\n return { ok: true, reason: \"config-missing\" };\n }\n const { images } = cfg;\n if (images.unoptimized) {\n return { ok: true, reason: \"unoptimized\" };\n }\n const reqHost = hostHeader.toLowerCase();\n const urlHost = absoluteUrl.host.toLowerCase();\n if (reqHost && reqHost === urlHost) {\n return { ok: true, reason: \"same-origin\" };\n }\n const matcher = loadMatcher();\n if (matcher === null) {\n return { ok: false, reason: \"matcher-unavailable\" };\n }\n if (matcher(images.domains, images.remotePatterns, absoluteUrl)) {\n return { ok: true, reason: \"pattern-match\" };\n }\n return { ok: false, reason: \"remote-pattern-not-matched\" };\n }\n exports.validateImageUrl = validateImageUrl;\n function _resetImageConfigCacheForTests() {\n cachedConfig = void 0;\n cachedMatcher = void 0;\n warnedMatcherMissing = false;\n }\n exports._resetImageConfigCacheForTests = _resetImageConfigCacheForTests;\n function _setMatcherForTests(impl) {\n cachedMatcher = impl;\n }\n exports._setMatcherForTests = _setMatcherForTests;\n }\n});\n\n// dist/runtime/image-proxy.js\nvar require_image_proxy = __commonJS({\n \"dist/runtime/image-proxy.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.handleImageProxy = void 0;\n var stream_1 = require(\"stream\");\n var gateway_auth_1 = require_gateway_auth();\n var image_config_1 = require_image_config();\n var GATEWAY_TIMEOUT_MS = 1e4;\n var PASSTHROUGH_HEADERS = [\n \"content-type\",\n \"content-length\",\n \"cache-control\",\n \"etag\",\n \"vary\",\n \"last-modified\",\n \"content-security-policy\"\n ];\n function resolveAbsoluteUrl(rawUrl, req) {\n if (rawUrl.startsWith(\"http://\") || rawUrl.startsWith(\"https://\")) {\n return rawUrl;\n }\n const host = req.headers[\"host\"];\n if (!host)\n return null;\n const protoHeader = req.headers[\"x-forwarded-proto\"];\n const proto = (Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) || (Array.isArray(protoHeader) ? protoHeader[0] : protoHeader) || \"https\";\n const path3 = rawUrl.startsWith(\"/\") ? rawUrl : `/${rawUrl}`;\n return `${proto}://${host}${path3}`;\n }\n function writeJson(res, status, body) {\n res.statusCode = status;\n res.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n res.end(JSON.stringify(body));\n }\n async function handleImageProxy(req, res) {\n const reqUrl = req.url || \"\";\n const qIdx = reqUrl.indexOf(\"?\");\n if (qIdx === -1) {\n return writeJson(res, 400, { error: \"Missing query parameters\" });\n }\n const params = new URLSearchParams(reqUrl.slice(qIdx + 1));\n const rawUrl = params.get(\"url\");\n const w = params.get(\"w\");\n const q = params.get(\"q\");\n if (!rawUrl || !w) {\n return writeJson(res, 400, {\n error: \"Missing required parameters: url, w\"\n });\n }\n const absoluteUrl = resolveAbsoluteUrl(rawUrl, req);\n if (!absoluteUrl) {\n return writeJson(res, 500, {\n error: \"Cannot resolve absolute URL: missing Host header\"\n });\n }\n let parsedUrl;\n try {\n parsedUrl = new URL(absoluteUrl);\n } catch (_a) {\n return writeJson(res, 400, { error: \"Invalid url parameter\" });\n }\n const hostHeader = req.headers[\"host\"] || \"\";\n const verdict = (0, image_config_1.validateImageUrl)(parsedUrl, hostHeader);\n if (!verdict.ok) {\n return writeJson(res, 400, { error: \"url not allowed\" });\n }\n const cfg = (0, gateway_auth_1.loadGatewayAuthConfig)();\n if (!cfg) {\n return writeJson(res, 500, {\n error: \"Gateway auth config missing\"\n });\n }\n const upstreamParams = new URLSearchParams({ url: absoluteUrl, w });\n if (q)\n upstreamParams.set(\"q\", q);\n const upstreamPath = `/image/optimize?${upstreamParams}`;\n const ifNoneMatch = req.headers[\"if-none-match\"];\n const upstreamHeaders = {};\n if (typeof ifNoneMatch === \"string\") {\n upstreamHeaders[\"if-none-match\"] = ifNoneMatch;\n }\n const accept = req.headers[\"accept\"];\n if (typeof accept === \"string\") {\n upstreamHeaders[\"accept\"] = accept;\n }\n let upstream;\n try {\n upstream = await (0, gateway_auth_1.gatewayFetch)(cfg, upstreamPath, {\n method: \"GET\",\n headers: upstreamHeaders,\n timeoutMs: GATEWAY_TIMEOUT_MS\n });\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[image-proxy] Gateway timeout after ${GATEWAY_TIMEOUT_MS}ms: ${absoluteUrl}`);\n return writeJson(res, 504, { error: \"Upstream timeout\" });\n }\n console.warn(`[image-proxy] Gateway fetch error: ${err.message} (url=${absoluteUrl})`);\n return writeJson(res, 502, { error: \"Bad gateway\" });\n }\n res.statusCode = upstream.status;\n for (const name of PASSTHROUGH_HEADERS) {\n const value = upstream.headers.get(name);\n if (value !== null) {\n res.setHeader(name, value);\n }\n }\n if (upstream.status === 304 || !upstream.body) {\n res.end();\n return;\n }\n try {\n const nodeStream = stream_1.Readable.fromWeb(upstream.body);\n nodeStream.on(\"error\", (err) => {\n console.warn(`[image-proxy] Stream error: ${err.message}`);\n if (!res.writableEnded)\n res.end();\n });\n nodeStream.pipe(res);\n } catch (err) {\n console.warn(`[image-proxy] Pipe setup failed: ${err.message}`);\n if (!res.headersSent) {\n writeJson(res, 502, { error: \"Stream setup failed\" });\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n }\n exports2.handleImageProxy = handleImageProxy;\n }\n});\n\n// dist/runtime/edge-context.js\nvar require_edge_context = __commonJS({\n \"dist/runtime/edge-context.js\"(exports2) {\n \"use strict\";\n var _a;\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.getEdgeContext = exports2.runWithEdgeContext = exports2.buildEdgeContextFromHeaders = void 0;\n var node_async_hooks_1 = require(\"node:async_hooks\");\n var ALS_KEY = Symbol.for(\"pcg.edgeContext.als\");\n var globalRef = globalThis;\n var storage = (_a = globalRef[ALS_KEY]) !== null && _a !== void 0 ? _a : globalRef[ALS_KEY] = new node_async_hooks_1.AsyncLocalStorage();\n var SITE_ID_HEADER = \"x-alicdn-site-id\";\n var HOSTNAME_HEADER = \"host\";\n var FORWARDED_HOSTNAME_HEADER = \"x-forwarded-host\";\n function pickHeader(headers, name) {\n var _a2;\n return (_a2 = headers[name]) !== null && _a2 !== void 0 ? _a2 : headers[name.toLowerCase()];\n }\n function parseHostname(raw) {\n var _a2;\n if (!raw)\n return void 0;\n const first = (_a2 = raw.split(\",\")[0]) === null || _a2 === void 0 ? void 0 : _a2.trim();\n return first || void 0;\n }\n function parseSiteId(raw) {\n if (!raw)\n return void 0;\n const trimmed = raw.trim();\n if (!trimmed)\n return void 0;\n const n = Number(trimmed);\n return Number.isFinite(n) && trimmed === String(n) ? n : trimmed;\n }\n function buildEdgeContextFromHeaders(headers) {\n var _a2;\n const ctx = {};\n const siteId = parseSiteId(pickHeader(headers, SITE_ID_HEADER));\n if (siteId !== void 0)\n ctx.siteId = siteId;\n const hostname = (_a2 = parseHostname(pickHeader(headers, HOSTNAME_HEADER))) !== null && _a2 !== void 0 ? _a2 : parseHostname(pickHeader(headers, FORWARDED_HOSTNAME_HEADER));\n if (hostname)\n ctx.hostname = hostname;\n return ctx;\n }\n exports2.buildEdgeContextFromHeaders = buildEdgeContextFromHeaders;\n function runWithEdgeContext(headers, fn) {\n const ctx = buildEdgeContextFromHeaders(headers);\n return storage.run(ctx, fn);\n }\n exports2.runWithEdgeContext = runWithEdgeContext;\n function getEdgeContext() {\n var _a2;\n return (_a2 = storage.getStore()) !== null && _a2 !== void 0 ? _a2 : {};\n }\n exports2.getEdgeContext = getEdgeContext;\n }\n});\n\n// dist/adapters/wrappers/node-server.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar http = require(\"http\");\nvar fs2 = require(\"fs\");\nvar path2 = require(\"path\");\nvar image_proxy_1 = require_image_proxy();\nvar edge_context_1 = require_edge_context();\nvar MIME_TYPES = {\n \".js\": \"application/javascript\",\n \".mjs\": \"application/javascript\",\n \".css\": \"text/css\",\n \".html\": \"text/html\",\n \".json\": \"application/json\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".woff\": \"font/woff\",\n \".woff2\": \"font/woff2\",\n \".ttf\": \"font/ttf\",\n \".map\": \"application/json\",\n \".txt\": \"text/plain\",\n \".webp\": \"image/webp\"\n};\nfunction parseQuery(url) {\n const idx = url.indexOf(\"?\");\n if (idx === -1)\n return {};\n const params = {};\n const searchParams = new URLSearchParams(url.slice(idx + 1));\n for (const [key, value] of searchParams) {\n const existing = params[key];\n if (existing === void 0) {\n params[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n params[key] = [existing, value];\n }\n }\n return params;\n}\nfunction parseCookies(cookieHeader) {\n if (!cookieHeader)\n return {};\n const cookies = {};\n for (const pair of cookieHeader.split(\";\")) {\n const eqIdx = pair.indexOf(\"=\");\n if (eqIdx === -1)\n continue;\n const name = pair.slice(0, eqIdx).trim();\n const value = pair.slice(eqIdx + 1).trim();\n if (name)\n cookies[name] = value;\n }\n return cookies;\n}\nfunction flattenHeaders(rawHeaders) {\n const headers = {};\n for (const [key, value] of Object.entries(rawHeaders)) {\n if (value === void 0)\n continue;\n headers[key.toLowerCase()] = Array.isArray(value) ? value.join(\", \") : value;\n }\n return headers;\n}\nasync function readBody(req) {\n if (req.method === \"GET\" || req.method === \"HEAD\")\n return void 0;\n return new Promise((resolve, reject) => {\n const chunks = [];\n req.on(\"data\", (chunk) => chunks.push(chunk));\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf-8\")));\n req.on(\"error\", reject);\n });\n}\nfunction serveStaticFile(assetsDir, req, res) {\n var _a, _b;\n const urlPath = (_b = (_a = req.url) === null || _a === void 0 ? void 0 : _a.split(\"?\")[0]) !== null && _b !== void 0 ? _b : \"/\";\n if (urlPath === \"/\" || !urlPath.startsWith(\"/\"))\n return false;\n const filePath = path2.join(assetsDir, urlPath);\n const normalizedPath = path2.normalize(filePath);\n if (!normalizedPath.startsWith(assetsDir)) {\n res.writeHead(403);\n res.end();\n return true;\n }\n let stat;\n try {\n stat = fs2.statSync(normalizedPath);\n } catch (_c) {\n return false;\n }\n if (!stat.isFile())\n return false;\n const ext = path2.extname(normalizedPath);\n const contentType = MIME_TYPES[ext] || \"application/octet-stream\";\n const isHashedAsset = urlPath.startsWith(\"/_next/static/\");\n res.writeHead(200, {\n \"Content-Type\": contentType,\n \"Content-Length\": stat.size,\n \"Cache-Control\": isHashedAsset ? \"public, max-age=31536000, immutable\" : \"public, max-age=60\"\n });\n fs2.createReadStream(normalizedPath).pipe(res);\n return true;\n}\nfunction bridgeOpenNextHandler(handler) {\n return async (req, res) => {\n var _a, _b, _c, _d, _e, _f;\n try {\n const rawUrl = req.url || \"/\";\n const headers = flattenHeaders(req.headers);\n const body = await readBody(req);\n const host = headers[\"host\"] || `localhost:${(_a = process.env.PORT) !== null && _a !== void 0 ? _a : \"3000\"}`;\n const proto = ((_c = (_b = headers[\"x-forwarded-proto\"]) === null || _b === void 0 ? void 0 : _b.split(\",\")[0]) === null || _c === void 0 ? void 0 : _c.trim()) || \"http\";\n const absoluteUrl = new URL(`${proto}://${host}${rawUrl}`);\n const event = {\n type: \"core\",\n method: req.method || \"GET\",\n rawPath: absoluteUrl.pathname,\n url: absoluteUrl.href,\n body,\n headers,\n query: parseQuery(rawUrl),\n cookies: parseCookies(headers[\"cookie\"]),\n remoteAddress: ((_e = (_d = headers[\"x-forwarded-for\"]) === null || _d === void 0 ? void 0 : _d.split(\",\")[0]) === null || _e === void 0 ? void 0 : _e.trim()) || headers[\"x-real-ip\"] || ((_f = req.socket) === null || _f === void 0 ? void 0 : _f.remoteAddress) || \"127.0.0.1\"\n };\n const abortController = new AbortController();\n res.on(\"close\", () => abortController.abort());\n const streamCreator = {\n writeHeaders(prelude) {\n res.setHeader(\"Set-Cookie\", prelude.cookies);\n res.writeHead(prelude.statusCode, prelude.headers);\n res.flushHeaders();\n return res;\n },\n abortSignal: abortController.signal\n };\n await (0, edge_context_1.runWithEdgeContext)(headers, () => handler(event, { streamCreator }));\n } catch (err) {\n if (!res.headersSent) {\n const isDev = process.env.NODE_ENV !== \"production\";\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({\n error: \"Internal Server Error\",\n ...isDev && { message: err.message, stack: err.stack }\n }));\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n };\n}\nasync function wrapper(handler) {\n var _a;\n const port = parseInt((_a = process.env.PORT) !== null && _a !== void 0 ? _a : \"3000\", 10);\n const assetsDir = path2.resolve(process.cwd(), \"..\", \"..\", \"assets\");\n if (!fs2.existsSync(assetsDir)) {\n console.warn(`[pcg-node] assets directory not found at ${assetsDir} \\u2014 static file requests will fall through to Next handler`);\n }\n const dispatchToNext = bridgeOpenNextHandler(handler);\n const server = http.createServer(async (req, res) => {\n var _a2, _b;\n const urlPath = (_b = (_a2 = req.url) === null || _a2 === void 0 ? void 0 : _a2.split(\"?\")[0]) !== null && _b !== void 0 ? _b : \"/\";\n if (urlPath === \"/__health\") {\n res.writeHead(200, { \"Content-Type\": \"text/plain\" });\n res.end(\"OK\");\n return;\n }\n if (urlPath === \"/_next/image\") {\n try {\n await (0, image_proxy_1.handleImageProxy)(req, res);\n } catch (err) {\n console.error(\"[pcg-node] image-proxy error:\", err);\n if (!res.headersSent) {\n res.writeHead(500, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Image proxy failed\" }));\n } else if (!res.writableEnded) {\n res.end();\n }\n }\n return;\n }\n if (serveStaticFile(assetsDir, req, res))\n return;\n await dispatchToNext(req, res);\n });\n let shuttingDown = false;\n const shutdown = (signal) => {\n if (shuttingDown)\n return;\n shuttingDown = true;\n console.log(`[pcg-node] ${signal} received, shutting down...`);\n server.close(() => process.exit(0));\n setTimeout(() => process.exit(0), 5e3).unref();\n };\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n await new Promise((resolve) => {\n server.listen(port, () => {\n console.log(`[pcg-node] Listening on port ${port}`);\n console.log(`[pcg-node] assets: ${assetsDir}`);\n console.log(`[pcg-node] routes: /__health, /_next/image, /_next/static/*, <next>`);\n resolve();\n });\n });\n}\nvar wrapperDef = {\n wrapper,\n name: \"pcg-node\",\n supportStreaming: true\n};\nexports.default = wrapperDef;\n",
|
|
4
4
|
"adapters/converters/passthrough.js": "\"use strict\";\n\n// dist/adapters/converters/passthrough.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar converter = {\n convertFrom: async (event) => event,\n convertTo: async (result) => result,\n name: \"passthrough\"\n};\nexports.default = converter;\n",
|
|
5
5
|
"overrides/incrementalCache/gateway.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\n\n// dist/_protocol/types.js\nvar require_types = __commonJS({\n \"dist/_protocol/types.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n }\n});\n\n// dist/_protocol/keys.js\nvar require_keys = __commonJS({\n \"dist/_protocol/keys.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.buildPageMetadataKey = exports2.buildTagKey = exports2.buildStaticAssetKey = exports2.buildOssKey = void 0;\n function stripLeadingSlash(s) {\n return s.replace(/^\\/+/, \"\");\n }\n function buildOssKey(params) {\n const { appId, buildId, cacheType = \"cache\" } = params;\n const key = stripLeadingSlash(params.key);\n if (cacheType === \"fetch\") {\n return `${appId}/__fetch/${buildId}/${key}`;\n }\n return `${appId}/${buildId}/${key}.cache`;\n }\n exports2.buildOssKey = buildOssKey;\n function buildStaticAssetKey(params) {\n const p = stripLeadingSlash(params.path);\n return `${params.appId}/_next/static/${p}`;\n }\n exports2.buildStaticAssetKey = buildStaticAssetKey;\n function buildTagKey(params) {\n return {\n app_id: params.appId,\n tag: `${params.buildId}/${params.tag}`,\n path: `${params.buildId}/${params.path}`\n };\n }\n exports2.buildTagKey = buildTagKey;\n function buildPageMetadataKey(params) {\n return {\n app_id: params.appId,\n url: params.url\n };\n }\n exports2.buildPageMetadataKey = buildPageMetadataKey;\n }\n});\n\n// dist/_protocol/endpoints.js\nvar require_endpoints = __commonJS({\n \"dist/_protocol/endpoints.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.buildCentralEndpoints = void 0;\n function stripTrailingSlashes(s) {\n return s.replace(/\\/+$/, \"\");\n }\n function buildCentralEndpoints(base) {\n const b = stripTrailingSlashes(base);\n return {\n base: b,\n cache: `${b}/cache`,\n cacheRefresh: `${b}/cache/refresh`,\n revalidateTag: `${b}/revalidate/tag`,\n revalidatePath: `${b}/revalidate/path`,\n tagByTag: `${b}/tag/by-tag`,\n tagByPath: `${b}/tag/by-path`,\n tagLastModified: `${b}/tag/last-modified`,\n tagWrite: `${b}/tag/write`,\n deploySts: `${b}/deploy/sts-token`,\n deployTags: `${b}/deploy/tags`\n };\n }\n exports2.buildCentralEndpoints = buildCentralEndpoints;\n }\n});\n\n// dist/_protocol/index.js\nvar require_protocol = __commonJS({\n \"dist/_protocol/index.js\"(exports2) {\n \"use strict\";\n var __createBinding = exports2 && exports2.__createBinding || (Object.create ? function(o, m, k, k2) {\n if (k2 === void 0) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() {\n return m[k];\n } };\n }\n Object.defineProperty(o, k2, desc);\n } : function(o, m, k, k2) {\n if (k2 === void 0) k2 = k;\n o[k2] = m[k];\n });\n var __exportStar = exports2 && exports2.__exportStar || function(m, exports3) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports3, p)) __createBinding(exports3, m, p);\n };\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n __exportStar(require_types(), exports2);\n __exportStar(require_keys(), exports2);\n __exportStar(require_endpoints(), exports2);\n }\n});\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/overrides/incrementalCache/gateway.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar protocol_1 = require_protocol();\nvar gateway_auth_1 = require_gateway_auth();\nvar GET_TIMEOUT = 5e3;\nvar SET_TIMEOUT = 1e4;\nvar DELETE_TIMEOUT = 5e3;\nfunction buildKey(config, key, isFetch) {\n return (0, protocol_1.buildOssKey)({\n appId: `${config.aliuid}/${config.routinename}`,\n buildId: config.version,\n key,\n cacheType: isFetch ? \"fetch\" : \"cache\"\n });\n}\nvar GatewayIncrementalCache = class {\n constructor() {\n this.name = \"gateway-incremental-cache\";\n this.config = null;\n this.configLoaded = false;\n }\n /**\n * 延迟加载配置,避免在构造函数中因环境变量缺失而阻塞 Function 启动。\n */\n getConfig() {\n if (!this.configLoaded) {\n this.config = (0, gateway_auth_1.loadGatewayAuthConfig)();\n this.configLoaded = true;\n }\n return this.config;\n }\n /**\n * 从 Gateway 读取缓存。\n */\n async get(key, isFetch) {\n const config = this.getConfig();\n if (!config)\n return null;\n const ossKey = buildKey(config, key, isFetch);\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {\n method: \"GET\",\n timeoutMs: GET_TIMEOUT\n });\n if (res.status === 404)\n return null;\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[incrementalCache] GET \\u88AB\\u62D2\\u7EDD: key=\"${ossKey}\" (${res.status})\\uFF0C\\u8BF7\\u68C0\\u67E5\\u7B7E\\u540D secret \\u6216 key \\u524D\\u7F00`);\n } else {\n console.warn(`[incrementalCache] GET \\u5931\\u8D25: key=\"${ossKey}\", \\u72B6\\u6001\\u7801=${res.status}`);\n }\n return null;\n }\n const body = await res.text();\n let envelope;\n try {\n envelope = JSON.parse(body);\n } catch (_a) {\n console.warn(`[incrementalCache] JSON \\u89E3\\u6790\\u5931\\u8D25: key=\"${ossKey}\"`);\n return null;\n }\n if (!envelope || typeof envelope !== \"object\" || typeof envelope.lastModified !== \"number\") {\n console.warn(`[incrementalCache] envelope \\u683C\\u5F0F\\u5F02\\u5E38\\u6216\\u7F3A lastModified: key=\"${ossKey}\"`);\n return null;\n }\n return { value: envelope.value, lastModified: envelope.lastModified };\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[incrementalCache] GET \\u8D85\\u65F6: key=\"${ossKey}\" (${GET_TIMEOUT}ms)`);\n } else {\n console.warn(`[incrementalCache] GET \\u5F02\\u5E38: key=\"${ossKey}\", ${err.message}`);\n }\n return null;\n }\n }\n /**\n * 向 Gateway 写入缓存。\n */\n async set(key, value, isFetch) {\n const config = this.getConfig();\n if (!config)\n return;\n const ossKey = buildKey(config, key, isFetch);\n const body = JSON.stringify({ lastModified: Date.now(), value });\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body,\n timeoutMs: SET_TIMEOUT\n });\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[incrementalCache] PUT \\u88AB\\u62D2\\u7EDD: key=\"${ossKey}\" (${res.status})\\uFF0C\\u8BF7\\u68C0\\u67E5\\u7B7E\\u540D secret \\u6216 key \\u524D\\u7F00`);\n } else {\n console.warn(`[incrementalCache] PUT \\u5931\\u8D25: key=\"${ossKey}\", \\u72B6\\u6001\\u7801=${res.status}`);\n }\n }\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[incrementalCache] PUT \\u8D85\\u65F6: key=\"${ossKey}\" (${SET_TIMEOUT}ms)`);\n } else {\n console.warn(`[incrementalCache] PUT \\u5F02\\u5E38: key=\"${ossKey}\", ${err.message}`);\n }\n }\n }\n /**\n * 通过 Gateway 删除缓存。\n */\n async delete(key, isFetch) {\n const config = this.getConfig();\n if (!config)\n return;\n const ossKey = buildKey(config, key, isFetch);\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, `/storage/${ossKey}`, {\n method: \"DELETE\",\n timeoutMs: DELETE_TIMEOUT\n });\n if (res.status === 404)\n return;\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[incrementalCache] DELETE \\u88AB\\u62D2\\u7EDD: key=\"${ossKey}\" (${res.status})\\uFF0C\\u8BF7\\u68C0\\u67E5\\u7B7E\\u540D secret \\u6216 key \\u524D\\u7F00`);\n } else {\n console.warn(`[incrementalCache] DELETE \\u5931\\u8D25: key=\"${ossKey}\", \\u72B6\\u6001\\u7801=${res.status}`);\n }\n }\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[incrementalCache] DELETE \\u8D85\\u65F6: key=\"${ossKey}\" (${DELETE_TIMEOUT}ms)`);\n } else {\n console.warn(`[incrementalCache] DELETE \\u5F02\\u5E38: key=\"${ossKey}\", ${err.message}`);\n }\n }\n }\n};\nexports.default = GatewayIncrementalCache;\n",
|
|
6
|
-
"overrides/tagCache/gateway.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/overrides/tagCache/gateway.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar gateway_auth_1 = require_gateway_auth();\nvar QUERY_TIMEOUT = 3e3;\nvar WRITE_TIMEOUT = 5e3;\nvar BATCH_SIZE = 200;\nfunction stripLeadingSlash(s) {\n return s.replace(/^\\/+/, \"\");\n}\nvar GatewayTagCache = class {\n constructor() {\n this.name = \"gateway-tag-cache\";\n this.mode = \"nextMode\";\n this.config = null;\n this.configLoaded = false;\n }\n getConfig() {\n if (!this.configLoaded) {\n this.config = (0, gateway_auth_1.loadGatewayAuthConfig)();\n this.configLoaded = true;\n }\n return this.config;\n }\n buildTagKey(tag) {\n const config = this.getConfig();\n if (!config)\n return tag;\n return `${config.version}/${stripLeadingSlash(tag)}`;\n }\n async getLastRevalidated(tags) {\n const config = this.getConfig();\n if (!config)\n return 0;\n try {\n const rows = await this.batchGetTags(config, tags);\n let maxRevalidatedAt = 0;\n for (const row of rows) {\n if (row.revalidatedAt && row.revalidatedAt > maxRevalidatedAt) {\n maxRevalidatedAt = row.revalidatedAt;\n }\n }\n return maxRevalidatedAt;\n } catch (err) {\n console.warn(`[tagCache] getLastRevalidated error: ${err.message}`);\n return 0;\n }\n }\n async hasBeenRevalidated(tags, lastModified) {\n const config = this.getConfig();\n if (!config)\n return false;\n if (tags.length === 0)\n return false;\n try {\n const rows = await this.batchGetTags(config, tags);\n const now = Date.now();\n const lm = lastModified !== null && lastModified !== void 0 ? lastModified : 0;\n for (const row of rows) {\n if (row.expire !== void 0) {\n if (row.expire <= now && row.expire > lm) {\n return true;\n }\n }\n if (row.revalidatedAt !== void 0 && row.revalidatedAt > lm) {\n return true;\n }\n }\n return false;\n } catch (err) {\n console.warn(`[tagCache] hasBeenRevalidated error: ${err.message}`);\n return false;\n }\n }\n async isStale(tags, lastModified) {\n var _a;\n const config = this.getConfig();\n if (!config)\n return false;\n if (tags.length === 0)\n return false;\n try {\n const rows = await this.batchGetTags(config, tags);\n const lm = lastModified !== null && lastModified !== void 0 ? lastModified : 0;\n for (const row of rows) {\n if (row.stale === void 0)\n continue;\n const revalidatedAt = (_a = row.revalidatedAt) !== null && _a !== void 0 ? _a : 0;\n if (revalidatedAt > lm && row.stale >= lm) {\n return true;\n }\n }\n return false;\n } catch (err) {\n console.warn(`[tagCache] isStale error: ${err.message}`);\n return false;\n }\n }\n async writeTags(tags) {\n if (!tags || tags.length === 0)\n return;\n const config = this.getConfig();\n if (!config)\n return;\n const writeTs = Date.now();\n const rows = tags.map((input) => {\n const tagStr = typeof input === \"string\" ? input : input.tag;\n const stale = typeof input === \"string\" ? void 0 : input.stale;\n const expire = typeof input === \"string\" ? void 0 : input.expire;\n const tagKey = this.buildTagKey(tagStr);\n const columns = [\n { name: \"revalidatedAt\", value: writeTs }\n ];\n if (stale !== void 0) {\n columns.push({ name: \"stale\", value: stale });\n }\n if (expire !== void 0) {\n columns.push({ name: \"expire\", value: expire });\n }\n return {\n primaryKey: [\n { name: \"app_id\", value: `${config.aliuid}/${config.routinename}` },\n { name: \"tag\", value: tagKey }\n ],\n columns\n };\n });\n await this.batchWrite(config, rows);\n }\n // ---- private methods ----\n async batchGetTags(config, tags) {\n const primaryKeys = tags.map((tag) => [\n { name: \"app_id\", value: `${config.aliuid}/${config.routinename}` },\n { name: \"tag\", value: this.buildTagKey(tag) }\n ]);\n const res = await (0, gateway_auth_1.gatewayFetch)(config, \"/table/batch-get-row\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ primaryKeys }),\n timeoutMs: QUERY_TIMEOUT\n });\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[tagCache] batch-get-row rejected (${res.status})`);\n } else {\n console.warn(`[tagCache] batch-get-row failed: status=${res.status}`);\n }\n return [];\n }\n const data = await res.json();\n if (!data.rows)\n return [];\n return data.rows.map((row) => {\n var _a;\n const result = {};\n for (const col of (_a = row.columns) !== null && _a !== void 0 ? _a : []) {\n if (col.name === \"revalidatedAt\" && typeof col.value === \"number\") {\n result.revalidatedAt = col.value;\n } else if (col.name === \"stale\" && typeof col.value === \"number\") {\n result.stale = col.value;\n } else if (col.name === \"expire\" && typeof col.value === \"number\") {\n result.expire = col.value;\n }\n }\n return result;\n });\n }\n async batchWrite(config, rows) {\n if (rows.length === 0)\n return;\n for (let i = 0; i < rows.length; i += BATCH_SIZE) {\n const batch = rows.slice(i, i + BATCH_SIZE);\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, \"/table/batch-write\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ rows: batch }),\n timeoutMs: WRITE_TIMEOUT\n });\n if (res.status === 401 || res.status === 403) {\n console.error(`[tagCache] batch-write rejected (${res.status})`);\n return;\n }\n if (!res.ok) {\n console.warn(`[tagCache] batch-write failed: status=${res.status}`);\n }\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[tagCache] batch-write timeout (${WRITE_TIMEOUT}ms)`);\n } else {\n console.warn(`[tagCache] batch-write error: ${err.message}`);\n }\n }\n }\n }\n};\nexports.default = GatewayTagCache;\n",
|
|
6
|
+
"overrides/tagCache/gateway.js": "\"use strict\";\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __commonJS = (cb, mod) => function __require() {\n return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;\n};\n\n// dist/runtime/gateway-auth.js\nvar require_gateway_auth = __commonJS({\n \"dist/runtime/gateway-auth.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.gatewayFetch = exports2.signGatewayHeaders = exports2.loadGatewayAuthConfig = void 0;\n var crypto_1 = require(\"crypto\");\n var DEFAULT_TTL_MS = 5 * 60 * 1e3;\n var DEFAULT_TIMEOUT_MS = 5e3;\n function _fetch(input, init) {\n var _a;\n const fn = globalThis.__nextPatched ? (_a = globalThis.__originalFetch) !== null && _a !== void 0 ? _a : globalThis.fetch : globalThis.fetch;\n return fn(input, init);\n }\n function loadGatewayAuthConfig() {\n const gatewayUrl = process.env.ESA_CACHE_GW_GATEWAY_ENDPOINT;\n const secret = process.env.ESA_CACHE_GW_AUTH_KEY;\n const aliuid = process.env.ESA_CACHE_GW_ALIUID;\n const routinename = process.env.ESA_CACHE_GW_ROUTINENAME;\n const version = process.env.ESA_CACHE_GW_VERSION;\n const missing = [];\n if (!gatewayUrl)\n missing.push(\"ESA_CACHE_GW_GATEWAY_ENDPOINT\");\n if (!secret)\n missing.push(\"ESA_CACHE_GW_AUTH_KEY\");\n if (!aliuid)\n missing.push(\"ESA_CACHE_GW_ALIUID\");\n if (!routinename)\n missing.push(\"ESA_CACHE_GW_ROUTINENAME\");\n if (!version)\n missing.push(\"ESA_CACHE_GW_VERSION\");\n if (missing.length > 0) {\n console.error(`[gateway-auth] \\u7F3A\\u5C11\\u5FC5\\u9700\\u7684\\u73AF\\u5883\\u53D8\\u91CF: ${missing.join(\", \")}`);\n return null;\n }\n return {\n gatewayUrl: gatewayUrl.replace(/\\/+$/, \"\"),\n secret,\n aliuid,\n routinename,\n version\n };\n }\n exports2.loadGatewayAuthConfig = loadGatewayAuthConfig;\n function signGatewayHeaders(cfg, ttlMs = DEFAULT_TTL_MS) {\n const expires = String(Date.now() + ttlMs);\n const authKey = cfg.secret;\n const md5Hash = (0, crypto_1.createHash)(\"md5\").update(`${authKey}${expires}${cfg.aliuid}${cfg.routinename}${cfg.version}`).digest(\"hex\");\n return {\n authorization: `${expires}-${md5Hash}`,\n aliuid: cfg.aliuid,\n routinename: cfg.routinename,\n version: cfg.version\n };\n }\n exports2.signGatewayHeaders = signGatewayHeaders;\n async function gatewayFetch(cfg, pathOrUrl, init) {\n var _a, _b;\n const url = pathOrUrl.startsWith(\"/\") ? `${cfg.gatewayUrl}${pathOrUrl}` : pathOrUrl;\n const signed = signGatewayHeaders(cfg);\n const headers = new Headers(init === null || init === void 0 ? void 0 : init.headers);\n headers.set(\"Authorization\", signed.authorization);\n headers.set(\"AliUid\", signed.aliuid);\n headers.set(\"RoutineName\", signed.routinename);\n headers.set(\"Version\", signed.version);\n const timeoutMs = (_a = init === null || init === void 0 ? void 0 : init.timeoutMs) !== null && _a !== void 0 ? _a : DEFAULT_TIMEOUT_MS;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n return await _fetch(url, {\n ...init,\n headers,\n signal: (_b = init === null || init === void 0 ? void 0 : init.signal) !== null && _b !== void 0 ? _b : controller.signal\n });\n } finally {\n clearTimeout(timer);\n }\n }\n exports2.gatewayFetch = gatewayFetch;\n }\n});\n\n// dist/runtime/edge-context.js\nvar require_edge_context = __commonJS({\n \"dist/runtime/edge-context.js\"(exports2) {\n \"use strict\";\n var _a;\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.getEdgeContext = exports2.runWithEdgeContext = exports2.buildEdgeContextFromHeaders = void 0;\n var node_async_hooks_1 = require(\"node:async_hooks\");\n var ALS_KEY = Symbol.for(\"pcg.edgeContext.als\");\n var globalRef = globalThis;\n var storage = (_a = globalRef[ALS_KEY]) !== null && _a !== void 0 ? _a : globalRef[ALS_KEY] = new node_async_hooks_1.AsyncLocalStorage();\n var SITE_ID_HEADER = \"x-alicdn-site-id\";\n var HOSTNAME_HEADER = \"host\";\n var FORWARDED_HOSTNAME_HEADER = \"x-forwarded-host\";\n function pickHeader(headers, name) {\n var _a2;\n return (_a2 = headers[name]) !== null && _a2 !== void 0 ? _a2 : headers[name.toLowerCase()];\n }\n function parseHostname(raw) {\n var _a2;\n if (!raw)\n return void 0;\n const first = (_a2 = raw.split(\",\")[0]) === null || _a2 === void 0 ? void 0 : _a2.trim();\n return first || void 0;\n }\n function parseSiteId(raw) {\n if (!raw)\n return void 0;\n const trimmed = raw.trim();\n if (!trimmed)\n return void 0;\n const n = Number(trimmed);\n return Number.isFinite(n) && trimmed === String(n) ? n : trimmed;\n }\n function buildEdgeContextFromHeaders(headers) {\n var _a2;\n const ctx = {};\n const siteId = parseSiteId(pickHeader(headers, SITE_ID_HEADER));\n if (siteId !== void 0)\n ctx.siteId = siteId;\n const hostname = (_a2 = parseHostname(pickHeader(headers, HOSTNAME_HEADER))) !== null && _a2 !== void 0 ? _a2 : parseHostname(pickHeader(headers, FORWARDED_HOSTNAME_HEADER));\n if (hostname)\n ctx.hostname = hostname;\n return ctx;\n }\n exports2.buildEdgeContextFromHeaders = buildEdgeContextFromHeaders;\n function runWithEdgeContext(headers, fn) {\n const ctx = buildEdgeContextFromHeaders(headers);\n return storage.run(ctx, fn);\n }\n exports2.runWithEdgeContext = runWithEdgeContext;\n function getEdgeContext() {\n var _a2;\n return (_a2 = storage.getStore()) !== null && _a2 !== void 0 ? _a2 : {};\n }\n exports2.getEdgeContext = getEdgeContext;\n }\n});\n\n// dist/runtime/cdn-purge.js\nvar require_cdn_purge = __commonJS({\n \"dist/runtime/cdn-purge.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.createCdnPurgeClient = exports2.loadCdnPurgeConfig = void 0;\n var fs = require(\"fs\");\n var path = require(\"path\");\n var gateway_auth_12 = require_gateway_auth();\n var edge_context_1 = require_edge_context();\n var REFRESH_TIMEOUT_MS = 15e3;\n var URL_BATCH_SIZE = 100;\n var REFRESH_CONCURRENCY = 4;\n var TAG_MANIFEST_FILENAME = \"__pcg_tag_manifest.json\";\n function stripLeadingSlash2(s) {\n return s.replace(/^\\/+/, \"\");\n }\n function ensureLeadingSlash(s) {\n return s.startsWith(\"/\") ? s : `/${s}`;\n }\n function loadCdnPurgeConfig() {\n const base = (0, gateway_auth_12.loadGatewayAuthConfig)();\n if (!base)\n return null;\n return { ...base };\n }\n exports2.loadCdnPurgeConfig = loadCdnPurgeConfig;\n function createCdnPurgeClient(cfg) {\n var _a;\n const buildId = cfg.version;\n const pathPrefix = `${buildId}/`;\n const manifestPath = (_a = cfg.manifestPath) !== null && _a !== void 0 ? _a : path.join(__dirname, TAG_MANIFEST_FILENAME);\n let manifestPromise = null;\n async function loadManifest() {\n if (manifestPromise)\n return manifestPromise;\n manifestPromise = (async () => {\n var _a2, _b, _c, _d;\n const map = /* @__PURE__ */ new Map();\n let raw;\n try {\n raw = await fs.promises.readFile(manifestPath, \"utf-8\");\n } catch (err) {\n if ((err === null || err === void 0 ? void 0 : err.code) !== \"ENOENT\") {\n console.warn(`[cdn-purge] manifest read error ${manifestPath}: ${(_a2 = err === null || err === void 0 ? void 0 : err.message) !== null && _a2 !== void 0 ? _a2 : err}`);\n }\n return /* @__PURE__ */ new Map();\n }\n let rows;\n try {\n const parsed = JSON.parse(raw);\n rows = Array.isArray(parsed) ? parsed : [];\n } catch (err) {\n console.warn(`[cdn-purge] manifest parse error ${manifestPath}: ${(_b = err === null || err === void 0 ? void 0 : err.message) !== null && _b !== void 0 ? _b : err}`);\n return /* @__PURE__ */ new Map();\n }\n for (const row of rows) {\n const tagPk = (_c = row === null || row === void 0 ? void 0 : row.tag) === null || _c === void 0 ? void 0 : _c.S;\n const pathPk = (_d = row === null || row === void 0 ? void 0 : row.path) === null || _d === void 0 ? void 0 : _d.S;\n if (typeof tagPk !== \"string\" || typeof pathPk !== \"string\")\n continue;\n if (!tagPk.startsWith(pathPrefix))\n continue;\n if (!pathPk.startsWith(pathPrefix))\n continue;\n const tag = tagPk.slice(pathPrefix.length);\n const p = pathPk.slice(pathPrefix.length);\n if (!tag || !p)\n continue;\n let bucket = map.get(tag);\n if (!bucket) {\n bucket = /* @__PURE__ */ new Set();\n map.set(tag, bucket);\n }\n bucket.add(p);\n }\n const result = /* @__PURE__ */ new Map();\n let totalEntries = 0;\n for (const [tag, set] of map) {\n result.set(tag, Array.from(set));\n totalEntries += set.size;\n }\n console.log(`[cdn-purge] manifest loaded: tags=${result.size} entries=${totalEntries} (${manifestPath})`);\n return result;\n })();\n return manifestPromise;\n }\n function expandPathsToUrls(paths, hostname) {\n const normalized = /* @__PURE__ */ new Set();\n for (const p of paths) {\n if (!p)\n continue;\n normalized.add(ensureLeadingSlash(p));\n }\n if (normalized.size === 0)\n return [];\n const urls = /* @__PURE__ */ new Set();\n for (const p of normalized) {\n urls.add(`https://${hostname}${p}`);\n const rel = stripLeadingSlash2(p);\n urls.add(`https://${hostname}/_next/data/${buildId}/${rel || \"index\"}.json`);\n }\n return Array.from(urls);\n }\n async function refreshBatch(urls, hostname, siteId) {\n var _a2;\n const body = {\n hostname,\n siteId,\n urls\n };\n let res;\n try {\n res = await (0, gateway_auth_12.gatewayFetch)(cfg, \"/cache/refresh\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n timeoutMs: REFRESH_TIMEOUT_MS\n });\n } catch (err) {\n console.warn(`[cdn-purge] cache/refresh error (${urls.length} urls): ${(_a2 = err === null || err === void 0 ? void 0 : err.message) !== null && _a2 !== void 0 ? _a2 : err}`);\n return;\n }\n if (!res.ok) {\n let detail = \"\";\n try {\n detail = (await res.text()).slice(0, 200);\n } catch (_b) {\n }\n console.warn(`[cdn-purge] cache/refresh failed status=${res.status} urls=${urls.length} ${detail}`);\n return;\n }\n console.log(`[cdn-purge] cache/refresh ok: urls=${urls.length}`);\n }\n async function refreshUrls(allUrls, hostname, siteId) {\n if (allUrls.length === 0)\n return;\n const batches = [];\n for (let i = 0; i < allUrls.length; i += URL_BATCH_SIZE) {\n batches.push(allUrls.slice(i, i + URL_BATCH_SIZE));\n }\n let cursor = 0;\n async function worker() {\n while (cursor < batches.length) {\n const idx = cursor++;\n await refreshBatch(batches[idx], hostname, siteId);\n }\n }\n const workers = Array.from({ length: Math.min(REFRESH_CONCURRENCY, batches.length) }, () => worker());\n await Promise.all(workers);\n }\n function resolveTarget(action) {\n const { hostname, siteId } = (0, edge_context_1.getEdgeContext)();\n if (!hostname || siteId === void 0 || siteId === \"\") {\n console.warn(`[cdn-purge] ${action} skip: edge context missing (hostname=${hostname !== null && hostname !== void 0 ? hostname : \"\\u2205\"} siteId=${siteId !== null && siteId !== void 0 ? siteId : \"\\u2205\"}); \\u8981\\u6C42\\u5165\\u7AD9\\u8BF7\\u6C42\\u5E26 host \\u4E0E x-alicdn-site-id`);\n return null;\n }\n return { hostname, siteId };\n }\n async function purgeByPaths(paths) {\n var _a2;\n try {\n const target = resolveTarget(\"purgeByPaths\");\n if (!target)\n return;\n const urls = expandPathsToUrls(paths, target.hostname);\n console.log(`[cdn-purge] purgeByPaths: input=${paths.length} urls=${urls.length}`);\n await refreshUrls(urls, target.hostname, target.siteId);\n } catch (err) {\n console.warn(`[cdn-purge] purgeByPaths error: ${(_a2 = err === null || err === void 0 ? void 0 : err.message) !== null && _a2 !== void 0 ? _a2 : err}`);\n }\n }\n async function purgeByTags(tags) {\n var _a2;\n try {\n const uniqueTags = Array.from(new Set(tags.map((t) => typeof t === \"string\" ? t : \"\").map((t) => t.trim()).filter(Boolean)));\n if (uniqueTags.length === 0)\n return;\n const target = resolveTarget(\"purgeByTags\");\n if (!target)\n return;\n const map = await loadManifest();\n const merged = /* @__PURE__ */ new Set();\n for (const t of uniqueTags) {\n const paths = map.get(t);\n if (!paths)\n continue;\n for (const p of paths)\n merged.add(p);\n }\n if (merged.size === 0) {\n console.log(`[cdn-purge] purgeByTags: input=${uniqueTags.length} matched=0 (manifest miss, skip)`);\n return;\n }\n const urls = expandPathsToUrls(Array.from(merged), target.hostname);\n console.log(`[cdn-purge] purgeByTags: input=${uniqueTags.length} matched=${merged.size} urls=${urls.length}`);\n await refreshUrls(urls, target.hostname, target.siteId);\n } catch (err) {\n console.warn(`[cdn-purge] purgeByTags error: ${(_a2 = err === null || err === void 0 ? void 0 : err.message) !== null && _a2 !== void 0 ? _a2 : err}`);\n }\n }\n return { purgeByPaths, purgeByTags };\n }\n exports2.createCdnPurgeClient = createCdnPurgeClient;\n }\n});\n\n// dist/overrides/tagCache/gateway.js\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar gateway_auth_1 = require_gateway_auth();\nvar cdn_purge_1 = require_cdn_purge();\nvar QUERY_TIMEOUT = 3e3;\nvar WRITE_TIMEOUT = 5e3;\nvar BATCH_SIZE = 200;\nfunction stripLeadingSlash(s) {\n return s.replace(/^\\/+/, \"\");\n}\nvar GatewayTagCache = class {\n constructor() {\n this.name = \"gateway-tag-cache\";\n this.mode = \"nextMode\";\n this.config = null;\n this.configLoaded = false;\n this.purgeClient = null;\n this.purgeClientLoaded = false;\n }\n getConfig() {\n if (!this.configLoaded) {\n this.config = (0, gateway_auth_1.loadGatewayAuthConfig)();\n this.configLoaded = true;\n }\n return this.config;\n }\n getPurgeClient() {\n if (!this.purgeClientLoaded) {\n const cfg = (0, cdn_purge_1.loadCdnPurgeConfig)();\n this.purgeClient = cfg ? (0, cdn_purge_1.createCdnPurgeClient)(cfg) : null;\n this.purgeClientLoaded = true;\n }\n return this.purgeClient;\n }\n buildTagKey(tag) {\n const config = this.getConfig();\n if (!config)\n return tag;\n return `${config.version}/${stripLeadingSlash(tag)}`;\n }\n async getLastRevalidated(tags) {\n const config = this.getConfig();\n if (!config)\n return 0;\n try {\n const rows = await this.batchGetTags(config, tags);\n let maxRevalidatedAt = 0;\n for (const row of rows) {\n if (row.revalidatedAt && row.revalidatedAt > maxRevalidatedAt) {\n maxRevalidatedAt = row.revalidatedAt;\n }\n }\n return maxRevalidatedAt;\n } catch (err) {\n console.warn(`[tagCache] getLastRevalidated error: ${err.message}`);\n return 0;\n }\n }\n async hasBeenRevalidated(tags, lastModified) {\n const config = this.getConfig();\n if (!config)\n return false;\n if (tags.length === 0)\n return false;\n try {\n const rows = await this.batchGetTags(config, tags);\n const now = Date.now();\n const lm = lastModified !== null && lastModified !== void 0 ? lastModified : 0;\n for (const row of rows) {\n if (row.expire !== void 0) {\n if (row.expire <= now && row.expire > lm) {\n return true;\n }\n }\n if (row.revalidatedAt !== void 0 && row.revalidatedAt > lm) {\n return true;\n }\n }\n return false;\n } catch (err) {\n console.warn(`[tagCache] hasBeenRevalidated error: ${err.message}`);\n return false;\n }\n }\n async isStale(tags, lastModified) {\n var _a;\n const config = this.getConfig();\n if (!config)\n return false;\n if (tags.length === 0)\n return false;\n try {\n const rows = await this.batchGetTags(config, tags);\n const lm = lastModified !== null && lastModified !== void 0 ? lastModified : 0;\n for (const row of rows) {\n if (row.stale === void 0)\n continue;\n const revalidatedAt = (_a = row.revalidatedAt) !== null && _a !== void 0 ? _a : 0;\n if (revalidatedAt > lm && row.stale >= lm) {\n return true;\n }\n }\n return false;\n } catch (err) {\n console.warn(`[tagCache] isStale error: ${err.message}`);\n return false;\n }\n }\n async writeTags(tags) {\n if (!tags || tags.length === 0)\n return;\n const config = this.getConfig();\n if (!config)\n return;\n const writeTs = Date.now();\n const rows = tags.map((input) => {\n const tagStr = typeof input === \"string\" ? input : input.tag;\n const stale = typeof input === \"string\" ? void 0 : input.stale;\n const expire = typeof input === \"string\" ? void 0 : input.expire;\n const tagKey = this.buildTagKey(tagStr);\n const columns = [\n { name: \"revalidatedAt\", value: writeTs }\n ];\n if (stale !== void 0) {\n columns.push({ name: \"stale\", value: stale });\n }\n if (expire !== void 0) {\n columns.push({ name: \"expire\", value: expire });\n }\n return {\n primaryKey: [\n { name: \"app_id\", value: `${config.aliuid}/${config.routinename}` },\n { name: \"tag\", value: tagKey }\n ],\n columns\n };\n });\n await this.batchWrite(config, rows);\n const purgeClient = this.getPurgeClient();\n if (purgeClient) {\n const tagStrs = tags.map((t) => typeof t === \"string\" ? t : t.tag).filter((s) => typeof s === \"string\" && s.length > 0);\n if (tagStrs.length > 0) {\n purgeClient.purgeByTags(tagStrs).catch((err) => {\n var _a;\n console.warn(`[tagCache] purge fan-out failed: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);\n });\n }\n }\n }\n // ---- private methods ----\n async batchGetTags(config, tags) {\n var _a, _b;\n const primaryKeys = tags.map((tag) => [\n { name: \"app_id\", value: `${config.aliuid}/${config.routinename}` },\n { name: \"tag\", value: this.buildTagKey(tag) }\n ]);\n const res = await (0, gateway_auth_1.gatewayFetch)(config, \"/table/batch-get-row\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ primaryKeys }),\n timeoutMs: QUERY_TIMEOUT\n });\n if (!res.ok) {\n if (res.status === 401 || res.status === 403) {\n console.error(`[tagCache] batch-get-row rejected (${res.status})`);\n } else {\n console.warn(`[tagCache] batch-get-row failed: status=${res.status}`);\n }\n return [];\n }\n const data = await res.json();\n console.log(`[tagCache] batch-get-row ok: tags=${tags.length} rows=${(_b = (_a = data.rows) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0}`);\n if (!data.rows)\n return [];\n return data.rows.map((row) => {\n var _a2;\n const result = {};\n for (const col of (_a2 = row.columns) !== null && _a2 !== void 0 ? _a2 : []) {\n if (col.name === \"revalidatedAt\" && typeof col.value === \"number\") {\n result.revalidatedAt = col.value;\n } else if (col.name === \"stale\" && typeof col.value === \"number\") {\n result.stale = col.value;\n } else if (col.name === \"expire\" && typeof col.value === \"number\") {\n result.expire = col.value;\n }\n }\n return result;\n });\n }\n async batchWrite(config, rows) {\n if (rows.length === 0)\n return;\n for (let i = 0; i < rows.length; i += BATCH_SIZE) {\n const batch = rows.slice(i, i + BATCH_SIZE);\n try {\n const res = await (0, gateway_auth_1.gatewayFetch)(config, \"/table/batch-write\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ rows: batch }),\n timeoutMs: WRITE_TIMEOUT\n });\n if (res.status === 401 || res.status === 403) {\n console.error(`[tagCache] batch-write rejected (${res.status})`);\n return;\n }\n if (!res.ok) {\n console.warn(`[tagCache] batch-write failed: status=${res.status}`);\n } else {\n console.log(`[tagCache] batch-write ok: rows=${batch.length}`);\n }\n } catch (err) {\n if (err.name === \"AbortError\") {\n console.warn(`[tagCache] batch-write timeout (${WRITE_TIMEOUT}ms)`);\n } else {\n console.warn(`[tagCache] batch-write error: ${err.message}`);\n }\n }\n }\n }\n};\nexports.default = GatewayTagCache;\n",
|
|
7
7
|
};
|
package/dist/_protocol/types.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIENhY2hlTW9kZSA9ICdsb2NhbCcgfCAnY2VudHJhbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSldUUGF5bG9hZCB7XG4gIHVpZDogc3RyaW5nO1xuICBhcHA6IHN0cmluZztcbiAgYnVpbGRJZDogc3RyaW5nO1xuICBpYXQ/OiBudW1iZXI7XG4gIGV4cD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZW5hbnRDb250ZXh0IHtcbiAgdWlkOiBzdHJpbmc7XG4gIGFwcDogc3RyaW5nO1xuICBidWlsZElkOiBzdHJpbmc7XG4gIC8qKiBgJHt1aWR9LyR7YXBwfWAgKi9cbiAgYXBwSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTVFNUb2tlblJlc3BvbnNlIHtcbiAgYWNjZXNzS2V5SWQ6IHN0cmluZztcbiAgYWNjZXNzS2V5U2VjcmV0OiBzdHJpbmc7XG4gIHNlY3VyaXR5VG9rZW46IHN0cmluZztcbiAgZXhwaXJhdGlvbjogc3RyaW5nO1xuICBidWNrZXQ6IHN0cmluZztcbiAgLyoqIFwie3VpZH0ve2FwcH0vXCIgKi9cbiAgcHJlZml4OiBzdHJpbmc7XG4gIHJlZ2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlU3RvcmVQcmltYXJ5S2V5IHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlU3RvcmVDb2x1bW4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBCdWZmZXI7XG4gIHRpbWVzdGFtcD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZVN0b3JlUm93IHtcbiAgcHJpbWFyeUtleTogVGFibGVTdG9yZVByaW1hcnlLZXlbXTtcbiAgY29sdW1ucz86IFRhYmxlU3RvcmVDb2x1bW5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRSb3dSZXF1ZXN0IHtcbiAgcHJpbWFyeUtleTogVGFibGVTdG9yZVByaW1hcnlLZXlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdXRSb3dSZXF1ZXN0IHtcbiAgcHJpbWFyeUtleTogVGFibGVTdG9yZVByaW1hcnlLZXlbXTtcbiAgY29sdW1uczogVGFibGVTdG9yZUNvbHVtbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZVJvd1JlcXVlc3Qge1xuICBwcmltYXJ5S2V5OiBUYWJsZVN0b3JlUHJpbWFyeUtleVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFJhbmdlUmVxdWVzdCB7XG4gIHN0YXJ0UHJpbWFyeUtleTogVGFibGVTdG9yZVByaW1hcnlLZXlbXTtcbiAgZW5kUHJpbWFyeUtleTogVGFibGVTdG9yZVByaW1hcnlLZXlbXTtcbiAgbGltaXQ/
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB0eXBlIENhY2hlTW9kZSA9ICdsb2NhbCcgfCAnY2VudHJhbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSldUUGF5bG9hZCB7XG4gIHVpZDogc3RyaW5nO1xuICBhcHA6IHN0cmluZztcbiAgYnVpbGRJZDogc3RyaW5nO1xuICBpYXQ/OiBudW1iZXI7XG4gIGV4cD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZW5hbnRDb250ZXh0IHtcbiAgdWlkOiBzdHJpbmc7XG4gIGFwcDogc3RyaW5nO1xuICBidWlsZElkOiBzdHJpbmc7XG4gIC8qKiBgJHt1aWR9LyR7YXBwfWAgKi9cbiAgYXBwSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTVFNUb2tlblJlc3BvbnNlIHtcbiAgYWNjZXNzS2V5SWQ6IHN0cmluZztcbiAgYWNjZXNzS2V5U2VjcmV0OiBzdHJpbmc7XG4gIHNlY3VyaXR5VG9rZW46IHN0cmluZztcbiAgZXhwaXJhdGlvbjogc3RyaW5nO1xuICBidWNrZXQ6IHN0cmluZztcbiAgLyoqIFwie3VpZH0ve2FwcH0vXCIgKi9cbiAgcHJlZml4OiBzdHJpbmc7XG4gIHJlZ2lvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlU3RvcmVQcmltYXJ5S2V5IHtcbiAgbmFtZTogc3RyaW5nO1xuICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlU3RvcmVDb2x1bW4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBCdWZmZXI7XG4gIHRpbWVzdGFtcD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZVN0b3JlUm93IHtcbiAgcHJpbWFyeUtleTogVGFibGVTdG9yZVByaW1hcnlLZXlbXTtcbiAgY29sdW1ucz86IFRhYmxlU3RvcmVDb2x1bW5bXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRSb3dSZXF1ZXN0IHtcbiAgcHJpbWFyeUtleTogVGFibGVTdG9yZVByaW1hcnlLZXlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdXRSb3dSZXF1ZXN0IHtcbiAgcHJpbWFyeUtleTogVGFibGVTdG9yZVByaW1hcnlLZXlbXTtcbiAgY29sdW1uczogVGFibGVTdG9yZUNvbHVtbltdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZVJvd1JlcXVlc3Qge1xuICBwcmltYXJ5S2V5OiBUYWJsZVN0b3JlUHJpbWFyeUtleVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFJhbmdlUmVxdWVzdCB7XG4gIHN0YXJ0UHJpbWFyeUtleTogVGFibGVTdG9yZVByaW1hcnlLZXlbXTtcbiAgZW5kUHJpbWFyeUtleTogVGFibGVTdG9yZVByaW1hcnlLZXlbXTtcbiAgbGltaXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0UmFuZ2VSZXNwb25zZSB7XG4gIHJvd3M6IFRhYmxlU3RvcmVSb3dbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYXRjaFdyaXRlUmVxdWVzdCB7XG4gIHJvd3M6IFB1dFJvd1JlcXVlc3RbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWNoZVJlZnJlc2hSZXF1ZXN0IHtcbiAgaG9zdG5hbWU6IHN0cmluZztcbiAgc2l0ZUlkOiBzdHJpbmcgfCBudW1iZXI7XG4gIHVybHM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlUmVmcmVzaFJlc3BvbnNlIHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgaG9zdG5hbWU6IHN0cmluZztcbiAgc2l0ZUlkPzogc3RyaW5nIHwgbnVtYmVyO1xuICB0YXNrSWQ/OiBzdHJpbmc7XG4gIHB1cmdlZFVybENvdW50OiBudW1iZXI7XG4gIGJhY2tlbmQ6ICdpbm5lci1hcGknIHwgJ2ludGVybmFsLWFwaSc7XG4gIGFwaVJlcXVlc3RJZD86IHN0cmluZztcbiAgbm90ZT86IHN0cmluZztcbn1cbiJdfQ==
|
|
@@ -20,6 +20,7 @@ const http = require("http");
|
|
|
20
20
|
const fs = require("fs");
|
|
21
21
|
const path = require("path");
|
|
22
22
|
const image_proxy_1 = require("../../runtime/image-proxy");
|
|
23
|
+
const edge_context_1 = require("../../runtime/edge-context");
|
|
23
24
|
// === 静态资源 MIME(与原 pcg serve 父进程实现保持一致) ===
|
|
24
25
|
const MIME_TYPES = {
|
|
25
26
|
'.js': 'application/javascript',
|
|
@@ -184,7 +185,10 @@ function bridgeOpenNextHandler(handler) {
|
|
|
184
185
|
},
|
|
185
186
|
abortSignal: abortController.signal,
|
|
186
187
|
};
|
|
187
|
-
|
|
188
|
+
// 进入 OpenNext handler 前把请求头 (host / x-alicdn-site-id) 注入
|
|
189
|
+
// AsyncLocalStorage,下游 cdn-purge 即使 fire-and-forget 也能拿到本次
|
|
190
|
+
// 请求的 hostname / siteId(promise 链继承当前 store)。
|
|
191
|
+
await (0, edge_context_1.runWithEdgeContext)(headers, () => handler(event, { streamCreator }));
|
|
188
192
|
}
|
|
189
193
|
catch (err) {
|
|
190
194
|
if (!res.headersSent) {
|
|
@@ -281,4 +285,4 @@ const wrapperDef = {
|
|
|
281
285
|
supportStreaming: true,
|
|
282
286
|
};
|
|
283
287
|
exports.default = wrapperDef;
|
|
284
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvd3JhcHBlcnMvbm9kZS1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7QUFFSCw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwyREFBNkQ7QUErQjdELDRDQUE0QztBQUU1QyxNQUFNLFVBQVUsR0FBMkI7SUFDekMsS0FBSyxFQUFFLHdCQUF3QjtJQUMvQixNQUFNLEVBQUUsd0JBQXdCO0lBQ2hDLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLE9BQU8sRUFBRSxXQUFXO0lBQ3BCLE9BQU8sRUFBRSxrQkFBa0I7SUFDM0IsTUFBTSxFQUFFLFdBQVc7SUFDbkIsTUFBTSxFQUFFLFlBQVk7SUFDcEIsT0FBTyxFQUFFLFlBQVk7SUFDckIsTUFBTSxFQUFFLFdBQVc7SUFDbkIsTUFBTSxFQUFFLGVBQWU7SUFDdkIsTUFBTSxFQUFFLGNBQWM7SUFDdEIsT0FBTyxFQUFFLFdBQVc7SUFDcEIsUUFBUSxFQUFFLFlBQVk7SUFDdEIsTUFBTSxFQUFFLFVBQVU7SUFDbEIsTUFBTSxFQUFFLGtCQUFrQjtJQUMxQixNQUFNLEVBQUUsWUFBWTtJQUNwQixPQUFPLEVBQUUsWUFBWTtDQUN0QixDQUFDO0FBRUYsa0NBQWtDO0FBRWxDLFNBQVMsVUFBVSxDQUFDLEdBQVc7SUFDN0IsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QixJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMxQixNQUFNLE1BQU0sR0FBc0MsRUFBRSxDQUFDO0lBQ3JELE1BQU0sWUFBWSxHQUFHLElBQUksZUFBZSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsS0FBSyxN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O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBRztJQUNqQixPQUFPO0lBQ1AsSUFBSSxFQUFFLFVBQVU7SUFDaEIsZ0JBQWdCLEVBQUUsSUFBSTtDQUN2QixDQUFDO0FBRUYsa0JBQWUsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwY2cgTm9kZSBTZXJ2ZXIgV3JhcHBlclxuICpcbiAqIE9wZW5OZXh0IHdyYXBwZXIg55qE6ZW/6L+b56iL5b2i5oCBOuS4jeS+nei1liBGYWFTIHJ1bnRpbWUs6Ieq5bimIEhUVFAgc2VydmVyIOebtOaOpeebkeWQrFxuICogYHByb2Nlc3MuZW52LlBPUlRgKOm7mOiupCAzMDAwKSxgbm9kZSBpbmRleC5tanNgIOWNs+WPr+eLrOeri+i/kOihjOOAglxuICpcbiAqIOWNleS4quivt+axguS8muaMieS7peS4i+mhuuW6j+WIhuWPkTpcbiAqICAgMS4gYC9fX2hlYWx0aGAgICAgICAgICAgICAgICAgICDihpIgMjAwIE9LKOS+myBwY2cgc2VydmUgLyDlrrnlmajlsLHnu6rmjqLpkogpXG4gKiAgIDIuIGAvX25leHQvaW1hZ2VgICAgICAgICAgICAgICDihpIgaW1hZ2UtcHJveHko562+5ZCNIGNsaWVudCDosIMgR2F0ZXdheSlcbiAqICAgMy4gYC5vcGVuLW5leHQvYXNzZXRzLzx1cmxQYXRoPmAg5ZG95LitIOKGkiDnm7TmjqUgcGlwZSDmlofku7bmtYFcbiAqICAgNC4g5YW25LuWICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgT3Blbk5leHQgaGFuZGxlcihOZXh0IFNTUi9BUEkvUlNDKVxuICpcbiAqIOS4ieautemAu+i+keatpOWJjeWIhuaVo+WcqCBwbGF0Zm9ybS1mdW5jdGlvbiB3cmFwcGVyKGltYWdlIHByb3h5ICsgcmVx4oaSZXZlbnQg5qGl5o6lKVxuICog5LiOIGBwY2cgc2VydmVgIOeItui/m+eoiyjpnZnmgIHotYTmupAgKyByZXZlcnNlIHByb3h5KeS4rTvmraTmrKHnu5/kuIDov5sgd3JhcHBlcixcbiAqIOiuqSBgcGNnIHNlcnZlYCDpgIDljJbkuLrnuq/lrZDov5vnqIvnrqHnkIblmajjgIJcbiAqL1xuXG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGhhbmRsZUltYWdlUHJveHkgfSBmcm9tICcuLi8uLi9ydW50aW1lL2ltYWdlLXByb3h5JztcblxuLy8gPT09IE9wZW5OZXh0IOaOpeWPo+exu+WeiyjlhoXogZTpgb/lhY3noazkvp3otZYgQG9wZW5uZXh0anMvYXdzKSA9PT1cblxuaW50ZXJmYWNlIEludGVybmFsRXZlbnQge1xuICB0eXBlOiAnY29yZSc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICByYXdQYXRoOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBib2R5Pzogc3RyaW5nO1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+O1xuICBjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICByZW1vdGVBZGRyZXNzOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTdHJlYW1DcmVhdG9yIHtcbiAgd3JpdGVIZWFkZXJzKHByZWx1ZGU6IHtcbiAgICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gICAgY29va2llczogc3RyaW5nW107XG4gICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSk6IGltcG9ydCgnc3RyZWFtJykuV3JpdGFibGU7XG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIG9uRmluaXNoPzogKCkgPT4gdm9pZDtcbn1cblxudHlwZSBPcGVuTmV4dEhhbmRsZXIgPSAoXG4gIGV2ZW50OiBJbnRlcm5hbEV2ZW50LFxuICBjdHg6IHsgc3RyZWFtQ3JlYXRvcjogU3RyZWFtQ3JlYXRvciB9XG4pID0+IFByb21pc2U8dm9pZD47XG5cbi8vID09PSDpnZnmgIHotYTmupAgTUlNRSjkuI7ljp8gcGNnIHNlcnZlIOeItui/m+eoi+WunueOsOS/neaMgeS4gOiHtCkgPT09XG5cbmNvbnN0IE1JTUVfVFlQRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICcuanMnOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsXG4gICcubWpzJzogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLFxuICAnLmNzcyc6ICd0ZXh0L2NzcycsXG4gICcuaHRtbCc6ICd0ZXh0L2h0bWwnLFxuICAnLmpzb24nOiAnYXBwbGljYXRpb24vanNvbicsXG4gICcucG5nJzogJ2ltYWdlL3BuZycsXG4gICcuanBnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmpwZWcnOiAnaW1hZ2UvanBlZycsXG4gICcuZ2lmJzogJ2ltYWdlL2dpZicsXG4gICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnLFxuICAnLmljbyc6ICdpbWFnZS94LWljb24nLFxuICAnLndvZmYnOiAnZm9udC93b2ZmJyxcbiAgJy53b2ZmMic6ICdmb250L3dvZmYyJyxcbiAgJy50dGYnOiAnZm9udC90dGYnLFxuICAnLm1hcCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgJy50eHQnOiAndGV4dC9wbGFpbicsXG4gICcud2VicCc6ICdpbWFnZS93ZWJwJyxcbn07XG5cbi8vID09PSDor7fmsYIg4oaSIEludGVybmFsRXZlbnQg5qGl5o6l5bel5YW3ID09PVxuXG5mdW5jdGlvbiBwYXJzZVF1ZXJ5KHVybDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgY29uc3QgaWR4ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgaWYgKGlkeCA9PT0gLTEpIHJldHVybiB7fTtcbiAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4gPSB7fTtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2xpY2UoaWR4ICsgMSkpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzZWFyY2hQYXJhbXMpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHBhcmFtc1trZXldO1xuICAgIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgIGV4aXN0aW5nLnB1c2godmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXNba2V5XSA9IFtleGlzdGluZywgdmFsdWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFyYW1zO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNvb2tpZXMoXG4gIGNvb2tpZUhlYWRlcjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKCFjb29raWVIZWFkZXIpIHJldHVybiB7fTtcbiAgY29uc3QgY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IHBhaXIgb2YgY29va2llSGVhZGVyLnNwbGl0KCc7JykpIHtcbiAgICBjb25zdCBlcUlkeCA9IHBhaXIuaW5kZXhPZignPScpO1xuICAgIGlmIChlcUlkeCA9PT0gLTEpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG5hbWUgPSBwYWlyLnNsaWNlKDAsIGVxSWR4KS50cmltKCk7XG4gICAgY29uc3QgdmFsdWUgPSBwYWlyLnNsaWNlKGVxSWR4ICsgMSkudHJpbSgpO1xuICAgIGlmIChuYW1lKSBjb29raWVzW25hbWVdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGNvb2tpZXM7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5IZWFkZXJzKFxuICByYXdIZWFkZXJzOiBodHRwLkluY29taW5nSHR0cEhlYWRlcnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJhd0hlYWRlcnMpKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWUuam9pbignLCAnKVxuICAgICAgOiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEJvZHkoXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2Vcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChyZXEubWV0aG9kID09PSAnR0VUJyB8fCByZXEubWV0aG9kID09PSAnSEVBRCcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgIHJlcS5vbignZGF0YScsIChjaHVuazogQnVmZmVyKSA9PiBjaHVua3MucHVzaChjaHVuaykpO1xuICAgIHJlcS5vbignZW5kJywgKCkgPT4gcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoJ3V0Zi04JykpKTtcbiAgICByZXEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSk7XG59XG5cbi8vID09PSDpnZnmgIHotYTmupAgPT09XG5cbi8qKlxuICog5pyN5YqhIC5vcGVuLW5leHQvYXNzZXRzLyDkuIvnmoTpnZnmgIHmlofku7bjgIJcbiAqXG4gKiDljLnphY3kuKTnsbs6XG4gKiAgIDEuIGAvX25leHQvc3RhdGljLypgIOKAlOKAlCBOZXh0LmpzIOeUn+aIkOeahOW4piBoYXNoIOi1hOa6kCzplb/nvJPlrZggaW1tdXRhYmxlXG4gKiAgIDIuIGAvPHB1YmxpYy1maWxlPmAg4oCU4oCUIGBwdWJsaWMvYCDmj5Dlj5blh7rmnaXnmoTmoLnnuqfpnZnmgIHmlofku7Ys55+t57yT5a2YXG4gKlxuICog5LiN5a2Y5Zyo55qE6Lev5b6E6L+U5ZueIGZhbHNlIOiuqeS4iuWxgiBmYWxsYmFjayDliLAgT3Blbk5leHQgaGFuZGxlcihBUEkgLyBTU1IgL1xuICogYF9wY2cvKmAg562JKeOAglxuICovXG5mdW5jdGlvbiBzZXJ2ZVN0YXRpY0ZpbGUoXG4gIGFzc2V0c0Rpcjogc3RyaW5nLFxuICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2Vcbik6IGJvb2xlYW4ge1xuICBjb25zdCB1cmxQYXRoID0gcmVxLnVybD8uc3BsaXQoJz8nKVswXSA/PyAnLyc7XG4gIGlmICh1cmxQYXRoID09PSAnLycgfHwgIXVybFBhdGguc3RhcnRzV2l0aCgnLycpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXNzZXRzRGlyLCB1cmxQYXRoKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG4gIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChhc3NldHNEaXIpKSB7XG4gICAgcmVzLndyaXRlSGVhZCg0MDMpO1xuICAgIHJlcy5lbmQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCBzdGF0OiBmcy5TdGF0cztcbiAgdHJ5IHtcbiAgICBzdGF0ID0gZnMuc3RhdFN5bmMobm9ybWFsaXplZFBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCFzdGF0LmlzRmlsZSgpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKG5vcm1hbGl6ZWRQYXRoKTtcbiAgY29uc3QgY29udGVudFR5cGUgPSBNSU1FX1RZUEVTW2V4dF0gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gIGNvbnN0IGlzSGFzaGVkQXNzZXQgPSB1cmxQYXRoLnN0YXJ0c1dpdGgoJy9fbmV4dC9zdGF0aWMvJyk7XG5cbiAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAnQ29udGVudC1UeXBlJzogY29udGVudFR5cGUsXG4gICAgJ0NvbnRlbnQtTGVuZ3RoJzogc3RhdC5zaXplLFxuICAgICdDYWNoZS1Db250cm9sJzogaXNIYXNoZWRBc3NldFxuICAgICAgPyAncHVibGljLCBtYXgtYWdlPTMxNTM2MDAwLCBpbW11dGFibGUnXG4gICAgICA6ICdwdWJsaWMsIG1heC1hZ2U9NjAnLFxuICB9KTtcbiAgZnMuY3JlYXRlUmVhZFN0cmVhbShub3JtYWxpemVkUGF0aCkucGlwZShyZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiDmioogT3Blbk5leHQg5o+Q5L6b55qEIGhhbmRsZXIg5YyF5oiQIGh0dHAgKHJlcSwgcmVzKSDlpITnkIblh73mlbDjgIJcbiAqIOi0n+i0ozogYm9keSDor7vlj5bjgIFldmVudCDnu4Too4XjgIHmtYHlvI/lk43lupTjgIE1MDAg5YWc5bqV44CCXG4gKi9cbmZ1bmN0aW9uIGJyaWRnZU9wZW5OZXh0SGFuZGxlcihoYW5kbGVyOiBPcGVuTmV4dEhhbmRsZXIpIHtcbiAgcmV0dXJuIGFzeW5jIChcbiAgICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3VXJsID0gcmVxLnVybCB8fCAnLyc7XG4gICAgICBjb25zdCBoZWFkZXJzID0gZmxhdHRlbkhlYWRlcnMocmVxLmhlYWRlcnMpO1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlYWRCb2R5KHJlcSk7XG5cbiAgICAgIC8vIE9wZW5OZXh0IOWGhemDqOWvuSBldmVudC51cmwg5omn6KGMIGBuZXcgVVJMKC4uLilgLOW/hemhu+aYr+e7neWvuSBVUkwg4oCU4oCUIOeUqFxuICAgICAgLy8gaG9zdCBoZWFkZXIgKyB4LWZvcndhcmRlZC1wcm90byDov5jljp8s6KGM5Li65LiOIE9wZW5OZXh0IOWGhee9riBub2RlXG4gICAgICAvLyBjb252ZXJ0ZXIg5LiA6Ie0IChAb3Blbm5leHRqcy9hd3MvZGlzdC9vdmVycmlkZXMvY29udmVydGVycy9ub2RlLmpzKeOAglxuICAgICAgY29uc3QgaG9zdCA9IGhlYWRlcnNbJ2hvc3QnXSB8fCBgbG9jYWxob3N0OiR7cHJvY2Vzcy5lbnYuUE9SVCA/PyAnMzAwMCd9YDtcbiAgICAgIGNvbnN0IHByb3RvID0gaGVhZGVyc1sneC1mb3J3YXJkZWQtcHJvdG8nXT8uc3BsaXQoJywnKVswXT8udHJpbSgpIHx8ICdodHRwJztcbiAgICAgIGNvbnN0IGFic29sdXRlVXJsID0gbmV3IFVSTChgJHtwcm90b306Ly8ke2hvc3R9JHtyYXdVcmx9YCk7XG5cbiAgICAgIGNvbnN0IGV2ZW50OiBJbnRlcm5hbEV2ZW50ID0ge1xuICAgICAgICB0eXBlOiAnY29yZScsXG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCB8fCAnR0VUJyxcbiAgICAgICAgcmF3UGF0aDogYWJzb2x1dGVVcmwucGF0aG5hbWUsXG4gICAgICAgIHVybDogYWJzb2x1dGVVcmwuaHJlZixcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcXVlcnk6IHBhcnNlUXVlcnkocmF3VXJsKSxcbiAgICAgICAgY29va2llczogcGFyc2VDb29raWVzKGhlYWRlcnNbJ2Nvb2tpZSddKSxcbiAgICAgICAgcmVtb3RlQWRkcmVzczpcbiAgICAgICAgICBoZWFkZXJzWyd4LWZvcndhcmRlZC1mb3InXT8uc3BsaXQoJywnKVswXT8udHJpbSgpIHx8XG4gICAgICAgICAgaGVhZGVyc1sneC1yZWFsLWlwJ10gfHxcbiAgICAgICAgICByZXEuc29ja2V0Py5yZW1vdGVBZGRyZXNzIHx8XG4gICAgICAgICAgJzEyNy4wLjAuMScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICByZXMub24oJ2Nsb3NlJywgKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCkpO1xuXG4gICAgICBjb25zdCBzdHJlYW1DcmVhdG9yOiBTdHJlYW1DcmVhdG9yID0ge1xuICAgICAgICB3cml0ZUhlYWRlcnMocHJlbHVkZSkge1xuICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ1NldC1Db29raWUnLCBwcmVsdWRlLmNvb2tpZXMpO1xuICAgICAgICAgIHJlcy53cml0ZUhlYWQocHJlbHVkZS5zdGF0dXNDb2RlLCBwcmVsdWRlLmhlYWRlcnMpO1xuICAgICAgICAgIHJlcy5mbHVzaEhlYWRlcnMoKTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IGhhbmRsZXIoZXZlbnQsIHsgc3RyZWFtQ3JlYXRvciB9KTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgY29uc3QgaXNEZXYgPSBwcm9jZXNzLmVudi5OT0RFX0VOViAhPT0gJ3Byb2R1Y3Rpb24nO1xuICAgICAgICByZXMud3JpdGVIZWFkKDUwMCwgeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgICAgICByZXMuZW5kKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgIGVycm9yOiAnSW50ZXJuYWwgU2VydmVyIEVycm9yJyxcbiAgICAgICAgICAgIC4uLihpc0RldiAmJiB7IG1lc3NhZ2U6IGVyci5tZXNzYWdlLCBzdGFjazogZXJyLnN0YWNrIH0pLFxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgICByZXMuZW5kKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIE9wZW5OZXh0IOWcqOWKoOi9veWujCBzZXJ2ZXIgYnVuZGxlIOWQjuiwg+eUqOatpOWHveaVsCzmiJHku6zlnKjmraTlkK/liqggSFRUUCBzZXJ2ZXLjgIJcbiAqXG4gKiBhc3NldHMg55uu5b2V6Kej5p6Q5Li6IGA8Y3dkPi8uLi8uLi9hc3NldHNgOk9wZW5OZXh0IOm7mOiupOS6p+eJqee7k+aehOaYr1xuICogYC5vcGVuLW5leHQvc2VydmVyLWZ1bmN0aW9ucy9kZWZhdWx0L2luZGV4Lm1qc2As6L+Q6KGM5pe25peg6K665piv55So5oi35omL5YqoXG4gKiBgY2RgIOWQjiBgbm9kZSBpbmRleC5tanNgIOi/mOaYryBgcGNnIHNlcnZlYCBzcGF3bihgY3dkOiBzZXJ2ZXJEaXJgKSxcbiAqIGBwcm9jZXNzLmN3ZCgpYCDpg73nrYnkuo4gYHNlcnZlci1mdW5jdGlvbnMvZGVmYXVsdC9gLGFzc2V0cyDlv4XlnKggYC4uLy4uL2Fzc2V0cy9g44CCXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHdyYXBwZXIoaGFuZGxlcjogT3Blbk5leHRIYW5kbGVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBvcnQgPSBwYXJzZUludChwcm9jZXNzLmVudi5QT1JUID8/ICczMDAwJywgMTApO1xuICBjb25zdCBhc3NldHNEaXIgPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy4uJywgJy4uJywgJ2Fzc2V0cycpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoYXNzZXRzRGlyKSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBbcGNnLW5vZGVdIGFzc2V0cyBkaXJlY3Rvcnkgbm90IGZvdW5kIGF0ICR7YXNzZXRzRGlyfSDigJQgc3RhdGljIGZpbGUgcmVxdWVzdHMgd2lsbCBmYWxsIHRocm91Z2ggdG8gTmV4dCBoYW5kbGVyYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBkaXNwYXRjaFRvTmV4dCA9IGJyaWRnZU9wZW5OZXh0SGFuZGxlcihoYW5kbGVyKTtcblxuICBjb25zdCBzZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcihhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICBjb25zdCB1cmxQYXRoID0gcmVxLnVybD8uc3BsaXQoJz8nKVswXSA/PyAnLyc7XG5cbiAgICAvLyAxLiBoZWFsdGggY2hlY2tcbiAgICBpZiAodXJsUGF0aCA9PT0gJy9fX2hlYWx0aCcpIHtcbiAgICAgIHJlcy53cml0ZUhlYWQoMjAwLCB7ICdDb250ZW50LVR5cGUnOiAndGV4dC9wbGFpbicgfSk7XG4gICAgICByZXMuZW5kKCdPSycpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIDIuIOWbvueJh+S8mOWMluS7o+eQhiDigJTigJQg5oum5oiqIE5leHQg6buY6K6k55qEIC9fbmV4dC9pbWFnZT91cmw9Li4uLHNlcnZlciDkvqfku6Plj5FcbiAgICAvLyAgICDnrb7lkI3or7fmsYLliLAgR2F0ZXdheeOAgui/meagt+eUqOaItyBuZXh0LmNvbmZpZyDkuI3pnIDopoHphY0gY3VzdG9tIGxvYWRlcixcbiAgICAvLyAgICA8SW1hZ2U+IOi1sCBOZXh0IOWGhee9riBVUkwg55Sf5oiQ6YC76L6R5Y2z5Y+v44CCXG4gICAgaWYgKHVybFBhdGggPT09ICcvX25leHQvaW1hZ2UnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBoYW5kbGVJbWFnZVByb3h5KHJlcSwgcmVzKTtcbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1twY2ctbm9kZV0gaW1hZ2UtcHJveHkgZXJyb3I6JywgZXJyKTtcbiAgICAgICAgaWYgKCFyZXMuaGVhZGVyc1NlbnQpIHtcbiAgICAgICAgICByZXMud3JpdGVIZWFkKDUwMCwgeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0pO1xuICAgICAgICAgIHJlcy5lbmQoSlNPTi5zdHJpbmdpZnkoeyBlcnJvcjogJ0ltYWdlIHByb3h5IGZhaWxlZCcgfSkpO1xuICAgICAgICB9IGVsc2UgaWYgKCFyZXMud3JpdGFibGVFbmRlZCkge1xuICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIDMuIOmdmeaAgei1hOa6kCgub3Blbi1uZXh0L2Fzc2V0cy8pXG4gICAgaWYgKHNlcnZlU3RhdGljRmlsZShhc3NldHNEaXIsIHJlcSwgcmVzKSkgcmV0dXJuO1xuXG4gICAgLy8gNC4gZmFsbGJhY2sg4oCU4oCUIE9wZW5OZXh0IE5leHQuanMgaGFuZGxlclxuICAgIGF3YWl0IGRpc3BhdGNoVG9OZXh0KHJlcSwgcmVzKTtcbiAgfSk7XG5cbiAgLy8g5LyY6ZuF5YWz6ZetOuWBnOatouaOpeaUtuaWsOi/nuaOpSznrYkgaW4tZmxpZ2h0IOivt+axguiHqueEtue7k+adnyw1cyDlhZzlupXlvLrliLbpgIDlh7pcbiAgbGV0IHNodXR0aW5nRG93biA9IGZhbHNlO1xuICBjb25zdCBzaHV0ZG93biA9IChzaWduYWw6IHN0cmluZyk6IHZvaWQgPT4ge1xuICAgIGlmIChzaHV0dGluZ0Rvd24pIHJldHVybjtcbiAgICBzaHV0dGluZ0Rvd24gPSB0cnVlO1xuICAgIGNvbnNvbGUubG9nKGBbcGNnLW5vZGVdICR7c2lnbmFsfSByZWNlaXZlZCwgc2h1dHRpbmcgZG93bi4uLmApO1xuICAgIHNlcnZlci5jbG9zZSgoKSA9PiBwcm9jZXNzLmV4aXQoMCkpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4gcHJvY2Vzcy5leGl0KDApLCA1MDAwKS51bnJlZigpO1xuICB9O1xuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiBzaHV0ZG93bignU0lHSU5UJykpO1xuICBwcm9jZXNzLm9uKCdTSUdURVJNJywgKCkgPT4gc2h1dGRvd24oJ1NJR1RFUk0nKSk7XG5cbiAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgc2VydmVyLmxpc3Rlbihwb3J0LCAoKSA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhgW3BjZy1ub2RlXSBMaXN0ZW5pbmcgb24gcG9ydCAke3BvcnR9YCk7XG4gICAgICBjb25zb2xlLmxvZyhgW3BjZy1ub2RlXSAgIGFzc2V0czogICR7YXNzZXRzRGlyfWApO1xuICAgICAgY29uc29sZS5sb2coYFtwY2ctbm9kZV0gICByb3V0ZXM6ICAvX19oZWFsdGgsIC9fbmV4dC9pbWFnZSwgL19uZXh0L3N0YXRpYy8qLCA8bmV4dD5gKTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogT3Blbk5leHQg6buY6K6k5a+85Ye65aWR57qmOmB7IHdyYXBwZXIsIG5hbWUsIHN1cHBvcnRTdHJlYW1pbmcgfWDjgIJcbiAqL1xuY29uc3Qgd3JhcHBlckRlZiA9IHtcbiAgd3JhcHBlcixcbiAgbmFtZTogJ3BjZy1ub2RlJyxcbiAgc3VwcG9ydFN0cmVhbWluZzogdHJ1ZSxcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHdyYXBwZXJEZWY7XG4iXX0=
|
|
288
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvYWRhcHRlcnMvd3JhcHBlcnMvbm9kZS1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7QUFFSCw2QkFBNkI7QUFDN0IseUJBQXlCO0FBQ3pCLDZCQUE2QjtBQUM3QiwyREFBNkQ7QUFDN0QsNkRBQWdFO0FBK0JoRSw0Q0FBNEM7QUFFNUMsTUFBTSxVQUFVLEdBQTJCO0lBQ3pDLEtBQUssRUFBRSx3QkFBd0I7SUFDL0IsTUFBTSxFQUFFLHdCQUF3QjtJQUNoQyxNQUFNLEVBQUUsVUFBVTtJQUNsQixPQUFPLEVBQUUsV0FBVztJQUNwQixPQUFPLEVBQUUsa0JBQWtCO0lBQzNCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLE1BQU0sRUFBRSxZQUFZO0lBQ3BCLE9BQU8sRUFBRSxZQUFZO0lBQ3JCLE1BQU0sRUFBRSxXQUFXO0lBQ25CLE1BQU0sRUFBRSxlQUFlO0lBQ3ZCLE1BQU0sRUFBRSxjQUFjO0lBQ3RCLE9BQU8sRUFBRSxXQUFXO0lBQ3BCLFFBQVEsRUFBRSxZQUFZO0lBQ3RCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLE1BQU0sRUFBRSxrQkFBa0I7SUFDMUIsTUFBTSxFQUFFLFlBQVk7SUFDcEIsT0FBTyxFQUFFLFlBQVk7Q0FDdEIsQ0FBQztBQUVGLGtDQUFrQztBQUVsQyxTQUFTLFVBQVUsQ0FBQyxHQUFXO0lBQzdCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQUUsT0FBTyxFQUFFLENBQUM7SUFDMUIsTUFBTSxNQUFNLEdBQXNDLEVBQUUsQ0FBQztJQUNyRCxNQUFNLFlBQVksR0FBRyxJQUFJLGVBQWUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFD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LENBQUMsd0VBQXdFLENBQUMsQ0FBQztZQUN0RixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsR0FBRztJQUNqQixPQUFPO0lBQ1AsSUFBSSxFQUFFLFVBQVU7SUFDaEIsZ0JBQWdCLEVBQUUsSUFBSTtDQUN2QixDQUFDO0FBRUYsa0JBQWUsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBwY2cgTm9kZSBTZXJ2ZXIgV3JhcHBlclxuICpcbiAqIE9wZW5OZXh0IHdyYXBwZXIg55qE6ZW/6L+b56iL5b2i5oCBOuS4jeS+nei1liBGYWFTIHJ1bnRpbWUs6Ieq5bimIEhUVFAgc2VydmVyIOebtOaOpeebkeWQrFxuICogYHByb2Nlc3MuZW52LlBPUlRgKOm7mOiupCAzMDAwKSxgbm9kZSBpbmRleC5tanNgIOWNs+WPr+eLrOeri+i/kOihjOOAglxuICpcbiAqIOWNleS4quivt+axguS8muaMieS7peS4i+mhuuW6j+WIhuWPkTpcbiAqICAgMS4gYC9fX2hlYWx0aGAgICAgICAgICAgICAgICAgICDihpIgMjAwIE9LKOS+myBwY2cgc2VydmUgLyDlrrnlmajlsLHnu6rmjqLpkogpXG4gKiAgIDIuIGAvX25leHQvaW1hZ2VgICAgICAgICAgICAgICDihpIgaW1hZ2UtcHJveHko562+5ZCNIGNsaWVudCDosIMgR2F0ZXdheSlcbiAqICAgMy4gYC5vcGVuLW5leHQvYXNzZXRzLzx1cmxQYXRoPmAg5ZG95LitIOKGkiDnm7TmjqUgcGlwZSDmlofku7bmtYFcbiAqICAgNC4g5YW25LuWICAgICAgICAgICAgICAgICAgICAgICAgICDihpIgT3Blbk5leHQgaGFuZGxlcihOZXh0IFNTUi9BUEkvUlNDKVxuICpcbiAqIOS4ieautemAu+i+keatpOWJjeWIhuaVo+WcqCBwbGF0Zm9ybS1mdW5jdGlvbiB3cmFwcGVyKGltYWdlIHByb3h5ICsgcmVx4oaSZXZlbnQg5qGl5o6lKVxuICog5LiOIGBwY2cgc2VydmVgIOeItui/m+eoiyjpnZnmgIHotYTmupAgKyByZXZlcnNlIHByb3h5KeS4rTvmraTmrKHnu5/kuIDov5sgd3JhcHBlcixcbiAqIOiuqSBgcGNnIHNlcnZlYCDpgIDljJbkuLrnuq/lrZDov5vnqIvnrqHnkIblmajjgIJcbiAqL1xuXG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IGhhbmRsZUltYWdlUHJveHkgfSBmcm9tICcuLi8uLi9ydW50aW1lL2ltYWdlLXByb3h5JztcbmltcG9ydCB7IHJ1bldpdGhFZGdlQ29udGV4dCB9IGZyb20gJy4uLy4uL3J1bnRpbWUvZWRnZS1jb250ZXh0JztcblxuLy8gPT09IE9wZW5OZXh0IOaOpeWPo+exu+WeiyjlhoXogZTpgb/lhY3noazkvp3otZYgQG9wZW5uZXh0anMvYXdzKSA9PT1cblxuaW50ZXJmYWNlIEludGVybmFsRXZlbnQge1xuICB0eXBlOiAnY29yZSc7XG4gIG1ldGhvZDogc3RyaW5nO1xuICByYXdQYXRoOiBzdHJpbmc7XG4gIHVybDogc3RyaW5nO1xuICBib2R5Pzogc3RyaW5nO1xuICBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICBxdWVyeTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+O1xuICBjb29raWVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICByZW1vdGVBZGRyZXNzOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTdHJlYW1DcmVhdG9yIHtcbiAgd3JpdGVIZWFkZXJzKHByZWx1ZGU6IHtcbiAgICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gICAgY29va2llczogc3RyaW5nW107XG4gICAgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfSk6IGltcG9ydCgnc3RyZWFtJykuV3JpdGFibGU7XG4gIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG4gIG9uRmluaXNoPzogKCkgPT4gdm9pZDtcbn1cblxudHlwZSBPcGVuTmV4dEhhbmRsZXIgPSAoXG4gIGV2ZW50OiBJbnRlcm5hbEV2ZW50LFxuICBjdHg6IHsgc3RyZWFtQ3JlYXRvcjogU3RyZWFtQ3JlYXRvciB9XG4pID0+IFByb21pc2U8dm9pZD47XG5cbi8vID09PSDpnZnmgIHotYTmupAgTUlNRSjkuI7ljp8gcGNnIHNlcnZlIOeItui/m+eoi+WunueOsOS/neaMgeS4gOiHtCkgPT09XG5cbmNvbnN0IE1JTUVfVFlQRVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICcuanMnOiAnYXBwbGljYXRpb24vamF2YXNjcmlwdCcsXG4gICcubWpzJzogJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnLFxuICAnLmNzcyc6ICd0ZXh0L2NzcycsXG4gICcuaHRtbCc6ICd0ZXh0L2h0bWwnLFxuICAnLmpzb24nOiAnYXBwbGljYXRpb24vanNvbicsXG4gICcucG5nJzogJ2ltYWdlL3BuZycsXG4gICcuanBnJzogJ2ltYWdlL2pwZWcnLFxuICAnLmpwZWcnOiAnaW1hZ2UvanBlZycsXG4gICcuZ2lmJzogJ2ltYWdlL2dpZicsXG4gICcuc3ZnJzogJ2ltYWdlL3N2Zyt4bWwnLFxuICAnLmljbyc6ICdpbWFnZS94LWljb24nLFxuICAnLndvZmYnOiAnZm9udC93b2ZmJyxcbiAgJy53b2ZmMic6ICdmb250L3dvZmYyJyxcbiAgJy50dGYnOiAnZm9udC90dGYnLFxuICAnLm1hcCc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgJy50eHQnOiAndGV4dC9wbGFpbicsXG4gICcud2VicCc6ICdpbWFnZS93ZWJwJyxcbn07XG5cbi8vID09PSDor7fmsYIg4oaSIEludGVybmFsRXZlbnQg5qGl5o6l5bel5YW3ID09PVxuXG5mdW5jdGlvbiBwYXJzZVF1ZXJ5KHVybDogc3RyaW5nKTogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgc3RyaW5nW10+IHtcbiAgY29uc3QgaWR4ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgaWYgKGlkeCA9PT0gLTEpIHJldHVybiB7fTtcbiAgY29uc3QgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBzdHJpbmdbXT4gPSB7fTtcbiAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh1cmwuc2xpY2UoaWR4ICsgMSkpO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBzZWFyY2hQYXJhbXMpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHBhcmFtc1trZXldO1xuICAgIGlmIChleGlzdGluZyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZykpIHtcbiAgICAgIGV4aXN0aW5nLnB1c2godmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJhbXNba2V5XSA9IFtleGlzdGluZywgdmFsdWVdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcGFyYW1zO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNvb2tpZXMoXG4gIGNvb2tpZUhlYWRlcjogc3RyaW5nIHwgdW5kZWZpbmVkXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgaWYgKCFjb29raWVIZWFkZXIpIHJldHVybiB7fTtcbiAgY29uc3QgY29va2llczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBmb3IgKGNvbnN0IHBhaXIgb2YgY29va2llSGVhZGVyLnNwbGl0KCc7JykpIHtcbiAgICBjb25zdCBlcUlkeCA9IHBhaXIuaW5kZXhPZignPScpO1xuICAgIGlmIChlcUlkeCA9PT0gLTEpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG5hbWUgPSBwYWlyLnNsaWNlKDAsIGVxSWR4KS50cmltKCk7XG4gICAgY29uc3QgdmFsdWUgPSBwYWlyLnNsaWNlKGVxSWR4ICsgMSkudHJpbSgpO1xuICAgIGlmIChuYW1lKSBjb29raWVzW25hbWVdID0gdmFsdWU7XG4gIH1cbiAgcmV0dXJuIGNvb2tpZXM7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5IZWFkZXJzKFxuICByYXdIZWFkZXJzOiBodHRwLkluY29taW5nSHR0cEhlYWRlcnNcbik6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHJhd0hlYWRlcnMpKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIGNvbnRpbnVlO1xuICAgIGhlYWRlcnNba2V5LnRvTG93ZXJDYXNlKCldID0gQXJyYXkuaXNBcnJheSh2YWx1ZSlcbiAgICAgID8gdmFsdWUuam9pbignLCAnKVxuICAgICAgOiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gaGVhZGVycztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVhZEJvZHkoXG4gIHJlcTogaHR0cC5JbmNvbWluZ01lc3NhZ2Vcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChyZXEubWV0aG9kID09PSAnR0VUJyB8fCByZXEubWV0aG9kID09PSAnSEVBRCcpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgY2h1bmtzOiBCdWZmZXJbXSA9IFtdO1xuICAgIHJlcS5vbignZGF0YScsIChjaHVuazogQnVmZmVyKSA9PiBjaHVua3MucHVzaChjaHVuaykpO1xuICAgIHJlcS5vbignZW5kJywgKCkgPT4gcmVzb2x2ZShCdWZmZXIuY29uY2F0KGNodW5rcykudG9TdHJpbmcoJ3V0Zi04JykpKTtcbiAgICByZXEub24oJ2Vycm9yJywgcmVqZWN0KTtcbiAgfSk7XG59XG5cbi8vID09PSDpnZnmgIHotYTmupAgPT09XG5cbi8qKlxuICog5pyN5YqhIC5vcGVuLW5leHQvYXNzZXRzLyDkuIvnmoTpnZnmgIHmlofku7bjgIJcbiAqXG4gKiDljLnphY3kuKTnsbs6XG4gKiAgIDEuIGAvX25leHQvc3RhdGljLypgIOKAlOKAlCBOZXh0LmpzIOeUn+aIkOeahOW4piBoYXNoIOi1hOa6kCzplb/nvJPlrZggaW1tdXRhYmxlXG4gKiAgIDIuIGAvPHB1YmxpYy1maWxlPmAg4oCU4oCUIGBwdWJsaWMvYCDmj5Dlj5blh7rmnaXnmoTmoLnnuqfpnZnmgIHmlofku7Ys55+t57yT5a2YXG4gKlxuICog5LiN5a2Y5Zyo55qE6Lev5b6E6L+U5ZueIGZhbHNlIOiuqeS4iuWxgiBmYWxsYmFjayDliLAgT3Blbk5leHQgaGFuZGxlcihBUEkgLyBTU1IgL1xuICogYF9wY2cvKmAg562JKeOAglxuICovXG5mdW5jdGlvbiBzZXJ2ZVN0YXRpY0ZpbGUoXG4gIGFzc2V0c0Rpcjogc3RyaW5nLFxuICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICByZXM6IGh0dHAuU2VydmVyUmVzcG9uc2Vcbik6IGJvb2xlYW4ge1xuICBjb25zdCB1cmxQYXRoID0gcmVxLnVybD8uc3BsaXQoJz8nKVswXSA/PyAnLyc7XG4gIGlmICh1cmxQYXRoID09PSAnLycgfHwgIXVybFBhdGguc3RhcnRzV2l0aCgnLycpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oYXNzZXRzRGlyLCB1cmxQYXRoKTtcbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRoLm5vcm1hbGl6ZShmaWxlUGF0aCk7XG4gIGlmICghbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChhc3NldHNEaXIpKSB7XG4gICAgcmVzLndyaXRlSGVhZCg0MDMpO1xuICAgIHJlcy5lbmQoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxldCBzdGF0OiBmcy5TdGF0cztcbiAgdHJ5IHtcbiAgICBzdGF0ID0gZnMuc3RhdFN5bmMobm9ybWFsaXplZFBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKCFzdGF0LmlzRmlsZSgpKSByZXR1cm4gZmFsc2U7XG5cbiAgY29uc3QgZXh0ID0gcGF0aC5leHRuYW1lKG5vcm1hbGl6ZWRQYXRoKTtcbiAgY29uc3QgY29udGVudFR5cGUgPSBNSU1FX1RZUEVTW2V4dF0gfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gIGNvbnN0IGlzSGFzaGVkQXNzZXQgPSB1cmxQYXRoLnN0YXJ0c1dpdGgoJy9fbmV4dC9zdGF0aWMvJyk7XG5cbiAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAnQ29udGVudC1UeXBlJzogY29udGVudFR5cGUsXG4gICAgJ0NvbnRlbnQtTGVuZ3RoJzogc3RhdC5zaXplLFxuICAgICdDYWNoZS1Db250cm9sJzogaXNIYXNoZWRBc3NldFxuICAgICAgPyAncHVibGljLCBtYXgtYWdlPTMxNTM2MDAwLCBpbW11dGFibGUnXG4gICAgICA6ICdwdWJsaWMsIG1heC1hZ2U9NjAnLFxuICB9KTtcbiAgZnMuY3JlYXRlUmVhZFN0cmVhbShub3JtYWxpemVkUGF0aCkucGlwZShyZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiDmioogT3Blbk5leHQg5o+Q5L6b55qEIGhhbmRsZXIg5YyF5oiQIGh0dHAgKHJlcSwgcmVzKSDlpITnkIblh73mlbDjgIJcbiAqIOi0n+i0ozogYm9keSDor7vlj5bjgIFldmVudCDnu4Too4XjgIHmtYHlvI/lk43lupTjgIE1MDAg5YWc5bqV44CCXG4gKi9cbmZ1bmN0aW9uIGJyaWRnZU9wZW5OZXh0SGFuZGxlcihoYW5kbGVyOiBPcGVuTmV4dEhhbmRsZXIpIHtcbiAgcmV0dXJuIGFzeW5jIChcbiAgICByZXE6IGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICAgIHJlczogaHR0cC5TZXJ2ZXJSZXNwb25zZVxuICApOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmF3VXJsID0gcmVxLnVybCB8fCAnLyc7XG4gICAgICBjb25zdCBoZWFkZXJzID0gZmxhdHRlbkhlYWRlcnMocmVxLmhlYWRlcnMpO1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlYWRCb2R5KHJlcSk7XG5cbiAgICAgIC8vIE9wZW5OZXh0IOWGhemDqOWvuSBldmVudC51cmwg5omn6KGMIGBuZXcgVVJMKC4uLilgLOW/hemhu+aYr+e7neWvuSBVUkwg4oCU4oCUIOeUqFxuICAgICAgLy8gaG9zdCBoZWFkZXIgKyB4LWZvcndhcmRlZC1wcm90byDov5jljp8s6KGM5Li65LiOIE9wZW5OZXh0IOWGhee9riBub2RlXG4gICAgICAvLyBjb252ZXJ0ZXIg5LiA6Ie0IChAb3Blbm5leHRqcy9hd3MvZGlzdC9vdmVycmlkZXMvY29udmVydGVycy9ub2RlLmpzKeOAglxuICAgICAgY29uc3QgaG9zdCA9IGhlYWRlcnNbJ2hvc3QnXSB8fCBgbG9jYWxob3N0OiR7cHJvY2Vzcy5lbnYuUE9SVCA/PyAnMzAwMCd9YDtcbiAgICAgIGNvbnN0IHByb3RvID0gaGVhZGVyc1sneC1mb3J3YXJkZWQtcHJvdG8nXT8uc3BsaXQoJywnKVswXT8udHJpbSgpIHx8ICdodHRwJztcbiAgICAgIGNvbnN0IGFic29sdXRlVXJsID0gbmV3IFVSTChgJHtwcm90b306Ly8ke2hvc3R9JHtyYXdVcmx9YCk7XG5cbiAgICAgIGNvbnN0IGV2ZW50OiBJbnRlcm5hbEV2ZW50ID0ge1xuICAgICAgICB0eXBlOiAnY29yZScsXG4gICAgICAgIG1ldGhvZDogcmVxLm1ldGhvZCB8fCAnR0VUJyxcbiAgICAgICAgcmF3UGF0aDogYWJzb2x1dGVVcmwucGF0aG5hbWUsXG4gICAgICAgIHVybDogYWJzb2x1dGVVcmwuaHJlZixcbiAgICAgICAgYm9keSxcbiAgICAgICAgaGVhZGVycyxcbiAgICAgICAgcXVlcnk6IHBhcnNlUXVlcnkocmF3VXJsKSxcbiAgICAgICAgY29va2llczogcGFyc2VDb29raWVzKGhlYWRlcnNbJ2Nvb2tpZSddKSxcbiAgICAgICAgcmVtb3RlQWRkcmVzczpcbiAgICAgICAgICBoZWFkZXJzWyd4LWZvcndhcmRlZC1mb3InXT8uc3BsaXQoJywnKVswXT8udHJpbSgpIHx8XG4gICAgICAgICAgaGVhZGVyc1sneC1yZWFsLWlwJ10gfHxcbiAgICAgICAgICByZXEuc29ja2V0Py5yZW1vdGVBZGRyZXNzIHx8XG4gICAgICAgICAgJzEyNy4wLjAuMScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBhYm9ydENvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICByZXMub24oJ2Nsb3NlJywgKCkgPT4gYWJvcnRDb250cm9sbGVyLmFib3J0KCkpO1xuXG4gICAgICBjb25zdCBzdHJlYW1DcmVhdG9yOiBTdHJlYW1DcmVhdG9yID0ge1xuICAgICAgICB3cml0ZUhlYWRlcnMocHJlbHVkZSkge1xuICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ1NldC1Db29raWUnLCBwcmVsdWRlLmNvb2tpZXMpO1xuICAgICAgICAgIHJlcy53cml0ZUhlYWQocHJlbHVkZS5zdGF0dXNDb2RlLCBwcmVsdWRlLmhlYWRlcnMpO1xuICAgICAgICAgIHJlcy5mbHVzaEhlYWRlcnMoKTtcbiAgICAgICAgICByZXR1cm4gcmVzO1xuICAgICAgICB9LFxuICAgICAgICBhYm9ydFNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIH07XG5cbiAgICAgIC8vIOi/m+WFpSBPcGVuTmV4dCBoYW5kbGVyIOWJjeaKiuivt+axguWktCAoaG9zdCAvIHgtYWxpY2RuLXNpdGUtaWQpIOazqOWFpVxuICAgICAgLy8gQXN5bmNMb2NhbFN0b3JhZ2Us5LiL5ri4IGNkbi1wdXJnZSDljbPkvb8gZmlyZS1hbmQtZm9yZ2V0IOS5n+iDveaLv+WIsOacrOasoVxuICAgICAgLy8g6K+35rGC55qEIGhvc3RuYW1lIC8gc2l0ZUlkKHByb21pc2Ug6ZO+57un5om/5b2T5YmNIHN0b3JlKeOAglxuICAgICAgYXdhaXQgcnVuV2l0aEVkZ2VDb250ZXh0KGhlYWRlcnMsICgpID0+IGhhbmRsZXIoZXZlbnQsIHsgc3RyZWFtQ3JlYXRvciB9KSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgIGNvbnN0IGlzRGV2ID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJztcbiAgICAgICAgcmVzLndyaXRlSGVhZCg1MDAsIHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICAgICAgcmVzLmVuZChcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICBlcnJvcjogJ0ludGVybmFsIFNlcnZlciBFcnJvcicsXG4gICAgICAgICAgICAuLi4oaXNEZXYgJiYgeyBtZXNzYWdlOiBlcnIubWVzc2FnZSwgc3RhY2s6IGVyci5zdGFjayB9KSxcbiAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBPcGVuTmV4dCDlnKjliqDovb3lrowgc2VydmVyIGJ1bmRsZSDlkI7osIPnlKjmraTlh73mlbAs5oiR5Lus5Zyo5q2k5ZCv5YqoIEhUVFAgc2VydmVy44CCXG4gKlxuICogYXNzZXRzIOebruW9leino+aekOS4uiBgPGN3ZD4vLi4vLi4vYXNzZXRzYDpPcGVuTmV4dCDpu5jorqTkuqfniannu5PmnoTmmK9cbiAqIGAub3Blbi1uZXh0L3NlcnZlci1mdW5jdGlvbnMvZGVmYXVsdC9pbmRleC5tanNgLOi/kOihjOaXtuaXoOiuuuaYr+eUqOaIt+aJi+WKqFxuICogYGNkYCDlkI4gYG5vZGUgaW5kZXgubWpzYCDov5jmmK8gYHBjZyBzZXJ2ZWAgc3Bhd24oYGN3ZDogc2VydmVyRGlyYCksXG4gKiBgcHJvY2Vzcy5jd2QoKWAg6YO9562J5LqOIGBzZXJ2ZXItZnVuY3Rpb25zL2RlZmF1bHQvYCxhc3NldHMg5b+F5ZyoIGAuLi8uLi9hc3NldHMvYOOAglxuICovXG5hc3luYyBmdW5jdGlvbiB3cmFwcGVyKGhhbmRsZXI6IE9wZW5OZXh0SGFuZGxlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwb3J0ID0gcGFyc2VJbnQocHJvY2Vzcy5lbnYuUE9SVCA/PyAnMzAwMCcsIDEwKTtcbiAgY29uc3QgYXNzZXRzRGlyID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuLicsICcuLicsICdhc3NldHMnKTtcbiAgaWYgKCFmcy5leGlzdHNTeW5jKGFzc2V0c0RpcikpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW3BjZy1ub2RlXSBhc3NldHMgZGlyZWN0b3J5IG5vdCBmb3VuZCBhdCAke2Fzc2V0c0Rpcn0g4oCUIHN0YXRpYyBmaWxlIHJlcXVlc3RzIHdpbGwgZmFsbCB0aHJvdWdoIHRvIE5leHQgaGFuZGxlcmBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZGlzcGF0Y2hUb05leHQgPSBicmlkZ2VPcGVuTmV4dEhhbmRsZXIoaGFuZGxlcik7XG5cbiAgY29uc3Qgc2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3QgdXJsUGF0aCA9IHJlcS51cmw/LnNwbGl0KCc/JylbMF0gPz8gJy8nO1xuXG4gICAgLy8gMS4gaGVhbHRoIGNoZWNrXG4gICAgaWYgKHVybFBhdGggPT09ICcvX19oZWFsdGgnKSB7XG4gICAgICByZXMud3JpdGVIZWFkKDIwMCwgeyAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW4nIH0pO1xuICAgICAgcmVzLmVuZCgnT0snKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAyLiDlm77niYfkvJjljJbku6PnkIYg4oCU4oCUIOaLpuaIqiBOZXh0IOm7mOiupOeahCAvX25leHQvaW1hZ2U/dXJsPS4uLixzZXJ2ZXIg5L6n5Luj5Y+RXG4gICAgLy8gICAg562+5ZCN6K+35rGC5YiwIEdhdGV3YXnjgILov5nmoLfnlKjmiLcgbmV4dC5jb25maWcg5LiN6ZyA6KaB6YWNIGN1c3RvbSBsb2FkZXIsXG4gICAgLy8gICAgPEltYWdlPiDotbAgTmV4dCDlhoXnva4gVVJMIOeUn+aIkOmAu+i+keWNs+WPr+OAglxuICAgIGlmICh1cmxQYXRoID09PSAnL19uZXh0L2ltYWdlJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgaGFuZGxlSW1hZ2VQcm94eShyZXEsIHJlcyk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbcGNnLW5vZGVdIGltYWdlLXByb3h5IGVycm9yOicsIGVycik7XG4gICAgICAgIGlmICghcmVzLmhlYWRlcnNTZW50KSB7XG4gICAgICAgICAgcmVzLndyaXRlSGVhZCg1MDAsIHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9KTtcbiAgICAgICAgICByZXMuZW5kKEpTT04uc3RyaW5naWZ5KHsgZXJyb3I6ICdJbWFnZSBwcm94eSBmYWlsZWQnIH0pKTtcbiAgICAgICAgfSBlbHNlIGlmICghcmVzLndyaXRhYmxlRW5kZWQpIHtcbiAgICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyAzLiDpnZnmgIHotYTmupAoLm9wZW4tbmV4dC9hc3NldHMvKVxuICAgIGlmIChzZXJ2ZVN0YXRpY0ZpbGUoYXNzZXRzRGlyLCByZXEsIHJlcykpIHJldHVybjtcblxuICAgIC8vIDQuIGZhbGxiYWNrIOKAlOKAlCBPcGVuTmV4dCBOZXh0LmpzIGhhbmRsZXJcbiAgICBhd2FpdCBkaXNwYXRjaFRvTmV4dChyZXEsIHJlcyk7XG4gIH0pO1xuXG4gIC8vIOS8mOmbheWFs+mXrTrlgZzmraLmjqXmlLbmlrDov57mjqUs562JIGluLWZsaWdodCDor7fmsYLoh6rnhLbnu5PmnZ8sNXMg5YWc5bqV5by65Yi26YCA5Ye6XG4gIGxldCBzaHV0dGluZ0Rvd24gPSBmYWxzZTtcbiAgY29uc3Qgc2h1dGRvd24gPSAoc2lnbmFsOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgICBpZiAoc2h1dHRpbmdEb3duKSByZXR1cm47XG4gICAgc2h1dHRpbmdEb3duID0gdHJ1ZTtcbiAgICBjb25zb2xlLmxvZyhgW3BjZy1ub2RlXSAke3NpZ25hbH0gcmVjZWl2ZWQsIHNodXR0aW5nIGRvd24uLi5gKTtcbiAgICBzZXJ2ZXIuY2xvc2UoKCkgPT4gcHJvY2Vzcy5leGl0KDApKTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHByb2Nlc3MuZXhpdCgwKSwgNTAwMCkudW5yZWYoKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4gc2h1dGRvd24oJ1NJR0lOVCcpKTtcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsICgpID0+IHNodXRkb3duKCdTSUdURVJNJykpO1xuXG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4ge1xuICAgIHNlcnZlci5saXN0ZW4ocG9ydCwgKCkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYFtwY2ctbm9kZV0gTGlzdGVuaW5nIG9uIHBvcnQgJHtwb3J0fWApO1xuICAgICAgY29uc29sZS5sb2coYFtwY2ctbm9kZV0gICBhc3NldHM6ICAke2Fzc2V0c0Rpcn1gKTtcbiAgICAgIGNvbnNvbGUubG9nKGBbcGNnLW5vZGVdICAgcm91dGVzOiAgL19faGVhbHRoLCAvX25leHQvaW1hZ2UsIC9fbmV4dC9zdGF0aWMvKiwgPG5leHQ+YCk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIE9wZW5OZXh0IOm7mOiupOWvvOWHuuWlkee6pjpgeyB3cmFwcGVyLCBuYW1lLCBzdXBwb3J0U3RyZWFtaW5nIH1g44CCXG4gKi9cbmNvbnN0IHdyYXBwZXJEZWYgPSB7XG4gIHdyYXBwZXIsXG4gIG5hbWU6ICdwY2ctbm9kZScsXG4gIHN1cHBvcnRTdHJlYW1pbmc6IHRydWUsXG59O1xuXG5leHBvcnQgZGVmYXVsdCB3cmFwcGVyRGVmO1xuIl19
|
package/dist/commands/build.js
CHANGED
|
@@ -41,6 +41,29 @@ function isNextMajorUnsupported(major) {
|
|
|
41
41
|
// Relative form needed because absolute __dirname paths break when the CLI is
|
|
42
42
|
// ncc-bundled into a single file (subdirectory tree no longer exists).
|
|
43
43
|
const PCG_OVERRIDES_REL = '.pcg/overrides';
|
|
44
|
+
// Filename for the tag→path manifest embedded into the FC bundle. Read at
|
|
45
|
+
// FC cold start by runtime/cdn-purge to map revalidateTag → CDN purge URLs
|
|
46
|
+
// without a server round trip. Resolved via __dirname inside cache.cjs.
|
|
47
|
+
const TAG_MANIFEST_FILENAME = '__pcg_tag_manifest.json';
|
|
48
|
+
async function embedTagManifest(openNextDir) {
|
|
49
|
+
var _a;
|
|
50
|
+
const src = path.join(openNextDir, 'dynamodb-provider', 'dynamodb-cache.json');
|
|
51
|
+
const dst = path.join(openNextDir, 'server-functions', 'default', TAG_MANIFEST_FILENAME);
|
|
52
|
+
try {
|
|
53
|
+
await fs.access(src);
|
|
54
|
+
}
|
|
55
|
+
catch (_b) {
|
|
56
|
+
console.warn(`[build] dynamodb-provider/dynamodb-cache.json not found — auto CDN purge will have an empty tag map`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
await fs.copyFile(src, dst);
|
|
61
|
+
console.log(`[build] Embedded tag manifest → ${TAG_MANIFEST_FILENAME}`);
|
|
62
|
+
}
|
|
63
|
+
catch (err) {
|
|
64
|
+
console.warn(`[build] Failed to embed tag manifest: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
44
67
|
async function materializeOverrides(projectDir) {
|
|
45
68
|
// Lazy require — keeps the inline-overrides bundle out of the import graph
|
|
46
69
|
// for code paths that don't auto-generate the config.
|
|
@@ -141,6 +164,7 @@ async function runBuild(opts) {
|
|
|
141
164
|
finally {
|
|
142
165
|
process.chdir(prevCwd);
|
|
143
166
|
}
|
|
167
|
+
await embedTagManifest(openNextDir);
|
|
144
168
|
console.log('[build] Build complete!');
|
|
145
169
|
}
|
|
146
170
|
finally {
|
|
@@ -180,4 +204,4 @@ function createBuildCommand() {
|
|
|
180
204
|
});
|
|
181
205
|
}
|
|
182
206
|
exports.createBuildCommand = createBuildCommand;
|
|
183
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLGtDQUFrQztBQUNsQyx5Q0FBb0M7QUFDcEMsbUNBQXVDO0FBQ3ZDLGlGQUEyRTtBQUUzRSx5RUFBeUU7QUFDekUsaUZBQWlGO0FBQ2pGLDJEQUEyRDtBQUMzRCxNQUFNLGtCQUFrQixHQUEyQjtJQUNqRCxFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtDQUNqQixDQUFDO0FBQ0YsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUM7QUFFcEMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxVQUFrQjtJQUMvQyxJQUFJO1FBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDdkIsVUFBVSxFQUNWLGNBQWMsRUFDZCxNQUFNLEVBQ04sY0FBYyxDQUNmLENBQUM7UUFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztLQUMzQztJQUFDLFdBQU07UUFDTixPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsS0FBYTtJ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T0FBTyxFQUFDLEVBQUU7UUFDdEIsTUFBTSxRQUFRLENBQUM7WUFDYixHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUc7WUFDaEIsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNO1lBQ3RCLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSztZQUNwQixNQUFNLEVBQUUsT0FBTyxDQUFDLE1BQU07WUFDdEIsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLG9CQUFvQjtTQUNuRCxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUM7QUFqQkQsZ0RBaUJDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgZGlyRXhpc3RzIH0gZnJvbSAnLi4vdXRpbC9mcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZURlZmF1bHRDb25maWcgfSBmcm9tICcuLi9jb25maWcvZGVmYXVsdC1vcGVuLW5leHQtY29uZmlnJztcblxuLy8gTWlycm9yIG9mIE9wZW5OZXh0J3MgTkVYVF9SRUxFQVNFX0RBVEVTIChoZWxwZXIuanMpLiBVc2VkIHRvIGF1dG8tcGFzc1xuLy8gLS1mb3JjZS11bnN1cHBvcnRlZC1uZXh0IHdoZW4gdGhlIHVzZXIncyBOZXh0IG1ham9yIGlzIHBhc3QgaXRzIDIteWVhciB3aW5kb3csXG4vLyBzbyBwaXBlbGluZSBidWlsZHMgZG9uJ3QgZmFpbCBvbiBPcGVuTmV4dCdzIHBvbGljeSBnYXRlLlxuY29uc3QgTkVYVF9SRUxFQVNFX0RBVEVTOiBSZWNvcmQ8bnVtYmVyLCBzdHJpbmc+ID0ge1xuICAxNjogJzIwMjUtMTAtMjEnLFxuICAxNTogJzIwMjQtMTAtMjEnLFxuICAxNDogJzIwMjMtMTAtMjYnLFxuICAxMzogJzIwMjItMTAtMjYnLFxuICAxMjogJzIwMjEtMTAtMjYnLFxufTtcbmNvbnN0IE5FWFRfU1VQUE9SVF9XSU5ET1dfWUVBUlMgPSAyO1xuXG5hc3luYyBmdW5jdGlvbiBkZXRlY3ROZXh0TWFqb3IocHJvamVjdERpcjogc3RyaW5nKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGtnUGF0aCA9IHBhdGguam9pbihcbiAgICAgIHByb2plY3REaXIsXG4gICAgICAnbm9kZV9tb2R1bGVzJyxcbiAgICAgICduZXh0JyxcbiAgICAgICdwYWNrYWdlLmpzb24nXG4gICAgKTtcbiAgICBjb25zdCBwa2cgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHBrZ1BhdGgsICd1dGYtOCcpKTtcbiAgICBjb25zdCBtYWpvciA9IHBhcnNlSW50KFN0cmluZyhwa2cudmVyc2lvbikuc3BsaXQoJy4nKVswXSwgMTApO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4obWFqb3IpID8gbnVsbCA6IG1ham9yO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05leHRNYWpvclVuc3VwcG9ydGVkKG1ham9yOiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3QgcmVsZWFzZURhdGUgPSBORVhUX1JFTEVBU0VfREFURVNbbWFqb3JdO1xuICBpZiAoIXJlbGVhc2VEYXRlKSByZXR1cm4gbWFqb3IgPCAxMjtcbiAgY29uc3QgZW9sID0gbmV3IERhdGUocmVsZWFzZURhdGUpO1xuICBlb2wuc2V0RnVsbFllYXIoZW9sLmdldEZ1bGxZZWFyKCkgKyBORVhUX1NVUFBPUlRfV0lORE9XX1lFQVJTKTtcbiAgcmV0dXJuIERhdGUubm93KCkgPiBlb2wuZ2V0VGltZSgpO1xufVxuXG4vLyBQYXRoIGluc2lkZSA8cHJvamVjdERpcj4gd2hlcmUgd2UgbWF0ZXJpYWxpemUgb3ZlcnJpZGUgYnVuZGxlcyBzbyB0aGVcbi8vIGF1dG8tZ2VuZXJhdGVkIG9wZW4tbmV4dC5jb25maWcgY2FuIHJlZmVyZW5jZSB0aGVtIHZpYSBhIHJlbGF0aXZlIHBhdGguXG4vLyBSZWxhdGl2ZSBmb3JtIG5lZWRlZCBiZWNhdXNlIGFic29sdXRlIF9fZGlybmFtZSBwYXRocyBicmVhayB3aGVuIHRoZSBDTEkgaXNcbi8vIG5jYy1idW5kbGVkIGludG8gYSBzaW5nbGUgZmlsZSAoc3ViZGlyZWN0b3J5IHRyZWUgbm8gbG9uZ2VyIGV4aXN0cykuXG5jb25zdCBQQ0dfT1ZFUlJJREVTX1JFTCA9ICcucGNnL292ZXJyaWRlcyc7XG5cbmFzeW5jIGZ1bmN0aW9uIG1hdGVyaWFsaXplT3ZlcnJpZGVzKHByb2plY3REaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBMYXp5IHJlcXVpcmUg4oCUIGtlZXBzIHRoZSBpbmxpbmUtb3ZlcnJpZGVzIGJ1bmRsZSBvdXQgb2YgdGhlIGltcG9ydCBncmFwaFxuICAvLyBmb3IgY29kZSBwYXRocyB0aGF0IGRvbid0IGF1dG8tZ2VuZXJhdGUgdGhlIGNvbmZpZy5cbiAgbGV0IElOTElORV9PVkVSUklERVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHRyeSB7XG4gICAgKHsgSU5MSU5FX09WRVJSSURFUyB9ID0gcmVxdWlyZSgnLi4vX2lubGluZS1vdmVycmlkZXMnKSk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdbYnVpbGRdIGRpc3QvX2lubGluZS1vdmVycmlkZXMuanMgbWlzc2luZyBmcm9tIGVzYS1wY2ctY2xpLiAnICtcbiAgICAgICAgICAnVGhlIHB1Ymxpc2hlZCBwYWNrYWdlIHdhcyBidWlsdCB3aXRob3V0IHNjcmlwdHMvYnVuZGxlLW92ZXJyaWRlcy5qcy4gJyArXG4gICAgICAgICAgJ1JlaW5zdGFsbCBhIG5ld2VyIGVzYS1wY2ctY2xpIChidWlsdCB3aXRoIHRoZSBmdWxsIGBwbnBtIGJ1aWxkYCBwaXBlbGluZSkuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgUENHX09WRVJSSURFU19SRUwpO1xuICBmb3IgKGNvbnN0IFtyZWxQYXRoLCBzb3VyY2VdIG9mIE9iamVjdC5lbnRyaWVzKElOTElORV9PVkVSUklERVMpIGFzIFtcbiAgICBzdHJpbmcsXG4gICAgc3RyaW5nLFxuICBdW10pIHtcbiAgICBjb25zdCB0YXJnZXQgPSBwYXRoLmpvaW4ob3ZlcnJpZGVzUm9vdCwgcmVsUGF0aCk7XG4gICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHRhcmdldCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0YXJnZXQsIHNvdXJjZSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cE92ZXJyaWRlcyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb3ZlcnJpZGVzUm9vdCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCBQQ0dfT1ZFUlJJREVTX1JFTCk7XG4gIGF3YWl0IGZzLnJtKG92ZXJyaWRlc1Jvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgLy8gQWxzbyB0cnkgdG8gcmVtb3ZlIHRoZSAucGNnIHBhcmVudCBpZiBpdCdzIGVtcHR5OyBpZ25vcmUgaWYgbm90LlxuICBhd2FpdCBmcy5ybWRpcihwYXRoLmpvaW4ocHJvamVjdERpciwgJy5wY2cnKSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyB7XG4gIGRpcjogc3RyaW5nO1xuICBjb25maWc/OiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgZm9yY2VVbnN1cHBvcnRlZE5leHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGQob3B0czogQnVpbGRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLnJlc29sdmUob3B0cy5kaXIpO1xuXG4gIGNvbnN0IHBrZ0pzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5hY2Nlc3MocGtnSnNvblBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTmV4dC5qcyBwcm9qZWN0IG5vdCBmb3VuZCBhdCAke3Byb2plY3REaXJ9IChubyBwYWNrYWdlLmpzb24pYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBvcGVuTmV4dERpciA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnLm9wZW4tbmV4dCcpO1xuXG4gIGxldCBjb25maWdQYXRoID0gb3B0cy5jb25maWc7XG4gIGxldCB0ZW1wQ29uZmlnID0gZmFsc2U7XG5cbiAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFsnb3Blbi1uZXh0LmNvbmZpZy50cycsICdvcGVuLW5leHQuY29uZmlnLmpzJ107XG4gICAgZm9yIChjb25zdCBjIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgYyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MocCk7XG4gICAgICAgIGNvbmZpZ1BhdGggPSBwO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbmZpZ1BhdGgpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdbYnVpbGRdIE5vIG9wZW4tbmV4dC5jb25maWcgZm91bmQsIGdlbmVyYXRpbmcgZGVmYXVsdCBjb25maWcuLi4nXG4gICAgKTtcbiAgICBjb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvcGVuLW5leHQuY29uZmlnLnRzJyk7XG4gICAgYXdhaXQgbWF0ZXJpYWxpemVPdmVycmlkZXMocHJvamVjdERpcik7XG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGdlbmVyYXRlRGVmYXVsdENvbmZpZyh7XG4gICAgICBvdmVycmlkZXNEaXI6IGAuLyR7UENHX09WRVJSSURFU19SRUx9YCxcbiAgICB9KTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoY29uZmlnUGF0aCwgY29uZmlnQ29udGVudCk7XG4gICAgdGVtcENvbmZpZyA9IHRydWU7XG4gIH1cblxuICBpZiAob3B0cy5kcnlSdW4pIHtcbiAgICBjb25zb2xlLmxvZygnW2J1aWxkXSBEcnkgcnVuIG1vZGUg4oCUIGJ1aWxkIHBsYW46Jyk7XG4gICAgY29uc29sZS5sb2coYCAgUHJvamVjdCBkaXI6ICR7cHJvamVjdERpcn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBDb25maWc6ICR7Y29uZmlnUGF0aH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBPdXRwdXQ6ICR7b3Blbk5leHREaXJ9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZGlyRXhpc3RzKG9wZW5OZXh0RGlyKSkge1xuICAgICAgY29uc29sZS5sb2coJ1tidWlsZF0gQ2xlYW5pbmcgb2xkIC5vcGVuLW5leHQvIGRpcmVjdG9yeS4uLicpO1xuICAgICAgYXdhaXQgZnMucm0ob3Blbk5leHREaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWJ1Zykge1xuICAgICAgcHJvY2Vzcy5lbnYuT1BFTl9ORVhUX0RFQlVHID0gJ3RydWUnO1xuICAgIH1cblxuICAgIGxldCBmb3JjZVVuc3VwcG9ydGVkID0gb3B0cy5mb3JjZVVuc3VwcG9ydGVkTmV4dCA9PT0gdHJ1ZTtcbiAgICBpZiAoIWZvcmNlVW5zdXBwb3J0ZWQgJiYgcHJvY2Vzcy5lbnYuUENHX1NUUklDVF9ORVhUX1NVUFBPUlQgIT09ICcxJykge1xuICAgICAgY29uc3QgbmV4dE1ham9yID0gYXdhaXQgZGV0ZWN0TmV4dE1ham9yKHByb2plY3REaXIpO1xuICAgICAgaWYgKG5leHRNYWpvciAhPT0gbnVsbCAmJiBpc05leHRNYWpvclVuc3VwcG9ydGVkKG5leHRNYWpvcikpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbYnVpbGRdIE5leHQgJHtuZXh0TWFqb3J9LnggaXMgcGFzdCBPcGVuTmV4dCdzICR7TkVYVF9TVVBQT1JUX1dJTkRPV19ZRUFSU30teWVhciBzdXBwb3J0IHdpbmRvdyDigJQgYCArXG4gICAgICAgICAgICAnYXV0by1lbmFibGluZyAtLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQuICcgK1xuICAgICAgICAgICAgJ1NldCBQQ0dfU1RSSUNUX05FWFRfU1VQUE9SVD0xIHRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4nXG4gICAgICAgICk7XG4gICAgICAgIGZvcmNlVW5zdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdbYnVpbGRdIFJ1bm5pbmcgT3Blbk5leHQgYnVpbGQuLi4nKTtcbiAgICBjb25zdCBwcmV2Q3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcm9qZWN0RGlyKTtcbiAgICAgIC8vIE9wZW5OZXh0IHJlc29sdmVzIGBuZXh0YCB2aWEgcHJvY2Vzcy5jd2QoKSAvIHsgcGF0aHM6IFthcHBQYXRoXSB9LFxuICAgICAgLy8gc28gbG9hZGluZyBpdCBmcm9tIHRoZSBDTEkncyBvd24gbm9kZV9tb2R1bGVzIHN0aWxsIGZpbmRzIHRoZSB1c2VyJ3MgTmV4dC5cbiAgICAgIGNvbnN0IG9wZW5OZXh0QnVpbGQgPSByZXF1aXJlKCdAb3Blbm5leHRqcy9hd3MvYnVpbGQuanMnKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlQ29uZmlnUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdERpciwgY29uZmlnUGF0aCEpO1xuICAgICAgYXdhaXQgb3Blbk5leHRCdWlsZC5idWlsZChcbiAgICAgICAgcmVsYXRpdmVDb25maWdQYXRoLFxuICAgICAgICAnQG9wZW5uZXh0anMvYXdzJyxcbiAgICAgICAgZm9yY2VVbnN1cHBvcnRlZFxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcmV2Q3dkKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZygnW2J1aWxkXSBCdWlsZCBjb21wbGV0ZSEnKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAodGVtcENvbmZpZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMudW5saW5rKGNvbmZpZ1BhdGghKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1tidWlsZF0gV2FybmluZzogZmFpbGVkIHRvIGNsZWFuIHVwIHRlbXBvcmFyeSBjb25maWcgZmlsZSdcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNsZWFudXBPdmVycmlkZXMocHJvamVjdERpcik7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbYnVpbGRdIFdhcm5pbmc6IGZhaWxlZCB0byBjbGVhbiB1cCAke1BDR19PVkVSUklERVNfUkVMfS9gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCdWlsZENvbW1hbmQoKTogQ29tbWFuZCB7XG4gIHJldHVybiBuZXcgQ29tbWFuZCgnYnVpbGQnKVxuICAgIC5kZXNjcmlwdGlvbignQnVpbGQgTmV4dC5qcyBwcm9qZWN0IGZvciBkZXBsb3ltZW50IHZpYSBwYWdlcy1jYWNoZS1nYXRld2F5JylcbiAgICAub3B0aW9uKCctLWRpciA8cGF0aD4nLCAnTmV4dC5qcyBwcm9qZWN0IGRpcmVjdG9yeScsICcuJylcbiAgICAub3B0aW9uKCctLWNvbmZpZyA8cGF0aD4nLCAnb3Blbi1uZXh0LmNvbmZpZy50cyBwYXRoJylcbiAgICAub3B0aW9uKCctLWRlYnVnJywgJ0VuYWJsZSBkZWJ1ZyBtb2RlJylcbiAgICAub3B0aW9uKCctLWRyeS1ydW4nLCAnU2hvdyBidWlsZCBwbGFuIHdpdGhvdXQgZXhlY3V0aW5nJylcbiAgICAub3B0aW9uKCctLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQnLCAnQWxsb3cgdW5zdXBwb3J0ZWQgTmV4dC5qcyB2ZXJzaW9ucycpXG4gICAgLmFjdGlvbihhc3luYyBvcHRpb25zID0+IHtcbiAgICAgIGF3YWl0IHJ1bkJ1aWxkKHtcbiAgICAgICAgZGlyOiBvcHRpb25zLmRpcixcbiAgICAgICAgY29uZmlnOiBvcHRpb25zLmNvbmZpZyxcbiAgICAgICAgZGVidWc6IG9wdGlvbnMuZGVidWcsXG4gICAgICAgIGRyeVJ1bjogb3B0aW9ucy5kcnlSdW4sXG4gICAgICAgIGZvcmNlVW5zdXBwb3J0ZWROZXh0OiBvcHRpb25zLmZvcmNlVW5zdXBwb3J0ZWROZXh0LFxuICAgICAgfSk7XG4gICAgfSk7XG59XG4iXX0=
|
|
207
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29tbWFuZHMvYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNkJBQTZCO0FBQzdCLGtDQUFrQztBQUNsQyx5Q0FBb0M7QUFDcEMsbUNBQXVDO0FBQ3ZDLGlGQUEyRTtBQUUzRSx5RUFBeUU7QUFDekUsaUZBQWlGO0FBQ2pGLDJEQUEyRDtBQUMzRCxNQUFNLGtCQUFrQixHQUEyQjtJQUNqRCxFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtJQUNoQixFQUFFLEVBQUUsWUFBWTtDQUNqQixDQUFDO0FBQ0YsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLENBQUM7QUFFcEMsS0FBSyxVQUFVLGVBQWUsQ0FBQyxVQUFrQjtJQUMvQyxJQUFJO1FBQ0YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FDdkIsVUFBVSxFQUNWLGNBQWMsRUFDZCxNQUFNLEVBQ04sY0FBYyxDQUNmLENBQUM7UUFDRixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1RCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDOUQsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztLQUMzQztJQUFDLFdBQU07UUFDTixPQUFPLElBQUksQ0FBQztLQUNiO0FBQ0gsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQUMsS0FBYTtJ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QkFBb0I7U0FDbkQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBakJELGdEQWlCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBDb21tYW5kIH0gZnJvbSAnY29tbWFuZGVyJztcbmltcG9ydCB7IGRpckV4aXN0cyB9IGZyb20gJy4uL3V0aWwvZnMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVEZWZhdWx0Q29uZmlnIH0gZnJvbSAnLi4vY29uZmlnL2RlZmF1bHQtb3Blbi1uZXh0LWNvbmZpZyc7XG5cbi8vIE1pcnJvciBvZiBPcGVuTmV4dCdzIE5FWFRfUkVMRUFTRV9EQVRFUyAoaGVscGVyLmpzKS4gVXNlZCB0byBhdXRvLXBhc3Ncbi8vIC0tZm9yY2UtdW5zdXBwb3J0ZWQtbmV4dCB3aGVuIHRoZSB1c2VyJ3MgTmV4dCBtYWpvciBpcyBwYXN0IGl0cyAyLXllYXIgd2luZG93LFxuLy8gc28gcGlwZWxpbmUgYnVpbGRzIGRvbid0IGZhaWwgb24gT3Blbk5leHQncyBwb2xpY3kgZ2F0ZS5cbmNvbnN0IE5FWFRfUkVMRUFTRV9EQVRFUzogUmVjb3JkPG51bWJlciwgc3RyaW5nPiA9IHtcbiAgMTY6ICcyMDI1LTEwLTIxJyxcbiAgMTU6ICcyMDI0LTEwLTIxJyxcbiAgMTQ6ICcyMDIzLTEwLTI2JyxcbiAgMTM6ICcyMDIyLTEwLTI2JyxcbiAgMTI6ICcyMDIxLTEwLTI2Jyxcbn07XG5jb25zdCBORVhUX1NVUFBPUlRfV0lORE9XX1lFQVJTID0gMjtcblxuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0TmV4dE1ham9yKHByb2plY3REaXI6IHN0cmluZyk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHBrZ1BhdGggPSBwYXRoLmpvaW4oXG4gICAgICBwcm9qZWN0RGlyLFxuICAgICAgJ25vZGVfbW9kdWxlcycsXG4gICAgICAnbmV4dCcsXG4gICAgICAncGFja2FnZS5qc29uJ1xuICAgICk7XG4gICAgY29uc3QgcGtnID0gSlNPTi5wYXJzZShhd2FpdCBmcy5yZWFkRmlsZShwa2dQYXRoLCAndXRmLTgnKSk7XG4gICAgY29uc3QgbWFqb3IgPSBwYXJzZUludChTdHJpbmcocGtnLnZlcnNpb24pLnNwbGl0KCcuJylbMF0sIDEwKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKG1ham9yKSA/IG51bGwgOiBtYWpvcjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNOZXh0TWFqb3JVbnN1cHBvcnRlZChtYWpvcjogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGVhc2VEYXRlID0gTkVYVF9SRUxFQVNFX0RBVEVTW21ham9yXTtcbiAgaWYgKCFyZWxlYXNlRGF0ZSkgcmV0dXJuIG1ham9yIDwgMTI7XG4gIGNvbnN0IGVvbCA9IG5ldyBEYXRlKHJlbGVhc2VEYXRlKTtcbiAgZW9sLnNldEZ1bGxZZWFyKGVvbC5nZXRGdWxsWWVhcigpICsgTkVYVF9TVVBQT1JUX1dJTkRPV19ZRUFSUyk7XG4gIHJldHVybiBEYXRlLm5vdygpID4gZW9sLmdldFRpbWUoKTtcbn1cblxuLy8gUGF0aCBpbnNpZGUgPHByb2plY3REaXI+IHdoZXJlIHdlIG1hdGVyaWFsaXplIG92ZXJyaWRlIGJ1bmRsZXMgc28gdGhlXG4vLyBhdXRvLWdlbmVyYXRlZCBvcGVuLW5leHQuY29uZmlnIGNhbiByZWZlcmVuY2UgdGhlbSB2aWEgYSByZWxhdGl2ZSBwYXRoLlxuLy8gUmVsYXRpdmUgZm9ybSBuZWVkZWQgYmVjYXVzZSBhYnNvbHV0ZSBfX2Rpcm5hbWUgcGF0aHMgYnJlYWsgd2hlbiB0aGUgQ0xJIGlzXG4vLyBuY2MtYnVuZGxlZCBpbnRvIGEgc2luZ2xlIGZpbGUgKHN1YmRpcmVjdG9yeSB0cmVlIG5vIGxvbmdlciBleGlzdHMpLlxuY29uc3QgUENHX09WRVJSSURFU19SRUwgPSAnLnBjZy9vdmVycmlkZXMnO1xuXG4vLyBGaWxlbmFtZSBmb3IgdGhlIHRhZ+KGknBhdGggbWFuaWZlc3QgZW1iZWRkZWQgaW50byB0aGUgRkMgYnVuZGxlLiBSZWFkIGF0XG4vLyBGQyBjb2xkIHN0YXJ0IGJ5IHJ1bnRpbWUvY2RuLXB1cmdlIHRvIG1hcCByZXZhbGlkYXRlVGFnIOKGkiBDRE4gcHVyZ2UgVVJMc1xuLy8gd2l0aG91dCBhIHNlcnZlciByb3VuZCB0cmlwLiBSZXNvbHZlZCB2aWEgX19kaXJuYW1lIGluc2lkZSBjYWNoZS5janMuXG5jb25zdCBUQUdfTUFOSUZFU1RfRklMRU5BTUUgPSAnX19wY2dfdGFnX21hbmlmZXN0Lmpzb24nO1xuXG5hc3luYyBmdW5jdGlvbiBlbWJlZFRhZ01hbmlmZXN0KG9wZW5OZXh0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgc3JjID0gcGF0aC5qb2luKFxuICAgIG9wZW5OZXh0RGlyLFxuICAgICdkeW5hbW9kYi1wcm92aWRlcicsXG4gICAgJ2R5bmFtb2RiLWNhY2hlLmpzb24nXG4gICk7XG4gIGNvbnN0IGRzdCA9IHBhdGguam9pbihcbiAgICBvcGVuTmV4dERpcixcbiAgICAnc2VydmVyLWZ1bmN0aW9ucycsXG4gICAgJ2RlZmF1bHQnLFxuICAgIFRBR19NQU5JRkVTVF9GSUxFTkFNRVxuICApO1xuICB0cnkge1xuICAgIGF3YWl0IGZzLmFjY2VzcyhzcmMpO1xuICB9IGNhdGNoIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW2J1aWxkXSBkeW5hbW9kYi1wcm92aWRlci9keW5hbW9kYi1jYWNoZS5qc29uIG5vdCBmb3VuZCDigJQgYXV0byBDRE4gcHVyZ2Ugd2lsbCBoYXZlIGFuIGVtcHR5IHRhZyBtYXBgXG4gICAgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5jb3B5RmlsZShzcmMsIGRzdCk7XG4gICAgY29uc29sZS5sb2coYFtidWlsZF0gRW1iZWRkZWQgdGFnIG1hbmlmZXN0IOKGkiAke1RBR19NQU5JRkVTVF9GSUxFTkFNRX1gKTtcbiAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICBjb25zb2xlLndhcm4oYFtidWlsZF0gRmFpbGVkIHRvIGVtYmVkIHRhZyBtYW5pZmVzdDogJHtlcnI/Lm1lc3NhZ2UgPz8gZXJyfWApO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1hdGVyaWFsaXplT3ZlcnJpZGVzKHByb2plY3REaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAvLyBMYXp5IHJlcXVpcmUg4oCUIGtlZXBzIHRoZSBpbmxpbmUtb3ZlcnJpZGVzIGJ1bmRsZSBvdXQgb2YgdGhlIGltcG9ydCBncmFwaFxuICAvLyBmb3IgY29kZSBwYXRocyB0aGF0IGRvbid0IGF1dG8tZ2VuZXJhdGUgdGhlIGNvbmZpZy5cbiAgbGV0IElOTElORV9PVkVSUklERVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHRyeSB7XG4gICAgKHsgSU5MSU5FX09WRVJSSURFUyB9ID0gcmVxdWlyZSgnLi4vX2lubGluZS1vdmVycmlkZXMnKSk7XG4gIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgaWYgKGVyciAmJiBlcnIuY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdbYnVpbGRdIGRpc3QvX2lubGluZS1vdmVycmlkZXMuanMgbWlzc2luZyBmcm9tIGVzYS1wY2ctY2xpLiAnICtcbiAgICAgICAgICAnVGhlIHB1Ymxpc2hlZCBwYWNrYWdlIHdhcyBidWlsdCB3aXRob3V0IHNjcmlwdHMvYnVuZGxlLW92ZXJyaWRlcy5qcy4gJyArXG4gICAgICAgICAgJ1JlaW5zdGFsbCBhIG5ld2VyIGVzYS1wY2ctY2xpIChidWlsdCB3aXRoIHRoZSBmdWxsIGBwbnBtIGJ1aWxkYCBwaXBlbGluZSkuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyO1xuICB9XG4gIGNvbnN0IG92ZXJyaWRlc1Jvb3QgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgUENHX09WRVJSSURFU19SRUwpO1xuICBmb3IgKGNvbnN0IFtyZWxQYXRoLCBzb3VyY2VdIG9mIE9iamVjdC5lbnRyaWVzKElOTElORV9PVkVSUklERVMpIGFzIFtcbiAgICBzdHJpbmcsXG4gICAgc3RyaW5nLFxuICBdW10pIHtcbiAgICBjb25zdCB0YXJnZXQgPSBwYXRoLmpvaW4ob3ZlcnJpZGVzUm9vdCwgcmVsUGF0aCk7XG4gICAgYXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHRhcmdldCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZSh0YXJnZXQsIHNvdXJjZSk7XG4gIH1cbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xlYW51cE92ZXJyaWRlcyhwcm9qZWN0RGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3Qgb3ZlcnJpZGVzUm9vdCA9IHBhdGguam9pbihwcm9qZWN0RGlyLCBQQ0dfT1ZFUlJJREVTX1JFTCk7XG4gIGF3YWl0IGZzLnJtKG92ZXJyaWRlc1Jvb3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgLy8gQWxzbyB0cnkgdG8gcmVtb3ZlIHRoZSAucGNnIHBhcmVudCBpZiBpdCdzIGVtcHR5OyBpZ25vcmUgaWYgbm90LlxuICBhd2FpdCBmcy5ybWRpcihwYXRoLmpvaW4ocHJvamVjdERpciwgJy5wY2cnKSkuY2F0Y2goKCkgPT4ge30pO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJ1aWxkT3B0aW9ucyB7XG4gIGRpcjogc3RyaW5nO1xuICBjb25maWc/OiBzdHJpbmc7XG4gIGRlYnVnPzogYm9vbGVhbjtcbiAgZHJ5UnVuPzogYm9vbGVhbjtcbiAgZm9yY2VVbnN1cHBvcnRlZE5leHQ/OiBib29sZWFuO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcnVuQnVpbGQob3B0czogQnVpbGRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHByb2plY3REaXIgPSBwYXRoLnJlc29sdmUob3B0cy5kaXIpO1xuXG4gIGNvbnN0IHBrZ0pzb25QYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdwYWNrYWdlLmpzb24nKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5hY2Nlc3MocGtnSnNvblBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTmV4dC5qcyBwcm9qZWN0IG5vdCBmb3VuZCBhdCAke3Byb2plY3REaXJ9IChubyBwYWNrYWdlLmpzb24pYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBvcGVuTmV4dERpciA9IHBhdGguam9pbihwcm9qZWN0RGlyLCAnLm9wZW4tbmV4dCcpO1xuXG4gIGxldCBjb25maWdQYXRoID0gb3B0cy5jb25maWc7XG4gIGxldCB0ZW1wQ29uZmlnID0gZmFsc2U7XG5cbiAgaWYgKCFjb25maWdQYXRoKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFsnb3Blbi1uZXh0LmNvbmZpZy50cycsICdvcGVuLW5leHQuY29uZmlnLmpzJ107XG4gICAgZm9yIChjb25zdCBjIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGNvbnN0IHAgPSBwYXRoLmpvaW4ocHJvamVjdERpciwgYyk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy5hY2Nlc3MocCk7XG4gICAgICAgIGNvbmZpZ1BhdGggPSBwO1xuICAgICAgICBicmVhaztcbiAgICAgIH0gY2F0Y2gge31cbiAgICB9XG4gIH1cblxuICBpZiAoIWNvbmZpZ1BhdGgpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICdbYnVpbGRdIE5vIG9wZW4tbmV4dC5jb25maWcgZm91bmQsIGdlbmVyYXRpbmcgZGVmYXVsdCBjb25maWcuLi4nXG4gICAgKTtcbiAgICBjb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3REaXIsICdvcGVuLW5leHQuY29uZmlnLnRzJyk7XG4gICAgYXdhaXQgbWF0ZXJpYWxpemVPdmVycmlkZXMocHJvamVjdERpcik7XG4gICAgY29uc3QgY29uZmlnQ29udGVudCA9IGdlbmVyYXRlRGVmYXVsdENvbmZpZyh7XG4gICAgICBvdmVycmlkZXNEaXI6IGAuLyR7UENHX09WRVJSSURFU19SRUx9YCxcbiAgICB9KTtcbiAgICBhd2FpdCBmcy53cml0ZUZpbGUoY29uZmlnUGF0aCwgY29uZmlnQ29udGVudCk7XG4gICAgdGVtcENvbmZpZyA9IHRydWU7XG4gIH1cblxuICBpZiAob3B0cy5kcnlSdW4pIHtcbiAgICBjb25zb2xlLmxvZygnW2J1aWxkXSBEcnkgcnVuIG1vZGUg4oCUIGJ1aWxkIHBsYW46Jyk7XG4gICAgY29uc29sZS5sb2coYCAgUHJvamVjdCBkaXI6ICR7cHJvamVjdERpcn1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBDb25maWc6ICR7Y29uZmlnUGF0aH1gKTtcbiAgICBjb25zb2xlLmxvZyhgICBPdXRwdXQ6ICR7b3Blbk5leHREaXJ9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgZGlyRXhpc3RzKG9wZW5OZXh0RGlyKSkge1xuICAgICAgY29uc29sZS5sb2coJ1tidWlsZF0gQ2xlYW5pbmcgb2xkIC5vcGVuLW5leHQvIGRpcmVjdG9yeS4uLicpO1xuICAgICAgYXdhaXQgZnMucm0ob3Blbk5leHREaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWJ1Zykge1xuICAgICAgcHJvY2Vzcy5lbnYuT1BFTl9ORVhUX0RFQlVHID0gJ3RydWUnO1xuICAgIH1cblxuICAgIGxldCBmb3JjZVVuc3VwcG9ydGVkID0gb3B0cy5mb3JjZVVuc3VwcG9ydGVkTmV4dCA9PT0gdHJ1ZTtcbiAgICBpZiAoIWZvcmNlVW5zdXBwb3J0ZWQgJiYgcHJvY2Vzcy5lbnYuUENHX1NUUklDVF9ORVhUX1NVUFBPUlQgIT09ICcxJykge1xuICAgICAgY29uc3QgbmV4dE1ham9yID0gYXdhaXQgZGV0ZWN0TmV4dE1ham9yKHByb2plY3REaXIpO1xuICAgICAgaWYgKG5leHRNYWpvciAhPT0gbnVsbCAmJiBpc05leHRNYWpvclVuc3VwcG9ydGVkKG5leHRNYWpvcikpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbYnVpbGRdIE5leHQgJHtuZXh0TWFqb3J9LnggaXMgcGFzdCBPcGVuTmV4dCdzICR7TkVYVF9TVVBQT1JUX1dJTkRPV19ZRUFSU30teWVhciBzdXBwb3J0IHdpbmRvdyDigJQgYCArXG4gICAgICAgICAgICAnYXV0by1lbmFibGluZyAtLWZvcmNlLXVuc3VwcG9ydGVkLW5leHQuICcgK1xuICAgICAgICAgICAgJ1NldCBQQ0dfU1RSSUNUX05FWFRfU1VQUE9SVD0xIHRvIGRpc2FibGUgdGhpcyBiZWhhdmlvci4nXG4gICAgICAgICk7XG4gICAgICAgIGZvcmNlVW5zdXBwb3J0ZWQgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKCdbYnVpbGRdIFJ1bm5pbmcgT3Blbk5leHQgYnVpbGQuLi4nKTtcbiAgICBjb25zdCBwcmV2Q3dkID0gcHJvY2Vzcy5jd2QoKTtcbiAgICB0cnkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcm9qZWN0RGlyKTtcbiAgICAgIC8vIE9wZW5OZXh0IHJlc29sdmVzIGBuZXh0YCB2aWEgcHJvY2Vzcy5jd2QoKSAvIHsgcGF0aHM6IFthcHBQYXRoXSB9LFxuICAgICAgLy8gc28gbG9hZGluZyBpdCBmcm9tIHRoZSBDTEkncyBvd24gbm9kZV9tb2R1bGVzIHN0aWxsIGZpbmRzIHRoZSB1c2VyJ3MgTmV4dC5cbiAgICAgIGNvbnN0IG9wZW5OZXh0QnVpbGQgPSByZXF1aXJlKCdAb3Blbm5leHRqcy9hd3MvYnVpbGQuanMnKTtcbiAgICAgIGNvbnN0IHJlbGF0aXZlQ29uZmlnUGF0aCA9IHBhdGgucmVsYXRpdmUocHJvamVjdERpciwgY29uZmlnUGF0aCEpO1xuICAgICAgYXdhaXQgb3Blbk5leHRCdWlsZC5idWlsZChcbiAgICAgICAgcmVsYXRpdmVDb25maWdQYXRoLFxuICAgICAgICAnQG9wZW5uZXh0anMvYXdzJyxcbiAgICAgICAgZm9yY2VVbnN1cHBvcnRlZFxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgcHJvY2Vzcy5jaGRpcihwcmV2Q3dkKTtcbiAgICB9XG5cbiAgICBhd2FpdCBlbWJlZFRhZ01hbmlmZXN0KG9wZW5OZXh0RGlyKTtcblxuICAgIGNvbnNvbGUubG9nKCdbYnVpbGRdIEJ1aWxkIGNvbXBsZXRlIScpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICh0ZW1wQ29uZmlnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy51bmxpbmsoY29uZmlnUGF0aCEpO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnW2J1aWxkXSBXYXJuaW5nOiBmYWlsZWQgdG8gY2xlYW4gdXAgdGVtcG9yYXJ5IGNvbmZpZyBmaWxlJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgY2xlYW51cE92ZXJyaWRlcyhwcm9qZWN0RGlyKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtidWlsZF0gV2FybmluZzogZmFpbGVkIHRvIGNsZWFuIHVwICR7UENHX09WRVJSSURFU19SRUx9L2BcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJ1aWxkQ29tbWFuZCgpOiBDb21tYW5kIHtcbiAgcmV0dXJuIG5ldyBDb21tYW5kKCdidWlsZCcpXG4gICAgLmRlc2NyaXB0aW9uKCdCdWlsZCBOZXh0LmpzIHByb2plY3QgZm9yIGRlcGxveW1lbnQgdmlhIHBhZ2VzLWNhY2hlLWdhdGV3YXknKVxuICAgIC5vcHRpb24oJy0tZGlyIDxwYXRoPicsICdOZXh0LmpzIHByb2plY3QgZGlyZWN0b3J5JywgJy4nKVxuICAgIC5vcHRpb24oJy0tY29uZmlnIDxwYXRoPicsICdvcGVuLW5leHQuY29uZmlnLnRzIHBhdGgnKVxuICAgIC5vcHRpb24oJy0tZGVidWcnLCAnRW5hYmxlIGRlYnVnIG1vZGUnKVxuICAgIC5vcHRpb24oJy0tZHJ5LXJ1bicsICdTaG93IGJ1aWxkIHBsYW4gd2l0aG91dCBleGVjdXRpbmcnKVxuICAgIC5vcHRpb24oJy0tZm9yY2UtdW5zdXBwb3J0ZWQtbmV4dCcsICdBbGxvdyB1bnN1cHBvcnRlZCBOZXh0LmpzIHZlcnNpb25zJylcbiAgICAuYWN0aW9uKGFzeW5jIG9wdGlvbnMgPT4ge1xuICAgICAgYXdhaXQgcnVuQnVpbGQoe1xuICAgICAgICBkaXI6IG9wdGlvbnMuZGlyLFxuICAgICAgICBjb25maWc6IG9wdGlvbnMuY29uZmlnLFxuICAgICAgICBkZWJ1Zzogb3B0aW9ucy5kZWJ1ZyxcbiAgICAgICAgZHJ5UnVuOiBvcHRpb25zLmRyeVJ1bixcbiAgICAgICAgZm9yY2VVbnN1cHBvcnRlZE5leHQ6IG9wdGlvbnMuZm9yY2VVbnN1cHBvcnRlZE5leHQsXG4gICAgICB9KTtcbiAgICB9KTtcbn1cbiJdfQ==
|
|
@@ -14,7 +14,10 @@ export default class GatewayTagCache {
|
|
|
14
14
|
mode: "nextMode";
|
|
15
15
|
private config;
|
|
16
16
|
private configLoaded;
|
|
17
|
+
private purgeClient;
|
|
18
|
+
private purgeClientLoaded;
|
|
17
19
|
private getConfig;
|
|
20
|
+
private getPurgeClient;
|
|
18
21
|
private buildTagKey;
|
|
19
22
|
getLastRevalidated(tags: string[]): Promise<number>;
|
|
20
23
|
hasBeenRevalidated(tags: string[], lastModified?: number): Promise<boolean>;
|