@sixthsummit/ship-api 0.0.0-stage → 4.1.1

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 (556) hide show
  1. package/CHANGELOG.md +605 -0
  2. package/LICENSE +202 -0
  3. package/NOTICE +4 -0
  4. package/README.md +58 -2
  5. package/cli/commands/add.js +537 -0
  6. package/cli/commands/contract.js +2 -0
  7. package/cli/commands/create.js +250 -0
  8. package/cli/commands/dev.js +227 -0
  9. package/cli/commands/doctor.js +286 -0
  10. package/cli/commands/generate.js +937 -0
  11. package/cli/commands/graph.js +2 -0
  12. package/cli/commands/migrate-orm.js +1171 -0
  13. package/cli/commands/update.js +37 -0
  14. package/cli/ship-api.js +285 -0
  15. package/lib/app/auth/AuthProvider.d.ts +91 -0
  16. package/lib/app/auth/AuthProvider.d.ts.map +1 -0
  17. package/lib/app/auth/AuthProvider.js +13 -0
  18. package/lib/app/auth/AuthProvider.js.map +1 -0
  19. package/lib/app/auth/adapters/firebase.d.ts +79 -0
  20. package/lib/app/auth/adapters/firebase.d.ts.map +1 -0
  21. package/lib/app/auth/adapters/firebase.js +122 -0
  22. package/lib/app/auth/adapters/firebase.js.map +1 -0
  23. package/lib/app/auth/adapters/jwtCookie.d.ts +55 -0
  24. package/lib/app/auth/adapters/jwtCookie.d.ts.map +1 -0
  25. package/lib/app/auth/adapters/jwtCookie.js +120 -0
  26. package/lib/app/auth/adapters/jwtCookie.js.map +1 -0
  27. package/lib/app/auth/index.d.ts +8 -0
  28. package/lib/app/auth/index.d.ts.map +1 -0
  29. package/lib/app/auth/index.js +7 -0
  30. package/lib/app/auth/index.js.map +1 -0
  31. package/lib/app/auth/jwt/AuthFlow.d.ts +94 -0
  32. package/lib/app/auth/jwt/AuthFlow.d.ts.map +1 -0
  33. package/lib/app/auth/jwt/AuthFlow.js +127 -0
  34. package/lib/app/auth/jwt/AuthFlow.js.map +1 -0
  35. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts +80 -0
  36. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.d.ts.map +1 -0
  37. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js +134 -0
  38. package/lib/app/auth/jwt/DrizzleRefreshTokenStore.js.map +1 -0
  39. package/lib/app/auth/jwt/JwtSigner.d.ts +123 -0
  40. package/lib/app/auth/jwt/JwtSigner.d.ts.map +1 -0
  41. package/lib/app/auth/jwt/JwtSigner.js +118 -0
  42. package/lib/app/auth/jwt/JwtSigner.js.map +1 -0
  43. package/lib/app/auth/jwt/RefreshTokenStore.d.ts +97 -0
  44. package/lib/app/auth/jwt/RefreshTokenStore.d.ts.map +1 -0
  45. package/lib/app/auth/jwt/RefreshTokenStore.js +122 -0
  46. package/lib/app/auth/jwt/RefreshTokenStore.js.map +1 -0
  47. package/lib/app/auth/permissionDefinition.d.ts +20 -0
  48. package/lib/app/auth/permissionDefinition.d.ts.map +1 -0
  49. package/lib/app/auth/permissionDefinition.js +2 -0
  50. package/lib/app/auth/permissionDefinition.js.map +1 -0
  51. package/lib/app/context/RequestContext.d.ts +59 -0
  52. package/lib/app/context/RequestContext.d.ts.map +1 -0
  53. package/lib/app/context/RequestContext.js +25 -0
  54. package/lib/app/context/RequestContext.js.map +1 -0
  55. package/lib/app/db/QueryOptions.d.ts +82 -0
  56. package/lib/app/db/QueryOptions.d.ts.map +1 -0
  57. package/lib/app/db/QueryOptions.js +37 -0
  58. package/lib/app/db/QueryOptions.js.map +1 -0
  59. package/lib/app/db/baseFields.d.ts +60 -0
  60. package/lib/app/db/baseFields.d.ts.map +1 -0
  61. package/lib/app/db/baseFields.js +54 -0
  62. package/lib/app/db/baseFields.js.map +1 -0
  63. package/lib/app/db/buildWhere.d.ts +22 -0
  64. package/lib/app/db/buildWhere.d.ts.map +1 -0
  65. package/lib/app/db/buildWhere.js +75 -0
  66. package/lib/app/db/buildWhere.js.map +1 -0
  67. package/lib/app/db/client.d.ts +111 -0
  68. package/lib/app/db/client.d.ts.map +1 -0
  69. package/lib/app/db/client.js +99 -0
  70. package/lib/app/db/client.js.map +1 -0
  71. package/lib/app/db/tenantScoped.d.ts +59 -0
  72. package/lib/app/db/tenantScoped.d.ts.map +1 -0
  73. package/lib/app/db/tenantScoped.js +54 -0
  74. package/lib/app/db/tenantScoped.js.map +1 -0
  75. package/lib/app/db/transaction.d.ts +58 -0
  76. package/lib/app/db/transaction.d.ts.map +1 -0
  77. package/lib/app/db/transaction.js +106 -0
  78. package/lib/app/db/transaction.js.map +1 -0
  79. package/lib/app/health/HealthCheck.d.ts +121 -0
  80. package/lib/app/health/HealthCheck.d.ts.map +1 -0
  81. package/lib/app/health/HealthCheck.js +151 -0
  82. package/lib/app/health/HealthCheck.js.map +1 -0
  83. package/lib/app/health/redisHealthCheck.d.ts +14 -0
  84. package/lib/app/health/redisHealthCheck.d.ts.map +1 -0
  85. package/lib/app/health/redisHealthCheck.js +21 -0
  86. package/lib/app/health/redisHealthCheck.js.map +1 -0
  87. package/lib/app/lifecycle/Bootstrapper.d.ts +92 -0
  88. package/lib/app/lifecycle/Bootstrapper.d.ts.map +1 -0
  89. package/lib/app/lifecycle/Bootstrapper.js +99 -0
  90. package/lib/app/lifecycle/Bootstrapper.js.map +1 -0
  91. package/lib/app/registry/routes.d.ts +89 -0
  92. package/lib/app/registry/routes.d.ts.map +1 -0
  93. package/lib/app/registry/routes.js +72 -0
  94. package/lib/app/registry/routes.js.map +1 -0
  95. package/lib/app/services/DrizzleEntityService.d.ts +123 -0
  96. package/lib/app/services/DrizzleEntityService.d.ts.map +1 -0
  97. package/lib/app/services/DrizzleEntityService.js +342 -0
  98. package/lib/app/services/DrizzleEntityService.js.map +1 -0
  99. package/lib/app/services/RedisProvider.d.ts +52 -0
  100. package/lib/app/services/RedisProvider.d.ts.map +1 -0
  101. package/lib/app/services/RedisProvider.js +75 -0
  102. package/lib/app/services/RedisProvider.js.map +1 -0
  103. package/lib/app/services/cache/Cache.d.ts +70 -0
  104. package/lib/app/services/cache/Cache.d.ts.map +1 -0
  105. package/lib/app/services/cache/Cache.js +18 -0
  106. package/lib/app/services/cache/Cache.js.map +1 -0
  107. package/lib/app/services/cache/InMemoryCache.d.ts +35 -0
  108. package/lib/app/services/cache/InMemoryCache.d.ts.map +1 -0
  109. package/lib/app/services/cache/InMemoryCache.js +76 -0
  110. package/lib/app/services/cache/InMemoryCache.js.map +1 -0
  111. package/lib/app/services/cache/RedisCache.d.ts +99 -0
  112. package/lib/app/services/cache/RedisCache.d.ts.map +1 -0
  113. package/lib/app/services/cache/RedisCache.js +150 -0
  114. package/lib/app/services/cache/RedisCache.js.map +1 -0
  115. package/lib/app/services/cache/cached.d.ts +30 -0
  116. package/lib/app/services/cache/cached.d.ts.map +1 -0
  117. package/lib/app/services/cache/cached.js +38 -0
  118. package/lib/app/services/cache/cached.js.map +1 -0
  119. package/lib/app/services/cache/index.d.ts +5 -0
  120. package/lib/app/services/cache/index.d.ts.map +1 -0
  121. package/lib/app/services/cache/index.js +4 -0
  122. package/lib/app/services/cache/index.js.map +1 -0
  123. package/lib/app/services/cron/defineCron.d.ts +57 -0
  124. package/lib/app/services/cron/defineCron.d.ts.map +1 -0
  125. package/lib/app/services/cron/defineCron.js +15 -0
  126. package/lib/app/services/cron/defineCron.js.map +1 -0
  127. package/lib/app/services/cron/index.d.ts +2 -0
  128. package/lib/app/services/cron/index.d.ts.map +1 -0
  129. package/lib/app/services/cron/index.js +2 -0
  130. package/lib/app/services/cron/index.js.map +1 -0
  131. package/lib/app/services/hooks/LifecycleHooks.d.ts +61 -0
  132. package/lib/app/services/hooks/LifecycleHooks.d.ts.map +1 -0
  133. package/lib/app/services/hooks/LifecycleHooks.js +85 -0
  134. package/lib/app/services/hooks/LifecycleHooks.js.map +1 -0
  135. package/lib/app/services/jobs/JobsManager.d.ts +67 -0
  136. package/lib/app/services/jobs/JobsManager.d.ts.map +1 -0
  137. package/lib/app/services/jobs/JobsManager.js +121 -0
  138. package/lib/app/services/jobs/JobsManager.js.map +1 -0
  139. package/lib/app/services/jobs/bullBoard.d.ts +72 -0
  140. package/lib/app/services/jobs/bullBoard.d.ts.map +1 -0
  141. package/lib/app/services/jobs/bullBoard.js +96 -0
  142. package/lib/app/services/jobs/bullBoard.js.map +1 -0
  143. package/lib/app/services/jobs/defineJob.d.ts +81 -0
  144. package/lib/app/services/jobs/defineJob.d.ts.map +1 -0
  145. package/lib/app/services/jobs/defineJob.js +49 -0
  146. package/lib/app/services/jobs/defineJob.js.map +1 -0
  147. package/lib/app/services/jobs/index.d.ts +4 -0
  148. package/lib/app/services/jobs/index.d.ts.map +1 -0
  149. package/lib/app/services/jobs/index.js +4 -0
  150. package/lib/app/services/jobs/index.js.map +1 -0
  151. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts +23 -0
  152. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.d.ts.map +1 -0
  153. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js +51 -0
  154. package/lib/app/services/rateLimit/InMemorySlidingWindowBackend.js.map +1 -0
  155. package/lib/app/services/rateLimit/RateLimitBackend.d.ts +41 -0
  156. package/lib/app/services/rateLimit/RateLimitBackend.d.ts.map +1 -0
  157. package/lib/app/services/rateLimit/RateLimitBackend.js +19 -0
  158. package/lib/app/services/rateLimit/RateLimitBackend.js.map +1 -0
  159. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts +16 -0
  160. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.d.ts.map +1 -0
  161. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js +80 -0
  162. package/lib/app/services/rateLimit/RedisSlidingWindowBackend.js.map +1 -0
  163. package/lib/app/services/rateLimit/index.d.ts +4 -0
  164. package/lib/app/services/rateLimit/index.d.ts.map +1 -0
  165. package/lib/app/services/rateLimit/index.js +3 -0
  166. package/lib/app/services/rateLimit/index.js.map +1 -0
  167. package/lib/app/services/storage/DiskStorageAdapter.d.ts +62 -0
  168. package/lib/app/services/storage/DiskStorageAdapter.d.ts.map +1 -0
  169. package/lib/app/services/storage/DiskStorageAdapter.js +295 -0
  170. package/lib/app/services/storage/DiskStorageAdapter.js.map +1 -0
  171. package/lib/app/services/storage/GCSStorageAdapter.d.ts +44 -0
  172. package/lib/app/services/storage/GCSStorageAdapter.d.ts.map +1 -0
  173. package/lib/app/services/storage/GCSStorageAdapter.js +133 -0
  174. package/lib/app/services/storage/GCSStorageAdapter.js.map +1 -0
  175. package/lib/app/services/storage/S3StorageAdapter.d.ts +57 -0
  176. package/lib/app/services/storage/S3StorageAdapter.d.ts.map +1 -0
  177. package/lib/app/services/storage/S3StorageAdapter.js +162 -0
  178. package/lib/app/services/storage/S3StorageAdapter.js.map +1 -0
  179. package/lib/app/services/storage/StorageService.d.ts +88 -0
  180. package/lib/app/services/storage/StorageService.d.ts.map +1 -0
  181. package/lib/app/services/storage/StorageService.js +18 -0
  182. package/lib/app/services/storage/StorageService.js.map +1 -0
  183. package/lib/app/services/storage/index.d.ts +5 -0
  184. package/lib/app/services/storage/index.d.ts.map +1 -0
  185. package/lib/app/services/storage/index.js +4 -0
  186. package/lib/app/services/storage/index.js.map +1 -0
  187. package/lib/app/utils/ContextValidators.d.ts +46 -0
  188. package/lib/app/utils/ContextValidators.d.ts.map +1 -0
  189. package/lib/app/utils/ContextValidators.js +81 -0
  190. package/lib/app/utils/ContextValidators.js.map +1 -0
  191. package/lib/app/utils/defineEnv.d.ts +80 -0
  192. package/lib/app/utils/defineEnv.d.ts.map +1 -0
  193. package/lib/app/utils/defineEnv.js +95 -0
  194. package/lib/app/utils/defineEnv.js.map +1 -0
  195. package/lib/client.d.ts +139 -0
  196. package/lib/client.d.ts.map +1 -0
  197. package/lib/client.js +98 -0
  198. package/lib/client.js.map +1 -0
  199. package/lib/contract/application.d.ts +3 -0
  200. package/lib/contract/application.d.ts.map +1 -0
  201. package/lib/contract/application.js +2 -0
  202. package/lib/contract/application.js.map +1 -0
  203. package/lib/contract/client.d.ts +3 -0
  204. package/lib/contract/client.d.ts.map +1 -0
  205. package/lib/contract/client.js +3 -0
  206. package/lib/contract/client.js.map +1 -0
  207. package/lib/contract/index.d.ts +3 -0
  208. package/lib/contract/index.d.ts.map +1 -0
  209. package/lib/contract/index.js +3 -0
  210. package/lib/contract/index.js.map +1 -0
  211. package/lib/contract/manifest.d.ts +3 -0
  212. package/lib/contract/manifest.d.ts.map +1 -0
  213. package/lib/contract/manifest.js +2 -0
  214. package/lib/contract/manifest.js.map +1 -0
  215. package/lib/contract/openapi.d.ts +3 -0
  216. package/lib/contract/openapi.d.ts.map +1 -0
  217. package/lib/contract/openapi.js +3 -0
  218. package/lib/contract/openapi.js.map +1 -0
  219. package/lib/contract/project.d.ts +3 -0
  220. package/lib/contract/project.d.ts.map +1 -0
  221. package/lib/contract/project.js +3 -0
  222. package/lib/contract/project.js.map +1 -0
  223. package/lib/contract/schema.d.ts +3 -0
  224. package/lib/contract/schema.d.ts.map +1 -0
  225. package/lib/contract/schema.js +3 -0
  226. package/lib/contract/schema.js.map +1 -0
  227. package/lib/drizzle/index.d.ts +3 -0
  228. package/lib/drizzle/index.d.ts.map +1 -0
  229. package/lib/drizzle/index.js +3 -0
  230. package/lib/drizzle/index.js.map +1 -0
  231. package/lib/hono/auth.d.ts +6 -0
  232. package/lib/hono/auth.d.ts.map +1 -0
  233. package/lib/hono/auth.js +54 -0
  234. package/lib/hono/auth.js.map +1 -0
  235. package/lib/hono/index.d.ts +4 -0
  236. package/lib/hono/index.d.ts.map +1 -0
  237. package/lib/hono/index.js +4 -0
  238. package/lib/hono/index.js.map +1 -0
  239. package/lib/http/app/createApp.d.ts +132 -0
  240. package/lib/http/app/createApp.d.ts.map +1 -0
  241. package/lib/http/app/createApp.js +215 -0
  242. package/lib/http/app/createApp.js.map +1 -0
  243. package/lib/http/app/devRoutes.d.ts +31 -0
  244. package/lib/http/app/devRoutes.d.ts.map +1 -0
  245. package/lib/http/app/devRoutes.js +145 -0
  246. package/lib/http/app/devRoutes.js.map +1 -0
  247. package/lib/http/app/errors.d.ts +45 -0
  248. package/lib/http/app/errors.d.ts.map +1 -0
  249. package/lib/http/app/errors.js +93 -0
  250. package/lib/http/app/errors.js.map +1 -0
  251. package/lib/http/app/health.d.ts +66 -0
  252. package/lib/http/app/health.d.ts.map +1 -0
  253. package/lib/http/app/health.js +104 -0
  254. package/lib/http/app/health.js.map +1 -0
  255. package/lib/http/errors/AppError.d.ts +10 -0
  256. package/lib/http/errors/AppError.d.ts.map +1 -0
  257. package/lib/http/errors/AppError.js +19 -0
  258. package/lib/http/errors/AppError.js.map +1 -0
  259. package/lib/http/errors/AuthenticationError.d.ts +8 -0
  260. package/lib/http/errors/AuthenticationError.d.ts.map +1 -0
  261. package/lib/http/errors/AuthenticationError.js +10 -0
  262. package/lib/http/errors/AuthenticationError.js.map +1 -0
  263. package/lib/http/errors/AuthorizationError.d.ts +8 -0
  264. package/lib/http/errors/AuthorizationError.d.ts.map +1 -0
  265. package/lib/http/errors/AuthorizationError.js +10 -0
  266. package/lib/http/errors/AuthorizationError.js.map +1 -0
  267. package/lib/http/errors/BadRequestError.d.ts +8 -0
  268. package/lib/http/errors/BadRequestError.d.ts.map +1 -0
  269. package/lib/http/errors/BadRequestError.js +10 -0
  270. package/lib/http/errors/BadRequestError.js.map +1 -0
  271. package/lib/http/errors/ConflictError.d.ts +8 -0
  272. package/lib/http/errors/ConflictError.d.ts.map +1 -0
  273. package/lib/http/errors/ConflictError.js +10 -0
  274. package/lib/http/errors/ConflictError.js.map +1 -0
  275. package/lib/http/errors/InternalServerError.d.ts +8 -0
  276. package/lib/http/errors/InternalServerError.d.ts.map +1 -0
  277. package/lib/http/errors/InternalServerError.js +10 -0
  278. package/lib/http/errors/InternalServerError.js.map +1 -0
  279. package/lib/http/errors/NotFoundError.d.ts +8 -0
  280. package/lib/http/errors/NotFoundError.d.ts.map +1 -0
  281. package/lib/http/errors/NotFoundError.js +10 -0
  282. package/lib/http/errors/NotFoundError.js.map +1 -0
  283. package/lib/http/errors/RateLimitError.d.ts +13 -0
  284. package/lib/http/errors/RateLimitError.d.ts.map +1 -0
  285. package/lib/http/errors/RateLimitError.js +16 -0
  286. package/lib/http/errors/RateLimitError.js.map +1 -0
  287. package/lib/http/errors/ServiceUnavailableError.d.ts +8 -0
  288. package/lib/http/errors/ServiceUnavailableError.d.ts.map +1 -0
  289. package/lib/http/errors/ServiceUnavailableError.js +10 -0
  290. package/lib/http/errors/ServiceUnavailableError.js.map +1 -0
  291. package/lib/http/errors/ValidationError.d.ts +9 -0
  292. package/lib/http/errors/ValidationError.d.ts.map +1 -0
  293. package/lib/http/errors/ValidationError.js +12 -0
  294. package/lib/http/errors/ValidationError.js.map +1 -0
  295. package/lib/http/errors/index.d.ts +11 -0
  296. package/lib/http/errors/index.d.ts.map +1 -0
  297. package/lib/http/errors/index.js +12 -0
  298. package/lib/http/errors/index.js.map +1 -0
  299. package/lib/http/middleware/apiKey.d.ts +9 -0
  300. package/lib/http/middleware/apiKey.d.ts.map +1 -0
  301. package/lib/http/middleware/apiKey.js +71 -0
  302. package/lib/http/middleware/apiKey.js.map +1 -0
  303. package/lib/http/middleware/csrf.d.ts +63 -0
  304. package/lib/http/middleware/csrf.d.ts.map +1 -0
  305. package/lib/http/middleware/csrf.js +169 -0
  306. package/lib/http/middleware/csrf.js.map +1 -0
  307. package/lib/http/middleware/httpLogger.d.ts +39 -0
  308. package/lib/http/middleware/httpLogger.d.ts.map +1 -0
  309. package/lib/http/middleware/httpLogger.js +118 -0
  310. package/lib/http/middleware/httpLogger.js.map +1 -0
  311. package/lib/http/middleware/idempotency.d.ts +48 -0
  312. package/lib/http/middleware/idempotency.d.ts.map +1 -0
  313. package/lib/http/middleware/idempotency.js +180 -0
  314. package/lib/http/middleware/idempotency.js.map +1 -0
  315. package/lib/http/middleware/rateLimit.d.ts +105 -0
  316. package/lib/http/middleware/rateLimit.d.ts.map +1 -0
  317. package/lib/http/middleware/rateLimit.js +84 -0
  318. package/lib/http/middleware/rateLimit.js.map +1 -0
  319. package/lib/http/middleware/requireAuth.d.ts +58 -0
  320. package/lib/http/middleware/requireAuth.d.ts.map +1 -0
  321. package/lib/http/middleware/requireAuth.js +63 -0
  322. package/lib/http/middleware/requireAuth.js.map +1 -0
  323. package/lib/http/middleware/requirePermission.d.ts +23 -0
  324. package/lib/http/middleware/requirePermission.d.ts.map +1 -0
  325. package/lib/http/middleware/requirePermission.js +50 -0
  326. package/lib/http/middleware/requirePermission.js.map +1 -0
  327. package/lib/http/middleware/resolveTenant.d.ts +41 -0
  328. package/lib/http/middleware/resolveTenant.d.ts.map +1 -0
  329. package/lib/http/middleware/resolveTenant.js +17 -0
  330. package/lib/http/middleware/resolveTenant.js.map +1 -0
  331. package/lib/http/streaming/sse.d.ts +31 -0
  332. package/lib/http/streaming/sse.d.ts.map +1 -0
  333. package/lib/http/streaming/sse.js +11 -0
  334. package/lib/http/streaming/sse.js.map +1 -0
  335. package/lib/http/streaming/streamLLM.d.ts +94 -0
  336. package/lib/http/streaming/streamLLM.d.ts.map +1 -0
  337. package/lib/http/streaming/streamLLM.js +94 -0
  338. package/lib/http/streaming/streamLLM.js.map +1 -0
  339. package/lib/http/utils/authCookies.d.ts +74 -0
  340. package/lib/http/utils/authCookies.d.ts.map +1 -0
  341. package/lib/http/utils/authCookies.js +102 -0
  342. package/lib/http/utils/authCookies.js.map +1 -0
  343. package/lib/http/utils/clientIp.d.ts +85 -0
  344. package/lib/http/utils/clientIp.d.ts.map +1 -0
  345. package/lib/http/utils/clientIp.js +249 -0
  346. package/lib/http/utils/clientIp.js.map +1 -0
  347. package/lib/http/utils/index.d.ts +4 -0
  348. package/lib/http/utils/index.d.ts.map +1 -0
  349. package/lib/http/utils/index.js +5 -0
  350. package/lib/http/utils/index.js.map +1 -0
  351. package/lib/http/utils/metaTags.d.ts +49 -0
  352. package/lib/http/utils/metaTags.d.ts.map +1 -0
  353. package/lib/http/utils/metaTags.js +32 -0
  354. package/lib/http/utils/metaTags.js.map +1 -0
  355. package/lib/http/utils/publicSuffix.d.ts +34 -0
  356. package/lib/http/utils/publicSuffix.d.ts.map +1 -0
  357. package/lib/http/utils/publicSuffix.js +276 -0
  358. package/lib/http/utils/publicSuffix.js.map +1 -0
  359. package/lib/http/utils/uploads.d.ts +92 -0
  360. package/lib/http/utils/uploads.d.ts.map +1 -0
  361. package/lib/http/utils/uploads.js +126 -0
  362. package/lib/http/utils/uploads.js.map +1 -0
  363. package/lib/http/utils/validate.d.ts +41 -0
  364. package/lib/http/utils/validate.d.ts.map +1 -0
  365. package/lib/http/utils/validate.js +55 -0
  366. package/lib/http/utils/validate.js.map +1 -0
  367. package/lib/http/utils/webhooks.d.ts +63 -0
  368. package/lib/http/utils/webhooks.d.ts.map +1 -0
  369. package/lib/http/utils/webhooks.js +133 -0
  370. package/lib/http/utils/webhooks.js.map +1 -0
  371. package/lib/http/ws/auth.d.ts +46 -0
  372. package/lib/http/ws/auth.d.ts.map +1 -0
  373. package/lib/http/ws/auth.js +123 -0
  374. package/lib/http/ws/auth.js.map +1 -0
  375. package/lib/index.d.ts +80 -0
  376. package/lib/index.d.ts.map +1 -0
  377. package/lib/index.js +61 -0
  378. package/lib/index.js.map +1 -0
  379. package/lib/kernel/index.d.ts +3 -0
  380. package/lib/kernel/index.d.ts.map +1 -0
  381. package/lib/kernel/index.js +3 -0
  382. package/lib/kernel/index.js.map +1 -0
  383. package/lib/libraries/.gitkeep +0 -0
  384. package/lib/libraries/ai/CHANGELOG.md +17 -0
  385. package/lib/libraries/ai/README.md +164 -0
  386. package/lib/libraries/ai/adapters/AnthropicAdapter.ts +382 -0
  387. package/lib/libraries/ai/adapters/LLMProvider.ts +76 -0
  388. package/lib/libraries/ai/adapters/OpenAIAdapter.ts +466 -0
  389. package/lib/libraries/ai/experimental/index.ts +20 -0
  390. package/lib/libraries/ai/index.ts +128 -0
  391. package/lib/libraries/ai/library.json +19 -0
  392. package/lib/libraries/ai/loop/agentLoop.ts +377 -0
  393. package/lib/libraries/ai/prompts/definePrompt.ts +0 -0
  394. package/lib/libraries/ai/rag/retrieveAndAnswer.ts +177 -0
  395. package/lib/libraries/ai/streaming/streamLLM.ts +94 -0
  396. package/lib/libraries/ai/structured/completeStructured.ts +143 -0
  397. package/lib/libraries/ai/tokens/Tokenizer.ts +216 -0
  398. package/lib/libraries/ai/tools/defineTool.ts +208 -0
  399. package/lib/libraries/ai/types.ts +260 -0
  400. package/lib/libraries/chunking/ChunkingService.ts +103 -0
  401. package/lib/libraries/chunking/README.md +104 -0
  402. package/lib/libraries/chunking/docs/api-reference.md +549 -0
  403. package/lib/libraries/chunking/docs/best-practices.md +321 -0
  404. package/lib/libraries/chunking/docs/code-organization.md +538 -0
  405. package/lib/libraries/chunking/docs/configuration.md +418 -0
  406. package/lib/libraries/chunking/docs/index.md +236 -0
  407. package/lib/libraries/chunking/docs/quick-start.md +298 -0
  408. package/lib/libraries/chunking/docs/strategies.md +407 -0
  409. package/lib/libraries/chunking/docs/summary.md +258 -0
  410. package/lib/libraries/chunking/docs/troubleshooting.md +527 -0
  411. package/lib/libraries/chunking/index.ts +17 -0
  412. package/lib/libraries/chunking/library.json +16 -0
  413. package/lib/libraries/chunking/strategies/ChunkingStrategy.ts +13 -0
  414. package/lib/libraries/chunking/strategies/FixedLengthChunkingStrategy.ts +88 -0
  415. package/lib/libraries/chunking/strategies/SemanticChunkingStrategy.ts +389 -0
  416. package/lib/libraries/chunking/strategies/SlidingWindowChunkingStrategy.ts +258 -0
  417. package/lib/libraries/chunking/types/index.ts +63 -0
  418. package/lib/libraries/email/EmailService.ts +591 -0
  419. package/lib/libraries/email/README.md +777 -0
  420. package/lib/libraries/email/TemplateRegistry.ts +148 -0
  421. package/lib/libraries/email/TemplateRenderer.ts +273 -0
  422. package/lib/libraries/email/index.ts +4 -0
  423. package/lib/libraries/email/initializeEmailService.ts +60 -0
  424. package/lib/libraries/email/library.json +12 -0
  425. package/lib/libraries/email/types/EmailAddress.ts +4 -0
  426. package/lib/libraries/email/types/EmailAttachment.ts +11 -0
  427. package/lib/libraries/email/types/EmailTag.ts +9 -0
  428. package/lib/libraries/email/types/EmailTemplate.ts +124 -0
  429. package/lib/libraries/email/types/SendBatchEmailsOptions.ts +9 -0
  430. package/lib/libraries/email/types/SendBatchEmailsResult.ts +9 -0
  431. package/lib/libraries/email/types/SendEmailOptions.ts +33 -0
  432. package/lib/libraries/email/types/SendEmailResult.ts +9 -0
  433. package/lib/libraries/email/types/index.ts +8 -0
  434. package/lib/libraries/weaviate/QueryBuilder.ts +292 -0
  435. package/lib/libraries/weaviate/README.md +284 -0
  436. package/lib/libraries/weaviate/Weaviate.ts +1419 -0
  437. package/lib/libraries/weaviate/WeaviateConfig.ts +268 -0
  438. package/lib/libraries/weaviate/docs/.gitkeep +1 -0
  439. package/lib/libraries/weaviate/docs/API_REFERENCE.md +1067 -0
  440. package/lib/libraries/weaviate/docs/CONFIGURATION.md +320 -0
  441. package/lib/libraries/weaviate/docs/ERROR_HANDLING.md +271 -0
  442. package/lib/libraries/weaviate/docs/MULTI_TENANCY.md +348 -0
  443. package/lib/libraries/weaviate/docs/PERFORMANCE.md +602 -0
  444. package/lib/libraries/weaviate/docs/PLUGIN_DEVELOPMENT.md +547 -0
  445. package/lib/libraries/weaviate/docs/QUICK_START.md +443 -0
  446. package/lib/libraries/weaviate/docs/README.md +269 -0
  447. package/lib/libraries/weaviate/docs/SCHEMA_GUIDE.md +630 -0
  448. package/lib/libraries/weaviate/docs/WEAVIATE_README.md +520 -0
  449. package/lib/libraries/weaviate/errors/WeaviateError.ts +92 -0
  450. package/lib/libraries/weaviate/errors/index.ts +1 -0
  451. package/lib/libraries/weaviate/index.ts +35 -0
  452. package/lib/libraries/weaviate/library.json +26 -0
  453. package/lib/libraries/weaviate/plugins/index.ts +2 -0
  454. package/lib/libraries/weaviate/schemas/SchemaRegistry.ts +284 -0
  455. package/lib/libraries/weaviate/schemas/index.ts +2 -0
  456. package/lib/libraries/weaviate/types/BM25SearchOptions.ts +9 -0
  457. package/lib/libraries/weaviate/types/ExtendedWeaviateClient.ts +7 -0
  458. package/lib/libraries/weaviate/types/HybridSearchOptions.ts +11 -0
  459. package/lib/libraries/weaviate/types/MultiTenancy.ts +81 -0
  460. package/lib/libraries/weaviate/types/Plugin.ts +17 -0
  461. package/lib/libraries/weaviate/types/SchemaConfig.ts +25 -0
  462. package/lib/libraries/weaviate/types/SearchMethod.ts +8 -0
  463. package/lib/libraries/weaviate/types/SearchOptions.ts +16 -0
  464. package/lib/libraries/weaviate/types/SearchRequest.ts +19 -0
  465. package/lib/libraries/weaviate/types/SearchResult.ts +16 -0
  466. package/lib/libraries/weaviate/types/SearchableField.ts +87 -0
  467. package/lib/libraries/weaviate/types/VectorIndexConfig.ts +19 -0
  468. package/lib/libraries/weaviate/types/VectorSearchOptions.ts +18 -0
  469. package/lib/libraries/weaviate/types/VectorizerConfig.ts +8 -0
  470. package/lib/libraries/weaviate/types/index.ts +29 -0
  471. package/lib/libraries/weaviate/utils/TenantContextManager.ts +94 -0
  472. package/lib/modules/accounts/index.ts +47 -0
  473. package/lib/modules/accounts/module.json +15 -0
  474. package/lib/modules/accounts/permissions.ts +33 -0
  475. package/lib/modules/accounts/routes.ts +200 -0
  476. package/lib/modules/accounts/schema.ts +219 -0
  477. package/lib/modules/accounts/services/AccountService.ts +44 -0
  478. package/lib/modules/accounts/validation/schemas.ts +70 -0
  479. package/lib/modules/oauth/adapters/GmailOAuthAdapter.ts +35 -0
  480. package/lib/modules/oauth/adapters/GoogleOAuthAdapter.ts +278 -0
  481. package/lib/modules/oauth/adapters/MicrosoftOAuthAdapter.ts +269 -0
  482. package/lib/modules/oauth/adapters/MockOAuthAdapter.ts +138 -0
  483. package/lib/modules/oauth/adapters/OAuthAdapter.ts +211 -0
  484. package/lib/modules/oauth/adapters/OAuthAdapterRegistry.ts +77 -0
  485. package/lib/modules/oauth/adapters/OutlookOAuthAdapter.ts +38 -0
  486. package/lib/modules/oauth/index.ts +79 -0
  487. package/lib/modules/oauth/module.json +23 -0
  488. package/lib/modules/oauth/permissions.ts +39 -0
  489. package/lib/modules/oauth/routes.ts +497 -0
  490. package/lib/modules/oauth/schema.ts +127 -0
  491. package/lib/modules/oauth/services/OAuthConnectionService.ts +147 -0
  492. package/lib/modules/oauth/state.ts +234 -0
  493. package/lib/modules/oauth/stateJtiCache.ts +85 -0
  494. package/lib/modules/oauth/verifyIdToken.ts +178 -0
  495. package/lib/modules/outbox/EventEmitter.ts +106 -0
  496. package/lib/modules/outbox/OutboxDrainer.ts +163 -0
  497. package/lib/modules/outbox/handlers/EventHandler.ts +115 -0
  498. package/lib/modules/outbox/index.ts +43 -0
  499. package/lib/modules/outbox/module.json +15 -0
  500. package/lib/modules/outbox/permissions.ts +36 -0
  501. package/lib/modules/outbox/routes.ts +219 -0
  502. package/lib/modules/outbox/schema.ts +207 -0
  503. package/lib/modules/outbox/services/OutboxEventService.ts +223 -0
  504. package/lib/observability/logger.d.ts +30 -0
  505. package/lib/observability/logger.d.ts.map +1 -0
  506. package/lib/observability/logger.js +110 -0
  507. package/lib/observability/logger.js.map +1 -0
  508. package/lib/observability/metrics.d.ts +3 -0
  509. package/lib/observability/metrics.d.ts.map +1 -0
  510. package/lib/observability/metrics.js +3 -0
  511. package/lib/observability/metrics.js.map +1 -0
  512. package/lib/observability/otel.d.ts +3 -0
  513. package/lib/observability/otel.d.ts.map +1 -0
  514. package/lib/observability/otel.js +3 -0
  515. package/lib/observability/otel.js.map +1 -0
  516. package/lib/observability/safeErrorFields.d.ts +14 -0
  517. package/lib/observability/safeErrorFields.d.ts.map +1 -0
  518. package/lib/observability/safeErrorFields.js +14 -0
  519. package/lib/observability/safeErrorFields.js.map +1 -0
  520. package/lib/observability/tracing.d.ts +3 -0
  521. package/lib/observability/tracing.d.ts.map +1 -0
  522. package/lib/observability/tracing.js +3 -0
  523. package/lib/observability/tracing.js.map +1 -0
  524. package/lib/package.json +4 -0
  525. package/lib/testing.d.ts +3 -0
  526. package/lib/testing.d.ts.map +1 -0
  527. package/lib/testing.js +3 -0
  528. package/lib/testing.js.map +1 -0
  529. package/package.json +193 -3
  530. package/templates/default/.claude/agents/qa-brief.md +106 -0
  531. package/templates/default/.claude/commands/sherpa-brief.md +23 -0
  532. package/templates/default/.cursor/rules/api.mdc +80 -0
  533. package/templates/default/.cursor/rules/commits.mdc +88 -0
  534. package/templates/default/.cursor/rules/security.mdc +92 -0
  535. package/templates/default/.cursor/rules/testing.mdc +123 -0
  536. package/templates/default/.cursor/rules/typescript.mdc +86 -0
  537. package/templates/default/.env.example +79 -0
  538. package/templates/default/.github/workflows/sherpa-brief.yml +180 -0
  539. package/templates/default/AGENTS.md +166 -0
  540. package/templates/default/CLAUDE.md +17 -0
  541. package/templates/default/README.md +97 -0
  542. package/templates/default/_gitignore +27 -0
  543. package/templates/default/docker-compose.yml +83 -0
  544. package/templates/default/drizzle.config.ts +34 -0
  545. package/templates/default/eslint.config.mjs +106 -0
  546. package/templates/default/package.json +57 -0
  547. package/templates/default/ship-api.config.ts +21 -0
  548. package/templates/default/src/client.ts +34 -0
  549. package/templates/default/src/config/modules.ts +23 -0
  550. package/templates/default/src/db/schema.ts +26 -0
  551. package/templates/default/src/environment.ts +81 -0
  552. package/templates/default/src/index.test.ts +53 -0
  553. package/templates/default/src/index.ts +11 -0
  554. package/templates/default/src/instrumentation.ts +13 -0
  555. package/templates/default/src/server.ts +90 -0
  556. package/templates/default/tsconfig.json +24 -0
@@ -0,0 +1,81 @@
1
+ import type { Job, JobsOptions } from "bullmq";
2
+ import type { LifecycleHookContext } from "../../services/hooks/LifecycleHooks.js";
3
+ /**
4
+ * `defineJob({ queue, name, handler, options?, schedule? })` — declarative
5
+ * background-job definition that auto-registers into the framework
6
+ * `jobRegistry`.
7
+ *
8
+ * Replaces v3's ad-hoc job patterns. Each job lives in
9
+ * `modules/<name>/jobs/<jobName>.job.ts` (convention) and default-exports
10
+ * its definition. The framework's eventual InitJobs bootstrapper walks
11
+ * the module tree, registers every defined job, and starts BullMQ workers
12
+ * for each unique queue when `WORKER_MODE` includes worker.
13
+ *
14
+ * Type safety: the optional generic `TPayload` flows from `defineJob`
15
+ * through `enqueue(queue, name, payload)` to the handler — agents and
16
+ * humans alike get IDE feedback on payload shape.
17
+ *
18
+ * Schedule: `schedule: { cron: '0 * * * *' }` registers a BullMQ
19
+ * repeatable job at workers-startup time. The framework `defineCron(...)`
20
+ * helper (next batch) is a thin wrapper over this with cron-specific
21
+ * ergonomics.
22
+ */
23
+ export interface JobHandlerContext {
24
+ /** The underlying BullMQ Job for advanced needs (logger, progress, etc.). */
25
+ job: Job;
26
+ /** Per-run framework context; mirrors the HTTP RequestContext shape so
27
+ * lifecycle hooks behave the same in jobs as in requests. */
28
+ context: LifecycleHookContext;
29
+ }
30
+ export type JobHandler<TPayload = unknown, TResult = unknown> = (payload: TPayload, ctx: JobHandlerContext) => Promise<TResult> | TResult;
31
+ export interface JobDefinitionOptions {
32
+ /** BullMQ JobsOptions (attempts, backoff, priority, etc.) applied at enqueue time. */
33
+ defaultJobOptions?: JobsOptions;
34
+ /**
35
+ * Repeatable schedule (cron expression). When set, the framework
36
+ * registers a BullMQ repeatable job alongside the handler at worker
37
+ * startup. Use `defineCron(...)` for the more ergonomic shortcut.
38
+ */
39
+ schedule?: {
40
+ cron: string;
41
+ tz?: string;
42
+ };
43
+ /** Worker-side concurrency for this queue. Default 1. */
44
+ concurrency?: number;
45
+ }
46
+ export interface JobDefinition<TPayload = unknown, TResult = unknown> {
47
+ /** Queue name. Multiple jobs can share a queue; the worker dispatches by `name`. */
48
+ readonly queue: string;
49
+ /** Job name within the queue. Unique per-queue. */
50
+ readonly name: string;
51
+ readonly handler: JobHandler<TPayload, TResult>;
52
+ readonly options?: JobDefinitionOptions;
53
+ }
54
+ /**
55
+ * Define a job. Auto-registers into the framework `jobRegistry` (via
56
+ * the `register` argument's default). For tests / standalone usage, pass
57
+ * a custom registry to keep state isolated.
58
+ */
59
+ export declare function defineJob<TPayload = unknown, TResult = unknown>(def: JobDefinition<TPayload, TResult>, register?: {
60
+ add: (def: JobDefinition) => void;
61
+ } | false): JobDefinition<TPayload, TResult>;
62
+ /**
63
+ * In-memory registry of every `defineJob`-declared definition. Populated
64
+ * at module-load time when the framework imports the module's job files;
65
+ * read at worker startup to wire BullMQ Workers.
66
+ */
67
+ export declare class JobRegistry {
68
+ private jobs;
69
+ add(def: JobDefinition): void;
70
+ list(): readonly JobDefinition[];
71
+ /** All job definitions for one queue. */
72
+ byQueue(queue: string): JobDefinition[];
73
+ /** Distinct queue names across all registered jobs. */
74
+ queues(): string[];
75
+ find(queue: string, name: string): JobDefinition | undefined;
76
+ size(): number;
77
+ clear(): void;
78
+ }
79
+ /** Framework-wide registry. */
80
+ export declare const jobRegistry: JobRegistry;
81
+ //# sourceMappingURL=defineJob.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineJob.d.ts","sourceRoot":"","sources":["../../../../src/app/services/jobs/defineJob.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAC/C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAEnF;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,GAAG,EAAE,GAAG,CAAC;IACT;kEAC8D;IAC9D,OAAO,EAAE,oBAAoB,CAAC;CAC/B;AAED,MAAM,MAAM,UAAU,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,IAAI,CAC9D,OAAO,EAAE,QAAQ,EACjB,GAAG,EAAE,iBAAiB,KACnB,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;AAEhC,MAAM,WAAW,oBAAoB;IACnC,sFAAsF;IACtF,iBAAiB,CAAC,EAAE,WAAW,CAAC;IAChC;;;;OAIG;IACH,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IAClE,oFAAoF;IACpF,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAChD,QAAQ,CAAC,OAAO,CAAC,EAAE,oBAAoB,CAAC;CACzC;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,QAAQ,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,EAC7D,GAAG,EAAE,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,EACrC,QAAQ,GAAE;IAAE,GAAG,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,IAAI,CAAA;CAAE,GAAG,KAAmB,GACpE,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAKlC;AAED;;;;GAIG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,IAAI,CAAuB;IAEnC,GAAG,CAAC,GAAG,EAAE,aAAa,GAAG,IAAI;IAQ7B,IAAI,IAAI,SAAS,aAAa,EAAE;IAIhC,yCAAyC;IACzC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE;IAIvC,uDAAuD;IACvD,MAAM,IAAI,MAAM,EAAE;IAIlB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS;IAI5D,IAAI,IAAI,MAAM;IAId,KAAK,IAAI,IAAI;CAGd;AAED,+BAA+B;AAC/B,eAAO,MAAM,WAAW,aAAoB,CAAC"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Define a job. Auto-registers into the framework `jobRegistry` (via
3
+ * the `register` argument's default). For tests / standalone usage, pass
4
+ * a custom registry to keep state isolated.
5
+ */
6
+ export function defineJob(def, register = jobRegistry) {
7
+ if (register !== false) {
8
+ register.add(def);
9
+ }
10
+ return def;
11
+ }
12
+ /**
13
+ * In-memory registry of every `defineJob`-declared definition. Populated
14
+ * at module-load time when the framework imports the module's job files;
15
+ * read at worker startup to wire BullMQ Workers.
16
+ */
17
+ export class JobRegistry {
18
+ jobs = [];
19
+ add(def) {
20
+ const dup = this.jobs.find((j) => j.queue === def.queue && j.name === def.name);
21
+ if (dup) {
22
+ throw new Error(`JobRegistry: duplicate job "${def.name}" in queue "${def.queue}"`);
23
+ }
24
+ this.jobs.push(def);
25
+ }
26
+ list() {
27
+ return [...this.jobs];
28
+ }
29
+ /** All job definitions for one queue. */
30
+ byQueue(queue) {
31
+ return this.jobs.filter((j) => j.queue === queue);
32
+ }
33
+ /** Distinct queue names across all registered jobs. */
34
+ queues() {
35
+ return [...new Set(this.jobs.map((j) => j.queue))];
36
+ }
37
+ find(queue, name) {
38
+ return this.jobs.find((j) => j.queue === queue && j.name === name);
39
+ }
40
+ size() {
41
+ return this.jobs.length;
42
+ }
43
+ clear() {
44
+ this.jobs = [];
45
+ }
46
+ }
47
+ /** Framework-wide registry. */
48
+ export const jobRegistry = new JobRegistry();
49
+ //# sourceMappingURL=defineJob.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defineJob.js","sourceRoot":"","sources":["../../../../src/app/services/jobs/defineJob.ts"],"names":[],"mappings":"AA2DA;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,GAAqC,EACrC,WAA0D,WAAW;IAErE,IAAI,QAAQ,KAAK,KAAK,EAAE,CAAC;QACvB,QAAQ,CAAC,GAAG,CAAC,GAA+B,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACd,IAAI,GAAoB,EAAE,CAAC;IAEnC,GAAG,CAAC,GAAkB;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC;QAChF,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,IAAI,KAAK,CAAC,+BAA+B,GAAG,CAAC,IAAI,eAAe,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,yCAAyC;IACzC,OAAO,CAAC,KAAa;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;IACpD,CAAC;IAED,uDAAuD;IACvD,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,CAAC,KAAa,EAAE,IAAY;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC;IACjB,CAAC;CACF;AAED,+BAA+B;AAC/B,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { type BullBoardHandle, type BullBoardOptions, createBullBoardApp } from "./bullBoard.js";
2
+ export { defineJob, type JobDefinition, type JobDefinitionOptions, type JobHandler, type JobHandlerContext, JobRegistry, jobRegistry, } from "./defineJob.js";
3
+ export { JobsManager, type JobsManagerOptions, type WorkerMode } from "./JobsManager.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/app/services/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EACL,SAAS,EACT,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,UAAU,EACf,KAAK,iBAAiB,EACtB,WAAW,EACX,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { createBullBoardApp } from "./bullBoard.js";
2
+ export { defineJob, JobRegistry, jobRegistry, } from "./defineJob.js";
3
+ export { JobsManager } from "./JobsManager.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/app/services/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+C,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EACL,SAAS,EAKT,WAAW,EACX,WAAW,GACZ,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,WAAW,EAA4C,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { RateLimitBackend, RateLimitCheckArgs, RateLimitCheckResult } from "./RateLimitBackend.js";
2
+ /**
3
+ * In-process sliding-window-log limiter. Stores the timestamp of every
4
+ * counted request in a per-key array; on each `check()` it drops entries
5
+ * older than the window, counts the remainder, and either appends + allows
6
+ * or returns denied.
7
+ *
8
+ * Single-process only — does NOT coordinate across instances. Use Redis
9
+ * for multi-instance deployments. Suitable for tests, single-process dev,
10
+ * and as a documented `onRedisUnavailable: 'allow'` fallback if a consumer
11
+ * accepts the per-instance ceiling.
12
+ *
13
+ * Memory bound: each bucket holds at most `max` timestamps. A periodic
14
+ * cleanup-on-write removes empty buckets so abandoned keys (no traffic
15
+ * for > windowMs) don't leak memory.
16
+ */
17
+ export declare class InMemorySlidingWindowBackend implements RateLimitBackend {
18
+ private buckets;
19
+ check(args: RateLimitCheckArgs): Promise<RateLimitCheckResult>;
20
+ /** Test helper: wipe everything. */
21
+ clear(): void;
22
+ }
23
+ //# sourceMappingURL=InMemorySlidingWindowBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemorySlidingWindowBackend.d.ts","sourceRoot":"","sources":["../../../../src/app/services/rateLimit/InMemorySlidingWindowBackend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAE/B;;;;;;;;;;;;;;GAcG;AACH,qBAAa,4BAA6B,YAAW,gBAAgB;IACnE,OAAO,CAAC,OAAO,CAA+B;IAExC,KAAK,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAiCpE,oCAAoC;IACpC,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * In-process sliding-window-log limiter. Stores the timestamp of every
3
+ * counted request in a per-key array; on each `check()` it drops entries
4
+ * older than the window, counts the remainder, and either appends + allows
5
+ * or returns denied.
6
+ *
7
+ * Single-process only — does NOT coordinate across instances. Use Redis
8
+ * for multi-instance deployments. Suitable for tests, single-process dev,
9
+ * and as a documented `onRedisUnavailable: 'allow'` fallback if a consumer
10
+ * accepts the per-instance ceiling.
11
+ *
12
+ * Memory bound: each bucket holds at most `max` timestamps. A periodic
13
+ * cleanup-on-write removes empty buckets so abandoned keys (no traffic
14
+ * for > windowMs) don't leak memory.
15
+ */
16
+ export class InMemorySlidingWindowBackend {
17
+ buckets = new Map();
18
+ async check(args) {
19
+ const { key, windowMs, max, now } = args;
20
+ const cutoff = now - windowMs;
21
+ let timestamps = this.buckets.get(key) ?? [];
22
+ // Drop entries older than the window
23
+ timestamps = timestamps.filter((t) => t > cutoff);
24
+ if (timestamps.length >= max) {
25
+ // Reset = oldest counted timestamp + window
26
+ const resetAtMs = (timestamps[0] ?? now) + windowMs;
27
+ this.buckets.set(key, timestamps);
28
+ return {
29
+ allowed: false,
30
+ used: timestamps.length,
31
+ limit: max,
32
+ resetAtMs,
33
+ };
34
+ }
35
+ timestamps.push(now);
36
+ this.buckets.set(key, timestamps);
37
+ // Reset of the (now-non-empty) window — based on the oldest entry
38
+ const resetAtMs = timestamps[0] + windowMs;
39
+ return {
40
+ allowed: true,
41
+ used: timestamps.length,
42
+ limit: max,
43
+ resetAtMs,
44
+ };
45
+ }
46
+ /** Test helper: wipe everything. */
47
+ clear() {
48
+ this.buckets.clear();
49
+ }
50
+ }
51
+ //# sourceMappingURL=InMemorySlidingWindowBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InMemorySlidingWindowBackend.js","sourceRoot":"","sources":["../../../../src/app/services/rateLimit/InMemorySlidingWindowBackend.ts"],"names":[],"mappings":"AAMA;;;;;;;;;;;;;;GAcG;AACH,MAAM,OAAO,4BAA4B;IAC/B,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE9C,KAAK,CAAC,KAAK,CAAC,IAAwB;QAClC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;QACzC,MAAM,MAAM,GAAG,GAAG,GAAG,QAAQ,CAAC;QAE9B,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QAC7C,qCAAqC;QACrC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QAElD,IAAI,UAAU,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;YAC7B,4CAA4C;YAC5C,MAAM,SAAS,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC;YACpD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;YAClC,OAAO;gBACL,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,UAAU,CAAC,MAAM;gBACvB,KAAK,EAAE,GAAG;gBACV,SAAS;aACV,CAAC;QACJ,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,CAAC;QAElC,kEAAkE;QAClE,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAE,GAAG,QAAQ,CAAC;QAC5C,OAAO;YACL,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,UAAU,CAAC,MAAM;YACvB,KAAK,EAAE,GAAG;YACV,SAAS;SACV,CAAC;IACJ,CAAC;IAED,oCAAoC;IACpC,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Storage abstraction for the rate-limit middleware.
3
+ *
4
+ * Two implementations ship in v4.0:
5
+ * - `RedisSlidingWindowBackend` — production default. Atomic Lua-script
6
+ * sliding-window log over a Redis sorted set (ZADD/ZRANGE/ZCARD).
7
+ * Supports horizontal scaling.
8
+ * - `InMemorySlidingWindowBackend` — test fixture. Single-process only;
9
+ * useful for unit tests and as a documented fallback when running
10
+ * a single-instance dev / staging service.
11
+ *
12
+ * The interface deliberately exposes the algorithm-agnostic shape: a
13
+ * single `check()` that atomically counts + records the request and
14
+ * returns the verdict + bookkeeping. Future v4.x implementations
15
+ * (Cloudflare Durable Objects, Upstash REST, Memcached CAS) plug in
16
+ * without changing the middleware.
17
+ */
18
+ export interface RateLimitCheckArgs {
19
+ /** Composed bucket key (caller has already applied scope + key generator). */
20
+ key: string;
21
+ /** Window length in milliseconds. */
22
+ windowMs: number;
23
+ /** Maximum requests per window. */
24
+ max: number;
25
+ /** Current time in epoch milliseconds. Injected for deterministic tests. */
26
+ now: number;
27
+ }
28
+ export interface RateLimitCheckResult {
29
+ /** `true` → request is permitted; `false` → over the ceiling. */
30
+ allowed: boolean;
31
+ /** Number of requests counted toward this window so far (post-this-call). */
32
+ used: number;
33
+ /** Configured ceiling (returned for header convenience). */
34
+ limit: number;
35
+ /** Window-reset time in epoch ms. Used to compute `Retry-After`. */
36
+ resetAtMs: number;
37
+ }
38
+ export interface RateLimitBackend {
39
+ check(args: RateLimitCheckArgs): Promise<RateLimitCheckResult>;
40
+ }
41
+ //# sourceMappingURL=RateLimitBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimitBackend.d.ts","sourceRoot":"","sources":["../../../../src/app/services/rateLimit/RateLimitBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,WAAW,kBAAkB;IACjC,8EAA8E;IAC9E,GAAG,EAAE,MAAM,CAAC;IACZ,qCAAqC;IACrC,QAAQ,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,4EAA4E;IAC5E,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,OAAO,EAAE,OAAO,CAAC;IACjB,6EAA6E;IAC7E,IAAI,EAAE,MAAM,CAAC;IACb,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,oEAAoE;IACpE,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAChE"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Storage abstraction for the rate-limit middleware.
3
+ *
4
+ * Two implementations ship in v4.0:
5
+ * - `RedisSlidingWindowBackend` — production default. Atomic Lua-script
6
+ * sliding-window log over a Redis sorted set (ZADD/ZRANGE/ZCARD).
7
+ * Supports horizontal scaling.
8
+ * - `InMemorySlidingWindowBackend` — test fixture. Single-process only;
9
+ * useful for unit tests and as a documented fallback when running
10
+ * a single-instance dev / staging service.
11
+ *
12
+ * The interface deliberately exposes the algorithm-agnostic shape: a
13
+ * single `check()` that atomically counts + records the request and
14
+ * returns the verdict + bookkeeping. Future v4.x implementations
15
+ * (Cloudflare Durable Objects, Upstash REST, Memcached CAS) plug in
16
+ * without changing the middleware.
17
+ */
18
+ export {};
19
+ //# sourceMappingURL=RateLimitBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RateLimitBackend.js","sourceRoot":"","sources":["../../../../src/app/services/rateLimit/RateLimitBackend.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG"}
@@ -0,0 +1,16 @@
1
+ import type { RateLimitBackend, RateLimitCheckArgs, RateLimitCheckResult } from "./RateLimitBackend.js";
2
+ export interface RedisEvalClient {
3
+ eval(script: string, numKeys: number, ...args: (string | number)[]): Promise<unknown>;
4
+ }
5
+ export interface RedisSlidingWindowBackendOptions {
6
+ client: RedisEvalClient;
7
+ /** Optional namespace prepended to every bucket key. */
8
+ keyPrefix?: string;
9
+ }
10
+ export declare class RedisSlidingWindowBackend implements RateLimitBackend {
11
+ private client;
12
+ private keyPrefix;
13
+ constructor(opts: RedisSlidingWindowBackendOptions);
14
+ check(args: RateLimitCheckArgs): Promise<RateLimitCheckResult>;
15
+ }
16
+ //# sourceMappingURL=RedisSlidingWindowBackend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisSlidingWindowBackend.d.ts","sourceRoot":"","sources":["../../../../src/app/services/rateLimit/RedisSlidingWindowBackend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,EACrB,MAAM,uBAAuB,CAAC;AAoD/B,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvF;AAED,MAAM,WAAW,gCAAgC;IAC/C,MAAM,EAAE,eAAe,CAAC;IACxB,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAcD,qBAAa,yBAA0B,YAAW,gBAAgB;IAChE,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,SAAS,CAAS;gBAEd,IAAI,EAAE,gCAAgC;IAK5C,KAAK,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAoBrE"}
@@ -0,0 +1,80 @@
1
+ import { randomBytes } from "node:crypto";
2
+ /**
3
+ * Atomic sliding-window-log rate limiter on Redis.
4
+ *
5
+ * Algorithm: each key is a sorted set keyed by timestamp. Each request
6
+ * goes through a single Lua script that:
7
+ * 1. ZREMRANGEBYSCORE removes entries outside the current window.
8
+ * 2. ZCARD reads the current count.
9
+ * 3. If >= max, returns denied (looks up the oldest entry to compute
10
+ * the reset time).
11
+ * 4. Otherwise, ZADD adds this request and PEXPIRE bumps the bucket TTL.
12
+ *
13
+ * Single Lua script means atomicity per key — no race between concurrent
14
+ * requests sharing a bucket. Cluster mode: hash-tag the bucket key to
15
+ * keep it on one shard.
16
+ *
17
+ * Returns `{ allowed (0|1), used, limit, resetAtMs }` from the script;
18
+ * the wrapper translates to the `RateLimitCheckResult` shape.
19
+ *
20
+ * Designed to accept any Redis-like client that supports `eval`. ioredis
21
+ * and node-redis both qualify.
22
+ */
23
+ const LUA_SLIDING_WINDOW = `
24
+ local now = tonumber(ARGV[1])
25
+ local windowMs = tonumber(ARGV[2])
26
+ local max = tonumber(ARGV[3])
27
+ local entryId = ARGV[4]
28
+
29
+ -- Drop expired entries
30
+ redis.call('ZREMRANGEBYSCORE', KEYS[1], 0, now - windowMs)
31
+
32
+ local count = redis.call('ZCARD', KEYS[1])
33
+
34
+ if count >= max then
35
+ -- Get oldest entry's score to compute when the window resets
36
+ local oldest = redis.call('ZRANGE', KEYS[1], 0, 0, 'WITHSCORES')
37
+ local resetAt = oldest[2] and (tonumber(oldest[2]) + windowMs) or (now + windowMs)
38
+ return { 0, count, max, resetAt }
39
+ end
40
+
41
+ -- Allowed — record this request
42
+ redis.call('ZADD', KEYS[1], now, entryId)
43
+ redis.call('PEXPIRE', KEYS[1], windowMs)
44
+
45
+ local newCount = count + 1
46
+ local oldest = redis.call('ZRANGE', KEYS[1], 0, 0, 'WITHSCORES')
47
+ local resetAt = oldest[2] and (tonumber(oldest[2]) + windowMs) or (now + windowMs)
48
+ return { 1, newCount, max, resetAt }
49
+ `;
50
+ function nextEntryId(now) {
51
+ // Unique-enough per-process token: now-ms suffixed with crypto-quality
52
+ // random bytes. F26 replaced the prior monotonic counter — that leaked
53
+ // process uptime / request-count info to anyone who could observe two
54
+ // consecutive entry IDs (admittedly a low-impact info leak, but
55
+ // `crypto.randomBytes` is free).
56
+ //
57
+ // 8 bytes → 16 hex chars → 64 bits of entropy per entry. Far above the
58
+ // collision threshold for a millisecond window even under heavy load.
59
+ return `${now}-${randomBytes(8).toString("hex")}`;
60
+ }
61
+ export class RedisSlidingWindowBackend {
62
+ client;
63
+ keyPrefix;
64
+ constructor(opts) {
65
+ this.client = opts.client;
66
+ this.keyPrefix = opts.keyPrefix ?? "ratelimit:";
67
+ }
68
+ async check(args) {
69
+ const namespacedKey = this.keyPrefix + args.key;
70
+ const result = (await this.client.eval(LUA_SLIDING_WINDOW, 1, namespacedKey, args.now, args.windowMs, args.max, nextEntryId(args.now)));
71
+ const [allowedFlag, used, limit, resetAtMs] = result;
72
+ return {
73
+ allowed: allowedFlag === 1,
74
+ used,
75
+ limit,
76
+ resetAtMs,
77
+ };
78
+ }
79
+ }
80
+ //# sourceMappingURL=RedisSlidingWindowBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedisSlidingWindowBackend.js","sourceRoot":"","sources":["../../../../src/app/services/rateLimit/RedisSlidingWindowBackend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAO1C;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;CA0B1B,CAAC;AAYF,SAAS,WAAW,CAAC,GAAW;IAC9B,uEAAuE;IACvE,uEAAuE;IACvE,sEAAsE;IACtE,gEAAgE;IAChE,iCAAiC;IACjC,EAAE;IACF,uEAAuE;IACvE,sEAAsE;IACtE,OAAO,GAAG,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACpD,CAAC;AAED,MAAM,OAAO,yBAAyB;IAC5B,MAAM,CAAkB;IACxB,SAAS,CAAS;IAE1B,YAAY,IAAsC;QAChD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,YAAY,CAAC;IAClD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAwB;QAClC,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC;QAChD,MAAM,MAAM,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,CACpC,kBAAkB,EAClB,CAAC,EACD,aAAa,EACb,IAAI,CAAC,GAAG,EACR,IAAI,CAAC,QAAQ,EACb,IAAI,CAAC,GAAG,EACR,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CACtB,CAAqC,CAAC;QAEvC,MAAM,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,MAAM,CAAC;QACrD,OAAO;YACL,OAAO,EAAE,WAAW,KAAK,CAAC;YAC1B,IAAI;YACJ,KAAK;YACL,SAAS;SACV,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export { InMemorySlidingWindowBackend } from "./InMemorySlidingWindowBackend.js";
2
+ export type { RateLimitBackend, RateLimitCheckArgs, RateLimitCheckResult, } from "./RateLimitBackend.js";
3
+ export { type RedisEvalClient, RedisSlidingWindowBackend, type RedisSlidingWindowBackendOptions, } from "./RedisSlidingWindowBackend.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/app/services/rateLimit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,YAAY,EACV,gBAAgB,EAChB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,KAAK,eAAe,EACpB,yBAAyB,EACzB,KAAK,gCAAgC,GACtC,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { InMemorySlidingWindowBackend } from "./InMemorySlidingWindowBackend.js";
2
+ export { RedisSlidingWindowBackend, } from "./RedisSlidingWindowBackend.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/app/services/rateLimit/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AAMjF,OAAO,EAEL,yBAAyB,GAE1B,MAAM,gCAAgC,CAAC"}
@@ -0,0 +1,62 @@
1
+ import type { GetResult, ListOptions, ListResult, PutOptions, StorageBody, StorageObjectMeta, StorageService } from "./StorageService.js";
2
+ export interface DiskStorageAdapterOptions {
3
+ /** Absolute path to the root directory. Created on first `put` if absent. */
4
+ rootDir: string;
5
+ }
6
+ export declare class DiskStorageAdapter implements StorageService {
7
+ private rootDir;
8
+ /**
9
+ * Lazily-resolved real path of `rootDir`. Cached because the root
10
+ * doesn't move at runtime — and recomputing it per I/O call would
11
+ * stat the entire root-prefix chain every time.
12
+ */
13
+ private realRootCache?;
14
+ constructor(opts: DiskStorageAdapterOptions);
15
+ /**
16
+ * Resolve a key to an absolute filesystem path, refusing path traversal.
17
+ * String-based check only — see `resolveKeySafe` for the realpath-based
18
+ * defense against symlink escapes.
19
+ */
20
+ private resolveKey;
21
+ /**
22
+ * `resolveKey` after a realpath-pass that defeats symlink escapes —
23
+ * critical for multi-tenant deployments on shared filesystems (NFS,
24
+ * shared k8s volumes) where one tenant's upload directory could
25
+ * contain a symlink pointing at another tenant's prefix. The pure
26
+ * string check in `resolveKey` is sound against `..` patterns but
27
+ * doesn't notice symlinks.
28
+ *
29
+ * Strategy: find the deepest existing ancestor of the target path,
30
+ * `realpath` it (resolving any symlinks along the way), then
31
+ * re-check that the canonical absolute path is still inside
32
+ * `realRootDir`. New-key writes work because the "deepest existing
33
+ * ancestor" is usually the parent directory of the new file.
34
+ *
35
+ * `lstat` (not `stat`) is the gate so a symlink whose target is
36
+ * missing is still detected — we want the symlink itself to count
37
+ * as "exists" for the walk, then realpath resolves it.
38
+ */
39
+ private resolveKeySafe;
40
+ private getRealRoot;
41
+ /** Convert any StorageBody into a Buffer (DiskStorageAdapter buffers fully). */
42
+ private bodyToBuffer;
43
+ put(key: string, body: StorageBody, opts?: PutOptions): Promise<StorageObjectMeta>;
44
+ get(key: string): Promise<GetResult | null>;
45
+ exists(key: string): Promise<boolean>;
46
+ delete(key: string): Promise<void>;
47
+ /**
48
+ * Recursive listing of `rootDir`. `prefix` is matched against the
49
+ * key (not the absolute path); `continuationToken` is an opaque numeric
50
+ * cursor of how many entries have been emitted so far.
51
+ *
52
+ * For local-disk semantics this is fine; production cloud adapters
53
+ * carry stronger pagination guarantees.
54
+ */
55
+ list(prefix?: string, opts?: ListOptions): Promise<ListResult>;
56
+ /**
57
+ * Yields all keys (relative paths) under `dir`. Skips `.meta.json`
58
+ * sidecars so they don't appear as separate objects.
59
+ */
60
+ private walkKeys;
61
+ }
62
+ //# sourceMappingURL=DiskStorageAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DiskStorageAdapter.d.ts","sourceRoot":"","sources":["../../../../src/app/services/storage/DiskStorageAdapter.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,cAAc,EACf,MAAM,qBAAqB,CAAC;AAwB7B,MAAM,WAAW,yBAAyB;IACxC,6EAA6E;IAC7E,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,OAAO,CAAS;IACxB;;;;OAIG;IACH,OAAO,CAAC,aAAa,CAAC,CAAS;gBAEnB,IAAI,EAAE,yBAAyB;IAM3C;;;;OAIG;IACH,OAAO,CAAC,UAAU;IAelB;;;;;;;;;;;;;;;;;OAiBG;YACW,cAAc;YA+Dd,WAAW;IAgBzB,gFAAgF;YAClE,YAAY;IAsBpB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE,UAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC;IA2BtF,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IA8B3C,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWrC,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxC;;;;;;;OAOG;IACG,IAAI,CAAC,MAAM,SAAK,EAAE,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IAmCpE;;;OAGG;YACW,QAAQ;CAqBvB"}