@nest-omni/core 4.1.3-2 → 4.1.3-20

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 (386) hide show
  1. package/audit/audit.module.d.ts +10 -0
  2. package/audit/audit.module.js +63 -1
  3. package/audit/controllers/audit.controller.d.ts +88 -0
  4. package/audit/controllers/audit.controller.js +74 -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 +9 -1
  8. package/audit/decorators/audit-controller.decorator.js +11 -2
  9. package/audit/decorators/audit-operation.decorator.d.ts +45 -0
  10. package/audit/decorators/audit-operation.decorator.js +49 -0
  11. package/audit/decorators/entity-audit.decorator.d.ts +85 -1
  12. package/audit/decorators/entity-audit.decorator.js +153 -3
  13. package/audit/decorators/index.d.ts +2 -0
  14. package/audit/decorators/index.js +2 -0
  15. package/audit/dto/audit-log-query.dto.d.ts +3 -0
  16. package/audit/dto/audit-log-query.dto.js +3 -0
  17. package/audit/dto/begin-transaction.dto.d.ts +3 -0
  18. package/audit/dto/begin-transaction.dto.js +3 -0
  19. package/audit/dto/compare-entities.dto.d.ts +3 -0
  20. package/audit/dto/compare-entities.dto.js +3 -0
  21. package/audit/dto/pre-check-restore.dto.d.ts +3 -0
  22. package/audit/dto/pre-check-restore.dto.js +3 -0
  23. package/audit/dto/restore-entity.dto.d.ts +3 -0
  24. package/audit/dto/restore-entity.dto.js +3 -0
  25. package/audit/entities/audit-action-summary.entity.d.ts +23 -0
  26. package/audit/entities/audit-action-summary.entity.js +101 -0
  27. package/audit/entities/entity-audit-log.entity.d.ts +11 -0
  28. package/audit/entities/entity-audit-log.entity.js +57 -2
  29. package/audit/entities/entity-transaction.entity.d.ts +11 -2
  30. package/audit/entities/entity-transaction.entity.js +42 -3
  31. package/audit/entities/index.d.ts +3 -0
  32. package/audit/entities/index.js +3 -0
  33. package/audit/entities/manual-operation-log.entity.d.ts +4 -0
  34. package/audit/entities/manual-operation-log.entity.js +12 -1
  35. package/audit/entities/operation-template.entity.d.ts +4 -0
  36. package/audit/entities/operation-template.entity.js +4 -0
  37. package/audit/enums/audit.enums.d.ts +37 -6
  38. package/audit/enums/audit.enums.js +40 -7
  39. package/audit/index.d.ts +4 -1
  40. package/audit/index.js +34 -1
  41. package/audit/interceptors/audit-action.interceptor.d.ts +38 -0
  42. package/audit/interceptors/audit-action.interceptor.js +215 -0
  43. package/audit/interceptors/audit.interceptor.d.ts +15 -0
  44. package/audit/interceptors/audit.interceptor.js +23 -1
  45. package/audit/interceptors/index.d.ts +1 -0
  46. package/audit/interceptors/index.js +1 -0
  47. package/audit/interfaces/audit.interfaces.d.ts +187 -2
  48. package/audit/services/audit-action.service.d.ts +141 -0
  49. package/audit/services/audit-action.service.js +244 -0
  50. package/audit/services/audit-context.service.d.ts +97 -0
  51. package/audit/services/audit-context.service.js +185 -0
  52. package/audit/services/audit-strategy.service.d.ts +6 -0
  53. package/audit/services/audit-strategy.service.js +13 -0
  54. package/audit/services/entity-audit.service.d.ts +230 -3
  55. package/audit/services/entity-audit.service.js +607 -14
  56. package/audit/services/index.d.ts +3 -0
  57. package/audit/services/index.js +3 -0
  58. package/audit/services/manual-audit-log.service.d.ts +134 -9
  59. package/audit/services/manual-audit-log.service.js +157 -40
  60. package/audit/services/multi-database.service.d.ts +9 -2
  61. package/audit/services/multi-database.service.js +9 -21
  62. package/audit/services/operation-description.service.d.ts +71 -2
  63. package/audit/services/operation-description.service.js +231 -20
  64. package/audit/services/transaction-audit.service.d.ts +30 -0
  65. package/audit/services/transaction-audit.service.js +53 -5
  66. package/audit/subscribers/entity-audit.subscriber.d.ts +19 -0
  67. package/audit/subscribers/entity-audit.subscriber.js +76 -1
  68. package/cache/cache-metrics.service.d.ts +67 -0
  69. package/cache/cache-metrics.service.js +68 -4
  70. package/cache/cache-serialization.service.d.ts +31 -0
  71. package/cache/cache-serialization.service.js +25 -0
  72. package/cache/cache.constants.d.ts +9 -0
  73. package/cache/cache.constants.js +9 -0
  74. package/cache/cache.health.d.ts +26 -0
  75. package/cache/cache.health.js +30 -0
  76. package/cache/cache.module.d.ts +82 -2
  77. package/cache/cache.module.js +76 -5
  78. package/cache/cache.service.d.ts +140 -0
  79. package/cache/cache.service.js +169 -0
  80. package/cache/cache.warmup.service.d.ts +39 -0
  81. package/cache/cache.warmup.service.js +32 -0
  82. package/cache/decorators/cache-evict.decorator.d.ts +47 -0
  83. package/cache/decorators/cache-evict.decorator.js +56 -0
  84. package/cache/decorators/cache-put.decorator.d.ts +34 -0
  85. package/cache/decorators/cache-put.decorator.js +39 -0
  86. package/cache/decorators/cacheable.decorator.d.ts +40 -0
  87. package/cache/decorators/cacheable.decorator.js +55 -0
  88. package/cache/dependencies/callback.dependency.d.ts +33 -0
  89. package/cache/dependencies/callback.dependency.js +39 -1
  90. package/cache/dependencies/chain.dependency.d.ts +28 -0
  91. package/cache/dependencies/chain.dependency.js +34 -0
  92. package/cache/dependencies/db.dependency.d.ts +83 -7
  93. package/cache/dependencies/db.dependency.js +89 -14
  94. package/cache/dependencies/file.dependency.d.ts +32 -0
  95. package/cache/dependencies/file.dependency.js +34 -0
  96. package/cache/dependencies/tag.dependency.d.ts +75 -4
  97. package/cache/dependencies/tag.dependency.js +145 -11
  98. package/cache/dependencies/time.dependency.d.ts +43 -0
  99. package/cache/dependencies/time.dependency.js +43 -0
  100. package/cache/examples/basic-usage.d.ts +15 -0
  101. package/cache/examples/basic-usage.js +62 -8
  102. package/cache/index.js +9 -0
  103. package/cache/interfaces/cache-dependency.interface.d.ts +53 -0
  104. package/cache/interfaces/cache-options.interface.d.ts +89 -0
  105. package/cache/interfaces/cache-options.interface.js +6 -0
  106. package/cache/interfaces/cache-provider.interface.d.ts +78 -0
  107. package/cache/providers/base-cache.provider.d.ts +14 -0
  108. package/cache/providers/base-cache.provider.js +16 -0
  109. package/cache/providers/cls-cache.provider.d.ts +20 -0
  110. package/cache/providers/cls-cache.provider.js +28 -0
  111. package/cache/providers/memory-cache.provider.d.ts +43 -0
  112. package/cache/providers/memory-cache.provider.js +66 -0
  113. package/cache/providers/redis-cache.provider.d.ts +26 -0
  114. package/cache/providers/redis-cache.provider.js +29 -0
  115. package/cache/utils/dependency-manager.util.d.ts +52 -0
  116. package/cache/utils/dependency-manager.util.js +59 -0
  117. package/cache/utils/key-generator.util.d.ts +42 -0
  118. package/cache/utils/key-generator.util.js +53 -1
  119. package/common/abstract.entity.d.ts +14 -0
  120. package/common/abstract.entity.js +14 -0
  121. package/common/boilerplate.polyfill.d.ts +142 -0
  122. package/common/boilerplate.polyfill.js +18 -1
  123. package/common/dto/dto-container.d.ts +16 -0
  124. package/common/dto/dto-container.js +20 -0
  125. package/common/dto/dto-decorators.d.ts +18 -0
  126. package/common/dto/dto-decorators.js +14 -0
  127. package/common/dto/dto-extensions.d.ts +11 -0
  128. package/common/dto/dto-extensions.js +9 -0
  129. package/common/dto/dto-service-accessor.d.ts +17 -0
  130. package/common/dto/dto-service-accessor.js +18 -0
  131. package/common/dto/dto-transformer.d.ts +12 -0
  132. package/common/dto/dto-transformer.js +9 -0
  133. package/common/dto/index.js +2 -0
  134. package/common/examples/paginate-and-map.example.d.ts +6 -0
  135. package/common/examples/paginate-and-map.example.js +26 -0
  136. package/common/utils.d.ts +15 -0
  137. package/common/utils.js +15 -0
  138. package/constants/language-code.js +1 -0
  139. package/decorators/field.decorators.d.ts +1 -1
  140. package/decorators/field.decorators.js +8 -1
  141. package/decorators/property.decorators.js +1 -0
  142. package/decorators/public-route.decorator.js +1 -0
  143. package/decorators/transform.decorators.d.ts +27 -0
  144. package/decorators/transform.decorators.js +29 -0
  145. package/decorators/translate.decorator.js +1 -0
  146. package/decorators/user.decorator.js +1 -0
  147. package/decorators/validator.decorators.d.ts +8 -18
  148. package/decorators/validator.decorators.js +22 -190
  149. package/file-upload/controllers/file-access.controller.d.ts +23 -0
  150. package/file-upload/controllers/file-access.controller.js +128 -0
  151. package/file-upload/decorators/column.decorator.d.ts +151 -0
  152. package/file-upload/decorators/column.decorator.js +273 -0
  153. package/file-upload/decorators/csv-data.decorator.d.ts +30 -0
  154. package/file-upload/decorators/csv-data.decorator.js +85 -0
  155. package/file-upload/decorators/csv-import.decorator.d.ts +34 -0
  156. package/file-upload/decorators/csv-import.decorator.js +24 -0
  157. package/file-upload/decorators/examples/column-mapping.example.d.ts +76 -0
  158. package/file-upload/decorators/examples/column-mapping.example.js +122 -0
  159. package/file-upload/decorators/excel-data.decorator.d.ts +30 -0
  160. package/file-upload/decorators/excel-data.decorator.js +85 -0
  161. package/file-upload/decorators/file-upload.decorator.d.ts +83 -0
  162. package/file-upload/decorators/file-upload.decorator.js +172 -0
  163. package/file-upload/decorators/index.d.ts +5 -0
  164. package/file-upload/decorators/index.js +38 -0
  165. package/file-upload/decorators/process.decorator.d.ts +40 -0
  166. package/file-upload/decorators/process.decorator.js +52 -0
  167. package/file-upload/decorators/validate-data.decorator.d.ts +91 -0
  168. package/file-upload/decorators/validate-data.decorator.js +39 -0
  169. package/file-upload/dto/create-file.dto.d.ts +24 -0
  170. package/file-upload/dto/create-file.dto.js +112 -0
  171. package/file-upload/dto/find-files.dto.d.ts +15 -0
  172. package/file-upload/dto/find-files.dto.js +76 -0
  173. package/file-upload/dto/index.d.ts +4 -0
  174. package/file-upload/dto/index.js +20 -0
  175. package/file-upload/dto/pagination.dto.d.ts +7 -0
  176. package/file-upload/dto/pagination.dto.js +39 -0
  177. package/file-upload/dto/update-file.dto.d.ts +15 -0
  178. package/file-upload/dto/update-file.dto.js +67 -0
  179. package/file-upload/entities/file-metadata.entity.d.ts +25 -0
  180. package/file-upload/entities/file-metadata.entity.js +76 -0
  181. package/file-upload/entities/file.entity.d.ts +114 -0
  182. package/file-upload/entities/file.entity.js +350 -0
  183. package/file-upload/entities/index.d.ts +2 -0
  184. package/file-upload/entities/index.js +18 -0
  185. package/file-upload/enums/file-type.enum.d.ts +72 -0
  186. package/file-upload/enums/file-type.enum.js +212 -0
  187. package/file-upload/exceptions/file-upload.exception.d.ts +57 -0
  188. package/file-upload/exceptions/file-upload.exception.js +120 -0
  189. package/file-upload/exceptions/index.d.ts +1 -0
  190. package/file-upload/exceptions/index.js +17 -0
  191. package/file-upload/file-upload.module.d.ts +89 -0
  192. package/file-upload/file-upload.module.js +292 -0
  193. package/file-upload/index.d.ts +37 -0
  194. package/file-upload/index.js +77 -0
  195. package/file-upload/interceptors/file-upload.interceptor.d.ts +101 -0
  196. package/file-upload/interceptors/file-upload.interceptor.js +594 -0
  197. package/file-upload/interceptors/index.d.ts +1 -0
  198. package/file-upload/interceptors/index.js +17 -0
  199. package/file-upload/interfaces/custom-file-type.interface.d.ts +72 -0
  200. package/file-upload/interfaces/custom-file-type.interface.js +2 -0
  201. package/file-upload/interfaces/file-buffer.interface.d.ts +72 -0
  202. package/file-upload/interfaces/file-buffer.interface.js +2 -0
  203. package/file-upload/interfaces/file-entity.interface.d.ts +142 -0
  204. package/file-upload/interfaces/file-entity.interface.js +28 -0
  205. package/file-upload/interfaces/file-metadata.interface.d.ts +21 -0
  206. package/file-upload/interfaces/file-metadata.interface.js +2 -0
  207. package/file-upload/interfaces/file-processor.interface.d.ts +93 -0
  208. package/file-upload/interfaces/file-processor.interface.js +2 -0
  209. package/file-upload/interfaces/file-upload-options.interface.d.ts +74 -0
  210. package/file-upload/interfaces/file-upload-options.interface.js +5 -0
  211. package/file-upload/interfaces/index.d.ts +7 -0
  212. package/file-upload/interfaces/index.js +24 -0
  213. package/file-upload/interfaces/processor-options.interface.d.ts +102 -0
  214. package/file-upload/interfaces/processor-options.interface.js +2 -0
  215. package/file-upload/interfaces/storage-provider.interface.d.ts +239 -0
  216. package/file-upload/interfaces/storage-provider.interface.js +2 -0
  217. package/file-upload/interfaces/upload-options.interface.d.ts +19 -0
  218. package/file-upload/interfaces/upload-options.interface.js +2 -0
  219. package/file-upload/processors/csv.processor.d.ts +98 -0
  220. package/file-upload/processors/csv.processor.js +391 -0
  221. package/file-upload/processors/excel.processor.d.ts +130 -0
  222. package/file-upload/processors/excel.processor.js +547 -0
  223. package/file-upload/processors/image.processor.d.ts +199 -0
  224. package/file-upload/processors/image.processor.js +377 -0
  225. package/file-upload/providers/index.d.ts +2 -0
  226. package/file-upload/providers/index.js +18 -0
  227. package/file-upload/providers/local-storage.provider.d.ts +98 -0
  228. package/file-upload/providers/local-storage.provider.js +484 -0
  229. package/file-upload/providers/s3-storage.provider.d.ts +87 -0
  230. package/file-upload/providers/s3-storage.provider.js +455 -0
  231. package/file-upload/services/file-signature-validator.service.d.ts +118 -0
  232. package/file-upload/services/file-signature-validator.service.js +376 -0
  233. package/file-upload/services/file.service.d.ts +193 -0
  234. package/file-upload/services/file.service.js +638 -0
  235. package/file-upload/services/index.d.ts +4 -0
  236. package/file-upload/services/index.js +20 -0
  237. package/file-upload/services/malicious-file-detector.service.d.ts +300 -0
  238. package/file-upload/services/malicious-file-detector.service.js +1234 -0
  239. package/file-upload/services/mime-registry.service.d.ts +47 -0
  240. package/file-upload/services/mime-registry.service.js +167 -0
  241. package/file-upload/utils/checksum.util.d.ts +28 -0
  242. package/file-upload/utils/checksum.util.js +65 -0
  243. package/file-upload/utils/dynamic-import.util.d.ts +54 -0
  244. package/file-upload/utils/dynamic-import.util.js +156 -0
  245. package/file-upload/utils/filename.util.d.ts +59 -0
  246. package/file-upload/utils/filename.util.js +184 -0
  247. package/file-upload/utils/filepath.util.d.ts +70 -0
  248. package/file-upload/utils/filepath.util.js +152 -0
  249. package/file-upload/utils/index.d.ts +4 -0
  250. package/file-upload/utils/index.js +20 -0
  251. package/filters/constraint-errors.js +1 -0
  252. package/helpers/common.helper.d.ts +13 -0
  253. package/helpers/common.helper.js +13 -0
  254. package/http-client/config/http-client.config.d.ts +20 -0
  255. package/http-client/config/http-client.config.js +48 -21
  256. package/http-client/decorators/http-client.decorators.d.ts +55 -14
  257. package/http-client/decorators/http-client.decorators.js +154 -78
  258. package/http-client/entities/http-log.entity.d.ts +217 -8
  259. package/http-client/entities/http-log.entity.js +7 -22
  260. package/http-client/errors/http-client.errors.d.ts +57 -0
  261. package/http-client/errors/http-client.errors.js +58 -0
  262. package/http-client/examples/advanced-usage.example.d.ts +40 -0
  263. package/http-client/examples/advanced-usage.example.js +53 -61
  264. package/http-client/examples/auth-with-waiting-lock.example.d.ts +31 -0
  265. package/http-client/examples/auth-with-waiting-lock.example.js +52 -5
  266. package/http-client/examples/basic-usage.example.d.ts +60 -0
  267. package/http-client/examples/basic-usage.example.js +60 -0
  268. package/http-client/examples/multi-api-configuration.example.d.ts +60 -0
  269. package/http-client/examples/multi-api-configuration.example.js +76 -5
  270. package/http-client/examples/proxy-from-environment.example.d.ts +133 -0
  271. package/http-client/examples/proxy-from-environment.example.js +409 -0
  272. package/http-client/http-client.module.d.ts +48 -2
  273. package/http-client/http-client.module.js +147 -68
  274. package/http-client/index.d.ts +1 -1
  275. package/http-client/index.js +8 -0
  276. package/http-client/interfaces/api-client-config.interface.d.ts +80 -45
  277. package/http-client/interfaces/api-client-config.interface.js +3 -0
  278. package/http-client/interfaces/http-client-config.interface.d.ts +109 -52
  279. package/http-client/services/api-client-registry.service.d.ts +50 -11
  280. package/http-client/services/api-client-registry.service.js +90 -250
  281. package/http-client/services/circuit-breaker.service.d.ts +115 -2
  282. package/http-client/services/circuit-breaker.service.js +237 -7
  283. package/http-client/services/http-client.service.d.ts +124 -14
  284. package/http-client/services/http-client.service.js +437 -148
  285. package/http-client/services/http-log-query.service.d.ts +83 -0
  286. package/http-client/services/http-log-query.service.js +121 -13
  287. package/http-client/services/http-replay.service.d.ts +101 -0
  288. package/http-client/services/http-replay.service.js +86 -0
  289. package/http-client/services/index.d.ts +0 -1
  290. package/http-client/services/index.js +0 -1
  291. package/http-client/services/log-cleanup.service.d.ts +63 -0
  292. package/http-client/services/log-cleanup.service.js +54 -2
  293. package/http-client/services/logging.service.d.ts +116 -7
  294. package/http-client/services/logging.service.js +349 -86
  295. package/http-client/utils/call-stack-extractor.util.d.ts +63 -0
  296. package/http-client/utils/call-stack-extractor.util.js +83 -0
  297. package/http-client/utils/context-extractor.util.d.ts +49 -0
  298. package/http-client/utils/context-extractor.util.js +52 -0
  299. package/http-client/utils/curl-generator.util.d.ts +21 -0
  300. package/http-client/utils/curl-generator.util.js +44 -3
  301. package/http-client/utils/index.d.ts +1 -0
  302. package/http-client/utils/index.js +1 -0
  303. package/http-client/utils/proxy-environment.util.d.ts +42 -0
  304. package/http-client/utils/proxy-environment.util.js +148 -0
  305. package/http-client/utils/request-id.util.d.ts +18 -0
  306. package/http-client/utils/request-id.util.js +20 -0
  307. package/http-client/utils/retry-recorder.util.d.ts +42 -0
  308. package/http-client/utils/retry-recorder.util.js +44 -0
  309. package/http-client/utils/security-validator.util.d.ts +118 -0
  310. package/http-client/utils/security-validator.util.js +352 -0
  311. package/index.d.ts +3 -1
  312. package/index.js +12 -1
  313. package/interceptors/translation-interceptor.service.js +5 -0
  314. package/package.json +11 -7
  315. package/providers/context.provider.js +2 -0
  316. package/providers/generator.provider.d.ts +4 -0
  317. package/providers/generator.provider.js +4 -0
  318. package/redis-lock/comprehensive-lock-cleanup.service.d.ts +94 -0
  319. package/redis-lock/comprehensive-lock-cleanup.service.js +253 -0
  320. package/redis-lock/examples/lock-strategy.examples.d.ts +89 -0
  321. package/redis-lock/examples/lock-strategy.examples.js +130 -15
  322. package/redis-lock/index.d.ts +2 -0
  323. package/redis-lock/index.js +8 -1
  324. package/redis-lock/lock-heartbeat.service.d.ts +80 -0
  325. package/redis-lock/lock-heartbeat.service.js +232 -0
  326. package/redis-lock/redis-lock.decorator.d.ts +101 -0
  327. package/redis-lock/redis-lock.decorator.js +120 -0
  328. package/redis-lock/redis-lock.module.d.ts +66 -0
  329. package/redis-lock/redis-lock.module.js +175 -70
  330. package/redis-lock/redis-lock.service.d.ts +282 -0
  331. package/redis-lock/redis-lock.service.js +343 -20
  332. package/setup/bootstrap.setup.d.ts +1 -0
  333. package/setup/bootstrap.setup.js +21 -0
  334. package/setup/index.d.ts +1 -0
  335. package/setup/index.js +1 -0
  336. package/setup/mode.setup.d.ts +44 -0
  337. package/setup/mode.setup.js +44 -0
  338. package/setup/run-in-mode.decorator.d.ts +56 -0
  339. package/setup/run-in-mode.decorator.js +92 -0
  340. package/setup/schedule.decorator.d.ts +227 -0
  341. package/setup/schedule.decorator.js +240 -12
  342. package/setup/worker.decorator.d.ts +86 -0
  343. package/setup/worker.decorator.js +97 -0
  344. package/shared/index.d.ts +1 -1
  345. package/shared/index.js +1 -1
  346. package/shared/{serviceRegistryModule.js → service-registry.module.js} +19 -17
  347. package/shared/services/api-config.service.d.ts +3 -0
  348. package/shared/services/api-config.service.js +21 -9
  349. package/shared/services/index.d.ts +0 -1
  350. package/shared/services/index.js +0 -1
  351. package/validator-json/decorators.d.ts +17 -0
  352. package/validator-json/decorators.js +17 -2
  353. package/validator-json/default.d.ts +6 -0
  354. package/validator-json/default.js +30 -2
  355. package/validator-json/defaultConverters.js +1 -0
  356. package/validator-json/options.d.ts +23 -0
  357. package/validators/common-validators.d.ts +143 -0
  358. package/validators/common-validators.js +249 -0
  359. package/validators/custom-validate.examples.d.ts +23 -0
  360. package/validators/custom-validate.examples.js +78 -6
  361. package/validators/custom-validate.validator.d.ts +108 -0
  362. package/validators/custom-validate.validator.js +85 -0
  363. package/validators/file-mimetype.validator.d.ts +0 -2
  364. package/validators/file-mimetype.validator.js +4 -6
  365. package/validators/index.d.ts +1 -0
  366. package/validators/index.js +1 -0
  367. package/validators/is-exists.validator.d.ts +26 -6
  368. package/validators/is-exists.validator.js +30 -7
  369. package/validators/is-unique.validator.d.ts +33 -7
  370. package/validators/is-unique.validator.js +59 -17
  371. package/validators/skip-empty.validator.d.ts +5 -0
  372. package/validators/skip-empty.validator.js +5 -0
  373. package/vault/interfaces/vault-options.interface.d.ts +9 -0
  374. package/vault/vault-config.loader.d.ts +30 -0
  375. package/vault/vault-config.loader.js +48 -1
  376. package/vault/vault-config.service.d.ts +53 -0
  377. package/vault/vault-config.service.js +57 -0
  378. package/vault/vault.module.d.ts +4 -0
  379. package/vault/vault.module.js +4 -0
  380. package/decorators/examples/validation-decorators.example.d.ts +0 -69
  381. package/decorators/examples/validation-decorators.example.js +0 -331
  382. package/http-client/services/cache.service.d.ts +0 -24
  383. package/http-client/services/cache.service.js +0 -264
  384. package/shared/services/validator.service.d.ts +0 -3
  385. package/shared/services/validator.service.js +0 -20
  386. /package/shared/{serviceRegistryModule.d.ts → service-registry.module.d.ts} +0 -0
@@ -0,0 +1,352 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SecurityValidator = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ /**
6
+ * 安全验证工具类
7
+ * 提供URL验证、SSRF防护等功能
8
+ */
9
+ class SecurityValidator {
10
+ /**
11
+ * 验证URL安全性
12
+ * @param url 要验证的URL字符串
13
+ * @param urlConfig URL验证配置
14
+ * @returns 验证结果和错误信息
15
+ */
16
+ static validateURL(url, urlConfig = {}) {
17
+ const config = Object.assign(Object.assign({}, this.defaultURLConfig), urlConfig);
18
+ // 检查URL长度
19
+ if (url.length > config.maxURLLength) {
20
+ return {
21
+ valid: false,
22
+ error: `URL length exceeds maximum allowed length of ${config.maxURLLength}`,
23
+ };
24
+ }
25
+ let parsedURL;
26
+ try {
27
+ parsedURL = new URL(url);
28
+ }
29
+ catch (error) {
30
+ return {
31
+ valid: false,
32
+ error: `Invalid URL format: ${error instanceof Error ? error.message : String(error)}`,
33
+ };
34
+ }
35
+ // 检查协议
36
+ if (!['http:', 'https:', 'ws:', 'wss:'].includes(parsedURL.protocol)) {
37
+ return {
38
+ valid: false,
39
+ error: `Unsupported protocol: ${parsedURL.protocol}`,
40
+ };
41
+ }
42
+ // 检查主机名
43
+ if (!parsedURL.hostname) {
44
+ return {
45
+ valid: false,
46
+ error: 'Hostname is required',
47
+ };
48
+ }
49
+ // 检查是否为IP地址
50
+ const ipAddress = this.extractIPAddress(parsedURL.hostname);
51
+ if (ipAddress) {
52
+ return this.validateIPAddress(ipAddress, config);
53
+ }
54
+ // 检查主机名格式
55
+ if (!this.isValidHostname(parsedURL.hostname)) {
56
+ return {
57
+ valid: false,
58
+ error: `Invalid hostname format: ${parsedURL.hostname}`,
59
+ };
60
+ }
61
+ return { valid: true };
62
+ }
63
+ /**
64
+ * SSRF防护检查
65
+ * @param url 要检查的URL
66
+ * @param ssrfConfig SSRF防护配置
67
+ * @returns 检查结果和错误信息
68
+ */
69
+ static checkSSRF(url, ssrfConfig = {}) {
70
+ const config = Object.assign(Object.assign({}, this.defaultSSRFConfig), ssrfConfig);
71
+ if (!config.enabled) {
72
+ return { safe: true };
73
+ }
74
+ let parsedURL;
75
+ try {
76
+ parsedURL = new URL(url);
77
+ }
78
+ catch (error) {
79
+ return {
80
+ safe: false,
81
+ error: `Invalid URL format: ${error instanceof Error ? error.message : String(error)}`,
82
+ };
83
+ }
84
+ // 检查协议
85
+ if (!config.allowedProtocols.includes(parsedURL.protocol)) {
86
+ return {
87
+ safe: false,
88
+ error: `Protocol not allowed: ${parsedURL.protocol}`,
89
+ };
90
+ }
91
+ // 检查黑名单主机名
92
+ if (config.blockedHostnames) {
93
+ if (config.blockedHostnames.includes(parsedURL.hostname)) {
94
+ return {
95
+ safe: false,
96
+ error: `Hostname is blocked: ${parsedURL.hostname}`,
97
+ };
98
+ }
99
+ }
100
+ // 检查白名单主机名(如果配置了)
101
+ if (config.allowedHostnames && config.allowedHostnames.length > 0) {
102
+ if (!config.allowedHostnames.includes(parsedURL.hostname)) {
103
+ return {
104
+ safe: false,
105
+ error: `Hostname not in whitelist: ${parsedURL.hostname}`,
106
+ };
107
+ }
108
+ }
109
+ // 检查IP地址范围
110
+ const ipAddress = this.extractIPAddress(parsedURL.hostname);
111
+ if (ipAddress) {
112
+ const ipCheck = this.checkIPRange(ipAddress, config.blockedIPRanges);
113
+ if (!ipCheck.allowed) {
114
+ return {
115
+ safe: false,
116
+ error: `IP address is blocked: ${ipAddress} (${ipCheck.reason})`,
117
+ };
118
+ }
119
+ }
120
+ return { safe: true };
121
+ }
122
+ /**
123
+ * 清理和验证URL
124
+ * 综合验证和SSRF防护
125
+ * @param url 要清理的URL
126
+ * @param config 完整的安全配置
127
+ * @returns 清理后的URL和验证结果
128
+ */
129
+ static sanitizeURL(url, config = {}) {
130
+ // 去除首尾空格
131
+ let sanitizedURL = url.trim();
132
+ // 移除可能的换行符和控制字符
133
+ sanitizedURL = sanitizedURL.replace(/[\r\n\t]/g, '');
134
+ // 验证URL格式
135
+ const validationResult = this.validateURL(sanitizedURL, config.urlConfig);
136
+ if (!validationResult.valid) {
137
+ return { url: sanitizedURL, valid: false, error: validationResult.error };
138
+ }
139
+ // SSRF防护检查
140
+ const ssrfResult = this.checkSSRF(sanitizedURL, config.ssrfConfig);
141
+ if (!ssrfResult.safe) {
142
+ return { url: sanitizedURL, valid: false, error: ssrfResult.error };
143
+ }
144
+ return { url: sanitizedURL, valid: true };
145
+ }
146
+ /**
147
+ * 从主机名中提取IP地址
148
+ */
149
+ static extractIPAddress(hostname) {
150
+ // IPv4地址
151
+ const ipv4Regex = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
152
+ const ipv4Match = hostname.match(ipv4Regex);
153
+ if (ipv4Match) {
154
+ return hostname;
155
+ }
156
+ // IPv6地址(简化版)
157
+ if (hostname.includes(':') && !hostname.includes('.')) {
158
+ return hostname;
159
+ }
160
+ return null;
161
+ }
162
+ /**
163
+ * 验证IP地址
164
+ */
165
+ static validateIPAddress(ipAddress, config) {
166
+ // 检查是否为本地回环地址
167
+ if (!config.allowLoopback) {
168
+ if (ipAddress === '127.0.0.1' || ipAddress === '::1' || ipAddress.startsWith('127.')) {
169
+ return {
170
+ valid: false,
171
+ error: 'Loopback addresses are not allowed',
172
+ };
173
+ }
174
+ }
175
+ // 检查是否为私有网络地址
176
+ if (!config.allowPrivateNetwork) {
177
+ if (ipAddress.startsWith('10.') ||
178
+ ipAddress.startsWith('172.16.') ||
179
+ ipAddress.startsWith('192.168.') ||
180
+ ipAddress.startsWith('fc00:') ||
181
+ ipAddress.startsWith('fd')) {
182
+ return {
183
+ valid: false,
184
+ error: 'Private network addresses are not allowed',
185
+ };
186
+ }
187
+ }
188
+ // 检查是否为Link-local地址
189
+ if (!config.allowLinkLocal) {
190
+ if (ipAddress.startsWith('169.254.') || ipAddress.startsWith('fe80:')) {
191
+ return {
192
+ valid: false,
193
+ error: 'Link-local addresses are not allowed',
194
+ };
195
+ }
196
+ }
197
+ return { valid: true };
198
+ }
199
+ /**
200
+ * 检查IP地址是否在阻止的范围内
201
+ */
202
+ static checkIPRange(ipAddress, blockedRanges) {
203
+ for (const range of blockedRanges) {
204
+ if (this.isIPInRange(ipAddress, range)) {
205
+ return {
206
+ allowed: false,
207
+ reason: `IP address is in blocked range: ${range}`,
208
+ };
209
+ }
210
+ }
211
+ return { allowed: true };
212
+ }
213
+ /**
214
+ * 检查IP地址是否在指定范围内
215
+ * 简化版本,主要用于常见CIDR范围
216
+ */
217
+ static isIPInRange(ipAddress, cidrRange) {
218
+ // 处理IPv4 CIDR
219
+ const [range, prefixStr] = cidrRange.split('/');
220
+ const prefix = parseInt(prefixStr, 10);
221
+ // 精确匹配
222
+ if (ipAddress === range) {
223
+ return true;
224
+ }
225
+ // 简化的CIDR匹配(仅支持常见范围)
226
+ if (cidrRange.includes('/')) {
227
+ // IPv4范围检查
228
+ if (range.includes('.') && ipAddress.includes('.')) {
229
+ const rangeParts = range.split('.').map(Number);
230
+ const ipParts = ipAddress.split('.').map(Number);
231
+ if (prefix === 8) {
232
+ return ipParts[0] === rangeParts[0];
233
+ }
234
+ else if (prefix === 16) {
235
+ return ipParts[0] === rangeParts[0] && ipParts[1] === rangeParts[1];
236
+ }
237
+ else if (prefix === 24) {
238
+ return (ipParts[0] === rangeParts[0] &&
239
+ ipParts[1] === rangeParts[1] &&
240
+ ipParts[2] === rangeParts[2]);
241
+ }
242
+ }
243
+ }
244
+ return false;
245
+ }
246
+ /**
247
+ * 验证主机名格式
248
+ */
249
+ static isValidHostname(hostname) {
250
+ // RFC 1123主机名规范
251
+ const hostnameRegex = /^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$/;
252
+ return hostnameRegex.test(hostname);
253
+ }
254
+ /**
255
+ * 敏感数据检测
256
+ * 检查数据中是否包含敏感信息(如密码、token等)
257
+ * @param data 要检查的数据对象
258
+ * @param additionalPatterns 额外的敏感数据模式
259
+ * @returns 检测结果
260
+ */
261
+ static detectSensitiveData(data, additionalPatterns = []) {
262
+ const sensitiveFields = [];
263
+ // 默认敏感字段名模式
264
+ const defaultPatterns = [
265
+ /password/i,
266
+ /secret/i,
267
+ /token/i,
268
+ /api[_-]?key/i,
269
+ /authorization/i,
270
+ /credential/i,
271
+ /private[_-]?key/i,
272
+ /access[_-]?token/i,
273
+ /refresh[_-]?token/i,
274
+ /session[_-]?id/i,
275
+ /csrf/i,
276
+ /ssn/i,
277
+ /credit[_-]?card/i,
278
+ ];
279
+ const allPatterns = [...defaultPatterns, ...additionalPatterns];
280
+ const checkObject = (obj, path = '') => {
281
+ if (!obj || typeof obj !== 'object') {
282
+ return;
283
+ }
284
+ for (const key in obj) {
285
+ if (!obj.hasOwnProperty(key)) {
286
+ continue;
287
+ }
288
+ const currentPath = path ? `${path}.${key}` : key;
289
+ // 检查键名是否匹配敏感模式
290
+ if (allPatterns.some((pattern) => pattern.test(key))) {
291
+ sensitiveFields.push(currentPath);
292
+ }
293
+ // 递归检查嵌套对象
294
+ if (typeof obj[key] === 'object' && obj[key] !== null) {
295
+ checkObject(obj[key], currentPath);
296
+ }
297
+ }
298
+ };
299
+ checkObject(data);
300
+ return {
301
+ hasSensitiveData: sensitiveFields.length > 0,
302
+ fields: sensitiveFields,
303
+ };
304
+ }
305
+ /**
306
+ * 获取默认SSRF防护配置
307
+ */
308
+ static getDefaultSSRFConfig() {
309
+ return Object.assign({}, this.defaultSSRFConfig);
310
+ }
311
+ /**
312
+ * 获取默认URL验证配置
313
+ */
314
+ static getDefaultURLConfig() {
315
+ return Object.assign({}, this.defaultURLConfig);
316
+ }
317
+ }
318
+ exports.SecurityValidator = SecurityValidator;
319
+ SecurityValidator.logger = new common_1.Logger(SecurityValidator.name);
320
+ /**
321
+ * 默认SSRF防护配置
322
+ */
323
+ SecurityValidator.defaultSSRFConfig = {
324
+ enabled: true,
325
+ allowedProtocols: ['http:', 'https:'],
326
+ blockedIPRanges: [
327
+ '127.0.0.0/8', // Loopback
328
+ '10.0.0.0/8', // Private Class A
329
+ '172.16.0.0/12', // Private Class B
330
+ '192.168.0.0/16', // Private Class C
331
+ '169.254.0.0/16', // Link-local
332
+ '::1/128', // IPv6 loopback
333
+ 'fc00::/7', // IPv6 private
334
+ 'fe80::/10', // IPv6 link-local
335
+ '0.0.0.0/8', // Current network
336
+ ],
337
+ allowedHostnames: undefined,
338
+ blockedHostnames: [
339
+ 'localhost',
340
+ 'metadata.google.internal', // GCP metadata
341
+ '169.254.169.254', // AWS/GCP/Azure metadata
342
+ ],
343
+ };
344
+ /**
345
+ * 默认URL验证配置
346
+ */
347
+ SecurityValidator.defaultURLConfig = {
348
+ maxURLLength: 2000,
349
+ allowLoopback: false,
350
+ allowPrivateNetwork: false,
351
+ allowLinkLocal: false,
352
+ };
package/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ export * from './common';
1
2
  export * from './constants';
2
3
  export * from './decorators';
3
4
  export * from './exceptions';
@@ -7,7 +8,6 @@ export * from './interceptors';
7
8
  export * from './shared';
8
9
  export * from './middlewares';
9
10
  export * from './validators';
10
- export * from './common';
11
11
  export * from './validator-json';
12
12
  export * from './helpers';
13
13
  export * from './providers';
@@ -18,3 +18,5 @@ export * from './vault';
18
18
  export * from './setup';
19
19
  export * from './health-checker';
20
20
  export * from './audit';
21
+ export * from './file-upload';
22
+ export * from '@nest-omni/transaction';
package/index.js CHANGED
@@ -14,6 +14,8 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
+ // Core modules
18
+ __exportStar(require("./common"), exports);
17
19
  __exportStar(require("./constants"), exports);
18
20
  __exportStar(require("./decorators"), exports);
19
21
  __exportStar(require("./exceptions"), exports);
@@ -23,14 +25,23 @@ __exportStar(require("./interceptors"), exports);
23
25
  __exportStar(require("./shared"), exports);
24
26
  __exportStar(require("./middlewares"), exports);
25
27
  __exportStar(require("./validators"), exports);
26
- __exportStar(require("./common"), exports);
27
28
  __exportStar(require("./validator-json"), exports);
28
29
  __exportStar(require("./helpers"), exports);
29
30
  __exportStar(require("./providers"), exports);
31
+ // Lock module
30
32
  __exportStar(require("./redis-lock"), exports);
33
+ // Cache module
31
34
  __exportStar(require("./cache"), exports);
35
+ // HTTP Client module
32
36
  __exportStar(require("./http-client"), exports);
37
+ // Vault module
33
38
  __exportStar(require("./vault"), exports);
39
+ // Setup and bootstrap
34
40
  __exportStar(require("./setup"), exports);
41
+ // Health checker
35
42
  __exportStar(require("./health-checker"), exports);
43
+ // Audit module
36
44
  __exportStar(require("./audit"), exports);
45
+ // File upload module
46
+ __exportStar(require("./file-upload"), exports);
47
+ __exportStar(require("@nest-omni/transaction"), exports);
@@ -9,12 +9,17 @@ Object.defineProperty(exports, "__esModule", { value: true });
9
9
  exports.TranslationInterceptor = void 0;
10
10
  const common_1 = require("@nestjs/common");
11
11
  const operators_1 = require("rxjs/operators");
12
+ // import { TranslationService } from '../shared/services/translation.service';
13
+ // FIXME: add implementation
12
14
  let TranslationInterceptor = class TranslationInterceptor {
15
+ // constructor(private readonly translationService: TranslationService) {}
13
16
  intercept(context, next) {
14
17
  const ctx = context.switchToHttp();
15
18
  const req = ctx.getRequest();
16
19
  const res = ctx.getResponse();
17
20
  return next.handle().pipe((0, operators_1.map)((data) => {
21
+ // const newData = this.translationService.translateNecessaryKeys(data);
22
+ // status 201 => 200
18
23
  if (res.statusCode === common_1.HttpStatus.CREATED) {
19
24
  res.status(common_1.HttpStatus.OK);
20
25
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nest-omni/core",
3
- "version": "4.1.3-2",
3
+ "version": "4.1.3-20",
4
4
  "description": "A comprehensive NestJS framework for building enterprise-grade applications with best practices",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -36,7 +36,7 @@
36
36
  "author": "Jinpy",
37
37
  "license": "Apache-2.0",
38
38
  "engines": {
39
- "node": ">=18.0.0",
39
+ "node": ">=22.0.0",
40
40
  "npm": ">=9.0.0"
41
41
  },
42
42
  "devDependencies": {
@@ -45,15 +45,16 @@
45
45
  "@types/express-session": "^1.18.2",
46
46
  "@types/lodash": "^4.17.20",
47
47
  "@types/node": "^24.9.1",
48
+ "@types/sharp": "^0.31.1",
48
49
  "@types/sprintf-js": "^1.1.4",
49
50
  "@types/uuid": "^11.0.0",
51
+ "sqlite3": "^5.1.7",
50
52
  "typescript": "^5.9.3"
51
53
  },
52
54
  "dependencies": {
53
55
  "@dataui/crud": "^5.3.4",
54
56
  "@dataui/crud-typeorm": "^5.3.4",
55
- "@nestjs-cls/transactional": "^3.1.0",
56
- "@nestjs-cls/transactional-adapter-typeorm": "^1.3.0",
57
+ "@nest-omni/transaction": "*",
57
58
  "@nestjs/bull": "^11.0.4",
58
59
  "@nestjs/common": "^11.1.7",
59
60
  "@nestjs/config": "^4.0.2",
@@ -67,7 +68,7 @@
67
68
  "@sentry/profiling-node": "^10.22.0",
68
69
  "@songkeys/nestjs-redis": "^11.0.0",
69
70
  "@songkeys/nestjs-redis-health": "^11.0.0",
70
- "axios": "^1.12.2",
71
+ "axios": "^1.13.2",
71
72
  "axios-retry": "^4.5.0",
72
73
  "bcrypt": "^6.0.0",
73
74
  "body-parser": "^2.2.0",
@@ -79,6 +80,7 @@
79
80
  "dotenv": "^17.2.3",
80
81
  "express": "^5.1.0",
81
82
  "express-session": "^1.18.2",
83
+ "fast-csv": "^5.0.5",
82
84
  "hygen": "^6.2.11",
83
85
  "ioredis": "^5.8.2",
84
86
  "libphonenumber-js": "^1.12.25",
@@ -89,6 +91,7 @@
89
91
  "nestjs-cls": "^6.0.1",
90
92
  "nestjs-i18n": "^10.5.1",
91
93
  "nestjs-pino": "^4.4.1",
94
+ "node-vault": "^0.10.9",
92
95
  "pino-http": "^11.0.0",
93
96
  "pino-pretty": "^13.1.2",
94
97
  "reflect-metadata": "^0.2.2",
@@ -97,6 +100,7 @@
97
100
  "sprintf-js": "^1.1.3",
98
101
  "typeorm": "^0.3.27",
99
102
  "uuid": "^13.0.0",
100
- "node-vault": "^0.10.9"
101
- }
103
+ "xlsx": "git+https://git.sheetjs.com/sheetjs/sheetjs.git#v0.20.3"
104
+ },
105
+ "peerDependencies": {}
102
106
  }
@@ -8,6 +8,7 @@ class ContextProvider {
8
8
  const store = nestjs_cls_1.ClsServiceManager.getClsService();
9
9
  return store.get(ContextProvider.getKeyWithNamespace(key));
10
10
  }
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
11
12
  static set(key, value) {
12
13
  const store = nestjs_cls_1.ClsServiceManager.getClsService();
13
14
  store.set(ContextProvider.getKeyWithNamespace(key), value);
@@ -24,6 +25,7 @@ class ContextProvider {
24
25
  static getRouter() {
25
26
  const value = ContextProvider.get(ContextProvider.routerKey);
26
27
  if (value) {
28
+ // @ts-ignore
27
29
  return value;
28
30
  }
29
31
  return {
@@ -5,5 +5,9 @@ export declare class GeneratorProvider {
5
5
  static getS3Key(publicUrl: string): string;
6
6
  static generateVerificationCode(): string;
7
7
  static generatePassword(): string;
8
+ /**
9
+ * generate random string
10
+ * @param length
11
+ */
8
12
  static generateRandomString(length: number): string;
9
13
  }
@@ -40,6 +40,10 @@ class GeneratorProvider {
40
40
  }
41
41
  return text;
42
42
  }
43
+ /**
44
+ * generate random string
45
+ * @param length
46
+ */
43
47
  static generateRandomString(length) {
44
48
  return Math.random()
45
49
  .toString(36)
@@ -0,0 +1,94 @@
1
+ import { OnModuleInit, OnApplicationShutdown } from '@nestjs/common';
2
+ import { RedisLockService } from './redis-lock.service';
3
+ import { LockHeartbeatService } from './lock-heartbeat.service';
4
+ /**
5
+ * Comprehensive lock cleanup service
6
+ *
7
+ * Provides safe and comprehensive lock cleanup mechanism for distributed environments.
8
+ * Combines instance-based precise cleanup with heartbeat-based dead instance detection.
9
+ *
10
+ * **Cleanup Strategy:**
11
+ * 1. **Immediate Precise Cleanup (0s):**
12
+ * - Only cleans locks from the current instance
13
+ * - Safe during rolling updates - won't affect other running instances
14
+ *
15
+ * 2. **Delayed Conservative Cleanup (60s):**
16
+ * - Checks heartbeat of other instances
17
+ * - Only cleans locks from dead instances (no heartbeat)
18
+ * - Gives enough time for rolling updates to complete
19
+ *
20
+ * 3. **Graceful Shutdown Cleanup:**
21
+ * - On SIGTERM/SIGINT, immediately cleans own locks
22
+ * - Ensures locks are released before process exits
23
+ * - Works with PM2 reload and Kubernetes rolling updates
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * // In your module
28
+ * @Module({
29
+ * providers: [
30
+ * RedisLockService,
31
+ * LockHeartbeatService,
32
+ * ComprehensiveLockCleanupService,
33
+ * ],
34
+ * })
35
+ * export class AppModule {}
36
+ * ```
37
+ */
38
+ export declare class ComprehensiveLockCleanupService implements OnModuleInit, OnApplicationShutdown {
39
+ private readonly lockService;
40
+ private readonly heartbeatService;
41
+ private readonly logger;
42
+ private readonly instanceId;
43
+ /**
44
+ * Grace period before cleaning other instances' locks (milliseconds)
45
+ * @default 60000 (60 seconds)
46
+ */
47
+ private readonly gracePeriod;
48
+ constructor(lockService: RedisLockService, heartbeatService: LockHeartbeatService);
49
+ onModuleInit(): Promise<void>;
50
+ /**
51
+ * Clean up locks from the current instance
52
+ * Safe to run immediately - only affects locks created by this instance
53
+ */
54
+ private cleanupOwnLocks;
55
+ /**
56
+ * Clean up locks from dead instances
57
+ * Only runs after grace period to avoid cleaning locks during rolling updates
58
+ */
59
+ private cleanupDeadInstanceLocks;
60
+ /**
61
+ * Check if a lock belongs to the current instance
62
+ *
63
+ * @param lockValue - Lock value to check
64
+ * @returns True if lock belongs to current instance
65
+ */
66
+ private isOwnLock;
67
+ /**
68
+ * Extract instance ID from lock value
69
+ * Lock value format: instanceId:timestamp:random:pid
70
+ *
71
+ * @param lockValue - Lock value
72
+ * @returns Instance ID or null if cannot be extracted
73
+ */
74
+ private extractInstanceId;
75
+ /**
76
+ * Get instance identifier
77
+ */
78
+ private getInstanceId;
79
+ /**
80
+ * Manually trigger cleanup of all stale locks
81
+ * Use with caution - this will clean both own and dead instance locks
82
+ */
83
+ manualCleanup(): Promise<{
84
+ ownLocks: number;
85
+ deadLocks: number;
86
+ }>;
87
+ private cleanupOwnLocksCount;
88
+ private cleanupDeadInstanceLocksCount;
89
+ /**
90
+ * Cleanup own locks on application shutdown
91
+ * Called when receiving SIGTERM/SIGINT (graceful shutdown)
92
+ */
93
+ onApplicationShutdown(signal?: string): Promise<void>;
94
+ }