@withwiz/toolkit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (380) hide show
  1. package/README.md +162 -0
  2. package/dist/auth/adapters/prisma/index.d.ts +43 -0
  3. package/dist/auth/adapters/prisma/index.js +284 -0
  4. package/dist/auth/core/email/token-generator.d.ts +43 -0
  5. package/dist/auth/core/email/token-generator.js +7 -0
  6. package/dist/auth/core/jwt/client.d.ts +87 -0
  7. package/dist/auth/core/jwt/client.js +36 -0
  8. package/dist/auth/core/jwt/index.d.ts +110 -0
  9. package/dist/auth/core/jwt/index.js +10 -0
  10. package/dist/auth/core/jwt/types.d.ts +6 -0
  11. package/dist/auth/core/jwt/types.js +13 -0
  12. package/dist/auth/core/oauth/index.d.ts +51 -0
  13. package/dist/auth/core/oauth/index.js +12 -0
  14. package/dist/auth/core/password/client-helper.d.ts +44 -0
  15. package/dist/auth/core/password/client-helper.js +28 -0
  16. package/dist/auth/core/password/index.d.ts +71 -0
  17. package/dist/auth/core/password/index.js +14 -0
  18. package/dist/auth/errors/index.d.ts +49 -0
  19. package/dist/auth/errors/index.js +17 -0
  20. package/dist/auth/index.d.ts +21 -0
  21. package/dist/auth/index.js +97 -0
  22. package/dist/auth/types/index.d.ts +213 -0
  23. package/dist/auth/types/index.js +13 -0
  24. package/dist/cache/cache-config.d.ts +73 -0
  25. package/dist/cache/cache-config.js +12 -0
  26. package/dist/cache/cache-defaults.d.ts +141 -0
  27. package/dist/cache/cache-defaults.js +33 -0
  28. package/dist/cache/cache-env.d.ts +75 -0
  29. package/dist/cache/cache-env.js +25 -0
  30. package/dist/cache/cache-factory.d.ts +34 -0
  31. package/dist/cache/cache-factory.js +28 -0
  32. package/dist/cache/cache-invalidation.d.ts +90 -0
  33. package/dist/cache/cache-invalidation.js +24 -0
  34. package/dist/cache/cache-keys-legacy.d.ts +35 -0
  35. package/dist/cache/cache-keys-legacy.js +7 -0
  36. package/dist/cache/cache-redis.d.ts +74 -0
  37. package/dist/cache/cache-redis.js +24 -0
  38. package/dist/cache/cache-types.d.ts +151 -0
  39. package/dist/cache/cache-types.js +9 -0
  40. package/dist/cache/cache-wrapper.d.ts +27 -0
  41. package/dist/cache/cache-wrapper.js +22 -0
  42. package/dist/cache/cache.d.ts +14 -0
  43. package/dist/cache/cache.js +112 -0
  44. package/dist/cache/hybrid-cache-manager.d.ts +148 -0
  45. package/dist/cache/hybrid-cache-manager.js +13 -0
  46. package/dist/cache/index.d.ts +21 -0
  47. package/dist/cache/index.js +112 -0
  48. package/dist/cache/inmemory-cache-manager.d.ts +163 -0
  49. package/dist/cache/inmemory-cache-manager.js +9 -0
  50. package/dist/cache/noop-cache-manager.d.ts +36 -0
  51. package/dist/cache/noop-cache-manager.js +11 -0
  52. package/dist/cache/redis-cache-manager.d.ts +34 -0
  53. package/dist/cache/redis-cache-manager.js +11 -0
  54. package/dist/chunk-26Y7VEYG.js +93 -0
  55. package/dist/chunk-2DVWSDST.js +119 -0
  56. package/dist/chunk-2KAPUVIS.js +155 -0
  57. package/dist/chunk-2TO7WUKK.js +93 -0
  58. package/dist/chunk-34WAGUT5.js +117 -0
  59. package/dist/chunk-3DZA6AGS.js +120 -0
  60. package/dist/chunk-4DPSCTX4.js +212 -0
  61. package/dist/chunk-4KJXENRM.js +64 -0
  62. package/dist/chunk-4NWJ3WCZ.js +28 -0
  63. package/dist/chunk-4ODT3Q4A.js +86 -0
  64. package/dist/chunk-5ATB5D6S.js +40 -0
  65. package/dist/chunk-62FLBG6B.js +34 -0
  66. package/dist/chunk-62Q7DN5G.js +25 -0
  67. package/dist/chunk-65LHDFU3.js +242 -0
  68. package/dist/chunk-6C7HQIX4.js +13 -0
  69. package/dist/chunk-6D3HHYER.js +32 -0
  70. package/dist/chunk-6LTZCXNC.js +326 -0
  71. package/dist/chunk-7VJNLGAS.js +110 -0
  72. package/dist/chunk-7XFHGAJP.js +0 -0
  73. package/dist/chunk-A6EAAWMK.js +50 -0
  74. package/dist/chunk-AHDPGRXS.js +51 -0
  75. package/dist/chunk-AIH3F7JV.js +76 -0
  76. package/dist/chunk-AIHQBQ3E.js +109 -0
  77. package/dist/chunk-BKGVSC6S.js +152 -0
  78. package/dist/chunk-COK4ZXNG.js +0 -0
  79. package/dist/chunk-DEEJBDJE.js +47 -0
  80. package/dist/chunk-DH2ZHGW2.js +53 -0
  81. package/dist/chunk-EBUEBEJX.js +0 -0
  82. package/dist/chunk-EEUBKZV4.js +54 -0
  83. package/dist/chunk-EQYTE7WD.js +139 -0
  84. package/dist/chunk-EUQATJLI.js +180 -0
  85. package/dist/chunk-EZC6ETFW.js +80 -0
  86. package/dist/chunk-EZR55KV2.js +249 -0
  87. package/dist/chunk-F6LCSFSU.js +31 -0
  88. package/dist/chunk-FOKAATUQ.js +62 -0
  89. package/dist/chunk-FW3IEJ7H.js +71 -0
  90. package/dist/chunk-G26T2PRQ.js +53 -0
  91. package/dist/chunk-G4NI37NN.js +257 -0
  92. package/dist/chunk-GCZOXUDV.js +132 -0
  93. package/dist/chunk-GDWEDUHO.js +55 -0
  94. package/dist/chunk-GL2NANFH.js +434 -0
  95. package/dist/chunk-GPBOMJSZ.js +136 -0
  96. package/dist/chunk-H5I5GWAA.js +94 -0
  97. package/dist/chunk-HGC4CCKB.js +29 -0
  98. package/dist/chunk-HV3DGSSH.js +447 -0
  99. package/dist/chunk-I47QEDTX.js +193 -0
  100. package/dist/chunk-IAJNC34M.js +102 -0
  101. package/dist/chunk-IHXRF3BH.js +215 -0
  102. package/dist/chunk-IJEZ7G7S.js +26 -0
  103. package/dist/chunk-IQQKKUAV.js +151 -0
  104. package/dist/chunk-JBCDEAMW.js +35 -0
  105. package/dist/chunk-JLLMTTQ4.js +75 -0
  106. package/dist/chunk-JS5VI3OW.js +143 -0
  107. package/dist/chunk-KAWVMIRJ.js +44 -0
  108. package/dist/chunk-KMCJIL57.js +214 -0
  109. package/dist/chunk-KWTBD4CM.js +145 -0
  110. package/dist/chunk-KXAWBFJN.js +310 -0
  111. package/dist/chunk-L25BNU3E.js +56 -0
  112. package/dist/chunk-L76O3X3D.js +197 -0
  113. package/dist/chunk-LNV2E4I6.js +63 -0
  114. package/dist/chunk-MLGO3HLS.js +329 -0
  115. package/dist/chunk-MRJE6OX5.js +22 -0
  116. package/dist/chunk-MYLGYX4K.js +57 -0
  117. package/dist/chunk-N4YGR5WH.js +310 -0
  118. package/dist/chunk-OIVXOT2X.js +80 -0
  119. package/dist/chunk-ORMEWXMH.js +37 -0
  120. package/dist/chunk-POKGHK3L.js +57 -0
  121. package/dist/chunk-Q7IP4JMW.js +69 -0
  122. package/dist/chunk-RJUVBBZG.js +27 -0
  123. package/dist/chunk-S73334QY.js +89 -0
  124. package/dist/chunk-SLG26KHZ.js +101 -0
  125. package/dist/chunk-SR65BF6X.js +82 -0
  126. package/dist/chunk-SS56XFLI.js +19 -0
  127. package/dist/chunk-T3LJYAMO.js +277 -0
  128. package/dist/chunk-TDZJ6SAI.js +34 -0
  129. package/dist/chunk-TEIYA7U4.js +72 -0
  130. package/dist/chunk-TMVS4F7E.js +88 -0
  131. package/dist/chunk-TRBKJ7JT.js +137 -0
  132. package/dist/chunk-TXGNSECL.js +84 -0
  133. package/dist/chunk-TZAP5T4N.js +188 -0
  134. package/dist/chunk-UCYQNHST.js +24 -0
  135. package/dist/chunk-ULF5RDDX.js +0 -0
  136. package/dist/chunk-UXQRU3EM.js +167 -0
  137. package/dist/chunk-V5K5FYU7.js +200 -0
  138. package/dist/chunk-VDXB5DCY.js +68 -0
  139. package/dist/chunk-VSGKVZB4.js +47 -0
  140. package/dist/chunk-VWODEQ5C.js +204 -0
  141. package/dist/chunk-WDUFQFDP.js +193 -0
  142. package/dist/chunk-WHR7HPWF.js +126 -0
  143. package/dist/chunk-WSQMXMTL.js +122 -0
  144. package/dist/chunk-XHZ5L4FO.js +103 -0
  145. package/dist/chunk-XPASCCUA.js +404 -0
  146. package/dist/chunk-XRRPEBKB.js +231 -0
  147. package/dist/chunk-Y2TUZFCP.js +0 -0
  148. package/dist/chunk-Y3OTJH2S.js +473 -0
  149. package/dist/chunk-YBSHN67U.js +161 -0
  150. package/dist/chunk-YJ3TLEW3.js +100 -0
  151. package/dist/chunk-YJWLWUFK.js +105 -0
  152. package/dist/chunk-Z4D4CMDA.js +488 -0
  153. package/dist/chunk-ZHVUK5OY.js +314 -0
  154. package/dist/chunk-ZTN4X5FN.js +29 -0
  155. package/dist/chunk-ZZIKRBJU.js +96 -0
  156. package/dist/components/ui/Alert.d.ts +12 -0
  157. package/dist/components/ui/Alert.js +10 -0
  158. package/dist/components/ui/Badge.d.ts +7 -0
  159. package/dist/components/ui/Badge.js +8 -0
  160. package/dist/components/ui/Button.d.ts +7 -0
  161. package/dist/components/ui/Button.js +8 -0
  162. package/dist/components/ui/DataTable.d.ts +103 -0
  163. package/dist/components/ui/DataTable.js +606 -0
  164. package/dist/components/ui/DomainDisplay.d.ts +12 -0
  165. package/dist/components/ui/DomainDisplay.js +31 -0
  166. package/dist/components/ui/Input.d.ts +5 -0
  167. package/dist/components/ui/Input.js +8 -0
  168. package/dist/components/ui/Label.d.ts +5 -0
  169. package/dist/components/ui/Label.js +8 -0
  170. package/dist/components/ui/Pagination.d.ts +42 -0
  171. package/dist/components/ui/Pagination.js +20 -0
  172. package/dist/components/ui/Select.d.ts +15 -0
  173. package/dist/components/ui/Select.js +27 -0
  174. package/dist/components/ui/Skeleton.d.ts +6 -0
  175. package/dist/components/ui/Skeleton.js +8 -0
  176. package/dist/components/ui/TimezoneDisplay.d.ts +22 -0
  177. package/dist/components/ui/TimezoneDisplay.js +83 -0
  178. package/dist/components/ui/Tooltip.d.ts +21 -0
  179. package/dist/components/ui/Tooltip.js +94 -0
  180. package/dist/components/ui/WorldMapChart.d.ts +17 -0
  181. package/dist/components/ui/WorldMapChart.js +250 -0
  182. package/dist/components/ui/loading-bar.d.ts +20 -0
  183. package/dist/components/ui/loading-bar.js +15 -0
  184. package/dist/constants/error-codes.d.ts +389 -0
  185. package/dist/constants/error-codes.js +27 -0
  186. package/dist/constants/index.d.ts +11 -0
  187. package/dist/constants/index.js +85 -0
  188. package/dist/constants/messages.d.ts +83 -0
  189. package/dist/constants/messages.js +13 -0
  190. package/dist/constants/pagination.d.ts +43 -0
  191. package/dist/constants/pagination.js +15 -0
  192. package/dist/constants/security.d.ts +66 -0
  193. package/dist/constants/security.js +23 -0
  194. package/dist/constants/validation.d.ts +60 -0
  195. package/dist/constants/validation.js +19 -0
  196. package/dist/error/ErrorBoundary.d.ts +47 -0
  197. package/dist/error/app-error.d.ts +144 -0
  198. package/dist/error/app-error.js +10 -0
  199. package/dist/error/components/EmptyState.d.ts +50 -0
  200. package/dist/error/components/ErrorAlert.d.ts +50 -0
  201. package/dist/error/components/ErrorPage.d.ts +39 -0
  202. package/dist/error/components/LoadingState.d.ts +37 -0
  203. package/dist/error/components/index.d.ts +13 -0
  204. package/dist/error/components/index.js +18 -0
  205. package/dist/error/core/locale-detector.d.ts +44 -0
  206. package/dist/error/core/locale-detector.js +9 -0
  207. package/dist/error/error-display.d.ts +55 -0
  208. package/dist/error/error-display.js +24 -0
  209. package/dist/error/error-handler.d.ts +118 -0
  210. package/dist/error/error-handler.js +18 -0
  211. package/dist/error/friendly-messages-v2.d.ts +46 -0
  212. package/dist/error/friendly-messages-v2.js +15 -0
  213. package/dist/error/friendly-messages.d.ts +22 -0
  214. package/dist/error/friendly-messages.js +12 -0
  215. package/dist/error/hooks/index.d.ts +7 -0
  216. package/dist/error/hooks/index.js +14 -0
  217. package/dist/error/hooks/useErrorHandler.d.ts +67 -0
  218. package/dist/error/hooks/useErrorHandler.js +14 -0
  219. package/dist/error/index.d.ts +26 -0
  220. package/dist/error/index.js +289 -0
  221. package/dist/error/logging/error-logger.d.ts +77 -0
  222. package/dist/error/logging/error-logger.js +10 -0
  223. package/dist/error/logging/index.d.ts +9 -0
  224. package/dist/error/logging/index.js +35 -0
  225. package/dist/error/logging/transports/base.d.ts +30 -0
  226. package/dist/error/logging/transports/base.js +7 -0
  227. package/dist/error/logging/transports/console.d.ts +40 -0
  228. package/dist/error/logging/transports/console.js +9 -0
  229. package/dist/error/logging/transports/file.d.ts +49 -0
  230. package/dist/error/logging/transports/file.js +8 -0
  231. package/dist/error/logging/transports/index.d.ts +12 -0
  232. package/dist/error/logging/transports/index.js +25 -0
  233. package/dist/error/logging/transports/sentry.d.ts +44 -0
  234. package/dist/error/logging/transports/sentry.js +9 -0
  235. package/dist/error/logging/transports/slack.d.ts +51 -0
  236. package/dist/error/logging/transports/slack.js +9 -0
  237. package/dist/error/logging/types.d.ts +83 -0
  238. package/dist/error/logging/types.js +7 -0
  239. package/dist/error/messages/en.d.ts +5 -0
  240. package/dist/error/messages/en.js +7 -0
  241. package/dist/error/messages/index.d.ts +40 -0
  242. package/dist/error/messages/index.js +17 -0
  243. package/dist/error/messages/ko.d.ts +5 -0
  244. package/dist/error/messages/ko.js +7 -0
  245. package/dist/error/messages/types.d.ts +30 -0
  246. package/dist/error/messages/types.js +0 -0
  247. package/dist/error/recovery/circuit-breaker.d.ts +85 -0
  248. package/dist/error/recovery/circuit-breaker.js +9 -0
  249. package/dist/error/recovery/degradation.d.ts +56 -0
  250. package/dist/error/recovery/degradation.js +7 -0
  251. package/dist/error/recovery/fallback.d.ts +55 -0
  252. package/dist/error/recovery/fallback.js +11 -0
  253. package/dist/error/recovery/index.d.ts +12 -0
  254. package/dist/error/recovery/index.js +26 -0
  255. package/dist/error/recovery/retry.d.ts +44 -0
  256. package/dist/error/recovery/retry.js +7 -0
  257. package/dist/geolocation/batch-processor.d.ts +33 -0
  258. package/dist/geolocation/batch-processor.js +10 -0
  259. package/dist/geolocation/index.d.ts +14 -0
  260. package/dist/geolocation/index.js +36 -0
  261. package/dist/geolocation/providers/base-provider.d.ts +33 -0
  262. package/dist/geolocation/providers/base-provider.js +9 -0
  263. package/dist/geolocation/providers/index.d.ts +54 -0
  264. package/dist/geolocation/providers/index.js +29 -0
  265. package/dist/geolocation/providers/ip-api-provider.d.ts +17 -0
  266. package/dist/geolocation/providers/ip-api-provider.js +8 -0
  267. package/dist/geolocation/providers/ipapi-co-provider.d.ts +17 -0
  268. package/dist/geolocation/providers/ipapi-co-provider.js +8 -0
  269. package/dist/geolocation/providers/ipgeolocation-provider.d.ts +18 -0
  270. package/dist/geolocation/providers/ipgeolocation-provider.js +8 -0
  271. package/dist/geolocation/providers/maxmind-provider.d.ts +18 -0
  272. package/dist/geolocation/providers/maxmind-provider.js +8 -0
  273. package/dist/hooks/useDataTable.d.ts +51 -0
  274. package/dist/hooks/useDataTable.js +149 -0
  275. package/dist/hooks/useDebounce.d.ts +7 -0
  276. package/dist/hooks/useDebounce.js +7 -0
  277. package/dist/hooks/useExitIntent.d.ts +35 -0
  278. package/dist/hooks/useExitIntent.js +72 -0
  279. package/dist/hooks/useTimezone.d.ts +19 -0
  280. package/dist/hooks/useTimezone.js +11 -0
  281. package/dist/logger/logger.d.ts +11 -0
  282. package/dist/logger/logger.js +17 -0
  283. package/dist/middleware/auth.d.ts +87 -0
  284. package/dist/middleware/auth.js +20 -0
  285. package/dist/middleware/cors.d.ts +30 -0
  286. package/dist/middleware/cors.js +10 -0
  287. package/dist/middleware/error-handler.d.ts +23 -0
  288. package/dist/middleware/error-handler.js +13 -0
  289. package/dist/middleware/index.d.ts +16 -0
  290. package/dist/middleware/index.js +72 -0
  291. package/dist/middleware/init-request.d.ts +18 -0
  292. package/dist/middleware/init-request.js +8 -0
  293. package/dist/middleware/middleware-chain.d.ts +53 -0
  294. package/dist/middleware/middleware-chain.js +8 -0
  295. package/dist/middleware/rate-limit.d.ts +82 -0
  296. package/dist/middleware/rate-limit.js +14 -0
  297. package/dist/middleware/response-logger.d.ts +22 -0
  298. package/dist/middleware/response-logger.js +8 -0
  299. package/dist/middleware/security.d.ts +31 -0
  300. package/dist/middleware/security.js +9 -0
  301. package/dist/middleware/types.d.ts +45 -0
  302. package/dist/middleware/types.js +0 -0
  303. package/dist/middleware/wrappers.d.ts +91 -0
  304. package/dist/middleware/wrappers.js +32 -0
  305. package/dist/storage/r2-storage.d.ts +38 -0
  306. package/dist/storage/r2-storage.js +105 -0
  307. package/dist/system/cpu.d.ts +2 -0
  308. package/dist/system/cpu.js +9 -0
  309. package/dist/system/disk.d.ts +2 -0
  310. package/dist/system/disk.js +9 -0
  311. package/dist/system/environment.d.ts +8 -0
  312. package/dist/system/environment.js +9 -0
  313. package/dist/system/health-check.d.ts +26 -0
  314. package/dist/system/health-check.js +10 -0
  315. package/dist/system/index.d.ts +51 -0
  316. package/dist/system/index.js +194 -0
  317. package/dist/system/memory.d.ts +2 -0
  318. package/dist/system/memory.js +9 -0
  319. package/dist/system/network.d.ts +2 -0
  320. package/dist/system/network.js +9 -0
  321. package/dist/system/types.d.ts +93 -0
  322. package/dist/system/types.js +0 -0
  323. package/dist/system/utils.d.ts +12 -0
  324. package/dist/system/utils.js +26 -0
  325. package/dist/types/api.d.ts +80 -0
  326. package/dist/types/api.js +0 -0
  327. package/dist/types/database.d.ts +38 -0
  328. package/dist/types/database.js +0 -0
  329. package/dist/types/env.d.ts +105 -0
  330. package/dist/types/env.js +0 -0
  331. package/dist/types/geoip.d.ts +152 -0
  332. package/dist/types/geoip.js +0 -0
  333. package/dist/types/i18n.d.ts +11 -0
  334. package/dist/types/i18n.js +0 -0
  335. package/dist/types/qr-code.d.ts +139 -0
  336. package/dist/types/qr-code.js +75 -0
  337. package/dist/types/user.d.ts +54 -0
  338. package/dist/types/user.js +0 -0
  339. package/dist/utils/api-helpers.d.ts +147 -0
  340. package/dist/utils/api-helpers.js +30 -0
  341. package/dist/utils/client/client-utils.d.ts +3 -0
  342. package/dist/utils/client/client-utils.js +9 -0
  343. package/dist/utils/client/qr-code.d.ts +16 -0
  344. package/dist/utils/client/qr-code.js +215 -0
  345. package/dist/utils/cors.d.ts +40 -0
  346. package/dist/utils/cors.js +21 -0
  347. package/dist/utils/csv-export.d.ts +97 -0
  348. package/dist/utils/csv-export.js +20 -0
  349. package/dist/utils/error-message-formatter.d.ts +17 -0
  350. package/dist/utils/error-message-formatter.js +11 -0
  351. package/dist/utils/error-processor.d.ts +70 -0
  352. package/dist/utils/error-processor.js +34 -0
  353. package/dist/utils/format-number.d.ts +17 -0
  354. package/dist/utils/format-number.js +9 -0
  355. package/dist/utils/index.d.ts +13 -0
  356. package/dist/utils/index.js +160 -0
  357. package/dist/utils/input-validation.d.ts +88 -0
  358. package/dist/utils/input-validation.js +223 -0
  359. package/dist/utils/ip-utils.d.ts +15 -0
  360. package/dist/utils/ip-utils.js +91 -0
  361. package/dist/utils/optimistic-lock.d.ts +27 -0
  362. package/dist/utils/optimistic-lock.js +16 -0
  363. package/dist/utils/sanitizer.d.ts +72 -0
  364. package/dist/utils/sanitizer.js +19 -0
  365. package/dist/utils/shared-utils.d.ts +25 -0
  366. package/dist/utils/shared-utils.js +43 -0
  367. package/dist/utils/short-code-generator.d.ts +24 -0
  368. package/dist/utils/short-code-generator.js +9 -0
  369. package/dist/utils/timezone.d.ts +56 -0
  370. package/dist/utils/timezone.js +29 -0
  371. package/dist/utils/type-guards.d.ts +164 -0
  372. package/dist/utils/type-guards.js +59 -0
  373. package/dist/utils/url-normalizer.d.ts +53 -0
  374. package/dist/utils/url-normalizer.js +21 -0
  375. package/dist/validators/index.d.ts +7 -0
  376. package/dist/validators/index.js +13 -0
  377. package/dist/validators/password-validator.d.ts +86 -0
  378. package/dist/validators/password-validator.js +13 -0
  379. package/dist/world_countries-C2WUL2CQ.js +279 -0
  380. package/package.json +129 -0
@@ -0,0 +1,447 @@
1
+ import {
2
+ InMemoryCacheManager
3
+ } from "./chunk-Z4D4CMDA.js";
4
+ import {
5
+ isRedisGloballyDisabled,
6
+ notifyRedisError
7
+ } from "./chunk-6LTZCXNC.js";
8
+ import {
9
+ getCacheFallbackConfig
10
+ } from "./chunk-I47QEDTX.js";
11
+ import {
12
+ logger
13
+ } from "./chunk-EZR55KV2.js";
14
+ import {
15
+ __spreadValues
16
+ } from "./chunk-ORMEWXMH.js";
17
+
18
+ // src/cache/hybrid-cache-manager.ts
19
+ function getDefaultHybridConfig() {
20
+ const fallbackConfig = getCacheFallbackConfig();
21
+ return {
22
+ backend: "hybrid",
23
+ fallbackOnRedisError: fallbackConfig.fallbackOnRedisError,
24
+ writeToMemory: fallbackConfig.writeToMemory,
25
+ redisErrorThreshold: fallbackConfig.redisErrorThresholdLocal,
26
+ redisReconnectInterval: fallbackConfig.redisReconnectInterval
27
+ };
28
+ }
29
+ var HybridCacheManager = class _HybridCacheManager {
30
+ constructor(prefix, config) {
31
+ // Redis 상태 추적
32
+ this.redisErrorCount = 0;
33
+ this.lastRedisError = null;
34
+ this.lastRedisErrorMessage = null;
35
+ this.isRedisTemporarilyDisabled = false;
36
+ this.redisReconnectTimer = null;
37
+ // 메트릭
38
+ this.redisFallbackCount = 0;
39
+ this.prefix = prefix;
40
+ this.config = __spreadValues(__spreadValues({}, getDefaultHybridConfig()), config);
41
+ this.redisManager = config.redisManager;
42
+ this.memoryCache = InMemoryCacheManager.getInstance(prefix, config.inmemoryConfig);
43
+ logger.info(`[HybridCacheManager] Initialized: prefix=${prefix}, backend=${this.config.backend}, redis=${this.redisManager ? "Y" : "N"}`);
44
+ }
45
+ // ============================================================================
46
+ // Public Methods
47
+ // ============================================================================
48
+ /**
49
+ * 캐시에서 값 조회
50
+ */
51
+ async get(key) {
52
+ const effectiveBackend = this.getEffectiveBackend();
53
+ if (effectiveBackend === "memory") {
54
+ return this.memoryCache.get(key);
55
+ }
56
+ if (this.redisManager && !this.isRedisTemporarilyDisabled) {
57
+ try {
58
+ const result = await this.redisManager.get(key);
59
+ if (result !== null) {
60
+ this.resetRedisErrorState();
61
+ return result;
62
+ }
63
+ } catch (error) {
64
+ this.handleRedisError(error, "get");
65
+ if (effectiveBackend === "hybrid" && this.config.fallbackOnRedisError) {
66
+ this.redisFallbackCount++;
67
+ return this.memoryCache.get(key);
68
+ }
69
+ }
70
+ }
71
+ if (effectiveBackend === "hybrid") {
72
+ return this.memoryCache.get(key);
73
+ }
74
+ return null;
75
+ }
76
+ /**
77
+ * 캐시에 값 저장
78
+ */
79
+ async set(key, value, ttl) {
80
+ const effectiveBackend = this.getEffectiveBackend();
81
+ if (effectiveBackend === "memory") {
82
+ await this.memoryCache.set(key, value, ttl);
83
+ return;
84
+ }
85
+ if (effectiveBackend === "redis") {
86
+ if (this.redisManager && !this.isRedisTemporarilyDisabled) {
87
+ try {
88
+ await this.redisManager.set(key, value, ttl);
89
+ this.resetRedisErrorState();
90
+ } catch (error) {
91
+ this.handleRedisError(error, "set");
92
+ }
93
+ }
94
+ return;
95
+ }
96
+ const promises = [];
97
+ if (this.redisManager && !this.isRedisTemporarilyDisabled) {
98
+ promises.push(
99
+ this.redisManager.set(key, value, ttl).then(() => this.resetRedisErrorState()).catch((error) => {
100
+ this.handleRedisError(error, "set");
101
+ })
102
+ );
103
+ }
104
+ if (this.config.writeToMemory || this.isRedisTemporarilyDisabled) {
105
+ promises.push(this.memoryCache.set(key, value, ttl));
106
+ }
107
+ await Promise.allSettled(promises);
108
+ }
109
+ /**
110
+ * 캐시에서 항목 삭제
111
+ */
112
+ async delete(key) {
113
+ const effectiveBackend = this.getEffectiveBackend();
114
+ const promises = [];
115
+ if (effectiveBackend !== "memory" && this.redisManager && !this.isRedisTemporarilyDisabled) {
116
+ promises.push(
117
+ this.redisManager.delete(key).catch((error) => {
118
+ this.handleRedisError(error, "delete");
119
+ })
120
+ );
121
+ }
122
+ if (effectiveBackend !== "redis") {
123
+ promises.push(this.memoryCache.delete(key));
124
+ }
125
+ await Promise.allSettled(promises);
126
+ }
127
+ /**
128
+ * 패턴 매칭으로 캐시 삭제
129
+ */
130
+ async deletePattern(pattern) {
131
+ const effectiveBackend = this.getEffectiveBackend();
132
+ const promises = [];
133
+ if (effectiveBackend !== "memory" && this.redisManager && !this.isRedisTemporarilyDisabled) {
134
+ promises.push(
135
+ this.redisManager.deletePattern(pattern).catch((error) => {
136
+ this.handleRedisError(error, "deletePattern");
137
+ })
138
+ );
139
+ }
140
+ if (effectiveBackend !== "redis") {
141
+ promises.push(this.memoryCache.deletePattern(pattern));
142
+ }
143
+ await Promise.allSettled(promises);
144
+ }
145
+ /**
146
+ * 키 존재 여부 확인
147
+ */
148
+ async exists(key) {
149
+ const effectiveBackend = this.getEffectiveBackend();
150
+ if (effectiveBackend === "memory") {
151
+ return this.memoryCache.exists(key);
152
+ }
153
+ if (this.redisManager && !this.isRedisTemporarilyDisabled) {
154
+ try {
155
+ const exists = await this.redisManager.exists(key);
156
+ if (exists) {
157
+ this.resetRedisErrorState();
158
+ return true;
159
+ }
160
+ } catch (error) {
161
+ this.handleRedisError(error, "exists");
162
+ }
163
+ }
164
+ if (effectiveBackend === "hybrid") {
165
+ return this.memoryCache.exists(key);
166
+ }
167
+ return false;
168
+ }
169
+ /**
170
+ * 값 증가
171
+ */
172
+ async increment(key, value = 1) {
173
+ const effectiveBackend = this.getEffectiveBackend();
174
+ if (effectiveBackend === "memory") {
175
+ return this.memoryCache.increment(key, value);
176
+ }
177
+ if (this.redisManager && !this.isRedisTemporarilyDisabled) {
178
+ try {
179
+ const result = await this.redisManager.increment(key, value);
180
+ this.resetRedisErrorState();
181
+ return result;
182
+ } catch (error) {
183
+ this.handleRedisError(error, "increment");
184
+ }
185
+ }
186
+ if (effectiveBackend === "hybrid" && this.config.fallbackOnRedisError) {
187
+ return this.memoryCache.increment(key, value);
188
+ }
189
+ return 0;
190
+ }
191
+ /**
192
+ * TTL 설정
193
+ */
194
+ async expire(key, ttl) {
195
+ const effectiveBackend = this.getEffectiveBackend();
196
+ const promises = [];
197
+ if (effectiveBackend !== "memory" && this.redisManager && !this.isRedisTemporarilyDisabled) {
198
+ promises.push(
199
+ this.redisManager.expire(key, ttl).catch((error) => {
200
+ this.handleRedisError(error, "expire");
201
+ })
202
+ );
203
+ }
204
+ if (effectiveBackend !== "redis") {
205
+ promises.push(this.memoryCache.expire(key, ttl));
206
+ }
207
+ await Promise.allSettled(promises);
208
+ }
209
+ // ============================================================================
210
+ // Metrics & Status
211
+ // ============================================================================
212
+ /**
213
+ * 하이브리드 캐시 메트릭 조회
214
+ */
215
+ getMetrics() {
216
+ var _a, _b, _c, _d, _e, _f, _g, _h;
217
+ const memoryMetrics = this.memoryCache.getMetrics();
218
+ let redisMetrics = null;
219
+ if (this.redisManager) {
220
+ const raw = this.redisManager.getMetrics();
221
+ redisMetrics = {
222
+ hits: (_a = raw.hits) != null ? _a : 0,
223
+ misses: (_b = raw.misses) != null ? _b : 0,
224
+ errors: (_c = raw.errors) != null ? _c : 0,
225
+ totalRequests: (_d = raw.totalRequests) != null ? _d : 0,
226
+ hitRate: (_e = raw.hitRate) != null ? _e : 0,
227
+ averageResponseTime: (_f = raw.averageResponseTime) != null ? _f : 0
228
+ };
229
+ }
230
+ const totalHits = ((_g = redisMetrics == null ? void 0 : redisMetrics.hits) != null ? _g : 0) + memoryMetrics.hits;
231
+ const totalMisses = ((_h = redisMetrics == null ? void 0 : redisMetrics.misses) != null ? _h : 0) + memoryMetrics.misses;
232
+ const totalRequests = totalHits + totalMisses;
233
+ return {
234
+ redis: redisMetrics,
235
+ memory: memoryMetrics,
236
+ combined: {
237
+ totalHits,
238
+ totalMisses,
239
+ redisFallbacks: this.redisFallbackCount,
240
+ hitRate: totalRequests > 0 ? Math.round(totalHits / totalRequests * 1e4) / 100 : 0
241
+ }
242
+ };
243
+ }
244
+ /**
245
+ * 연결 상태 조회
246
+ */
247
+ getConnectionStatus() {
248
+ const isGloballyDisabled = isRedisGloballyDisabled();
249
+ return {
250
+ redisConnected: !!this.redisManager && !this.isRedisTemporarilyDisabled && !isGloballyDisabled,
251
+ memoryActive: true,
252
+ currentBackend: this.getEffectiveBackend(),
253
+ redisErrorCount: this.redisErrorCount,
254
+ lastRedisError: this.lastRedisError,
255
+ lastRedisErrorMessage: this.lastRedisErrorMessage,
256
+ redisGloballyDisabled: isGloballyDisabled
257
+ };
258
+ }
259
+ /**
260
+ * 연결 체크
261
+ */
262
+ async checkConnection() {
263
+ const effectiveBackend = this.getEffectiveBackend();
264
+ if (effectiveBackend === "memory") {
265
+ return true;
266
+ }
267
+ if (this.redisManager) {
268
+ try {
269
+ const connected = await this.redisManager.checkConnection();
270
+ if (connected) {
271
+ this.resetRedisErrorState();
272
+ return true;
273
+ }
274
+ } catch (e) {
275
+ }
276
+ }
277
+ return effectiveBackend === "hybrid";
278
+ }
279
+ /**
280
+ * 설정 조회
281
+ */
282
+ getConfig() {
283
+ return {
284
+ prefix: this.prefix,
285
+ backend: this.config.backend,
286
+ effectiveBackend: this.getEffectiveBackend(),
287
+ fallbackOnRedisError: this.config.fallbackOnRedisError,
288
+ writeToMemory: this.config.writeToMemory,
289
+ redisAvailable: !!this.redisManager,
290
+ isRedisTemporarilyDisabled: this.isRedisTemporarilyDisabled,
291
+ memoryConfig: this.memoryCache.getConfig()
292
+ };
293
+ }
294
+ // ============================================================================
295
+ // Private Methods
296
+ // ============================================================================
297
+ /**
298
+ * 실제 사용할 백엔드 결정
299
+ * - 전역 Redis 비활성화 상태도 확인
300
+ */
301
+ getEffectiveBackend() {
302
+ if (this.config.backend === "memory") {
303
+ return "memory";
304
+ }
305
+ const isRedisDisabled = isRedisGloballyDisabled() || this.isRedisTemporarilyDisabled;
306
+ if (!this.redisManager || isRedisDisabled) {
307
+ if (this.config.backend === "hybrid") {
308
+ return "memory";
309
+ }
310
+ return "redis";
311
+ }
312
+ return this.config.backend;
313
+ }
314
+ /**
315
+ * Redis 에러 처리
316
+ * - 전역 Redis 상태도 함께 업데이트
317
+ */
318
+ handleRedisError(error, operation) {
319
+ this.redisErrorCount++;
320
+ this.lastRedisError = /* @__PURE__ */ new Date();
321
+ this.lastRedisErrorMessage = error.message;
322
+ notifyRedisError(error, `HybridCacheManager.${operation}:${this.prefix}`);
323
+ logger.warn("[HybridCacheManager] Redis error", {
324
+ prefix: this.prefix,
325
+ operation,
326
+ error: error.message,
327
+ errorCount: this.redisErrorCount,
328
+ threshold: this.config.redisErrorThreshold,
329
+ globallyDisabled: isRedisGloballyDisabled()
330
+ });
331
+ if (this.redisErrorCount >= this.config.redisErrorThreshold) {
332
+ this.disableRedisTemporarily();
333
+ }
334
+ }
335
+ /**
336
+ * Redis 일시 비활성화
337
+ */
338
+ disableRedisTemporarily() {
339
+ if (this.isRedisTemporarilyDisabled) {
340
+ return;
341
+ }
342
+ this.isRedisTemporarilyDisabled = true;
343
+ logger.warn("[HybridCacheManager] Redis temporarily disabled", {
344
+ prefix: this.prefix,
345
+ errorCount: this.redisErrorCount,
346
+ reconnectIn: this.config.redisReconnectInterval
347
+ });
348
+ this.redisReconnectTimer = setTimeout(() => {
349
+ this.tryReconnectRedis();
350
+ }, this.config.redisReconnectInterval);
351
+ }
352
+ /**
353
+ * Redis 재연결 시도
354
+ */
355
+ async tryReconnectRedis() {
356
+ if (!this.redisManager) {
357
+ return;
358
+ }
359
+ logger.info("[HybridCacheManager] Redis reconnection attempt", { prefix: this.prefix });
360
+ try {
361
+ const connected = await this.redisManager.checkConnection();
362
+ if (connected) {
363
+ this.resetRedisErrorState();
364
+ logger.info("[HybridCacheManager] Redis reconnection successful", { prefix: this.prefix });
365
+ } else {
366
+ this.redisReconnectTimer = setTimeout(() => {
367
+ this.tryReconnectRedis();
368
+ }, this.config.redisReconnectInterval);
369
+ }
370
+ } catch (e) {
371
+ this.redisReconnectTimer = setTimeout(() => {
372
+ this.tryReconnectRedis();
373
+ }, this.config.redisReconnectInterval);
374
+ }
375
+ }
376
+ /**
377
+ * Redis 에러 상태 초기화 (로컬 상태만)
378
+ * - 전역 상태는 cache-redis.ts에서 관리 (Redis 성공 시 자동 리셋)
379
+ */
380
+ resetRedisErrorState() {
381
+ if (this.redisErrorCount > 0 || this.isRedisTemporarilyDisabled) {
382
+ logger.debug("[HybridCacheManager] Redis local error state reset", {
383
+ prefix: this.prefix,
384
+ previousErrorCount: this.redisErrorCount
385
+ });
386
+ }
387
+ this.redisErrorCount = 0;
388
+ this.isRedisTemporarilyDisabled = false;
389
+ if (this.redisReconnectTimer) {
390
+ clearTimeout(this.redisReconnectTimer);
391
+ this.redisReconnectTimer = null;
392
+ }
393
+ }
394
+ /**
395
+ * 리소스 정리
396
+ */
397
+ destroy() {
398
+ if (this.redisReconnectTimer) {
399
+ clearTimeout(this.redisReconnectTimer);
400
+ this.redisReconnectTimer = null;
401
+ }
402
+ logger.info("[HybridCacheManager] Instance destroyed", { prefix: this.prefix });
403
+ }
404
+ // ============================================================================
405
+ // Static Factory (globalThis 사용으로 프로세스 레벨 싱글톤 보장)
406
+ // ============================================================================
407
+ /**
408
+ * 전역 인스턴스 맵 가져오기 (HMR 안전)
409
+ */
410
+ static getGlobalInstances() {
411
+ if (!globalThis.__hybridCacheInstances) {
412
+ globalThis.__hybridCacheInstances = /* @__PURE__ */ new Map();
413
+ }
414
+ return globalThis.__hybridCacheInstances;
415
+ }
416
+ /**
417
+ * 싱글톤 인스턴스 가져오기
418
+ */
419
+ static getInstance(prefix, config) {
420
+ const instances = _HybridCacheManager.getGlobalInstances();
421
+ if (!instances.has(prefix)) {
422
+ instances.set(prefix, new _HybridCacheManager(prefix, config));
423
+ }
424
+ return instances.get(prefix);
425
+ }
426
+ /**
427
+ * 모든 인스턴스 종료
428
+ */
429
+ static destroyAll() {
430
+ const instances = _HybridCacheManager.getGlobalInstances();
431
+ for (const instance of instances.values()) {
432
+ instance.destroy();
433
+ }
434
+ instances.clear();
435
+ InMemoryCacheManager.destroyAll();
436
+ }
437
+ /**
438
+ * 인스턴스 초기화 (테스트용)
439
+ */
440
+ static clearInstances() {
441
+ _HybridCacheManager.getGlobalInstances().clear();
442
+ }
443
+ };
444
+
445
+ export {
446
+ HybridCacheManager
447
+ };
@@ -0,0 +1,193 @@
1
+ import {
2
+ logger
3
+ } from "./chunk-EZR55KV2.js";
4
+ import {
5
+ CACHE_DURATION_DEFAULTS,
6
+ CACHE_FALLBACK_DEFAULTS,
7
+ CACHE_HEALTH_DEFAULTS,
8
+ CACHE_TTL_DEFAULTS,
9
+ INMEMORY_CACHE_DEFAULTS
10
+ } from "./chunk-IQQKKUAV.js";
11
+
12
+ // src/cache/cache-env.ts
13
+ function _isRedisCacheEnabled() {
14
+ return process.env.CACHE_REDIS_ENABLED !== "false";
15
+ }
16
+ function _isInmemoryCacheEnabled() {
17
+ return process.env.CACHE_INMEMORY_ENABLED !== "false";
18
+ }
19
+ function _isRedisConfigured() {
20
+ return !!(process.env.UPSTASH_REDIS_REST_URL && process.env.UPSTASH_REDIS_REST_TOKEN);
21
+ }
22
+ function _isRedisAvailable() {
23
+ return _isRedisCacheEnabled() && _isRedisConfigured();
24
+ }
25
+ var _injectedConfig = null;
26
+ function getDefaultConfig() {
27
+ const nodeEnv = process.env.NODE_ENV || "development";
28
+ const cacheEnabled = process.env.CACHE_ENABLED !== "false";
29
+ const redisUrl = process.env.UPSTASH_REDIS_REST_URL;
30
+ const redisToken = process.env.UPSTASH_REDIS_REST_TOKEN;
31
+ const redisEnabled = _isRedisCacheEnabled();
32
+ const inmemoryEnabled = _isInmemoryCacheEnabled();
33
+ const redisAvailable = _isRedisAvailable();
34
+ const defaultCategoryConfig = (enabled, duration) => ({
35
+ ENABLED: enabled,
36
+ DURATION: duration
37
+ });
38
+ return {
39
+ env: {
40
+ NODE_ENV: nodeEnv,
41
+ UPSTASH_REDIS_REST_URL: redisUrl,
42
+ UPSTASH_REDIS_REST_TOKEN: redisToken,
43
+ CACHE_ENABLED: cacheEnabled
44
+ },
45
+ ENV: {
46
+ REDIS: {
47
+ URL: redisUrl,
48
+ TOKEN: redisToken,
49
+ IS_AVAILABLE: redisAvailable,
50
+ ENABLED: redisEnabled
51
+ },
52
+ CACHE: {
53
+ ENABLED: cacheEnabled,
54
+ REDIS: {
55
+ ENABLED: redisEnabled
56
+ },
57
+ INMEMORY: {
58
+ ENABLED: inmemoryEnabled,
59
+ MAX_SIZE: parseInt(process.env.CACHE_INMEMORY_MAX_SIZE || String(INMEMORY_CACHE_DEFAULTS.MAX_SIZE), 10),
60
+ MAX_MB: parseInt(process.env.CACHE_INMEMORY_MAX_MB || String(INMEMORY_CACHE_DEFAULTS.MAX_MB), 10),
61
+ EVICTION: process.env.CACHE_INMEMORY_EVICTION || INMEMORY_CACHE_DEFAULTS.EVICTION,
62
+ CLEANUP_INTERVAL: parseInt(process.env.CACHE_INMEMORY_CLEANUP_INTERVAL || String(INMEMORY_CACHE_DEFAULTS.CLEANUP_INTERVAL), 10)
63
+ },
64
+ TTL: {
65
+ DEFAULT: parseInt(process.env.CACHE_TTL_DEFAULT || String(CACHE_TTL_DEFAULTS.DEFAULT), 10),
66
+ SHORT: parseInt(process.env.CACHE_TTL_SHORT || String(CACHE_TTL_DEFAULTS.SHORT), 10),
67
+ LONG: parseInt(process.env.CACHE_TTL_LONG || String(CACHE_TTL_DEFAULTS.LONG), 10),
68
+ GEOIP: parseInt(process.env.CACHE_TTL_GEOIP || String(CACHE_TTL_DEFAULTS.GEOIP), 10),
69
+ SETTINGS: parseInt(process.env.CACHE_TTL_SETTINGS || String(CACHE_TTL_DEFAULTS.SETTINGS), 10),
70
+ ANALYTICS: parseInt(process.env.CACHE_TTL_ANALYTICS || String(CACHE_TTL_DEFAULTS.ANALYTICS), 10),
71
+ USER: parseInt(process.env.CACHE_TTL_USER || String(CACHE_TTL_DEFAULTS.USER), 10),
72
+ LINK: parseInt(process.env.CACHE_TTL_LINK || String(CACHE_TTL_DEFAULTS.LINK), 10),
73
+ ALIAS: parseInt(process.env.CACHE_TTL_ALIAS || String(CACHE_TTL_DEFAULTS.ALIAS), 10),
74
+ COMMUNITY: parseInt(process.env.CACHE_TTL_COMMUNITY || String(CACHE_TTL_DEFAULTS.COMMUNITY), 10),
75
+ RESERVED_WORDS: parseInt(process.env.CACHE_TTL_RESERVED_WORDS || String(CACHE_TTL_DEFAULTS.RESERVED_WORDS), 10)
76
+ },
77
+ ANALYTICS: defaultCategoryConfig(process.env.CACHE_ANALYTICS_ENABLED !== "false", parseInt(process.env.CACHE_ANALYTICS_DURATION || String(CACHE_DURATION_DEFAULTS.ANALYTICS), 10)),
78
+ USER: defaultCategoryConfig(process.env.CACHE_USER_ENABLED !== "false", parseInt(process.env.CACHE_USER_DURATION || String(CACHE_DURATION_DEFAULTS.USER), 10)),
79
+ GEOIP: defaultCategoryConfig(process.env.CACHE_GEOIP_ENABLED !== "false", parseInt(process.env.CACHE_GEOIP_DURATION || String(CACHE_DURATION_DEFAULTS.GEOIP), 10)),
80
+ SETTINGS: defaultCategoryConfig(process.env.CACHE_SETTINGS_ENABLED !== "false", parseInt(process.env.CACHE_SETTINGS_DURATION || String(CACHE_DURATION_DEFAULTS.SETTINGS), 10)),
81
+ RESERVED_WORDS: defaultCategoryConfig(process.env.CACHE_RESERVED_WORDS_ENABLED !== "false", parseInt(process.env.CACHE_RESERVED_WORDS_DURATION || String(CACHE_DURATION_DEFAULTS.RESERVED_WORDS), 10)),
82
+ ALIAS: defaultCategoryConfig(process.env.CACHE_ALIAS_ENABLED !== "false", parseInt(process.env.CACHE_ALIAS_DURATION || String(CACHE_DURATION_DEFAULTS.ALIAS), 10)),
83
+ COMMUNITY: defaultCategoryConfig(process.env.CACHE_COMMUNITY_ENABLED !== "false", parseInt(process.env.CACHE_COMMUNITY_DURATION || String(CACHE_DURATION_DEFAULTS.COMMUNITY), 10)),
84
+ LINK: defaultCategoryConfig(process.env.CACHE_LINK_ENABLED !== "false", parseInt(process.env.CACHE_LINK_DURATION || process.env.CACHE_TTL_LINK || String(CACHE_DURATION_DEFAULTS.LINK), 10)),
85
+ // RATE_LIMIT: ENABLED 제거됨 - Rate Limiting은 RATE_LIMIT_ENABLED로 제어, CACHE_ENABLED로 Redis 사용 여부 결정
86
+ RATE_LIMIT: defaultCategoryConfig(true, parseInt(process.env.CACHE_RATE_LIMIT_DURATION || String(CACHE_DURATION_DEFAULTS.RATE_LIMIT), 10)),
87
+ URL_TOKEN: defaultCategoryConfig(process.env.CACHE_URL_TOKEN_ENABLED !== "false", parseInt(process.env.CACHE_URL_TOKEN_DURATION || String(CACHE_DURATION_DEFAULTS.URL_TOKEN), 10)),
88
+ API_KEY: defaultCategoryConfig(process.env.CACHE_API_KEY_ENABLED !== "false", parseInt(process.env.CACHE_API_KEY_DURATION || String(CACHE_DURATION_DEFAULTS.API_KEY), 10)),
89
+ API_CONFIG: defaultCategoryConfig(process.env.CACHE_API_CONFIG_ENABLED !== "false", parseInt(process.env.CACHE_API_CONFIG_DURATION || String(CACHE_DURATION_DEFAULTS.API_CONFIG), 10))
90
+ }
91
+ },
92
+ isCacheEnabled: () => cacheEnabled,
93
+ isRedisAvailable: () => redisAvailable
94
+ };
95
+ }
96
+ function getConfig() {
97
+ if (_injectedConfig) {
98
+ return _injectedConfig;
99
+ }
100
+ return getDefaultConfig();
101
+ }
102
+ var getEnv = () => getConfig().env;
103
+ var getENV = () => getConfig().ENV;
104
+ function initializeCache(config) {
105
+ if (global.__cacheInitialized) {
106
+ return;
107
+ }
108
+ _injectedConfig = config;
109
+ global.__cacheInitialized = true;
110
+ if (process.env.NODE_ENV === "production" && process.env.NEXT_BUILD_TIME !== "true") {
111
+ logger.info("[Cache] Environment configuration injection complete", {
112
+ cacheEnabled: config.isCacheEnabled(),
113
+ redisAvailable: config.isRedisAvailable()
114
+ });
115
+ }
116
+ }
117
+ var isCacheEnabled = () => getConfig().isCacheEnabled();
118
+ function validateRedisEnvironment() {
119
+ const errors = [];
120
+ const env = getEnv();
121
+ if (!env.UPSTASH_REDIS_REST_URL) {
122
+ errors.push("UPSTASH_REDIS_REST_URL is not configured.");
123
+ } else if (env.UPSTASH_REDIS_REST_URL.trim() === "") {
124
+ errors.push("UPSTASH_REDIS_REST_URL is an empty string.");
125
+ }
126
+ if (!env.UPSTASH_REDIS_REST_TOKEN) {
127
+ errors.push("UPSTASH_REDIS_REST_TOKEN is not configured.");
128
+ } else if (env.UPSTASH_REDIS_REST_TOKEN.trim() === "") {
129
+ errors.push("UPSTASH_REDIS_REST_TOKEN is an empty string.");
130
+ }
131
+ return {
132
+ isValid: errors.length === 0,
133
+ errors
134
+ };
135
+ }
136
+ function getCacheFallbackConfig() {
137
+ return {
138
+ redisErrorThresholdGlobal: parseInt(
139
+ process.env.CACHE_REDIS_ERROR_THRESHOLD_GLOBAL || String(CACHE_FALLBACK_DEFAULTS.REDIS_ERROR_THRESHOLD_GLOBAL),
140
+ 10
141
+ ),
142
+ redisErrorThresholdLocal: parseInt(
143
+ process.env.CACHE_REDIS_ERROR_THRESHOLD_LOCAL || String(CACHE_FALLBACK_DEFAULTS.REDIS_ERROR_THRESHOLD_LOCAL),
144
+ 10
145
+ ),
146
+ redisReconnectInterval: parseInt(
147
+ process.env.CACHE_REDIS_RECONNECT_INTERVAL || String(CACHE_FALLBACK_DEFAULTS.REDIS_RECONNECT_INTERVAL),
148
+ 10
149
+ ),
150
+ fallbackOnRedisError: process.env.CACHE_FALLBACK_ON_REDIS_ERROR !== "false",
151
+ writeToMemory: process.env.CACHE_WRITE_TO_MEMORY !== "false"
152
+ };
153
+ }
154
+ function getCacheHealthConfig() {
155
+ return {
156
+ errorRateThreshold: parseInt(
157
+ process.env.CACHE_HEALTH_ERROR_RATE_THRESHOLD || String(CACHE_HEALTH_DEFAULTS.ERROR_RATE_THRESHOLD),
158
+ 10
159
+ ),
160
+ hitRateThreshold: parseInt(
161
+ process.env.CACHE_HEALTH_HIT_RATE_THRESHOLD || String(CACHE_HEALTH_DEFAULTS.HIT_RATE_THRESHOLD),
162
+ 10
163
+ ),
164
+ reportHitRateThreshold: parseInt(
165
+ process.env.CACHE_REPORT_HIT_RATE_THRESHOLD || String(CACHE_HEALTH_DEFAULTS.REPORT_HIT_RATE_THRESHOLD),
166
+ 10
167
+ ),
168
+ reportResponseTimeThreshold: parseInt(
169
+ process.env.CACHE_REPORT_RESPONSE_TIME_THRESHOLD || String(CACHE_HEALTH_DEFAULTS.REPORT_RESPONSE_TIME_THRESHOLD),
170
+ 10
171
+ ),
172
+ reportInvalidationThreshold: parseInt(
173
+ process.env.CACHE_REPORT_INVALIDATION_THRESHOLD || String(CACHE_HEALTH_DEFAULTS.REPORT_INVALIDATION_THRESHOLD),
174
+ 10
175
+ ),
176
+ reportMinRequests: parseInt(
177
+ process.env.CACHE_REPORT_MIN_REQUESTS || String(CACHE_HEALTH_DEFAULTS.REPORT_MIN_REQUESTS),
178
+ 10
179
+ )
180
+ };
181
+ }
182
+
183
+ export {
184
+ getDefaultConfig,
185
+ getConfig,
186
+ getEnv,
187
+ getENV,
188
+ initializeCache,
189
+ isCacheEnabled,
190
+ validateRedisEnvironment,
191
+ getCacheFallbackConfig,
192
+ getCacheHealthConfig
193
+ };