@nest-omni/core 4.1.3-3 → 4.1.3-30

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 (370) hide show
  1. package/audit/audit.module.d.ts +1 -0
  2. package/audit/audit.module.js +51 -2
  3. package/audit/controllers/audit.controller.d.ts +57 -1
  4. package/audit/controllers/audit.controller.js +43 -0
  5. package/audit/decorators/audit-action.decorator.d.ts +74 -0
  6. package/audit/decorators/audit-action.decorator.js +42 -0
  7. package/audit/decorators/audit-controller.decorator.d.ts +1 -1
  8. package/audit/decorators/audit-controller.decorator.js +2 -2
  9. package/audit/decorators/audit-operation.decorator.d.ts +0 -7
  10. package/audit/decorators/audit-operation.decorator.js +0 -7
  11. package/audit/decorators/entity-audit.decorator.d.ts +78 -2
  12. package/audit/decorators/entity-audit.decorator.js +145 -4
  13. package/audit/decorators/index.d.ts +2 -0
  14. package/audit/decorators/index.js +2 -0
  15. package/audit/dto/audit-action-query.dto.d.ts +13 -0
  16. package/audit/dto/audit-action-query.dto.js +77 -0
  17. package/audit/dto/index.d.ts +1 -0
  18. package/audit/dto/index.js +1 -0
  19. package/audit/entities/audit-action-summary.entity.d.ts +23 -0
  20. package/audit/entities/audit-action-summary.entity.js +101 -0
  21. package/audit/entities/entity-audit-log.entity.d.ts +7 -2
  22. package/audit/entities/entity-audit-log.entity.js +45 -9
  23. package/audit/entities/entity-transaction.entity.d.ts +8 -2
  24. package/audit/entities/entity-transaction.entity.js +39 -3
  25. package/audit/entities/index.d.ts +3 -0
  26. package/audit/entities/index.js +3 -0
  27. package/audit/entities/manual-operation-log.entity.d.ts +0 -2
  28. package/audit/entities/manual-operation-log.entity.js +8 -9
  29. package/audit/enums/audit.enums.d.ts +14 -6
  30. package/audit/enums/audit.enums.js +18 -9
  31. package/audit/examples/decorator-value-mapping.example.d.ts +70 -0
  32. package/audit/examples/decorator-value-mapping.example.js +414 -0
  33. package/audit/index.d.ts +5 -1
  34. package/audit/index.js +29 -2
  35. package/audit/interceptors/audit-action.interceptor.d.ts +39 -0
  36. package/audit/interceptors/audit-action.interceptor.js +217 -0
  37. package/audit/interceptors/audit.interceptor.d.ts +1 -0
  38. package/audit/interceptors/audit.interceptor.js +19 -11
  39. package/audit/interceptors/index.d.ts +1 -0
  40. package/audit/interceptors/index.js +1 -0
  41. package/audit/interfaces/audit.interfaces.d.ts +132 -4
  42. package/audit/services/audit-action.service.d.ts +142 -0
  43. package/audit/services/audit-action.service.js +246 -0
  44. package/audit/services/audit-context.service.d.ts +91 -0
  45. package/audit/services/audit-context.service.js +170 -0
  46. package/audit/services/entity-audit.service.d.ts +220 -9
  47. package/audit/services/entity-audit.service.js +761 -72
  48. package/audit/services/index.d.ts +3 -0
  49. package/audit/services/index.js +3 -0
  50. package/audit/services/manual-audit-log.service.d.ts +23 -23
  51. package/audit/services/manual-audit-log.service.js +34 -57
  52. package/audit/services/multi-database.service.d.ts +0 -5
  53. package/audit/services/multi-database.service.js +0 -24
  54. package/audit/services/operation-description.service.d.ts +14 -3
  55. package/audit/services/operation-description.service.js +165 -26
  56. package/audit/services/transaction-audit.service.d.ts +1 -0
  57. package/audit/services/transaction-audit.service.js +12 -9
  58. package/audit/subscribers/entity-audit.subscriber.d.ts +5 -0
  59. package/audit/subscribers/entity-audit.subscriber.js +69 -5
  60. package/cache/cache.module.d.ts +7 -8
  61. package/cache/cache.module.js +15 -13
  62. package/cache/cache.service.d.ts +6 -4
  63. package/cache/cache.service.js +24 -12
  64. package/cache/decorators/cache-put.decorator.js +5 -4
  65. package/cache/dependencies/callback.dependency.js +9 -0
  66. package/cache/dependencies/db.dependency.d.ts +43 -12
  67. package/cache/dependencies/db.dependency.js +46 -18
  68. package/cache/dependencies/tag.dependency.d.ts +31 -4
  69. package/cache/dependencies/tag.dependency.js +100 -11
  70. package/cache/entities/index.d.ts +1 -0
  71. package/cache/entities/index.js +17 -0
  72. package/cache/entities/typeorm-cache.entity.d.ts +71 -0
  73. package/cache/entities/typeorm-cache.entity.js +110 -0
  74. package/cache/index.d.ts +2 -1
  75. package/cache/index.js +19 -2
  76. package/cache/interfaces/cache-options.interface.d.ts +8 -0
  77. package/cache/providers/index.d.ts +2 -1
  78. package/cache/providers/index.js +2 -1
  79. package/cache/providers/lrucache.provider.d.ts +77 -0
  80. package/cache/providers/lrucache.provider.js +228 -0
  81. package/cache/providers/redis-cache.provider.d.ts +1 -0
  82. package/cache/providers/redis-cache.provider.js +8 -6
  83. package/cache/providers/typeorm-cache.provider.d.ts +211 -0
  84. package/cache/providers/typeorm-cache.provider.js +483 -0
  85. package/common/boilerplate.polyfill.d.ts +1 -0
  86. package/common/boilerplate.polyfill.js +18 -1
  87. package/common/helpers/validation-metadata-helper.d.ts +112 -0
  88. package/common/helpers/validation-metadata-helper.js +164 -0
  89. package/common/index.d.ts +1 -0
  90. package/common/index.js +4 -0
  91. package/decorators/examples/field-i18n.example.d.ts +294 -0
  92. package/decorators/examples/field-i18n.example.js +478 -0
  93. package/decorators/field.decorators.d.ts +95 -3
  94. package/decorators/field.decorators.js +152 -18
  95. package/decorators/transform.decorators.d.ts +0 -2
  96. package/decorators/transform.decorators.js +0 -23
  97. package/decorators/translate.decorator.d.ts +26 -0
  98. package/decorators/translate.decorator.js +26 -1
  99. package/email-log/email-log.constants.d.ts +8 -0
  100. package/email-log/email-log.constants.js +11 -0
  101. package/email-log/email-log.module.d.ts +47 -0
  102. package/email-log/email-log.module.js +140 -0
  103. package/email-log/index.d.ts +11 -0
  104. package/email-log/index.js +48 -0
  105. package/email-log/interfaces/email-log-options.interface.d.ts +61 -0
  106. package/email-log/interfaces/email-log-options.interface.js +134 -0
  107. package/email-log/interfaces/email-log-transport.interface.d.ts +20 -0
  108. package/email-log/interfaces/email-log-transport.interface.js +2 -0
  109. package/email-log/interfaces/index.d.ts +2 -0
  110. package/email-log/interfaces/index.js +18 -0
  111. package/email-log/providers/email-provider.d.ts +42 -0
  112. package/email-log/providers/email-provider.js +127 -0
  113. package/email-log/providers/index.d.ts +1 -0
  114. package/email-log/providers/index.js +17 -0
  115. package/email-log/services/email-log-alert.service.d.ts +46 -0
  116. package/email-log/services/email-log-alert.service.js +162 -0
  117. package/email-log/services/email-log-formatter.service.d.ts +78 -0
  118. package/email-log/services/email-log-formatter.service.js +442 -0
  119. package/email-log/services/email-log-logger.service.d.ts +85 -0
  120. package/email-log/services/email-log-logger.service.js +168 -0
  121. package/email-log/services/email-log-rate-limiter.service.d.ts +42 -0
  122. package/email-log/services/email-log-rate-limiter.service.js +110 -0
  123. package/email-log/services/email-log-transport.service.d.ts +80 -0
  124. package/email-log/services/email-log-transport.service.js +271 -0
  125. package/email-log/services/index.d.ts +5 -0
  126. package/email-log/services/index.js +21 -0
  127. package/email-log/transports/index.d.ts +1 -0
  128. package/email-log/transports/index.js +17 -0
  129. package/email-log/transports/pino-email.transport.d.ts +56 -0
  130. package/email-log/transports/pino-email.transport.js +188 -0
  131. package/email-log/utils/index.d.ts +2 -0
  132. package/email-log/utils/index.js +18 -0
  133. package/email-log/utils/log-level.helper.d.ts +46 -0
  134. package/email-log/utils/log-level.helper.js +74 -0
  135. package/email-log/utils/pino-transport.utils.d.ts +135 -0
  136. package/email-log/utils/pino-transport.utils.js +238 -0
  137. package/file-upload/controllers/file-access.controller.d.ts +23 -0
  138. package/file-upload/controllers/file-access.controller.js +128 -0
  139. package/file-upload/decorators/column.decorator.d.ts +151 -0
  140. package/file-upload/decorators/column.decorator.js +273 -0
  141. package/file-upload/decorators/csv-data.decorator.d.ts +30 -0
  142. package/file-upload/decorators/csv-data.decorator.js +85 -0
  143. package/file-upload/decorators/csv-import.decorator.d.ts +34 -0
  144. package/file-upload/decorators/csv-import.decorator.js +24 -0
  145. package/file-upload/decorators/examples/column-mapping.example.d.ts +76 -0
  146. package/file-upload/decorators/examples/column-mapping.example.js +122 -0
  147. package/file-upload/decorators/excel-data.decorator.d.ts +30 -0
  148. package/file-upload/decorators/excel-data.decorator.js +85 -0
  149. package/file-upload/decorators/file-upload.decorator.d.ts +83 -0
  150. package/file-upload/decorators/file-upload.decorator.js +172 -0
  151. package/file-upload/decorators/index.d.ts +5 -0
  152. package/file-upload/decorators/index.js +38 -0
  153. package/file-upload/decorators/process.decorator.d.ts +40 -0
  154. package/file-upload/decorators/process.decorator.js +52 -0
  155. package/file-upload/decorators/validate-data.decorator.d.ts +91 -0
  156. package/file-upload/decorators/validate-data.decorator.js +39 -0
  157. package/file-upload/dto/create-file.dto.d.ts +24 -0
  158. package/file-upload/dto/create-file.dto.js +112 -0
  159. package/file-upload/dto/find-files.dto.d.ts +15 -0
  160. package/file-upload/dto/find-files.dto.js +76 -0
  161. package/file-upload/dto/index.d.ts +4 -0
  162. package/file-upload/dto/index.js +20 -0
  163. package/file-upload/dto/pagination.dto.d.ts +7 -0
  164. package/file-upload/dto/pagination.dto.js +39 -0
  165. package/file-upload/dto/update-file.dto.d.ts +15 -0
  166. package/file-upload/dto/update-file.dto.js +67 -0
  167. package/file-upload/entities/file-metadata.entity.d.ts +25 -0
  168. package/file-upload/entities/file-metadata.entity.js +76 -0
  169. package/file-upload/entities/file.entity.d.ts +114 -0
  170. package/file-upload/entities/file.entity.js +350 -0
  171. package/file-upload/entities/index.d.ts +2 -0
  172. package/file-upload/entities/index.js +18 -0
  173. package/file-upload/enums/file-type.enum.d.ts +72 -0
  174. package/file-upload/enums/file-type.enum.js +212 -0
  175. package/file-upload/exceptions/file-upload.exception.d.ts +57 -0
  176. package/file-upload/exceptions/file-upload.exception.js +120 -0
  177. package/file-upload/exceptions/index.d.ts +1 -0
  178. package/file-upload/exceptions/index.js +17 -0
  179. package/file-upload/file-upload.module.d.ts +89 -0
  180. package/file-upload/file-upload.module.js +292 -0
  181. package/file-upload/index.d.ts +37 -0
  182. package/file-upload/index.js +77 -0
  183. package/file-upload/interceptors/file-upload.interceptor.d.ts +101 -0
  184. package/file-upload/interceptors/file-upload.interceptor.js +594 -0
  185. package/file-upload/interceptors/index.d.ts +1 -0
  186. package/file-upload/interceptors/index.js +17 -0
  187. package/file-upload/interfaces/custom-file-type.interface.d.ts +72 -0
  188. package/file-upload/interfaces/custom-file-type.interface.js +2 -0
  189. package/file-upload/interfaces/file-buffer.interface.d.ts +72 -0
  190. package/file-upload/interfaces/file-buffer.interface.js +2 -0
  191. package/file-upload/interfaces/file-entity.interface.d.ts +142 -0
  192. package/file-upload/interfaces/file-entity.interface.js +28 -0
  193. package/file-upload/interfaces/file-metadata.interface.d.ts +21 -0
  194. package/file-upload/interfaces/file-metadata.interface.js +2 -0
  195. package/file-upload/interfaces/file-processor.interface.d.ts +93 -0
  196. package/file-upload/interfaces/file-processor.interface.js +2 -0
  197. package/file-upload/interfaces/file-upload-options.interface.d.ts +74 -0
  198. package/file-upload/interfaces/file-upload-options.interface.js +5 -0
  199. package/file-upload/interfaces/index.d.ts +7 -0
  200. package/file-upload/interfaces/index.js +24 -0
  201. package/file-upload/interfaces/processor-options.interface.d.ts +102 -0
  202. package/file-upload/interfaces/processor-options.interface.js +2 -0
  203. package/file-upload/interfaces/storage-provider.interface.d.ts +239 -0
  204. package/file-upload/interfaces/storage-provider.interface.js +2 -0
  205. package/file-upload/interfaces/upload-options.interface.d.ts +19 -0
  206. package/file-upload/interfaces/upload-options.interface.js +2 -0
  207. package/file-upload/processors/csv.processor.d.ts +98 -0
  208. package/file-upload/processors/csv.processor.js +391 -0
  209. package/file-upload/processors/excel.processor.d.ts +130 -0
  210. package/file-upload/processors/excel.processor.js +547 -0
  211. package/file-upload/processors/image.processor.d.ts +199 -0
  212. package/file-upload/processors/image.processor.js +377 -0
  213. package/file-upload/providers/index.d.ts +2 -0
  214. package/file-upload/providers/index.js +18 -0
  215. package/file-upload/providers/local-storage.provider.d.ts +98 -0
  216. package/file-upload/providers/local-storage.provider.js +484 -0
  217. package/file-upload/providers/s3-storage.provider.d.ts +87 -0
  218. package/file-upload/providers/s3-storage.provider.js +455 -0
  219. package/file-upload/services/file-signature-validator.service.d.ts +118 -0
  220. package/file-upload/services/file-signature-validator.service.js +376 -0
  221. package/file-upload/services/file.service.d.ts +193 -0
  222. package/file-upload/services/file.service.js +638 -0
  223. package/file-upload/services/index.d.ts +4 -0
  224. package/file-upload/services/index.js +20 -0
  225. package/file-upload/services/malicious-file-detector.service.d.ts +300 -0
  226. package/file-upload/services/malicious-file-detector.service.js +1234 -0
  227. package/file-upload/services/mime-registry.service.d.ts +47 -0
  228. package/file-upload/services/mime-registry.service.js +167 -0
  229. package/file-upload/utils/checksum.util.d.ts +28 -0
  230. package/file-upload/utils/checksum.util.js +65 -0
  231. package/file-upload/utils/dynamic-import.util.d.ts +54 -0
  232. package/file-upload/utils/dynamic-import.util.js +156 -0
  233. package/file-upload/utils/filename.util.d.ts +59 -0
  234. package/file-upload/utils/filename.util.js +184 -0
  235. package/file-upload/utils/filepath.util.d.ts +70 -0
  236. package/file-upload/utils/filepath.util.js +152 -0
  237. package/file-upload/utils/index.d.ts +4 -0
  238. package/file-upload/utils/index.js +20 -0
  239. package/filters/bad-request.filter.d.ts +9 -0
  240. package/filters/bad-request.filter.js +57 -16
  241. package/http-client/config/http-client.config.d.ts +5 -0
  242. package/http-client/config/http-client.config.js +27 -14
  243. package/http-client/decorators/http-client.decorators.d.ts +7 -28
  244. package/http-client/decorators/http-client.decorators.js +124 -99
  245. package/http-client/entities/http-log.entity.d.ts +0 -20
  246. package/http-client/entities/http-log.entity.js +1 -21
  247. package/http-client/examples/advanced-usage.example.d.ts +4 -5
  248. package/http-client/examples/advanced-usage.example.js +7 -59
  249. package/http-client/examples/axios-config-extended.example.d.ts +17 -0
  250. package/http-client/examples/axios-config-extended.example.js +311 -0
  251. package/http-client/examples/flexible-response-example.d.ts +28 -0
  252. package/http-client/examples/flexible-response-example.js +120 -0
  253. package/http-client/examples/index.d.ts +2 -0
  254. package/http-client/examples/index.js +2 -0
  255. package/http-client/examples/proxy-from-environment.example.d.ts +133 -0
  256. package/http-client/examples/proxy-from-environment.example.js +409 -0
  257. package/http-client/examples/ssl-certificate.example.d.ts +47 -0
  258. package/http-client/examples/ssl-certificate.example.js +432 -0
  259. package/http-client/http-client.module.d.ts +43 -2
  260. package/http-client/http-client.module.js +150 -90
  261. package/http-client/index.d.ts +1 -1
  262. package/http-client/interfaces/api-client-config.interface.d.ts +24 -103
  263. package/http-client/interfaces/http-client-config.interface.d.ts +137 -62
  264. package/http-client/services/api-client-registry.service.d.ts +8 -21
  265. package/http-client/services/api-client-registry.service.js +31 -282
  266. package/http-client/services/circuit-breaker.service.d.ts +69 -2
  267. package/http-client/services/circuit-breaker.service.js +185 -7
  268. package/http-client/services/http-client.service.d.ts +85 -23
  269. package/http-client/services/http-client.service.js +512 -168
  270. package/http-client/services/http-log-query.service.js +0 -13
  271. package/http-client/services/index.d.ts +0 -1
  272. package/http-client/services/index.js +0 -1
  273. package/http-client/services/logging.service.d.ts +69 -16
  274. package/http-client/services/logging.service.js +290 -170
  275. package/http-client/utils/call-stack-extractor.util.d.ts +26 -0
  276. package/http-client/utils/call-stack-extractor.util.js +35 -0
  277. package/http-client/utils/context-extractor.util.d.ts +2 -0
  278. package/http-client/utils/context-extractor.util.js +17 -3
  279. package/http-client/utils/curl-generator.util.js +2 -5
  280. package/http-client/utils/index.d.ts +2 -0
  281. package/http-client/utils/index.js +2 -0
  282. package/http-client/utils/proxy-environment.util.d.ts +42 -0
  283. package/http-client/utils/proxy-environment.util.js +154 -0
  284. package/http-client/utils/retry-recorder.util.d.ts +0 -4
  285. package/http-client/utils/retry-recorder.util.js +2 -27
  286. package/http-client/utils/sanitize.util.d.ts +58 -0
  287. package/http-client/utils/sanitize.util.js +188 -0
  288. package/http-client/utils/security-validator.util.d.ts +118 -0
  289. package/http-client/utils/security-validator.util.js +354 -0
  290. package/index.d.ts +4 -1
  291. package/index.js +6 -1
  292. package/interceptors/translation-interceptor.service.d.ts +7 -0
  293. package/interceptors/translation-interceptor.service.js +40 -8
  294. package/ip-filter/constants.d.ts +21 -0
  295. package/ip-filter/constants.js +24 -0
  296. package/ip-filter/decorators/index.d.ts +1 -0
  297. package/ip-filter/decorators/index.js +17 -0
  298. package/ip-filter/decorators/ip-filter.decorator.d.ts +58 -0
  299. package/ip-filter/decorators/ip-filter.decorator.js +79 -0
  300. package/ip-filter/guards/index.d.ts +1 -0
  301. package/ip-filter/guards/index.js +17 -0
  302. package/ip-filter/guards/ip-filter.guard.d.ts +62 -0
  303. package/ip-filter/guards/ip-filter.guard.js +174 -0
  304. package/ip-filter/index.d.ts +7 -0
  305. package/ip-filter/index.js +23 -0
  306. package/ip-filter/interfaces/index.d.ts +4 -0
  307. package/ip-filter/interfaces/index.js +20 -0
  308. package/ip-filter/interfaces/ip-filter-async-options.interface.d.ts +15 -0
  309. package/ip-filter/interfaces/ip-filter-async-options.interface.js +2 -0
  310. package/ip-filter/interfaces/ip-filter-metadata.interface.d.ts +26 -0
  311. package/ip-filter/interfaces/ip-filter-metadata.interface.js +2 -0
  312. package/ip-filter/interfaces/ip-filter-options.interface.d.ts +34 -0
  313. package/ip-filter/interfaces/ip-filter-options.interface.js +2 -0
  314. package/ip-filter/interfaces/ip-rule.interface.d.ts +36 -0
  315. package/ip-filter/interfaces/ip-rule.interface.js +2 -0
  316. package/ip-filter/ip-filter.module.d.ts +55 -0
  317. package/ip-filter/ip-filter.module.js +105 -0
  318. package/ip-filter/services/index.d.ts +1 -0
  319. package/ip-filter/services/index.js +17 -0
  320. package/ip-filter/services/ip-filter.service.d.ts +92 -0
  321. package/ip-filter/services/ip-filter.service.js +238 -0
  322. package/ip-filter/utils/index.d.ts +1 -0
  323. package/ip-filter/utils/index.js +17 -0
  324. package/ip-filter/utils/ip-utils.d.ts +61 -0
  325. package/ip-filter/utils/ip-utils.js +162 -0
  326. package/package.json +34 -29
  327. package/providers/context.provider.d.ts +9 -0
  328. package/providers/context.provider.js +13 -0
  329. package/redis-lock/comprehensive-lock-cleanup.service.d.ts +94 -0
  330. package/redis-lock/comprehensive-lock-cleanup.service.js +253 -0
  331. package/redis-lock/index.d.ts +2 -0
  332. package/redis-lock/index.js +5 -1
  333. package/redis-lock/lock-heartbeat.service.d.ts +80 -0
  334. package/redis-lock/lock-heartbeat.service.js +232 -0
  335. package/redis-lock/redis-lock.module.d.ts +6 -0
  336. package/redis-lock/redis-lock.module.js +136 -77
  337. package/redis-lock/redis-lock.service.d.ts +31 -0
  338. package/redis-lock/redis-lock.service.js +124 -17
  339. package/setup/bootstrap.setup.d.ts +2 -1
  340. package/setup/bootstrap.setup.js +3 -2
  341. package/setup/index.d.ts +1 -0
  342. package/setup/index.js +1 -0
  343. package/setup/run-in-mode.decorator.d.ts +56 -0
  344. package/setup/run-in-mode.decorator.js +92 -0
  345. package/setup/schedule.decorator.d.ts +1 -0
  346. package/setup/schedule.decorator.js +28 -13
  347. package/setup/worker.decorator.js +10 -1
  348. package/shared/index.d.ts +1 -1
  349. package/shared/index.js +1 -1
  350. package/shared/{serviceRegistryModule.js → service-registry.module.js} +28 -17
  351. package/shared/services/api-config.service.d.ts +41 -0
  352. package/shared/services/api-config.service.js +166 -8
  353. package/shared/services/index.d.ts +0 -1
  354. package/shared/services/index.js +0 -1
  355. package/validators/custom-validate.validator.d.ts +1 -0
  356. package/validators/custom-validate.validator.js +1 -0
  357. package/validators/file-mimetype.validator.d.ts +0 -2
  358. package/validators/file-mimetype.validator.js +4 -6
  359. package/validators/is-exists.validator.d.ts +15 -6
  360. package/validators/is-exists.validator.js +8 -7
  361. package/validators/is-unique.validator.d.ts +22 -7
  362. package/validators/is-unique.validator.js +41 -17
  363. package/vault/vault-config.service.js +1 -1
  364. package/cache/providers/memory-cache.provider.d.ts +0 -49
  365. package/cache/providers/memory-cache.provider.js +0 -197
  366. package/http-client/services/cache.service.d.ts +0 -76
  367. package/http-client/services/cache.service.js +0 -333
  368. package/shared/services/validator.service.d.ts +0 -3
  369. package/shared/services/validator.service.js +0 -20
  370. /package/shared/{serviceRegistryModule.d.ts → service-registry.module.d.ts} +0 -0
@@ -0,0 +1,232 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
12
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
13
+ return new (P || (P = Promise))(function (resolve, reject) {
14
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
15
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
16
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
17
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
18
+ });
19
+ };
20
+ var LockHeartbeatService_1;
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ exports.LockHeartbeatService = void 0;
23
+ const common_1 = require("@nestjs/common");
24
+ /**
25
+ * Lock heartbeat service
26
+ *
27
+ * Provides heartbeat mechanism for distributed lock instances.
28
+ * Each instance sends periodic heartbeats to Redis to indicate it's alive.
29
+ * Dead instances can be detected by checking if their heartbeat has expired.
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * constructor(private heartbeatService: LockHeartbeatService) {}
34
+ *
35
+ * async isInstanceAlive(instanceId: string): Promise<boolean> {
36
+ * return this.heartbeatService.isInstanceAlive(instanceId);
37
+ * }
38
+ * ```
39
+ */
40
+ let LockHeartbeatService = LockHeartbeatService_1 = class LockHeartbeatService {
41
+ constructor() {
42
+ this.logger = new common_1.Logger(LockHeartbeatService_1.name);
43
+ this.redis = null;
44
+ this.heartbeatTimer = null;
45
+ /**
46
+ * Heartbeat interval in milliseconds
47
+ * @default 5000 (5 seconds) - reduced for faster failure detection
48
+ */
49
+ this.heartbeatInterval = 5000;
50
+ /**
51
+ * Heartbeat TTL in seconds (3x interval for safety)
52
+ * @default 15 (15 seconds) - adjusted to match new interval
53
+ */
54
+ this.heartbeatTtl = 15;
55
+ this.instanceId = this.getInstanceId();
56
+ }
57
+ onModuleInit() {
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ if (!this.redis) {
60
+ this.logger.warn('LockHeartbeatService initialized but no Redis client provided. Heartbeat functionality will not work.');
61
+ return;
62
+ }
63
+ // Send initial heartbeat
64
+ yield this.sendHeartbeat();
65
+ // Start periodic heartbeat
66
+ this.heartbeatTimer = setInterval(() => {
67
+ this.sendHeartbeat().catch((error) => {
68
+ this.logger.error('Failed to send heartbeat:', error);
69
+ });
70
+ }, this.heartbeatInterval);
71
+ this.logger.log(`Heartbeat started for instance: ${this.instanceId}`);
72
+ });
73
+ }
74
+ onModuleDestroy() {
75
+ return __awaiter(this, void 0, void 0, function* () {
76
+ // Stop heartbeat timer
77
+ if (this.heartbeatTimer) {
78
+ clearInterval(this.heartbeatTimer);
79
+ this.heartbeatTimer = null;
80
+ }
81
+ // Remove heartbeat record
82
+ yield this.removeHeartbeat();
83
+ this.logger.log('Heartbeat stopped');
84
+ });
85
+ }
86
+ /**
87
+ * Set Redis client (required for dependency injection)
88
+ */
89
+ setRedisClient(redis) {
90
+ this.redis = redis;
91
+ this.logger.log('Redis client set for LockHeartbeatService');
92
+ }
93
+ /**
94
+ * Send heartbeat to Redis
95
+ * Stores instance information with TTL
96
+ */
97
+ sendHeartbeat() {
98
+ return __awaiter(this, void 0, void 0, function* () {
99
+ if (!this.redis) {
100
+ return;
101
+ }
102
+ const key = `heartbeat:${this.instanceId}`;
103
+ const data = {
104
+ instanceId: this.instanceId,
105
+ timestamp: Date.now(),
106
+ pid: process.pid,
107
+ };
108
+ try {
109
+ // Set heartbeat with TTL (3x interval for safety)
110
+ yield this.redis.setex(key, this.heartbeatTtl, JSON.stringify(data));
111
+ }
112
+ catch (error) {
113
+ this.logger.error('Error sending heartbeat:', error);
114
+ }
115
+ });
116
+ }
117
+ /**
118
+ * Remove heartbeat record from Redis
119
+ */
120
+ removeHeartbeat() {
121
+ return __awaiter(this, void 0, void 0, function* () {
122
+ if (!this.redis) {
123
+ return;
124
+ }
125
+ const key = `heartbeat:${this.instanceId}`;
126
+ try {
127
+ yield this.redis.del(key);
128
+ }
129
+ catch (error) {
130
+ this.logger.error('Error removing heartbeat:', error);
131
+ }
132
+ });
133
+ }
134
+ /**
135
+ * Check if an instance is alive by checking its heartbeat
136
+ *
137
+ * @param instanceId - Instance identifier to check
138
+ * @returns True if instance is alive (heartbeat exists), false otherwise
139
+ */
140
+ isInstanceAlive(instanceId) {
141
+ return __awaiter(this, void 0, void 0, function* () {
142
+ if (!this.redis) {
143
+ this.logger.warn('Redis client not available, cannot check instance status');
144
+ return false;
145
+ }
146
+ const key = `heartbeat:${instanceId}`;
147
+ try {
148
+ const exists = yield this.redis.exists(key);
149
+ return exists === 1;
150
+ }
151
+ catch (error) {
152
+ this.logger.error(`Error checking instance ${instanceId} status:`, error);
153
+ return false;
154
+ }
155
+ });
156
+ }
157
+ /**
158
+ * Get heartbeat information for an instance
159
+ *
160
+ * @param instanceId - Instance identifier
161
+ * @returns Heartbeat data or null if not found
162
+ */
163
+ getHeartbeatInfo(instanceId) {
164
+ return __awaiter(this, void 0, void 0, function* () {
165
+ if (!this.redis) {
166
+ return null;
167
+ }
168
+ const key = `heartbeat:${instanceId}`;
169
+ try {
170
+ const data = yield this.redis.get(key);
171
+ if (!data) {
172
+ return null;
173
+ }
174
+ return JSON.parse(data);
175
+ }
176
+ catch (error) {
177
+ this.logger.error(`Error getting heartbeat info for ${instanceId}:`, error);
178
+ return null;
179
+ }
180
+ });
181
+ }
182
+ /**
183
+ * Get all active instances (with heartbeat)
184
+ *
185
+ * **Note**: Uses SCAN command to avoid blocking Redis in production.
186
+ *
187
+ * @returns Array of instance IDs that are currently alive
188
+ */
189
+ getActiveInstances() {
190
+ return __awaiter(this, void 0, void 0, function* () {
191
+ if (!this.redis) {
192
+ return [];
193
+ }
194
+ try {
195
+ let cursor = '0';
196
+ const pattern = 'heartbeat:*';
197
+ const allKeys = [];
198
+ // Use SCAN to iterate through keys without blocking Redis
199
+ do {
200
+ const [nextCursor, keys] = yield this.redis.scan(cursor, 'MATCH', pattern, 'COUNT', 100);
201
+ cursor = nextCursor;
202
+ allKeys.push(...keys);
203
+ } while (cursor !== '0');
204
+ return allKeys.map((key) => key.replace('heartbeat:', ''));
205
+ }
206
+ catch (error) {
207
+ this.logger.error('Error getting active instances:', error);
208
+ return [];
209
+ }
210
+ });
211
+ }
212
+ /**
213
+ * Get current instance ID
214
+ */
215
+ getInstanceId() {
216
+ // 1. Kubernetes Pod name
217
+ if (process.env.HOSTNAME) {
218
+ return process.env.HOSTNAME;
219
+ }
220
+ // 2. Custom instance ID
221
+ if (process.env.INSTANCE_ID) {
222
+ return process.env.INSTANCE_ID;
223
+ }
224
+ // 3. Generate unique ID
225
+ return `instance-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
226
+ }
227
+ };
228
+ exports.LockHeartbeatService = LockHeartbeatService;
229
+ exports.LockHeartbeatService = LockHeartbeatService = LockHeartbeatService_1 = __decorate([
230
+ (0, common_1.Injectable)(),
231
+ __metadata("design:paramtypes", [])
232
+ ], LockHeartbeatService);
@@ -34,6 +34,12 @@ export interface RedisLockModuleOptions {
34
34
  * Default retry delay in milliseconds
35
35
  */
36
36
  defaultRetryDelay?: number;
37
+ /**
38
+ * Enable automatic lock cleanup on startup
39
+ * This includes heartbeat mechanism and comprehensive cleanup
40
+ * @default true
41
+ */
42
+ enableCleanup?: boolean;
37
43
  }
38
44
  /**
39
45
  * Redis Lock module with distributed locking support
@@ -13,6 +13,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
13
13
  exports.RedisLockModule = exports.REDIS_LOCK_SERVICE = void 0;
14
14
  const common_1 = require("@nestjs/common");
15
15
  const redis_lock_service_1 = require("./redis-lock.service");
16
+ const lock_heartbeat_service_1 = require("./lock-heartbeat.service");
17
+ const comprehensive_lock_cleanup_service_1 = require("./comprehensive-lock-cleanup.service");
16
18
  const redis_lock_decorator_1 = require("./redis-lock.decorator");
17
19
  /**
18
20
  * Injection token for Redis Lock Service
@@ -52,44 +54,68 @@ let RedisLockModule = RedisLockModule_1 = class RedisLockModule {
52
54
  * Register Redis Lock module with options
53
55
  */
54
56
  static forRoot(options) {
55
- const { isGlobal = true, redisClient, defaultTtl, defaultKeyPrefix, defaultRetryCount, defaultRetryDelay, } = options;
56
- return {
57
- module: RedisLockModule_1,
58
- global: isGlobal,
59
- providers: [
60
- // Redis client provider
61
- {
62
- provide: 'REDIS_LOCK_CLIENT',
63
- useValue: redisClient,
57
+ const { isGlobal = true, redisClient, defaultTtl, defaultKeyPrefix, defaultRetryCount, defaultRetryDelay, enableCleanup = true, } = options;
58
+ const providers = [
59
+ // Redis client provider
60
+ {
61
+ provide: 'REDIS_LOCK_CLIENT',
62
+ useValue: redisClient,
63
+ },
64
+ // Redis Lock Service
65
+ {
66
+ provide: exports.REDIS_LOCK_SERVICE,
67
+ useFactory: () => {
68
+ const service = new redis_lock_service_1.RedisLockService();
69
+ service.setRedisClient(redisClient);
70
+ if (defaultTtl) {
71
+ service.setDefaultTtl(defaultTtl);
72
+ }
73
+ if (defaultKeyPrefix) {
74
+ service.setDefaultKeyPrefix(defaultKeyPrefix);
75
+ }
76
+ if (defaultRetryCount !== undefined) {
77
+ service.setDefaultRetryCount(defaultRetryCount);
78
+ }
79
+ if (defaultRetryDelay !== undefined) {
80
+ service.setDefaultRetryDelay(defaultRetryDelay);
81
+ }
82
+ return service;
64
83
  },
65
- // Redis Lock Service
66
- {
67
- provide: exports.REDIS_LOCK_SERVICE,
68
- useFactory: () => {
69
- const service = new redis_lock_service_1.RedisLockService();
70
- service.setRedisClient(redisClient);
71
- if (defaultTtl) {
72
- service.setDefaultTtl(defaultTtl);
73
- }
74
- if (defaultKeyPrefix) {
75
- service.setDefaultKeyPrefix(defaultKeyPrefix);
76
- }
77
- if (defaultRetryCount !== undefined) {
78
- service.setDefaultRetryCount(defaultRetryCount);
79
- }
80
- if (defaultRetryDelay !== undefined) {
81
- service.setDefaultRetryDelay(defaultRetryDelay);
82
- }
83
- return service;
84
- },
84
+ },
85
+ // Also provide the service class itself for direct injection
86
+ {
87
+ provide: redis_lock_service_1.RedisLockService,
88
+ useExisting: exports.REDIS_LOCK_SERVICE,
89
+ },
90
+ ];
91
+ const exportsList = [exports.REDIS_LOCK_SERVICE, redis_lock_service_1.RedisLockService];
92
+ // Add cleanup services if enabled
93
+ if (enableCleanup) {
94
+ providers.push(
95
+ // Heartbeat Service
96
+ {
97
+ provide: lock_heartbeat_service_1.LockHeartbeatService,
98
+ useFactory: () => {
99
+ const service = new lock_heartbeat_service_1.LockHeartbeatService();
100
+ service.setRedisClient(redisClient);
101
+ return service;
85
102
  },
86
- // Also provide the service class itself for direct injection
87
- {
88
- provide: redis_lock_service_1.RedisLockService,
89
- useExisting: exports.REDIS_LOCK_SERVICE,
103
+ },
104
+ // Comprehensive Cleanup Service
105
+ {
106
+ provide: comprehensive_lock_cleanup_service_1.ComprehensiveLockCleanupService,
107
+ useFactory: (lockService, heartbeatService) => {
108
+ return new comprehensive_lock_cleanup_service_1.ComprehensiveLockCleanupService(lockService, heartbeatService);
90
109
  },
91
- ],
92
- exports: [exports.REDIS_LOCK_SERVICE, redis_lock_service_1.RedisLockService],
110
+ inject: [redis_lock_service_1.RedisLockService, lock_heartbeat_service_1.LockHeartbeatService],
111
+ });
112
+ exportsList.push(lock_heartbeat_service_1.LockHeartbeatService, comprehensive_lock_cleanup_service_1.ComprehensiveLockCleanupService);
113
+ }
114
+ return {
115
+ module: RedisLockModule_1,
116
+ global: isGlobal,
117
+ providers,
118
+ exports: exportsList,
93
119
  };
94
120
  }
95
121
  /**
@@ -97,52 +123,85 @@ let RedisLockModule = RedisLockModule_1 = class RedisLockModule {
97
123
  */
98
124
  static forRootAsync(options) {
99
125
  var _a;
126
+ const providers = [
127
+ // Async options provider
128
+ {
129
+ provide: 'REDIS_LOCK_MODULE_OPTIONS',
130
+ useFactory: options.useFactory,
131
+ inject: options.inject || [],
132
+ },
133
+ // Redis client provider
134
+ {
135
+ provide: 'REDIS_LOCK_CLIENT',
136
+ useFactory: (moduleOptions) => moduleOptions.redisClient,
137
+ inject: ['REDIS_LOCK_MODULE_OPTIONS'],
138
+ },
139
+ // Redis Lock Service
140
+ {
141
+ provide: exports.REDIS_LOCK_SERVICE,
142
+ useFactory: (moduleOptions) => {
143
+ const service = new redis_lock_service_1.RedisLockService();
144
+ service.setRedisClient(moduleOptions.redisClient);
145
+ if (moduleOptions.defaultTtl) {
146
+ service.setDefaultTtl(moduleOptions.defaultTtl);
147
+ }
148
+ if (moduleOptions.defaultKeyPrefix) {
149
+ service.setDefaultKeyPrefix(moduleOptions.defaultKeyPrefix);
150
+ }
151
+ if (moduleOptions.defaultRetryCount !== undefined) {
152
+ service.setDefaultRetryCount(moduleOptions.defaultRetryCount);
153
+ }
154
+ if (moduleOptions.defaultRetryDelay !== undefined) {
155
+ service.setDefaultRetryDelay(moduleOptions.defaultRetryDelay);
156
+ }
157
+ return service;
158
+ },
159
+ inject: ['REDIS_LOCK_MODULE_OPTIONS'],
160
+ },
161
+ // Also provide the service class itself for direct injection
162
+ {
163
+ provide: redis_lock_service_1.RedisLockService,
164
+ useExisting: exports.REDIS_LOCK_SERVICE,
165
+ },
166
+ // Heartbeat Service
167
+ {
168
+ provide: lock_heartbeat_service_1.LockHeartbeatService,
169
+ useFactory: (moduleOptions) => {
170
+ // Only create if cleanup is enabled
171
+ if (moduleOptions.enableCleanup === false) {
172
+ return null;
173
+ }
174
+ const service = new lock_heartbeat_service_1.LockHeartbeatService();
175
+ service.setRedisClient(moduleOptions.redisClient);
176
+ return service;
177
+ },
178
+ inject: ['REDIS_LOCK_MODULE_OPTIONS'],
179
+ },
180
+ // Comprehensive Cleanup Service
181
+ {
182
+ provide: comprehensive_lock_cleanup_service_1.ComprehensiveLockCleanupService,
183
+ useFactory: (moduleOptions, lockService, heartbeatService) => {
184
+ // Only create if cleanup is enabled
185
+ if (moduleOptions.enableCleanup === false) {
186
+ return null;
187
+ }
188
+ return new comprehensive_lock_cleanup_service_1.ComprehensiveLockCleanupService(lockService, heartbeatService);
189
+ },
190
+ inject: ['REDIS_LOCK_MODULE_OPTIONS', redis_lock_service_1.RedisLockService, lock_heartbeat_service_1.LockHeartbeatService],
191
+ },
192
+ ];
193
+ const exportsList = [
194
+ exports.REDIS_LOCK_SERVICE,
195
+ redis_lock_service_1.RedisLockService,
196
+ lock_heartbeat_service_1.LockHeartbeatService,
197
+ comprehensive_lock_cleanup_service_1.ComprehensiveLockCleanupService,
198
+ ];
100
199
  return {
101
200
  module: RedisLockModule_1,
102
201
  global: (_a = options.isGlobal) !== null && _a !== void 0 ? _a : true,
103
202
  imports: options.imports || [],
104
- providers: [
105
- // Async options provider
106
- {
107
- provide: 'REDIS_LOCK_MODULE_OPTIONS',
108
- useFactory: options.useFactory,
109
- inject: options.inject || [],
110
- },
111
- // Redis client provider
112
- {
113
- provide: 'REDIS_LOCK_CLIENT',
114
- useFactory: (moduleOptions) => moduleOptions.redisClient,
115
- inject: ['REDIS_LOCK_MODULE_OPTIONS'],
116
- },
117
- // Redis Lock Service
118
- {
119
- provide: exports.REDIS_LOCK_SERVICE,
120
- useFactory: (moduleOptions) => {
121
- const service = new redis_lock_service_1.RedisLockService();
122
- service.setRedisClient(moduleOptions.redisClient);
123
- if (moduleOptions.defaultTtl) {
124
- service.setDefaultTtl(moduleOptions.defaultTtl);
125
- }
126
- if (moduleOptions.defaultKeyPrefix) {
127
- service.setDefaultKeyPrefix(moduleOptions.defaultKeyPrefix);
128
- }
129
- if (moduleOptions.defaultRetryCount !== undefined) {
130
- service.setDefaultRetryCount(moduleOptions.defaultRetryCount);
131
- }
132
- if (moduleOptions.defaultRetryDelay !== undefined) {
133
- service.setDefaultRetryDelay(moduleOptions.defaultRetryDelay);
134
- }
135
- return service;
136
- },
137
- inject: ['REDIS_LOCK_MODULE_OPTIONS'],
138
- },
139
- // Also provide the service class itself for direct injection
140
- {
141
- provide: redis_lock_service_1.RedisLockService,
142
- useExisting: exports.REDIS_LOCK_SERVICE,
143
- },
144
- ],
145
- exports: [exports.REDIS_LOCK_SERVICE, redis_lock_service_1.RedisLockService],
203
+ providers,
204
+ exports: exportsList,
146
205
  };
147
206
  }
148
207
  onModuleInit() {
@@ -69,6 +69,24 @@ export interface LockOptions {
69
69
  * @default 0 (no automatic extension)
70
70
  */
71
71
  autoExtend?: number;
72
+ /**
73
+ * Whether to use exponential backoff for retry attempts
74
+ * If true, retry delay will increase exponentially: retryDelay * 2^(attempt-1)
75
+ * @default false
76
+ */
77
+ useExponentialBackoff?: boolean;
78
+ /**
79
+ * Maximum retry delay in milliseconds when using exponential backoff
80
+ * Ensures retry delay doesn't grow indefinitely
81
+ * @default 60000 (60 seconds)
82
+ */
83
+ maxRetryDelay?: number;
84
+ /**
85
+ * Random jitter to add to retry delay in milliseconds
86
+ * Helps prevent synchronized retries across multiple instances
87
+ * @default 0 (no jitter)
88
+ */
89
+ retryJitter?: number;
72
90
  }
73
91
  export interface LockResult {
74
92
  /**
@@ -116,6 +134,7 @@ export declare class RedisLockService implements OnModuleInit {
116
134
  private static globalInstance;
117
135
  private readonly logger;
118
136
  private redis;
137
+ private instanceId;
119
138
  private readonly defaultOptions;
120
139
  constructor();
121
140
  /**
@@ -228,6 +247,8 @@ export declare class RedisLockService implements OnModuleInit {
228
247
  *
229
248
  * WARNING: Use with caution in production! This will forcefully delete locks.
230
249
  *
250
+ * **Note**: Uses SCAN command to avoid blocking Redis in production.
251
+ *
231
252
  * @param pattern - Lock pattern (e.g., 'MyService:*' or '*:migration:*')
232
253
  * @param keyPrefix - Key prefix (default: 'lock')
233
254
  * @returns Number of locks deleted
@@ -280,6 +301,8 @@ export declare class RedisLockService implements OnModuleInit {
280
301
  * Get all active locks with optional pattern filtering
281
302
  * Useful for monitoring and debugging
282
303
  *
304
+ * **Note**: Uses SCAN command to avoid blocking Redis in production.
305
+ *
283
306
  * @param pattern - Optional pattern to filter locks (e.g., 'MyService:*')
284
307
  * @param keyPrefix - Key prefix (default: 'lock')
285
308
  * @returns Array of active lock information
@@ -296,10 +319,18 @@ export declare class RedisLockService implements OnModuleInit {
296
319
  private getRedis;
297
320
  /**
298
321
  * Generate a unique lock value
322
+ * Format: instanceId:timestamp:random:pid
299
323
  *
300
324
  * @returns Unique lock identifier
301
325
  */
302
326
  private generateLockValue;
327
+ /**
328
+ * Get instance identifier
329
+ * Used to distinguish different process instances in distributed environments
330
+ *
331
+ * @returns Instance identifier
332
+ */
333
+ private getInstanceId;
303
334
  /**
304
335
  * Build the full Redis key for a lock
305
336
  *