[{"data":1,"prerenderedAt":3282},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Futils":64,"navigation":263,"navLinks_footer":835,"\u002Fdocs\u002Futils\u002Fshared\u002Fminicache_page":848,"\u002Fdocs\u002Futils\u002Fshared\u002Fminicache_surround":2201,"\u002Fdocs\u002Futils\u002Fshared\u002Fminicache":2204},{"id":4,"extension":5,"links":6,"meta":61,"stem":62,"__hash__":63},"navigationMenu\u002Fnavigation.json","json",[7,52,57],{"nested":8,"label":9,"icon":10,"to":11,"children":12},true,"Docs","i-lucide-book-open","\u002Fdocs\u002Fgetting-started",[13,19,26,32,39,45],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},"Getting Started","i-lucide-rocket","An introduction to help you understand the core components.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fdocshub","Start Here",{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},"Auth H3 Client","i-lucide-key-round","\u002Fdocs\u002Fauth-h3client","Seamlessly enforce OAuth 2.0 authentication and session management integrated directly as the client of the IAM module.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth-h3client","Core",{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},"IAM","i-lucide-shield-check","\u002Fdocs\u002Fiam","Identity and Access Management featuring granular roles, permissions, and security policies.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth",{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},"Bot Detection","i-lucide-cpu","\u002Fdocs\u002Fbot-detection","Advanced behavioral analysis and request fingerprinting to stop malicious automated traffic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fbot-detector","Security",{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},"Shield Base","i-lucide-database-zap","\u002Fdocs\u002Fshield-base","CLI and programmatic toolkit for compiling offline-ready IP intelligence databases from BGP, GeoIP, Tor, FireHOL, and other public threat feeds.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fshield-base-cli",{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},"Utils","i-lucide-wrench","\u002Fdocs\u002Futils","A standard library of highly optimized helpers for formatting, validation, and core logic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Futils","Library",{"nested":53,"label":54,"icon":55,"to":56},false,"Blog","i-lucide-pen-line","\u002Fblog",{"nested":53,"label":58,"icon":59,"to":60},"Website","lucide:app-window-mac","https:\u002F\u002Friavzon.com",{},"navigation","gkaQ0xRGxSLrLyM3kttLe0oBwkrR1EBjlepF8LSbwF8",[65],{"title":9,"path":66,"stem":67,"children":68,"page":53},"\u002Fdocs","docs",[69],{"title":70,"path":48,"stem":71,"children":72},"Utilities","docs\u002Futils\u002Findex",[73,74,91,124,221],{"title":70,"path":48,"stem":71},{"title":75,"path":76,"stem":77,"children":78,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[79,83,87],{"title":80,"path":81,"stem":82},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":84,"path":85,"stem":86},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":88,"path":89,"stem":90},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":92,"path":93,"stem":94,"children":95,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[96,100,104,108,112,116,120],{"title":97,"path":98,"stem":99},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":101,"path":102,"stem":103},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":105,"path":106,"stem":107},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":109,"path":110,"stem":111},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":113,"path":114,"stem":115},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":117,"path":118,"stem":119},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":121,"path":122,"stem":123},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":125,"path":126,"stem":127,"children":128,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[129,133,137,141,145,149,153,157,161,165,169,173,177,181,185,189,193,197,201,205,209,213,217],{"title":130,"path":131,"stem":132},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":134,"path":135,"stem":136},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":138,"path":139,"stem":140},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":142,"path":143,"stem":144},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":146,"path":147,"stem":148},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":150,"path":151,"stem":152},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":154,"path":155,"stem":156},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":158,"path":159,"stem":160},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":162,"path":163,"stem":164},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":166,"path":167,"stem":168},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":170,"path":171,"stem":172},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":174,"path":175,"stem":176},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":178,"path":179,"stem":180},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":182,"path":183,"stem":184},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":186,"path":187,"stem":188},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":190,"path":191,"stem":192},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":194,"path":195,"stem":196},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":198,"path":199,"stem":200},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":202,"path":203,"stem":204},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":206,"path":207,"stem":208},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":210,"path":211,"stem":212},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":214,"path":215,"stem":216},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":218,"path":219,"stem":220},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":222,"path":223,"stem":224,"children":225},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[226,227,231,235,239,243,247,251,255,259],{"title":222,"path":223,"stem":224},{"title":228,"path":229,"stem":230},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":232,"path":233,"stem":234},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":236,"path":237,"stem":238},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":240,"path":241,"stem":242},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":244,"path":245,"stem":246},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":248,"path":249,"stem":250},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":252,"path":253,"stem":254},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":256,"path":257,"stem":258},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":260,"path":261,"stem":262},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",[264],{"title":9,"path":66,"stem":67,"children":265,"page":53},[266,413,531,536,714,781],{"title":20,"path":22,"stem":267,"children":268},"docs\u002Fauth-h3client\u002Findex",[269,270,279,316,342,364,367,388,392],{"title":20,"path":22,"stem":267},{"title":14,"path":271,"stem":272,"children":273},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[274,275],{"title":14,"path":271,"stem":272},{"title":276,"path":277,"stem":278},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":280,"path":281,"stem":282,"children":283},"Essentials","\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[284,285,289,293,297,301,305,308,312],{"title":280,"path":281,"stem":282},{"title":286,"path":287,"stem":288},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":290,"path":291,"stem":292},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":294,"path":295,"stem":296},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":298,"path":299,"stem":300},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":302,"path":303,"stem":304},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":306,"stem":307},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":309,"path":310,"stem":311},"Cookies","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":313,"path":314,"stem":315},"Logging","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":317,"path":318,"stem":319,"children":320},"MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[321,322,326,330,334,338],{"title":317,"path":318,"stem":319},{"title":323,"path":324,"stem":325},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":327,"path":328,"stem":329},"Password Reset","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":331,"path":332,"stem":333},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":335,"path":336,"stem":337},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":339,"path":340,"stem":341},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":343,"path":344,"stem":345,"children":346},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[347,348,352,356,360],{"title":343,"path":344,"stem":345},{"title":349,"path":350,"stem":351},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":353,"path":354,"stem":355},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":357,"path":358,"stem":359},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":361,"path":362,"stem":363},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":365,"stem":366},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":368,"path":369,"stem":370,"children":371,"page":53},"Guides","\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[372,376,380,384],{"title":373,"path":374,"stem":375},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":377,"path":378,"stem":379},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":381,"path":382,"stem":383},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":385,"path":386,"stem":387},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":389,"path":390,"stem":391},"Configuration","\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":393,"path":394,"stem":395,"children":396},"API Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[397,398,402,406,410],{"title":393,"path":394,"stem":395},{"title":399,"path":400,"stem":401},"Routes Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":403,"path":404,"stem":405},"Middleware Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":407,"path":408,"stem":409},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":70,"path":411,"stem":412},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":414,"path":35,"stem":415,"children":416},"Bot Detector","docs\u002Fbot-detection\u002Findex",[417,418,421,425,429,448,522,525,528],{"title":414,"path":35,"stem":415},{"title":14,"path":419,"stem":420},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":422,"path":423,"stem":424},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":426,"path":427,"stem":428},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":368,"path":430,"stem":431,"children":432,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[433,437,441,444],{"title":434,"path":435,"stem":436},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":438,"path":439,"stem":440},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":313,"path":442,"stem":443},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":445,"path":446,"stem":447},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":449,"path":450,"stem":451,"children":452},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[453,454,458,462,466,470,474,478,482,486,490,494,498,502,506,510,514,518],{"title":449,"path":450,"stem":451},{"title":455,"path":456,"stem":457},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":459,"path":460,"stem":461},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":463,"path":464,"stem":465},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":467,"path":468,"stem":469},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":471,"path":472,"stem":473},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":475,"path":476,"stem":477},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":479,"path":480,"stem":481},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":483,"path":484,"stem":485},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":487,"path":488,"stem":489},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":491,"path":492,"stem":493},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":495,"path":496,"stem":497},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":499,"path":500,"stem":501},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":503,"path":504,"stem":505},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":507,"path":508,"stem":509},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":511,"path":512,"stem":513},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":515,"path":516,"stem":517},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":519,"path":520,"stem":521},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":523,"stem":524},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":393,"path":526,"stem":527},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":389,"path":529,"stem":530},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":532,"path":11,"stem":533,"children":534},"Introduction","docs\u002Fgetting-started\u002Findex",[535],{"title":532,"path":11,"stem":533},{"title":27,"path":29,"stem":537,"children":538},"docs\u002Fiam\u002Findex",[539,540,543,678,681,697,700],{"title":27,"path":29,"stem":537},{"title":14,"path":541,"stem":542},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":280,"path":544,"stem":545,"children":546},"\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[547,548,552,556,560,564,568,572,576,580,584,588,591,595,599,603,607,610,614,618,621,625,628],{"title":280,"path":544,"stem":545},{"title":549,"path":550,"stem":551},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":553,"path":554,"stem":555},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":557,"path":558,"stem":559},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":561,"path":562,"stem":563},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":565,"path":566,"stem":567},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":569,"path":570,"stem":571},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":573,"path":574,"stem":575},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":577,"path":578,"stem":579},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":581,"path":582,"stem":583},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":585,"path":586,"stem":587},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":317,"path":589,"stem":590},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":592,"path":593,"stem":594},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":596,"path":597,"stem":598},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":600,"path":601,"stem":602},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":604,"path":605,"stem":606},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":313,"path":608,"stem":609},"\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":611,"path":612,"stem":613},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":615,"path":616,"stem":617},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":309,"path":619,"stem":620},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":622,"path":623,"stem":624},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":327,"path":626,"stem":627},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":629,"path":630,"stem":631,"children":632},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[633,634,638,642,672,675],{"title":629,"path":630,"stem":631},{"title":635,"path":636,"stem":637},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":639,"path":640,"stem":641},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":643,"path":644,"stem":645,"children":646},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[647,648,652,656,660,664,668],{"title":643,"path":644,"stem":645},{"title":649,"path":650,"stem":651},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":653,"path":654,"stem":655},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":657,"path":658,"stem":659},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":661,"path":662,"stem":663},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":665,"path":666,"stem":667},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":669,"path":670,"stem":671},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":611,"path":673,"stem":674},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":676,"stem":677},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":679,"stem":680},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":368,"path":682,"stem":683,"children":684,"page":53},"\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[685,689,693],{"title":686,"path":687,"stem":688},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":690,"path":691,"stem":692},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":694,"path":695,"stem":696},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":389,"path":698,"stem":699},"\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":701,"path":702,"stem":703,"children":704,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[705,708,711],{"title":393,"path":706,"stem":707},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":403,"path":709,"stem":710},"\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":399,"path":712,"stem":713},"\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",{"title":40,"path":42,"stem":715,"children":716},"docs\u002Fshield-base\u002Findex",[717,718,721,725,766,770,774,778],{"title":40,"path":42,"stem":715},{"title":14,"path":719,"stem":720},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":722,"path":723,"stem":724},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":426,"path":726,"stem":727,"children":728},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[729,730,734,738,742,746,750,754,758,762],{"title":426,"path":726,"stem":727},{"title":731,"path":732,"stem":733},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":735,"path":736,"stem":737},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":739,"path":740,"stem":741},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":743,"path":744,"stem":745},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":747,"path":748,"stem":749},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":751,"path":752,"stem":753},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":755,"path":756,"stem":757},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":759,"path":760,"stem":761},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":763,"path":764,"stem":765},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":767,"path":768,"stem":769},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":771,"path":772,"stem":773},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":775,"path":776,"stem":777},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":393,"path":779,"stem":780},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":70,"path":48,"stem":71,"children":782},[783,784,789,798,823],{"title":70,"path":48,"stem":71},{"title":75,"path":76,"stem":77,"children":785,"page":53},[786,787,788],{"title":80,"path":81,"stem":82},{"title":84,"path":85,"stem":86},{"title":88,"path":89,"stem":90},{"title":92,"path":93,"stem":94,"children":790,"page":53},[791,792,793,794,795,796,797],{"title":97,"path":98,"stem":99},{"title":101,"path":102,"stem":103},{"title":105,"path":106,"stem":107},{"title":109,"path":110,"stem":111},{"title":113,"path":114,"stem":115},{"title":117,"path":118,"stem":119},{"title":121,"path":122,"stem":123},{"title":125,"path":126,"stem":127,"children":799,"page":53},[800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822],{"title":130,"path":131,"stem":132},{"title":134,"path":135,"stem":136},{"title":138,"path":139,"stem":140},{"title":142,"path":143,"stem":144},{"title":146,"path":147,"stem":148},{"title":150,"path":151,"stem":152},{"title":154,"path":155,"stem":156},{"title":158,"path":159,"stem":160},{"title":162,"path":163,"stem":164},{"title":166,"path":167,"stem":168},{"title":170,"path":171,"stem":172},{"title":174,"path":175,"stem":176},{"title":178,"path":179,"stem":180},{"title":182,"path":183,"stem":184},{"title":186,"path":187,"stem":188},{"title":190,"path":191,"stem":192},{"title":194,"path":195,"stem":196},{"title":198,"path":199,"stem":200},{"title":202,"path":203,"stem":204},{"title":206,"path":207,"stem":208},{"title":210,"path":211,"stem":212},{"title":214,"path":215,"stem":216},{"title":218,"path":219,"stem":220},{"title":222,"path":223,"stem":224,"children":824},[825,826,827,828,829,830,831,832,833,834],{"title":222,"path":223,"stem":224},{"title":228,"path":229,"stem":230},{"title":232,"path":233,"stem":234},{"title":236,"path":237,"stem":238},{"title":240,"path":241,"stem":242},{"title":244,"path":245,"stem":246},{"title":248,"path":249,"stem":250},{"title":252,"path":253,"stem":254},{"title":256,"path":257,"stem":258},{"title":260,"path":261,"stem":262},{"id":4,"extension":5,"links":836,"meta":847,"stem":62,"__hash__":63},[837,845,846],{"nested":8,"label":9,"icon":10,"to":11,"children":838},[839,840,841,842,843,844],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},{"nested":53,"label":54,"icon":55,"to":56},{"nested":53,"label":58,"icon":59,"to":60},{},{"id":849,"title":186,"body":850,"description":2193,"extension":2194,"icon":2195,"meta":2196,"module":2197,"navigation":8,"path":187,"rawbody":2198,"seo":2199,"stem":188,"__hash__":2200},"docs\u002Fdocs\u002Futils\u002Fshared\u002FminiCache.md",{"type":851,"value":852,"toc":2180},"minimark",[853,861,866,869,874,1132,1136,1142,1205,1209,1214,1298,1302,1305,1370,1376,1382,1416,1431,1444,1449,1454,1463,1524,1531,1536,1544,1575,1585,1590,1596,1627,1633,1638,1643,1649,1653,1656,1905,1911,2168,2176],[854,855,856,857,860],"p",{},"The ",[858,859,186],"code",{}," class is a lightweight, in-memory cache for short-lived values.\nIt combines per-entry TTL expiration with insertion-order eviction and an\nLRU-style refresh on successful reads. This makes it useful for request\ndeduplication, temporary lookup caching, and small per-process state stores.",[854,862,863,865],{},[858,864,186],{}," works entirely in local process memory. It does not persist data,\nshare state across instances, or guarantee global consistency across multiple\nservers.",[867,868],"hr",{},[870,871,873],"h2",{"id":872},"definition","Definition",[875,876,882],"pre",{"className":877,"code":878,"filename":879,"language":880,"meta":881,"style":881},"language-ts shiki shiki-themes light-plus light-plus dracula","\u002F**\n * Small in-memory TTL cache supporting LRU-style eviction using insertion order.\n *\n * @typeParam T - Stored value type.\n *\u002F\nexport class MiniCache\u003CT = unknown> {\n  constructor(maxEntries = Infinity, sweepIntervalMs = 60_000)\n\n  stale(key: string): T | null\n  set(key: string, value: T, ttlMs: number): void\n  get(key: string): T | null\n  del(key: string): void\n  clear(): void\n}\n","miniCache.ts","ts","",[858,883,884,893,899,905,918,924,957,991,997,1029,1069,1093,1113,1126],{"__ignoreMap":881},[885,886,889],"span",{"class":887,"line":888},"line",1,[885,890,892],{"class":891},"sghk6","\u002F**\n",[885,894,896],{"class":887,"line":895},2,[885,897,898],{"class":891}," * Small in-memory TTL cache supporting LRU-style eviction using insertion order.\n",[885,900,902],{"class":887,"line":901},3,[885,903,904],{"class":891}," *\n",[885,906,908,911,915],{"class":887,"line":907},4,[885,909,910],{"class":891}," * ",[885,912,914],{"class":913},"sl46w","@typeParam",[885,916,917],{"class":891}," T - Stored value type.\n",[885,919,921],{"class":887,"line":920},5,[885,922,923],{"class":891}," *\u002F\n",[885,925,927,931,934,938,942,946,950,954],{"class":887,"line":926},6,[885,928,930],{"class":929},"sZ328","export",[885,932,933],{"class":913}," class",[885,935,937],{"class":936},"s5jk-"," MiniCache",[885,939,941],{"class":940},"sDd4n","\u003C",[885,943,945],{"class":944},"sW-rI","T",[885,947,949],{"class":948},"saOXh"," =",[885,951,953],{"class":952},"sFs1U"," unknown",[885,955,956],{"class":940},"> {\n",[885,958,960,963,966,970,972,976,979,982,984,988],{"class":887,"line":959},7,[885,961,962],{"class":913},"  constructor",[885,964,965],{"class":940},"(",[885,967,969],{"class":968},"sygFZ","maxEntries",[885,971,949],{"class":948},[885,973,975],{"class":974},"sjR7W"," Infinity",[885,977,978],{"class":940},", ",[885,980,981],{"class":968},"sweepIntervalMs",[885,983,949],{"class":948},[885,985,987],{"class":986},"spgvN"," 60_000",[885,989,990],{"class":940},")\n",[885,992,994],{"class":887,"line":993},8,[885,995,996],{"emptyLinePlaceholder":8},"\n",[885,998,1000,1004,1006,1009,1012,1015,1018,1020,1023,1026],{"class":887,"line":999},9,[885,1001,1003],{"class":1002},"sHOzp","  stale",[885,1005,965],{"class":940},[885,1007,1008],{"class":968},"key",[885,1010,1011],{"class":948},":",[885,1013,1014],{"class":952}," string",[885,1016,1017],{"class":940},")",[885,1019,1011],{"class":948},[885,1021,1022],{"class":952}," T",[885,1024,1025],{"class":948}," |",[885,1027,1028],{"class":952}," null\n",[885,1030,1032,1035,1037,1039,1041,1043,1045,1048,1050,1052,1054,1057,1059,1062,1064,1066],{"class":887,"line":1031},10,[885,1033,1034],{"class":1002},"  set",[885,1036,965],{"class":940},[885,1038,1008],{"class":968},[885,1040,1011],{"class":948},[885,1042,1014],{"class":952},[885,1044,978],{"class":940},[885,1046,1047],{"class":968},"value",[885,1049,1011],{"class":948},[885,1051,1022],{"class":952},[885,1053,978],{"class":940},[885,1055,1056],{"class":968},"ttlMs",[885,1058,1011],{"class":948},[885,1060,1061],{"class":952}," number",[885,1063,1017],{"class":940},[885,1065,1011],{"class":948},[885,1067,1068],{"class":952}," void\n",[885,1070,1072,1075,1077,1079,1081,1083,1085,1087,1089,1091],{"class":887,"line":1071},11,[885,1073,1074],{"class":1002},"  get",[885,1076,965],{"class":940},[885,1078,1008],{"class":968},[885,1080,1011],{"class":948},[885,1082,1014],{"class":952},[885,1084,1017],{"class":940},[885,1086,1011],{"class":948},[885,1088,1022],{"class":952},[885,1090,1025],{"class":948},[885,1092,1028],{"class":952},[885,1094,1096,1099,1101,1103,1105,1107,1109,1111],{"class":887,"line":1095},12,[885,1097,1098],{"class":1002},"  del",[885,1100,965],{"class":940},[885,1102,1008],{"class":968},[885,1104,1011],{"class":948},[885,1106,1014],{"class":952},[885,1108,1017],{"class":940},[885,1110,1011],{"class":948},[885,1112,1068],{"class":952},[885,1114,1116,1119,1122,1124],{"class":887,"line":1115},13,[885,1117,1118],{"class":1002},"  clear",[885,1120,1121],{"class":940},"()",[885,1123,1011],{"class":948},[885,1125,1068],{"class":952},[885,1127,1129],{"class":887,"line":1128},14,[885,1130,1131],{"class":940},"}\n",[870,1133,1135],{"id":1134},"constructor-parameters","Constructor parameters",[854,1137,1138,1139,1141],{},"Create a ",[858,1140,186],{}," instance once, then reuse it for related values.",[1143,1144,1145,1164],"table",{},[1146,1147,1148],"thead",{},[1149,1150,1151,1155,1158,1161],"tr",{},[1152,1153,1154],"th",{},"Parameter",[1152,1156,1157],{},"Type",[1152,1159,1160],{},"Default",[1152,1162,1163],{},"Description",[1165,1166,1167,1187],"tbody",{},[1149,1168,1169,1174,1179,1184],{},[1170,1171,1172],"td",{},[858,1173,969],{},[1170,1175,1176],{},[858,1177,1178],{},"number",[1170,1180,1181],{},[858,1182,1183],{},"Infinity",[1170,1185,1186],{},"Maximum number of keys stored at once. When the cache exceeds this size, the oldest key in insertion\u002Faccess order is evicted.",[1149,1188,1189,1193,1197,1202],{},[1170,1190,1191],{},[858,1192,981],{},[1170,1194,1195],{},[858,1196,1178],{},[1170,1198,1199],{},[858,1200,1201],{},"60000",[1170,1203,1204],{},"Interval in milliseconds for the background sweep that removes expired entries.",[870,1206,1208],{"id":1207},"behavior","Behavior",[854,1210,1211,1213],{},[858,1212,186],{}," mixes TTL expiration with Map-based ordering rules. These behaviors\nmatter when you use it as the store for limiters, deduplication, or\nshort-lived memoization.",[1143,1215,1216,1224],{},[1146,1217,1218],{},[1149,1219,1220,1222],{},[1152,1221,1208],{},[1152,1223,1163],{},[1165,1225,1226,1242,1253,1261,1275,1286],{},[1149,1227,1228,1231],{},[1170,1229,1230],{},"TTL expiration",[1170,1232,1233,1234,1237,1238,1241],{},"Each ",[858,1235,1236],{},"set()"," call stores an absolute expiry timestamp based on ",[858,1239,1240],{},"Date.now() + ttlMs",".",[1149,1243,1244,1247],{},[1170,1245,1246],{},"Lazy expiration",[1170,1248,1249,1252],{},[858,1250,1251],{},"get()"," removes expired values when you access them.",[1149,1254,1255,1258],{},[1170,1256,1257],{},"Background cleanup",[1170,1259,1260],{},"A timer periodically sweeps expired entries even if they are never read again.",[1149,1262,1263,1266],{},[1170,1264,1265],{},"LRU-style refresh",[1170,1267,1268,1269,1271,1272,1241],{},"A successful ",[858,1270,1251],{}," moves the key to the newest position in the internal ",[858,1273,1274],{},"Map",[1149,1276,1277,1280],{},[1170,1278,1279],{},"Insertion-order eviction",[1170,1281,1282,1283,1285],{},"When ",[858,1284,969],{}," is exceeded, the oldest key in the current order is removed.",[1149,1287,1288,1291],{},[1170,1289,1290],{},"Unref'd timer",[1170,1292,1293,1294,1297],{},"In Node.js environments that support ",[858,1295,1296],{},"unref()",", the sweep timer does not keep the process alive on its own.",[870,1299,1301],{"id":1300},"methods","Methods",[854,1303,1304],{},"The class exposes five public methods. Together they let you add, read, inspect,\ndelete, and clear cached values.",[1143,1306,1307,1316],{},[1146,1308,1309],{},[1149,1310,1311,1314],{},[1152,1312,1313],{},"Method",[1152,1315,1163],{},[1165,1317,1318,1328,1340,1350,1360],{},[1149,1319,1320,1325],{},[1170,1321,1322],{},[858,1323,1324],{},"stale(key)",[1170,1326,1327],{},"Returns the stored value without checking expiry and without refreshing its position in the LRU order.",[1149,1329,1330,1335],{},[1170,1331,1332],{},[858,1333,1334],{},"set(key, value, ttlMs)",[1170,1336,1337,1338,1241],{},"Adds or updates a value with a specific TTL and evicts the oldest entry if the cache grows beyond ",[858,1339,969],{},[1149,1341,1342,1347],{},[1170,1343,1344],{},[858,1345,1346],{},"get(key)",[1170,1348,1349],{},"Returns the cached value when it exists and is still fresh. Removes expired entries and refreshes successful reads to the newest position.",[1149,1351,1352,1357],{},[1170,1353,1354],{},[858,1355,1356],{},"del(key)",[1170,1358,1359],{},"Immediately removes an entry.",[1149,1361,1362,1367],{},[1170,1363,1364],{},[858,1365,1366],{},"clear()",[1170,1368,1369],{},"Clears all entries.",[1371,1372,1374],"h3",{"id":1373},"stalekey",[858,1375,1324],{},[854,1377,1378,1381],{},[858,1379,1380],{},"stale()"," reads the raw stored value without validating its TTL and without\nupdating the entry's position in the internal Map. Use it only when you\nexplicitly want an unchecked lookup.",[1143,1383,1384,1397],{},[1146,1385,1386],{},[1149,1387,1388,1390,1392,1395],{},[1152,1389,1154],{},[1152,1391,1157],{},[1152,1393,1394],{},"Required",[1152,1396,1163],{},[1165,1398,1399],{},[1149,1400,1401,1405,1410,1413],{},[1170,1402,1403],{},[858,1404,1008],{},[1170,1406,1407],{},[858,1408,1409],{},"string",[1170,1411,1412],{},"Yes",[1170,1414,1415],{},"Cache key to inspect.",[854,1417,1418,1422,1423,1426,1427,1430],{},[1419,1420,1421],"strong",{},"Returns:"," ",[858,1424,1425],{},"T | null",". Returns the stored value when the key exists, or\n",[858,1428,1429],{},"null"," when the key is missing.",[1432,1433,1436],"callout",{"color":1434,"icon":1435},"info","i-lucide-info",[854,1437,1438,1440,1441,1443],{},[858,1439,1380],{}," does not check whether the entry is expired. If the background sweep\nhas not removed an expired key yet, ",[858,1442,1380],{}," can still return that value.",[1371,1445,1447],{"id":1446},"setkey-value-ttlms",[858,1448,1334],{},[854,1450,1451,1453],{},[858,1452,1236],{}," inserts a new entry or replaces an existing one. When a key already\nexists, the old value is removed first so the new write becomes the newest item\nin the eviction order.",[854,1455,1456,1457,1459,1460,1462],{},"After the value is stored, ",[858,1458,186],{}," checks ",[858,1461,969],{},". If the cache is now\ntoo large, it evicts the oldest key until the size is back within the limit.",[1143,1464,1465,1477],{},[1146,1466,1467],{},[1149,1468,1469,1471,1473,1475],{},[1152,1470,1154],{},[1152,1472,1157],{},[1152,1474,1394],{},[1152,1476,1163],{},[1165,1478,1479,1494,1509],{},[1149,1480,1481,1485,1489,1491],{},[1170,1482,1483],{},[858,1484,1008],{},[1170,1486,1487],{},[858,1488,1409],{},[1170,1490,1412],{},[1170,1492,1493],{},"Unique cache key.",[1149,1495,1496,1500,1504,1506],{},[1170,1497,1498],{},[858,1499,1047],{},[1170,1501,1502],{},[858,1503,945],{},[1170,1505,1412],{},[1170,1507,1508],{},"Value to store in the cache.",[1149,1510,1511,1515,1519,1521],{},[1170,1512,1513],{},[858,1514,1056],{},[1170,1516,1517],{},[858,1518,1178],{},[1170,1520,1412],{},[1170,1522,1523],{},"Time-to-live in milliseconds for this specific entry.",[854,1525,1526,1422,1528,1241],{},[1419,1527,1421],{},[858,1529,1530],{},"void",[1371,1532,1534],{"id":1533},"getkey",[858,1535,1346],{},[854,1537,1538,1540,1541,1543],{},[858,1539,1251],{}," is the main read method. It returns ",[858,1542,1429],{}," when the key is missing or\nexpired. When the value is still valid, it moves the entry to the newest\nposition in the internal Map so frequently accessed keys are less likely to be\nevicted next.",[1143,1545,1546,1558],{},[1146,1547,1548],{},[1149,1549,1550,1552,1554,1556],{},[1152,1551,1154],{},[1152,1553,1157],{},[1152,1555,1394],{},[1152,1557,1163],{},[1165,1559,1560],{},[1149,1561,1562,1566,1570,1572],{},[1170,1563,1564],{},[858,1565,1008],{},[1170,1567,1568],{},[858,1569,1409],{},[1170,1571,1412],{},[1170,1573,1574],{},"Cache key to retrieve.",[854,1576,1577,1422,1579,1581,1582,1584],{},[1419,1578,1421],{},[858,1580,1425],{},". Returns the fresh cached value, or ",[858,1583,1429],{}," when the key\ndoes not exist or its TTL has expired.",[1371,1586,1588],{"id":1587},"delkey",[858,1589,1356],{},[854,1591,1592,1595],{},[858,1593,1594],{},"del()"," removes one entry immediately. Use it when you know a cached value is no\nlonger valid and should not wait for TTL expiration.",[1143,1597,1598,1610],{},[1146,1599,1600],{},[1149,1601,1602,1604,1606,1608],{},[1152,1603,1154],{},[1152,1605,1157],{},[1152,1607,1394],{},[1152,1609,1163],{},[1165,1611,1612],{},[1149,1613,1614,1618,1622,1624],{},[1170,1615,1616],{},[858,1617,1008],{},[1170,1619,1620],{},[858,1621,1409],{},[1170,1623,1412],{},[1170,1625,1626],{},"Cache key to delete.",[854,1628,1629,1422,1631,1241],{},[1419,1630,1421],{},[858,1632,1530],{},[1371,1634,1636],{"id":1635},"clear",[858,1637,1366],{},[854,1639,1640,1642],{},[858,1641,1366],{}," removes every cached entry at once. This is useful for teardown,\nmanual invalidation, or tests that need a clean cache state.",[854,1644,1645,1422,1647,1241],{},[1419,1646,1421],{},[858,1648,1530],{},[870,1650,1652],{"id":1651},"example-usage","Example Usage",[854,1654,1655],{},"The most common pattern is caching short-lived values that are cheap to rebuild\nbut expensive to fetch repeatedly.",[875,1657,1662],{"className":1658,"code":1659,"filename":1660,"language":1661,"meta":881,"style":881},"language-typescript shiki shiki-themes light-plus light-plus dracula","import { MiniCache } from '@riavzon\u002Futils'\n\n\u002F\u002F Cache up to 100 entries, and sweep expired items every 30 seconds.\nconst cache = new MiniCache\u003Cstring>(100, 30_000)\n\n\u002F\u002F Store a value with a 5-minute TTL.\ncache.set('user:1', 'John Doe', 5 * 60 * 1000)\n\n\u002F\u002F Read the cached value.\nconst user = cache.get('user:1')\nconsole.log(user) \u002F\u002F \"John Doe\"\n\n\u002F\u002F Successful reads refresh the key's position in the eviction order.\ncache.get('user:1')\n\n\u002F\u002F Remove the entry explicitly when it becomes invalid.\ncache.del('user:1')\n","example.ts","typescript",[858,1663,1664,1692,1696,1701,1735,1739,1744,1791,1795,1800,1826,1847,1851,1856,1874,1879,1885],{"__ignoreMap":881},[885,1665,1666,1669,1672,1675,1678,1681,1685,1689],{"class":887,"line":888},[885,1667,1668],{"class":929},"import",[885,1670,1671],{"class":940}," { ",[885,1673,186],{"class":1674},"sjsA6",[885,1676,1677],{"class":940}," } ",[885,1679,1680],{"class":929},"from",[885,1682,1684],{"class":1683},"sFkSl"," '",[885,1686,1688],{"class":1687},"sFB1V","@riavzon\u002Futils",[885,1690,1691],{"class":1683},"'\n",[885,1693,1694],{"class":887,"line":895},[885,1695,996],{"emptyLinePlaceholder":8},[885,1697,1698],{"class":887,"line":901},[885,1699,1700],{"class":891},"\u002F\u002F Cache up to 100 entries, and sweep expired items every 30 seconds.\n",[885,1702,1703,1706,1710,1712,1716,1718,1720,1722,1725,1728,1730,1733],{"class":887,"line":907},[885,1704,1705],{"class":913},"const",[885,1707,1709],{"class":1708},"s3JHE"," cache",[885,1711,949],{"class":948},[885,1713,1715],{"class":1714},"sakC6"," new",[885,1717,937],{"class":1002},[885,1719,941],{"class":940},[885,1721,1409],{"class":952},[885,1723,1724],{"class":940},">(",[885,1726,1727],{"class":986},"100",[885,1729,978],{"class":940},[885,1731,1732],{"class":986},"30_000",[885,1734,990],{"class":940},[885,1736,1737],{"class":887,"line":920},[885,1738,996],{"emptyLinePlaceholder":8},[885,1740,1741],{"class":887,"line":926},[885,1742,1743],{"class":891},"\u002F\u002F Store a value with a 5-minute TTL.\n",[885,1745,1746,1749,1751,1754,1756,1759,1762,1764,1766,1768,1771,1773,1775,1778,1781,1784,1786,1789],{"class":887,"line":959},[885,1747,1748],{"class":1674},"cache",[885,1750,1241],{"class":940},[885,1752,1753],{"class":1002},"set",[885,1755,965],{"class":940},[885,1757,1758],{"class":1683},"'",[885,1760,1761],{"class":1687},"user:1",[885,1763,1758],{"class":1683},[885,1765,978],{"class":940},[885,1767,1758],{"class":1683},[885,1769,1770],{"class":1687},"John Doe",[885,1772,1758],{"class":1683},[885,1774,978],{"class":940},[885,1776,1777],{"class":986},"5",[885,1779,1780],{"class":948}," *",[885,1782,1783],{"class":986}," 60",[885,1785,1780],{"class":948},[885,1787,1788],{"class":986}," 1000",[885,1790,990],{"class":940},[885,1792,1793],{"class":887,"line":993},[885,1794,996],{"emptyLinePlaceholder":8},[885,1796,1797],{"class":887,"line":999},[885,1798,1799],{"class":891},"\u002F\u002F Read the cached value.\n",[885,1801,1802,1804,1807,1809,1811,1813,1816,1818,1820,1822,1824],{"class":887,"line":1031},[885,1803,1705],{"class":913},[885,1805,1806],{"class":1708}," user",[885,1808,949],{"class":948},[885,1810,1709],{"class":1674},[885,1812,1241],{"class":940},[885,1814,1815],{"class":1002},"get",[885,1817,965],{"class":940},[885,1819,1758],{"class":1683},[885,1821,1761],{"class":1687},[885,1823,1758],{"class":1683},[885,1825,990],{"class":940},[885,1827,1828,1831,1833,1836,1838,1841,1844],{"class":887,"line":1071},[885,1829,1830],{"class":1674},"console",[885,1832,1241],{"class":940},[885,1834,1835],{"class":1002},"log",[885,1837,965],{"class":940},[885,1839,1840],{"class":1674},"user",[885,1842,1843],{"class":940},") ",[885,1845,1846],{"class":891},"\u002F\u002F \"John Doe\"\n",[885,1848,1849],{"class":887,"line":1095},[885,1850,996],{"emptyLinePlaceholder":8},[885,1852,1853],{"class":887,"line":1115},[885,1854,1855],{"class":891},"\u002F\u002F Successful reads refresh the key's position in the eviction order.\n",[885,1857,1858,1860,1862,1864,1866,1868,1870,1872],{"class":887,"line":1128},[885,1859,1748],{"class":1674},[885,1861,1241],{"class":940},[885,1863,1815],{"class":1002},[885,1865,965],{"class":940},[885,1867,1758],{"class":1683},[885,1869,1761],{"class":1687},[885,1871,1758],{"class":1683},[885,1873,990],{"class":940},[885,1875,1877],{"class":887,"line":1876},15,[885,1878,996],{"emptyLinePlaceholder":8},[885,1880,1882],{"class":887,"line":1881},16,[885,1883,1884],{"class":891},"\u002F\u002F Remove the entry explicitly when it becomes invalid.\n",[885,1886,1888,1890,1892,1895,1897,1899,1901,1903],{"class":887,"line":1887},17,[885,1889,1748],{"class":1674},[885,1891,1241],{"class":940},[885,1893,1894],{"class":1002},"del",[885,1896,965],{"class":940},[885,1898,1758],{"class":1683},[885,1900,1761],{"class":1687},[885,1902,1758],{"class":1683},[885,1904,990],{"class":940},[854,1906,1907,1908,1910],{},"You can also use ",[858,1909,186],{}," to keep a small set of recent objects in memory\nwithout promoting stale values accidentally.",[875,1912,1915],{"className":1658,"code":1913,"filename":1914,"language":1661,"meta":881,"style":881},"import { MiniCache } from '@riavzon\u002Futils'\n\ninterface SessionState {\n  userId: string\n  roles: string[]\n}\n\nconst sessions = new MiniCache\u003CSessionState>(10_000, 60_000)\n\nexport function storeSession(token: string, session: SessionState) {\n  sessions.set(token, session, 15 * 60_000)\n}\n\nexport function getSession(token: string) {\n  return sessions.get(token)\n}\n\nexport function peekSessionUnchecked(token: string) {\n  return sessions.stale(token)\n}\n","sessionCache.ts",[858,1916,1917,1935,1939,1950,1960,1972,1976,1980,2010,2014,2045,2073,2077,2081,2100,2117,2121,2125,2145,2163],{"__ignoreMap":881},[885,1918,1919,1921,1923,1925,1927,1929,1931,1933],{"class":887,"line":888},[885,1920,1668],{"class":929},[885,1922,1671],{"class":940},[885,1924,186],{"class":1674},[885,1926,1677],{"class":940},[885,1928,1680],{"class":929},[885,1930,1684],{"class":1683},[885,1932,1688],{"class":1687},[885,1934,1691],{"class":1683},[885,1936,1937],{"class":887,"line":895},[885,1938,996],{"emptyLinePlaceholder":8},[885,1940,1941,1944,1947],{"class":887,"line":901},[885,1942,1943],{"class":913},"interface",[885,1945,1946],{"class":952}," SessionState",[885,1948,1949],{"class":940}," {\n",[885,1951,1952,1955,1957],{"class":887,"line":907},[885,1953,1954],{"class":1674},"  userId",[885,1956,1011],{"class":948},[885,1958,1959],{"class":952}," string\n",[885,1961,1962,1965,1967,1969],{"class":887,"line":920},[885,1963,1964],{"class":1674},"  roles",[885,1966,1011],{"class":948},[885,1968,1014],{"class":952},[885,1970,1971],{"class":940},"[]\n",[885,1973,1974],{"class":887,"line":926},[885,1975,1131],{"class":940},[885,1977,1978],{"class":887,"line":959},[885,1979,996],{"emptyLinePlaceholder":8},[885,1981,1982,1984,1987,1989,1991,1993,1995,1998,2000,2003,2005,2008],{"class":887,"line":993},[885,1983,1705],{"class":913},[885,1985,1986],{"class":1708}," sessions",[885,1988,949],{"class":948},[885,1990,1715],{"class":1714},[885,1992,937],{"class":1002},[885,1994,941],{"class":940},[885,1996,1997],{"class":944},"SessionState",[885,1999,1724],{"class":940},[885,2001,2002],{"class":986},"10_000",[885,2004,978],{"class":940},[885,2006,2007],{"class":986},"60_000",[885,2009,990],{"class":940},[885,2011,2012],{"class":887,"line":999},[885,2013,996],{"emptyLinePlaceholder":8},[885,2015,2016,2018,2021,2024,2026,2029,2031,2033,2035,2038,2040,2042],{"class":887,"line":1031},[885,2017,930],{"class":929},[885,2019,2020],{"class":913}," function",[885,2022,2023],{"class":1002}," storeSession",[885,2025,965],{"class":940},[885,2027,2028],{"class":968},"token",[885,2030,1011],{"class":948},[885,2032,1014],{"class":952},[885,2034,978],{"class":940},[885,2036,2037],{"class":968},"session",[885,2039,1011],{"class":948},[885,2041,1946],{"class":952},[885,2043,2044],{"class":940},") {\n",[885,2046,2047,2050,2052,2054,2056,2058,2060,2062,2064,2067,2069,2071],{"class":887,"line":1071},[885,2048,2049],{"class":1674},"  sessions",[885,2051,1241],{"class":940},[885,2053,1753],{"class":1002},[885,2055,965],{"class":940},[885,2057,2028],{"class":1674},[885,2059,978],{"class":940},[885,2061,2037],{"class":1674},[885,2063,978],{"class":940},[885,2065,2066],{"class":986},"15",[885,2068,1780],{"class":948},[885,2070,987],{"class":986},[885,2072,990],{"class":940},[885,2074,2075],{"class":887,"line":1095},[885,2076,1131],{"class":940},[885,2078,2079],{"class":887,"line":1115},[885,2080,996],{"emptyLinePlaceholder":8},[885,2082,2083,2085,2087,2090,2092,2094,2096,2098],{"class":887,"line":1128},[885,2084,930],{"class":929},[885,2086,2020],{"class":913},[885,2088,2089],{"class":1002}," getSession",[885,2091,965],{"class":940},[885,2093,2028],{"class":968},[885,2095,1011],{"class":948},[885,2097,1014],{"class":952},[885,2099,2044],{"class":940},[885,2101,2102,2105,2107,2109,2111,2113,2115],{"class":887,"line":1876},[885,2103,2104],{"class":929},"  return",[885,2106,1986],{"class":1674},[885,2108,1241],{"class":940},[885,2110,1815],{"class":1002},[885,2112,965],{"class":940},[885,2114,2028],{"class":1674},[885,2116,990],{"class":940},[885,2118,2119],{"class":887,"line":1881},[885,2120,1131],{"class":940},[885,2122,2123],{"class":887,"line":1887},[885,2124,996],{"emptyLinePlaceholder":8},[885,2126,2128,2130,2132,2135,2137,2139,2141,2143],{"class":887,"line":2127},18,[885,2129,930],{"class":929},[885,2131,2020],{"class":913},[885,2133,2134],{"class":1002}," peekSessionUnchecked",[885,2136,965],{"class":940},[885,2138,2028],{"class":968},[885,2140,1011],{"class":948},[885,2142,1014],{"class":952},[885,2144,2044],{"class":940},[885,2146,2148,2150,2152,2154,2157,2159,2161],{"class":887,"line":2147},19,[885,2149,2104],{"class":929},[885,2151,1986],{"class":1674},[885,2153,1241],{"class":940},[885,2155,2156],{"class":1002},"stale",[885,2158,965],{"class":940},[885,2160,2028],{"class":1674},[885,2162,990],{"class":940},[885,2164,2166],{"class":887,"line":2165},20,[885,2167,1131],{"class":940},[1432,2169,2170],{"color":1434,"icon":1435},[854,2171,2172,2173,2175],{},"The cache uses a background timer to periodically clean up\nexpired items, and ",[858,2174,1251],{}," also enforces expiration on access. This combination\nkeeps memory usage under control even when some keys are never read again.",[2177,2178,2179],"style",{},"html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .s5jk-, html code.shiki .s5jk-{--shiki-light:#267F99;--shiki-default:#267F99;--shiki-dark:#8BE9FD}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .sW-rI, html code.shiki .sW-rI{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .sFs1U, html code.shiki .sFs1U{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html pre.shiki code .sygFZ, html code.shiki .sygFZ{--shiki-light:#001080;--shiki-light-font-style:inherit;--shiki-default:#001080;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjsA6, html code.shiki .sjsA6{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#F8F8F2}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html pre.shiki code .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#F8F8F2}html pre.shiki code .sakC6, html code.shiki .sakC6{--shiki-light:#0000FF;--shiki-light-font-weight:inherit;--shiki-default:#0000FF;--shiki-default-font-weight:inherit;--shiki-dark:#FF79C6;--shiki-dark-font-weight:bold}",{"title":881,"searchDepth":895,"depth":895,"links":2181},[2182,2183,2184,2185,2192],{"id":872,"depth":895,"text":873},{"id":1134,"depth":895,"text":1135},{"id":1207,"depth":895,"text":1208},{"id":1300,"depth":895,"text":1301,"children":2186},[2187,2188,2189,2190,2191],{"id":1373,"depth":901,"text":1324},{"id":1446,"depth":901,"text":1334},{"id":1533,"depth":901,"text":1346},{"id":1587,"depth":901,"text":1356},{"id":1635,"depth":901,"text":1366},{"id":1651,"depth":895,"text":1652},"In-memory TTL cache with insertion-order eviction and LRU-style access refresh.","md","i-lucide-database",{},null,"---\ntitle: MiniCache\ndescription: In-memory TTL cache with insertion-order eviction and LRU-style access refresh.\nicon: i-lucide-database\n---\n\nThe `MiniCache` class is a lightweight, in-memory cache for short-lived values.\nIt combines per-entry TTL expiration with insertion-order eviction and an\nLRU-style refresh on successful reads. This makes it useful for request\ndeduplication, temporary lookup caching, and small per-process state stores.\n\n`MiniCache` works entirely in local process memory. It does not persist data,\nshare state across instances, or guarantee global consistency across multiple\nservers.\n\n---\n\n## Definition\n\n```ts [miniCache.ts]\n\u002F**\n * Small in-memory TTL cache supporting LRU-style eviction using insertion order.\n *\n * @typeParam T - Stored value type.\n *\u002F\nexport class MiniCache\u003CT = unknown> {\n  constructor(maxEntries = Infinity, sweepIntervalMs = 60_000)\n\n  stale(key: string): T | null\n  set(key: string, value: T, ttlMs: number): void\n  get(key: string): T | null\n  del(key: string): void\n  clear(): void\n}\n```\n\n## Constructor parameters\n\nCreate a `MiniCache` instance once, then reuse it for related values.\n\n| Parameter | Type | Default | Description |\n| --- | --- | --- | --- |\n| `maxEntries` | `number` | `Infinity` | Maximum number of keys stored at once. When the cache exceeds this size, the oldest key in insertion\u002Faccess order is evicted. |\n| `sweepIntervalMs` | `number` | `60000` | Interval in milliseconds for the background sweep that removes expired entries. |\n\n## Behavior\n\n`MiniCache` mixes TTL expiration with Map-based ordering rules. These behaviors\nmatter when you use it as the store for limiters, deduplication, or\nshort-lived memoization.\n\n| Behavior | Description |\n| --- | --- |\n| TTL expiration | Each `set()` call stores an absolute expiry timestamp based on `Date.now() + ttlMs`. |\n| Lazy expiration | `get()` removes expired values when you access them. |\n| Background cleanup | A timer periodically sweeps expired entries even if they are never read again. |\n| LRU-style refresh | A successful `get()` moves the key to the newest position in the internal `Map`. |\n| Insertion-order eviction | When `maxEntries` is exceeded, the oldest key in the current order is removed. |\n| Unref'd timer | In Node.js environments that support `unref()`, the sweep timer does not keep the process alive on its own. |\n\n## Methods\n\nThe class exposes five public methods. Together they let you add, read, inspect,\ndelete, and clear cached values.\n\n| Method | Description |\n| --- | --- |\n| `stale(key)` | Returns the stored value without checking expiry and without refreshing its position in the LRU order. |\n| `set(key, value, ttlMs)` | Adds or updates a value with a specific TTL and evicts the oldest entry if the cache grows beyond `maxEntries`. |\n| `get(key)` | Returns the cached value when it exists and is still fresh. Removes expired entries and refreshes successful reads to the newest position. |\n| `del(key)` | Immediately removes an entry. |\n| `clear()` | Clears all entries. |\n\n### `stale(key)`\n\n`stale()` reads the raw stored value without validating its TTL and without\nupdating the entry's position in the internal Map. Use it only when you\nexplicitly want an unchecked lookup.\n\n| Parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `key` | `string` | Yes | Cache key to inspect. |\n\n**Returns:** `T | null`. Returns the stored value when the key exists, or\n`null` when the key is missing.\n\n::callout{icon=\"i-lucide-info\" color=\"info\"}\n`stale()` does not check whether the entry is expired. If the background sweep\nhas not removed an expired key yet, `stale()` can still return that value.\n::\n\n### `set(key, value, ttlMs)`\n\n`set()` inserts a new entry or replaces an existing one. When a key already\nexists, the old value is removed first so the new write becomes the newest item\nin the eviction order.\n\nAfter the value is stored, `MiniCache` checks `maxEntries`. If the cache is now\ntoo large, it evicts the oldest key until the size is back within the limit.\n\n| Parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `key` | `string` | Yes | Unique cache key. |\n| `value` | `T` | Yes | Value to store in the cache. |\n| `ttlMs` | `number` | Yes | Time-to-live in milliseconds for this specific entry. |\n\n**Returns:** `void`.\n\n### `get(key)`\n\n`get()` is the main read method. It returns `null` when the key is missing or\nexpired. When the value is still valid, it moves the entry to the newest\nposition in the internal Map so frequently accessed keys are less likely to be\nevicted next.\n\n| Parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `key` | `string` | Yes | Cache key to retrieve. |\n\n**Returns:** `T | null`. Returns the fresh cached value, or `null` when the key\ndoes not exist or its TTL has expired.\n\n### `del(key)`\n\n`del()` removes one entry immediately. Use it when you know a cached value is no\nlonger valid and should not wait for TTL expiration.\n\n| Parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `key` | `string` | Yes | Cache key to delete. |\n\n**Returns:** `void`.\n\n### `clear()`\n\n`clear()` removes every cached entry at once. This is useful for teardown,\nmanual invalidation, or tests that need a clean cache state.\n\n**Returns:** `void`.\n\n## Example Usage\n\nThe most common pattern is caching short-lived values that are cheap to rebuild\nbut expensive to fetch repeatedly.\n\n```typescript [example.ts]\nimport { MiniCache } from '@riavzon\u002Futils'\n\n\u002F\u002F Cache up to 100 entries, and sweep expired items every 30 seconds.\nconst cache = new MiniCache\u003Cstring>(100, 30_000)\n\n\u002F\u002F Store a value with a 5-minute TTL.\ncache.set('user:1', 'John Doe', 5 * 60 * 1000)\n\n\u002F\u002F Read the cached value.\nconst user = cache.get('user:1')\nconsole.log(user) \u002F\u002F \"John Doe\"\n\n\u002F\u002F Successful reads refresh the key's position in the eviction order.\ncache.get('user:1')\n\n\u002F\u002F Remove the entry explicitly when it becomes invalid.\ncache.del('user:1')\n```\n\nYou can also use `MiniCache` to keep a small set of recent objects in memory\nwithout promoting stale values accidentally.\n\n```typescript [sessionCache.ts]\nimport { MiniCache } from '@riavzon\u002Futils'\n\ninterface SessionState {\n  userId: string\n  roles: string[]\n}\n\nconst sessions = new MiniCache\u003CSessionState>(10_000, 60_000)\n\nexport function storeSession(token: string, session: SessionState) {\n  sessions.set(token, session, 15 * 60_000)\n}\n\nexport function getSession(token: string) {\n  return sessions.get(token)\n}\n\nexport function peekSessionUnchecked(token: string) {\n  return sessions.stale(token)\n}\n```\n\n::callout{icon=\"i-lucide-info\" color=\"info\"}\nThe cache uses a background timer to periodically clean up\nexpired items, and `get()` also enforces expiration on access. This combination\nkeeps memory usage under control even when some keys are never read again.\n::\n",{"title":186,"description":2193},"Kr_jOdD6zRTeyhK11Z_qdyYKQdYdBQVHa136Z-9EQEU",[2202,2203],{"title":182,"path":183,"stem":184,"children":-1},{"title":190,"path":191,"stem":192,"children":-1},{"id":849,"title":186,"body":2205,"description":2193,"extension":2194,"icon":2195,"meta":3280,"module":2197,"navigation":8,"path":187,"rawbody":2198,"seo":3281,"stem":188,"__hash__":2200},{"type":851,"value":2206,"toc":3267},[2207,2211,2215,2217,2219,2401,2403,2407,2455,2457,2461,2523,2525,2527,2581,2585,2589,2619,2627,2635,2639,2643,2649,2707,2713,2717,2723,2753,2761,2765,2769,2799,2805,2809,2813,2819,2821,2823,3025,3029,3259,3265],[854,2208,856,2209,860],{},[858,2210,186],{},[854,2212,2213,865],{},[858,2214,186],{},[867,2216],{},[870,2218,873],{"id":872},[875,2220,2221],{"className":877,"code":878,"filename":879,"language":880,"meta":881,"style":881},[858,2222,2223,2227,2231,2235,2243,2247,2265,2287,2291,2313,2347,2369,2387,2397],{"__ignoreMap":881},[885,2224,2225],{"class":887,"line":888},[885,2226,892],{"class":891},[885,2228,2229],{"class":887,"line":895},[885,2230,898],{"class":891},[885,2232,2233],{"class":887,"line":901},[885,2234,904],{"class":891},[885,2236,2237,2239,2241],{"class":887,"line":907},[885,2238,910],{"class":891},[885,2240,914],{"class":913},[885,2242,917],{"class":891},[885,2244,2245],{"class":887,"line":920},[885,2246,923],{"class":891},[885,2248,2249,2251,2253,2255,2257,2259,2261,2263],{"class":887,"line":926},[885,2250,930],{"class":929},[885,2252,933],{"class":913},[885,2254,937],{"class":936},[885,2256,941],{"class":940},[885,2258,945],{"class":944},[885,2260,949],{"class":948},[885,2262,953],{"class":952},[885,2264,956],{"class":940},[885,2266,2267,2269,2271,2273,2275,2277,2279,2281,2283,2285],{"class":887,"line":959},[885,2268,962],{"class":913},[885,2270,965],{"class":940},[885,2272,969],{"class":968},[885,2274,949],{"class":948},[885,2276,975],{"class":974},[885,2278,978],{"class":940},[885,2280,981],{"class":968},[885,2282,949],{"class":948},[885,2284,987],{"class":986},[885,2286,990],{"class":940},[885,2288,2289],{"class":887,"line":993},[885,2290,996],{"emptyLinePlaceholder":8},[885,2292,2293,2295,2297,2299,2301,2303,2305,2307,2309,2311],{"class":887,"line":999},[885,2294,1003],{"class":1002},[885,2296,965],{"class":940},[885,2298,1008],{"class":968},[885,2300,1011],{"class":948},[885,2302,1014],{"class":952},[885,2304,1017],{"class":940},[885,2306,1011],{"class":948},[885,2308,1022],{"class":952},[885,2310,1025],{"class":948},[885,2312,1028],{"class":952},[885,2314,2315,2317,2319,2321,2323,2325,2327,2329,2331,2333,2335,2337,2339,2341,2343,2345],{"class":887,"line":1031},[885,2316,1034],{"class":1002},[885,2318,965],{"class":940},[885,2320,1008],{"class":968},[885,2322,1011],{"class":948},[885,2324,1014],{"class":952},[885,2326,978],{"class":940},[885,2328,1047],{"class":968},[885,2330,1011],{"class":948},[885,2332,1022],{"class":952},[885,2334,978],{"class":940},[885,2336,1056],{"class":968},[885,2338,1011],{"class":948},[885,2340,1061],{"class":952},[885,2342,1017],{"class":940},[885,2344,1011],{"class":948},[885,2346,1068],{"class":952},[885,2348,2349,2351,2353,2355,2357,2359,2361,2363,2365,2367],{"class":887,"line":1071},[885,2350,1074],{"class":1002},[885,2352,965],{"class":940},[885,2354,1008],{"class":968},[885,2356,1011],{"class":948},[885,2358,1014],{"class":952},[885,2360,1017],{"class":940},[885,2362,1011],{"class":948},[885,2364,1022],{"class":952},[885,2366,1025],{"class":948},[885,2368,1028],{"class":952},[885,2370,2371,2373,2375,2377,2379,2381,2383,2385],{"class":887,"line":1095},[885,2372,1098],{"class":1002},[885,2374,965],{"class":940},[885,2376,1008],{"class":968},[885,2378,1011],{"class":948},[885,2380,1014],{"class":952},[885,2382,1017],{"class":940},[885,2384,1011],{"class":948},[885,2386,1068],{"class":952},[885,2388,2389,2391,2393,2395],{"class":887,"line":1115},[885,2390,1118],{"class":1002},[885,2392,1121],{"class":940},[885,2394,1011],{"class":948},[885,2396,1068],{"class":952},[885,2398,2399],{"class":887,"line":1128},[885,2400,1131],{"class":940},[870,2402,1135],{"id":1134},[854,2404,1138,2405,1141],{},[858,2406,186],{},[1143,2408,2409,2421],{},[1146,2410,2411],{},[1149,2412,2413,2415,2417,2419],{},[1152,2414,1154],{},[1152,2416,1157],{},[1152,2418,1160],{},[1152,2420,1163],{},[1165,2422,2423,2439],{},[1149,2424,2425,2429,2433,2437],{},[1170,2426,2427],{},[858,2428,969],{},[1170,2430,2431],{},[858,2432,1178],{},[1170,2434,2435],{},[858,2436,1183],{},[1170,2438,1186],{},[1149,2440,2441,2445,2449,2453],{},[1170,2442,2443],{},[858,2444,981],{},[1170,2446,2447],{},[858,2448,1178],{},[1170,2450,2451],{},[858,2452,1201],{},[1170,2454,1204],{},[870,2456,1208],{"id":1207},[854,2458,2459,1213],{},[858,2460,186],{},[1143,2462,2463,2471],{},[1146,2464,2465],{},[1149,2466,2467,2469],{},[1152,2468,1208],{},[1152,2470,1163],{},[1165,2472,2473,2483,2491,2497,2507,2515],{},[1149,2474,2475,2477],{},[1170,2476,1230],{},[1170,2478,1233,2479,1237,2481,1241],{},[858,2480,1236],{},[858,2482,1240],{},[1149,2484,2485,2487],{},[1170,2486,1246],{},[1170,2488,2489,1252],{},[858,2490,1251],{},[1149,2492,2493,2495],{},[1170,2494,1257],{},[1170,2496,1260],{},[1149,2498,2499,2501],{},[1170,2500,1265],{},[1170,2502,1268,2503,1271,2505,1241],{},[858,2504,1251],{},[858,2506,1274],{},[1149,2508,2509,2511],{},[1170,2510,1279],{},[1170,2512,1282,2513,1285],{},[858,2514,969],{},[1149,2516,2517,2519],{},[1170,2518,1290],{},[1170,2520,1293,2521,1297],{},[858,2522,1296],{},[870,2524,1301],{"id":1300},[854,2526,1304],{},[1143,2528,2529,2537],{},[1146,2530,2531],{},[1149,2532,2533,2535],{},[1152,2534,1313],{},[1152,2536,1163],{},[1165,2538,2539,2547,2557,2565,2573],{},[1149,2540,2541,2545],{},[1170,2542,2543],{},[858,2544,1324],{},[1170,2546,1327],{},[1149,2548,2549,2553],{},[1170,2550,2551],{},[858,2552,1334],{},[1170,2554,1337,2555,1241],{},[858,2556,969],{},[1149,2558,2559,2563],{},[1170,2560,2561],{},[858,2562,1346],{},[1170,2564,1349],{},[1149,2566,2567,2571],{},[1170,2568,2569],{},[858,2570,1356],{},[1170,2572,1359],{},[1149,2574,2575,2579],{},[1170,2576,2577],{},[858,2578,1366],{},[1170,2580,1369],{},[1371,2582,2583],{"id":1373},[858,2584,1324],{},[854,2586,2587,1381],{},[858,2588,1380],{},[1143,2590,2591,2603],{},[1146,2592,2593],{},[1149,2594,2595,2597,2599,2601],{},[1152,2596,1154],{},[1152,2598,1157],{},[1152,2600,1394],{},[1152,2602,1163],{},[1165,2604,2605],{},[1149,2606,2607,2611,2615,2617],{},[1170,2608,2609],{},[858,2610,1008],{},[1170,2612,2613],{},[858,2614,1409],{},[1170,2616,1412],{},[1170,2618,1415],{},[854,2620,2621,1422,2623,1426,2625,1430],{},[1419,2622,1421],{},[858,2624,1425],{},[858,2626,1429],{},[1432,2628,2629],{"color":1434,"icon":1435},[854,2630,2631,1440,2633,1443],{},[858,2632,1380],{},[858,2634,1380],{},[1371,2636,2637],{"id":1446},[858,2638,1334],{},[854,2640,2641,1453],{},[858,2642,1236],{},[854,2644,1456,2645,1459,2647,1462],{},[858,2646,186],{},[858,2648,969],{},[1143,2650,2651,2663],{},[1146,2652,2653],{},[1149,2654,2655,2657,2659,2661],{},[1152,2656,1154],{},[1152,2658,1157],{},[1152,2660,1394],{},[1152,2662,1163],{},[1165,2664,2665,2679,2693],{},[1149,2666,2667,2671,2675,2677],{},[1170,2668,2669],{},[858,2670,1008],{},[1170,2672,2673],{},[858,2674,1409],{},[1170,2676,1412],{},[1170,2678,1493],{},[1149,2680,2681,2685,2689,2691],{},[1170,2682,2683],{},[858,2684,1047],{},[1170,2686,2687],{},[858,2688,945],{},[1170,2690,1412],{},[1170,2692,1508],{},[1149,2694,2695,2699,2703,2705],{},[1170,2696,2697],{},[858,2698,1056],{},[1170,2700,2701],{},[858,2702,1178],{},[1170,2704,1412],{},[1170,2706,1523],{},[854,2708,2709,1422,2711,1241],{},[1419,2710,1421],{},[858,2712,1530],{},[1371,2714,2715],{"id":1533},[858,2716,1346],{},[854,2718,2719,1540,2721,1543],{},[858,2720,1251],{},[858,2722,1429],{},[1143,2724,2725,2737],{},[1146,2726,2727],{},[1149,2728,2729,2731,2733,2735],{},[1152,2730,1154],{},[1152,2732,1157],{},[1152,2734,1394],{},[1152,2736,1163],{},[1165,2738,2739],{},[1149,2740,2741,2745,2749,2751],{},[1170,2742,2743],{},[858,2744,1008],{},[1170,2746,2747],{},[858,2748,1409],{},[1170,2750,1412],{},[1170,2752,1574],{},[854,2754,2755,1422,2757,1581,2759,1584],{},[1419,2756,1421],{},[858,2758,1425],{},[858,2760,1429],{},[1371,2762,2763],{"id":1587},[858,2764,1356],{},[854,2766,2767,1595],{},[858,2768,1594],{},[1143,2770,2771,2783],{},[1146,2772,2773],{},[1149,2774,2775,2777,2779,2781],{},[1152,2776,1154],{},[1152,2778,1157],{},[1152,2780,1394],{},[1152,2782,1163],{},[1165,2784,2785],{},[1149,2786,2787,2791,2795,2797],{},[1170,2788,2789],{},[858,2790,1008],{},[1170,2792,2793],{},[858,2794,1409],{},[1170,2796,1412],{},[1170,2798,1626],{},[854,2800,2801,1422,2803,1241],{},[1419,2802,1421],{},[858,2804,1530],{},[1371,2806,2807],{"id":1635},[858,2808,1366],{},[854,2810,2811,1642],{},[858,2812,1366],{},[854,2814,2815,1422,2817,1241],{},[1419,2816,1421],{},[858,2818,1530],{},[870,2820,1652],{"id":1651},[854,2822,1655],{},[875,2824,2825],{"className":1658,"code":1659,"filename":1660,"language":1661,"meta":881,"style":881},[858,2826,2827,2845,2849,2853,2879,2883,2887,2925,2929,2933,2957,2973,2977,2981,2999,3003,3007],{"__ignoreMap":881},[885,2828,2829,2831,2833,2835,2837,2839,2841,2843],{"class":887,"line":888},[885,2830,1668],{"class":929},[885,2832,1671],{"class":940},[885,2834,186],{"class":1674},[885,2836,1677],{"class":940},[885,2838,1680],{"class":929},[885,2840,1684],{"class":1683},[885,2842,1688],{"class":1687},[885,2844,1691],{"class":1683},[885,2846,2847],{"class":887,"line":895},[885,2848,996],{"emptyLinePlaceholder":8},[885,2850,2851],{"class":887,"line":901},[885,2852,1700],{"class":891},[885,2854,2855,2857,2859,2861,2863,2865,2867,2869,2871,2873,2875,2877],{"class":887,"line":907},[885,2856,1705],{"class":913},[885,2858,1709],{"class":1708},[885,2860,949],{"class":948},[885,2862,1715],{"class":1714},[885,2864,937],{"class":1002},[885,2866,941],{"class":940},[885,2868,1409],{"class":952},[885,2870,1724],{"class":940},[885,2872,1727],{"class":986},[885,2874,978],{"class":940},[885,2876,1732],{"class":986},[885,2878,990],{"class":940},[885,2880,2881],{"class":887,"line":920},[885,2882,996],{"emptyLinePlaceholder":8},[885,2884,2885],{"class":887,"line":926},[885,2886,1743],{"class":891},[885,2888,2889,2891,2893,2895,2897,2899,2901,2903,2905,2907,2909,2911,2913,2915,2917,2919,2921,2923],{"class":887,"line":959},[885,2890,1748],{"class":1674},[885,2892,1241],{"class":940},[885,2894,1753],{"class":1002},[885,2896,965],{"class":940},[885,2898,1758],{"class":1683},[885,2900,1761],{"class":1687},[885,2902,1758],{"class":1683},[885,2904,978],{"class":940},[885,2906,1758],{"class":1683},[885,2908,1770],{"class":1687},[885,2910,1758],{"class":1683},[885,2912,978],{"class":940},[885,2914,1777],{"class":986},[885,2916,1780],{"class":948},[885,2918,1783],{"class":986},[885,2920,1780],{"class":948},[885,2922,1788],{"class":986},[885,2924,990],{"class":940},[885,2926,2927],{"class":887,"line":993},[885,2928,996],{"emptyLinePlaceholder":8},[885,2930,2931],{"class":887,"line":999},[885,2932,1799],{"class":891},[885,2934,2935,2937,2939,2941,2943,2945,2947,2949,2951,2953,2955],{"class":887,"line":1031},[885,2936,1705],{"class":913},[885,2938,1806],{"class":1708},[885,2940,949],{"class":948},[885,2942,1709],{"class":1674},[885,2944,1241],{"class":940},[885,2946,1815],{"class":1002},[885,2948,965],{"class":940},[885,2950,1758],{"class":1683},[885,2952,1761],{"class":1687},[885,2954,1758],{"class":1683},[885,2956,990],{"class":940},[885,2958,2959,2961,2963,2965,2967,2969,2971],{"class":887,"line":1071},[885,2960,1830],{"class":1674},[885,2962,1241],{"class":940},[885,2964,1835],{"class":1002},[885,2966,965],{"class":940},[885,2968,1840],{"class":1674},[885,2970,1843],{"class":940},[885,2972,1846],{"class":891},[885,2974,2975],{"class":887,"line":1095},[885,2976,996],{"emptyLinePlaceholder":8},[885,2978,2979],{"class":887,"line":1115},[885,2980,1855],{"class":891},[885,2982,2983,2985,2987,2989,2991,2993,2995,2997],{"class":887,"line":1128},[885,2984,1748],{"class":1674},[885,2986,1241],{"class":940},[885,2988,1815],{"class":1002},[885,2990,965],{"class":940},[885,2992,1758],{"class":1683},[885,2994,1761],{"class":1687},[885,2996,1758],{"class":1683},[885,2998,990],{"class":940},[885,3000,3001],{"class":887,"line":1876},[885,3002,996],{"emptyLinePlaceholder":8},[885,3004,3005],{"class":887,"line":1881},[885,3006,1884],{"class":891},[885,3008,3009,3011,3013,3015,3017,3019,3021,3023],{"class":887,"line":1887},[885,3010,1748],{"class":1674},[885,3012,1241],{"class":940},[885,3014,1894],{"class":1002},[885,3016,965],{"class":940},[885,3018,1758],{"class":1683},[885,3020,1761],{"class":1687},[885,3022,1758],{"class":1683},[885,3024,990],{"class":940},[854,3026,1907,3027,1910],{},[858,3028,186],{},[875,3030,3031],{"className":1658,"code":1913,"filename":1914,"language":1661,"meta":881,"style":881},[858,3032,3033,3051,3055,3063,3071,3081,3085,3089,3115,3119,3145,3171,3175,3179,3197,3213,3217,3221,3239,3255],{"__ignoreMap":881},[885,3034,3035,3037,3039,3041,3043,3045,3047,3049],{"class":887,"line":888},[885,3036,1668],{"class":929},[885,3038,1671],{"class":940},[885,3040,186],{"class":1674},[885,3042,1677],{"class":940},[885,3044,1680],{"class":929},[885,3046,1684],{"class":1683},[885,3048,1688],{"class":1687},[885,3050,1691],{"class":1683},[885,3052,3053],{"class":887,"line":895},[885,3054,996],{"emptyLinePlaceholder":8},[885,3056,3057,3059,3061],{"class":887,"line":901},[885,3058,1943],{"class":913},[885,3060,1946],{"class":952},[885,3062,1949],{"class":940},[885,3064,3065,3067,3069],{"class":887,"line":907},[885,3066,1954],{"class":1674},[885,3068,1011],{"class":948},[885,3070,1959],{"class":952},[885,3072,3073,3075,3077,3079],{"class":887,"line":920},[885,3074,1964],{"class":1674},[885,3076,1011],{"class":948},[885,3078,1014],{"class":952},[885,3080,1971],{"class":940},[885,3082,3083],{"class":887,"line":926},[885,3084,1131],{"class":940},[885,3086,3087],{"class":887,"line":959},[885,3088,996],{"emptyLinePlaceholder":8},[885,3090,3091,3093,3095,3097,3099,3101,3103,3105,3107,3109,3111,3113],{"class":887,"line":993},[885,3092,1705],{"class":913},[885,3094,1986],{"class":1708},[885,3096,949],{"class":948},[885,3098,1715],{"class":1714},[885,3100,937],{"class":1002},[885,3102,941],{"class":940},[885,3104,1997],{"class":944},[885,3106,1724],{"class":940},[885,3108,2002],{"class":986},[885,3110,978],{"class":940},[885,3112,2007],{"class":986},[885,3114,990],{"class":940},[885,3116,3117],{"class":887,"line":999},[885,3118,996],{"emptyLinePlaceholder":8},[885,3120,3121,3123,3125,3127,3129,3131,3133,3135,3137,3139,3141,3143],{"class":887,"line":1031},[885,3122,930],{"class":929},[885,3124,2020],{"class":913},[885,3126,2023],{"class":1002},[885,3128,965],{"class":940},[885,3130,2028],{"class":968},[885,3132,1011],{"class":948},[885,3134,1014],{"class":952},[885,3136,978],{"class":940},[885,3138,2037],{"class":968},[885,3140,1011],{"class":948},[885,3142,1946],{"class":952},[885,3144,2044],{"class":940},[885,3146,3147,3149,3151,3153,3155,3157,3159,3161,3163,3165,3167,3169],{"class":887,"line":1071},[885,3148,2049],{"class":1674},[885,3150,1241],{"class":940},[885,3152,1753],{"class":1002},[885,3154,965],{"class":940},[885,3156,2028],{"class":1674},[885,3158,978],{"class":940},[885,3160,2037],{"class":1674},[885,3162,978],{"class":940},[885,3164,2066],{"class":986},[885,3166,1780],{"class":948},[885,3168,987],{"class":986},[885,3170,990],{"class":940},[885,3172,3173],{"class":887,"line":1095},[885,3174,1131],{"class":940},[885,3176,3177],{"class":887,"line":1115},[885,3178,996],{"emptyLinePlaceholder":8},[885,3180,3181,3183,3185,3187,3189,3191,3193,3195],{"class":887,"line":1128},[885,3182,930],{"class":929},[885,3184,2020],{"class":913},[885,3186,2089],{"class":1002},[885,3188,965],{"class":940},[885,3190,2028],{"class":968},[885,3192,1011],{"class":948},[885,3194,1014],{"class":952},[885,3196,2044],{"class":940},[885,3198,3199,3201,3203,3205,3207,3209,3211],{"class":887,"line":1876},[885,3200,2104],{"class":929},[885,3202,1986],{"class":1674},[885,3204,1241],{"class":940},[885,3206,1815],{"class":1002},[885,3208,965],{"class":940},[885,3210,2028],{"class":1674},[885,3212,990],{"class":940},[885,3214,3215],{"class":887,"line":1881},[885,3216,1131],{"class":940},[885,3218,3219],{"class":887,"line":1887},[885,3220,996],{"emptyLinePlaceholder":8},[885,3222,3223,3225,3227,3229,3231,3233,3235,3237],{"class":887,"line":2127},[885,3224,930],{"class":929},[885,3226,2020],{"class":913},[885,3228,2134],{"class":1002},[885,3230,965],{"class":940},[885,3232,2028],{"class":968},[885,3234,1011],{"class":948},[885,3236,1014],{"class":952},[885,3238,2044],{"class":940},[885,3240,3241,3243,3245,3247,3249,3251,3253],{"class":887,"line":2147},[885,3242,2104],{"class":929},[885,3244,1986],{"class":1674},[885,3246,1241],{"class":940},[885,3248,2156],{"class":1002},[885,3250,965],{"class":940},[885,3252,2028],{"class":1674},[885,3254,990],{"class":940},[885,3256,3257],{"class":887,"line":2165},[885,3258,1131],{"class":940},[1432,3260,3261],{"color":1434,"icon":1435},[854,3262,2172,3263,2175],{},[858,3264,1251],{},[2177,3266,2179],{},{"title":881,"searchDepth":895,"depth":895,"links":3268},[3269,3270,3271,3272,3279],{"id":872,"depth":895,"text":873},{"id":1134,"depth":895,"text":1135},{"id":1207,"depth":895,"text":1208},{"id":1300,"depth":895,"text":1301,"children":3273},[3274,3275,3276,3277,3278],{"id":1373,"depth":901,"text":1324},{"id":1446,"depth":901,"text":1334},{"id":1533,"depth":901,"text":1346},{"id":1587,"depth":901,"text":1356},{"id":1635,"depth":901,"text":1366},{"id":1651,"depth":895,"text":1652},{},{"title":186,"description":2193},1780436297383]