@catbee/utils 0.0.8-rc.0 → 0.0.8-rc.2

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 (281) hide show
  1. package/README.md +25 -1
  2. package/build/esm/config.d.ts +0 -1
  3. package/build/esm/config.js +6 -7
  4. package/build/esm/index.d.ts +0 -1
  5. package/build/esm/index.js +0 -1
  6. package/build/esm/servers/server.builder.d.ts +0 -1
  7. package/build/esm/servers/server.builder.js +99 -147
  8. package/build/esm/servers/server.d.ts +0 -1
  9. package/build/esm/servers/server.js +591 -876
  10. package/build/esm/types/api-response.d.ts +0 -1
  11. package/build/esm/types/api-response.js +0 -1
  12. package/build/esm/types/index.d.ts +0 -1
  13. package/build/esm/types/index.js +0 -1
  14. package/build/esm/types/server.d.ts +0 -1
  15. package/build/esm/types/server.js +0 -1
  16. package/build/esm/utils/array.utils.d.ts +0 -1
  17. package/build/esm/utils/array.utils.js +48 -86
  18. package/build/esm/utils/async.utils.d.ts +0 -1
  19. package/build/esm/utils/async.utils.js +247 -524
  20. package/build/esm/utils/cache.utils.d.ts +0 -1
  21. package/build/esm/utils/cache.utils.js +96 -301
  22. package/build/esm/utils/context-store.utils.d.ts +0 -1
  23. package/build/esm/utils/context-store.utils.js +62 -79
  24. package/build/esm/utils/crypto.utils.d.ts +0 -1
  25. package/build/esm/utils/crypto.utils.js +78 -175
  26. package/build/esm/utils/date.utils.d.ts +0 -1
  27. package/build/esm/utils/date.utils.js +47 -53
  28. package/build/esm/utils/decorators.utils.d.ts +201 -5
  29. package/build/esm/utils/decorators.utils.js +632 -285
  30. package/build/esm/utils/dir.utils.d.ts +0 -1
  31. package/build/esm/utils/dir.utils.js +264 -786
  32. package/build/esm/utils/env.utils.d.ts +0 -1
  33. package/build/esm/utils/env.utils.js +180 -271
  34. package/build/esm/utils/exception.utils.d.ts +0 -1
  35. package/build/esm/utils/exception.utils.js +112 -289
  36. package/build/esm/utils/fs.utils.d.ts +0 -1
  37. package/build/esm/utils/fs.utils.js +169 -401
  38. package/build/esm/utils/http-status-codes.d.ts +0 -1
  39. package/build/esm/utils/http-status-codes.js +0 -1
  40. package/build/esm/utils/id.utils.d.ts +0 -1
  41. package/build/esm/utils/id.utils.js +5 -9
  42. package/build/esm/utils/logger.utils.d.ts +0 -1
  43. package/build/esm/utils/logger.utils.js +34 -71
  44. package/build/esm/utils/middleware.utils.d.ts +0 -1
  45. package/build/esm/utils/middleware.utils.js +65 -155
  46. package/build/esm/utils/obj.utils.d.ts +0 -1
  47. package/build/esm/utils/obj.utils.js +69 -176
  48. package/build/esm/utils/performance.utils.d.ts +0 -1
  49. package/build/esm/utils/performance.utils.js +92 -195
  50. package/build/esm/utils/request.utils.d.ts +0 -1
  51. package/build/esm/utils/request.utils.js +41 -74
  52. package/build/esm/utils/response.utils.d.ts +0 -1
  53. package/build/esm/utils/response.utils.js +84 -107
  54. package/build/esm/utils/stream.utils.d.ts +0 -1
  55. package/build/esm/utils/stream.utils.js +38 -113
  56. package/build/esm/utils/string.utils.d.ts +0 -1
  57. package/build/esm/utils/string.utils.js +6 -11
  58. package/build/esm/utils/type.utils.d.ts +0 -1
  59. package/build/esm/utils/type.utils.js +8 -12
  60. package/build/esm/utils/url.utils.d.ts +0 -1
  61. package/build/esm/utils/url.utils.js +49 -127
  62. package/build/esm/utils/validate.utils.d.ts +0 -1
  63. package/build/esm/utils/validate.utils.js +23 -40
  64. package/package.json +3 -33
  65. package/build/esm/config.js.map +0 -1
  66. package/build/esm/index.js.map +0 -1
  67. package/build/esm/servers/server.builder.js.map +0 -1
  68. package/build/esm/servers/server.js.map +0 -1
  69. package/build/esm/types/api-response.js.map +0 -1
  70. package/build/esm/types/index.js.map +0 -1
  71. package/build/esm/types/server.js.map +0 -1
  72. package/build/esm/utils/array.utils.js.map +0 -1
  73. package/build/esm/utils/async.utils.js.map +0 -1
  74. package/build/esm/utils/cache.utils.js.map +0 -1
  75. package/build/esm/utils/context-store.utils.js.map +0 -1
  76. package/build/esm/utils/crypto.utils.js.map +0 -1
  77. package/build/esm/utils/date.utils.js.map +0 -1
  78. package/build/esm/utils/decorators.utils.js.map +0 -1
  79. package/build/esm/utils/dir.utils.js.map +0 -1
  80. package/build/esm/utils/env.utils.js.map +0 -1
  81. package/build/esm/utils/exception.utils.js.map +0 -1
  82. package/build/esm/utils/fs.utils.js.map +0 -1
  83. package/build/esm/utils/http-status-codes.js.map +0 -1
  84. package/build/esm/utils/id.utils.js.map +0 -1
  85. package/build/esm/utils/logger.utils.js.map +0 -1
  86. package/build/esm/utils/middleware.utils.js.map +0 -1
  87. package/build/esm/utils/obj.utils.js.map +0 -1
  88. package/build/esm/utils/performance.utils.js.map +0 -1
  89. package/build/esm/utils/request.utils.js.map +0 -1
  90. package/build/esm/utils/response.utils.js.map +0 -1
  91. package/build/esm/utils/stream.utils.js.map +0 -1
  92. package/build/esm/utils/string.utils.js.map +0 -1
  93. package/build/esm/utils/type.utils.js.map +0 -1
  94. package/build/esm/utils/url.utils.js.map +0 -1
  95. package/build/esm/utils/validate.utils.js.map +0 -1
  96. package/build/esnext/config.d.ts +0 -122
  97. package/build/esnext/config.js +0 -133
  98. package/build/esnext/config.js.map +0 -1
  99. package/build/esnext/index.d.ts +0 -27
  100. package/build/esnext/index.js +0 -50
  101. package/build/esnext/index.js.map +0 -1
  102. package/build/esnext/servers/server.builder.d.ts +0 -508
  103. package/build/esnext/servers/server.builder.js +0 -657
  104. package/build/esnext/servers/server.builder.js.map +0 -1
  105. package/build/esnext/servers/server.d.ts +0 -256
  106. package/build/esnext/servers/server.js +0 -955
  107. package/build/esnext/servers/server.js.map +0 -1
  108. package/build/esnext/types/api-response.d.ts +0 -152
  109. package/build/esnext/types/api-response.js +0 -34
  110. package/build/esnext/types/api-response.js.map +0 -1
  111. package/build/esnext/types/index.d.ts +0 -125
  112. package/build/esnext/types/index.js +0 -25
  113. package/build/esnext/types/index.js.map +0 -1
  114. package/build/esnext/types/server.d.ts +0 -268
  115. package/build/esnext/types/server.js +0 -25
  116. package/build/esnext/types/server.js.map +0 -1
  117. package/build/esnext/utils/array.utils.d.ts +0 -168
  118. package/build/esnext/utils/array.utils.js +0 -345
  119. package/build/esnext/utils/array.utils.js.map +0 -1
  120. package/build/esnext/utils/async.utils.d.ts +0 -265
  121. package/build/esnext/utils/async.utils.js +0 -620
  122. package/build/esnext/utils/async.utils.js.map +0 -1
  123. package/build/esnext/utils/cache.utils.d.ts +0 -153
  124. package/build/esnext/utils/cache.utils.js +0 -293
  125. package/build/esnext/utils/cache.utils.js.map +0 -1
  126. package/build/esnext/utils/context-store.utils.d.ts +0 -189
  127. package/build/esnext/utils/context-store.utils.js +0 -289
  128. package/build/esnext/utils/context-store.utils.js.map +0 -1
  129. package/build/esnext/utils/crypto.utils.d.ts +0 -160
  130. package/build/esnext/utils/crypto.utils.js +0 -276
  131. package/build/esnext/utils/crypto.utils.js.map +0 -1
  132. package/build/esnext/utils/date.utils.d.ts +0 -159
  133. package/build/esnext/utils/date.utils.js +0 -384
  134. package/build/esnext/utils/date.utils.js.map +0 -1
  135. package/build/esnext/utils/decorators.utils.d.ts +0 -315
  136. package/build/esnext/utils/decorators.utils.js +0 -504
  137. package/build/esnext/utils/decorators.utils.js.map +0 -1
  138. package/build/esnext/utils/dir.utils.d.ts +0 -196
  139. package/build/esnext/utils/dir.utils.js +0 -477
  140. package/build/esnext/utils/dir.utils.js.map +0 -1
  141. package/build/esnext/utils/env.utils.d.ts +0 -377
  142. package/build/esnext/utils/env.utils.js +0 -785
  143. package/build/esnext/utils/env.utils.js.map +0 -1
  144. package/build/esnext/utils/exception.utils.d.ts +0 -230
  145. package/build/esnext/utils/exception.utils.js +0 -381
  146. package/build/esnext/utils/exception.utils.js.map +0 -1
  147. package/build/esnext/utils/fs.utils.d.ts +0 -164
  148. package/build/esnext/utils/fs.utils.js +0 -349
  149. package/build/esnext/utils/fs.utils.js.map +0 -1
  150. package/build/esnext/utils/http-status-codes.d.ts +0 -266
  151. package/build/esnext/utils/http-status-codes.js +0 -295
  152. package/build/esnext/utils/http-status-codes.js.map +0 -1
  153. package/build/esnext/utils/id.utils.d.ts +0 -36
  154. package/build/esnext/utils/id.utils.js +0 -84
  155. package/build/esnext/utils/id.utils.js.map +0 -1
  156. package/build/esnext/utils/logger.utils.d.ts +0 -160
  157. package/build/esnext/utils/logger.utils.js +0 -300
  158. package/build/esnext/utils/logger.utils.js.map +0 -1
  159. package/build/esnext/utils/middleware.utils.d.ts +0 -100
  160. package/build/esnext/utils/middleware.utils.js +0 -236
  161. package/build/esnext/utils/middleware.utils.js.map +0 -1
  162. package/build/esnext/utils/obj.utils.d.ts +0 -124
  163. package/build/esnext/utils/obj.utils.js +0 -413
  164. package/build/esnext/utils/obj.utils.js.map +0 -1
  165. package/build/esnext/utils/performance.utils.d.ts +0 -136
  166. package/build/esnext/utils/performance.utils.js +0 -271
  167. package/build/esnext/utils/performance.utils.js.map +0 -1
  168. package/build/esnext/utils/request.utils.d.ts +0 -86
  169. package/build/esnext/utils/request.utils.js +0 -186
  170. package/build/esnext/utils/request.utils.js.map +0 -1
  171. package/build/esnext/utils/response.utils.d.ts +0 -163
  172. package/build/esnext/utils/response.utils.js +0 -247
  173. package/build/esnext/utils/response.utils.js.map +0 -1
  174. package/build/esnext/utils/stream.utils.d.ts +0 -88
  175. package/build/esnext/utils/stream.utils.js +0 -210
  176. package/build/esnext/utils/stream.utils.js.map +0 -1
  177. package/build/esnext/utils/string.utils.d.ts +0 -93
  178. package/build/esnext/utils/string.utils.js +0 -165
  179. package/build/esnext/utils/string.utils.js.map +0 -1
  180. package/build/esnext/utils/type.utils.d.ts +0 -90
  181. package/build/esnext/utils/type.utils.js +0 -187
  182. package/build/esnext/utils/type.utils.js.map +0 -1
  183. package/build/esnext/utils/url.utils.d.ts +0 -141
  184. package/build/esnext/utils/url.utils.js +0 -304
  185. package/build/esnext/utils/url.utils.js.map +0 -1
  186. package/build/esnext/utils/validate.utils.d.ts +0 -177
  187. package/build/esnext/utils/validate.utils.js +0 -320
  188. package/build/esnext/utils/validate.utils.js.map +0 -1
  189. package/build/src/config.d.ts +0 -122
  190. package/build/src/config.js +0 -138
  191. package/build/src/config.js.map +0 -1
  192. package/build/src/index.d.ts +0 -27
  193. package/build/src/index.js +0 -69
  194. package/build/src/index.js.map +0 -1
  195. package/build/src/servers/server.builder.d.ts +0 -508
  196. package/build/src/servers/server.builder.js +0 -661
  197. package/build/src/servers/server.builder.js.map +0 -1
  198. package/build/src/servers/server.d.ts +0 -256
  199. package/build/src/servers/server.js +0 -962
  200. package/build/src/servers/server.js.map +0 -1
  201. package/build/src/types/api-response.d.ts +0 -152
  202. package/build/src/types/api-response.js +0 -37
  203. package/build/src/types/api-response.js.map +0 -1
  204. package/build/src/types/index.d.ts +0 -125
  205. package/build/src/types/index.js +0 -26
  206. package/build/src/types/index.js.map +0 -1
  207. package/build/src/types/server.d.ts +0 -268
  208. package/build/src/types/server.js +0 -26
  209. package/build/src/types/server.js.map +0 -1
  210. package/build/src/utils/array.utils.d.ts +0 -168
  211. package/build/src/utils/array.utils.js +0 -364
  212. package/build/src/utils/array.utils.js.map +0 -1
  213. package/build/src/utils/async.utils.d.ts +0 -265
  214. package/build/src/utils/async.utils.js +0 -641
  215. package/build/src/utils/async.utils.js.map +0 -1
  216. package/build/src/utils/cache.utils.d.ts +0 -153
  217. package/build/src/utils/cache.utils.js +0 -297
  218. package/build/src/utils/cache.utils.js.map +0 -1
  219. package/build/src/utils/context-store.utils.d.ts +0 -189
  220. package/build/src/utils/context-store.utils.js +0 -296
  221. package/build/src/utils/context-store.utils.js.map +0 -1
  222. package/build/src/utils/crypto.utils.d.ts +0 -160
  223. package/build/src/utils/crypto.utils.js +0 -293
  224. package/build/src/utils/crypto.utils.js.map +0 -1
  225. package/build/src/utils/date.utils.d.ts +0 -159
  226. package/build/src/utils/date.utils.js +0 -396
  227. package/build/src/utils/date.utils.js.map +0 -1
  228. package/build/src/utils/decorators.utils.d.ts +0 -315
  229. package/build/src/utils/decorators.utils.js +0 -516
  230. package/build/src/utils/decorators.utils.js.map +0 -1
  231. package/build/src/utils/dir.utils.d.ts +0 -196
  232. package/build/src/utils/dir.utils.js +0 -501
  233. package/build/src/utils/dir.utils.js.map +0 -1
  234. package/build/src/utils/env.utils.d.ts +0 -377
  235. package/build/src/utils/env.utils.js +0 -789
  236. package/build/src/utils/env.utils.js.map +0 -1
  237. package/build/src/utils/exception.utils.d.ts +0 -230
  238. package/build/src/utils/exception.utils.js +0 -407
  239. package/build/src/utils/exception.utils.js.map +0 -1
  240. package/build/src/utils/fs.utils.d.ts +0 -164
  241. package/build/src/utils/fs.utils.js +0 -372
  242. package/build/src/utils/fs.utils.js.map +0 -1
  243. package/build/src/utils/http-status-codes.d.ts +0 -266
  244. package/build/src/utils/http-status-codes.js +0 -298
  245. package/build/src/utils/http-status-codes.js.map +0 -1
  246. package/build/src/utils/id.utils.d.ts +0 -36
  247. package/build/src/utils/id.utils.js +0 -91
  248. package/build/src/utils/id.utils.js.map +0 -1
  249. package/build/src/utils/logger.utils.d.ts +0 -160
  250. package/build/src/utils/logger.utils.js +0 -346
  251. package/build/src/utils/logger.utils.js.map +0 -1
  252. package/build/src/utils/middleware.utils.d.ts +0 -100
  253. package/build/src/utils/middleware.utils.js +0 -244
  254. package/build/src/utils/middleware.utils.js.map +0 -1
  255. package/build/src/utils/obj.utils.d.ts +0 -124
  256. package/build/src/utils/obj.utils.js +0 -429
  257. package/build/src/utils/obj.utils.js.map +0 -1
  258. package/build/src/utils/performance.utils.d.ts +0 -136
  259. package/build/src/utils/performance.utils.js +0 -278
  260. package/build/src/utils/performance.utils.js.map +0 -1
  261. package/build/src/utils/request.utils.d.ts +0 -86
  262. package/build/src/utils/request.utils.js +0 -195
  263. package/build/src/utils/request.utils.js.map +0 -1
  264. package/build/src/utils/response.utils.d.ts +0 -163
  265. package/build/src/utils/response.utils.js +0 -260
  266. package/build/src/utils/response.utils.js.map +0 -1
  267. package/build/src/utils/stream.utils.d.ts +0 -88
  268. package/build/src/utils/stream.utils.js +0 -218
  269. package/build/src/utils/stream.utils.js.map +0 -1
  270. package/build/src/utils/string.utils.d.ts +0 -93
  271. package/build/src/utils/string.utils.js +0 -179
  272. package/build/src/utils/string.utils.js.map +0 -1
  273. package/build/src/utils/type.utils.d.ts +0 -90
  274. package/build/src/utils/type.utils.js +0 -196
  275. package/build/src/utils/type.utils.js.map +0 -1
  276. package/build/src/utils/url.utils.d.ts +0 -141
  277. package/build/src/utils/url.utils.js +0 -317
  278. package/build/src/utils/url.utils.js.map +0 -1
  279. package/build/src/utils/validate.utils.d.ts +0 -177
  280. package/build/src/utils/validate.utils.js +0 -345
  281. package/build/src/utils/validate.utils.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.builder.js","sourceRoot":"","sources":["../../../src/servers/server.builder.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The MIT License\n *\n * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { deepObjMerge } from '../utils/obj.utils';\nimport { ServerConfig } from '../types/server';\nimport { defaultServerConfig } from '../config';\nimport { isPort } from '../utils/validate.utils';\n\n/**\n * Builder class for creating and configuring an Express server configuration.\n *\n * This class provides a fluent interface to configure all aspects of the Express server\n * including security settings, middleware, routing, and more.\n *\n * @example\n * ```typescript\n * const serverConfig = new ServerConfigBuilder()\n * .withPort(3000)\n * .withHost('localhost')\n * .enableCors()\n * .enableHelmet()\n * .build();\n * ```\n */\n\nexport const BUILD_MARKER = Symbol.for('catbee.express.server.build');\n\nexport class ServerConfigBuilder {\n private config: Partial<ServerConfig> = {};\n\n /**\n * Validates that a port number is valid and usable.\n *\n * @private\n * @param port - The port number to validate\n * @throws {Error} If port is not an integer or is outside the valid range (1-65535)\n */\n private validatePort(port: number): void {\n if (!isPort(port)) {\n throw new Error(`Port must be a valid number between 1 and 65535, got: ${port}`);\n }\n }\n\n /**\n * Sets the port the server will listen on.\n *\n * @param port - The port number (1-65535)\n * @returns The builder instance for chaining\n * @throws {Error} If port is invalid\n * @default 3000 (can be overridden via PORT env variable)\n *\n * @example\n * ```typescript\n * builder.withPort(3000)\n * ```\n */\n withPort(port: number): this {\n this.validatePort(port);\n this.config.port = port;\n return this;\n }\n\n /**\n * Sets the hostname the server will bind to.\n *\n * @param host - The hostname (e.g., 'localhost', '0.0.0.0', '127.0.0.1')\n * @returns The builder instance for chaining\n * @default '0.0.0.0' (can be overridden via HOST env variable)\n *\n * @example\n * ```typescript\n * builder.withHost('0.0.0.0') // Listen on all interfaces\n * ```\n */\n withHost(host: string): this {\n this.config.host = host;\n return this;\n }\n\n /**\n * Configures Cross-Origin Resource Sharing (CORS) for the server.\n *\n * @param opts - CORS options object or boolean (true to enable with defaults, false to disable)\n * @returns The builder instance for chaining\n * @default false (CORS is disabled by default)\n *\n * @example\n * ```typescript\n * // Enable CORS with default options\n * builder.withCors(true)\n *\n * // Configure CORS with specific options\n * builder.withCors({\n * origin: ['https://example.com'],\n * methods: ['GET', 'POST']\n * })\n * ```\n */\n withCors(opts: ServerConfig['cors']): this {\n this.config.cors = opts;\n return this;\n }\n\n /**\n * Enables CORS with default settings\n *\n * @returns The builder instance for chaining\n */\n enableCors(): this {\n return this.withCors(true);\n }\n\n /**\n * Disables CORS\n *\n * @returns The builder instance for chaining\n */\n disableCors(): this {\n return this.withCors(false);\n }\n\n /**\n * Configures the Helmet middleware for setting HTTP security headers.\n *\n * @param opts - Helmet options object or boolean (true to enable with defaults, false to disable)\n * @returns The builder instance for chaining\n * @default false (Helmet is disabled by default)\n *\n * @example\n * ```typescript\n * // Enable Helmet with default settings\n * builder.withHelmet(true)\n *\n * // Configure Helmet with specific options\n * builder.withHelmet({\n * contentSecurityPolicy: false,\n * xssFilter: true\n * })\n * ```\n */\n withHelmet(opts: ServerConfig['helmet']): this {\n this.config.helmet = opts;\n return this;\n }\n\n /**\n * Enables Helmet with default settings\n *\n * @returns The builder instance for chaining\n */\n enableHelmet(): this {\n return this.withHelmet(true);\n }\n\n /**\n * Disables Helmet\n *\n * @returns The builder instance for chaining\n */\n disableHelmet(): this {\n return this.withHelmet(false);\n }\n\n /**\n * Configures response compression middleware.\n *\n * @param opts - Compression options object or boolean (true to enable with defaults, false to disable)\n * @returns The builder instance for chaining\n * @default false (Compression is disabled by default)\n *\n * @example\n * ```typescript\n * // Enable compression with default settings\n * builder.withCompression(true)\n *\n * // Configure compression with specific options\n * builder.withCompression({\n * level: 6,\n * threshold: 1024\n * })\n * ```\n */\n withCompression(opts: ServerConfig['compression']): this {\n this.config.compression = opts;\n return this;\n }\n\n /**\n * Enables compression with default settings\n *\n * @returns The builder instance for chaining\n */\n enableCompression(): this {\n return this.withCompression(true);\n }\n\n /**\n * Disables compression\n *\n * @returns The builder instance for chaining\n */\n disableCompression(): this {\n return this.withCompression(false);\n }\n\n /**\n * Configures rate limiting to protect against brute-force attacks.\n *\n * @param opts - Rate limit configuration options\n * @returns The builder instance for chaining\n * @default { enable: false, windowMs: 15 * 60 * 1000, max: 100, message: 'Too many requests', standardHeaders: true, legacyHeaders: false }\n *\n * @example\n * ```typescript\n * builder.withRateLimit({\n * enable: true,\n * windowMs: 15 * 60 * 1000, // 15 minutes\n * max: 100 // limit each IP to 100 requests per windowMs\n * })\n * ```\n */\n withRateLimit(opts: Partial<ServerConfig['rateLimit']>): this {\n this.mergeConfig('rateLimit', opts as NonNullable<ServerConfig['rateLimit']>);\n return this;\n }\n\n /**\n * Enables rate limiting with default or custom settings\n *\n * @param opts - Optional rate limit configuration (max requests, window, etc.)\n * @returns The builder instance for chaining\n */\n enableRateLimit(opts: Omit<Partial<NonNullable<ServerConfig['rateLimit']>>, 'enable'> = {}): this {\n return this.setEnabled('rateLimit', true, opts);\n }\n\n /**\n * Disables rate limiting\n *\n * @returns The builder instance for chaining\n */\n disableRateLimit(): this {\n return this.setEnabled('rateLimit', false);\n }\n\n /**\n * Configures HTTP request logging middleware.\n *\n * @param opts - Request logging configuration options\n * @returns The builder instance for chaining\n * @default { enable: true in dev/false in prod, ignorePaths: ['/healthz', '/favicon.ico', '/metrics', '/docs', '/.well-known'], skipNotFoundRoutes: false }\n *\n * @example\n * ```typescript\n * builder.withRequestLogging({\n * enable: true,\n * ignorePaths: ['/health', '/metrics'],\n * skipNotFoundRoutes: true\n * })\n * ```\n */\n withRequestLogging(opts: Partial<NonNullable<ServerConfig['requestLogging']>>): this {\n this.mergeConfig('requestLogging', opts as NonNullable<ServerConfig['requestLogging']>);\n return this;\n }\n\n /**\n * Enables request logging with default or custom settings\n *\n * @param opts - Optional request logging configuration\n * @returns The builder instance for chaining\n */\n enableRequestLogging(opts: Omit<Partial<NonNullable<ServerConfig['requestLogging']>>, 'enable'> = {}): this {\n return this.setEnabled('requestLogging', true, opts);\n }\n\n /**\n * Disables request logging\n *\n * @returns The builder instance for chaining\n */\n disableRequestLogging(): this {\n return this.setEnabled('requestLogging', false);\n }\n\n /**\n * Configures server metrics collection and endpoints.\n *\n * @param opts - Metrics configuration options\n * @returns The builder instance for chaining\n * @default { enable: false, path: '/metrics', withGlobalPrefix: false }\n *\n * @example\n * ```typescript\n * builder.withMetrics({\n * enable: true,\n * path: '/metrics'\n * })\n * ```\n */\n withMetrics(opts: Partial<NonNullable<ServerConfig['metrics']>>): this {\n this.mergeConfig('metrics', opts as NonNullable<ServerConfig['metrics']>);\n return this;\n }\n\n /**\n * Enables Prometheus metrics collection and endpoint\n *\n * @param opts - Optional metrics configuration\n * @returns The builder instance for chaining\n */\n enableMetrics(opts: Omit<Partial<NonNullable<ServerConfig['metrics']>>, 'enable'> = {}): this {\n return this.setEnabled('metrics', true, opts);\n }\n\n /**\n * Disables Prometheus metrics\n *\n * @returns The builder instance for chaining\n */\n disableMetrics(): this {\n return this.setEnabled('metrics', false);\n }\n\n /**\n * Configures server health check endpoint.\n *\n * @param opts - Health check configuration options\n * @returns The builder instance for chaining\n * @default { path: '/healthz', detailed: true, withGlobalPrefix: false }\n *\n * @example\n * ```typescript\n * builder.withHealthCheck({\n * path: '/health',\n * detailed: true\n * })\n * ```\n */\n withHealthCheck(opts: Partial<NonNullable<ServerConfig['healthCheck']>>): this {\n this.mergeConfig('healthCheck', opts as NonNullable<ServerConfig['healthCheck']>);\n return this;\n }\n\n /**\n * Configures OpenAPI/Swagger documentation for the API.\n *\n * @param opts - OpenAPI configuration options\n * @returns The builder instance for chaining\n * @default { enable: false, mountPath: '/docs', verbose: false, withGlobalPrefix: false }\n *\n * @example\n * ```typescript\n * builder.withOpenApi({\n * enable: true,\n * path: '/api-docs',\n * filePath: './openapi.yaml'\n * })\n * ```\n */\n withOpenApi(opts: Partial<NonNullable<ServerConfig['openApi']>>): this {\n this.mergeConfig('openApi', opts as NonNullable<ServerConfig['openApi']>);\n return this;\n }\n\n /**\n * Enables OpenAPI documentation with required file path\n *\n * @param filePath - Path to OpenAPI specification file (required)\n * @param opts - Optional OpenAPI configuration\n * @returns The builder instance for chaining\n */\n enableOpenApi(\n filePath: string,\n opts: Omit<Partial<NonNullable<ServerConfig['openApi']>>, 'enable' | 'filePath'> = {}\n ): this {\n this.setEnabled('openApi', true, { filePath, ...opts });\n return this;\n }\n\n /**\n * Disables OpenAPI documentation\n *\n * @returns The builder instance for chaining\n */\n disableOpenApi(): this {\n return this.setEnabled('openApi', false);\n }\n\n /**\n * Configures the server as a microservice with versioning.\n *\n * @param opts - Microservice configuration options including app name and service version\n * @returns The builder instance for chaining\n * @default { isMicroservice: false, appName: 'express_app' }\n *\n * @example\n * ```typescript\n * builder.withMicroService({\n * appName: 'user-service',\n * serviceVersion: {\n * enable: true,\n * version: '1.2.3'\n * }\n * })\n * ```\n */\n withMicroService(opts: {\n appName: NonNullable<ServerConfig['appName']>;\n serviceVersion: Partial<NonNullable<ServerConfig['serviceVersion']>>;\n }): this {\n this.config.isMicroservice = true;\n this.config.appName = opts.appName;\n\n this.mergeConfig('serviceVersion', opts.serviceVersion as NonNullable<ServerConfig['serviceVersion']>);\n return this;\n }\n\n /**\n * Configures the trust proxy settings to determine if X-Forwarded-* headers should be trusted.\n *\n * @param opts - Trust proxy configuration options\n * @returns The builder instance for chaining\n * @default false\n *\n * @example\n * ```typescript\n * // Trust proxy headers (useful when behind a load balancer)\n * builder.withTrustProxy(true)\n * ```\n */\n withTrustProxy(opts: NonNullable<ServerConfig['trustProxy']>): this {\n this.config.trustProxy = opts;\n return this;\n }\n\n /**\n * Configures the request ID middleware for tracing requests across services.\n *\n * @param opts - Request ID configuration options\n * @returns The builder instance for chaining\n * @default { headerName: 'x-request-id', exposeHeader: true }\n *\n * @example\n * ```typescript\n * builder.withRequestId({\n * headerName: 'X-Request-Id',\n * generator: () => crypto.randomUUID()\n * })\n * ```\n */\n withRequestId(opts: Partial<NonNullable<ServerConfig['requestId']>>): this {\n this.mergeConfig('requestId', opts as NonNullable<ServerConfig['requestId']>);\n return this;\n }\n\n /**\n * Configures the response time middleware for measuring request processing times.\n *\n * @param opts - Response time configuration options\n * @returns The builder instance for chaining\n * @default { enable: false, addHeader: true, logOnComplete: false }\n *\n * @example\n * ```typescript\n * builder.withResponseTime({\n * enable: true,\n * addHeader: true,\n * logOnComplete: true\n * })\n * ```\n */\n withResponseTime(opts: Partial<NonNullable<ServerConfig['responseTime']>>): this {\n this.mergeConfig('responseTime', opts as NonNullable<ServerConfig['responseTime']>);\n return this;\n }\n\n /**\n * Enables response time tracking with default or custom settings\n *\n * @param opts - Optional response time configuration\n * @returns The builder instance for chaining\n */\n enableResponseTime(opts: Omit<Partial<NonNullable<ServerConfig['responseTime']>>, 'enable'> = {}): this {\n this.setEnabled('responseTime', true, opts);\n return this;\n }\n\n /**\n * Disables response time tracking\n *\n * @returns The builder instance for chaining\n */\n disableResponseTime(): this {\n return this.setEnabled('responseTime', false);\n }\n\n /**\n * Configures the body parser middleware options for parsing request bodies.\n *\n * @param opts - Body parser configuration options\n * @returns The builder instance for chaining\n * @default { json: { limit: '1mb' }, urlencoded: { extended: true, limit: '1mb' } }\n *\n * @example\n * ```typescript\n * builder.withBodyParser({\n * json: {\n * limit: '1mb'\n * },\n * urlencoded: {\n * extended: true,\n * limit: '1mb'\n * }\n * })\n * ```\n */\n withBodyParser(opts: NonNullable<ServerConfig['bodyParser']>): this {\n this.config.bodyParser = deepObjMerge({}, this.config.bodyParser ?? {}, opts);\n return this;\n }\n\n /**\n * Configures cookie parsing middleware.\n *\n * @param opts - Cookie parser options or boolean (true to enable with defaults, false to disable)\n * @returns The builder instance for chaining\n * @default false\n *\n * @example\n * ```typescript\n * // Enable cookie parsing with default options\n * builder.withCookies(true)\n *\n * // Enable cookie parsing with specific options\n * builder.withCookies({\n * secret: 'your-secret-key',\n * secure: true\n * })\n * ```\n */\n withCookies(opts: ServerConfig['cookieParser']): this {\n this.config.cookieParser = opts;\n return this;\n }\n\n /**\n * Adds a static folder to serve files from.\n *\n * @param folder - Static folder configuration\n * @returns The builder instance for chaining\n *\n * @example\n * ```typescript\n * builder.withStaticFolder({\n * path: '/assets',\n * directory: './public',\n * options: { maxAge: '1d' }\n * })\n * ```\n */\n withStaticFolder(folder: NonNullable<ServerConfig['staticFolders']>[number]): this {\n if (!folder.path) throw new Error('Static folder requires a path');\n const folders = [...(this.config.staticFolders ?? []), folder];\n this.config.staticFolders = Array.from(new Map(folders.map(f => [f.path, f])).values());\n return this;\n }\n\n /**\n * Sets global headers to be included in all responses.\n *\n * @param headers - Object containing header name/value pairs or functions that return values\n * @returns The builder instance for chaining\n * @default {}\n *\n * @example\n * ```typescript\n * builder.withGlobalHeaders({\n * 'X-Powered-By': 'Catbee',\n * 'Server-Time': () => new Date().toISOString()\n * })\n * ```\n */\n withGlobalHeaders(headers: NonNullable<ServerConfig['globalHeaders']>): this {\n this.mergeConfig('globalHeaders', headers);\n return this;\n }\n\n /**\n * Sets a global prefix for all routes.\n *\n * @param prefix - The prefix to prepend to all routes (e.g., '/api/v1')\n * @returns The builder instance for chaining\n * @default '/'\n *\n * @example\n * ```typescript\n * builder.withGlobalPrefix('/api/v1')\n * ```\n */\n withGlobalPrefix(prefix: string): this {\n this.config.globalPrefix = prefix;\n return this;\n }\n\n /**\n * Applies custom configuration overrides directly.\n *\n * @param overrides - Custom configuration options to merge\n * @returns The builder instance for chaining\n *\n * @example\n * ```typescript\n * builder.withCustom({\n * port: 8080,\n * customMiddleware: myMiddlewareFunction\n * })\n * ```\n */\n withCustom(overrides: Partial<ServerConfig>): this {\n this.config = deepObjMerge({}, this.config, overrides);\n return this;\n }\n\n /**\n * Configures HTTPS server options.\n *\n * @param opts - HTTPS configuration (key, cert, ca, passphrase, etc.)\n * @returns The builder instance for chaining\n *\n * @example\n * ```typescript\n * builder.withHttps({\n * key: './localhost-key.pem',\n * cert: './localhost-cert.pem'\n * })\n * ```\n */\n withHttps(opts: NonNullable<ServerConfig['https']>): this {\n this.config.https = opts;\n return this;\n }\n\n /**\n * Builds and returns the final server configuration.\n *\n * This method merges the user-specified configuration with default values,\n * ensures all sections with 'enable' flags are properly structured, and\n * produces the final configuration to be used by the server.\n *\n * @returns The complete ServerConfig object\n *\n * @example\n * ```typescript\n * const config = new ServerConfigBuilder()\n * .withPort(3000)\n * .withHost('localhost')\n * .withCors(true)\n * .build();\n * ```\n */\n build(): Readonly<ServerConfig> {\n const config = deepObjMerge({}, defaultServerConfig, this.config) as ServerConfig;\n\n // Common validation\n if (config.openApi?.enable && !config.openApi.filePath) {\n throw new Error('OpenAPI is enabled but no filePath is specified');\n }\n\n return Object.freeze({\n ...config,\n [BUILD_MARKER]: true\n });\n }\n\n private mergeConfig<K extends keyof ServerConfig>(key: K, value: Partial<NonNullable<ServerConfig[K]>>): void {\n const current =\n typeof this.config[key] === 'object' && this.config[key] !== null\n ? (this.config[key] as NonNullable<ServerConfig[K]>)\n : {};\n this.config[key] = deepObjMerge({}, current, value) as NonNullable<ServerConfig[K]>;\n }\n\n private setEnabled<K extends keyof ServerConfig>(\n key: K,\n enable: boolean,\n overrides: Partial<NonNullable<ServerConfig[K]>> = {}\n ): this {\n this.mergeConfig(key, { ...overrides, enable });\n return this;\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/servers/server.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The MIT License\n *\n * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport express, { Express, Request, Response, NextFunction, Router } from 'express';\nimport http from 'http';\nimport https from 'https';\nimport { HttpStatusCodes } from '../utils/http-status-codes';\nimport { createFinalErrorResponse, SuccessResponse } from '../utils/response.utils';\nimport { errorHandler, requestId, responseTime, setupRequestContext, timeout } from '../utils/middleware.utils';\nimport { Env } from '../utils/env.utils';\nimport { getLogger } from '../utils/logger.utils';\nimport { InternalServerErrorException, ServiceUnavailableException } from '../utils/exception.utils';\nimport { NotFoundException } from '../utils/exception.utils';\nimport fs from 'fs';\nimport { defaultServerConfig } from '../config';\nimport { deepObjMerge } from '../utils/obj.utils';\nimport { fileExists } from '../utils/fs.utils';\nimport { Socket } from 'net';\nimport { ServerConfig, ServerHooks } from '../types/server';\nimport { BUILD_MARKER } from './server.builder';\nimport { isPort } from '../utils/validate.utils';\n\n/**\n * Production-ready Express server with enterprise features.\n *\n * Core Features:\n * - Security: Helmet, CORS, rate limiting, timeouts\n * - Monitoring: Request logs, metrics, health checks\n * - Performance: Compression, caching, static files\n * - Reliability: Graceful shutdown, error handling\n * - Developer UX: OpenAPI docs, debugging tools\n * - Extensibility: Hooks, middleware, custom routes\n *\n * Designed for microservices and production workloads.\n * Includes K8s readiness probes and zero-downtime support.\n */\nexport class ExpressServer {\n /** Prometheus client registry for metrics collection */\n private register: any = null;\n /** HTTP server instance (null when not running) */\n protected server: http.Server | https.Server | null = null;\n /** Merged configuration with defaults applied */\n protected config: ServerConfig;\n /** User-defined lifecycle hooks */\n protected hooks: ServerHooks;\n /** Global API prefix (from config) */\n protected globalPrefix: string;\n /** Internal fallback router */\n private rootRouter: Router;\n /** User-supplied router */\n private externalRouter?: Router;\n /** Internal Express app instance */\n private app: Express;\n /** Set of active WebSocket connections */\n private connections = new Set<Socket>();\n /** Flag indicating if the server is shutting down */\n private isShuttingDown = false;\n /**\n * Collection of registered health check functions.\n * These are executed when the health check endpoint is accessed.\n */\n private healthChecks: Array<{ name: string; check: () => Promise<boolean> | boolean }> = [];\n\n /** Prometheus metrics for monitoring */\n private requestCounter?: any;\n private routeTimings?: any;\n private requestSizes?: any;\n private clientIPs?: any;\n\n /** Promise that resolves when initialization (middleware + routes) is complete */\n private initPromise: Promise<void>;\n\n /**\n * Initializes server with intelligent defaults and security best practices.\n * All settings can be customized via config and hooks.\n *\n * Default Security:\n * - Secure headers (Helmet)\n * - Rate limiting\n * - Request timeouts\n * - Body size limits\n * - CORS protection\n *\n * Default Monitoring:\n * - Request/Response logging\n * - Prometheus metrics\n * - Health checks\n * - Request tracing\n */\n constructor(config: Partial<ServerConfig>, hooks: ServerHooks = {}) {\n if (ExpressServer.isBuiltServerConfig(config)) {\n this.config = config as Required<ServerConfig>;\n } else {\n // Deep merge config with user overrides\n this.config = deepObjMerge({}, defaultServerConfig, config) as Required<ServerConfig>;\n }\n\n if (!isPort(this.config.port)) {\n getLogger().error(`Port must be a valid number between 1 and 65535, got: ${this.config.port}`);\n process.exit(1);\n }\n\n // Sanitize app name for metrics (replace invalid characters with underscore)\n const safeAppName = (this.config.appName || 'express_app').toLowerCase().replace(/[^a-z0-9_]/g, '_');\n\n if (this.config.metrics?.enable) {\n const client = ExpressServer.optionalRequire('prom-client');\n if (!client) {\n getLogger().error(\n { command: 'npm install prom-client' },\n 'prom-client is required for metrics but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n this.register = new client.Registry();\n // Initialize Prometheus metrics with sanitized names\n this.requestCounter = new client.Counter({\n name: `${safeAppName}_http_requests_total`,\n help: 'Total HTTP requests',\n labelNames: ['method', 'route', 'status'],\n registers: [this.register]\n });\n this.routeTimings = new client.Histogram({\n name: `${safeAppName}_http_request_duration_seconds`,\n help: 'Duration of HTTP requests by route',\n labelNames: ['method', 'route', 'status'],\n buckets: [0.1, 0.3, 0.5, 0.7, 1, 3, 5, 7, 10],\n registers: [this.register]\n });\n this.requestSizes = new client.Histogram({\n name: `${safeAppName}_http_request_size_bytes`,\n help: 'Size of HTTP request bodies',\n labelNames: ['method', 'route'],\n buckets: [100, 1000, 10000, 100000, 1000000],\n registers: [this.register]\n });\n this.clientIPs = new client.Counter({\n name: `${safeAppName}_http_client_ip_total`,\n help: 'Client IP request counter',\n labelNames: ['ip', 'method'],\n registers: [this.register]\n });\n // Default system metrics (CPU, memory, event loop lag, etc.)\n client.collectDefaultMetrics({\n register: this.register,\n prefix: `${safeAppName}_`\n });\n }\n\n // Health checks\n if (config.healthCheck?.checks) {\n this.healthChecks.push(...config.healthCheck.checks);\n }\n\n // Set global prefix (normalize to empty string or \"/prefix\" without trailing slash)\n this.globalPrefix = this.normalizePath(this.config.globalPrefix ?? '', false);\n\n this.hooks = hooks;\n this.app = express();\n this.rootRouter = express.Router();\n\n // Store initialization promise to prevent race conditions with start()\n this.initPromise = this.initialize();\n }\n\n /**\n * Execute a lifecycle hook safely with comprehensive error handling.\n * Prevents hook failures from crashing the server while logging issues.\n *\n * @param hook Name of the lifecycle hook to execute\n * @param args Arguments to pass to the hook function\n */\n private async runHook<T extends keyof ServerHooks>(hook: T, ...args: unknown[]) {\n try {\n const fn = this.hooks[hook];\n if (fn) await (fn as (...args: unknown[]) => unknown).apply(null, args);\n } catch (err) {\n getLogger().error({ err, hook }, `Error executing ${hook as string} hook:`);\n }\n }\n\n /**\n * Initialize the Express server with middleware and routes.\n */\n private async initialize(): Promise<void> {\n await this.runHook('beforeInit', this);\n\n // Set up middleware stack (order is critical)\n await this.setupMiddleware();\n\n // Set up default routes and error handling\n await this.setupRoutes();\n\n await this.runHook('afterInit', this);\n }\n\n /**\n * Configure and register all middlewares in the optimal order.\n *\n * Middleware Order (CRITICAL - don't change without understanding implications):\n * 1. Basic server configuration (trust proxy, x-powered-by)\n * 2. Request ID generation (for tracing)\n * 3. Request context setup (for logging correlation)\n * 4. Timeout protection (prevents hanging requests)\n * 5. Response time tracking (for performance monitoring)\n * 6. Request logging (after ID/context setup)\n * 7. Custom request hooks\n * 8. Security middleware (rate limiting, CORS, Helmet)\n * 9. Response compression\n * 10. Static file serving\n * 11. Request parsing (body parsing, cookies)\n * 12. API documentation (OpenAPI)\n * 13. Global headers\n * 14. Custom response hooks\n */\n protected async setupMiddleware(): Promise<void> {\n if (this.config.https) {\n await this.validateHttpsFiles();\n }\n\n // Basic middleware should be first\n this.app.disable('x-powered-by');\n\n if (this.config.trustProxy) {\n this.app.set('trust proxy', true);\n }\n\n // Request ID generation - must be first for proper tracing\n this.app.use(\n requestId({\n headerName: this.config.requestId?.headerName,\n exposeHeader: this.config.requestId?.exposeHeader,\n generator: this.config.requestId?.generator\n })\n );\n\n // Request context setup for logging correlation\n this.app.use(\n setupRequestContext({\n headerName: this.config.requestId?.headerName,\n autoLog: false\n })\n );\n\n // Early shutdown-awareness middleware (lets load balancers drain connections gracefully)\n this.app.use((_req: Request, res: Response, next: NextFunction) => {\n if (this.isShuttingDown) {\n res.setHeader('Connection', 'close');\n return res\n .status(HttpStatusCodes.SERVICE_UNAVAILABLE)\n .json(new ServiceUnavailableException('Server is shutting down'));\n }\n next();\n return;\n });\n\n // Security middleware should come early\n if (this.config.helmet) {\n const helmet = ExpressServer.optionalRequire('helmet');\n if (!helmet) {\n getLogger().error(\n { command: 'npm install helmet' },\n 'helmet is required but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n\n if (typeof this.config.helmet === 'object') {\n this.app.use(helmet(this.config.helmet));\n } else {\n this.app.use(helmet());\n }\n }\n\n // CORS middleware should be early\n if (this.config.cors) {\n const cors = ExpressServer.optionalRequire('cors');\n if (!cors) {\n getLogger().error(\n { command: 'npm install cors' },\n 'cors is required but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n this.app.use(cors(this.config.cors === true ? {} : this.config.cors));\n }\n\n // Global headers\n this.app.use((_req, res, next) => {\n if (this.config.globalHeaders) {\n for (const key in this.config.globalHeaders) {\n const value = this.config.globalHeaders[key];\n res.setHeader(key, typeof value === 'function' ? value() : value);\n }\n }\n if (this.config.isMicroservice) {\n res.setHeader('X-Microservice', this.config.appName || 'express_app');\n }\n if (this.config.serviceVersion?.enable) {\n const version =\n typeof this.config.serviceVersion?.version === 'function'\n ? this.config.serviceVersion.version()\n : this.config.serviceVersion?.version;\n\n res.setHeader(this.config.serviceVersion?.headerName || 'x-service-version', version || '0.0.0');\n }\n next();\n });\n\n // Global request timeout protection\n if (this.config.requestTimeout) {\n this.app.use(timeout(this.config.requestTimeout));\n }\n\n // Response time tracking for performance monitoring\n if (this.config.responseTime?.enable) {\n this.app.use(\n responseTime({\n addHeader: this.config.responseTime.addHeader,\n logOnComplete: this.config.responseTime.logOnComplete\n })\n );\n }\n\n // Rate limiting should be early to prevent unnecessary processing\n if (this.config.rateLimit?.enable) {\n const rateLimit = ExpressServer.optionalRequire('express-rate-limit');\n if (!rateLimit) {\n getLogger().error(\n { command: 'npm install express-rate-limit' },\n 'express-rate-limit is required but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n\n this.app.use(\n rateLimit({\n windowMs: this.config.rateLimit.windowMs ?? 15 * 60 * 1000,\n max: this.config.rateLimit.max ?? 100,\n handler: (req: Request, res: Response) => {\n const status = HttpStatusCodes.TOO_MANY_REQUESTS;\n const response = createFinalErrorResponse(\n req,\n status,\n this.config.rateLimit?.message || 'Too many requests'\n );\n res.status(status).json(response);\n },\n standardHeaders: this.config.rateLimit.standardHeaders ?? true,\n legacyHeaders: this.config.rateLimit.legacyHeaders ?? false\n })\n );\n }\n\n // Request logging with filtering\n if (this.config.requestLogging?.enable) {\n this.app.use((req, res, next) => {\n if (typeof this.config.requestLogging?.ignorePaths === 'function') {\n const skip = this.config.requestLogging?.ignorePaths?.(req, res);\n if (skip) return next();\n } else if (Array.isArray(this.config.requestLogging?.ignorePaths)) {\n const skip = this.config.requestLogging?.ignorePaths?.includes(req.path);\n if (skip) return next();\n }\n\n const logger = getLogger();\n const incomingRequestMetaData = {\n requestId: req.id,\n method: req.method,\n url: req.originalUrl || req.url,\n ip: req.ip\n };\n logger.info(incomingRequestMetaData, 'Incoming Request');\n next();\n });\n }\n\n // Custom request preprocessing hook\n if (this.hooks.onRequest) {\n this.app.use(this.hooks.onRequest);\n }\n\n // Response compression for better performance\n if (this.config.compression) {\n const compression = ExpressServer.optionalRequire('compression');\n if (!compression) {\n getLogger().error(\n { command: 'npm install compression' },\n 'compression is required but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n\n if (typeof this.config.compression === 'object') {\n this.app.use(compression(this.config.compression));\n } else {\n this.app.use(compression());\n }\n }\n\n // Static file serving (do NOT normalize filesystem path; only normalize route)\n if (this.config.staticFolders) {\n this.config.staticFolders.forEach(folder => {\n this.app.use(\n this.normalizePath(folder.path ?? '/'),\n express.static(folder.directory, {\n maxAge: folder.maxAge || 0,\n etag: folder.etag !== false,\n immutable: folder.immutable === true,\n lastModified: folder.lastModified !== false,\n cacheControl: folder.cacheControl !== false\n })\n );\n getLogger().info(`Serving static folder: ${folder.directory} at path ${folder.path || '/'}`);\n });\n }\n\n // Request body parsing with size limits\n if (this.config.bodyParser) {\n if (this.config.bodyParser.json) {\n this.app.use(express.json(this.config.bodyParser.json));\n }\n if (this.config.bodyParser.urlencoded) {\n this.app.use(express.urlencoded(this.config.bodyParser.urlencoded));\n }\n }\n\n // Cookie parser middleware\n if (this.config.cookieParser) {\n const cookieParser = ExpressServer.optionalRequire('cookie-parser');\n if (!cookieParser) {\n getLogger().error(\n { command: 'npm install cookie-parser' },\n 'cookie-parser is required but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n\n if (typeof this.config.cookieParser === 'object') {\n this.app.use(cookieParser(undefined, this.config.cookieParser));\n } else {\n this.app.use(cookieParser());\n }\n }\n\n // OpenAPI docs via @scalar/express-api-reference\n if (this.config.openApi?.enable) {\n try {\n const openApiMountPath = this.normalizePath(\n this.config.openApi.mountPath ?? '/docs',\n this.config.openApi.withGlobalPrefix\n );\n const openApiFilePath = this.config.openApi.filePath;\n if (!openApiFilePath) {\n getLogger().error('OpenAPI file path is required');\n process.exit(1);\n }\n const isOpenApiFilePathExists = await fileExists(openApiFilePath);\n if (!isOpenApiFilePathExists) {\n getLogger().error(`OpenAPI spec file not found at ${openApiFilePath}`);\n process.exit(1);\n }\n\n if (this.config.openApi?.verbose) {\n getLogger().info(`Mounting OpenAPI docs at ${openApiMountPath}`);\n getLogger().info(`Using OpenAPI spec file at ${openApiFilePath}`);\n }\n\n const apiReference = ExpressServer.optionalRequire('@scalar/express-api-reference').apiReference;\n if (!apiReference) {\n getLogger().error(\n { command: 'npm install @scalar/express-api-reference' },\n '@scalar/express-api-reference is required for OpenAPI docs but not installed. Please add it to your dependencies'\n );\n process.exit(1);\n }\n\n this.app.use(\n openApiMountPath,\n apiReference({\n spec: {\n content: await fs.promises.readFile(openApiFilePath, 'utf8')\n }\n } as any)\n );\n if (this.config.openApi?.verbose) {\n getLogger().info(`Mounted OpenAPI docs at ${openApiMountPath}`);\n }\n } catch (err) {\n getLogger().error({ err }, 'Failed to mount OpenAPI docs');\n }\n }\n\n // Custom response preprocessing hook (apply global prefix if set)\n if (this.hooks.onResponse) {\n this.app.use(this.globalPrefix, this.hooks.onResponse);\n }\n\n if (this.config.metrics?.enable) {\n // Add metrics tracking middleware\n this.app.use((req, res, next) => {\n const start = process.hrtime();\n // Track client IPs\n this.clientIPs?.inc({ ip: req.ip, method: req.method });\n\n // Track request sizes (parse safely)\n const cl = req.headers['content-length'];\n if (cl) {\n const size = Number(cl);\n if (!Number.isNaN(size) && size >= 0) {\n const route = this.normalizeRouteForMetrics(req, res);\n this.requestSizes?.observe({ method: req.method, route }, size);\n }\n }\n\n res.once('finish', () => {\n const [seconds, nanoseconds] = process.hrtime(start);\n const finalRoute = this.normalizeRouteForMetrics(req, res);\n this.requestCounter?.inc({\n method: req.method,\n route: finalRoute,\n status: res.statusCode.toString()\n });\n this.routeTimings?.observe(\n {\n method: req.method,\n route: finalRoute,\n status: res.statusCode.toString()\n },\n seconds + nanoseconds / 1e9\n );\n });\n\n next();\n });\n }\n }\n\n /**\n * Configure server routes and error handling.\n * Sets up in following order:\n *\n * 1. Built-in routes (health, metrics)\n * 2. Application routes\n * 3. 404 handler\n * 4. Error handler\n */\n protected async setupRoutes(): Promise<void> {\n // Health check endpoint\n const healthCheckPath = this.normalizePath(\n this.config.healthCheck?.path || '/healthz',\n this.config.healthCheck?.withGlobalPrefix\n );\n\n this.app.get(healthCheckPath, async (_req: Request, res: Response) => {\n try {\n if (!this.healthChecks.length) {\n return res.status(HttpStatusCodes.OK).json(new SuccessResponse('OK'));\n }\n\n const checkResults = await Promise.allSettled(\n this.healthChecks.map(async ({ name, check }) => {\n try {\n const status = await Promise.resolve(check());\n return { name, status, error: null };\n } catch (error) {\n return { name, status: false, error: (error as Error).message };\n }\n })\n );\n\n const results = checkResults.map(result => {\n if (result.status === 'fulfilled') return result.value;\n return { name: 'unknown', status: false, error: result.reason };\n });\n\n const allOk = results.every(r => r.status);\n const status = allOk ? HttpStatusCodes.OK : HttpStatusCodes.SERVICE_UNAVAILABLE;\n const response = new SuccessResponse(allOk ? 'OK' : 'Service unavailable');\n if (!allOk) response.error = true;\n if (this.config.healthCheck?.detailed) response.data = { checks: results };\n return res.status(status).json(response);\n } catch {\n return res\n .status(HttpStatusCodes.INTERNAL_SERVER_ERROR)\n .json(new InternalServerErrorException('Health check failed'));\n }\n });\n\n // Metrics endpoint\n if (this.config.metrics?.enable) {\n const metricsPath = this.normalizePath(\n this.config.metrics.path ?? '/metrics',\n this.config.metrics?.withGlobalPrefix\n );\n this.app.get(metricsPath, async (_req, res) => {\n res.set('Content-Type', this.register.contentType);\n res.end(await this.register.metrics());\n });\n }\n\n // Application routes\n const routerToUse = this.externalRouter || this.rootRouter;\n this.app.use(this.globalPrefix, routerToUse);\n\n // 404 handler (must be after all other routes)\n this.app.use((req: Request, res: Response) => {\n const status = HttpStatusCodes.NOT_FOUND;\n const response = createFinalErrorResponse(req, status, `Route ${req.method.toUpperCase()} ${req.path} not found`);\n res.status(status).json(response);\n });\n\n // Global error handler (must be the last middleware)\n this.app.use((err: Error, req: Request, res: Response, next: NextFunction) => {\n // Check if this is a 404 error that should be handled with special logging rules\n const isNotFoundError = err instanceof NotFoundException;\n const shouldSkipLogging =\n !this.hooks.onError &&\n isNotFoundError &&\n this.config.requestLogging?.enable &&\n this.config.requestLogging.skipNotFoundRoutes === true;\n if (this.hooks.onError) {\n // Use custom error handler if provided\n this.hooks.onError(err, req, res, next);\n } else {\n // Default error handler with logging\n const errorHandlerMiddleware = errorHandler({\n logErrors: !shouldSkipLogging,\n includeDetails: Env.isDev() // Only show stack traces in development\n });\n errorHandlerMiddleware(err, req, res, next);\n }\n });\n }\n\n /**\n * Register a new health check function for monitoring service dependencies.\n *\n * Health checks are executed when the health endpoint is accessed and\n * help determine if the service is ready to handle requests.\n *\n * Examples:\n * - Database connectivity\n * - External service availability\n * - File system access\n * - Memory/CPU usage checks\n *\n * @param name Unique identifier for the check (used in detailed responses)\n * @param check Function returning boolean or Promise<boolean> indicating health\n * @returns This instance for method chaining\n */\n public registerHealthCheck(name: string, check: () => Promise<boolean> | boolean): this {\n this.healthChecks.push({ name, check });\n return this;\n }\n\n /**\n * Get the underlying Express application instance.\n * Use this for advanced Express features not exposed by this wrapper.\n *\n * @returns The raw Express app instance\n */\n public getApp(): Express {\n return this.app;\n }\n\n /**\n * Get the active HTTP/HTTPS server instance.\n * Returns null if the server is not currently running.\n *\n * @returns The HTTP/HTTPS server instance or null\n */\n public getServer(): http.Server | https.Server | null {\n return this.server;\n }\n\n /**\n * Start the HTTP server and begin listening for requests.\n *\n * This method:\n * - Executes beforeStart hooks\n * - Binds to the configured host/port\n * - Sets up error handling for startup failures\n * - Executes afterStart hooks on success\n * - Logs startup information\n *\n * @returns Promise resolving to the running HTTP server instance\n * @throws Error if server fails to start or port is already in use\n */\n public async start(): Promise<http.Server | https.Server> {\n // Ensure initialization (middleware + routes) completed before starting\n await this.initPromise;\n await this.runHook('beforeStart', this.app);\n\n return new Promise<http.Server | https.Server>((resolve, reject) => {\n try {\n // Prepare listen arguments with optional host parameter\n const listenArgs: [number, (string | undefined)?, (() => void)?] = [\n this.config.port,\n this.config.host,\n async () => {\n const protocol = this.config.https ? 'https' : 'http';\n const url = `${protocol}://${this.config.host}:${this.config.port}`;\n getLogger().info(`Server running on ${url}`);\n if (this.config.healthCheck?.path) {\n getLogger().info(\n `Health check available at ${url}${this.normalizePath(this.config.healthCheck.path, this.config.healthCheck.withGlobalPrefix)}`\n );\n }\n if (this.config.metrics?.enable && this.config.metrics.path) {\n getLogger().info(\n `Metrics available at ${url}${this.normalizePath(this.config.metrics.path, this.config.metrics.withGlobalPrefix)}`\n );\n }\n if (this.config.openApi?.enable) {\n getLogger().info(\n `API docs available at ${url}${this.normalizePath(this.config.openApi.mountPath as string, this.config.openApi.withGlobalPrefix)}`\n );\n }\n if (this.server) await this.runHook('afterStart', this.server);\n resolve(this.server as http.Server | https.Server);\n }\n ];\n\n if (this.config.https) {\n const httpsOptions: https.ServerOptions = {\n ...this.config.https,\n key: fs.readFileSync(this.config.https.key),\n cert: fs.readFileSync(this.config.https.cert)\n };\n if (this.config.https.ca) {\n httpsOptions.ca = fs.readFileSync(this.config.https.ca);\n }\n if (this.config.https.passphrase) {\n httpsOptions.passphrase = this.config.https.passphrase;\n }\n this.server = https.createServer(httpsOptions, this.app).listen(...(listenArgs as any));\n } else {\n // Start the HTTP server\n this.server = this.app.listen(...(listenArgs as any));\n }\n\n // Track connections\n this.server.on('connection', (conn: Socket) => {\n this.connections.add(conn);\n conn.on('close', () => this.connections.delete(conn));\n });\n\n // Handle server startup errors (port in use, permission denied, etc.)\n this.server.on('error', err => {\n getLogger().error({ err }, 'Server failed to start');\n reject(err);\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n /**\n * Stop the HTTP server gracefully.\n *\n * This method:\n * - Executes beforeStop hooks\n * - Stops accepting new connections\n * - Waits for existing connections to finish\n * - Closes the server\n * - Executes afterStop hooks\n * - Logs shutdown information\n *\n * Graceful shutdown ensures:\n * - No requests are dropped\n * - Resources are properly cleaned up\n * - Monitoring systems are notified\n */\n public async stop(force = false): Promise<void> {\n if (!this.server) {\n getLogger().warn('Stop called but server is not running');\n return;\n }\n if (this.isShuttingDown) {\n getLogger().warn('Stop called while shutdown is already in progress');\n return;\n }\n\n this.isShuttingDown = true;\n await this.runHook('beforeStop', this.server);\n\n const shutdownTimeout = 10_000; // 10s max wait\n\n const serverClosePromise = new Promise<void>((resolve, reject) => {\n this.server!.close(async err => {\n if (err) {\n getLogger().error({ err }, 'Error while closing server');\n reject(err);\n return;\n }\n this.server = null;\n this.isShuttingDown = false;\n\n getLogger().info('Server stopped gracefully');\n await this.runHook('afterStop');\n resolve();\n });\n });\n\n const timeoutPromise = new Promise<void>((_, reject) =>\n setTimeout(() => reject(new Error('Shutdown timeout')), shutdownTimeout)\n );\n\n try {\n await Promise.race([serverClosePromise, timeoutPromise]);\n } catch (err) {\n getLogger().error({ err }, 'Graceful shutdown timed out');\n if (force) {\n getLogger().warn('Forcing connection destroy due to shutdown timeout');\n }\n } finally {\n // Always clean up connections\n await this.destroyConnections();\n }\n }\n\n /**\n * Enable graceful shutdown on OS signals for production deployment.\n *\n * This is essential for:\n * - Container orchestration (Docker, Kubernetes)\n * - Process managers (PM2, systemd)\n * - Load balancer health checks\n * - Zero-downtime deployments\n *\n * @param signals Array of process signals to listen for (default: SIGINT, SIGTERM)\n */\n public enableGracefulShutdown(signals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM']): this {\n signals.forEach(signal => {\n process.on(signal, async () => {\n getLogger().info(`Received ${signal}, initiating graceful shutdown...`);\n try {\n await this.stop();\n process.exit(0);\n } catch (err) {\n getLogger().error({ err }, 'Error during graceful shutdown, forcing stop...');\n try {\n await this.stop(true); // fallback to forced shutdown\n process.exit(1);\n } catch (forceError) {\n getLogger().fatal({ forceError }, 'Forced shutdown failed, exiting hard');\n process.exit(1);\n }\n }\n });\n });\n return this;\n }\n\n /**\n * Set an externally created base router.\n * This will override the internal rootRouter.\n */\n public setBaseRouter(router: Router): this {\n this.externalRouter = router;\n return this;\n }\n\n /**\n * Create and register a new router (only used if not injecting one externally - use `setBaseRouter` instead).\n */\n public createRouter(prefix: string = ''): Router {\n const router = express.Router();\n const path = this.normalizePath(prefix, true);\n this.rootRouter.use(path, router);\n return router;\n }\n\n /**\n * Register a new route handler with support for multiple HTTP methods.\n * The route is automatically registered under the globalPrefix if set.\n *\n * @param methods Array of HTTP methods (get, post, put, delete, etc.)\n * @param path Route path with Express path patterns support\n * @param handlers One or more Express request handlers (middleware + final handler)\n * @returns This instance for method chaining\n */\n public registerRoute(\n methods: Array<keyof Pick<Express, 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head'>>,\n path: string,\n ...handlers: Array<express.RequestHandler>\n ): this {\n const fullPath = this.normalizePath(path, true);\n const methodMap: {\n [K in keyof Pick<\n Express,\n 'get' | 'post' | 'put' | 'delete' | 'patch' | 'options' | 'head'\n >]: (typeof this.app)[K];\n } = {\n get: this.app.get.bind(this.app),\n post: this.app.post.bind(this.app),\n put: this.app.put.bind(this.app),\n delete: this.app.delete.bind(this.app),\n patch: this.app.patch.bind(this.app),\n options: this.app.options.bind(this.app),\n head: this.app.head.bind(this.app)\n };\n methods.forEach(m => {\n const fn = methodMap[m];\n if (fn) {\n fn(fullPath, ...handlers);\n } else {\n throw new Error(`Unsupported HTTP method: ${m}`);\n }\n });\n return this;\n }\n\n /**\n * Register custom middleware with optional path restriction.\n *\n * Use this for:\n * - Adding authentication to specific routes\n * - Custom logging or validation\n * - Request transformation\n * - Third-party middleware integration\n *\n * @param path Optional path prefix or middleware function if no path\n * @param middleware Middleware handler (required if path is provided)\n * @returns This instance for method chaining\n */\n public registerMiddleware(path: string | express.RequestHandler, middleware?: express.RequestHandler): this {\n if (typeof path === 'string') {\n const normalizedPath = this.normalizePath(path);\n if (normalizedPath) {\n this.app.use(normalizedPath, middleware as express.RequestHandler);\n } else {\n this.app.use(middleware as express.RequestHandler);\n }\n } else {\n this.app.use(path);\n }\n return this;\n }\n\n /**\n * Register one or more middleware functions to be applied globally.\n * This is a simpler alternative to registerMiddleware when you just want\n * to add middleware without path restrictions.\n *\n * @param middlewares One or more Express middleware functions\n * @returns This instance for method chaining\n */\n public useMiddleware(...middlewares: express.RequestHandler[]): this {\n middlewares.forEach(middleware => {\n this.app.use(middleware);\n });\n return this;\n }\n\n /**\n * Get Prometheus registry (to add custom counters/histograms)\n *\n * @return {*} {client.Registry}\n */\n public getMetricsRegistry() {\n if (!this.config.metrics?.enable) {\n throw new Error('Metrics are not enabled in the server configuration');\n }\n return this.register as typeof import('prom-client').Registry;\n }\n\n /**\n * Get server configuration\n *\n * @return {*} {ServerConfig}\n */\n public getConfig(): ServerConfig {\n return this.config;\n }\n\n /**\n * Wait until server initialization (middleware + routes) has completed.\n * Useful for integration tests that inspect app before starting.\n */\n public async waitUntilReady(): Promise<void> {\n await this.initPromise;\n }\n\n private normalizePath(path: string, withGlobalPrefix = false): string {\n const sanitize = (p: string): string => {\n return (\n '/' +\n p\n .trim()\n .replace(/^\\/+/, '') // remove leading slashes\n .replace(/\\/{2,}/g, '/') // collapse multiple slashes\n .replace(/\\/+$/, '')\n ); // remove trailing slash\n };\n\n // Resolve global prefix if enabled\n const prefix = withGlobalPrefix && this.globalPrefix ? sanitize(this.globalPrefix) : '';\n\n // If path is invalid, default to prefix or root\n if (typeof path !== 'string' || !path.trim()) {\n return prefix || '/';\n }\n\n return sanitize(prefix + '/' + path);\n }\n\n private normalizeRouteForMetrics(req: Request, res: Response): string {\n // Prevent high cardinality metrics by normalizing routes\n if ((req as any)?.route?.path) {\n // Use Express route pattern instead of actual URL\n return (req as any).route.path;\n }\n // Group common patterns\n if (res.statusCode === 404) return '/404';\n const path = (req.path || 'unknown').split('?')[0];\n // Replace IDs and UUIDs with placeholders\n return path\n .replace(/\\/[0-9]+/g, '/:id')\n .replace(/\\/[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/g, '/:uuid');\n }\n\n /**\n * Destroy all active connections (gracefully if possible).\n * If a connection does not close cleanly, it will be force-destroyed.\n */\n private async destroyConnections(): Promise<void> {\n const total = this.connections.size;\n if (total === 0) {\n getLogger().debug('No active connections to close');\n return;\n }\n\n const timeoutMs = 5000;\n await Promise.race([\n Promise.all(\n Array.from(this.connections).map(\n conn =>\n new Promise<void>(resolve => {\n conn.end(() => {\n if (!conn.destroyed) conn.destroy();\n resolve();\n });\n conn.on('error', () => {\n conn.destroy();\n resolve();\n });\n })\n )\n ),\n new Promise<void>(resolve => setTimeout(resolve, timeoutMs))\n ]);\n\n this.connections.clear();\n getLogger().info(`Closed ${total} active connections`);\n }\n\n private async validateHttpsFiles() {\n if (!(await fileExists(this.config.https!.key))) {\n getLogger().error(`HTTPS key file not found: ${this.config.https!.key}`);\n process.exit(1);\n }\n if (!(await fileExists(this.config.https!.cert))) {\n getLogger().error(`HTTPS cert file not found: ${this.config.https!.cert}`);\n process.exit(1);\n }\n if (this.config.https!.ca && !(await fileExists(this.config.https!.ca))) {\n getLogger().error(`HTTPS CA file not found: ${this.config.https!.ca}`);\n process.exit(1);\n }\n }\n\n private static isBuiltServerConfig(config: Partial<ServerConfig>): boolean {\n if (config[BUILD_MARKER]) {\n return true;\n }\n return false;\n }\n\n private static optionalRequire<T = any>(name: string): T | null {\n try {\n return require(name);\n } catch {\n return null;\n }\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"api-response.js","sourceRoot":"","sources":["../../../src/types/api-response.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAgKH;;GAEG;AACH,MAAM,CAAN,IAAY,aAMX;AAND,WAAY,aAAa;IACvB,2BAA2B;IAC3B,4BAAW,CAAA;IAEX,4BAA4B;IAC5B,8BAAa,CAAA;AACf,CAAC,EANW,aAAa,KAAb,aAAa,QAMxB","sourcesContent":["/*\n * The MIT License\n *\n * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * Generic API response format.\n * Used to wrap any successful or failed response from the server.\n */\nexport interface ApiResponse<T = any> {\n /** Payload returned from the API. Can be any shape depending on the endpoint. */\n data: T | null;\n\n /** Indicates whether an error occurred (true = error, false = success). */\n error: boolean;\n\n /** Success message describing the result of the operation. */\n message: string;\n\n /** Unique request ID for traceability in logs (e.g., from a middleware). */\n requestId: string;\n\n /** ISO timestamp when the response was generated. */\n timestamp: string;\n}\n\n/**\n * Generic pagination structure used for paged lists (e.g., /users?page=1).\n */\nexport interface Pagination<T = any> {\n /** List of records for the current page. */\n content: T[];\n\n /** Metadata about the pagination state. */\n pagination: {\n /** Total number of records across all pages. */\n totalRecords: number;\n\n /** Total number of pages available. */\n totalPages: number;\n\n /** Current page number (1-based index). */\n page: number;\n\n /** Number of records per page. */\n limit: number;\n\n /** Field by which the data is sorted. */\n sortBy: string;\n\n /** Sort order: ascending or descending. */\n sortOrder: 'asc' | 'desc';\n };\n}\n\n/**\n * Alias for paginated API response.\n * Allows semantic naming like `PaginationResponse<User>` or `PaginationResponse<Post>`.\n */\nexport type PaginationResponse<T = any> = Pagination<T>;\n\n/**\n * Error response structure with additional metadata.\n * Used for providing richer error information to clients.\n */\nexport interface ApiErrorResponse extends Omit<ApiResponse<never>, 'data'> {\n /** Error always true for error responses */\n error: true;\n\n /** HTTP status code */\n status: number;\n\n /** Path to the resource that caused the error */\n path: string;\n\n /** Stack trace of the error (if available) */\n stack?: string[];\n}\n\n/**\n * Success response structure with strongly typed data.\n * Used for providing successful responses to clients.\n */\nexport interface ApiSuccessResponse<T = any> extends ApiResponse<T> {\n /** Error always false for success responses */\n error: false;\n\n /** HTTP status code (usually 200) */\n status?: number;\n}\n\n/**\n * Response structure for batch operations.\n * Used when multiple operations are performed in a single request.\n */\nexport interface BatchResponse<T = any> {\n /** Overall success/failure indicator */\n success: boolean;\n\n /** Total number of operations */\n total: number;\n\n /** Number of successful operations */\n successful: number;\n\n /** Number of failed operations */\n failed: number;\n\n /** Results of individual operations */\n results: Array<{\n /** Identifier for this operation */\n id: string | number;\n\n /** Success/failure indicator for this operation */\n success: boolean;\n\n /** Response data for this operation */\n data?: T;\n\n /** Error information if this operation failed */\n error?: {\n message: string;\n code?: string;\n };\n }>;\n}\n\n/**\n * Response structure for asynchronous operations.\n * Used when the operation will complete in the future.\n */\nexport interface AsyncOperationResponse {\n /** Always true for async operations */\n async: true;\n\n /** Job or task ID to check status later */\n jobId: string;\n\n /** Estimated completion time in seconds (if known) */\n estimatedTime?: number;\n\n /** URL to check status */\n statusUrl: string;\n}\n\n/**\n * Response structure for streaming operations.\n * Used when data is returned as a stream rather than all at once.\n */\nexport interface StreamResponse {\n /** Stream identifier */\n streamId: string;\n\n /** Stream type (e.g., 'json', 'binary') */\n streamType: string;\n\n /** Total size in bytes (if known) */\n totalSize?: number;\n\n /** Chunk size in bytes */\n chunkSize: number;\n}\n\n/**\n * Sort direction enumeration.\n */\nexport enum SortDirection {\n /** Ascending sort order */\n ASC = 'asc',\n\n /** Descending sort order */\n DESC = 'desc'\n}\n\n/**\n * Pagination parameters for API requests.\n */\nexport interface PaginationParams {\n /** Current page number (1-based index) */\n page: number;\n\n /** Number of records per page */\n limit: number;\n\n /** Field by which the data is sorted */\n sortBy: string;\n\n /** Sort order: ascending or descending */\n sortOrder: SortDirection;\n\n /** Optional search query */\n search?: string;\n}\n\n/**\n * Type that combines pagination parameters with additional data.\n */\nexport type WithPagination<T = {}> = PaginationParams & T;\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG","sourcesContent":["/*\n * The MIT License\n *\n * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/**\n * A type that represents a configurable toggle.\n * Can be `true`, `false`, or a custom configuration object `T`.\n */\nexport type ToggleConfig<T> = boolean | T;\n\n/**\n * A type representing a value that can be `null` or `undefined`.\n */\nexport type Nullable<T> = T | null | undefined;\n\n/**\n * A type representing a value that may or may not be present.\n */\nexport type Optional<T> = T | undefined;\n\n/**\n * A type that makes all properties of `T` deeply optional.\n */\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\n/**\n * A type that makes all properties of `T` readonly, recursively.\n */\nexport type DeepReadonly<T> = {\n readonly [P in keyof T]: T[P] extends object ? DeepReadonly<T[P]> : T[P];\n};\n\n/**\n * A type that converts a union of types into an intersection.\n */\nexport type UnionToIntersection<U> = (U extends any ? (x: U) => void : never) extends (x: infer I) => void ? I : never;\n\n/**\n * A type representing a promise or a plain value.\n */\nexport type MaybePromise<T> = T | Promise<T>;\n\n/**\n * A type representing a record with string keys and values of type `T`.\n */\nexport type StringKeyedRecord<T> = Record<string, T>;\n\n/**\n * A type representing a function that returns `R` and optionally receives arguments `A`.\n */\nexport type Func<A extends any[] = any[], R = any> = (...args: A) => R;\n\n/**\n * A type representing a partial pick from `T` (like Partial + Pick combined)\n */\nexport type PartialPick<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K>;\n\n/**\n * A type that deeply stringifies all properties of T or makes them null.\n */\nexport type DeepStringifyOrNull<T> = T extends\n | string\n | number\n | boolean\n | bigint\n | boolean\n | symbol\n | null\n | undefined\n | null\n ? string | null\n : T extends Array<infer U>\n ? Array<DeepStringifyOrNull<U>>\n : T extends object\n ? { [K in keyof T]: DeepStringifyOrNull<T[K]> }\n : string | null;\n\n/**\n * A type representing a non-empty array of T.\n */\nexport type NonEmptyArray<T> = [T, ...T[]];\n\n/**\n * A type representing the union of all property values of T.\n */\nexport type ValueOf<T> = T[keyof T];\n\n/**\n * A type that makes all properties of T mutable (removes readonly).\n */\nexport type Mutable<T> = {\n -readonly [P in keyof T]: T[P];\n};\n\n/**\n * A type that gets the keys of T whose values are assignable to U.\n */\nexport type KeysOfType<T, U> = {\n [K in keyof T]: T[K] extends U ? K : never;\n}[keyof T];\n\n/**\n * Require at least one of the keys in K to be present in T.\n */\nexport type RequireAtLeastOne<T, K extends keyof T = keyof T> = K extends keyof T\n ? { [P in K]-?: T[P] } & Omit<T, K>\n : never;\n\n/**\n * A record type with optional keys.\n */\nexport type RecordOptional<K extends string | number | symbol, T> = {\n [P in K]?: T;\n};\n\n/**\n * Primitive types in TypeScript.\n */\nexport type Primitive = string | number | boolean | bigint | symbol | undefined | null;\n\n/**\n * Recursively unwraps Promise types to get their resolved value type.\n */\nexport type Awaited<T> = T extends Promise<infer U> ? Awaited<U> : T;\n\n/**\n * Picks properties from T that are of type U.\n */\nexport type PickByType<T, U> = {\n [P in keyof T as T[P] extends U ? P : never]: T[P];\n};\n\n/**\n * Makes all properties of T required recursively.\n */\nexport type DeepRequired<T> = {\n [P in keyof T]-?: T[P] extends object ? DeepRequired<T[P]> : T[P];\n};\n\n/**\n * Checks if two types are exactly equal.\n * Returns true or false as type.\n */\nexport type IsEqual<T, U> = (<G>() => G extends T ? 1 : 2) extends <G>() => G extends U ? 1 : 2 ? true : false;\n\n/**\n * Makes all properties of an object writable (removes readonly).\n */\nexport type Writable<T> = { -readonly [P in keyof T]: T[P] };\n\n/**\n * Makes specific keys K of type T optional.\n */\nexport type Optional2<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;\n\n/**\n * Creates a type with all properties of T except those with types assignable to U.\n */\nexport type Without<T, U> = {\n [P in keyof T as T[P] extends U ? never : P]: T[P];\n};\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/types/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG","sourcesContent":["/*\n * The MIT License\n *\n * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { Express, json, NextFunction, urlencoded, Request, Response } from 'express';\nimport { ExpressServer } from '../servers/server';\nimport { HelmetOptions } from 'helmet';\nimport { CompressionOptions } from 'compression';\nimport { CookieParseOptions } from 'cookie-parser';\nimport http from 'http';\nimport { CorsOptions } from 'cors';\nimport { ToggleConfig } from '.';\n\n/**\n * Server configuration interface with smart defaults and full customization.\n * All options are designed with security and performance best practices.\n * Most options can be overridden via environment variables.\n */\nexport interface ServerConfig {\n /** Port the server should listen on (default: 3000, env: PORT)\n * - default: 3000\n */\n port: number;\n /** Optional host address for binding (default: '0.0.0.0', env: HOST)\n * - default: '0.0.0.0'\n */\n host?: string;\n\n /** CORS configuration (default: false disables CORS, or provide options object)\n * - default: false\n */\n cors?: ToggleConfig<CorsOptions>;\n\n /** Enable Helmet security headers (default: false disables Helmet, or provide options object)\n * - default: false\n */\n helmet?: ToggleConfig<HelmetOptions>;\n\n /** Enable gzip/deflate compression (default: false disables compression, or provide options object)\n * - default: false\n */\n compression?: ToggleConfig<CompressionOptions>;\n\n /** Request body parsing with size limits\n * - json: { limit: '1mb' }\n * - urlencoded: { extended: true, limit: '1mb' }\n */\n bodyParser?: {\n /** JSON parser (default: { limit: '1mb' }) */\n json?: Parameters<typeof json>[0];\n /** URL-encoded parser (default: { extended: true, limit: '1mb' }) */\n urlencoded?: Parameters<typeof urlencoded>[0];\n };\n\n /** Enable cookie parsing with options (default: false)\n * - default: false\n */\n cookieParser?: ToggleConfig<CookieParseOptions>;\n\n /** Trust proxy headers (default: false)\n * - default: false\n */\n trustProxy?: boolean;\n\n /** Static file serving configuration for assets, uploads, etc.\n * - path: file system path to serve\n * - route: URL route prefix (default: \"/\")\n * - maxAge: cache max age (default: 0)\n * - etag: enable ETag headers (default: true)\n * - immutable: enable immutable caching (default: false)\n * - lastModified: enable last-modified caching (default: true)\n * - cacheControl: enable Cache-Control headers (default: true)\n */\n staticFolders?: Array<{\n /** URL route prefix (default: \"/\") */\n path?: string;\n /** File system path to serve */\n directory: string;\n /** Cache-Control: max-age=<duration> (default: 0) */\n maxAge?: string;\n /** Enable ETag headers (default: true) */\n etag?: boolean;\n /** Enable immutable caching (default: false) */\n immutable?: boolean;\n /** Enable last-modified caching (default: true) */\n lastModified?: boolean;\n /** Enable Cache-Control headers (default: true) */\n cacheControl?: boolean;\n }>;\n\n /** Enable microservice mode (default: false)\n * - default: false\n */\n isMicroservice?: boolean;\n\n /** Service name for headers/metrics (default: 'express_app', env: APP_NAME)\n * - default: 'express_app'\n */\n appName?: string;\n\n /** Global response headers (default: {})\n * - default: {}\n */\n globalHeaders?: Record<string, string | (() => string)>;\n\n /** Rate limiting settings\n * - enable: false\n * - windowMs: 15 * 60 * 1000\n * - max: 100\n * - message: 'Too many requests'\n * - standardHeaders: true\n * - legacyHeaders: false\n */\n rateLimit?: {\n /** Enable rate limiting (default: false) */\n enable: boolean;\n /** Time window in ms (default: 900000 - 15 minutes) */\n windowMs?: number;\n /** Max requests per window (default: 100) */\n max?: number;\n /** Rate limit message (default: 'Too many requests') */\n message?: string;\n /** Add standard headers (default: true) */\n standardHeaders?: boolean;\n /** Add legacy headers (default: false) */\n legacyHeaders?: boolean;\n };\n\n /** Request logging configuration\n * - enable: true in dev, false in prod\n * - ignorePaths: skips /healthz, /favicon.ico, /metrics, /docs, /.well-known\n * - skipNotFoundRoutes: false\n */\n requestLogging?: {\n /** Enable request logging (default: true in dev, false in prod) */\n enable: boolean;\n /** Ignore paths function or string[] (default: skips /healthz, /favicon.ico, /metrics, /docs, /.well-known) */\n ignorePaths?: string[] | ((req: Request, res: Response) => boolean);\n /** Skip logging for not found routes (default: false) */\n skipNotFoundRoutes?: boolean;\n };\n\n /** Health check settings\n * - path: '/healthz'\n * - detailed: true\n * - withGlobalPrefix: false\n */\n healthCheck?: {\n /** Health check path (default: '/healthz') */\n path?: string;\n /** Custom checks (default: []) */\n checks?: Array<{\n name: string;\n check: () => Promise<boolean> | boolean;\n }>;\n /** Show detailed checks status in response (default: true) */\n detailed?: boolean;\n /** Include in global prefix (default: false) */\n withGlobalPrefix?: boolean;\n };\n\n /** Request timeout in ms (default: 30000 - 30 seconds)\n * - default: 30000\n */\n requestTimeout?: number;\n\n /** Response timing configuration\n * - enable: false\n * - addHeader: true\n * - logOnComplete: false\n */\n responseTime?: {\n /** Enable timing (default: false) */\n enable: boolean;\n /** Add X-Response-Time header (default: true) */\n addHeader?: boolean;\n /** Log completion time (default: false) */\n logOnComplete?: boolean;\n };\n\n /** Request ID configuration\n * - headerName: 'x-request-id'\n * - exposeHeader: true\n * - generator: uuid()\n */\n requestId?: {\n /** Header name (default: 'x-request-id') */\n headerName?: string;\n /** Add to response headers (default: true) */\n exposeHeader?: boolean;\n /** ID generator (default: uuid()) */\n generator?: () => string;\n };\n\n /** Global route prefix (default: '/')\n * - default: '/'\n */\n globalPrefix?: string;\n\n /** OpenAPI documentation\n * - enable: false\n * - mountPath: '/docs'\n * - verbose: false\n * - withGlobalPrefix: false\n */\n openApi?: {\n /** Enable docs (default: false) */\n enable: boolean;\n /** UI path (default: '/docs') */\n mountPath?: string;\n /** Spec file path (required if enabled) */\n filePath?: string;\n /** Enable verbose logs (default: false) */\n verbose?: boolean;\n /** Include in global prefix (default: false) */\n withGlobalPrefix?: boolean;\n };\n\n /** Prometheus metrics\n * - enable: false\n * - path: '/metrics'\n * - withGlobalPrefix: false\n */\n metrics?: {\n /** Enable metrics (default: false) */\n enable: boolean;\n /** Metrics path (default: '/metrics') */\n path?: string;\n /** Include in global prefix (default: false) */\n withGlobalPrefix?: boolean;\n };\n\n /** Service version header\n * - enable: false\n * - headerName: 'x-service-version'\n * - version: '0.0.0'\n */\n serviceVersion?: {\n /** Enable version header (default: false) */\n enable: boolean;\n /** Header name (default: 'x-service-version') */\n headerName?: string;\n /** Version value (default: '0.0.0') */\n version?: string | (() => string);\n };\n\n /**\n * HTTPS configuration (if provided, server will use HTTPS)\n * Requires 'key' and 'cert' at minimum.\n * @command - to generate self-signed certificates\n * ```bash\n * choco install mkcert\n * mkcert -key-file localhost-key.pem -cert-file localhost-cert.pem localhost 127.0.0.1 ::1\n * ```\n */\n https?: {\n /** Path to SSL private key file (PEM) */\n key: string;\n /** Path to SSL certificate file (PEM) */\n cert: string;\n /** Optional path to CA bundle file (PEM) */\n ca?: string;\n /** Optional passphrase for the private key */\n passphrase?: string;\n /** Any other https.ServerOptions */\n [key: string]: any;\n };\n}\n\n/**\n * Server lifecycle hooks for custom behavior injection.\n * Allows extending server functionality without modifying core code.\n * All hooks can be async and support error handling.\n */\nexport interface ServerHooks {\n /** Called before any middleware or routes are initialized - good for early setup */\n beforeInit?: (server: ExpressServer) => Promise<void> | void;\n /** Called after middleware and routes are set up - good for final configuration */\n afterInit?: (server: ExpressServer) => Promise<void> | void;\n /** Called just before the server starts listening - good for last-minute checks */\n beforeStart?: (app: Express) => Promise<void> | void;\n /** Called after the server starts successfully - good for announcing readiness */\n afterStart?: (server: http.Server) => Promise<void> | void;\n /** Called before graceful shutdown begins - good for cleanup preparation */\n beforeStop?: (server: http.Server) => Promise<void> | void;\n /** Called after server has stopped - good for final cleanup */\n afterStop?: () => Promise<void> | void;\n /** Custom global error handler - overrides the default error handling */\n onError?: (error: Error, req: Request, res: Response, next: NextFunction) => void;\n /** Called at the start of each request - good for request preprocessing */\n onRequest?: (req: Request, res: Response, next: NextFunction) => void;\n /** Called before response is sent - good for response modification */\n onResponse?: (req: Request, res: Response, next: NextFunction) => void;\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"array.utils.js","sourceRoot":"","sources":["../../../src/utils/array.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The MIT License\n *\n * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { getValueByPath } from './obj.utils';\n\n/**\n * Splits an array into chunks of the specified size.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The array to split into chunks.\n * @param {number} size - The number of elements per chunk.\n * @returns {T[][]} A new array containing chunked arrays.\n * @throws {TypeError} If array is not an array.\n * @throws {Error} If chunk size is not a positive integer.\n */\nexport function chunk<T>(array: T[], size: number): T[][] {\n if (!Array.isArray(array)) throw new TypeError('Expected an array');\n if (!array.length) return [];\n if (!Number.isInteger(size) || size <= 0) throw new Error('Chunk size must be a positive integer');\n return Array.from({ length: Math.ceil(array.length / size) }, (_, i) => array.slice(i * size, i * size + size));\n}\n\n/**\n * Removes duplicate values from an array.\n * Optionally enforces uniqueness by a key function.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @param {(item: T) => unknown} [keyFn] - Optional function to determine uniqueness by key.\n * @returns {T[]} A new array with unique values.\n */\nexport function unique<T>(array: T[], keyFn?: (item: T) => unknown): T[] {\n if (!Array.isArray(array) || array.length === 0) return [];\n if (!keyFn) return Array.from(new Set(array));\n const seen = new Set<unknown>();\n return array.filter(item => {\n const key = keyFn(item);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n}\n\n/**\n * Deeply flattens a nested array to a single-level array.\n *\n * @template T The leaf type of array elements.\n * @param {any[]} array - The (possibly deeply nested) input array.\n * @returns {T[]} A deeply flattened array.\n */\nexport function flattenDeep<T>(array: any[]): T[] {\n if (!Array.isArray(array)) return [];\n return array.reduce<T[]>((acc, val) => {\n if (Array.isArray(val)) {\n acc.push(...flattenDeep<T>(val));\n } else {\n acc.push(val);\n }\n return acc;\n }, []);\n}\n\n/**\n * Returns a random element from an array, or undefined if empty.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @returns {T | undefined} A randomly selected item, or undefined if array is empty or not an array.\n */\nexport function random<T>(array: T[]): T | undefined {\n if (!Array.isArray(array) || array.length === 0) return undefined;\n return array[Math.floor(Math.random() * array.length)];\n}\n\n/* eslint-disable no-redeclare */\n/**\n * Groups items in an array by a key or key function.\n *\n * @template T The type of array elements.\n * @overload\n * @param {T[]} array - The array to group.\n * @param {keyof T} key - Property key to group by.\n * @returns {Record<string, T[]>}\n * @overload\n * @param {T[]} array - The array to group.\n * @param {(item: T) => string | number | symbol} keyFn - Function to generate group key from item.\n * @returns {Record<K, T[]>}\n * @param {T[]} array - The array to group.\n * @param {keyof T | ((item: T) => string | number | symbol)} keyOrFn - Property key or key-generating function.\n * @returns {Record<string | number | symbol, T[]>} An object mapping group keys to item arrays.\n */\nexport function groupBy<T>(array: T[], key: keyof T): Record<string, T[]>;\nexport function groupBy<T, K extends string | number | symbol>(array: T[], keyFn: (item: T) => K): Record<K, T[]>;\nexport function groupBy<T>(\n array: T[],\n keyOrFn: keyof T | ((item: T) => string | number | symbol)\n): Record<string | number | symbol, T[]> {\n if (!Array.isArray(array) || array.length === 0) return {};\n const keyFn = typeof keyOrFn === 'function' ? keyOrFn : (item: T) => item[keyOrFn as keyof T];\n return array.reduce(\n (acc, item) => {\n const key = keyFn(item) as string | number | symbol;\n if (!acc[key]) acc[key] = [];\n acc[key].push(item);\n return acc;\n },\n {} as Record<string | number | symbol, T[]>\n );\n}\n/* eslint-enable no-redeclare */\n\n/**\n * Shuffles an array using the Fisher-Yates algorithm.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @returns {T[]} A new shuffled array.\n * @throws {TypeError} If array is not an array.\n */\nexport function shuffle<T>(array: T[]): T[] {\n if (!Array.isArray(array)) throw new TypeError('Expected an array');\n const copy = array.slice();\n for (let i = copy.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1));\n [copy[i], copy[j]] = [copy[j], copy[i]];\n }\n return copy;\n}\n\n/**\n * Returns an array of property values from an array of objects.\n *\n * @template T The type of array elements.\n * @template K The object property to pluck.\n * @param {T[]} array - The input array.\n * @param {K} key - The property name to pluck.\n * @returns {T[K][]} Array of property values.\n */\nexport function pluck<T, K extends keyof T>(array: T[], key: K): T[K][] {\n if (!Array.isArray(array)) return [];\n return array.map(item => item[key]);\n}\n\n/**\n * Returns values in array A that are not in array B.\n *\n * @template T The type of array elements.\n * @param {T[]} a - First array.\n * @param {T[]} b - Second array.\n * @returns {T[]} Elements in A that are not in B.\n */\nexport function difference<T>(a: T[], b: T[]): T[] {\n if (!Array.isArray(a) || !Array.isArray(b)) return [];\n const setB = new Set(b);\n return a.filter(item => !setB.has(item));\n}\n\n/**\n * Returns common values between arrays A and B.\n *\n * @template T The type of array elements.\n * @param {T[]} a - First array.\n * @param {T[]} b - Second array.\n * @returns {T[]} Elements that exist in both arrays.\n */\nexport function intersect<T>(a: T[], b: T[]): T[] {\n if (!Array.isArray(a) || !Array.isArray(b)) return [];\n const setB = new Set(b);\n return a.filter(item => setB.has(item));\n}\n\n/**\n * Sorts an array of objects by a nested key using Merge Sort (O(n log n)).\n * Missing/undefined keys are sorted to the \"end\" (asc) or \"start\" (desc).\n *\n * @template T The type of array elements (objects).\n * @param {T[]} array - Array of objects to sort.\n * @param {string | ((item: T) => any)} key - Dot-notated key (e.g., \"profile.age\") or function.\n * @param {\"asc\" | \"desc\"} [direction=\"asc\"] - Sort direction: 'asc' or 'desc'.\n * @returns {T[]} A new sorted array.\n * @throws {TypeError} If array is not an array.\n */\nexport function mergeSort<T>(array: T[], key: string | ((item: T) => any), direction: 'asc' | 'desc' = 'asc'): T[] {\n if (!Array.isArray(array)) throw new TypeError('Expected array');\n if (array.length <= 1) return array.slice();\n\n const keyFn = typeof key === 'function' ? key : (item: T) => getValueByPath(item as object, key);\n\n const compare = (a: T, b: T) => {\n const aVal = keyFn(a);\n const bVal = keyFn(b);\n // Sorts undefined/null last for \"asc\", first for \"desc\"\n if (aVal === bVal) return 0;\n if (aVal == null) return direction === 'asc' ? 1 : -1;\n if (bVal == null) return direction === 'asc' ? -1 : 1;\n return direction === 'asc' ? (aVal < bVal ? -1 : 1) : aVal > bVal ? -1 : 1;\n };\n\n const merge = (left: T[], right: T[]): T[] => {\n const result: T[] = [];\n let i = 0,\n j = 0;\n while (i < left.length && j < right.length) {\n if (compare(left[i], right[j]) <= 0) result.push(left[i++]);\n else result.push(right[j++]);\n }\n return result.concat(left.slice(i)).concat(right.slice(j));\n };\n\n const sort = (arr: T[]): T[] => {\n if (arr.length <= 1) return arr;\n const mid = Math.floor(arr.length / 2);\n const left = sort(arr.slice(0, mid));\n const right = sort(arr.slice(mid));\n return merge(left, right);\n };\n return sort(array);\n}\n\n/**\n * Combines multiple arrays into a single array of grouped elements.\n * Output array length equals the length of the shortest input array.\n *\n * @example zip([1, 2], ['a', 'b']) => [[1, 'a'], [2, 'b']]\n * @param {...Array<T>[]} arrays - Two or more arrays to zip together.\n * @returns {Array<T[]>} Array of grouped elements.\n */\nexport function zip<T>(...arrays: T[][]): T[][] {\n if (arrays.length === 0) return [];\n if (arrays.some(arr => !Array.isArray(arr))) {\n throw new TypeError('All arguments must be arrays');\n }\n\n const minLength = Math.min(...arrays.map(arr => arr.length));\n const result: T[][] = [];\n\n for (let i = 0; i < minLength; i++) {\n result.push(arrays.map(arr => arr[i]));\n }\n\n return result;\n}\n\n/**\n * Splits an array into two arrays based on a predicate function.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @param {(item: T, index: number, array: T[]) => boolean} predicate - Function to test each element.\n * @returns {[T[], T[]]} A tuple of two arrays: [matched, unmatched].\n */\nexport function partition<T>(array: T[], predicate: (item: T, index: number, array: T[]) => boolean): [T[], T[]] {\n if (!Array.isArray(array)) return [[], []];\n\n return array.reduce(\n ([pass, fail], item, index) => {\n return predicate(item, index, array) ? [[...pass, item], fail] : [pass, [...fail, item]];\n },\n [[] as T[], [] as T[]]\n );\n}\n\n/**\n * Generates an array of numbers within a specified range.\n *\n * @param {number} start - Start of range (inclusive).\n * @param {number} end - End of range (exclusive).\n * @param {number} [step=1] - Step between numbers.\n * @returns {number[]} Array of numbers in range.\n */\nexport function range(start: number, end: number, step: number = 1): number[] {\n if (!Number.isFinite(start) || !Number.isFinite(end) || !Number.isFinite(step)) {\n throw new TypeError('Arguments must be finite numbers');\n }\n if (step === 0) throw new Error('Step cannot be zero');\n\n const isAscending = step > 0;\n if ((isAscending && start >= end) || (!isAscending && start <= end)) {\n return [];\n }\n\n const length = Math.max(Math.ceil((end - start) / step), 0);\n const result = new Array(length);\n\n for (let i = 0, value = start; i < length; i++, value += step) {\n result[i] = value;\n }\n\n return result;\n}\n\n/**\n * Returns the first n elements of an array.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @param {number} [n=1] - Number of elements to take.\n * @returns {T[]} New array with first n elements.\n */\nexport function take<T>(array: T[], n: number = 1): T[] {\n if (!Array.isArray(array) || n <= 0) return [];\n return array.slice(0, n);\n}\n\n/**\n * Takes elements from the array while predicate returns true.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @param {(item: T, index: number) => boolean} predicate - Function to test each element.\n * @returns {T[]} New array with taken elements.\n */\nexport function takeWhile<T>(array: T[], predicate: (item: T, index: number) => boolean): T[] {\n if (!Array.isArray(array)) return [];\n\n const result: T[] = [];\n for (let i = 0; i < array.length; i++) {\n if (!predicate(array[i], i)) break;\n result.push(array[i]);\n }\n\n return result;\n}\n\n/**\n * Removes all falsy values from an array.\n * False, null, 0, \"\", undefined, and NaN are falsy.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @returns {NonNullable<T>[]} New array with falsy values removed.\n */\nexport function compact<T>(array: T[]): NonNullable<T>[] {\n if (!Array.isArray(array)) return [];\n return array.filter(Boolean) as NonNullable<T>[];\n}\n\n/**\n * Counts array elements by a key function.\n *\n * @template T The type of array elements.\n * @param {T[]} array - The input array.\n * @param {(item: T) => string | number | symbol} keyFn - Function to generate count key.\n * @returns {Record<string, number>} Object with counts by key.\n */\nexport function countBy<T>(array: T[], keyFn: (item: T) => string | number | symbol): Record<string, number> {\n if (!Array.isArray(array)) return {};\n\n return array.reduce(\n (acc, item) => {\n const key = String(keyFn(item));\n acc[key] = (acc[key] || 0) + 1;\n return acc;\n },\n {} as Record<string, number>\n );\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"async.utils.js","sourceRoot":"","sources":["../../../src/utils/async.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The MIT License\n *\n * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { getLogger } from './logger.utils';\n\n/**\n * Delays execution for a specified number of milliseconds.\n *\n * @param {number} ms - The number of milliseconds to sleep.\n * @returns {Promise<void>} A Promise that resolves after the given time.\n */\nexport function sleep(ms: number): Promise<void> {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\n/**\n * Creates a debounced version of a function that delays its execution.\n * Provides `.cancel()` and `.flush()` methods.\n *\n * @template T\n * @param {T} fn - The function to debounce.\n * @param {number} delay - Delay in milliseconds.\n * @returns {T & { cancel: () => void; flush: () => void }} A debounced function.\n */\nexport function debounce<T extends (...args: any[]) => void>(fn: T, delay: number) {\n let timer: NodeJS.Timeout | null = null;\n let pendingArgs: Parameters<T> | null = null;\n\n function debounced(...args: Parameters<T>) {\n pendingArgs = args;\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n fn(...(pendingArgs as Parameters<T>));\n timer = null;\n }, delay);\n }\n\n debounced.cancel = () => {\n if (timer) clearTimeout(timer);\n timer = null;\n pendingArgs = null;\n };\n\n debounced.flush = () => {\n if (timer) {\n clearTimeout(timer);\n fn(...(pendingArgs as Parameters<T>));\n timer = null;\n pendingArgs = null;\n }\n };\n\n return debounced as typeof debounced & {\n cancel: () => void;\n flush: () => void;\n };\n}\n\n/**\n * Creates a throttled version of a function that limits its execution rate.\n * Allows control over leading/trailing invocation.\n *\n * @template T\n * @param {T} fn - The function to throttle.\n * @param {number} limit - Minimum time between calls in milliseconds.\n * @param {{ leading?: boolean, trailing?: boolean }} [opts] - Options for leading/trailing edge throttling.\n * @returns {(...args: Parameters<T>) => void} A throttled function.\n */\nexport function throttle<T extends (...args: any[]) => void>(\n fn: T,\n limit: number,\n opts: { leading?: boolean; trailing?: boolean } = {\n leading: true,\n trailing: false\n }\n): (...args: Parameters<T>) => void {\n let lastCall = 0;\n let timer: NodeJS.Timeout | null = null;\n let savedArgs: Parameters<T> | null = null;\n\n return function (...args: Parameters<T>) {\n const now = Date.now();\n const { leading = true, trailing = false } = opts;\n\n if (!lastCall && !leading) lastCall = now;\n\n const remaining = limit - (now - lastCall);\n\n if (remaining <= 0) {\n if (timer) {\n clearTimeout(timer);\n timer = null;\n }\n lastCall = now;\n fn(...args);\n } else if (trailing) {\n savedArgs = args;\n if (!timer) {\n timer = setTimeout(() => {\n lastCall = leading ? Date.now() : 0;\n timer = null;\n if (savedArgs) fn(...savedArgs);\n }, remaining);\n }\n }\n };\n}\n\n/**\n * Retries an asynchronous function a given number of times with optional delay/backoff.\n *\n * @template T\n * @param {() => Promise<T>} fn - The async function to retry.\n * @param {number} [retries=3] - Number of retry attempts.\n * @param {number} [delay=500] - Delay in milliseconds between retries.\n * @param {boolean} [backoff=false] - Use exponential backoff between attempts.\n * @param {(error: unknown, attempt: number) => void} [onRetry] - Callback for each retry attempt.\n * @returns {Promise<T>} The result of the async function if successful.\n * @throws {*} The last encountered error if all retries fail.\n */\nexport async function retry<T>(\n fn: () => Promise<T>,\n retries = 3,\n delay = 500,\n backoff = false,\n onRetry?: (error: unknown, attempt: number) => void\n): Promise<T> {\n for (let i = 0; i < retries; i++) {\n try {\n return await fn();\n } catch (e) {\n if (i === retries - 1) throw e;\n if (onRetry) onRetry(e, i + 1);\n await sleep(backoff ? delay * Math.pow(2, i) : delay);\n }\n }\n throw new Error('Retry failed'); // should never reach here\n}\n\n/**\n * Wraps a promise and rejects it if it doesn't resolve within the specified timeout.\n *\n * @template T\n * @param {Promise<T>} promise - The original promise.\n * @param {number} ms - Timeout in milliseconds.\n * @param {string} [message=\"Operation timed out\"] - Optional timeout message.\n * @returns {Promise<T>} A promise that resolves or rejects within the timeout.\n */\nexport function withTimeout<T>(promise: Promise<T>, ms: number, message = 'Operation timed out'): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timeoutHandle = setTimeout(() => reject(new Error(message)), ms);\n promise\n .then(result => {\n clearTimeout(timeoutHandle);\n resolve(result);\n })\n .catch(err => {\n clearTimeout(timeoutHandle);\n reject(err);\n });\n });\n}\n\n/**\n * Executes async tasks in true batches.\n * Each batch runs in parallel, but batches run sequentially.\n * All tasks in a batch start at the same time, next batch waits for full completion.\n * NOTE: For more granular concurrency, use a \"queue\" or \"pooled\" approach.\n *\n * @template T\n * @param {Array<() => Promise<T>>} tasks - An array of functions that return Promises.\n * @param {number} limit - Number of tasks to run in parallel per batch.\n * @returns {Promise<T[]>} A promise that resolves to an array of resolved values.\n */\nexport async function runInBatches<T>(tasks: (() => Promise<T>)[], limit: number): Promise<T[]> {\n const results: T[] = [];\n for (let i = 0; i < tasks.length; i += limit) {\n const batch = tasks.slice(i, i + limit);\n const batchResults = await Promise.all(batch.map(fn => fn()));\n results.push(...batchResults);\n }\n return results;\n}\n\n/**\n * Wraps a function and ensures it is only called once at a time.\n * Calls made while one is in progress will wait for the same Promise.\n * Optionally, new calls can be dropped while in progress (drop=true).\n *\n * @template TArgs\n * @template TResult\n * @param {(...args: TArgs) => Promise<TResult>} fn - The async function to wrap.\n * @param {boolean} [drop=false] - If true, new calls while one is pending are rejected.\n * @returns {(...args: TArgs) => Promise<TResult>} A wrapped function with singleton behavior.\n */\nexport function singletonAsync<TArgs extends unknown[], TResult>(\n fn: (...args: TArgs) => Promise<TResult>,\n drop: boolean = false\n): (...args: TArgs) => Promise<TResult> {\n let promise: Promise<TResult> | null = null;\n\n return async (...args: TArgs) => {\n if (!promise) {\n promise = fn(...args).finally(() => {\n promise = null;\n });\n } else if (drop) {\n return Promise.reject(new Error('Busy: function already running'));\n }\n return promise;\n };\n}\n\n/**\n * Resolves a list of async tasks in parallel, returning both resolved and rejected results.\n *\n * @template T\n * @param {Array<() => Promise<T>>} tasks - Array of promise-returning functions.\n * @returns {Promise<PromiseSettledResult<T>[]>} Results including status and value/reason.\n */\nexport async function settleAll<T>(tasks: (() => Promise<T>)[]): Promise<PromiseSettledResult<T>[]> {\n return Promise.allSettled(tasks.map(task => task()));\n}\n\nexport interface TaskQueue {\n <T>(taskFn: () => Promise<T>): Promise<T>;\n pause: () => void;\n resume: () => void;\n readonly length: number;\n readonly isPaused: boolean;\n}\n\n/**\n * A simple task queue that executes async tasks with a concurrency limit.\n * Exposes pause, resume, and queue length getters.\n *\n * @param {number} limit - Maximum number of concurrent tasks.\n * @returns {function & { pause: () => void, resume: () => void, length: number, isPaused: boolean }}\n * Enqueue function plus queue controls.\n */\nexport function createTaskQueue(limit: number): TaskQueue {\n const queue: (() => Promise<void>)[] = [];\n let activeCount = 0;\n let paused = false;\n\n const state = {\n /**\n * Pause task processing.\n */\n pause() {\n paused = true;\n },\n /**\n * Resume task processing.\n */\n resume() {\n paused = false;\n next();\n },\n /**\n * The current length of the queue.\n * @type {number}\n */\n get length() {\n return queue.length;\n },\n /**\n * Whether the queue is currently paused.\n * @type {boolean}\n */\n get isPaused() {\n return paused;\n }\n };\n\n const next = () => {\n if (paused || queue.length === 0 || activeCount >= limit) return;\n const task = queue.shift()!;\n activeCount++;\n task().finally(() => {\n activeCount--;\n next();\n });\n };\n\n /**\n * Enqueues a new async task to the queue.\n *\n * @template T\n * @param {() => Promise<T>} taskFn - The async task function.\n * @returns {Promise<T>} Promise resolving when task completes.\n */\n const enqueue = async function <T>(taskFn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n queue.push(async () => {\n try {\n const result = await taskFn();\n resolve(result);\n } catch (err) {\n reject(err);\n }\n });\n next();\n });\n };\n\n enqueue.pause = state.pause;\n enqueue.resume = state.resume;\n Object.defineProperty(enqueue, 'length', {\n get: () => queue.length\n });\n Object.defineProperty(enqueue, 'isPaused', {\n get: () => paused\n });\n\n return enqueue as TaskQueue;\n}\n\n/**\n * Executes async functions sequentially and collects results.\n * Useful when order matters or tasks depend on each other.\n *\n * @template T\n * @param {Array<() => Promise<T>>} tasks - Array of promise-returning functions.\n * @returns {Promise<T[]>} Array of resolved values.\n */\nexport async function runInSeries<T>(tasks: (() => Promise<T>)[]): Promise<T[]> {\n const results: T[] = [];\n for (const task of tasks) {\n results.push(await task());\n }\n return results;\n}\n\n/**\n * Memoizes an async function, caching results for repeated calls with identical arguments.\n * Optional TTL (time-to-live) for cached entries.\n *\n * @template T Function return type\n * @template Args Function arguments types\n * @param {(...args: Args) => Promise<T>} fn - The async function to memoize\n * @param {object} [options] - Memoization options\n * @param {number} [options.ttl] - Cache TTL in milliseconds (optional)\n * @param {(args: Args) => string} [options.keyFn] - Custom key generator function\n * @returns {(...args: Args) => Promise<T>} Memoized function\n */\nexport function memoizeAsync<T, Args extends any[]>(\n fn: (...args: Args) => Promise<T>,\n options: {\n ttl?: number;\n keyFn?: (args: Args) => string;\n } = {}\n): (...args: Args) => Promise<T> {\n const cache = new Map<string, { value: T; expires: number }>();\n const { ttl, keyFn = JSON.stringify } = options;\n\n return async function (...args: Args): Promise<T> {\n const key = keyFn(args);\n const cached = cache.get(key);\n\n if (cached && (!ttl || Date.now() < cached.expires)) {\n return cached.value;\n }\n\n const result = await fn(...args);\n cache.set(key, {\n value: result,\n expires: ttl ? Date.now() + ttl : Infinity\n });\n\n return result;\n };\n}\n\n/**\n * Creates an abortable version of a promise that can be cancelled using an AbortController.\n *\n * @template T\n * @param {Promise<T>} promise - The promise to make abortable\n * @param {AbortSignal} signal - AbortSignal from AbortController\n * @param {any} [abortValue] - Value to use when rejecting on abort\n * @returns {Promise<T>} Promise that rejects if the signal is aborted\n */\nexport function abortable<T>(\n promise: Promise<T>,\n signal: AbortSignal,\n abortValue: any = new Error('Operation aborted')\n): Promise<T> {\n if (signal.aborted) {\n return Promise.reject(abortValue);\n }\n\n return Promise.race([\n promise,\n new Promise<T>((_, reject) => {\n const abort = () => reject(abortValue);\n signal.addEventListener('abort', abort, { once: true });\n promise.finally(() => signal.removeEventListener('abort', abort));\n })\n ]);\n}\n\n/**\n * Creates a promise with external resolve/reject functions.\n * Useful for creating promises that can be resolved or rejected from outside.\n *\n * @template T\n * @returns {[Promise<T>, (value: T | PromiseLike<T>) => void, (reason?: any) => void]}\n * Tuple of [promise, resolve, reject]\n */\nexport function createDeferred<T>(): [Promise<T>, (value: T | PromiseLike<T>) => void, (reason?: any) => void] {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: any) => void;\n\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return [promise, resolve, reject];\n}\n\n/**\n * Chains a series of async functions, passing the result of each to the next.\n * Similar to function composition but for async functions.\n *\n * @template T\n * @param {Array<(input: any) => Promise<any>>} fns - Array of async functions to compose\n * @returns {(input: any) => Promise<T>} Composed function\n */\nexport function waterfall<T>(fns: Array<(input: any) => Promise<any>>): (initialValue: any) => Promise<T> {\n return async (initialValue: any): Promise<T> => {\n return fns.reduce(async (acc, fn) => fn(await acc), Promise.resolve(initialValue)) as Promise<T>;\n };\n}\n\n/**\n * Creates a rate limiter that ensures functions aren't called more than\n * a specified number of times per interval.\n *\n * @template T\n * @param {(...args: any[]) => Promise<T>} fn - Function to rate limit\n * @param {number} maxCalls - Maximum calls allowed per interval\n * @param {number} interval - Time interval in milliseconds\n * @returns {(...args: any[]) => Promise<T>} Rate limited function\n */\nexport function rateLimit<T>(\n fn: (...args: any[]) => Promise<T>,\n maxCalls: number,\n interval: number\n): (...args: any[]) => Promise<T> {\n const calls: number[] = [];\n\n return async function (...args: any[]): Promise<T> {\n const now = Date.now();\n calls.splice(0, calls.length, ...calls.filter(time => now - time < interval));\n\n if (calls.length >= maxCalls) {\n const oldestCall = calls[0];\n const delay = interval - (now - oldestCall);\n await sleep(Math.max(1, delay));\n // Remove potentially stale entries after sleep\n const currentTime = Date.now();\n calls.splice(0, calls.length, ...calls.filter(time => currentTime - time < interval));\n\n // If still at limit after sleep, wait for another cycle\n if (calls.length >= maxCalls) {\n const nextDelay = interval - (currentTime - calls[0]);\n await sleep(Math.max(1, nextDelay));\n calls.splice(0, calls.length, ...calls.filter(time => Date.now() - time < interval));\n }\n }\n\n calls.push(Date.now());\n return fn(...args);\n };\n}\n\n/**\n * Circuit breaker pattern implementation for protecting against cascading failures.\n * Tracks failures and prevents calling the function when too many failures occur.\n *\n * @param fn - Function to protect with circuit breaker\n * @param options - Circuit breaker options\n * @returns Function wrapped with circuit breaker logic\n *\n * @example\n * ```typescript\n * const protectedFetch = circuitBreaker(\n * async (url) => {\n * const response = await fetch(url);\n * if (!response.ok) throw new Error(`HTTP error: ${response.status}`);\n * return response.json();\n * },\n * {\n * failureThreshold: 3,\n * resetTimeout: 30000,\n * onOpen: () => console.log('Circuit breaker opened'),\n * onClose: () => console.log('Circuit breaker closed')\n * }\n * );\n *\n * // Will throw CircuitBreakerOpenError after failureThreshold consecutive failures\n * try {\n * const data = await protectedFetch('https://api.example.com');\n * } catch (error) {\n * if (error instanceof CircuitBreakerOpenError) {\n * console.log('Service is currently unavailable, please try again later');\n * }\n * }\n * ```\n */\nexport class CircuitBreakerOpenError extends Error {\n constructor(message = 'Circuit breaker is open') {\n super(message);\n this.name = 'CircuitBreakerOpenError';\n }\n}\n\n/**\n * Circuit breaker states\n */\nexport enum CircuitBreakerState {\n CLOSED = 'CLOSED',\n OPEN = 'OPEN',\n HALF_OPEN = 'HALF_OPEN'\n}\n\nexport interface CircuitBreakerOptions {\n /** Number of consecutive failures before opening circuit (default: 5) */\n failureThreshold?: number;\n /** Time in milliseconds to wait before trying again (default: 10000) */\n resetTimeout?: number;\n /** Number of successful calls to close the circuit again (default: 1) */\n successThreshold?: number;\n /** Callback when circuit opens */\n onOpen?: () => void;\n /** Callback when circuit closes */\n onClose?: () => void;\n /** Callback when circuit enters half-open state */\n onHalfOpen?: () => void;\n}\n\nexport function circuitBreaker<T, Args extends any[]>(\n fn: (...args: Args) => Promise<T>,\n options: CircuitBreakerOptions = {}\n): (...args: Args) => Promise<T> {\n const { failureThreshold = 5, resetTimeout = 10000, successThreshold = 1, onOpen, onClose, onHalfOpen } = options;\n\n let state = CircuitBreakerState.CLOSED;\n let failureCount = 0;\n let successCount = 0;\n let nextAttempt = Date.now();\n\n return async function (...args: Args): Promise<T> {\n if (state === CircuitBreakerState.OPEN) {\n if (Date.now() < nextAttempt) {\n throw new CircuitBreakerOpenError();\n }\n\n // Move to half-open state\n state = CircuitBreakerState.HALF_OPEN;\n if (onHalfOpen) onHalfOpen();\n }\n\n try {\n const result = await fn(...args);\n\n // On success in half-open state\n if (state === CircuitBreakerState.HALF_OPEN) {\n successCount++;\n if (successCount >= successThreshold) {\n successCount = 0;\n failureCount = 0;\n state = CircuitBreakerState.CLOSED;\n if (onClose) onClose();\n }\n } else {\n // Reset failure count on success in closed state\n failureCount = 0;\n }\n\n return result;\n } catch (error) {\n // Track failures\n failureCount++;\n\n // Check if we need to open the circuit\n if (\n (state === CircuitBreakerState.CLOSED || state === CircuitBreakerState.HALF_OPEN) &&\n failureCount >= failureThreshold\n ) {\n state = CircuitBreakerState.OPEN;\n nextAttempt = Date.now() + resetTimeout;\n if (onOpen) onOpen();\n }\n\n throw error;\n }\n };\n}\n\n/**\n * Run multiple async tasks with concurrency control.\n *\n * @param tasks - Array of async tasks to run\n * @param options - Concurrency options\n * @returns Promise that resolves when all tasks are complete\n *\n * @example\n * ```typescript\n * const urls = ['https://example.com/1', 'https://example.com/2', many more ];\n *\n * // Process up to 5 requests at a time, with progress reporting\n * const results = await runWithConcurrency(\n * urls.map(url => () => fetch(url).then(res => res.json())),\n * {\n * concurrency: 5,\n * onProgress: (completed, total) => {\n * console.log(`Progress: ${completed}/${total}`);\n * }\n * }\n * );\n * ```\n */\nexport async function runWithConcurrency<T>(\n tasks: Array<() => Promise<T>>,\n options: {\n /** Maximum number of tasks to run at once (default: 3) */\n concurrency?: number;\n /** Called whenever a task completes */\n onProgress?: (completed: number, total: number) => void;\n /** Abort signal to cancel execution */\n signal?: AbortSignal;\n } = {}\n): Promise<T[]> {\n const { concurrency = 3, onProgress, signal } = options;\n const results: T[] = [];\n const totalTasks = tasks.length;\n let completed = 0;\n\n // If no tasks, return empty array\n if (totalTasks === 0) return results;\n\n // Check if execution is already aborted\n if (signal?.aborted) {\n throw new Error('Aborted');\n }\n\n return new Promise((resolve, reject) => {\n let taskIndex = 0;\n\n // Process next task function\n const processNext = async () => {\n // Get current task index and increment\n const currentTaskIndex = taskIndex++;\n\n // Skip if we've processed all tasks\n if (currentTaskIndex >= totalTasks) return;\n\n try {\n // Run the task\n const result = await tasks[currentTaskIndex]();\n\n // Check if aborted during task execution\n if (signal?.aborted) {\n reject(new Error('Aborted'));\n return;\n }\n\n // Store result and update counters\n results[currentTaskIndex] = result;\n completed++;\n\n // Call progress callback if provided\n if (onProgress) {\n try {\n onProgress(completed, totalTasks);\n } catch (err) {\n getLogger().error({ err }, 'Error in onProgress callback');\n }\n }\n } catch (error) {\n reject(error);\n return;\n }\n\n // Check if all tasks are completed\n if (completed === totalTasks) {\n resolve(results);\n return;\n }\n\n // Process next task\n processNext();\n };\n\n // Start initial batch of tasks\n const initialBatch = Math.min(concurrency, totalTasks);\n for (let i = 0; i < initialBatch; i++) {\n processNext();\n }\n\n // Set up abort handler\n if (signal) {\n signal.addEventListener(\n 'abort',\n () => {\n reject(new Error('Aborted'));\n },\n { once: true }\n );\n }\n });\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"cache.utils.js","sourceRoot":"","sources":["../../../src/utils/cache.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The MIT License\n *\n * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { config } from '../config';\n\n/**\n * Represents a cached entry with a value and an expiration timestamp.\n */\ntype CacheEntry<T> = {\n value: T;\n expiresAt: number;\n lastAccessed?: number; // Track last access time for LRU functionality\n};\n\n/**\n * Options for configuring a TTLCache instance.\n */\nexport interface TTLCacheOptions {\n /** Default time-to-live in milliseconds for cache entries */\n ttlMs?: number;\n /** Maximum number of entries to keep in cache (uses LRU eviction policy) */\n maxSize?: number;\n /** Auto-cleanup interval in milliseconds (disabled if 0 or negative) */\n autoCleanupMs?: number;\n}\n\n/**\n * An in-memory cache with time-to-live (TTL) support for each entry.\n *\n * @typeParam K - Type of the key.\n * @typeParam V - Type of the value.\n *\n * @example\n * const cache = new TTLCache<string, number>({ ttlMs: 1000 });\n * cache.set(\"x\", 123);\n * const value = cache.get(\"x\"); // 123\n */\nexport class TTLCache<K, V> {\n private cache = new Map<K, CacheEntry<V>>();\n private ttlMs: number;\n private maxSize?: number;\n private cleanupInterval?: NodeJS.Timeout;\n\n /**\n * @param options - Configuration options for the cache\n */\n constructor(options: TTLCacheOptions = {}) {\n this.ttlMs = options.ttlMs ?? config.cache.defaultTtl;\n this.maxSize = options.maxSize;\n\n // Setup auto-cleanup if enabled\n const autoCleanupMs = options.autoCleanupMs;\n if (autoCleanupMs && autoCleanupMs > 0) {\n this.cleanupInterval = setInterval(() => {\n this.cleanup();\n }, autoCleanupMs);\n }\n }\n\n /**\n * Sets a key-value pair in the cache with the default TTL.\n *\n * @param key - The key to set.\n * @param value - The value to associate with the key.\n */\n set(key: K, value: V): void {\n this.setWithTTL(key, value, this.ttlMs);\n }\n\n /**\n * Sets a key-value pair in the cache with a custom TTL.\n *\n * @param key - The key to set.\n * @param value - The value to associate with the key.\n * @param ttlMs - Time-to-live in milliseconds.\n */\n setWithTTL(key: K, value: V, ttlMs: number): void {\n const now = Date.now();\n const expiresAt = now + ttlMs;\n\n if (this.cache.has(key)) {\n this.cache.delete(key); // remove old entry to maintain LRU order\n }\n\n this.cache.set(key, { value, expiresAt, lastAccessed: now });\n\n if (this.maxSize && this.cache.size > this.maxSize) {\n this.evictLRU();\n }\n }\n\n /**\n * Retrieves the value for a given key if it hasn't expired.\n *\n * @param key - The key to retrieve.\n * @returns The cached value, or undefined if not found or expired.\n */\n get(key: K): V | undefined {\n const entry = this.cache.get(key);\n if (!entry) return undefined;\n\n const now = Date.now();\n if (now > entry.expiresAt) {\n this.cache.delete(key);\n return undefined;\n }\n\n // Update lastAccessed and move key to the end (most recently used)\n entry.lastAccessed = now;\n // Re-insert to end of Map to maintain LRU order\n this.cache.delete(key);\n this.cache.set(key, entry);\n\n return entry.value;\n }\n\n /**\n * Retrieves or computes a value if it's not in the cache or has expired.\n *\n * @param key - The key to retrieve\n * @param producer - Function to generate the value if not cached\n * @param ttlMs - Optional custom TTL for the computed value\n * @returns The cached or computed value\n */\n async getOrCompute(key: K, producer: () => Promise<V>, ttlMs?: number): Promise<V> {\n const value = this.get(key);\n if (value !== undefined) return value;\n\n const newValue = await producer();\n this.setWithTTL(key, newValue, ttlMs ?? this.ttlMs);\n return newValue;\n }\n\n /**\n * Checks if the key exists and hasn't expired.\n *\n * @param key - The key to check.\n * @returns `true` if key exists and is valid, otherwise `false`.\n */\n has(key: K): boolean {\n return this.get(key) !== undefined;\n }\n\n /**\n * Deletes a key from the cache.\n *\n * @param key - The key to delete.\n * @returns `true` if the key existed and was removed, `false` otherwise.\n */\n delete(key: K): boolean {\n return this.cache.delete(key);\n }\n\n /**\n * Clears all entries from the cache.\n */\n clear(): void {\n this.cache.clear();\n }\n\n /**\n * Returns the number of entries currently in the cache (includes expired entries until next access/cleanup).\n *\n * @returns Number of items in the cache (may include expired keys).\n */\n size(): number {\n return this.cache.size;\n }\n\n /**\n * Set multiple key-value pairs at once with the default TTL.\n *\n * @param entries - Array of [key, value] tuples to set\n */\n setMany(entries: [K, V][]): void {\n for (const [key, value] of entries) {\n this.set(key, value);\n }\n }\n\n /**\n * Get multiple values at once.\n *\n * @param keys - Array of keys to retrieve\n * @returns Array of values (undefined for keys that don't exist or expired)\n */\n getMany(keys: K[]): (V | undefined)[] {\n return keys.map(key => this.get(key));\n }\n\n /**\n * Removes all expired entries from the cache.\n *\n * @returns Number of entries removed.\n */\n cleanup(): number {\n let removed = 0;\n const now = Date.now();\n for (const [key, entry] of this.cache.entries()) {\n if (now > entry.expiresAt) {\n this.cache.delete(key);\n removed++;\n }\n }\n return removed;\n }\n\n /**\n * Returns an iterator of all current valid [key, value] pairs.\n *\n * @returns IterableIterator<[K, V]>\n */\n *entries(): IterableIterator<[K, V]> {\n for (const [key, entry] of this.cache.entries()) {\n if (Date.now() <= entry.expiresAt) {\n yield [key, entry.value];\n }\n }\n }\n\n /**\n * Returns an iterator of all current valid keys.\n *\n * @returns IterableIterator<K>\n */\n *keys(): IterableIterator<K> {\n for (const [key, entry] of this.cache.entries()) {\n if (Date.now() <= entry.expiresAt) {\n yield key;\n }\n }\n }\n\n /**\n * Returns an iterator of all current valid values.\n *\n * @returns IterableIterator<V>\n */\n *values(): IterableIterator<V> {\n for (const entry of this.cache.values()) {\n if (Date.now() <= entry.expiresAt) {\n yield entry.value;\n }\n }\n }\n\n /**\n * Extends the expiration of a key by the specified time or default TTL.\n *\n * @param key - The key to refresh\n * @param ttlMs - Optional new TTL in milliseconds (uses default if not specified)\n * @returns true if the key was found and refreshed, false otherwise\n */\n refresh(key: K, ttlMs?: number): boolean {\n const entry = this.cache.get(key);\n if (!entry) return false;\n\n const now = Date.now();\n if (now > entry.expiresAt) {\n this.cache.delete(key);\n return false;\n }\n\n entry.expiresAt = now + (ttlMs ?? this.ttlMs);\n entry.lastAccessed = now;\n return true;\n }\n\n /**\n * Returns a snapshot of cache stats.\n *\n * @returns Object containing cache statistics\n */\n stats() {\n const now = Date.now();\n let expired = 0;\n let valid = 0;\n\n for (const entry of this.cache.values()) {\n if (now > entry.expiresAt) {\n expired++;\n } else {\n valid++;\n }\n }\n\n return {\n size: this.cache.size,\n validEntries: valid,\n expiredEntries: expired,\n maxSize: this.maxSize\n };\n }\n\n /**\n * Stop the auto-cleanup interval if it's running.\n */\n destroy() {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = undefined;\n }\n }\n\n /**\n * Evict the least recently used entry from the cache.\n * @private\n */\n private evictLRU(): void {\n const now = Date.now();\n\n // Remove all expired items first\n for (const [key, entry] of Array.from(this.cache.entries())) {\n if (now > entry.expiresAt) {\n this.cache.delete(key);\n }\n }\n\n // Evict oldest entries until within max size\n while (this.maxSize && this.cache.size > this.maxSize) {\n const oldestKey = this.cache.keys().next().value;\n this.cache.delete(oldestKey as K);\n }\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"context-store.utils.js","sourceRoot":"","sources":["../../../src/utils/context-store.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The MIT License\n *\n * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport { AsyncLocalStorage } from 'async_hooks';\n\n/**\n * Type representing the store object used in AsyncLocalStorage.\n * Keys must be unique symbols to ensure isolation and prevent collisions.\n */\nexport interface Store {\n [key: symbol]: unknown;\n}\n\n/**\n * Predefined symbols used as keys in AsyncLocalStorage.\n * Add new symbols here to avoid duplication.\n */\nexport const StoreKeys = {\n LOGGER: Symbol('LOGGER'),\n REQUEST_ID: Symbol('REQUEST_ID'),\n USER: Symbol('USER'),\n SESSION: Symbol('SESSION'),\n TRANSACTION_ID: Symbol('TRANSACTION_ID'),\n USER_ID: Symbol('USER_ID'),\n TENANT_ID: Symbol('TENANT_ID'),\n TRACE_ID: Symbol('TRACE_ID'),\n CORRELATION_ID: Symbol('CORRELATION_ID')\n};\n\n/**\n * Retrieves the current request ID from the async context, if available.\n *\n * @returns {string | undefined} The request ID string or undefined if not present in the current context.\n */\nexport function getRequestId(): string | undefined {\n return ContextStore.get<string>(StoreKeys.REQUEST_ID);\n}\n\n/**\n * Type-safe getter for common context values.\n *\n * @param key The store key symbol\n * @returns The typed value from the store\n */\nexport function getFromContext<T>(key: symbol): T | undefined {\n return ContextStore.get<T>(key);\n}\n\n/**\n * ContextStore manages per-request scoped context using AsyncLocalStorage.\n * It allows storing and retrieving data across async calls (e.g., request ID, logger).\n *\n * Example (Express middleware):\n * ```\n * // Middleware to initialize context and logger\n * app.use((req, res, next) => {\n * const requestId = req.headers[\"x-request-id\"]?.toString() || crypto.randomUUID();\n * ContextStore.run({ [StoreKeys.REQUEST_ID]: requestId }, () => {\n * ContextStore.set(StoreKeys.LOGGER, getLogger().child({ requestId }));\n * next();\n * });\n * });\n * ```\n */\nexport class ContextStore {\n /**\n * The underlying AsyncLocalStorage instance for context.\n * @private\n */\n private static readonly storage = new AsyncLocalStorage<Store>();\n\n /**\n * Returns the raw AsyncLocalStorage instance for advanced access.\n *\n * @returns {AsyncLocalStorage<Store>} The AsyncLocalStorage instance.\n */\n static getInstance(): AsyncLocalStorage<Store> {\n return this.storage;\n }\n\n /**\n * Retrieves a value from the async context store by symbol key.\n *\n * @typeParam T - The expected return type of the value.\n * @param {symbol} key - Unique symbol used as the store key.\n * @returns {T | undefined} The value found (typed) or undefined if not present.\n */\n static get<T>(key: symbol): T | undefined {\n const store = this.storage.getStore();\n return store?.[key] as T | undefined;\n }\n\n /**\n * Sets a value in the current context store by symbol key.\n *\n * @typeParam T - The value type to set.\n * @param {symbol} key - Unique symbol key.\n * @param {T} value - Value to set in context.\n * @throws {Error} If called outside an active context (not within a .run call or in the wrong async boundaries).\n */\n static set<T>(key: symbol, value: T): void {\n const store = this.storage.getStore();\n if (!store) {\n throw new Error(`Failed to set ${String(key)}: AsyncLocalStorage store is not initialized.`);\n }\n store[key] = value;\n }\n\n /**\n * Retrieves the entire context store object for the current async context.\n *\n * @returns {Store | undefined} The current store object or undefined if called outside a context.\n */\n static getAll(): Store | undefined {\n return this.storage.getStore();\n }\n\n /**\n * Initializes a new async context and executes a callback within it.\n * This must be called at the beginning of a request or logical async flow.\n *\n * @typeParam T - The callback's return type.\n * @param {Store} store - The initial key-value store object.\n * @param {() => T} callback - The function to run within the new context.\n * @returns {T} The result of the callback function.\n */\n static run<T>(store: Store, callback: () => T): T {\n return this.storage.run(store, callback);\n }\n\n /**\n * Checks if a key exists in the current context store.\n *\n * @param {symbol} key - The symbol key to check.\n * @returns {boolean} True if the key exists, false otherwise.\n */\n static has(key: symbol): boolean {\n const store = this.storage.getStore();\n return store !== undefined && key in store;\n }\n\n /**\n * Removes a value from the current context store by symbol key.\n *\n * @param {symbol} key - The symbol key to delete.\n * @returns {boolean} True if the key was deleted, false if the key wasn't found or no active context.\n * @throws {Error} If called outside an active context.\n */\n static delete(key: symbol): boolean {\n const store = this.storage.getStore();\n if (!store) {\n throw new Error(`Failed to delete ${String(key)}: AsyncLocalStorage store is not initialized.`);\n }\n return delete store[key];\n }\n\n /**\n * Updates multiple values in the current context store at once.\n *\n * @param {Partial<Record<symbol, unknown>>} values - Object containing symbol keys and values to update.\n * @throws {Error} If called outside an active context.\n */\n static patch(values: Partial<Record<symbol, unknown>>): void {\n const store = this.storage.getStore();\n if (!store) {\n throw new Error('Failed to patch: AsyncLocalStorage store is not initialized.');\n }\n Object.getOwnPropertySymbols(values).forEach(key => {\n store[key] = values[key];\n });\n }\n /**\n * Executes a callback with a temporary store value that only exists during execution.\n * Original store is restored after callback completes.\n *\n * @typeParam T - The callback's return type.\n * @param {symbol} key - The symbol key to temporarily set.\n * @param {unknown} value - The temporary value.\n * @param {() => T} callback - The function to execute with the temporary value.\n * @returns {T} The result of the callback function.\n * @throws {Error} If called outside an active context.\n */\n static withValue<T>(key: symbol, value: unknown, callback: () => T): T {\n const store = this.storage.getStore();\n if (!store) {\n throw new Error(`Failed to set temporary value: AsyncLocalStorage store is not initialized.`);\n }\n\n // Save original value\n const hasOriginal = key in store;\n const originalValue = store[key];\n\n // Set temporary value\n store[key] = value;\n\n try {\n // Run callback\n return callback();\n } finally {\n // Restore original value\n if (hasOriginal) {\n store[key] = originalValue;\n } else {\n delete store[key];\n }\n }\n }\n\n /**\n * Creates a new context that inherits values from the current context.\n *\n * @typeParam T - The callback's return type.\n * @param {Partial<Record<symbol, unknown>>} newValues - New values to add to or override in the context.\n * @param {() => T} callback - The function to execute in the new context.\n * @returns {T} The result of the callback function.\n */\n static extend<T>(newValues: Partial<Record<symbol, unknown>>, callback: () => T): T {\n const currentStore = this.storage.getStore() || {};\n\n // Create new store with current values plus new ones\n const newStore: Store = { ...currentStore };\n\n // Add new values\n Object.getOwnPropertySymbols(newValues).forEach(key => {\n newStore[key] = newValues[key];\n });\n\n // Run with extended store\n return this.storage.run(newStore, callback);\n }\n\n /**\n * Creates Express middleware that initializes a context for each request.\n *\n * @param {(req: any) => Partial<Record<symbol, unknown>>} initialValuesFactory - Function that returns initial context values.\n * @returns Express middleware function.\n */\n static createExpressMiddleware(initialValuesFactory: (req: any) => Partial<Record<symbol, unknown>> = () => ({})) {\n return (req: any, res: any, next: any) => {\n const initialValues = initialValuesFactory(req);\n ContextStore.run(initialValues as Store, next);\n };\n }\n}\n\n/**\n * Type-safe wrapper for accessing and modifying context values with specific types.\n *\n * @typeParam T - The value type.\n */\nexport class TypedContextKey<T> {\n /**\n * Creates a new typed context key.\n *\n * @param symbol - The unique symbol for this key\n * @param defaultValue - Optional default value if key is not found\n */\n constructor(\n private symbol: symbol,\n private defaultValue?: T\n ) {}\n\n /**\n * Gets the current value for this key.\n *\n * @returns The value or defaultValue if not found\n */\n get(): T | undefined {\n const value = ContextStore.get<T>(this.symbol);\n return value !== undefined ? value : this.defaultValue;\n }\n\n /**\n * Sets the value for this key.\n *\n * @param value The value to set\n */\n set(value: T): void {\n ContextStore.set<T>(this.symbol, value);\n }\n\n /**\n * Checks if this key exists in the context.\n *\n * @returns True if the key exists\n */\n exists(): boolean {\n return ContextStore.has(this.symbol);\n }\n\n /**\n * Deletes this key from the context.\n *\n * @returns True if the key was deleted\n */\n delete(): boolean {\n return ContextStore.delete(this.symbol);\n }\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"crypto.utils.js","sourceRoot":"","sources":["../../../src/utils/crypto.utils.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The MIT License\n *\n * Copyright (c) 2025 Catbee Technologies. https://catbee-utils.npm.hprasath.com/license\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\nimport {\n createHmac,\n createHash,\n BinaryToTextEncoding,\n randomBytes,\n createCipheriv,\n createDecipheriv,\n scrypt,\n timingSafeEqual,\n CipherGCMTypes\n} from 'crypto';\nimport { promisify } from 'util';\nimport { uuid } from './id.utils';\n\nexport type BufferEncoding =\n | 'ascii'\n | 'utf8'\n | 'utf-8'\n | 'utf16le'\n | 'utf-16le'\n | 'ucs2'\n | 'ucs-2'\n | 'base64'\n | 'base64url'\n | 'latin1'\n | 'binary'\n | 'hex';\n\n/**\n * Generates an HMAC digest using the specified algorithm and secret key.\n *\n * @param {string} algorithm - The hashing algorithm (e.g., 'sha256', 'sha1').\n * @param {string} input - The string to hash.\n * @param {string} secret - The secret key for HMAC.\n * @param {BinaryToTextEncoding} [encoding='hex'] - Output encoding ('hex', 'base64', etc).\n * @returns {string} HMAC digest as a string.\n */\nexport function hmac(algorithm: string, input: string, secret: string, encoding: BinaryToTextEncoding = 'hex'): string {\n return createHmac(algorithm, secret).update(input).digest(encoding);\n}\n\n/**\n * Generates a hash digest using the specified algorithm.\n *\n * @param {string} algorithm - The hashing algorithm (e.g., 'sha256', 'md5').\n * @param {string} input - The string to hash.\n * @param {BinaryToTextEncoding} [encoding='hex'] - Output encoding ('hex', 'base64', etc).\n * @returns {string} Hash digest as a string.\n */\nexport function hash(algorithm: string, input: string, encoding: BinaryToTextEncoding = 'hex'): string {\n return createHash(algorithm).update(input).digest(encoding);\n}\n\n/**\n * Generates an HMAC-SHA256 digest.\n *\n * @param {string} input - The string to hash.\n * @param {string} secret - The secret key.\n * @returns {string} SHA-256 HMAC digest as a string.\n */\nexport function sha256Hmac(input: string, secret: string): string {\n return hmac('sha256', input, secret);\n}\n\n/**\n * Generates a SHA1 hash digest.\n *\n * @param {string} input - The string to hash.\n * @param {BinaryToTextEncoding} [encoding='hex'] - Output encoding.\n * @returns {string} SHA-1 hash as a string.\n */\nexport function sha1(input: string, encoding: BinaryToTextEncoding = 'hex'): string {\n return hash('sha1', input, encoding);\n}\n\n/**\n * Generates a SHA256 hash digest.\n *\n * @param {string} input - The string to hash.\n * @param {BinaryToTextEncoding} [encoding='hex'] - Output encoding.\n * @returns {string} SHA-256 hash as a string.\n */\nexport function sha256(input: string, encoding: BinaryToTextEncoding = 'hex'): string {\n return hash('sha256', input, encoding);\n}\n\n/**\n * Generates an MD5 hash digest.\n *\n * @param {string} input - The string to hash.\n * @returns {string} MD5 hash as a string.\n */\nexport function md5(input: string): string {\n return hash('md5', input);\n}\n\n/**\n * Generates a cryptographically strong random string by hashing a random UUID with SHA-256.\n *\n * @returns {string} Random string hashed with SHA-256 (hex encoding).\n */\nexport function randomString(): string {\n return sha256(uuid());\n}\n\n/**\n * Generates a secure random buffer of specified byte length.\n *\n * @param {number} [byteLength=32] - Number of random bytes to generate.\n * @returns {Buffer} Buffer containing random bytes.\n */\nexport function generateRandomBytes(byteLength: number = 32): Buffer {\n return randomBytes(byteLength);\n}\n\n/**\n * Generates a secure random string of specified byte length with specified encoding.\n *\n * @param {number} [byteLength=32] - Number of random bytes to generate.\n * @param {BinaryToTextEncoding} [encoding='hex'] - Output encoding.\n * @returns {string} Random string in specified encoding.\n */\nexport function generateRandomBytesAsString(byteLength: number = 32, encoding: BinaryToTextEncoding = 'hex'): string {\n return randomBytes(byteLength).toString(encoding);\n}\n\n/**\n * Generates a secure API key with a specified format.\n *\n * @param {string} [prefix=''] - Optional prefix for the key.\n * @param {number} [byteLength=24] - Number of random bytes to generate.\n * @returns {string} Formatted API key.\n */\nexport function generateApiKey(prefix: string = '', byteLength: number = 24): string {\n const randomString = generateRandomBytesAsString(byteLength, 'base64');\n const key = randomString\n .replace(/[+/=]/g, '') // Remove non-URL-safe characters\n .substring(0, 32); // Limit length\n\n return prefix ? `${prefix}_${key}` : key;\n}\n\n/**\n * Compares two strings, arrays, or buffers in constant time to prevent timing attacks.\n *\n * @param {string | Buffer | Uint8Array} a - First value to compare\n * @param {string | Buffer | Uint8Array} b - Second value to compare\n * @returns {boolean} True if values are equal\n */\nexport function safeCompare(a: string | Buffer | Uint8Array, b: string | Buffer | Uint8Array): boolean {\n if (typeof a === 'string' && typeof b === 'string') {\n // Convert strings to buffers\n const bufA = Buffer.from(a);\n const bufB = Buffer.from(b);\n\n // Compare lengths first (not constant time, but prevents timing attack on contents)\n if (bufA.length !== bufB.length) return false;\n\n return timingSafeEqual(bufA, bufB);\n } else if ((a instanceof Buffer || a instanceof Uint8Array) && (b instanceof Buffer || b instanceof Uint8Array)) {\n // Compare lengths first\n if (a.length !== b.length) return false;\n\n return timingSafeEqual(a instanceof Buffer ? a : Buffer.from(a), b instanceof Buffer ? b : Buffer.from(b));\n }\n\n throw new Error('Cannot compare: inputs must be strings, Buffers, or Uint8Arrays');\n}\n\n/**\n * Interface for encryption options\n */\nexport interface EncryptionOptions {\n /** Algorithm to use (default: aes-256-gcm) */\n algorithm?: CipherGCMTypes;\n /** Input encoding for plaintext if string (default: utf8) */\n inputEncoding?: BufferEncoding;\n /** Output encoding for ciphertext (default: hex) */\n outputEncoding?: BinaryToTextEncoding;\n}\n\n/**\n * Interface for decryption options\n */\nexport interface DecryptionOptions {\n /** Algorithm to use (default: aes-256-gcm) */\n algorithm?: CipherGCMTypes;\n /** Input encoding for ciphertext if string (default: hex) */\n inputEncoding?: BinaryToTextEncoding;\n /** Output encoding for plaintext (default: utf8) */\n outputEncoding?: BufferEncoding;\n}\n\n/**\n * Result of encryption operation including all data needed for decryption\n */\nexport interface EncryptionResult {\n /** Encrypted data (string or Buffer based on options) */\n ciphertext: string | Buffer;\n /** Initialization vector */\n iv: Buffer;\n /** Authentication tag (for GCM mode) */\n authTag?: Buffer;\n /** Algorithm used */\n algorithm: string;\n}\n\n// Promisified version of scrypt for key derivation\nconst scryptAsync = promisify<string | Buffer, string | Buffer, number, Buffer>(scrypt);\n\n/**\n * Encrypts data using a symmetric key with secure defaults (AES-256-GCM).\n *\n * @param {string | Buffer} data - Data to encrypt\n * @param {string | Buffer} key - Encryption key or passphrase\n * @param {EncryptionOptions} [options] - Encryption options\n * @returns {Promise<EncryptionResult>} Encrypted data with metadata\n */\nexport async function encrypt(\n data: string | Buffer,\n key: string | Buffer,\n options: EncryptionOptions = {}\n): Promise<EncryptionResult> {\n const algorithm = options.algorithm || 'aes-256-gcm';\n const inputEncoding = options.inputEncoding || 'utf8';\n const outputEncoding = options.outputEncoding || 'hex';\n\n // Generate a random IV\n const iv = randomBytes(16);\n\n // Derive key using scrypt if key is a string (passphrase)\n const derivedKey = typeof key === 'string' ? await scryptAsync(key, iv.slice(0, 8), 32) : key;\n\n // Create cipher\n const cipher = createCipheriv(algorithm, derivedKey, iv);\n\n // Encrypt the data\n let ciphertext: string | Buffer;\n\n if (typeof data === 'string') {\n ciphertext = cipher.update(data, inputEncoding, outputEncoding as BufferEncoding);\n ciphertext += cipher.final(outputEncoding as BufferEncoding);\n } else {\n const encrypted = Buffer.concat([cipher.update(data), cipher.final()]);\n ciphertext = outputEncoding ? encrypted.toString(outputEncoding) : encrypted;\n }\n\n // Get authentication tag if using GCM mode\n const authTag = algorithm.includes('gcm') ? (cipher as any).getAuthTag() : undefined;\n\n return {\n ciphertext,\n iv,\n authTag,\n algorithm\n };\n}\n\n/**\n * Decrypts data that was encrypted with the encrypt function.\n *\n * @param {EncryptionResult} encryptedData - The encrypted data and metadata\n * @param {string | Buffer} key - Decryption key or passphrase\n * @param {DecryptionOptions} [options] - Decryption options\n * @returns {Promise<string | Buffer>} Decrypted data\n */\nexport async function decrypt(\n encryptedData: EncryptionResult,\n key: string | Buffer,\n options: DecryptionOptions = {}\n): Promise<string | Buffer> {\n const algorithm = options.algorithm || encryptedData.algorithm || 'aes-256-gcm';\n const inputEncoding = options.inputEncoding || 'hex';\n const outputEncoding = options.outputEncoding || 'utf8';\n\n // Derive key using scrypt if key is a string (passphrase)\n const derivedKey = typeof key === 'string' ? await scryptAsync(key, encryptedData.iv.slice(0, 8), 32) : key;\n\n // Create decipher\n const decipher = createDecipheriv(algorithm, derivedKey, encryptedData.iv);\n\n // Set auth tag if using GCM mode\n if (encryptedData.authTag && algorithm.includes('gcm')) {\n (decipher as any).setAuthTag(encryptedData.authTag);\n }\n\n // Decrypt the data\n let decrypted: string | Buffer;\n\n if (typeof encryptedData.ciphertext === 'string') {\n decrypted = decipher.update(encryptedData.ciphertext, inputEncoding as BufferEncoding, outputEncoding);\n decrypted += decipher.final(outputEncoding);\n } else {\n const result = Buffer.concat([decipher.update(encryptedData.ciphertext), decipher.final()]);\n decrypted = outputEncoding ? result.toString(outputEncoding) : result;\n }\n\n return decrypted;\n}\n\n/**\n * Creates a signed token with an expiration time and payload.\n *\n * @param {object} payload - Data to include in the token\n * @param {string} secret - Secret key for signing\n * @param {number} [expiresInSeconds=3600] - Token expiration in seconds\n * @returns {string} Signed token string\n */\nexport function createSignedToken(\n payload: Record<string, any>,\n secret: string,\n expiresInSeconds: number = 3600\n): string {\n // Create payload with expiration\n const tokenPayload = {\n ...payload,\n exp: Math.floor(Date.now() / 1000) + expiresInSeconds\n };\n\n // Convert to string\n const payloadStr = JSON.stringify(tokenPayload);\n\n // Base64 encode the payload\n const base64Payload = Buffer.from(payloadStr).toString('base64url');\n\n // Create signature\n const signature = hmac('sha256', base64Payload, secret, 'base64url');\n\n // Combine payload and signature\n return `${base64Payload}.${signature}`;\n}\n\n/**\n * Verifies and decodes a signed token.\n *\n * @param {string} token - The token to verify\n * @param {string} secret - Secret key for verification\n * @returns {object | null} Decoded payload if valid, null if invalid\n */\nexport function verifySignedToken(token: string, secret: string): Record<string, any> | null {\n try {\n // Split token into parts\n const [payloadB64, signature] = token.split('.');\n\n if (!payloadB64 || !signature) return null;\n\n // Verify signature\n const expectedSignature = hmac('sha256', payloadB64, secret, 'base64url');\n if (!safeCompare(signature, expectedSignature)) return null;\n\n // Decode payload\n const payloadStr = Buffer.from(payloadB64, 'base64url').toString('utf8');\n const payload = JSON.parse(payloadStr);\n\n // Check expiration\n if (payload.exp && payload.exp < Math.floor(Date.now() / 1000)) {\n return null;\n }\n\n return payload;\n } catch {\n return null;\n }\n}\n"]}