@seidor-cloud-produtos/orbit-backend-lib 2.0.138 → 2.1.0

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 (242) hide show
  1. package/dist/clean-arch/application/cache/cache.d.ts +32 -0
  2. package/dist/clean-arch/application/cache/cache.js +24 -0
  3. package/dist/clean-arch/application/cache/cache.spec.d.ts +1 -0
  4. package/dist/clean-arch/application/cache/cache.spec.js +178 -0
  5. package/dist/clean-arch/application/cache/client.d.ts +23 -0
  6. package/dist/clean-arch/application/cache/client.js +11 -0
  7. package/dist/clean-arch/application/consistency-event-dispatcher/consistency-event-dispatcher.d.ts +9 -0
  8. package/dist/clean-arch/application/consistency-event-dispatcher/consistency-event-dispatcher.js +26 -0
  9. package/dist/clean-arch/application/logger/base-audit-logger.d.ts +10 -0
  10. package/dist/clean-arch/application/logger/base-audit-logger.js +28 -0
  11. package/dist/clean-arch/application/logger/index.d.ts +94 -6
  12. package/dist/clean-arch/application/logger/index.js +69 -7
  13. package/dist/clean-arch/application/logger/logger.spec.d.ts +1 -0
  14. package/dist/clean-arch/application/logger/logger.spec.js +204 -0
  15. package/dist/clean-arch/application/queue/handler.d.ts +28 -0
  16. package/dist/clean-arch/application/queue/handler.js +23 -0
  17. package/dist/clean-arch/application/queue/messages-in-memory.d.ts +6 -0
  18. package/dist/clean-arch/application/queue/queue-connection.d.ts +22 -0
  19. package/dist/clean-arch/application/queue/queue.d.ts +39 -0
  20. package/dist/clean-arch/domain/entities/entity.d.ts +3 -0
  21. package/dist/clean-arch/domain/entities/entity.js +35 -0
  22. package/dist/clean-arch/domain/entities/entity.spec.d.ts +1 -0
  23. package/dist/clean-arch/domain/entities/entity.spec.js +130 -0
  24. package/dist/clean-arch/domain/entities/watched-list.d.ts +1 -0
  25. package/dist/clean-arch/domain/entities/watched-list.js +9 -0
  26. package/dist/clean-arch/domain/events/consistency-event/consistency-event.d.ts +15 -0
  27. package/dist/clean-arch/domain/events/consistency-event/consistency-event.js +15 -0
  28. package/dist/clean-arch/domain/events/consistency-event/consistency-event.spec.d.ts +1 -0
  29. package/dist/clean-arch/domain/events/consistency-event/consistency-event.spec.js +99 -0
  30. package/dist/clean-arch/domain/events/consistency-event/events-enum.d.ts +98 -0
  31. package/dist/clean-arch/domain/events/consistency-event/events-enum.js +151 -0
  32. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/address/address-created.d.ts +9 -0
  33. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/address/address-created.js +2 -0
  34. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/address/address-entity-event.d.ts +30 -0
  35. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/address/address-entity-event.js +2 -0
  36. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/address/address-upserted.d.ts +9 -0
  37. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/address/address-upserted.js +2 -0
  38. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/branch/branch-associated.d.ts +9 -0
  39. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/branch/branch-associated.js +2 -0
  40. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/branch/branch-created.d.ts +9 -0
  41. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/branch/branch-created.js +2 -0
  42. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/branch/branch-entity-event.d.ts +38 -0
  43. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/branch/branch-entity-event.js +2 -0
  44. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/branch/branch-upserted.d.ts +9 -0
  45. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/branch/branch-upserted.js +2 -0
  46. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/contact/contact-created.d.ts +9 -0
  47. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/contact/contact-created.js +2 -0
  48. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/contact/contact-entity-event.d.ts +26 -0
  49. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/contact/contact-entity-event.js +2 -0
  50. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/contact/contact-upserted.d.ts +9 -0
  51. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/contact/contact-upserted.js +2 -0
  52. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/customer/customer-created.d.ts +9 -0
  53. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/customer/customer-created.js +2 -0
  54. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/customer/customer-entity-event.d.ts +10 -0
  55. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/customer/customer-entity-event.js +2 -0
  56. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/customer/customer-upserted.d.ts +9 -0
  57. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/customer/customer-upserted.js +2 -0
  58. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/partner/partner-created.d.ts +9 -0
  59. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/partner/partner-created.js +2 -0
  60. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/partner/partner-entity-event.d.ts +37 -0
  61. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/partner/partner-entity-event.js +2 -0
  62. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/partner/partner-updated.d.ts +9 -0
  63. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/partner/partner-updated.js +2 -0
  64. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/partner/partner-upserted.d.ts +9 -0
  65. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/partner/partner-upserted.js +2 -0
  66. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/role/role-associated.d.ts +9 -0
  67. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/role/role-associated.js +2 -0
  68. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/role/role-entity-event.d.ts +13 -0
  69. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/role/role-entity-event.js +2 -0
  70. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/role/role-upserted.d.ts +9 -0
  71. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/role/role-upserted.js +2 -0
  72. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/supplier/supplier-created.d.ts +9 -0
  73. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/supplier/supplier-created.js +2 -0
  74. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/supplier/supplier-entity-event.d.ts +5 -0
  75. package/dist/clean-arch/domain/events/consistency-event/types/partner-service/supplier/supplier-entity-event.js +2 -0
  76. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/authorization/authorization-created.d.ts +9 -0
  77. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/authorization/authorization-created.js +2 -0
  78. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/authorization/authorization-entity-event.d.ts +11 -0
  79. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/authorization/authorization-entity-event.js +2 -0
  80. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/authorization/authorization-updated.d.ts +9 -0
  81. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/authorization/authorization-updated.js +2 -0
  82. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/external-provider/external-provider-created.d.ts +9 -0
  83. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/external-provider/external-provider-created.js +2 -0
  84. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/external-provider/external-provider-entity-event.d.ts +14 -0
  85. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/external-provider/external-provider-entity-event.js +2 -0
  86. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/role/role-created.d.ts +9 -0
  87. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/role/role-created.js +2 -0
  88. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/role/role-entity-event.d.ts +13 -0
  89. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/role/role-entity-event.js +2 -0
  90. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/role/role-updated.d.ts +9 -0
  91. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/role/role-updated.js +2 -0
  92. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant/tenant-created.d.ts +9 -0
  93. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant/tenant-created.js +2 -0
  94. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant/tenant-entity-event.d.ts +50 -0
  95. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant/tenant-entity-event.js +2 -0
  96. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant/tenant-updated.d.ts +9 -0
  97. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant/tenant-updated.js +2 -0
  98. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant-role/tenant-role-entity-event.d.ts +8 -0
  99. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant-role/tenant-role-entity-event.js +2 -0
  100. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant-role/tenant-role-updated.d.ts +9 -0
  101. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant-role/tenant-role-updated.js +2 -0
  102. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant-user/tenant-user-entity-event.d.ts +10 -0
  103. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant-user/tenant-user-entity-event.js +2 -0
  104. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant-user/tenant-user-updated.d.ts +9 -0
  105. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/tenant-user/tenant-user-updated.js +2 -0
  106. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/user/user-entity-event.d.ts +10 -0
  107. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/user/user-entity-event.js +2 -0
  108. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/user/user-forgot-password.d.ts +9 -0
  109. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/user/user-forgot-password.js +2 -0
  110. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/user/user-temporary-password-generated.d.ts +9 -0
  111. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/user/user-temporary-password-generated.js +2 -0
  112. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/user-tenant-role/user-tenant-role-entity-event.d.ts +9 -0
  113. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/user-tenant-role/user-tenant-role-entity-event.js +2 -0
  114. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/user-tenant-role/user-tenant-roles-created.d.ts +9 -0
  115. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/user-tenant-role/user-tenant-roles-created.js +2 -0
  116. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/user-tenant-role/user-tenant-roles-updated.d.ts +9 -0
  117. package/dist/clean-arch/domain/events/consistency-event/types/portal-admin/user-tenant-role/user-tenant-roles-updated.js +2 -0
  118. package/dist/clean-arch/domain/events/consistency-event/types/security-service/branch/branch-created.d.ts +9 -0
  119. package/dist/clean-arch/domain/events/consistency-event/types/security-service/branch/branch-created.js +2 -0
  120. package/dist/clean-arch/domain/events/consistency-event/types/security-service/branch/branch-entity-event.d.ts +9 -0
  121. package/dist/clean-arch/domain/events/consistency-event/types/security-service/branch/branch-entity-event.js +2 -0
  122. package/dist/clean-arch/domain/events/consistency-event/types/security-service/branch/branch-upserted.d.ts +9 -0
  123. package/dist/clean-arch/domain/events/consistency-event/types/security-service/branch/branch-upserted.js +2 -0
  124. package/dist/clean-arch/domain/events/consistency-event/types/security-service/brazilian-federal-revenue-api-credential/brazilian-federal-revenue-api-credential-created.d.ts +9 -0
  125. package/dist/clean-arch/domain/events/consistency-event/types/security-service/brazilian-federal-revenue-api-credential/brazilian-federal-revenue-api-credential-created.js +2 -0
  126. package/dist/clean-arch/domain/events/consistency-event/types/security-service/brazilian-federal-revenue-api-credential/brazilian-federal-revenue-api-credential-deleted.d.ts +9 -0
  127. package/dist/clean-arch/domain/events/consistency-event/types/security-service/brazilian-federal-revenue-api-credential/brazilian-federal-revenue-api-credential-deleted.js +2 -0
  128. package/dist/clean-arch/domain/events/consistency-event/types/security-service/brazilian-federal-revenue-api-credential/brazilian-federal-revenue-api-credential-entity-event.d.ts +10 -0
  129. package/dist/clean-arch/domain/events/consistency-event/types/security-service/brazilian-federal-revenue-api-credential/brazilian-federal-revenue-api-credential-entity-event.js +2 -0
  130. package/dist/clean-arch/domain/events/consistency-event/types/security-service/brazilian-federal-revenue-api-credential/brazilian-federal-revenue-api-credential-updated.d.ts +9 -0
  131. package/dist/clean-arch/domain/events/consistency-event/types/security-service/brazilian-federal-revenue-api-credential/brazilian-federal-revenue-api-credential-updated.js +2 -0
  132. package/dist/clean-arch/domain/events/consistency-event/types/security-service/certificate/certificate-created.d.ts +9 -0
  133. package/dist/clean-arch/domain/events/consistency-event/types/security-service/certificate/certificate-created.js +2 -0
  134. package/dist/clean-arch/domain/events/consistency-event/types/security-service/certificate/certificate-deleted.d.ts +9 -0
  135. package/dist/clean-arch/domain/events/consistency-event/types/security-service/certificate/certificate-deleted.js +2 -0
  136. package/dist/clean-arch/domain/events/consistency-event/types/security-service/certificate/certificate-entity-event.d.ts +38 -0
  137. package/dist/clean-arch/domain/events/consistency-event/types/security-service/certificate/certificate-entity-event.js +8 -0
  138. package/dist/clean-arch/domain/events/consistency-event/types/security-service/certificate/certificate-updated.d.ts +9 -0
  139. package/dist/clean-arch/domain/events/consistency-event/types/security-service/certificate/certificate-updated.js +2 -0
  140. package/dist/clean-arch/domain/events/consistency-event/types/security-service/entity/entity-created.d.ts +9 -0
  141. package/dist/clean-arch/domain/events/consistency-event/types/security-service/entity/entity-created.js +2 -0
  142. package/dist/clean-arch/domain/events/consistency-event/types/security-service/entity/entity-event.d.ts +21 -0
  143. package/dist/clean-arch/domain/events/consistency-event/types/security-service/entity/entity-event.js +2 -0
  144. package/dist/clean-arch/domain/events/consistency-event/types/security-service/entity/entity-updated.d.ts +9 -0
  145. package/dist/clean-arch/domain/events/consistency-event/types/security-service/entity/entity-updated.js +2 -0
  146. package/dist/clean-arch/domain/events/consistency-event/types/security-service/entity/entity-upserted.d.ts +9 -0
  147. package/dist/clean-arch/domain/events/consistency-event/types/security-service/entity/entity-upserted.js +2 -0
  148. package/dist/clean-arch/domain/events/consistency-event/types/security-service/external-provider/external-provider-created.d.ts +9 -0
  149. package/dist/clean-arch/domain/events/consistency-event/types/security-service/external-provider/external-provider-created.js +2 -0
  150. package/dist/clean-arch/domain/events/consistency-event/types/security-service/external-provider/external-provider-deleted.d.ts +9 -0
  151. package/dist/clean-arch/domain/events/consistency-event/types/security-service/external-provider/external-provider-deleted.js +2 -0
  152. package/dist/clean-arch/domain/events/consistency-event/types/security-service/external-provider/external-provider-entity-event.d.ts +27 -0
  153. package/dist/clean-arch/domain/events/consistency-event/types/security-service/external-provider/external-provider-entity-event.js +8 -0
  154. package/dist/clean-arch/domain/events/consistency-event/types/security-service/external-provider/external-provider-updated.d.ts +9 -0
  155. package/dist/clean-arch/domain/events/consistency-event/types/security-service/external-provider/external-provider-updated.js +2 -0
  156. package/dist/clean-arch/domain/events/domain-event.d.ts +5 -0
  157. package/dist/clean-arch/domain/interfaces/country.d.ts +1 -0
  158. package/dist/clean-arch/domain/value-objects/password.spec.d.ts +1 -0
  159. package/dist/clean-arch/domain/value-objects/password.spec.js +90 -0
  160. package/dist/clean-arch/infra/adapters/http-adapters.spec.d.ts +1 -0
  161. package/dist/clean-arch/infra/adapters/http-adapters.spec.js +318 -0
  162. package/dist/clean-arch/infra/authorizations/authorizer.spec.js +43 -0
  163. package/dist/clean-arch/infra/cache/cache-clients.spec.d.ts +1 -0
  164. package/dist/clean-arch/infra/cache/cache-clients.spec.js +161 -0
  165. package/dist/clean-arch/infra/cache/cache-in-memory.d.ts +5 -0
  166. package/dist/clean-arch/infra/cache/cache-in-memory.js +6 -0
  167. package/dist/clean-arch/infra/cache/clients/node-cache.d.ts +17 -0
  168. package/dist/clean-arch/infra/cache/clients/node-cache.js +20 -2
  169. package/dist/clean-arch/infra/cache/clients/redis.d.ts +15 -0
  170. package/dist/clean-arch/infra/cache/clients/redis.js +11 -0
  171. package/dist/clean-arch/infra/consistency-event-dispatcher/amqp-consistency-event-dispatcher.d.ts +8 -0
  172. package/dist/clean-arch/infra/consistency-event-dispatcher/amqp-consistency-event-dispatcher.js +18 -0
  173. package/dist/clean-arch/infra/consistency-event-dispatcher/exchanges-enum.d.ts +50 -0
  174. package/dist/clean-arch/infra/consistency-event-dispatcher/exchanges-enum.js +58 -0
  175. package/dist/clean-arch/infra/consistency-event-dispatcher/in-memory-consistency-event-dispatcher.d.ts +7 -0
  176. package/dist/clean-arch/infra/consistency-event-dispatcher/in-memory-consistency-event-dispatcher.js +15 -0
  177. package/dist/clean-arch/infra/http/controller.spec.js +170 -51
  178. package/dist/clean-arch/infra/http/handle-authorizer-headers.d.ts +25 -0
  179. package/dist/clean-arch/infra/http/handle-authorizer-headers.js +29 -0
  180. package/dist/clean-arch/infra/http/handle-user-headers.d.ts +5 -0
  181. package/dist/clean-arch/infra/http/handle-user-headers.js +2 -0
  182. package/dist/clean-arch/infra/http/helpers.spec.d.ts +1 -0
  183. package/dist/clean-arch/infra/http/helpers.spec.js +136 -0
  184. package/dist/clean-arch/infra/http/net.spec.d.ts +1 -0
  185. package/dist/clean-arch/infra/http/net.spec.js +46 -0
  186. package/dist/clean-arch/infra/logger/logger-in-memory.d.ts +31 -2
  187. package/dist/clean-arch/infra/logger/logger-in-memory.js +21 -2
  188. package/dist/clean-arch/infra/logger/logger-orbit.d.ts +81 -5
  189. package/dist/clean-arch/infra/logger/logger-orbit.js +63 -6
  190. package/dist/clean-arch/infra/logger/logger-orbit.spec.d.ts +1 -0
  191. package/dist/clean-arch/infra/logger/logger-orbit.spec.js +122 -0
  192. package/dist/clean-arch/infra/orbit-http-client/orbit-axios-client/orbit-axios-client.spec.d.ts +1 -0
  193. package/dist/clean-arch/infra/orbit-http-client/orbit-axios-client/orbit-axios-client.spec.js +143 -0
  194. package/dist/clean-arch/infra/orbit-notification-client/discord-client.spec.d.ts +1 -0
  195. package/dist/clean-arch/infra/orbit-notification-client/discord-client.spec.js +58 -0
  196. package/dist/clean-arch/infra/queue/create-consumers.d.ts +18 -0
  197. package/dist/clean-arch/infra/queue/create-consumers.js +15 -0
  198. package/dist/clean-arch/infra/queue/create-queues.d.ts +11 -0
  199. package/dist/clean-arch/infra/queue/create-queues.js +19 -0
  200. package/dist/clean-arch/infra/queue/in-memory/in-memory-queue.d.ts +16 -0
  201. package/dist/clean-arch/infra/queue/in-memory/in-memory-queue.js +19 -0
  202. package/dist/clean-arch/infra/queue/queue-controller.d.ts +14 -0
  203. package/dist/clean-arch/infra/queue/queue-controller.js +8 -0
  204. package/dist/clean-arch/infra/queue/queue-utils.spec.d.ts +1 -0
  205. package/dist/clean-arch/infra/queue/queue-utils.spec.js +170 -0
  206. package/dist/clean-arch/infra/queue/rabbitmq/amqp-lib.d.ts +5 -1
  207. package/dist/clean-arch/infra/queue/rabbitmq/amqp-lib.js +23 -12
  208. package/dist/clean-arch/infra/queue/rabbitmq/amqp-lib.spec.js +504 -89
  209. package/dist/clean-arch/infra/queue/rabbitmq/create-queues.d.ts +10 -0
  210. package/dist/clean-arch/infra/queue/rabbitmq/create-queues.js +7 -0
  211. package/dist/clean-arch/infra/queue/rabbitmq/types.d.ts +7 -1
  212. package/dist/clean-arch/infra/queue/worker.d.ts +9 -0
  213. package/dist/clean-arch/infra/queue/worker.js +9 -0
  214. package/dist/clean-arch/infra/scaledjob/amqp/runner.d.ts +35 -2
  215. package/dist/clean-arch/infra/scaledjob/amqp/runner.js +38 -3
  216. package/dist/clean-arch/infra/scaledjob/amqp/runner.spec.js +74 -84
  217. package/dist/clean-arch/infra/scaledjob/amqp/types.d.ts +19 -0
  218. package/dist/clean-arch/infra/scaledjob/sqs/runner.d.ts +23 -0
  219. package/dist/clean-arch/infra/scaledjob/sqs/runner.js +26 -2
  220. package/dist/clean-arch/infra/scaledjob/sqs/runner.spec.d.ts +1 -0
  221. package/dist/clean-arch/infra/scaledjob/sqs/runner.spec.js +150 -0
  222. package/dist/clean-arch/infra/scaledjob/sqs/types.d.ts +18 -0
  223. package/dist/clean-arch/infra/scaledjob/types/index.d.ts +5 -0
  224. package/dist/clean-arch/infra/tracing/start-tracing.d.ts +10 -0
  225. package/dist/clean-arch/infra/tracing/start-tracing.js +78 -0
  226. package/dist/clean-arch/infra/validations/zod/schemas/common-validation.d.ts +159 -0
  227. package/dist/clean-arch/infra/validations/zod/schemas/common-validation.js +53 -2
  228. package/dist/clean-arch/infra/validations/zod/validation-zod.d.ts +1 -1
  229. package/dist/clean-arch/infra/validations/zod/validation-zod.spec.js +23 -0
  230. package/dist/clean-arch/shared/pagination/get-take-and-skip.spec.d.ts +1 -0
  231. package/dist/clean-arch/shared/pagination/get-take-and-skip.spec.js +16 -0
  232. package/dist/clean-arch/shared/timeout.d.ts +8 -0
  233. package/dist/clean-arch/shared/timeout.js +8 -0
  234. package/dist/frameworks/express/api-gateway/mapping-model.spec.js +58 -0
  235. package/dist/frameworks/express/authorizations/authorization-express.spec.js +9 -0
  236. package/dist/frameworks/express/middleware-express.spec.d.ts +1 -0
  237. package/dist/frameworks/express/middleware-express.spec.js +51 -0
  238. package/dist/frameworks/nest/nest.spec.d.ts +1 -0
  239. package/dist/frameworks/nest/nest.spec.js +122 -0
  240. package/dist/infra/http/api-gateway/mapping-model.spec.js +42 -0
  241. package/dist/static/countries.js +241 -0
  242. package/package.json +5 -1
@@ -1,8 +1,17 @@
1
+ /**
2
+ * Executor simples de worker em processo separado com auto-restart.
3
+ *
4
+ * Útil para subir consumidores/filas em um script dedicado, mantendo
5
+ * o processo principal mais estável.
6
+ */
1
7
  export default class ForkWorker {
2
8
  private attemptCount;
3
9
  private maxAttempts;
4
10
  private retryDelay;
5
11
  private workerPath;
6
12
  constructor(workerPath: string);
13
+ /**
14
+ * Inicia o worker e aplica a política de reinício em caso de erro/exit.
15
+ */
7
16
  fWorker(): void;
8
17
  }
@@ -1,6 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const child_process_1 = require("child_process");
4
+ /**
5
+ * Executor simples de worker em processo separado com auto-restart.
6
+ *
7
+ * Útil para subir consumidores/filas em um script dedicado, mantendo
8
+ * o processo principal mais estável.
9
+ */
4
10
  class ForkWorker {
5
11
  attemptCount = 0;
6
12
  maxAttempts = 5;
@@ -9,6 +15,9 @@ class ForkWorker {
9
15
  constructor(workerPath) {
10
16
  this.workerPath = workerPath;
11
17
  }
18
+ /**
19
+ * Inicia o worker e aplica a política de reinício em caso de erro/exit.
20
+ */
12
21
  fWorker() {
13
22
  const child = (0, child_process_1.fork)(this.workerPath);
14
23
  child.on('error', err => {
@@ -6,19 +6,52 @@ import { RabbitMQScaledJobOptions } from './types';
6
6
  import { Logger } from '../../../application/logger';
7
7
  export interface IRunnerOptions extends Partial<RabbitMQScaledJobOptions> {
8
8
  }
9
- export declare class RabbitMQScaledJobRunner<T = any> {
9
+ /**
10
+ * Runner de ScaledJob para RabbitMQ/AMQP baseado em polling (`get`).
11
+ *
12
+ * Fluxo geral por execução:
13
+ * - Conecta no broker.
14
+ * - Faz polling da fila até atingir o limite configurado.
15
+ * - Processa cada mensagem com o `Handler`.
16
+ * - Faz `ack` em sucesso e `nack` em erro (quando `manualAck` está ativo).
17
+ * - Fecha a conexão ao final.
18
+ */
19
+ export declare class RabbitMQScaledJobRunner {
10
20
  private readonly amqpQueue;
11
21
  private readonly queueName;
12
22
  private readonly handler;
13
23
  protected logger: Logger;
14
24
  private options;
15
25
  constructor(amqpQueue: AmqpQueue, queueName: string, handler: Handler, options?: IRunnerOptions, logger?: Logger);
26
+ /**
27
+ * Normaliza opções com defaults seguros.
28
+ */
16
29
  private setOptions;
30
+ /**
31
+ * Aplica a estratégia de erro quando há uma mensagem em contexto.
32
+ */
17
33
  private handleError;
34
+ /**
35
+ * Executa a estratégia de erro escolhida (`nack-dlq` ou `nack-requeue`).
36
+ */
18
37
  protected errorStrategy(getResult: AmqpQueueGetResult): Promise<void>;
38
+ /**
39
+ * Desserializa a mensagem AMQP assumindo JSON no `content`.
40
+ */
19
41
  protected parse(raw: {
20
42
  content: Buffer;
21
43
  }): any;
22
- protected finishProcess(): Promise<never>;
44
+ /**
45
+ * Hook final simples para logs quando o processo termina.
46
+ */
47
+ private finishProcess;
48
+ /**
49
+ * Executa o ciclo completo do job.
50
+ *
51
+ * O número de mensagens por execução segue esta ordem:
52
+ * - `options.numberOfMessagesToGet` (deprecated).
53
+ * - `handler.getSimultaneity()`.
54
+ * - fallback para `1`.
55
+ */
23
56
  run(): Promise<void>;
24
57
  }
@@ -2,6 +2,16 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RabbitMQScaledJobRunner = void 0;
4
4
  const timeout_1 = require("../../../shared/timeout");
5
+ /**
6
+ * Runner de ScaledJob para RabbitMQ/AMQP baseado em polling (`get`).
7
+ *
8
+ * Fluxo geral por execução:
9
+ * - Conecta no broker.
10
+ * - Faz polling da fila até atingir o limite configurado.
11
+ * - Processa cada mensagem com o `Handler`.
12
+ * - Faz `ack` em sucesso e `nack` em erro (quando `manualAck` está ativo).
13
+ * - Fecha a conexão ao final.
14
+ */
5
15
  class RabbitMQScaledJobRunner {
6
16
  amqpQueue;
7
17
  queueName;
@@ -15,18 +25,27 @@ class RabbitMQScaledJobRunner {
15
25
  this.logger = logger;
16
26
  this.setOptions(options);
17
27
  }
28
+ /**
29
+ * Normaliza opções com defaults seguros.
30
+ */
18
31
  setOptions(options) {
19
32
  this.options = {
20
33
  errorStrategy: options?.errorStrategy || 'nack-dlq',
21
- manualAck: options?.manualAck || true,
34
+ manualAck: options?.manualAck ?? true,
22
35
  };
23
36
  }
37
+ /**
38
+ * Aplica a estratégia de erro quando há uma mensagem em contexto.
39
+ */
24
40
  async handleError(error, getResult) {
25
41
  if (!getResult) {
26
42
  return;
27
43
  }
28
44
  return await this.errorStrategy(getResult);
29
45
  }
46
+ /**
47
+ * Executa a estratégia de erro escolhida (`nack-dlq` ou `nack-requeue`).
48
+ */
30
49
  async errorStrategy(getResult) {
31
50
  const { channel, rawMessage } = getResult;
32
51
  try {
@@ -39,19 +58,35 @@ class RabbitMQScaledJobRunner {
39
58
  this.logger.info('[RabbitMQScaledJobRunner] Falha ao aplicar estratégia de erro');
40
59
  }
41
60
  }
61
+ /**
62
+ * Desserializa a mensagem AMQP assumindo JSON no `content`.
63
+ */
42
64
  parse(raw) {
43
65
  return JSON.parse(raw.content.toString());
44
66
  }
67
+ /**
68
+ * Hook final simples para logs quando o processo termina.
69
+ */
45
70
  async finishProcess() {
46
71
  this.logger.info('[RabbitMQScaledJobRunner] Finished process');
47
72
  return process.exit(0);
48
73
  }
74
+ /**
75
+ * Executa o ciclo completo do job.
76
+ *
77
+ * O número de mensagens por execução segue esta ordem:
78
+ * - `options.numberOfMessagesToGet` (deprecated).
79
+ * - `handler.getSimultaneity()`.
80
+ * - fallback para `1`.
81
+ */
49
82
  async run() {
50
83
  let getResult = null;
51
84
  let consumedMessages = 0;
52
- const timeoutPerMessageSeconds = this.handler.getTimeoutPerMessageSeconds();
53
- const messagesToGet = this.handler.getSimultaneity();
85
+ let timeoutPerMessageSeconds = undefined;
86
+ let messagesToGet = 1;
54
87
  try {
88
+ timeoutPerMessageSeconds = this.handler.getTimeoutPerMessageSeconds();
89
+ messagesToGet = this.handler.getSimultaneity();
55
90
  while (consumedMessages < messagesToGet) {
56
91
  try {
57
92
  getResult = await this.amqpQueue.get(this.queueName, {
@@ -5,123 +5,113 @@ const runner_1 = require("./runner");
5
5
  (0, vitest_1.describe)('RabbitMQScaledJobRunner', () => {
6
6
  let amqpQueue;
7
7
  let handler;
8
- let options;
9
- let onFinally;
10
- let runner;
8
+ let logger;
11
9
  (0, vitest_1.beforeEach)(() => {
12
10
  amqpQueue = {
13
- connect: vitest_1.vi.fn().mockResolvedValue(undefined),
14
- get: vitest_1.vi.fn().mockResolvedValue(null),
11
+ get: vitest_1.vi.fn(),
15
12
  ack: vitest_1.vi.fn().mockResolvedValue(undefined),
16
13
  nack: vitest_1.vi.fn().mockResolvedValue(undefined),
17
14
  close: vitest_1.vi.fn().mockResolvedValue(undefined),
18
15
  };
19
- handler = { handle: vitest_1.vi.fn().mockResolvedValue(undefined) };
20
- options = {
21
- manualAck: true,
22
- timeoutMs: 1000,
23
- errorStrategy: 'nack-dlq',
24
- parse: vitest_1.vi.fn((raw) => ({ ok: true, msg: 'parsed' })),
16
+ handler = {
17
+ handle: vitest_1.vi.fn().mockResolvedValue(undefined),
18
+ getSimultaneity: vitest_1.vi.fn().mockReturnValue(1),
19
+ getTimeoutPerMessageSeconds: vitest_1.vi.fn().mockReturnValue(undefined),
25
20
  };
26
- onFinally = vitest_1.vi.fn();
27
- runner = new runner_1.RabbitMQScaledJobRunner(amqpQueue, 'queue', handler, options);
21
+ logger = {
22
+ info: vitest_1.vi.fn(),
23
+ warn: vitest_1.vi.fn(),
24
+ error: vitest_1.vi.fn(),
25
+ debug: vitest_1.vi.fn(),
26
+ };
27
+ vitest_1.vi.spyOn(process, 'exit').mockImplementation((() => undefined));
28
+ });
29
+ (0, vitest_1.afterEach)(() => {
30
+ vitest_1.vi.useRealTimers();
31
+ vitest_1.vi.restoreAllMocks();
28
32
  });
29
- (0, vitest_1.it)('should connect, get, handle, ack and close (happy path)', async () => {
30
- const rawMessage = { content: Buffer.from('msg') };
33
+ const makeRunner = (options) => new runner_1.RabbitMQScaledJobRunner(amqpQueue, 'queue', handler, options, logger);
34
+ (0, vitest_1.it)('should connect the polling flow, parse the message, ack and close', async () => {
35
+ const rawMessage = { content: Buffer.from(JSON.stringify({ id: '1' })) };
31
36
  const channel = {};
37
+ const runner = makeRunner();
32
38
  amqpQueue.get.mockResolvedValue({ channel, rawMessage });
33
39
  await runner.run();
34
- (0, vitest_1.expect)(amqpQueue.connect).toHaveBeenCalledWith('vhost');
35
40
  (0, vitest_1.expect)(amqpQueue.get).toHaveBeenCalledWith('queue', { noAck: false });
36
- (0, vitest_1.expect)(options.parse).toHaveBeenCalledWith(rawMessage);
37
- (0, vitest_1.expect)(handler.handle).toHaveBeenCalledWith({ ok: true, msg: 'parsed' });
41
+ (0, vitest_1.expect)(handler.handle).toHaveBeenCalledWith({ id: '1' });
38
42
  (0, vitest_1.expect)(amqpQueue.ack).toHaveBeenCalledWith(channel, rawMessage);
39
- (0, vitest_1.expect)(amqpQueue.close).toHaveBeenCalled();
43
+ (0, vitest_1.expect)(amqpQueue.close).toHaveBeenCalledTimes(1);
44
+ (0, vitest_1.expect)(process.exit).toHaveBeenCalledWith(0);
40
45
  });
41
- (0, vitest_1.it)('should not ack if manualAck is false', async () => {
42
- options.manualAck = false;
43
- const rawMessage = { content: Buffer.from('msg') };
44
- const channel = {};
45
- amqpQueue.get.mockResolvedValue({ channel, rawMessage });
46
+ (0, vitest_1.it)('should skip ack when manualAck is disabled', async () => {
47
+ const rawMessage = { content: Buffer.from(JSON.stringify({ id: '1' })) };
48
+ const runner = makeRunner({ manualAck: false });
49
+ amqpQueue.get.mockResolvedValue({ channel: {}, rawMessage });
46
50
  await runner.run();
51
+ (0, vitest_1.expect)(amqpQueue.get).toHaveBeenCalledWith('queue', { noAck: true });
47
52
  (0, vitest_1.expect)(amqpQueue.ack).not.toHaveBeenCalled();
53
+ (0, vitest_1.expect)(amqpQueue.nack).not.toHaveBeenCalled();
48
54
  });
49
- (0, vitest_1.it)('should nack with correct strategy', async () => {
50
- options.errorStrategy = 'nack-requeue';
51
- const rawMessage = { content: Buffer.from('msg') };
55
+ (0, vitest_1.it)('should apply nack-requeue when handler fails', async () => {
56
+ const rawMessage = { content: Buffer.from(JSON.stringify({ id: '1' })) };
52
57
  const channel = {};
58
+ const runner = makeRunner({ errorStrategy: 'nack-requeue' });
53
59
  amqpQueue.get.mockResolvedValue({ channel, rawMessage });
54
- handler.handle = vitest_1.vi.fn(() => {
55
- throw new Error('fail');
56
- });
60
+ handler.handle.mockRejectedValue(new Error('fail'));
57
61
  await runner.run();
58
62
  (0, vitest_1.expect)(amqpQueue.nack).toHaveBeenCalledWith(channel, rawMessage, true);
63
+ (0, vitest_1.expect)(amqpQueue.ack).not.toHaveBeenCalled();
59
64
  });
60
- (0, vitest_1.it)('should nack with default strategy', async () => {
61
- options.errorStrategy = 'nack-dlq';
62
- const rawMessage = { content: Buffer.from('msg') };
63
- const channel = {};
64
- amqpQueue.get.mockResolvedValue({ channel, rawMessage });
65
- handler.handle = vitest_1.vi.fn(() => {
66
- throw new Error('fail');
67
- });
68
- await runner.run();
69
- (0, vitest_1.expect)(amqpQueue.nack).toHaveBeenCalledWith(channel, rawMessage, false);
70
- });
71
- (0, vitest_1.it)('should log and return if no message is available', async () => {
65
+ (0, vitest_1.it)('should stop when there is no message available', async () => {
66
+ const runner = makeRunner();
72
67
  amqpQueue.get.mockResolvedValue(null);
73
68
  await runner.run();
74
69
  (0, vitest_1.expect)(handler.handle).not.toHaveBeenCalled();
70
+ (0, vitest_1.expect)(logger.info).toHaveBeenCalledWith('[RabbitMQScaledJobRunner] Nenhuma mensagem disponível.');
75
71
  });
76
- (0, vitest_1.it)('should log error if amqpQueue.connect throws', async () => {
77
- amqpQueue.connect.mockRejectedValue(new Error('fail'));
78
- await runner.run();
79
- (0, vitest_1.expect)(amqpQueue.connect).toHaveBeenCalledWith('vhost');
80
- });
81
- (0, vitest_1.it)('should log error if amqpQueue.close throws', async () => {
82
- amqpQueue.close.mockRejectedValue(new Error('fail'));
83
- const rawMessage = { content: Buffer.from('msg') };
72
+ (0, vitest_1.it)('should handle timeout and nack the message', async () => {
73
+ vitest_1.vi.useFakeTimers();
74
+ const rawMessage = { content: Buffer.from(JSON.stringify({ id: '1' })) };
84
75
  const channel = {};
76
+ const runner = makeRunner();
85
77
  amqpQueue.get.mockResolvedValue({ channel, rawMessage });
86
- await runner.run();
87
- (0, vitest_1.expect)(amqpQueue.close).toHaveBeenCalled();
78
+ handler.handle.mockImplementation(() => new Promise(() => undefined));
79
+ handler.getTimeoutPerMessageSeconds.mockReturnValue(1);
80
+ const runPromise = runner.run();
81
+ await vitest_1.vi.advanceTimersByTimeAsync(1000);
82
+ await runPromise;
83
+ (0, vitest_1.expect)(amqpQueue.nack).toHaveBeenCalledWith(channel, rawMessage, false);
84
+ (0, vitest_1.expect)(logger.info).toHaveBeenCalledWith('[RabbitMQScaledJobRunner] Erro: Timeout');
88
85
  });
89
- (0, vitest_1.it)('should call onFinally if close fails', async () => {
90
- amqpQueue.close.mockRejectedValue(new Error('fail'));
91
- const rawMessage = { content: Buffer.from('msg') };
92
- const channel = {};
93
- amqpQueue.get.mockResolvedValue({ channel, rawMessage });
94
- await runner.run();
95
- // onFinally is called inside finishProcess
96
- // No assertion needed for logger, just ensure no throw
86
+ (0, vitest_1.it)('should ignore errors when nack strategy fails', async () => {
87
+ const runner = makeRunner({ errorStrategy: 'nack-dlq' });
88
+ amqpQueue.nack.mockRejectedValue(new Error('nack failed'));
89
+ await (0, vitest_1.expect)(runner['errorStrategy']({
90
+ channel: {},
91
+ rawMessage: { content: Buffer.from('{}') },
92
+ })).resolves.toBeUndefined();
93
+ (0, vitest_1.expect)(logger.info).toHaveBeenCalledWith('[RabbitMQScaledJobRunner] Falha ao aplicar estratégia de erro');
97
94
  });
98
- (0, vitest_1.it)('should handle timeout and call nack', async () => {
99
- options.timeoutMs = 10;
100
- handler.handle = vitest_1.vi.fn(() => new Promise(() => { }));
101
- const rawMessage = { content: Buffer.from('msg') };
102
- const channel = {};
103
- amqpQueue.get.mockResolvedValue({ channel, rawMessage });
104
- await runner.run();
105
- (0, vitest_1.expect)(amqpQueue.nack).toHaveBeenCalledWith(channel, rawMessage, false);
95
+ (0, vitest_1.it)('should return early when there is no message to handle as error context', async () => {
96
+ const runner = makeRunner();
97
+ await (0, vitest_1.expect)(runner['handleError'](new Error('fail'), null)).resolves.toBeUndefined();
98
+ (0, vitest_1.expect)(amqpQueue.nack).not.toHaveBeenCalled();
106
99
  });
107
- (0, vitest_1.it)('should handle error in nack gracefully', async () => {
108
- amqpQueue.nack.mockRejectedValue(new Error('fail'));
109
- options.errorStrategy = 'nack-dlq';
110
- const rawMessage = { content: Buffer.from('msg') };
111
- const channel = {};
112
- amqpQueue.get.mockResolvedValue({ channel, rawMessage });
113
- handler.handle = vitest_1.vi.fn(() => {
114
- throw new Error('fail');
115
- });
100
+ (0, vitest_1.it)('should log close errors and still finish the process', async () => {
101
+ const runner = makeRunner();
102
+ amqpQueue.get.mockResolvedValue(null);
103
+ amqpQueue.close.mockRejectedValue(new Error('close failed'));
116
104
  await runner.run();
117
- (0, vitest_1.expect)(amqpQueue.nack).toHaveBeenCalledWith(channel, rawMessage, false);
105
+ (0, vitest_1.expect)(logger.info).toHaveBeenCalledWith('[RabbitMQScaledJobRunner] Erro ao fechar conexão', vitest_1.expect.any(Error));
106
+ (0, vitest_1.expect)(process.exit).toHaveBeenCalledWith(0);
118
107
  });
119
- (0, vitest_1.it)('should handle error in ack gracefully', async () => {
120
- amqpQueue.ack.mockRejectedValue(new Error('fail'));
121
- const rawMessage = { content: Buffer.from('msg') };
122
- const channel = {};
123
- amqpQueue.get.mockResolvedValue({ channel, rawMessage });
108
+ (0, vitest_1.it)('should handle unexpected outer errors and still close', async () => {
109
+ const runner = makeRunner();
110
+ handler.getSimultaneity.mockImplementation(() => {
111
+ throw new Error('outer failure');
112
+ });
124
113
  await runner.run();
125
- (0, vitest_1.expect)(amqpQueue.ack).toHaveBeenCalledWith(channel, rawMessage);
114
+ (0, vitest_1.expect)(logger.info).toHaveBeenCalledWith('[RabbitMQScaledJobRunner] Erro: {}');
115
+ (0, vitest_1.expect)(amqpQueue.close).toHaveBeenCalledTimes(1);
126
116
  });
127
117
  });
@@ -1,6 +1,25 @@
1
1
  import { ScaledJobOptions } from '../types';
2
+ /**
3
+ * Estratégia de erro aplicada quando o handler falha.
4
+ */
2
5
  export type ErrorStrategy = 'nack-dlq' | 'nack-requeue';
6
+ /**
7
+ * Opções para execução de ScaledJobs com RabbitMQ/AMQP.
8
+ */
3
9
  export interface RabbitMQScaledJobOptions extends ScaledJobOptions {
10
+ /**
11
+ * @deprecated Use the simultaneity attribute on Handler.
12
+ */
13
+ numberOfMessagesToGet?: number;
14
+ /**
15
+ * Define se o runner deve confirmar manualmente as mensagens.
16
+ *
17
+ * Quando `true`, o runner usa `ack` em caso de sucesso e `nack` em erro.
18
+ * Quando `false`, o polling é feito com `noAck: true`.
19
+ */
4
20
  manualAck: boolean;
21
+ /**
22
+ * Define o que fazer quando ocorre erro no processamento.
23
+ */
5
24
  errorStrategy: ErrorStrategy;
6
25
  }
@@ -1,6 +1,15 @@
1
1
  import Handler from '../../../../clean-arch/application/queue/handler';
2
2
  import { SQSScaledJobOptions } from './types';
3
3
  import { Logger } from '../../../../clean-arch/application/logger';
4
+ /**
5
+ * Runner de ScaledJob para AWS SQS baseado em polling.
6
+ *
7
+ * Fluxo geral por execução:
8
+ * - Faz polling com `ReceiveMessageCommand`.
9
+ * - Processa a mensagem com o `Handler`.
10
+ * - Em sucesso, deleta com `DeleteMessageCommand`.
11
+ * - Respeita simultaneidade e timeout configurados no `Handler`.
12
+ */
4
13
  export declare class SQSScaledJobRunner {
5
14
  private readonly handler;
6
15
  private readonly queueUrl;
@@ -9,8 +18,22 @@ export declare class SQSScaledJobRunner {
9
18
  private sqs;
10
19
  private timedOut;
11
20
  constructor(handler: Handler, queueUrl: string, options: SQSScaledJobOptions, logger?: Logger);
21
+ /**
22
+ * Desserializa a mensagem do SQS.
23
+ *
24
+ * O SQS entrega o corpo como string e este método garante que seja JSON.
25
+ */
12
26
  private static parseMessage;
27
+ /**
28
+ * Processa mensagens até atingir o limite de simultaneidade ou timeout.
29
+ */
13
30
  process(): Promise<void>;
31
+ /**
32
+ * Marca o runner como expirado após um timeout global.
33
+ */
14
34
  private timeout;
35
+ /**
36
+ * Executa o job concorrendo com um timeout global (quando configurado).
37
+ */
15
38
  run(): Promise<void>;
16
39
  }
@@ -3,6 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SQSScaledJobRunner = void 0;
4
4
  const client_sqs_1 = require("@aws-sdk/client-sqs");
5
5
  const timeout_1 = require("../../../../clean-arch/shared/timeout");
6
+ /**
7
+ * Runner de ScaledJob para AWS SQS baseado em polling.
8
+ *
9
+ * Fluxo geral por execução:
10
+ * - Faz polling com `ReceiveMessageCommand`.
11
+ * - Processa a mensagem com o `Handler`.
12
+ * - Em sucesso, deleta com `DeleteMessageCommand`.
13
+ * - Respeita simultaneidade e timeout configurados no `Handler`.
14
+ */
6
15
  class SQSScaledJobRunner {
7
16
  handler;
8
17
  queueUrl;
@@ -17,6 +26,11 @@ class SQSScaledJobRunner {
17
26
  this.logger = logger;
18
27
  this.sqs = new client_sqs_1.SQSClient({ region: this.options.sqsRegion });
19
28
  }
29
+ /**
30
+ * Desserializa a mensagem do SQS.
31
+ *
32
+ * O SQS entrega o corpo como string e este método garante que seja JSON.
33
+ */
20
34
  static parseMessage(rawMessage) {
21
35
  if (rawMessage === null || rawMessage === undefined) {
22
36
  throw new Error('[SQSScaledJobRunner] Mensagem inválida.');
@@ -26,6 +40,9 @@ class SQSScaledJobRunner {
26
40
  }
27
41
  return JSON.parse(rawMessage);
28
42
  }
43
+ /**
44
+ * Processa mensagens até atingir o limite de simultaneidade ou timeout.
45
+ */
29
46
  async process() {
30
47
  let consumedMessages = 0;
31
48
  const simultaneity = this.handler.getSimultaneity();
@@ -66,15 +83,22 @@ class SQSScaledJobRunner {
66
83
  }
67
84
  }
68
85
  }
86
+ /**
87
+ * Marca o runner como expirado após um timeout global.
88
+ */
69
89
  async timeout(timeoutSeconds) {
70
90
  await (0, timeout_1.sleep)(timeoutSeconds * 1000);
71
91
  this.timedOut = true;
72
92
  }
93
+ /**
94
+ * Executa o job concorrendo com um timeout global (quando configurado).
95
+ */
73
96
  async run() {
97
+ const promises = [this.process()];
74
98
  if (this.options.processTimeoutSeconds) {
75
- this.timeout(this.options.processTimeoutSeconds);
99
+ promises.push(this.timeout(this.options.processTimeoutSeconds));
76
100
  }
77
- await this.process();
101
+ await Promise.race(promises);
78
102
  }
79
103
  }
80
104
  exports.SQSScaledJobRunner = SQSScaledJobRunner;
@@ -0,0 +1,150 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const tslib_1 = require("tslib");
4
+ const vitest_1 = require("vitest");
5
+ const { sendMock } = vitest_1.vi.hoisted(() => ({
6
+ sendMock: vitest_1.vi.fn(),
7
+ }));
8
+ vitest_1.vi.mock('@aws-sdk/client-sqs', () => ({
9
+ ReceiveMessageCommand: class ReceiveMessageCommand {
10
+ input;
11
+ constructor(input) {
12
+ this.input = input;
13
+ }
14
+ },
15
+ DeleteMessageCommand: class DeleteMessageCommand {
16
+ input;
17
+ constructor(input) {
18
+ this.input = input;
19
+ }
20
+ },
21
+ SQSClient: class SQSClient {
22
+ config;
23
+ send = sendMock;
24
+ constructor(config) {
25
+ this.config = config;
26
+ }
27
+ },
28
+ }));
29
+ const client_sqs_1 = require("@aws-sdk/client-sqs");
30
+ const handler_1 = tslib_1.__importDefault(require("../../../application/queue/handler"));
31
+ const runner_1 = require("./runner");
32
+ class TestHandler extends handler_1.default {
33
+ handleMock = vitest_1.vi.fn().mockResolvedValue(undefined);
34
+ constructor(simultaneity = 1, timeoutPerMessageSeconds) {
35
+ super();
36
+ this.simultaneity = simultaneity;
37
+ this.timeoutPerMessageSeconds = timeoutPerMessageSeconds;
38
+ }
39
+ async handle(message) {
40
+ await this.handleMock(message);
41
+ }
42
+ }
43
+ const createLogger = () => ({
44
+ info: vitest_1.vi.fn(),
45
+ warn: vitest_1.vi.fn(),
46
+ error: vitest_1.vi.fn(),
47
+ debug: vitest_1.vi.fn(),
48
+ });
49
+ (0, vitest_1.describe)('SQSScaledJobRunner', () => {
50
+ (0, vitest_1.beforeEach)(() => {
51
+ sendMock.mockReset();
52
+ });
53
+ (0, vitest_1.afterEach)(() => {
54
+ vitest_1.vi.useRealTimers();
55
+ vitest_1.vi.restoreAllMocks();
56
+ });
57
+ (0, vitest_1.it)('should receive, process and delete messages from SQS', async () => {
58
+ vitest_1.vi.useFakeTimers();
59
+ const handler = new TestHandler(1, 1);
60
+ const logger = createLogger();
61
+ const runner = new runner_1.SQSScaledJobRunner(handler, 'queue-url', {
62
+ sqsRegion: 'us-east-1',
63
+ waitMessagesTimeSeconds: 5,
64
+ }, logger);
65
+ sendMock
66
+ .mockResolvedValueOnce({
67
+ Messages: [
68
+ {
69
+ Body: JSON.stringify({ id: '1' }),
70
+ ReceiptHandle: 'receipt-handle',
71
+ },
72
+ ],
73
+ })
74
+ .mockResolvedValueOnce({});
75
+ const processPromise = runner.process();
76
+ await vitest_1.vi.runAllTimersAsync();
77
+ await processPromise;
78
+ (0, vitest_1.expect)(sendMock).toHaveBeenNthCalledWith(1, vitest_1.expect.any(client_sqs_1.ReceiveMessageCommand));
79
+ (0, vitest_1.expect)(sendMock.mock.calls[0][0].input).toEqual({
80
+ QueueUrl: 'queue-url',
81
+ MaxNumberOfMessages: 1,
82
+ WaitTimeSeconds: 5,
83
+ });
84
+ (0, vitest_1.expect)(handler.handleMock).toHaveBeenCalledWith({ id: '1' });
85
+ (0, vitest_1.expect)(sendMock).toHaveBeenNthCalledWith(2, vitest_1.expect.any(client_sqs_1.DeleteMessageCommand));
86
+ (0, vitest_1.expect)(sendMock.mock.calls[1][0].input).toEqual({
87
+ QueueUrl: 'queue-url',
88
+ ReceiptHandle: 'receipt-handle',
89
+ });
90
+ (0, vitest_1.expect)(logger.info).toHaveBeenCalledWith('[SQSScaledJobRunner] Mensagem processada com sucesso');
91
+ (0, vitest_1.expect)(logger.info).toHaveBeenCalledWith('[SQSScaledJobRunner] Mensagem deletada');
92
+ });
93
+ (0, vitest_1.it)('should keep polling until simultaneity is reached when there are no messages', async () => {
94
+ const handler = new TestHandler(2);
95
+ const logger = createLogger();
96
+ const runner = new runner_1.SQSScaledJobRunner(handler, 'queue-url', {
97
+ sqsRegion: 'us-east-1',
98
+ }, logger);
99
+ sendMock.mockResolvedValue({
100
+ Messages: [],
101
+ });
102
+ await runner.process();
103
+ (0, vitest_1.expect)(sendMock).toHaveBeenCalledTimes(2);
104
+ (0, vitest_1.expect)(logger.info).toHaveBeenCalledWith('[SQSScaledJobRunner] Nenhuma mensagem disponível.');
105
+ (0, vitest_1.expect)(handler.handleMock).not.toHaveBeenCalled();
106
+ });
107
+ (0, vitest_1.it)('should log invalid messages and guard the parser against unsupported inputs', async () => {
108
+ const handler = new TestHandler();
109
+ const logger = createLogger();
110
+ const runner = new runner_1.SQSScaledJobRunner(handler, 'queue-url', {
111
+ sqsRegion: 'us-east-1',
112
+ }, logger);
113
+ sendMock.mockResolvedValueOnce({
114
+ Messages: [
115
+ {
116
+ Body: null,
117
+ ReceiptHandle: 'receipt-handle',
118
+ },
119
+ ],
120
+ });
121
+ await runner.process();
122
+ (0, vitest_1.expect)(logger.info).toHaveBeenCalledWith(vitest_1.expect.stringContaining('[SQSScaledJobRunner] Erro:'));
123
+ (0, vitest_1.expect)(handler.handleMock).not.toHaveBeenCalled();
124
+ (0, vitest_1.expect)(() => runner_1.SQSScaledJobRunner.parseMessage(undefined)).toThrow('[SQSScaledJobRunner] Mensagem inválida.');
125
+ (0, vitest_1.expect)(() => runner_1.SQSScaledJobRunner.parseMessage(123)).toThrow('[SQSScaledJobRunner] Mensagem deve ser uma string.');
126
+ });
127
+ (0, vitest_1.it)('should race processing with the global timeout when configured', async () => {
128
+ const runner = new runner_1.SQSScaledJobRunner(new TestHandler(), 'queue-url', {
129
+ sqsRegion: 'us-east-1',
130
+ processTimeoutSeconds: 3,
131
+ }, createLogger());
132
+ const processSpy = vitest_1.vi
133
+ .spyOn(runner, 'process')
134
+ .mockImplementation(() => new Promise(() => undefined));
135
+ const timeoutSpy = vitest_1.vi
136
+ .spyOn(runner, 'timeout')
137
+ .mockResolvedValue(undefined);
138
+ await runner.run();
139
+ (0, vitest_1.expect)(processSpy).toHaveBeenCalledTimes(1);
140
+ (0, vitest_1.expect)(timeoutSpy).toHaveBeenCalledWith(3);
141
+ });
142
+ (0, vitest_1.it)('should run processing directly when no global timeout is configured', async () => {
143
+ const runner = new runner_1.SQSScaledJobRunner(new TestHandler(), 'queue-url', {
144
+ sqsRegion: 'us-east-1',
145
+ }, createLogger());
146
+ const processSpy = vitest_1.vi.spyOn(runner, 'process').mockResolvedValue(undefined);
147
+ await runner.run();
148
+ (0, vitest_1.expect)(processSpy).toHaveBeenCalledTimes(1);
149
+ });
150
+ });