@archlast/server 0.1.8 → 0.1.9

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 (347) hide show
  1. package/README.md +104 -100
  2. package/dist/admin/auth.d.ts +24 -5
  3. package/dist/admin/auth.js +49 -25
  4. package/dist/admin/schema.d.ts +122 -32
  5. package/dist/admin/schema.js +131 -95
  6. package/dist/admin/seed.d.ts +1 -1
  7. package/dist/admin/seed.js +79 -47
  8. package/dist/auth/api-key-resolver.d.ts +1 -1
  9. package/dist/auth/api-key-resolver.js +7 -3
  10. package/dist/auth/archlast-auth-adapter.d.ts +2 -5
  11. package/dist/auth/archlast-auth-adapter.js +1 -1
  12. package/dist/auth/better-auth-adapter.d.ts.map +1 -1
  13. package/dist/auth/better-auth-adapter.js +41 -26
  14. package/dist/auth/better-auth-adapter.js.map +1 -1
  15. package/dist/auth/better-auth-admin.d.ts.map +1 -1
  16. package/dist/auth/better-auth-admin.js +1 -1
  17. package/dist/auth/better-auth-admin.js.map +1 -1
  18. package/dist/auth/better-auth-api-key-resolver.js +1 -1
  19. package/dist/auth/better-auth-api-key-resolver.js.map +1 -1
  20. package/dist/auth/better-auth-instance.d.ts +249 -301
  21. package/dist/auth/better-auth-instance.d.ts.map +1 -1
  22. package/dist/auth/better-auth-instance.js +11 -0
  23. package/dist/auth/better-auth-instance.js.map +1 -1
  24. package/dist/auth/better-auth-seed.d.ts +5 -2
  25. package/dist/auth/better-auth-seed.js +31 -22
  26. package/dist/auth/better-auth-session-adapter.d.ts.map +1 -1
  27. package/dist/auth/better-auth-session-adapter.js +14 -10
  28. package/dist/auth/better-auth-session-adapter.js.map +1 -1
  29. package/dist/auth/errors.d.ts.map +1 -1
  30. package/dist/auth/errors.js +11 -11
  31. package/dist/auth/errors.js.map +1 -1
  32. package/dist/auth/oauth-proxy.d.ts +5 -2
  33. package/dist/auth/oauth-proxy.js +23 -27
  34. package/dist/auth/resolver.d.ts.map +1 -1
  35. package/dist/auth/resolver.js.map +1 -1
  36. package/dist/auth/role-helpers.d.ts +1 -1
  37. package/dist/auth/role-helpers.d.ts.map +1 -1
  38. package/dist/auth/role-helpers.js.map +1 -1
  39. package/dist/auth/session-manager.d.ts +2 -5
  40. package/dist/auth/session-manager.js +16 -6
  41. package/dist/auth/system/better-auth-schema.d.ts.map +1 -1
  42. package/dist/auth/system/better-auth-schema.js +6 -23
  43. package/dist/auth/system/better-auth-schema.js.map +1 -1
  44. package/dist/cache/circuit-breaker.d.ts +81 -0
  45. package/dist/cache/circuit-breaker.d.ts.map +1 -0
  46. package/dist/cache/circuit-breaker.js +170 -0
  47. package/dist/cache/circuit-breaker.js.map +1 -0
  48. package/dist/cache/client.d.ts +6 -3
  49. package/dist/cache/client.d.ts.map +1 -1
  50. package/dist/cache/client.js +12 -53
  51. package/dist/cache/client.js.map +1 -1
  52. package/dist/cache/index.d.ts +2 -0
  53. package/dist/cache/index.d.ts.map +1 -1
  54. package/dist/cache/index.js +5 -1
  55. package/dist/cache/index.js.map +1 -1
  56. package/dist/cache/invalidation-queue.d.ts +63 -0
  57. package/dist/cache/invalidation-queue.d.ts.map +1 -0
  58. package/dist/cache/invalidation-queue.js +196 -0
  59. package/dist/cache/invalidation-queue.js.map +1 -0
  60. package/dist/cache/layers.d.ts +14 -4
  61. package/dist/cache/layers.d.ts.map +1 -1
  62. package/dist/cache/layers.js +66 -72
  63. package/dist/cache/layers.js.map +1 -1
  64. package/dist/cache/manager.d.ts.map +1 -1
  65. package/dist/cache/manager.js +6 -41
  66. package/dist/cache/manager.js.map +1 -1
  67. package/dist/cache/protocol.d.ts +4 -39
  68. package/dist/cache/protocol.d.ts.map +1 -1
  69. package/dist/cache/protocol.js.map +1 -1
  70. package/dist/cache/redis-adapter.d.ts +103 -0
  71. package/dist/cache/redis-adapter.d.ts.map +1 -0
  72. package/dist/cache/redis-adapter.js +424 -0
  73. package/dist/cache/redis-adapter.js.map +1 -0
  74. package/dist/cache/run-sidecar.js +10 -1
  75. package/dist/cache/run-sidecar.js.map +1 -1
  76. package/dist/cache/sidecar-server.d.ts +51 -1
  77. package/dist/cache/sidecar-server.d.ts.map +1 -1
  78. package/dist/cache/sidecar-server.js +368 -22
  79. package/dist/cache/sidecar-server.js.map +1 -1
  80. package/dist/cache/store.d.ts +43 -0
  81. package/dist/cache/store.d.ts.map +1 -1
  82. package/dist/cache/store.js +69 -76
  83. package/dist/cache/store.js.map +1 -1
  84. package/dist/cache/strategies.d.ts +2 -9
  85. package/dist/cache/strategies.d.ts.map +1 -1
  86. package/dist/cache/types.d.ts +130 -0
  87. package/dist/cache/types.d.ts.map +1 -0
  88. package/dist/cache/types.js +60 -0
  89. package/dist/cache/types.js.map +1 -0
  90. package/dist/config/bullmq.d.ts +16 -0
  91. package/dist/config/bullmq.d.ts.map +1 -0
  92. package/dist/config/bullmq.js +103 -0
  93. package/dist/config/bullmq.js.map +1 -0
  94. package/dist/config/index.d.ts +1 -0
  95. package/dist/config/index.d.ts.map +1 -1
  96. package/dist/config/index.js +1 -0
  97. package/dist/config/index.js.map +1 -1
  98. package/dist/config/schema.d.ts +80 -6
  99. package/dist/config/schema.d.ts.map +1 -1
  100. package/dist/config/schema.js +71 -6
  101. package/dist/config/schema.js.map +1 -1
  102. package/dist/config/service.d.ts +54 -4
  103. package/dist/config/service.d.ts.map +1 -1
  104. package/dist/config/service.js +56 -2
  105. package/dist/config/service.js.map +1 -1
  106. package/dist/controllers/admin/admin-tokens.controller.d.ts +131 -115
  107. package/dist/controllers/admin/admin-tokens.controller.js +117 -98
  108. package/dist/controllers/admin/api-keys.controller.d.ts +1 -1
  109. package/dist/controllers/admin/api-keys.controller.d.ts.map +1 -1
  110. package/dist/controllers/admin/api-keys.controller.js.map +1 -1
  111. package/dist/controllers/admin/app-users.controller.d.ts +274 -243
  112. package/dist/controllers/admin/app-users.controller.js +301 -257
  113. package/dist/controllers/admin/auth.controller.d.ts +260 -236
  114. package/dist/controllers/admin/auth.controller.js +197 -174
  115. package/dist/controllers/admin/backup.controller.d.ts.map +1 -1
  116. package/dist/controllers/admin/backup.controller.js.map +1 -1
  117. package/dist/controllers/admin/settings.controller.d.ts +1 -1
  118. package/dist/controllers/admin/storage-stats.controller.d.ts +63 -0
  119. package/dist/controllers/admin/storage-stats.controller.d.ts.map +1 -0
  120. package/dist/controllers/admin/storage-stats.controller.js +33 -0
  121. package/dist/controllers/admin/storage-stats.controller.js.map +1 -0
  122. package/dist/controllers/admin/tenants.controller.d.ts.map +1 -1
  123. package/dist/controllers/admin/tenants.controller.js.map +1 -1
  124. package/dist/controllers/admin/users.controller.d.ts +1 -1
  125. package/dist/controllers/admin/users.controller.d.ts.map +1 -1
  126. package/dist/controllers/admin/users.controller.js.map +1 -1
  127. package/dist/controllers/auth.controller.d.ts +289 -271
  128. package/dist/controllers/auth.controller.js +275 -226
  129. package/dist/controllers/crud-generator.controller.d.ts.map +1 -1
  130. package/dist/controllers/crud-generator.controller.js +127 -125
  131. package/dist/controllers/crud-generator.controller.js.map +1 -1
  132. package/dist/controllers/index.d.ts +1 -1
  133. package/dist/controllers/index.d.ts.map +1 -1
  134. package/dist/controllers/index.js.map +1 -1
  135. package/dist/controllers/introspection.controller.d.ts +642 -0
  136. package/dist/controllers/introspection.controller.d.ts.map +1 -1
  137. package/dist/controllers/introspection.controller.js +611 -0
  138. package/dist/controllers/introspection.controller.js.map +1 -1
  139. package/dist/controllers/invite.controller.d.ts +190 -170
  140. package/dist/controllers/invite.controller.js +183 -164
  141. package/dist/controllers/mfa.controller.d.ts +205 -183
  142. package/dist/controllers/mfa.controller.js +131 -111
  143. package/dist/controllers/otp.controller.d.ts +194 -171
  144. package/dist/controllers/otp.controller.js +192 -175
  145. package/dist/controllers/storage.controller.d.ts.map +1 -1
  146. package/dist/controllers/storage.controller.js.map +1 -1
  147. package/dist/controllers/system.controller.d.ts +5 -3
  148. package/dist/controllers/system.controller.d.ts.map +1 -1
  149. package/dist/controllers/system.controller.js +4 -2
  150. package/dist/controllers/system.controller.js.map +1 -1
  151. package/dist/controllers/tenant.controller.d.ts +258 -227
  152. package/dist/controllers/tenant.controller.js +224 -200
  153. package/dist/db/cachedclient.d.ts +6 -11
  154. package/dist/db/cachedclient.d.ts.map +1 -1
  155. package/dist/db/cachedclient.js +79 -43
  156. package/dist/db/cachedclient.js.map +1 -1
  157. package/dist/db/distributed-client.d.ts +79 -24
  158. package/dist/db/distributed-client.js +23 -24
  159. package/dist/db/factory.d.ts +3 -8
  160. package/dist/db/factory.d.ts.map +1 -1
  161. package/dist/db/factory.js +3 -22
  162. package/dist/db/factory.js.map +1 -1
  163. package/dist/db/socket-client.d.ts +7 -0
  164. package/dist/db/socket-client.d.ts.map +1 -1
  165. package/dist/db/socket-client.js +140 -11
  166. package/dist/db/socket-client.js.map +1 -1
  167. package/dist/deployment/handler.d.ts +10 -2
  168. package/dist/deployment/handler.d.ts.map +1 -1
  169. package/dist/deployment/handler.js +70 -15
  170. package/dist/deployment/handler.js.map +1 -1
  171. package/dist/deployment/persistence.d.ts.map +1 -1
  172. package/dist/deployment/persistence.js +6 -1
  173. package/dist/deployment/persistence.js.map +1 -1
  174. package/dist/docker/compose.d.ts.map +1 -1
  175. package/dist/docker/compose.js +76 -0
  176. package/dist/docker/compose.js.map +1 -1
  177. package/dist/engine/runner.d.ts.map +1 -1
  178. package/dist/engine/runner.js +0 -43
  179. package/dist/engine/runner.js.map +1 -1
  180. package/dist/functions/built-in/auth-apikey.d.ts.map +1 -1
  181. package/dist/functions/built-in/auth-apikey.js.map +1 -1
  182. package/dist/functions/built-in/system-cache.d.ts.map +1 -1
  183. package/dist/functions/built-in/system-cache.js +6 -31
  184. package/dist/functions/built-in/system-cache.js.map +1 -1
  185. package/dist/functions/built-in/system-data.d.ts.map +1 -1
  186. package/dist/functions/built-in/system-data.js +4 -2
  187. package/dist/functions/built-in/system-data.js.map +1 -1
  188. package/dist/functions/definition.d.ts.map +1 -1
  189. package/dist/functions/definition.js +6 -2
  190. package/dist/functions/definition.js.map +1 -1
  191. package/dist/http/routes/metrics.d.ts +42 -0
  192. package/dist/http/routes/metrics.d.ts.map +1 -0
  193. package/dist/http/routes/metrics.js +29 -0
  194. package/dist/http/routes/metrics.js.map +1 -0
  195. package/dist/http/server.d.ts +1 -0
  196. package/dist/http/server.d.ts.map +1 -1
  197. package/dist/http/server.js +41 -3
  198. package/dist/http/server.js.map +1 -1
  199. package/dist/ipc/socket-bridge.d.ts +1 -0
  200. package/dist/ipc/socket-bridge.d.ts.map +1 -1
  201. package/dist/ipc/socket-bridge.js +5 -1
  202. package/dist/ipc/socket-bridge.js.map +1 -1
  203. package/dist/jobs/bullmq-adapter.d.ts +154 -0
  204. package/dist/jobs/bullmq-adapter.d.ts.map +1 -0
  205. package/dist/jobs/bullmq-adapter.js +688 -0
  206. package/dist/jobs/bullmq-adapter.js.map +1 -0
  207. package/dist/jobs/bullmq-circuit-breaker.d.ts +133 -0
  208. package/dist/jobs/bullmq-circuit-breaker.d.ts.map +1 -0
  209. package/dist/jobs/bullmq-circuit-breaker.js +323 -0
  210. package/dist/jobs/bullmq-circuit-breaker.js.map +1 -0
  211. package/dist/jobs/bullmq-dlq-manager.d.ts +155 -0
  212. package/dist/jobs/bullmq-dlq-manager.d.ts.map +1 -0
  213. package/dist/jobs/bullmq-dlq-manager.js +325 -0
  214. package/dist/jobs/bullmq-dlq-manager.js.map +1 -0
  215. package/dist/jobs/bullmq-metrics.d.ts +104 -0
  216. package/dist/jobs/bullmq-metrics.d.ts.map +1 -0
  217. package/dist/jobs/bullmq-metrics.js +323 -0
  218. package/dist/jobs/bullmq-metrics.js.map +1 -0
  219. package/dist/jobs/bullmq-priority-service.d.ts +173 -0
  220. package/dist/jobs/bullmq-priority-service.d.ts.map +1 -0
  221. package/dist/jobs/bullmq-priority-service.js +390 -0
  222. package/dist/jobs/bullmq-priority-service.js.map +1 -0
  223. package/dist/jobs/bullmq-scheduler.d.ts +111 -0
  224. package/dist/jobs/bullmq-scheduler.d.ts.map +1 -0
  225. package/dist/jobs/bullmq-scheduler.js +300 -0
  226. package/dist/jobs/bullmq-scheduler.js.map +1 -0
  227. package/dist/jobs/bullmq-worker.d.ts +155 -0
  228. package/dist/jobs/bullmq-worker.d.ts.map +1 -0
  229. package/dist/jobs/bullmq-worker.js +651 -0
  230. package/dist/jobs/bullmq-worker.js.map +1 -0
  231. package/dist/jobs/circuit-breaker.d.ts +120 -0
  232. package/dist/jobs/circuit-breaker.d.ts.map +1 -0
  233. package/dist/jobs/circuit-breaker.js +262 -0
  234. package/dist/jobs/circuit-breaker.js.map +1 -0
  235. package/dist/jobs/index.d.ts +1 -1
  236. package/dist/jobs/index.d.ts.map +1 -1
  237. package/dist/jobs/index.js.map +1 -1
  238. package/dist/jobs/queue.d.ts +120 -1
  239. package/dist/jobs/queue.d.ts.map +1 -1
  240. package/dist/jobs/queue.js +487 -9
  241. package/dist/jobs/queue.js.map +1 -1
  242. package/dist/jobs/redis-connection.d.ts +50 -0
  243. package/dist/jobs/redis-connection.d.ts.map +1 -0
  244. package/dist/jobs/redis-connection.js +123 -0
  245. package/dist/jobs/redis-connection.js.map +1 -0
  246. package/dist/jobs/run-scheduler.js +163 -10
  247. package/dist/jobs/run-scheduler.js.map +1 -1
  248. package/dist/jobs/run-worker.js +101 -9
  249. package/dist/jobs/run-worker.js.map +1 -1
  250. package/dist/jobs/worker-thread.d.ts +6 -0
  251. package/dist/jobs/worker-thread.d.ts.map +1 -1
  252. package/dist/jobs/worker-thread.js +37 -8
  253. package/dist/jobs/worker-thread.js.map +1 -1
  254. package/dist/jobs/worker.d.ts +33 -0
  255. package/dist/jobs/worker.d.ts.map +1 -1
  256. package/dist/jobs/worker.js +358 -115
  257. package/dist/jobs/worker.js.map +1 -1
  258. package/dist/linq/async-enumerable.d.ts.map +1 -1
  259. package/dist/linq/async-enumerable.js.map +1 -1
  260. package/dist/linq/enumerable.d.ts.map +1 -1
  261. package/dist/linq/enumerable.js +10 -10
  262. package/dist/linq/enumerable.js.map +1 -1
  263. package/dist/metrics/collector.d.ts +26 -0
  264. package/dist/metrics/collector.d.ts.map +1 -0
  265. package/dist/metrics/collector.js +103 -0
  266. package/dist/metrics/collector.js.map +1 -0
  267. package/dist/polling/updates.controller.d.ts +57 -0
  268. package/dist/polling/updates.controller.d.ts.map +1 -0
  269. package/dist/polling/updates.controller.js +70 -0
  270. package/dist/polling/updates.controller.js.map +1 -0
  271. package/dist/repository/db-set.d.ts.map +1 -1
  272. package/dist/repository/db-set.js +12 -8
  273. package/dist/repository/db-set.js.map +1 -1
  274. package/dist/repository/ef-core.d.ts.map +1 -1
  275. package/dist/repository/ef-core.js +6 -6
  276. package/dist/repository/ef-core.js.map +1 -1
  277. package/dist/repository/factory.d.ts +1 -1
  278. package/dist/repository/factory.d.ts.map +1 -1
  279. package/dist/repository/factory.js.map +1 -1
  280. package/dist/repository/interfaces.d.ts.map +1 -1
  281. package/dist/repository/interfaces.js.map +1 -1
  282. package/dist/repository/queryable.d.ts.map +1 -1
  283. package/dist/repository/queryable.js.map +1 -1
  284. package/dist/rpc/adapter.d.ts.map +1 -1
  285. package/dist/rpc/adapter.js.map +1 -1
  286. package/dist/rpc/router.d.ts +2 -2
  287. package/dist/rpc/router.d.ts.map +1 -1
  288. package/dist/rpc/router.js +1 -1
  289. package/dist/rpc/router.js.map +1 -1
  290. package/dist/schema/relationship-types.d.ts +7 -2
  291. package/dist/schema/relationship-types.js +1 -1
  292. package/dist/schema/types.d.ts.map +1 -1
  293. package/dist/services/admin/app-users.service.d.ts +1 -1
  294. package/dist/services/admin/app-users.service.js +31 -38
  295. package/dist/services/admin/auth.service.d.ts +1 -1
  296. package/dist/services/admin/auth.service.js +11 -5
  297. package/dist/services/admin/backup/BackupOrchestrator.d.ts.map +1 -1
  298. package/dist/services/admin/backup/BackupOrchestrator.js +4 -7
  299. package/dist/services/admin/backup/BackupOrchestrator.js.map +1 -1
  300. package/dist/services/admin/backup/SqliteGenerator.js +8 -8
  301. package/dist/services/admin/backup/StorageStreamer.d.ts +3 -3
  302. package/dist/services/admin/backup/StorageStreamer.d.ts.map +1 -1
  303. package/dist/services/admin/backup/StorageStreamer.js +16 -55
  304. package/dist/services/admin/backup/StorageStreamer.js.map +1 -1
  305. package/dist/services/admin/backup/ZipComposer.d.ts +2 -0
  306. package/dist/services/admin/backup/ZipComposer.d.ts.map +1 -1
  307. package/dist/services/admin/backup/ZipComposer.js +23 -0
  308. package/dist/services/admin/backup/ZipComposer.js.map +1 -1
  309. package/dist/services/admin/backup.service.d.ts.map +1 -1
  310. package/dist/services/admin/backup.service.js.map +1 -1
  311. package/dist/services/admin/data.service.d.ts.map +1 -1
  312. package/dist/services/admin/data.service.js +287 -286
  313. package/dist/services/admin/data.service.js.map +1 -1
  314. package/dist/services/admin/tenants.service.d.ts.map +1 -1
  315. package/dist/services/admin/tenants.service.js.map +1 -1
  316. package/dist/services/auth.service.d.ts +2 -3
  317. package/dist/services/auth.service.js +16 -16
  318. package/dist/services/invite.service.d.ts +1 -1
  319. package/dist/services/invite.service.js +17 -15
  320. package/dist/services/storage.service.d.ts.map +1 -1
  321. package/dist/services/storage.service.js +35 -4
  322. package/dist/services/storage.service.js.map +1 -1
  323. package/dist/services/system.service.d.ts.map +1 -1
  324. package/dist/services/system.service.js +1 -1
  325. package/dist/services/system.service.js.map +1 -1
  326. package/dist/services/tenant.service.d.ts +1 -1
  327. package/dist/services/tenant.service.js +43 -31
  328. package/dist/sse/subscriptions.controller.d.ts +57 -0
  329. package/dist/sse/subscriptions.controller.d.ts.map +1 -0
  330. package/dist/sse/subscriptions.controller.js +127 -0
  331. package/dist/sse/subscriptions.controller.js.map +1 -0
  332. package/dist/startup/bootstrap.d.ts +13 -2
  333. package/dist/startup/bootstrap.d.ts.map +1 -1
  334. package/dist/startup/bootstrap.js +85 -13
  335. package/dist/startup/bootstrap.js.map +1 -1
  336. package/dist/storage/s3-backend.d.ts.map +1 -1
  337. package/dist/storage/s3-backend.js +3 -3
  338. package/dist/storage/s3-backend.js.map +1 -1
  339. package/dist/websocket/server.d.ts.map +1 -1
  340. package/dist/websocket/server.js +14 -3
  341. package/dist/websocket/server.js.map +1 -1
  342. package/docker/README.md +309 -11
  343. package/package.json +214 -210
  344. package/templates/.env.example +115 -55
  345. package/templates/archlast.config.js +51 -37
  346. package/templates/docker-compose.prod.yml +32 -15
  347. package/templates/docker-compose.yml +117 -33
@@ -0,0 +1,424 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.RedisCacheAdapter = void 0;
7
+ const crypto_1 = __importDefault(require("crypto"));
8
+ const os_1 = __importDefault(require("os"));
9
+ const ioredis_1 = __importDefault(require("ioredis"));
10
+ const circuit_breaker_js_1 = require("./circuit-breaker.js");
11
+ /**
12
+ * Redis L2 cache adapter using ioredis.
13
+ *
14
+ * Features:
15
+ * - Cache-aside pattern (check Redis, return null on miss)
16
+ * - Connection retry logic with exponential backoff
17
+ * - Graceful degradation (returns null if Redis unavailable)
18
+ * - Pub/sub for cross-instance cache invalidation
19
+ */
20
+ class RedisCacheAdapter {
21
+ options;
22
+ redis = null;
23
+ subscriber = null;
24
+ enabled;
25
+ isConnectedFlag = false;
26
+ healthCheckInterval = null;
27
+ HEALTH_CHECK_INTERVAL_MS = 30000; // 30 seconds
28
+ circuitBreaker;
29
+ instanceId;
30
+ constructor(options) {
31
+ this.options = options;
32
+ this.enabled = options.enabled;
33
+ this.instanceId = `${os_1.default.hostname()}:${process.pid}:${Date.now()}`;
34
+ this.circuitBreaker = new circuit_breaker_js_1.CircuitBreaker({
35
+ failureThreshold: 5,
36
+ resetTimeoutMs: 30000,
37
+ name: "RedisCacheAdapter",
38
+ });
39
+ if (this.enabled) {
40
+ this.initializeRedis();
41
+ }
42
+ }
43
+ initializeRedis() {
44
+ try {
45
+ this.redis = new ioredis_1.default({
46
+ host: this.options.host,
47
+ port: this.options.port,
48
+ password: this.options.password,
49
+ db: this.options.db,
50
+ maxRetriesPerRequest: 3,
51
+ enableReadyCheck: true,
52
+ retryStrategy: (times) => {
53
+ // Exponential backoff: 2^times * 100ms, capped at 30 seconds
54
+ const baseDelay = Math.min(Math.pow(2, times) * 100, 30000);
55
+ // Add jitter: ±25% randomization to prevent thundering herd
56
+ const jitter = baseDelay * 0.25 * (Math.random() * 2 - 1);
57
+ return Math.floor(baseDelay + jitter);
58
+ },
59
+ reconnectOnError: (err) => {
60
+ const reconnectErrors = [
61
+ "ECONNREFUSED",
62
+ "ETIMEDOUT",
63
+ "ECONNRESET",
64
+ "ENOTFOUND",
65
+ "EPIPE",
66
+ "EAI_AGAIN",
67
+ ];
68
+ const errorMessage = err.message.toUpperCase();
69
+ // Reconnect on all connection-related errors
70
+ if (reconnectErrors.some((code) => errorMessage.includes(code))) {
71
+ console.warn(`Redis reconnecting due to connection error: ${err.message}`);
72
+ return true;
73
+ }
74
+ // Also reconnect on READONLY errors (original behavior)
75
+ if (errorMessage.includes("READONLY")) {
76
+ console.warn(`Redis reconnecting due to READONLY error: ${err.message}`);
77
+ return true;
78
+ }
79
+ return false;
80
+ },
81
+ });
82
+ // Setup pub/sub subscriber for invalidation
83
+ this.subscriber = this.redis.duplicate();
84
+ this.subscriber.subscribe("cache:invalidate", (err) => {
85
+ if (err) {
86
+ console.error("Redis pub/sub subscribe failed:", err);
87
+ }
88
+ });
89
+ this.subscriber.on("message", (channel, message) => {
90
+ if (channel === "cache:invalidate" && this.options.onInvalidate) {
91
+ try {
92
+ const parsed = JSON.parse(message);
93
+ // Support both old format (array of keys) and new format
94
+ if (Array.isArray(parsed)) {
95
+ // Old format: just keys array
96
+ this.options.onInvalidate(parsed, undefined);
97
+ }
98
+ else if (parsed.version === "1.0") {
99
+ // New format: structured message
100
+ this.options.onInvalidate(parsed.keys || [], parsed.pattern);
101
+ }
102
+ else {
103
+ // Legacy format: { keys, pattern } object
104
+ this.options.onInvalidate(parsed.keys || [], parsed.pattern);
105
+ }
106
+ }
107
+ catch (err) {
108
+ console.error("[Cache] Failed to parse invalidation message:", err);
109
+ }
110
+ }
111
+ });
112
+ // Log connection status and track connection state
113
+ this.redis.on("connect", () => {
114
+ console.log("Redis L2 cache connected");
115
+ this.isConnectedFlag = true;
116
+ });
117
+ this.redis.on("ready", () => {
118
+ console.log("Redis L2 cache ready");
119
+ this.isConnectedFlag = true;
120
+ this.startHealthCheck();
121
+ });
122
+ this.redis.on("error", (err) => {
123
+ console.error("Redis L2 cache error:", err.message);
124
+ this.isConnectedFlag = false;
125
+ });
126
+ this.redis.on("close", () => {
127
+ console.warn("Redis L2 cache connection closed");
128
+ this.isConnectedFlag = false;
129
+ this.stopHealthCheck();
130
+ });
131
+ this.redis.on("reconnecting", () => {
132
+ console.log("Redis L2 cache reconnecting...");
133
+ this.isConnectedFlag = false;
134
+ });
135
+ this.redis.on("end", () => {
136
+ console.warn("Redis L2 cache connection ended");
137
+ this.isConnectedFlag = false;
138
+ this.stopHealthCheck();
139
+ });
140
+ }
141
+ catch (err) {
142
+ console.error("Failed to initialize Redis:", err);
143
+ this.enabled = false;
144
+ }
145
+ }
146
+ /**
147
+ * Get value from Redis L2 cache
148
+ */
149
+ async get(key) {
150
+ if (!this.enabled || !this.redis)
151
+ return null;
152
+ try {
153
+ return await this.circuitBreaker.execute(async () => {
154
+ const value = await this.redis.get(key);
155
+ return value ? JSON.parse(value) : null;
156
+ });
157
+ }
158
+ catch (err) {
159
+ if (err instanceof circuit_breaker_js_1.CircuitBreakerOpenError) {
160
+ console.warn("Redis circuit breaker is open, returning null");
161
+ return null; // Graceful degradation
162
+ }
163
+ console.warn(`Redis GET failed for key ${key}:`, err);
164
+ return null;
165
+ }
166
+ }
167
+ /**
168
+ * Get remaining TTL for a key in milliseconds
169
+ * Returns null if key doesn't exist or has no TTL
170
+ */
171
+ async getTtl(key) {
172
+ if (!this.enabled || !this.redis)
173
+ return null;
174
+ try {
175
+ return await this.circuitBreaker.execute(async () => {
176
+ const ttlSeconds = await this.redis.ttl(key);
177
+ if (ttlSeconds < 0) {
178
+ // -1 = key exists but has no TTL, -2 = key doesn't exist
179
+ return ttlSeconds === -1 ? null : null;
180
+ }
181
+ return ttlSeconds * 1000; // Convert to milliseconds
182
+ });
183
+ }
184
+ catch (err) {
185
+ if (err instanceof circuit_breaker_js_1.CircuitBreakerOpenError) {
186
+ console.warn("Redis circuit breaker is open, returning null TTL");
187
+ return null;
188
+ }
189
+ console.warn(`Redis TTL failed for key ${key}:`, err);
190
+ return null;
191
+ }
192
+ }
193
+ /**
194
+ * Set value in Redis L2 cache with TTL
195
+ * Uses direct L2 TTL value (in milliseconds) from caller
196
+ */
197
+ async set(key, value, ttlMs) {
198
+ if (!this.enabled || !this.redis)
199
+ return;
200
+ try {
201
+ await this.circuitBreaker.execute(async () => {
202
+ // Convert TTL from milliseconds to seconds for Redis
203
+ const ttlSeconds = Math.ceil(ttlMs / 1000);
204
+ await this.redis.set(key, JSON.stringify(value), "EX", ttlSeconds);
205
+ });
206
+ }
207
+ catch (err) {
208
+ if (err instanceof circuit_breaker_js_1.CircuitBreakerOpenError) {
209
+ console.warn("Redis circuit breaker is open, skipping SET");
210
+ return; // Graceful degradation
211
+ }
212
+ console.warn(`Redis SET failed for key ${key}:`, err);
213
+ }
214
+ }
215
+ /**
216
+ * Delete key from Redis L2 cache
217
+ */
218
+ async delete(key) {
219
+ if (!this.enabled || !this.redis)
220
+ return;
221
+ try {
222
+ await this.circuitBreaker.execute(async () => {
223
+ await this.redis.del(key);
224
+ });
225
+ }
226
+ catch (err) {
227
+ if (err instanceof circuit_breaker_js_1.CircuitBreakerOpenError) {
228
+ console.warn("Redis circuit breaker is open, skipping DELETE");
229
+ return; // Graceful degradation
230
+ }
231
+ console.warn(`Redis DELETE failed for key ${key}:`, err);
232
+ }
233
+ }
234
+ /**
235
+ * Invalidate all keys matching pattern
236
+ */
237
+ async invalidatePattern(pattern) {
238
+ if (!this.enabled || !this.redis)
239
+ return;
240
+ try {
241
+ await this.circuitBreaker.execute(async () => {
242
+ const keys = await this.redis.keys(pattern);
243
+ if (keys.length > 0) {
244
+ await this.redis.del(...keys);
245
+ }
246
+ });
247
+ }
248
+ catch (err) {
249
+ if (err instanceof circuit_breaker_js_1.CircuitBreakerOpenError) {
250
+ console.warn("Redis circuit breaker is open, skipping INVALIDATE_PATTERN");
251
+ return; // Graceful degradation
252
+ }
253
+ console.warn(`Redis INVALIDATE_PATTERN failed for ${pattern}:`, err);
254
+ }
255
+ }
256
+ /**
257
+ * Publish invalidation event to Redis pub/sub
258
+ * Uses structured message format with metadata for observability
259
+ */
260
+ async publishInvalidation(keys, pattern) {
261
+ if (!this.enabled || !this.redis)
262
+ return;
263
+ try {
264
+ await this.circuitBreaker.execute(async () => {
265
+ const message = {
266
+ version: "1.0",
267
+ timestamp: new Date().toISOString(),
268
+ source: this.instanceId,
269
+ keys,
270
+ pattern,
271
+ metadata: {
272
+ correlationId: crypto_1.default.randomUUID(),
273
+ reason: pattern ? "pattern_invalidation" : "key_invalidation",
274
+ },
275
+ };
276
+ await this.redis.publish("cache:invalidate", JSON.stringify(message));
277
+ });
278
+ }
279
+ catch (err) {
280
+ if (err instanceof circuit_breaker_js_1.CircuitBreakerOpenError) {
281
+ console.warn("Redis circuit breaker is open, skipping PUBLISH");
282
+ return; // Graceful degradation
283
+ }
284
+ console.warn("Redis PUBLISH failed:", err);
285
+ }
286
+ }
287
+ /**
288
+ * Get Redis statistics
289
+ */
290
+ async getStats() {
291
+ if (!this.enabled || !this.redis)
292
+ return null;
293
+ try {
294
+ return await this.circuitBreaker.execute(async () => {
295
+ const info = await this.redis.info("stats");
296
+ const memory = await this.redis.info("memory");
297
+ const clients = await this.redis.info("clients");
298
+ const hits = this.parseInfo(info, "keyspace_hits");
299
+ const misses = this.parseInfo(info, "keyspace_misses");
300
+ const total = hits + misses;
301
+ return {
302
+ connected: this.isConnected(),
303
+ hits,
304
+ misses,
305
+ hitRate: total > 0 ? hits / total : 0,
306
+ memoryUsed: this.parseInfo(memory, "used_memory"),
307
+ connectedClients: this.parseInfo(clients, "connected_clients"),
308
+ evictions: this.parseInfo(info, "evicted_keys"),
309
+ opsPerSec: this.parseInfo(info, "instantaneous_ops_per_sec"),
310
+ };
311
+ });
312
+ }
313
+ catch (err) {
314
+ if (err instanceof circuit_breaker_js_1.CircuitBreakerOpenError) {
315
+ console.warn("Redis circuit breaker is open, returning null stats");
316
+ return null; // Graceful degradation
317
+ }
318
+ console.warn("Redis getStats failed:", err);
319
+ return null;
320
+ }
321
+ }
322
+ /**
323
+ * Check if Redis client is connected
324
+ */
325
+ isConnected() {
326
+ return this.isConnectedFlag && this.redis?.status === "ready";
327
+ }
328
+ /**
329
+ * Start periodic health check interval
330
+ */
331
+ startHealthCheck() {
332
+ // Clear any existing interval first
333
+ this.stopHealthCheck();
334
+ this.healthCheckInterval = setInterval(async () => {
335
+ const isHealthy = await this.healthCheck();
336
+ if (!isHealthy) {
337
+ console.warn("Redis health check failed during periodic check");
338
+ this.isConnectedFlag = false;
339
+ // The reconnectOnError and retryStrategy will handle reconnection
340
+ }
341
+ else {
342
+ this.isConnectedFlag = true;
343
+ }
344
+ }, this.HEALTH_CHECK_INTERVAL_MS);
345
+ // Prevent the interval from keeping the process alive
346
+ if (this.healthCheckInterval.unref) {
347
+ this.healthCheckInterval.unref();
348
+ }
349
+ }
350
+ /**
351
+ * Stop periodic health check interval
352
+ */
353
+ stopHealthCheck() {
354
+ if (this.healthCheckInterval) {
355
+ clearInterval(this.healthCheckInterval);
356
+ this.healthCheckInterval = null;
357
+ }
358
+ }
359
+ /**
360
+ * Health check for Redis connection with timeout
361
+ *
362
+ * Tests Redis connection using PING command with configurable timeout.
363
+ * Returns false if Redis is disabled, not connected, or times out.
364
+ *
365
+ * @param timeoutMs - Timeout in milliseconds (default: 5000)
366
+ * @returns true if Redis is responsive, false otherwise
367
+ */
368
+ async healthCheck(timeoutMs = 5000) {
369
+ // Return false if Redis is disabled or not initialized
370
+ if (!this.enabled || !this.redis) {
371
+ console.warn("Redis health check failed: Redis is disabled or not initialized");
372
+ return false;
373
+ }
374
+ // Return false if client is not in ready state
375
+ if (!this.isConnected()) {
376
+ console.warn("Redis health check failed: Redis client is not connected");
377
+ return false;
378
+ }
379
+ try {
380
+ return await this.circuitBreaker.execute(async () => {
381
+ // Race between PING command and timeout
382
+ const pingPromise = this.redis.ping();
383
+ const timeoutPromise = new Promise((_, reject) => {
384
+ setTimeout(() => reject(new Error("Health check timeout")), timeoutMs);
385
+ });
386
+ await Promise.race([pingPromise, timeoutPromise]);
387
+ return true;
388
+ });
389
+ }
390
+ catch (err) {
391
+ if (err instanceof circuit_breaker_js_1.CircuitBreakerOpenError) {
392
+ console.warn("Redis health check skipped: circuit breaker is open");
393
+ return false; // Graceful degradation
394
+ }
395
+ const message = err instanceof Error ? err.message : String(err);
396
+ console.warn(`Redis health check failed: ${message}`);
397
+ return false;
398
+ }
399
+ }
400
+ /**
401
+ * Parse Redis INFO response for specific key
402
+ */
403
+ parseInfo(info, key) {
404
+ const match = info.match(new RegExp(`${key}:(\\d+)`));
405
+ return match ? parseInt(match[1], 10) : 0;
406
+ }
407
+ /**
408
+ * Close Redis connections
409
+ */
410
+ async close() {
411
+ this.stopHealthCheck();
412
+ this.isConnectedFlag = false;
413
+ if (this.subscriber) {
414
+ await this.subscriber.quit();
415
+ this.subscriber = null;
416
+ }
417
+ if (this.redis) {
418
+ await this.redis.quit();
419
+ this.redis = null;
420
+ }
421
+ }
422
+ }
423
+ exports.RedisCacheAdapter = RedisCacheAdapter;
424
+ //# sourceMappingURL=redis-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-adapter.js","sourceRoot":"","sources":["../../src/cache/redis-adapter.ts"],"names":[],"mappings":"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"}
@@ -8,10 +8,12 @@
8
8
  Object.defineProperty(exports, "__esModule", { value: true });
9
9
  const sidecar_server_js_1 = require("./sidecar-server.js");
10
10
  const logger_js_1 = require("../logging/logger.js");
11
+ const service_js_1 = require("../config/service.js");
11
12
  const path_1 = require("path");
12
13
  const fs_1 = require("fs");
13
14
  const SOCKET_PATH = process.env.CACHE_SOCKET_PATH || (0, path_1.join)(process.cwd(), "data", "cache.sock");
14
15
  async function main() {
16
+ const config = (0, service_js_1.loadServerConfig)();
15
17
  logger_js_1.logger.log({
16
18
  timestamp: Date.now(),
17
19
  level: "info",
@@ -33,7 +35,14 @@ async function main() {
33
35
  // Directory creation is best-effort; listen will surface failures.
34
36
  }
35
37
  }
36
- const server = new sidecar_server_js_1.CacheSidecarServer(SOCKET_PATH);
38
+ const server = new sidecar_server_js_1.CacheSidecarServer(SOCKET_PATH, {
39
+ enabled: config.redis.enabled,
40
+ host: config.redis.host,
41
+ port: config.redis.port,
42
+ password: config.redis.password,
43
+ db: config.redis.db,
44
+ ttlMultiplier: config.redis.ttlMultiplier,
45
+ });
37
46
  // Handle graceful shutdown
38
47
  const shutdown = async () => {
39
48
  logger_js_1.logger.log({
@@ -1 +1 @@
1
- {"version":3,"file":"run-sidecar.js","sourceRoot":"","sources":["../../src/cache/run-sidecar.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAEH,2DAAyD;AACzD,oDAA8C;AAE9C,+BAAqC;AACrC,2BAA+B;AAE/B,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAE/F,KAAK,UAAU,IAAI;IACf,kBAAM,CAAC,GAAG,CAAC;QACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,iDAAiD;KAC7D,CAAC,CAAC;IACH,kBAAM,CAAC,GAAG,CAAC;QACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK,EAAE,MAAM;QACb,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,+BAA+B,WAAW,EAAE;KACxD,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,IAAA,cAAO,EAAC,WAAW,CAAC,CAAC;IACvC,IAAI,SAAS,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,KAAK,GAAG,EAAE,CAAC;QACtD,IAAI,CAAC;YACD,IAAA,cAAS,EAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACL,mEAAmE;QACvE,CAAC;IACL,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,sCAAkB,CAAC,WAAW,CAAC,CAAC;IAEnD,2BAA2B;IAC3B,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QACxB,kBAAM,CAAC,GAAG,CAAC;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,iCAAiC;SAC7C,CAAC,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhC,eAAe;IACf,IAAI,CAAC;QACD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACrB,kBAAM,CAAC,GAAG,CAAC;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,4CAA4C;SACxD,CAAC,CAAC;IACP,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACX,kBAAM,CAAC,GAAG,CAAC;YACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,KAAK,EAAE,OAAO;YACd,IAAI,EAAE,OAAO;YACb,OAAO,EAAE,wCAAwC;YACjD,OAAO,EAAE,EAAE,GAAG,EAAE;SACnB,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACjB,kBAAM,CAAC,GAAG,CAAC;QACP,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,OAAO;QACb,OAAO,EAAE,6BAA6B;QACtC,OAAO,EAAE,GAAG;KACf,CAAC,CAAC;IACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"run-sidecar.js","sourceRoot":"","sources":["../../src/cache/run-sidecar.ts"],"names":[],"mappings":"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"}
@@ -5,12 +5,62 @@
5
5
  * Handles all cache operations via IPC.
6
6
  */
7
7
  import { estimateSize } from "./store.js";
8
+ import { type RedisCacheAdapterOptions } from "./redis-adapter.js";
8
9
  export { estimateSize };
9
10
  export declare class CacheSidecarServer {
10
11
  private server;
11
12
  private cache;
12
13
  private socketPath;
13
- constructor(socketPath: string);
14
+ private redis;
15
+ private invalidationRetryQueue;
16
+ private l2AccessLog;
17
+ private recentlyDemoted;
18
+ private cleanupInterval;
19
+ private readonly PROMOTION_THRESHOLD;
20
+ private readonly PROMOTION_WINDOW_MS;
21
+ private readonly DEMOTION_COOLDOWN_MS;
22
+ private readonly MIN_TTL_REMAINING_MS;
23
+ private readonly CLEANUP_INTERVAL_MS;
24
+ constructor(socketPath: string, redisConfig?: RedisCacheAdapterOptions);
25
+ /**
26
+ * Start periodic cleanup of old access and demotion records
27
+ */
28
+ private startCleanupInterval;
29
+ /**
30
+ * Stop periodic cleanup interval
31
+ */
32
+ private stopCleanupInterval;
33
+ /**
34
+ * Cleanup old access records and demotion records
35
+ */
36
+ private cleanupOldRecords;
37
+ /**
38
+ * Get partition for a key based on key prefix/pattern
39
+ * Keys are namespaced as "partition:key"
40
+ */
41
+ private getPartitionForKey;
42
+ /**
43
+ * Record L2 access and determine if entry should be promoted to L1
44
+ */
45
+ private recordL2AccessAndCheckPromotion;
46
+ /**
47
+ * Check if L1 partition has space for new entry
48
+ */
49
+ private hasSpaceInPartition;
50
+ /**
51
+ * Get access count for a key
52
+ */
53
+ private getAccessCount;
54
+ /**
55
+ * Mark a key as recently demoted to prevent immediate re-promotion
56
+ */
57
+ private onL1Eviction;
58
+ /**
59
+ * Set up L1→L2 promotion handlers on LRU eviction
60
+ * When an entry is evicted from L1 due to space constraints,
61
+ * write it to L2 Redis before it's lost
62
+ */
63
+ private setupL1EvictionHandlers;
14
64
  private registerHandlers;
15
65
  start(): Promise<void>;
16
66
  stop(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"sidecar-server.d.ts","sourceRoot":"","sources":["../../src/cache/sidecar-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAc,YAAY,EAAE,MAAM,YAAY,CAAC;AAItD,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,EAAE,MAAM;IAO9B,OAAO,CAAC,gBAAgB;IAqGlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAUtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAG9B"}
1
+ {"version":3,"file":"sidecar-server.d.ts","sourceRoot":"","sources":["../../src/cache/sidecar-server.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAc,YAAY,EAAE,MAAM,YAAY,CAAC;AAGtD,OAAO,EAAqB,KAAK,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAGtF,OAAO,EAAE,YAAY,EAAE,CAAC;AAWxB,qBAAa,kBAAkB;IAC3B,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,sBAAsB,CAAyB;IAGvD,OAAO,CAAC,WAAW,CAAwC;IAC3D,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,eAAe,CAA+B;IAEtD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAK;IACzC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAiB;IACrD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAa;IAClD,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAa;IAClD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAa;gBAErC,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,wBAAwB;IA8CtE;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAW5B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAO3B;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAU1B;;OAEG;IACH,OAAO,CAAC,+BAA+B;IAgDvC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAa3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAItB;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB;;;;OAIG;IACH,OAAO,CAAC,uBAAuB;IAqE/B,OAAO,CAAC,gBAAgB;IAgPlB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IActB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAS9B"}