esa-pcg-cli 0.1.5 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,6 +2,6 @@
2
2
  exports.INLINE_OVERRIDES = {
3
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
- "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/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/build-id.js\nvar require_build_id = __commonJS({\n \"dist/runtime/build-id.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.__setBuildIdForTest = exports2.__resetBuildIdCache = exports2.loadBuildId = void 0;\n var fs = require(\"fs\");\n var path = require(\"path\");\n var cached;\n function loadBuildId() {\n var _a;\n if (cached !== void 0)\n return cached;\n const p = path.join(__dirname, \".next\", \"BUILD_ID\");\n try {\n const v = fs.readFileSync(p, \"utf-8\").trim();\n cached = v || null;\n } catch (err) {\n if ((err === null || err === void 0 ? void 0 : err.code) !== \"ENOENT\") {\n console.warn(`[build-id] BUILD_ID read error ${p}: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);\n } else {\n console.warn(`[build-id] BUILD_ID not found at ${p}`);\n }\n cached = null;\n }\n return cached;\n }\n exports2.loadBuildId = loadBuildId;\n function __resetBuildIdCache() {\n cached = void 0;\n }\n exports2.__resetBuildIdCache = __resetBuildIdCache;\n function __setBuildIdForTest(v) {\n cached = v;\n }\n exports2.__setBuildIdForTest = __setBuildIdForTest;\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 build_id_12 = require_build_id();\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, _b;\n const buildId = (_a = cfg.buildId) !== null && _a !== void 0 ? _a : (0, build_id_12.loadBuildId)();\n const pathPrefix = buildId ? `${buildId}/` : null;\n const manifestPath = (_b = cfg.manifestPath) !== null && _b !== void 0 ? _b : 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, _b2, _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}: ${(_b2 = err === null || err === void 0 ? void 0 : err.message) !== null && _b2 !== void 0 ? _b2 : 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 let tag;\n let p;\n if (pathPrefix) {\n if (!tagPk.startsWith(pathPrefix))\n continue;\n if (!pathPk.startsWith(pathPrefix))\n continue;\n tag = tagPk.slice(pathPrefix.length);\n p = pathPk.slice(pathPrefix.length);\n } else {\n const tIdx = tagPk.indexOf(\"/\");\n const pIdx = pathPk.indexOf(\"/\");\n if (tIdx < 0 || pIdx < 0)\n continue;\n if (tagPk.slice(0, tIdx) !== pathPk.slice(0, pIdx))\n continue;\n tag = tagPk.slice(tIdx + 1);\n p = pathPk.slice(pIdx + 1);\n }\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: buildId=${buildId !== null && buildId !== void 0 ? buildId : \"(auto)\"} 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 if (buildId) {\n const rel = stripLeadingSlash2(p);\n urls.add(`https://${hostname}/_next/data/${buildId}/${rel || \"index\"}.json`);\n }\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 (_b2) {\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 build_id_1 = require_build_id();\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 /**\n * 拼 TableStore tag 主键:`{buildId}/{tag}`。\n *\n * 使用 BUILD_ID(Next.js 构建产物身份)而非 cfg.version(ESA 平台版本号),\n * 原因:同一个 buildId 内 manifest 与 tag 行身份严格一致,避免\n * 部署侧注入 ESA_CACHE_GW_VERSION 与构建期 BUILD_ID 不一致时 key 全部错位。\n *\n * BUILD_ID 读不到(老 bundle / 错误可靠度) → 降级为不加前缀,与老版本行为兼容。\n */\n buildTagKey(tag) {\n const buildId = (0, build_id_1.loadBuildId)();\n const prefix = buildId ? `${buildId}/` : \"\";\n return `${prefix}${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",
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, isFetchOrType) {\n let cacheType;\n if (typeof isFetchOrType === \"string\") {\n cacheType = isFetchOrType === \"fetch\" ? \"fetch\" : \"cache\";\n } else {\n cacheType = isFetchOrType ? \"fetch\" : \"cache\";\n }\n return (0, protocol_1.buildOssKey)({\n appId: `${config.aliuid}/${config.routinename}`,\n buildId: config.version,\n key,\n cacheType\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/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/build-id.js\nvar require_build_id = __commonJS({\n \"dist/runtime/build-id.js\"(exports2) {\n \"use strict\";\n Object.defineProperty(exports2, \"__esModule\", { value: true });\n exports2.__setBuildIdForTest = exports2.__resetBuildIdCache = exports2.loadBuildId = void 0;\n var fs = require(\"fs\");\n var path = require(\"path\");\n var cached;\n function loadBuildId() {\n var _a;\n if (cached !== void 0)\n return cached;\n const p = path.join(__dirname, \".next\", \"BUILD_ID\");\n try {\n const v = fs.readFileSync(p, \"utf-8\").trim();\n cached = v || null;\n } catch (err) {\n if ((err === null || err === void 0 ? void 0 : err.code) !== \"ENOENT\") {\n console.warn(`[build-id] BUILD_ID read error ${p}: ${(_a = err === null || err === void 0 ? void 0 : err.message) !== null && _a !== void 0 ? _a : err}`);\n } else {\n console.warn(`[build-id] BUILD_ID not found at ${p}`);\n }\n cached = null;\n }\n return cached;\n }\n exports2.loadBuildId = loadBuildId;\n function __resetBuildIdCache() {\n cached = void 0;\n }\n exports2.__resetBuildIdCache = __resetBuildIdCache;\n function __setBuildIdForTest(v) {\n cached = v;\n }\n exports2.__setBuildIdForTest = __setBuildIdForTest;\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 build_id_12 = require_build_id();\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, _b;\n const buildId = (_a = cfg.buildId) !== null && _a !== void 0 ? _a : (0, build_id_12.loadBuildId)();\n const pathPrefix = buildId ? `${buildId}/` : null;\n const manifestPath = (_b = cfg.manifestPath) !== null && _b !== void 0 ? _b : 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, _b2, _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}: ${(_b2 = err === null || err === void 0 ? void 0 : err.message) !== null && _b2 !== void 0 ? _b2 : 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 let tag;\n let p;\n if (pathPrefix) {\n if (!tagPk.startsWith(pathPrefix))\n continue;\n if (!pathPk.startsWith(pathPrefix))\n continue;\n tag = tagPk.slice(pathPrefix.length);\n p = pathPk.slice(pathPrefix.length);\n } else {\n const tIdx = tagPk.indexOf(\"/\");\n const pIdx = pathPk.indexOf(\"/\");\n if (tIdx < 0 || pIdx < 0)\n continue;\n if (tagPk.slice(0, tIdx) !== pathPk.slice(0, pIdx))\n continue;\n tag = tagPk.slice(tIdx + 1);\n p = pathPk.slice(pIdx + 1);\n }\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: buildId=${buildId !== null && buildId !== void 0 ? buildId : \"(auto)\"} 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 if (buildId) {\n const rel = stripLeadingSlash2(p);\n urls.add(`https://${hostname}/_next/data/${buildId}/${rel || \"index\"}.json`);\n }\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 (_b2) {\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 build_id_1 = require_build_id();\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 /**\n * 拼 TableStore tag 主键:`{buildId}/{tag}`。\n *\n * 使用 BUILD_ID(Next.js 构建产物身份)而非 cfg.version(ESA 平台版本号),\n * 原因:同一个 buildId 内 manifest 与 tag 行身份严格一致,避免\n * 部署侧注入 ESA_CACHE_GW_VERSION 与构建期 BUILD_ID 不一致时 key 全部错位。\n *\n * BUILD_ID 读不到(老 bundle / 错误可靠度) → 降级为不加前缀,与老版本行为兼容。\n */\n buildTagKey(tag) {\n const buildId = (0, build_id_1.loadBuildId)();\n const prefix = buildId ? `${buildId}/` : \"\";\n return `${prefix}${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 console.log(`[tagCache] writeTags: tag=\"${tagStr}\" key=\"${tagKey}\" ts=${writeTs}`);\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 tagKeys = tags.map((tag) => this.buildTagKey(tag));\n console.log(`[tagCache] batchGetTags: tags=${JSON.stringify(tags)} keys=${JSON.stringify(tagKeys)}`);\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
  };
@@ -17,16 +17,16 @@ export default class GatewayIncrementalCache {
17
17
  /**
18
18
  * 从 Gateway 读取缓存。
19
19
  */
20
- get(key: string, isFetch?: boolean): Promise<{
20
+ get(key: string, isFetch?: boolean | string): Promise<{
21
21
  value: any;
22
22
  lastModified: number;
23
23
  } | null>;
24
24
  /**
25
25
  * 向 Gateway 写入缓存。
26
26
  */
27
- set(key: string, value: any, isFetch?: boolean): Promise<void>;
27
+ set(key: string, value: any, isFetch?: boolean | string): Promise<void>;
28
28
  /**
29
29
  * 通过 Gateway 删除缓存。
30
30
  */
31
- delete(key: string, isFetch?: boolean): Promise<void>;
31
+ delete(key: string, isFetch?: boolean | string): Promise<void>;
32
32
  }
@@ -13,12 +13,19 @@ const gateway_auth_1 = require("../../runtime/gateway-auth");
13
13
  const GET_TIMEOUT = 5000;
14
14
  const SET_TIMEOUT = 10000;
15
15
  const DELETE_TIMEOUT = 5000;
16
- function buildKey(config, key, isFetch) {
16
+ function buildKey(config, key, isFetchOrType) {
17
+ let cacheType;
18
+ if (typeof isFetchOrType === 'string') {
19
+ cacheType = isFetchOrType === 'fetch' ? 'fetch' : 'cache';
20
+ }
21
+ else {
22
+ cacheType = isFetchOrType ? 'fetch' : 'cache';
23
+ }
17
24
  return (0, protocol_1.buildOssKey)({
18
25
  appId: `${config.aliuid}/${config.routinename}`,
19
26
  buildId: config.version,
20
27
  key,
21
- cacheType: isFetch ? 'fetch' : 'cache',
28
+ cacheType,
22
29
  });
23
30
  }
24
31
  class GatewayIncrementalCache {
@@ -157,4 +164,4 @@ class GatewayIncrementalCache {
157
164
  }
158
165
  }
159
166
  exports.default = GatewayIncrementalCache;
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdmVycmlkZXMvaW5jcmVtZW50YWxDYWNoZS9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOztBQUVILDRDQUE0QztBQUM1Qyw2REFJb0M7QUFFcEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFFNUIsU0FBUyxRQUFRLENBQ2YsTUFBeUIsRUFDekIsR0FBVyxFQUNYLE9BQWlCO0lBRWpCLE9BQU8sSUFBQSxzQkFBVyxFQUFDO1FBQ2pCLEtBQUssRUFBRSxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtRQUMvQyxPQUFPLEVBQUUsTUFBTSxDQUFDLE9BQU87UUFDdkIsR0FBRztRQUNILFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTztLQUN2QyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBcUIsdUJBQXVCO0lBQTVDO1FBQ0UsU0FBSSxHQUFHLDJCQUFvQyxDQUFDO1FBRXBDLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBQ3hDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO0lBcUsvQixDQUFDO0lBbktDOztPQUVHO0lBQ0ssU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBQSxvQ0FBcUIsR0FBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxHQUFHLENBQ1AsR0FBVyxFQUNYLE9BQWlCO1FBRWpC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Z0JBQ2hCLFNBQVMsRUFBRSxjQUFjO2FBQzFCLENBQUMsQ0FBQztZQUVILElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHO2dCQUFFLE9BQU87WUFFL0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUU7Z0JBQ1gsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRTtvQkFDNUMsT0FBTyxDQUFDLEtBQUssQ0FDWCx1Q0FBdUMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLHlCQUF5QixDQUN2RixDQUFDO2lCQUNIO3FCQUFNO29CQUNMLE9BQU8sQ0FBQyxJQUFJLENBQ1Ysc0NBQXNDLE1BQU0sVUFBVSxHQUFHLENBQUMsTUFBTSxFQUFFLENBQ25FLENBQUM7aUJBQ0g7YUFDRjtTQUNGO1FBQUMsT0FBTyxHQUFRLEVBQUU7WUFDakIsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTtnQkFDN0IsT0FBTyxDQUFDLElBQUksQ0FDVixzQ0FBc0MsTUFBTSxNQUFNLGNBQWMsS0FBSyxDQUN0RSxDQUFDO2FBQ0g7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FDVixzQ0FBc0MsTUFBTSxNQUFNLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FDaEUsQ0FBQzthQUNIO1NBQ0Y7SUFDSCxDQUFDO0NBQ0Y7QUF6S0QsMENBeUtDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHYXRld2F5IOWinumHj+e8k+WtmCBPdmVycmlkZVxuICpcbiAqIE5leHQuanMgRnVuY3Rpb24g6L+Q6KGM5pe255qE5aKe6YeP57yT5a2Y5a6e546w77yM6YCa6L+HIEdhdGV3YXkg5Luj55CG6K+75YaZIE9TU+OAglxuICog6Ym05p2D57uf5LiA6LWwIHJ1bnRpbWUvZ2F0ZXdheS1hdXRo77yISE1BQyDnrb7lkI0gKyA0IGhlYWRlcu+8ieOAglxuICpcbiAqIEBzZWUgc3BlY3MvcnVudGltZS9pbmNyZW1lbnRhbC1jYWNoZS1vdmVycmlkZS5zcGVjLm1kXG4gKi9cblxuaW1wb3J0IHsgYnVpbGRPc3NLZXkgfSBmcm9tICdAcGNnL3Byb3RvY29sJztcbmltcG9ydCB7XG4gIGxvYWRHYXRld2F5QXV0aENvbmZpZyxcbiAgZ2F0ZXdheUZldGNoLFxuICBHYXRld2F5QXV0aENvbmZpZyxcbn0gZnJvbSAnLi4vLi4vcnVudGltZS9nYXRld2F5LWF1dGgnO1xuXG5jb25zdCBHRVRfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBTRVRfVElNRU9VVCA9IDEwMDAwO1xuY29uc3QgREVMRVRFX1RJTUVPVVQgPSA1MDAwO1xuXG5mdW5jdGlvbiBidWlsZEtleShcbiAgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyxcbiAga2V5OiBzdHJpbmcsXG4gIGlzRmV0Y2g/OiBib29sZWFuXG4pOiBzdHJpbmcge1xuICByZXR1cm4gYnVpbGRPc3NLZXkoe1xuICAgIGFwcElkOiBgJHtjb25maWcuYWxpdWlkfS8ke2NvbmZpZy5yb3V0aW5lbmFtZX1gLFxuICAgIGJ1aWxkSWQ6IGNvbmZpZy52ZXJzaW9uLFxuICAgIGtleSxcbiAgICBjYWNoZVR5cGU6IGlzRmV0Y2ggPyAnZmV0Y2gnIDogJ2NhY2hlJyxcbiAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEdhdGV3YXlJbmNyZW1lbnRhbENhY2hlIHtcbiAgbmFtZSA9ICdnYXRld2F5LWluY3JlbWVudGFsLWNhY2hlJyBhcyBjb25zdDtcblxuICBwcml2YXRlIGNvbmZpZzogR2F0ZXdheUF1dGhDb25maWcgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBjb25maWdMb2FkZWQgPSBmYWxzZTtcblxuICAvKipcbiAgICog5bu26L+f5Yqg6L296YWN572u77yM6YG/5YWN5Zyo5p6E6YCg5Ye95pWw5Lit5Zug546v5aKD5Y+Y6YeP57y65aSx6ICM6Zi75aGeIEZ1bmN0aW9uIOWQr+WKqOOAglxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb25maWcoKTogR2F0ZXdheUF1dGhDb25maWcgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMuY29uZmlnTG9hZGVkKSB7XG4gICAgICB0aGlzLmNvbmZpZyA9IGxvYWRHYXRld2F5QXV0aENvbmZpZygpO1xuICAgICAgdGhpcy5jb25maWdMb2FkZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICAvKipcbiAgICog5LuOIEdhdGV3YXkg6K+75Y+W57yT5a2Y44CCXG4gICAqL1xuICBhc3luYyBnZXQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgaXNGZXRjaD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTx7IHZhbHVlOiBhbnk7IGxhc3RNb2RpZmllZDogbnVtYmVyIH0gfCBudWxsPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIG51bGw7XG5cbiAgICBjb25zdCBvc3NLZXkgPSBidWlsZEtleShjb25maWcsIGtleSwgaXNGZXRjaCk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgYC9zdG9yYWdlLyR7b3NzS2V5fWAsIHtcbiAgICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgICAgdGltZW91dE1zOiBHRVRfVElNRU9VVCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDA0KSByZXR1cm4gbnVsbDtcblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBHRVQg6KKr5ouS57udOiBrZXk9XCIke29zc0tleX1cIiAoJHtyZXMuc3RhdHVzfSnvvIzor7fmo4Dmn6Xnrb7lkI0gc2VjcmV0IOaIliBrZXkg5YmN57yAYFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBHRVQg5aSx6LSlOiBrZXk9XCIke29zc0tleX1cIiwg54q25oCB56CBPSR7cmVzLnN0YXR1c31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IHJlcy50ZXh0KCk7XG4gICAgICBsZXQgZW52ZWxvcGU6IHsgbGFzdE1vZGlmaWVkPzogdW5rbm93bjsgdmFsdWU/OiB1bmtub3duIH07XG4gICAgICB0cnkge1xuICAgICAgICBlbnZlbG9wZSA9IEpTT04ucGFyc2UoYm9keSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbaW5jcmVtZW50YWxDYWNoZV0gSlNPTiDop6PmnpDlpLHotKU6IGtleT1cIiR7b3NzS2V5fVwiYCk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICAhZW52ZWxvcGUgfHxcbiAgICAgICAgdHlwZW9mIGVudmVsb3BlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgICB0eXBlb2YgZW52ZWxvcGUubGFzdE1vZGlmaWVkICE9PSAnbnVtYmVyJ1xuICAgICAgKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIGVudmVsb3BlIOagvOW8j+W8guW4uOaIlue8uiBsYXN0TW9kaWZpZWQ6IGtleT1cIiR7b3NzS2V5fVwiYFxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IHZhbHVlOiBlbnZlbG9wZS52YWx1ZSwgbGFzdE1vZGlmaWVkOiBlbnZlbG9wZS5sYXN0TW9kaWZpZWQgfTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gR0VUIOi2heaXtjoga2V5PVwiJHtvc3NLZXl9XCIgKCR7R0VUX1RJTUVPVVR9bXMpYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gR0VUIOW8guW4uDoga2V5PVwiJHtvc3NLZXl9XCIsICR7ZXJyLm1lc3NhZ2V9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOWQkSBHYXRld2F5IOWGmeWFpee8k+WtmOOAglxuICAgKi9cbiAgYXN5bmMgc2V0KFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBhbnksXG4gICAgaXNGZXRjaD86IGJvb2xlYW5cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3NzS2V5ID0gYnVpbGRLZXkoY29uZmlnLCBrZXksIGlzRmV0Y2gpO1xuICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeSh7IGxhc3RNb2RpZmllZDogRGF0ZS5ub3coKSwgdmFsdWUgfSk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgZ2F0ZXdheUZldGNoKGNvbmZpZywgYC9zdG9yYWdlLyR7b3NzS2V5fWAsIHtcbiAgICAgICAgbWV0aG9kOiAnUFVUJyxcbiAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgIGJvZHksXG4gICAgICAgIHRpbWVvdXRNczogU0VUX1RJTUVPVVQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBQVVQg6KKr5ouS57udOiBrZXk9XCIke29zc0tleX1cIiAoJHtyZXMuc3RhdHVzfSnvvIzor7fmo4Dmn6Xnrb7lkI0gc2VjcmV0IOaIliBrZXkg5YmN57yAYFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBQVVQg5aSx6LSlOiBrZXk9XCIke29zc0tleX1cIiwg54q25oCB56CBPSR7cmVzLnN0YXR1c31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBQVVQg6LaF5pe2OiBrZXk9XCIke29zc0tleX1cIiAoJHtTRVRfVElNRU9VVH1tcylgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBQVVQg5byC5bi4OiBrZXk9XCIke29zc0tleX1cIiwgJHtlcnIubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIOmAmui/hyBHYXRld2F5IOWIoOmZpOe8k+WtmOOAglxuICAgKi9cbiAgYXN5bmMgZGVsZXRlKGtleTogc3RyaW5nLCBpc0ZldGNoPzogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybjtcblxuICAgIGNvbnN0IG9zc0tleSA9IGJ1aWxkS2V5KGNvbmZpZywga2V5LCBpc0ZldGNoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBnYXRld2F5RmV0Y2goY29uZmlnLCBgL3N0b3JhZ2UvJHtvc3NLZXl9YCwge1xuICAgICAgICBtZXRob2Q6ICdERUxFVEUnLFxuICAgICAgICB0aW1lb3V0TXM6IERFTEVURV9USU1FT1VULFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDQpIHJldHVybjtcblxuICAgICAgaWYgKCFyZXMub2spIHtcbiAgICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwMSB8fCByZXMuc3RhdHVzID09PSA0MDMpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBERUxFVEUg6KKr5ouS57udOiBrZXk9XCIke29zc0tleX1cIiAoJHtyZXMuc3RhdHVzfSnvvIzor7fmo4Dmn6Xnrb7lkI0gc2VjcmV0IOaIliBrZXkg5YmN57yAYFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBERUxFVEUg5aSx6LSlOiBrZXk9XCIke29zc0tleX1cIiwg54q25oCB56CBPSR7cmVzLnN0YXR1c31gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBERUxFVEUg6LaF5pe2OiBrZXk9XCIke29zc0tleX1cIiAoJHtERUxFVEVfVElNRU9VVH1tcylgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBERUxFVEUg5byC5bi4OiBrZXk9XCIke29zc0tleX1cIiwgJHtlcnIubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdmVycmlkZXMvaW5jcmVtZW50YWxDYWNoZS9nYXRld2F5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7OztHQU9HOztBQUVILDRDQUE0QztBQUM1Qyw2REFJb0M7QUFFcEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDO0FBQ3pCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUMxQixNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFFNUIsU0FBUyxRQUFRLENBQ2YsTUFBeUIsRUFDekIsR0FBVyxFQUNYLGFBQWdDO0lBRWhDLElBQUksU0FBaUIsQ0FBQztJQUN0QixJQUFJLE9BQU8sYUFBYSxLQUFLLFFBQVEsRUFBRTtRQUNyQyxTQUFTLEdBQUcsYUFBYSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7S0FDM0Q7U0FBTTtRQUNMLFNBQVMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO0tBQy9DO0lBQ0QsT0FBTyxJQUFBLHNCQUFXLEVBQUM7UUFDakIsS0FBSyxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxNQUFNLENBQUMsV0FBVyxFQUFFO1FBQy9DLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTztRQUN2QixHQUFHO1FBQ0gsU0FBUztLQUNWLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFxQix1QkFBdUI7SUFBNUM7UUFDRSxTQUFJLEdBQUcsMkJBQW9DLENBQUM7UUFFcEMsV0FBTSxHQUE2QixJQUFJLENBQUM7UUFDeEMsaUJBQVksR0FBRyxLQUFLLENBQUM7SUFxSy9CLENBQUM7SUFuS0M7O09BRUc7SUFDSyxTQUFTO1FBQ2YsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDdEIsSUFBSSxDQUFDLE1BQU0sR0FB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TUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFOUMsSUFBSTtZQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBQSwyQkFBWSxFQUFDLE1BQU0sRUFBRSxZQUFZLE1BQU0sRUFBRSxFQUFFO2dCQUMzRCxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsU0FBUyxFQUFFLGNBQWM7YUFDMUIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEdBQUc7Z0JBQUUsT0FBTztZQUUvQixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtnQkFDWCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO29CQUM1QyxPQUFPLENBQUMsS0FBSyxDQUNYLHVDQUF1QyxNQUFNLE1BQU0sR0FBRyxDQUFDLE1BQU0seUJBQXlCLENBQ3ZGLENBQUM7aUJBQ0g7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FDVixzQ0FBc0MsTUFBTSxVQUFVLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FDbkUsQ0FBQztpQkFDSDthQUNGO1NBQ0Y7UUFBQyxPQUFPLEdBQVEsRUFBRTtZQUNqQixJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssWUFBWSxFQUFFO2dCQUM3QixPQUFPLENBQUMsSUFBSSxDQUNWLHNDQUFzQyxNQUFNLE1BQU0sY0FBYyxLQUFLLENBQ3RFLENBQUM7YUFDSDtpQkFBTTtnQkFDTCxPQUFPLENBQUMsSUFBSSxDQUNWLHNDQUFzQyxNQUFNLE1BQU0sR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUNoRSxDQUFDO2FBQ0g7U0FDRjtJQUNILENBQUM7Q0FDRjtBQXpLRCwwQ0F5S0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdhdGV3YXkg5aKe6YeP57yT5a2YIE92ZXJyaWRlXG4gKlxuICogTmV4dC5qcyBGdW5jdGlvbiDov5DooYzml7bnmoTlop7ph4/nvJPlrZjlrp7njrDvvIzpgJrov4cgR2F0ZXdheSDku6PnkIbor7vlhpkgT1NT44CCXG4gKiDpibTmnYPnu5/kuIDotbAgcnVudGltZS9nYXRld2F5LWF1dGjvvIhITUFDIOetvuWQjSArIDQgaGVhZGVy77yJ44CCXG4gKlxuICogQHNlZSBzcGVjcy9ydW50aW1lL2luY3JlbWVudGFsLWNhY2hlLW92ZXJyaWRlLnNwZWMubWRcbiAqL1xuXG5pbXBvcnQgeyBidWlsZE9zc0tleSB9IGZyb20gJ0BwY2cvcHJvdG9jb2wnO1xuaW1wb3J0IHtcbiAgbG9hZEdhdGV3YXlBdXRoQ29uZmlnLFxuICBnYXRld2F5RmV0Y2gsXG4gIEdhdGV3YXlBdXRoQ29uZmlnLFxufSBmcm9tICcuLi8uLi9ydW50aW1lL2dhdGV3YXktYXV0aCc7XG5cbmNvbnN0IEdFVF9USU1FT1VUID0gNTAwMDtcbmNvbnN0IFNFVF9USU1FT1VUID0gMTAwMDA7XG5jb25zdCBERUxFVEVfVElNRU9VVCA9IDUwMDA7XG5cbmZ1bmN0aW9uIGJ1aWxkS2V5KFxuICBjb25maWc6IEdhdGV3YXlBdXRoQ29uZmlnLFxuICBrZXk6IHN0cmluZyxcbiAgaXNGZXRjaE9yVHlwZT86IGJvb2xlYW4gfCBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGxldCBjYWNoZVR5cGU6IHN0cmluZztcbiAgaWYgKHR5cGVvZiBpc0ZldGNoT3JUeXBlID09PSAnc3RyaW5nJykge1xuICAgIGNhY2hlVHlwZSA9IGlzRmV0Y2hPclR5cGUgPT09ICdmZXRjaCcgPyAnZmV0Y2gnIDogJ2NhY2hlJztcbiAgfSBlbHNlIHtcbiAgICBjYWNoZVR5cGUgPSBpc0ZldGNoT3JUeXBlID8gJ2ZldGNoJyA6ICdjYWNoZSc7XG4gIH1cbiAgcmV0dXJuIGJ1aWxkT3NzS2V5KHtcbiAgICBhcHBJZDogYCR7Y29uZmlnLmFsaXVpZH0vJHtjb25maWcucm91dGluZW5hbWV9YCxcbiAgICBidWlsZElkOiBjb25maWcudmVyc2lvbixcbiAgICBrZXksXG4gICAgY2FjaGVUeXBlLFxuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2F0ZXdheUluY3JlbWVudGFsQ2FjaGUge1xuICBuYW1lID0gJ2dhdGV3YXktaW5jcmVtZW50YWwtY2FjaGUnIGFzIGNvbnN0O1xuXG4gIHByaXZhdGUgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbmZpZ0xvYWRlZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiDlu7bov5/liqDovb3phY3nva7vvIzpgb/lhY3lnKjmnoTpgKDlh73mlbDkuK3lm6Dnjq/looPlj5jph4/nvLrlpLHogIzpmLvloZ4gRnVuY3Rpb24g5ZCv5Yqo44CCXG4gICAqL1xuICBwcml2YXRlIGdldENvbmZpZygpOiBHYXRld2F5QXV0aENvbmZpZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5jb25maWdMb2FkZWQpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gbG9hZEdhdGV3YXlBdXRoQ29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZ0xvYWRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIC8qKlxuICAgKiDku44gR2F0ZXdheSDor7vlj5bnvJPlrZjjgIJcbiAgICovXG4gIGFzeW5jIGdldChcbiAgICBrZXk6IHN0cmluZyxcbiAgICBpc0ZldGNoPzogYm9vbGVhbiB8IHN0cmluZ1xuICApOiBQcm9taXNlPHsgdmFsdWU6IGFueTsgbGFzdE1vZGlmaWVkOiBudW1iZXIgfSB8IG51bGw+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gbnVsbDtcblxuICAgIGNvbnN0IG9zc0tleSA9IGJ1aWxkS2V5KGNvbmZpZywga2V5LCBpc0ZldGNoKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBnYXRld2F5RmV0Y2goY29uZmlnLCBgL3N0b3JhZ2UvJHtvc3NLZXl9YCwge1xuICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICB0aW1lb3V0TXM6IEdFVF9USU1FT1VULFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDQpIHJldHVybiBudWxsO1xuXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDAxIHx8IHJlcy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIEdFVCDooqvmi5Lnu506IGtleT1cIiR7b3NzS2V5fVwiICgke3Jlcy5zdGF0dXN9Ke+8jOivt+ajgOafpeetvuWQjSBzZWNyZXQg5oiWIGtleSDliY3nvIBgXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIEdFVCDlpLHotKU6IGtleT1cIiR7b3NzS2V5fVwiLCDnirbmgIHnoIE9JHtyZXMuc3RhdHVzfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgcmVzLnRleHQoKTtcbiAgICAgIGxldCBlbnZlbG9wZTogeyBsYXN0TW9kaWZpZWQ/OiB1bmtub3duOyB2YWx1ZT86IHVua25vd24gfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGVudmVsb3BlID0gSlNPTi5wYXJzZShib2R5KTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICBjb25zb2xlLndhcm4oYFtpbmNyZW1lbnRhbENhY2hlXSBKU09OIOino+aekOWksei0pToga2V5PVwiJHtvc3NLZXl9XCJgKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgICFlbnZlbG9wZSB8fFxuICAgICAgICB0eXBlb2YgZW52ZWxvcGUgIT09ICdvYmplY3QnIHx8XG4gICAgICAgIHR5cGVvZiBlbnZlbG9wZS5sYXN0TW9kaWZpZWQgIT09ICdudW1iZXInXG4gICAgICApIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBbaW5jcmVtZW50YWxDYWNoZV0gZW52ZWxvcGUg5qC85byP5byC5bi45oiW57y6IGxhc3RNb2RpZmllZDoga2V5PVwiJHtvc3NLZXl9XCJgXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHsgdmFsdWU6IGVudmVsb3BlLnZhbHVlLCBsYXN0TW9kaWZpZWQ6IGVudmVsb3BlLmxhc3RNb2RpZmllZCB9O1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBpZiAoZXJyLm5hbWUgPT09ICdBYm9ydEVycm9yJykge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBHRVQg6LaF5pe2OiBrZXk9XCIke29zc0tleX1cIiAoJHtHRVRfVElNRU9VVH1tcylgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtpbmNyZW1lbnRhbENhY2hlXSBHRVQg5byC5bi4OiBrZXk9XCIke29zc0tleX1cIiwgJHtlcnIubWVzc2FnZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog5ZCRIEdhdGV3YXkg5YaZ5YWl57yT5a2Y44CCXG4gICAqL1xuICBhc3luYyBzZXQoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IGFueSxcbiAgICBpc0ZldGNoPzogYm9vbGVhbiB8IHN0cmluZ1xuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm47XG5cbiAgICBjb25zdCBvc3NLZXkgPSBidWlsZEtleShjb25maWcsIGtleSwgaXNGZXRjaCk7XG4gICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KHsgbGFzdE1vZGlmaWVkOiBEYXRlLm5vdygpLCB2YWx1ZSB9KTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBnYXRld2F5RmV0Y2goY29uZmlnLCBgL3N0b3JhZ2UvJHtvc3NLZXl9YCwge1xuICAgICAgICBtZXRob2Q6ICdQVVQnLFxuICAgICAgICBoZWFkZXJzOiB7ICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicgfSxcbiAgICAgICAgYm9keSxcbiAgICAgICAgdGltZW91dE1zOiBTRVRfVElNRU9VVCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDAxIHx8IHJlcy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIFBVVCDooqvmi5Lnu506IGtleT1cIiR7b3NzS2V5fVwiICgke3Jlcy5zdGF0dXN9Ke+8jOivt+ajgOafpeetvuWQjSBzZWNyZXQg5oiWIGtleSDliY3nvIBgXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIFBVVCDlpLHotKU6IGtleT1cIiR7b3NzS2V5fVwiLCDnirbmgIHnoIE9JHtyZXMuc3RhdHVzfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIFBVVCDotoXml7Y6IGtleT1cIiR7b3NzS2V5fVwiICgke1NFVF9USU1FT1VUfW1zKWBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIFBVVCDlvILluLg6IGtleT1cIiR7b3NzS2V5fVwiLCAke2Vyci5tZXNzYWdlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICog6YCa6L+HIEdhdGV3YXkg5Yig6Zmk57yT5a2Y44CCXG4gICAqL1xuICBhc3luYyBkZWxldGUoa2V5OiBzdHJpbmcsIGlzRmV0Y2g/OiBib29sZWFuIHwgc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3NzS2V5ID0gYnVpbGRLZXkoY29uZmlnLCBrZXksIGlzRmV0Y2gpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdhdGV3YXlGZXRjaChjb25maWcsIGAvc3RvcmFnZS8ke29zc0tleX1gLCB7XG4gICAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICAgIHRpbWVvdXRNczogREVMRVRFX1RJTUVPVVQsXG4gICAgICB9KTtcblxuICAgICAgaWYgKHJlcy5zdGF0dXMgPT09IDQwNCkgcmV0dXJuO1xuXG4gICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDAxIHx8IHJlcy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIERFTEVURSDooqvmi5Lnu506IGtleT1cIiR7b3NzS2V5fVwiICgke3Jlcy5zdGF0dXN9Ke+8jOivt+ajgOafpeetvuWQjSBzZWNyZXQg5oiWIGtleSDliY3nvIBgXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIERFTEVURSDlpLHotKU6IGtleT1cIiR7b3NzS2V5fVwiLCDnirbmgIHnoIE9JHtyZXMuc3RhdHVzfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIERFTEVURSDotoXml7Y6IGtleT1cIiR7b3NzS2V5fVwiICgke0RFTEVURV9USU1FT1VUfW1zKWBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2luY3JlbWVudGFsQ2FjaGVdIERFTEVURSDlvILluLg6IGtleT1cIiR7b3NzS2V5fVwiLCAke2Vyci5tZXNzYWdlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -136,6 +136,7 @@ class GatewayTagCache {
136
136
  const stale = typeof input === 'string' ? undefined : input.stale;
137
137
  const expire = typeof input === 'string' ? undefined : input.expire;
138
138
  const tagKey = this.buildTagKey(tagStr);
139
+ console.log(`[tagCache] writeTags: tag="${tagStr}" key="${tagKey}" ts=${writeTs}`);
139
140
  const columns = [
140
141
  { name: 'revalidatedAt', value: writeTs },
141
142
  ];
@@ -172,6 +173,8 @@ class GatewayTagCache {
172
173
  // ---- private methods ----
173
174
  async batchGetTags(config, tags) {
174
175
  var _a, _b;
176
+ const tagKeys = tags.map(tag => this.buildTagKey(tag));
177
+ console.log(`[tagCache] batchGetTags: tags=${JSON.stringify(tags)} keys=${JSON.stringify(tagKeys)}`);
175
178
  const primaryKeys = tags.map(tag => [
176
179
  { name: 'app_id', value: `${config.aliuid}/${config.routinename}` },
177
180
  { name: 'tag', value: this.buildTagKey(tag) },
@@ -247,4 +250,4 @@ class GatewayTagCache {
247
250
  }
248
251
  }
249
252
  exports.default = GatewayTagCache;
250
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdmVycmlkZXMvdGFnQ2FjaGUvZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7O0FBRUgsNkRBSW9DO0FBQ3BDLHVEQUlpQztBQUNqQyxxREFBcUQ7QUFFckQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDO0FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUM7QUFFdkIsU0FBUyxpQkFBaUIsQ0FBQyxDQUFTO0lBQ2xDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQWdCRCxNQUFxQixlQUFlO0lBQXBDO1FBQ0UsU0FBSSxHQUFHLG1CQUE0QixDQUFDO1FBQ3BDLFNBQUksR0FBRyxVQUFtQixDQUFDO1FBRW5CLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBQ3hDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXJCLGdCQUFXLEdBQTBCLElBQUksQ0FBQztRQUMxQyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7SUFnUXBDLENBQUM7SUE5UFMsU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBQSxvQ0FBcUIsR0FBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsTUFBTSxHQUFHLEdBQUcsSUFBQSw4QkFBa0IsR0FBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFBLGdDQUFvQixFQUFD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LENBQUMsQ0FBQztnQkFFSCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFO29CQUM1QyxPQUFPLENBQUMsS0FBSyxDQUNYLG9DQUFvQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQ2xELENBQUM7b0JBQ0YsT0FBTztpQkFDUjtnQkFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRTtvQkFDWCxPQUFPLENBQUMsSUFBSSxDQUFDLHlDQUF5QyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztpQkFDckU7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7aUJBQ2hFO2FBQ0Y7WUFBQyxPQUFPLEdBQVEsRUFBRTtnQkFDakIsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRTtvQkFDN0IsT0FBTyxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsYUFBYSxLQUFLLENBQUMsQ0FBQztpQkFDckU7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7aUJBQzlEO2FBQ0Y7U0FDRjtJQUNILENBQUM7Q0FDRjtBQXhRRCxrQ0F3UUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdhdGV3YXkgVGFnIOe8k+WtmCBPdmVycmlkZSAobmV4dE1vZGUpXG4gKlxuICog5L2/55SoIE9wZW5OZXh0IOeahCBuZXh0TW9kZSDmjqXlj6PvvIzpgJrov4cgR2F0ZXdheSDku6PnkIbor7vlhpkgVGFibGVTdG9yZeOAglxuICog6Ym05p2D57uf5LiA6LWwIHJ1bnRpbWUvZ2F0ZXdheS1hdXRo77yISE1BQyDnrb7lkI0gKyA0IGhlYWRlcu+8ieOAglxuICovXG5cbmltcG9ydCB7XG4gIGxvYWRHYXRld2F5QXV0aENvbmZpZyxcbiAgZ2F0ZXdheUZldGNoLFxuICBHYXRld2F5QXV0aENvbmZpZyxcbn0gZnJvbSAnLi4vLi4vcnVudGltZS9nYXRld2F5LWF1dGgnO1xuaW1wb3J0IHtcbiAgbG9hZENkblB1cmdlQ29uZmlnLFxuICBjcmVhdGVDZG5QdXJnZUNsaWVudCxcbiAgQ2RuUHVyZ2VDbGllbnQsXG59IGZyb20gJy4uLy4uL3J1bnRpbWUvY2RuLXB1cmdlJztcbmltcG9ydCB7IGxvYWRCdWlsZElkIH0gZnJvbSAnLi4vLi4vcnVudGltZS9idWlsZC1pZCc7XG5cbmNvbnN0IFFVRVJZX1RJTUVPVVQgPSAzMDAwO1xuY29uc3QgV1JJVEVfVElNRU9VVCA9IDUwMDA7XG5jb25zdCBCQVRDSF9TSVpFID0gMjAwO1xuXG5mdW5jdGlvbiBzdHJpcExlYWRpbmdTbGFzaChzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gcy5yZXBsYWNlKC9eXFwvKy8sICcnKTtcbn1cblxudHlwZSBOZXh0TW9kZVRhZ0NhY2hlV3JpdGVJbnB1dCA9XG4gIHwgc3RyaW5nXG4gIHwge1xuICAgICAgdGFnOiBzdHJpbmc7XG4gICAgICBzdGFsZT86IG51bWJlcjtcbiAgICAgIGV4cGlyZT86IG51bWJlcjtcbiAgICB9O1xuXG5pbnRlcmZhY2UgVGFnUm93IHtcbiAgcmV2YWxpZGF0ZWRBdD86IG51bWJlcjtcbiAgc3RhbGU/OiBudW1iZXI7XG4gIGV4cGlyZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2F0ZXdheVRhZ0NhY2hlIHtcbiAgbmFtZSA9ICdnYXRld2F5LXRhZy1jYWNoZScgYXMgY29uc3Q7XG4gIG1vZGUgPSAnbmV4dE1vZGUnIGFzIGNvbnN0O1xuXG4gIHByaXZhdGUgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIGNvbmZpZ0xvYWRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcHVyZ2VDbGllbnQ6IENkblB1cmdlQ2xpZW50IHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgcHVyZ2VDbGllbnRMb2FkZWQgPSBmYWxzZTtcblxuICBwcml2YXRlIGdldENvbmZpZygpOiBHYXRld2F5QXV0aENvbmZpZyB8IG51bGwge1xuICAgIGlmICghdGhpcy5jb25maWdMb2FkZWQpIHtcbiAgICAgIHRoaXMuY29uZmlnID0gbG9hZEdhdGV3YXlBdXRoQ29uZmlnKCk7XG4gICAgICB0aGlzLmNvbmZpZ0xvYWRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbmZpZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UHVyZ2VDbGllbnQoKTogQ2RuUHVyZ2VDbGllbnQgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMucHVyZ2VDbGllbnRMb2FkZWQpIHtcbiAgICAgIGNvbnN0IGNmZyA9IGxvYWRDZG5QdXJnZUNvbmZpZygpO1xuICAgICAgdGhpcy5wdXJnZUNsaWVudCA9IGNmZyA/IGNyZWF0ZUNkblB1cmdlQ2xpZW50KGNmZykgOiBudWxsO1xuICAgICAgdGhpcy5wdXJnZUNsaWVudExvYWRlZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnB1cmdlQ2xpZW50O1xuICB9XG5cbiAgLyoqXG4gICAqIOaLvCBUYWJsZVN0b3JlIHRhZyDkuLvplK46YHtidWlsZElkfS97dGFnfWDjgIJcbiAgICpcbiAgICog5L2/55SoIEJVSUxEX0lEKE5leHQuanMg5p6E5bu65Lqn54mp6Lqr5Lu9KeiAjOmdniBjZmcudmVyc2lvbihFU0Eg5bmz5Y+w54mI5pys5Y+3KSxcbiAgICog5Y6f5ZugOuWQjOS4gOS4qiBidWlsZElkIOWGhSBtYW5pZmVzdCDkuI4gdGFnIOihjOi6q+S7veS4peagvOS4gOiHtCzpgb/lhY1cbiAgICog6YOo572y5L6n5rOo5YWlIEVTQV9DQUNIRV9HV19WRVJTSU9OIOS4juaehOW7uuacnyBCVUlMRF9JRCDkuI3kuIDoh7Tml7Yga2V5IOWFqOmDqOmUmeS9jeOAglxuICAgKlxuICAgKiBCVUlMRF9JRCDor7vkuI3liLAo6ICBIGJ1bmRsZSAvIOmUmeivr+WPr+mdoOW6pikg4oaSIOmZjee6p+S4uuS4jeWKoOWJjee8gCzkuI7ogIHniYjmnKzooYzkuLrlhbzlrrnjgIJcbiAgICovXG4gIHByaXZhdGUgYnVpbGRUYWdLZXkodGFnOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGJ1aWxkSWQgPSBsb2FkQnVpbGRJZCgpO1xuICAgIGNvbnN0IHByZWZpeCA9IGJ1aWxkSWQgPyBgJHtidWlsZElkfS9gIDogJyc7XG4gICAgcmV0dXJuIGAke3ByZWZpeH0ke3N0cmlwTGVhZGluZ1NsYXNoKHRhZyl9YDtcbiAgfVxuXG4gIGFzeW5jIGdldExhc3RSZXZhbGlkYXRlZCh0YWdzOiBzdHJpbmdbXSk6IFByb21pc2U8bnVtYmVyPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIDA7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuYmF0Y2hHZXRUYWdzKGNvbmZpZywgdGFncyk7XG4gICAgICBsZXQgbWF4UmV2YWxpZGF0ZWRBdCA9IDA7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGlmIChyb3cucmV2YWxpZGF0ZWRBdCAmJiByb3cucmV2YWxpZGF0ZWRBdCA+IG1heFJldmFsaWRhdGVkQXQpIHtcbiAgICAgICAgICBtYXhSZXZhbGlkYXRlZEF0ID0gcm93LnJldmFsaWRhdGVkQXQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXhSZXZhbGlkYXRlZEF0O1xuICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gZ2V0TGFzdFJldmFsaWRhdGVkIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaGFzQmVlblJldmFsaWRhdGVkKFxuICAgIHRhZ3M6IHN0cmluZ1tdLFxuICAgIGxhc3RNb2RpZmllZD86IG51bWJlclxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFncy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5iYXRjaEdldFRhZ3MoY29uZmlnLCB0YWdzKTtcbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zdCBsbSA9IGxhc3RNb2RpZmllZCA/PyAwO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGlmIChyb3cuZXhwaXJlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBpZiAocm93LmV4cGlyZSA8PSBub3cgJiYgcm93LmV4cGlyZSA+IGxtKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvdy5yZXZhbGlkYXRlZEF0ICE9PSB1bmRlZmluZWQgJiYgcm93LnJldmFsaWRhdGVkQXQgPiBsbSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBoYXNCZWVuUmV2YWxpZGF0ZWQgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgaXNTdGFsZSh0YWdzOiBzdHJpbmdbXSwgbGFzdE1vZGlmaWVkPzogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5nZXRDb25maWcoKTtcbiAgICBpZiAoIWNvbmZpZykgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYgKHRhZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3Qgcm93cyA9IGF3YWl0IHRoaXMuYmF0Y2hHZXRUYWdzKGNvbmZpZywgdGFncyk7XG4gICAgICBjb25zdCBsbSA9IGxhc3RNb2RpZmllZCA/PyAwO1xuXG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgICAgIGlmIChyb3cuc3RhbGUgPT09IHVuZGVmaW5lZCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHJldmFsaWRhdGVkQXQgPSByb3cucmV2YWxpZGF0ZWRBdCA/PyAwO1xuICAgICAgICBpZiAocmV2YWxpZGF0ZWRBdCA+IGxtICYmIHJvdy5zdGFsZSA+PSBsbSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBpc1N0YWxlIGVycm9yOiAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHdyaXRlVGFncyh0YWdzOiBOZXh0TW9kZVRhZ0NhY2hlV3JpdGVJbnB1dFtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCF0YWdzIHx8IHRhZ3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm47XG5cbiAgICBjb25zdCB3cml0ZVRzID0gRGF0ZS5ub3coKTtcblxuICAgIGNvbnN0IHJvd3MgPSB0YWdzLm1hcChpbnB1dCA9PiB7XG4gICAgICBjb25zdCB0YWdTdHIgPSB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnID8gaW5wdXQgOiBpbnB1dC50YWc7XG4gICAgICBjb25zdCBzdGFsZSA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyB1bmRlZmluZWQgOiBpbnB1dC5zdGFsZTtcbiAgICAgIGNvbnN0IGV4cGlyZSA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyB1bmRlZmluZWQgOiBpbnB1dC5leHBpcmU7XG4gICAgICBjb25zdCB0YWdLZXkgPSB0aGlzLmJ1aWxkVGFnS2V5KHRhZ1N0cik7XG5cbiAgICAgIGNvbnN0IGNvbHVtbnM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH1bXSA9IFtcbiAgICAgICAgeyBuYW1lOiAncmV2YWxpZGF0ZWRBdCcsIHZhbHVlOiB3cml0ZVRzIH0sXG4gICAgICBdO1xuICAgICAgaWYgKHN0YWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKHsgbmFtZTogJ3N0YWxlJywgdmFsdWU6IHN0YWxlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGV4cGlyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbHVtbnMucHVzaCh7IG5hbWU6ICdleHBpcmUnLCB2YWx1ZTogZXhwaXJlIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcmltYXJ5S2V5OiBbXG4gICAgICAgICAgeyBuYW1lOiAnYXBwX2lkJywgdmFsdWU6IGAke2NvbmZpZy5hbGl1aWR9LyR7Y29uZmlnLnJvdXRpbmVuYW1lfWAgfSxcbiAgICAgICAgICB7IG5hbWU6ICd0YWcnLCB2YWx1ZTogdGFnS2V5IH0sXG4gICAgICAgIF0sXG4gICAgICAgIGNvbHVtbnMsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5iYXRjaFdyaXRlKGNvbmZpZywgcm93cyk7XG5cbiAgICAvLyDlhpnlupPmiJDlip/lkI4sZmlyZS1hbmQtZm9yZ2V0IOinpuWPkSBFU0Eg6L6557yY57yT5a2Y5aSx5pWI44CCXG4gICAgLy8g5Lu75L2V5aSx6LSl6YO95LiN5bqU5Zue54GM5Yiw6LCD55So5pa5LOaJgOS7pSBjYXRjaCDnm7TmjqUgd2FybizkuI0gdGhyb3fjgIHkuI0gYXdhaXTjgIJcbiAgICBjb25zdCBwdXJnZUNsaWVudCA9IHRoaXMuZ2V0UHVyZ2VDbGllbnQoKTtcbiAgICBpZiAocHVyZ2VDbGllbnQpIHtcbiAgICAgIGNvbnN0IHRhZ1N0cnMgPSB0YWdzXG4gICAgICAgIC5tYXAodCA9PiAodHlwZW9mIHQgPT09ICdzdHJpbmcnID8gdCA6IHQudGFnKSlcbiAgICAgICAgLmZpbHRlcigocyk6IHMgaXMgc3RyaW5nID0+IHR5cGVvZiBzID09PSAnc3RyaW5nJyAmJiBzLmxlbmd0aCA+IDApO1xuICAgICAgaWYgKHRhZ1N0cnMubGVuZ3RoID4gMCkge1xuICAgICAgICBwdXJnZUNsaWVudC5wdXJnZUJ5VGFncyh0YWdTdHJzKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBwdXJnZSBmYW4tb3V0IGZhaWxlZDogJHtlcnI/Lm1lc3NhZ2UgPz8gZXJyfWApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAtLS0tIHByaXZhdGUgbWV0aG9kcyAtLS0tXG5cbiAgcHJpdmF0ZSBhc3luYyBiYXRjaEdldFRhZ3MoXG4gICAgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyxcbiAgICB0YWdzOiBzdHJpbmdbXVxuICApOiBQcm9taXNlPFRhZ1Jvd1tdPiB7XG4gICAgY29uc3QgcHJpbWFyeUtleXMgPSB0YWdzLm1hcCh0YWcgPT4gW1xuICAgICAgeyBuYW1lOiAnYXBwX2lkJywgdmFsdWU6IGAke2NvbmZpZy5hbGl1aWR9LyR7Y29uZmlnLnJvdXRpbmVuYW1lfWAgfSxcbiAgICAgIHsgbmFtZTogJ3RhZycsIHZhbHVlOiB0aGlzLmJ1aWxkVGFnS2V5KHRhZykgfSxcbiAgICBdKTtcblxuICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdhdGV3YXlGZXRjaChjb25maWcsICcvdGFibGUvYmF0Y2gtZ2V0LXJvdycsIHtcbiAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHByaW1hcnlLZXlzIH0pLFxuICAgICAgdGltZW91dE1zOiBRVUVSWV9USU1FT1VULFxuICAgIH0pO1xuXG4gICAgaWYgKCFyZXMub2spIHtcbiAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDEgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgYFt0YWdDYWNoZV0gYmF0Y2gtZ2V0LXJvdyByZWplY3RlZCAoJHtyZXMuc3RhdHVzfSlgXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gYmF0Y2gtZ2V0LXJvdyBmYWlsZWQ6IHN0YXR1cz0ke3Jlcy5zdGF0dXN9YCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YSA9IChhd2FpdCByZXMuanNvbigpKSBhcyB7XG4gICAgICByb3dzPzoge1xuICAgICAgICBwcmltYXJ5S2V5PzogYW55W107XG4gICAgICAgIGNvbHVtbnM/OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IG51bWJlciB9W107XG4gICAgICB9W107XG4gICAgfTtcblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFt0YWdDYWNoZV0gYmF0Y2gtZ2V0LXJvdyBvazogdGFncz0ke3RhZ3MubGVuZ3RofSByb3dzPSR7ZGF0YS5yb3dzPy5sZW5ndGggPz8gMH1gXG4gICAgKTtcblxuICAgIGlmICghZGF0YS5yb3dzKSByZXR1cm4gW107XG5cbiAgICByZXR1cm4gZGF0YS5yb3dzLm1hcChyb3cgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0OiBUYWdSb3cgPSB7fTtcbiAgICAgIGZvciAoY29uc3QgY29sIG9mIHJvdy5jb2x1bW5zID8/IFtdKSB7XG4gICAgICAgIGlmIChjb2wubmFtZSA9PT0gJ3JldmFsaWRhdGVkQXQnICYmIHR5cGVvZiBjb2wudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmVzdWx0LnJldmFsaWRhdGVkQXQgPSBjb2wudmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29sLm5hbWUgPT09ICdzdGFsZScgJiYgdHlwZW9mIGNvbC52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICByZXN1bHQuc3RhbGUgPSBjb2wudmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoY29sLm5hbWUgPT09ICdleHBpcmUnICYmIHR5cGVvZiBjb2wudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmVzdWx0LmV4cGlyZSA9IGNvbC52YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYmF0Y2hXcml0ZShcbiAgICBjb25maWc6IEdhdGV3YXlBdXRoQ29uZmlnLFxuICAgIHJvd3M6IHtcbiAgICAgIHByaW1hcnlLZXk6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIH1bXTtcbiAgICAgIGNvbHVtbnM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIH1bXTtcbiAgICB9W11cbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHJvd3MubGVuZ3RoID09PSAwKSByZXR1cm47XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpICs9IEJBVENIX1NJWkUpIHtcbiAgICAgIGNvbnN0IGJhdGNoID0gcm93cy5zbGljZShpLCBpICsgQkFUQ0hfU0laRSk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGdhdGV3YXlGZXRjaChjb25maWcsICcvdGFibGUvYmF0Y2gtd3JpdGUnLCB7XG4gICAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgaGVhZGVyczogeyAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyByb3dzOiBiYXRjaCB9KSxcbiAgICAgICAgICB0aW1lb3V0TXM6IFdSSVRFX1RJTUVPVVQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChyZXMuc3RhdHVzID09PSA0MDEgfHwgcmVzLnN0YXR1cyA9PT0gNDAzKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIGBbdGFnQ2FjaGVdIGJhdGNoLXdyaXRlIHJlamVjdGVkICgke3Jlcy5zdGF0dXN9KWBcbiAgICAgICAgICApO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcmVzLm9rKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGJhdGNoLXdyaXRlIGZhaWxlZDogc3RhdHVzPSR7cmVzLnN0YXR1c31gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW3RhZ0NhY2hlXSBiYXRjaC13cml0ZSBvazogcm93cz0ke2JhdGNoLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgICAgaWYgKGVyci5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gYmF0Y2gtd3JpdGUgdGltZW91dCAoJHtXUklURV9USU1FT1VUfW1zKWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBiYXRjaC13cml0ZSBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19
253
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0ZXdheS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9vdmVycmlkZXMvdGFnQ2FjaGUvZ2F0ZXdheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7O0dBS0c7O0FBRUgsNkRBSW9DO0FBQ3BDLHVEQUlpQztBQUNqQyxxREFBcUQ7QUFFckQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDO0FBQzNCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQztBQUMzQixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQUM7QUFFdkIsU0FBUyxpQkFBaUIsQ0FBQyxDQUFTO0lBQ2xDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQWdCRCxNQUFxQixlQUFlO0lBQXBDO1FBQ0UsU0FBSSxHQUFHLG1CQUE0QixDQUFDO1FBQ3BDLFNBQUksR0FBRyxVQUFtQixDQUFDO1FBRW5CLFdBQU0sR0FBNkIsSUFBSSxDQUFDO1FBQ3hDLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBRXJCLGdCQUFXLEdBQTBCLElBQUksQ0FBQztRQUMxQyxzQkFBaUIsR0FBRyxLQUFLLENBQUM7SUF5UXBDLENBQUM7SUF2UVMsU0FBUztRQUNmLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBQSxvQ0FBcUIsR0FBRSxDQUFDO1lBQ3RDLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzFCO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUU7WUFDM0IsTUFBTSxHQUFHLEdBQUcsSUFBQSw4QkFBa0IsR0FBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFBLGdDQUFvQixFQUFD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ICogR2F0ZXdheSBUYWcg57yT5a2YIE92ZXJyaWRlIChuZXh0TW9kZSlcbiAqXG4gKiDkvb/nlKggT3Blbk5leHQg55qEIG5leHRNb2RlIOaOpeWPo++8jOmAmui/hyBHYXRld2F5IOS7o+eQhuivu+WGmSBUYWJsZVN0b3Jl44CCXG4gKiDpibTmnYPnu5/kuIDotbAgcnVudGltZS9nYXRld2F5LWF1dGjvvIhITUFDIOetvuWQjSArIDQgaGVhZGVy77yJ44CCXG4gKi9cblxuaW1wb3J0IHtcbiAgbG9hZEdhdGV3YXlBdXRoQ29uZmlnLFxuICBnYXRld2F5RmV0Y2gsXG4gIEdhdGV3YXlBdXRoQ29uZmlnLFxufSBmcm9tICcuLi8uLi9ydW50aW1lL2dhdGV3YXktYXV0aCc7XG5pbXBvcnQge1xuICBsb2FkQ2RuUHVyZ2VDb25maWcsXG4gIGNyZWF0ZUNkblB1cmdlQ2xpZW50LFxuICBDZG5QdXJnZUNsaWVudCxcbn0gZnJvbSAnLi4vLi4vcnVudGltZS9jZG4tcHVyZ2UnO1xuaW1wb3J0IHsgbG9hZEJ1aWxkSWQgfSBmcm9tICcuLi8uLi9ydW50aW1lL2J1aWxkLWlkJztcblxuY29uc3QgUVVFUllfVElNRU9VVCA9IDMwMDA7XG5jb25zdCBXUklURV9USU1FT1VUID0gNTAwMDtcbmNvbnN0IEJBVENIX1NJWkUgPSAyMDA7XG5cbmZ1bmN0aW9uIHN0cmlwTGVhZGluZ1NsYXNoKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBzLnJlcGxhY2UoL15cXC8rLywgJycpO1xufVxuXG50eXBlIE5leHRNb2RlVGFnQ2FjaGVXcml0ZUlucHV0ID1cbiAgfCBzdHJpbmdcbiAgfCB7XG4gICAgICB0YWc6IHN0cmluZztcbiAgICAgIHN0YWxlPzogbnVtYmVyO1xuICAgICAgZXhwaXJlPzogbnVtYmVyO1xuICAgIH07XG5cbmludGVyZmFjZSBUYWdSb3cge1xuICByZXZhbGlkYXRlZEF0PzogbnVtYmVyO1xuICBzdGFsZT86IG51bWJlcjtcbiAgZXhwaXJlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBHYXRld2F5VGFnQ2FjaGUge1xuICBuYW1lID0gJ2dhdGV3YXktdGFnLWNhY2hlJyBhcyBjb25zdDtcbiAgbW9kZSA9ICduZXh0TW9kZScgYXMgY29uc3Q7XG5cbiAgcHJpdmF0ZSBjb25maWc6IEdhdGV3YXlBdXRoQ29uZmlnIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgY29uZmlnTG9hZGVkID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBwdXJnZUNsaWVudDogQ2RuUHVyZ2VDbGllbnQgfCBudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBwdXJnZUNsaWVudExvYWRlZCA9IGZhbHNlO1xuXG4gIHByaXZhdGUgZ2V0Q29uZmlnKCk6IEdhdGV3YXlBdXRoQ29uZmlnIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmNvbmZpZ0xvYWRlZCkge1xuICAgICAgdGhpcy5jb25maWcgPSBsb2FkR2F0ZXdheUF1dGhDb25maWcoKTtcbiAgICAgIHRoaXMuY29uZmlnTG9hZGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQdXJnZUNsaWVudCgpOiBDZG5QdXJnZUNsaWVudCB8IG51bGwge1xuICAgIGlmICghdGhpcy5wdXJnZUNsaWVudExvYWRlZCkge1xuICAgICAgY29uc3QgY2ZnID0gbG9hZENkblB1cmdlQ29uZmlnKCk7XG4gICAgICB0aGlzLnB1cmdlQ2xpZW50ID0gY2ZnID8gY3JlYXRlQ2RuUHVyZ2VDbGllbnQoY2ZnKSA6IG51bGw7XG4gICAgICB0aGlzLnB1cmdlQ2xpZW50TG9hZGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucHVyZ2VDbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICog5ou8IFRhYmxlU3RvcmUgdGFnIOS4u+mUrjpge2J1aWxkSWR9L3t0YWd9YOOAglxuICAgKlxuICAgKiDkvb/nlKggQlVJTERfSUQoTmV4dC5qcyDmnoTlu7rkuqfnianouqvku70p6ICM6Z2eIGNmZy52ZXJzaW9uKEVTQSDlubPlj7DniYjmnKzlj7cpLFxuICAgKiDljp/lm6A65ZCM5LiA5LiqIGJ1aWxkSWQg5YaFIG1hbmlmZXN0IOS4jiB0YWcg6KGM6Lqr5Lu95Lil5qC85LiA6Ie0LOmBv+WFjVxuICAgKiDpg6jnvbLkvqfms6jlhaUgRVNBX0NBQ0hFX0dXX1ZFUlNJT04g5LiO5p6E5bu65pyfIEJVSUxEX0lEIOS4jeS4gOiHtOaXtiBrZXkg5YWo6YOo6ZSZ5L2N44CCXG4gICAqXG4gICAqIEJVSUxEX0lEIOivu+S4jeWIsCjogIEgYnVuZGxlIC8g6ZSZ6K+v5Y+v6Z2g5bqmKSDihpIg6ZmN57qn5Li65LiN5Yqg5YmN57yALOS4juiAgeeJiOacrOihjOS4uuWFvOWuueOAglxuICAgKi9cbiAgcHJpdmF0ZSBidWlsZFRhZ0tleSh0YWc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgYnVpbGRJZCA9IGxvYWRCdWlsZElkKCk7XG4gICAgY29uc3QgcHJlZml4ID0gYnVpbGRJZCA/IGAke2J1aWxkSWR9L2AgOiAnJztcbiAgICByZXR1cm4gYCR7cHJlZml4fSR7c3RyaXBMZWFkaW5nU2xhc2godGFnKX1gO1xuICB9XG5cbiAgYXN5bmMgZ2V0TGFzdFJldmFsaWRhdGVkKHRhZ3M6IHN0cmluZ1tdKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gMDtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5iYXRjaEdldFRhZ3MoY29uZmlnLCB0YWdzKTtcbiAgICAgIGxldCBtYXhSZXZhbGlkYXRlZEF0ID0gMDtcbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5yZXZhbGlkYXRlZEF0ICYmIHJvdy5yZXZhbGlkYXRlZEF0ID4gbWF4UmV2YWxpZGF0ZWRBdCkge1xuICAgICAgICAgIG1heFJldmFsaWRhdGVkQXQgPSByb3cucmV2YWxpZGF0ZWRBdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG1heFJldmFsaWRhdGVkQXQ7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBnZXRMYXN0UmV2YWxpZGF0ZWQgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gIH1cblxuICBhc3luYyBoYXNCZWVuUmV2YWxpZGF0ZWQoXG4gICAgdGFnczogc3RyaW5nW10sXG4gICAgbGFzdE1vZGlmaWVkPzogbnVtYmVyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybiBmYWxzZTtcblxuICAgIGlmICh0YWdzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJvd3MgPSBhd2FpdCB0aGlzLmJhdGNoR2V0VGFncyhjb25maWcsIHRhZ3MpO1xuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnN0IGxtID0gbGFzdE1vZGlmaWVkID8/IDA7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5leHBpcmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChyb3cuZXhwaXJlIDw9IG5vdyAmJiByb3cuZXhwaXJlID4gbG0pIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocm93LnJldmFsaWRhdGVkQXQgIT09IHVuZGVmaW5lZCAmJiByb3cucmV2YWxpZGF0ZWRBdCA+IGxtKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGhhc0JlZW5SZXZhbGlkYXRlZCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc1N0YWxlKHRhZ3M6IHN0cmluZ1tdLCBsYXN0TW9kaWZpZWQ/OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmdldENvbmZpZygpO1xuICAgIGlmICghY29uZmlnKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAodGFncy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByb3dzID0gYXdhaXQgdGhpcy5iYXRjaEdldFRhZ3MoY29uZmlnLCB0YWdzKTtcbiAgICAgIGNvbnN0IGxtID0gbGFzdE1vZGlmaWVkID8/IDA7XG5cbiAgICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcbiAgICAgICAgaWYgKHJvdy5zdGFsZSA9PT0gdW5kZWZpbmVkKSBjb250aW51ZTtcbiAgICAgICAgY29uc3QgcmV2YWxpZGF0ZWRBdCA9IHJvdy5yZXZhbGlkYXRlZEF0ID8/IDA7XG4gICAgICAgIGlmIChyZXZhbGlkYXRlZEF0ID4gbG0gJiYgcm93LnN0YWxlID49IGxtKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGlzU3RhbGUgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgd3JpdGVUYWdzKHRhZ3M6IE5leHRNb2RlVGFnQ2FjaGVXcml0ZUlucHV0W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRhZ3MgfHwgdGFncy5sZW5ndGggPT09IDApIHJldHVybjtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgaWYgKCFjb25maWcpIHJldHVybjtcblxuICAgIGNvbnN0IHdyaXRlVHMgPSBEYXRlLm5vdygpO1xuXG4gICAgY29uc3Qgcm93cyA9IHRhZ3MubWFwKGlucHV0ID0+IHtcbiAgICAgIGNvbnN0IHRhZ1N0ciA9IHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgPyBpbnB1dCA6IGlucHV0LnRhZztcbiAgICAgIGNvbnN0IHN0YWxlID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IHVuZGVmaW5lZCA6IGlucHV0LnN0YWxlO1xuICAgICAgY29uc3QgZXhwaXJlID0gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyA/IHVuZGVmaW5lZCA6IGlucHV0LmV4cGlyZTtcbiAgICAgIGNvbnN0IHRhZ0tleSA9IHRoaXMuYnVpbGRUYWdLZXkodGFnU3RyKTtcblxuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgIGBbdGFnQ2FjaGVdIHdyaXRlVGFnczogdGFnPVwiJHt0YWdTdHJ9XCIga2V5PVwiJHt0YWdLZXl9XCIgdHM9JHt3cml0ZVRzfWBcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGNvbHVtbnM6IHsgbmFtZTogc3RyaW5nOyB2YWx1ZTogbnVtYmVyIH1bXSA9IFtcbiAgICAgICAgeyBuYW1lOiAncmV2YWxpZGF0ZWRBdCcsIHZhbHVlOiB3cml0ZVRzIH0sXG4gICAgICBdO1xuICAgICAgaWYgKHN0YWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29sdW1ucy5wdXNoKHsgbmFtZTogJ3N0YWxlJywgdmFsdWU6IHN0YWxlIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGV4cGlyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbHVtbnMucHVzaCh7IG5hbWU6ICdleHBpcmUnLCB2YWx1ZTogZXhwaXJlIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICBwcmltYXJ5S2V5OiBbXG4gICAgICAgICAgeyBuYW1lOiAnYXBwX2lkJywgdmFsdWU6IGAke2NvbmZpZy5hbGl1aWR9LyR7Y29uZmlnLnJvdXRpbmVuYW1lfWAgfSxcbiAgICAgICAgICB7IG5hbWU6ICd0YWcnLCB2YWx1ZTogdGFnS2V5IH0sXG4gICAgICAgIF0sXG4gICAgICAgIGNvbHVtbnMsXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5iYXRjaFdyaXRlKGNvbmZpZywgcm93cyk7XG5cbiAgICAvLyDlhpnlupPmiJDlip/lkI4sZmlyZS1hbmQtZm9yZ2V0IOinpuWPkSBFU0Eg6L6557yY57yT5a2Y5aSx5pWI44CCXG4gICAgLy8g5Lu75L2V5aSx6LSl6YO95LiN5bqU5Zue54GM5Yiw6LCD55So5pa5LOaJgOS7pSBjYXRjaCDnm7TmjqUgd2FybizkuI0gdGhyb3fjgIHkuI0gYXdhaXTjgIJcbiAgICBjb25zdCBwdXJnZUNsaWVudCA9IHRoaXMuZ2V0UHVyZ2VDbGllbnQoKTtcbiAgICBpZiAocHVyZ2VDbGllbnQpIHtcbiAgICAgIGNvbnN0IHRhZ1N0cnMgPSB0YWdzXG4gICAgICAgIC5tYXAodCA9PiAodHlwZW9mIHQgPT09ICdzdHJpbmcnID8gdCA6IHQudGFnKSlcbiAgICAgICAgLmZpbHRlcigocyk6IHMgaXMgc3RyaW5nID0+IHR5cGVvZiBzID09PSAnc3RyaW5nJyAmJiBzLmxlbmd0aCA+IDApO1xuICAgICAgaWYgKHRhZ1N0cnMubGVuZ3RoID4gMCkge1xuICAgICAgICBwdXJnZUNsaWVudC5wdXJnZUJ5VGFncyh0YWdTdHJzKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBwdXJnZSBmYW4tb3V0IGZhaWxlZDogJHtlcnI/Lm1lc3NhZ2UgPz8gZXJyfWApO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyAtLS0tIHByaXZhdGUgbWV0aG9kcyAtLS0tXG5cbiAgcHJpdmF0ZSBhc3luYyBiYXRjaEdldFRhZ3MoXG4gICAgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyxcbiAgICB0YWdzOiBzdHJpbmdbXVxuICApOiBQcm9taXNlPFRhZ1Jvd1tdPiB7XG4gICAgY29uc3QgdGFnS2V5cyA9IHRhZ3MubWFwKHRhZyA9PiB0aGlzLmJ1aWxkVGFnS2V5KHRhZykpO1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgYFt0YWdDYWNoZV0gYmF0Y2hHZXRUYWdzOiB0YWdzPSR7SlNPTi5zdHJpbmdpZnkodGFncyl9IGtleXM9JHtKU09OLnN0cmluZ2lmeSh0YWdLZXlzKX1gXG4gICAgKTtcblxuICAgIGNvbnN0IHByaW1hcnlLZXlzID0gdGFncy5tYXAodGFnID0+IFtcbiAgICAgIHsgbmFtZTogJ2FwcF9pZCcsIHZhbHVlOiBgJHtjb25maWcuYWxpdWlkfS8ke2NvbmZpZy5yb3V0aW5lbmFtZX1gIH0sXG4gICAgICB7IG5hbWU6ICd0YWcnLCB2YWx1ZTogdGhpcy5idWlsZFRhZ0tleSh0YWcpIH0sXG4gICAgXSk7XG5cbiAgICBjb25zdCByZXMgPSBhd2FpdCBnYXRld2F5RmV0Y2goY29uZmlnLCAnL3RhYmxlL2JhdGNoLWdldC1yb3cnLCB7XG4gICAgICBtZXRob2Q6ICdQT1NUJyxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwcmltYXJ5S2V5cyB9KSxcbiAgICAgIHRpbWVvdXRNczogUVVFUllfVElNRU9VVCxcbiAgICB9KTtcblxuICAgIGlmICghcmVzLm9rKSB7XG4gICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDAxIHx8IHJlcy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGBbdGFnQ2FjaGVdIGJhdGNoLWdldC1yb3cgcmVqZWN0ZWQgKCR7cmVzLnN0YXR1c30pYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGJhdGNoLWdldC1yb3cgZmFpbGVkOiBzdGF0dXM9JHtyZXMuc3RhdHVzfWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGRhdGEgPSAoYXdhaXQgcmVzLmpzb24oKSkgYXMge1xuICAgICAgcm93cz86IHtcbiAgICAgICAgcHJpbWFyeUtleT86IGFueVtdO1xuICAgICAgICBjb2x1bW5zPzogeyBuYW1lOiBzdHJpbmc7IHZhbHVlOiBudW1iZXIgfVtdO1xuICAgICAgfVtdO1xuICAgIH07XG5cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGBbdGFnQ2FjaGVdIGJhdGNoLWdldC1yb3cgb2s6IHRhZ3M9JHt0YWdzLmxlbmd0aH0gcm93cz0ke2RhdGEucm93cz8ubGVuZ3RoID8/IDB9YFxuICAgICk7XG5cbiAgICBpZiAoIWRhdGEucm93cykgcmV0dXJuIFtdO1xuXG4gICAgcmV0dXJuIGRhdGEucm93cy5tYXAocm93ID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdDogVGFnUm93ID0ge307XG4gICAgICBmb3IgKGNvbnN0IGNvbCBvZiByb3cuY29sdW1ucyA/PyBbXSkge1xuICAgICAgICBpZiAoY29sLm5hbWUgPT09ICdyZXZhbGlkYXRlZEF0JyAmJiB0eXBlb2YgY29sLnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJlc3VsdC5yZXZhbGlkYXRlZEF0ID0gY29sLnZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbC5uYW1lID09PSAnc3RhbGUnICYmIHR5cGVvZiBjb2wudmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgcmVzdWx0LnN0YWxlID0gY29sLnZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKGNvbC5uYW1lID09PSAnZXhwaXJlJyAmJiB0eXBlb2YgY29sLnZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgIHJlc3VsdC5leHBpcmUgPSBjb2wudmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGJhdGNoV3JpdGUoXG4gICAgY29uZmlnOiBHYXRld2F5QXV0aENvbmZpZyxcbiAgICByb3dzOiB7XG4gICAgICBwcmltYXJ5S2V5OiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IG51bWJlciB9W107XG4gICAgICBjb2x1bW5zOiB7IG5hbWU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB8IG51bWJlciB9W107XG4gICAgfVtdXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChyb3dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSArPSBCQVRDSF9TSVpFKSB7XG4gICAgICBjb25zdCBiYXRjaCA9IHJvd3Muc2xpY2UoaSwgaSArIEJBVENIX1NJWkUpO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBnYXRld2F5RmV0Y2goY29uZmlnLCAnL3RhYmxlL2JhdGNoLXdyaXRlJywge1xuICAgICAgICAgIG1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcm93czogYmF0Y2ggfSksXG4gICAgICAgICAgdGltZW91dE1zOiBXUklURV9USU1FT1VULFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocmVzLnN0YXR1cyA9PT0gNDAxIHx8IHJlcy5zdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICBgW3RhZ0NhY2hlXSBiYXRjaC13cml0ZSByZWplY3RlZCAoJHtyZXMuc3RhdHVzfSlgXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXJlcy5vaykge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgW3RhZ0NhY2hlXSBiYXRjaC13cml0ZSBmYWlsZWQ6IHN0YXR1cz0ke3Jlcy5zdGF0dXN9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFt0YWdDYWNoZV0gYmF0Y2gtd3JpdGUgb2s6IHJvd3M9JHtiYXRjaC5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycjogYW55KSB7XG4gICAgICAgIGlmIChlcnIubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBbdGFnQ2FjaGVdIGJhdGNoLXdyaXRlIHRpbWVvdXQgKCR7V1JJVEVfVElNRU9VVH1tcylgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYFt0YWdDYWNoZV0gYmF0Y2gtd3JpdGUgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "esa-pcg-cli",
3
- "version": "0.1.5",
3
+ "version": "0.1.6",
4
4
  "description": "CLI for building and deploying Next.js apps onto pages-cache-gateway (PCG)",
5
5
  "keywords": [
6
6
  "next",