{"version":3,"file":"cache-Bn8-KlfS.js","sources":["../../../../../node_modules/.pnpm/@solidjs+router@0.13.1_solid-js@1.8.15/node_modules/@solidjs/router/dist/data/cache.js"],"sourcesContent":["import { createSignal, getListener, getOwner, onCleanup, sharedConfig, startTransition } from \"solid-js\";\nimport { getRequestEvent, isServer } from \"solid-js/web\";\nimport { useNavigate, getIntent } from \"../routing.js\";\nconst LocationHeader = \"Location\";\nconst PRELOAD_TIMEOUT = 5000;\nconst CACHE_TIMEOUT = 180000;\nlet cacheMap = new Map();\n// cleanup forward/back cache\nif (!isServer) {\n setInterval(() => {\n const now = Date.now();\n for (let [k, v] of cacheMap.entries()) {\n if (!v[3].count && now - v[0] > CACHE_TIMEOUT) {\n cacheMap.delete(k);\n }\n }\n }, 300000);\n}\nfunction getCache() {\n if (!isServer)\n return cacheMap;\n const req = getRequestEvent();\n if (!req)\n throw new Error(\"Cannot find cache context\");\n return (req.router || (req.router = {})).cache || (req.router.cache = new Map());\n}\nexport function revalidate(key, force = true) {\n return startTransition(() => {\n const now = Date.now();\n cacheKeyOp(key, entry => {\n force && (entry[0] = 0); //force cache miss\n entry[3][1](now); // retrigger live signals\n });\n });\n}\nexport function cacheKeyOp(key, fn) {\n key && !Array.isArray(key) && (key = [key]);\n for (let k of cacheMap.keys()) {\n if (key === undefined || matchKey(k, key))\n fn(cacheMap.get(k));\n }\n}\nexport function cache(fn, name) {\n // prioritize GET for server functions\n if (fn.GET)\n fn = fn.GET;\n const cachedFn = ((...args) => {\n const cache = getCache();\n const intent = getIntent();\n const owner = getOwner();\n const navigate = owner ? useNavigate() : undefined;\n const now = Date.now();\n const key = name + hashKey(args);\n let cached = cache.get(key);\n let tracking;\n if (isServer) {\n const e = getRequestEvent();\n if (e) {\n const dataOnly = (e.router || (e.router = {})).dataOnly;\n if (dataOnly) {\n const data = e && (e.router.data || (e.router.data = {}));\n if (data && key in data)\n return data[key];\n if (Array.isArray(dataOnly) && !dataOnly.includes(key)) {\n data[key] = undefined;\n return Promise.resolve();\n }\n }\n }\n }\n if (getListener() && !isServer) {\n tracking = true;\n onCleanup(() => cached[3].count--);\n }\n if (cached &&\n cached[0] &&\n (isServer ||\n intent === \"native\" ||\n cached[3].count ||\n Date.now() - cached[0] < PRELOAD_TIMEOUT)) {\n if (tracking) {\n cached[3].count++;\n cached[3][0](); // track\n }\n if (cached[2] === \"preload\" && intent !== \"preload\") {\n cached[0] = now;\n }\n let res = cached[1];\n if (intent !== \"preload\") {\n res =\n \"then\" in cached[1]\n ? cached[1].then(handleResponse(false), handleResponse(true))\n : handleResponse(false)(cached[1]);\n !isServer && intent === \"navigate\" && startTransition(() => cached[3][1](cached[0])); // update version\n }\n return res;\n }\n let res = !isServer && sharedConfig.context && sharedConfig.has(key)\n ? sharedConfig.load(key) // hydrating\n : fn(...args);\n if (cached) {\n cached[0] = now;\n cached[1] = res;\n cached[2] = intent;\n !isServer && intent === \"navigate\" && startTransition(() => cached[3][1](cached[0])); // update version\n }\n else {\n cache.set(key, (cached = [now, res, intent, createSignal(now)]));\n cached[3].count = 0;\n }\n if (tracking) {\n cached[3].count++;\n cached[3][0](); // track\n }\n if (isServer) {\n const e = getRequestEvent();\n if (e && e.router.dataOnly)\n return (e.router.data[key] = res);\n }\n if (intent !== \"preload\") {\n res =\n \"then\" in res\n ? res.then(handleResponse(false), handleResponse(true))\n : handleResponse(false)(res);\n }\n // serialize on server\n if (isServer &&\n sharedConfig.context &&\n sharedConfig.context.async &&\n !sharedConfig.context.noHydrate) {\n const e = getRequestEvent();\n (!e || !e.serverOnly) && sharedConfig.context.serialize(key, res);\n }\n return res;\n function handleResponse(error) {\n return async (v) => {\n if (v instanceof Response) {\n if (v.headers.has(\"Location\")) {\n if (navigate) {\n startTransition(() => {\n let url = v.headers.get(LocationHeader);\n if (url && url.startsWith(\"/\")) {\n navigate(url, {\n replace: true\n });\n }\n else if (!isServer && url) {\n window.location.href = url;\n }\n });\n }\n return;\n }\n if (v.customBody)\n v = await v.customBody();\n }\n if (error)\n throw v;\n return v;\n };\n }\n });\n cachedFn.keyFor = (...args) => name + hashKey(args);\n cachedFn.key = name;\n return cachedFn;\n}\ncache.set = (key, value) => {\n const cache = getCache();\n const now = Date.now();\n let cached = cache.get(key);\n if (cached) {\n cached[0] = now;\n cached[1] = value;\n cached[2] = \"preload\";\n }\n else {\n cache.set(key, (cached = [now, value, , createSignal(now)]));\n cached[3].count = 0;\n }\n};\ncache.clear = () => getCache().clear();\nfunction matchKey(key, keys) {\n for (let k of keys) {\n if (key.startsWith(k))\n return true;\n }\n return false;\n}\n// Modified from the amazing Tanstack Query library (MIT)\n// https://github.com/TanStack/query/blob/main/packages/query-core/src/utils.ts#L168\nexport function hashKey(args) {\n return JSON.stringify(args, (_, val) => isPlainObject(val)\n ? Object.keys(val)\n .sort()\n .reduce((result, key) => {\n result[key] = val[key];\n return result;\n }, {})\n : val);\n}\nfunction isPlainObject(obj) {\n let proto;\n return (obj != null &&\n typeof obj === \"object\" &&\n (!(proto = Object.getPrototypeOf(obj)) || proto === Object.prototype));\n}\n"],"names":["LocationHeader","PRELOAD_TIMEOUT","CACHE_TIMEOUT","cacheMap","Map","setInterval","now","Date","k","v","entries","count","delete","getCache","revalidate","key","force","startTransition","cacheKeyOp","entry","fn","Array","isArray","keys","undefined","matchKey","get","cache","name","GET","cachedFn","args","intent","getIntent","navigate","getOwner","useNavigate","hashKey","cached","tracking","getListener","isServer","onCleanup","res","then","handleResponse","sharedConfig","context","has","load","set","createSignal","error","Response","headers","url","startsWith","replace","window","location","href","customBody","keyFor","value","clear","JSON","stringify","_","val","isPlainObject","Object","sort","reduce","result","obj","proto","getPrototypeOf","prototype"],"mappings":"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","x_google_ignoreList":[0]}