@machinemetrics/mm-erp-sdk 0.1.9 → 0.2.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. package/README.md +0 -5
  2. package/dist/config-CvA-mFWF.js +418 -0
  3. package/dist/config-CvA-mFWF.js.map +1 -0
  4. package/dist/connector-factory-BPm2GVVF.js +30 -0
  5. package/dist/connector-factory-BPm2GVVF.js.map +1 -0
  6. package/dist/hashed-cache-manager-B15NN8hK.js +322 -0
  7. package/dist/hashed-cache-manager-B15NN8hK.js.map +1 -0
  8. package/dist/index-D8qO1NyK.js +192 -0
  9. package/dist/index-D8qO1NyK.js.map +1 -0
  10. package/dist/index.d.ts +43 -42
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/knexfile-Bng2Ru9c.js +20 -0
  13. package/dist/knexfile-Bng2Ru9c.js.map +1 -0
  14. package/dist/knexfile.d.ts.map +1 -1
  15. package/dist/logger-BWw0_z9q.js +17557 -0
  16. package/dist/logger-BWw0_z9q.js.map +1 -0
  17. package/dist/migrations/20241015162631_create_cache_table.js +15 -11
  18. package/dist/migrations/20241015162631_create_cache_table.js.map +1 -1
  19. package/dist/migrations/20241015162632_create_sdk_cache_table.js +15 -11
  20. package/dist/migrations/20241015162632_create_sdk_cache_table.js.map +1 -1
  21. package/dist/migrations/20250103162631_create_record_tracking_table.js +15 -14
  22. package/dist/migrations/20250103162631_create_record_tracking_table.js.map +1 -1
  23. package/dist/mm-erp-sdk.js +4978 -0
  24. package/dist/mm-erp-sdk.js.map +1 -0
  25. package/dist/services/caching-service/batch-cache-manager.d.ts +1 -1
  26. package/dist/services/caching-service/batch-cache-manager.d.ts.map +1 -1
  27. package/dist/services/caching-service/hashed-cache-manager.d.ts +2 -2
  28. package/dist/services/caching-service/hashed-cache-manager.d.ts.map +1 -1
  29. package/dist/services/caching-service/index.d.ts +1 -1
  30. package/dist/services/caching-service/index.d.ts.map +1 -1
  31. package/dist/services/caching-service/record-tracking-manager.d.ts +1 -1
  32. package/dist/services/caching-service/record-tracking-manager.d.ts.map +1 -1
  33. package/dist/services/data-sync-service/configuration-manager.d.ts +1 -1
  34. package/dist/services/data-sync-service/configuration-manager.d.ts.map +1 -1
  35. package/dist/services/data-sync-service/data-sync-service.d.ts.map +1 -1
  36. package/dist/services/data-sync-service/index.d.ts +3 -3
  37. package/dist/services/data-sync-service/index.d.ts.map +1 -1
  38. package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js +39 -40
  39. package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js.map +1 -1
  40. package/dist/services/data-sync-service/jobs/from-erp.d.ts.map +1 -1
  41. package/dist/services/data-sync-service/jobs/from-erp.js +36 -48
  42. package/dist/services/data-sync-service/jobs/from-erp.js.map +1 -1
  43. package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js +35 -36
  44. package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js.map +1 -1
  45. package/dist/services/data-sync-service/jobs/run-migrations.js +21 -22
  46. package/dist/services/data-sync-service/jobs/run-migrations.js.map +1 -1
  47. package/dist/services/data-sync-service/jobs/to-erp.d.ts.map +1 -1
  48. package/dist/services/data-sync-service/jobs/to-erp.js +45 -48
  49. package/dist/services/data-sync-service/jobs/to-erp.js.map +1 -1
  50. package/dist/services/data-sync-service/nats-labor-ticket-listener.d.ts +30 -0
  51. package/dist/services/data-sync-service/nats-labor-ticket-listener.d.ts.map +1 -0
  52. package/dist/services/erp-api-services/errors.d.ts +1 -1
  53. package/dist/services/erp-api-services/errors.d.ts.map +1 -1
  54. package/dist/services/erp-api-services/graphql/graphql-service.d.ts +2 -2
  55. package/dist/services/erp-api-services/graphql/graphql-service.d.ts.map +1 -1
  56. package/dist/services/erp-api-services/index.d.ts +8 -8
  57. package/dist/services/erp-api-services/index.d.ts.map +1 -1
  58. package/dist/services/erp-api-services/rest/rest-api-service.d.ts +2 -2
  59. package/dist/services/erp-api-services/rest/rest-api-service.d.ts.map +1 -1
  60. package/dist/services/erp-api-services/types.d.ts +2 -2
  61. package/dist/services/erp-api-services/types.d.ts.map +1 -1
  62. package/dist/services/mm-api-service/company-info.d.ts +13 -0
  63. package/dist/services/mm-api-service/company-info.d.ts.map +1 -0
  64. package/dist/services/mm-api-service/index.d.ts +13 -6
  65. package/dist/services/mm-api-service/index.d.ts.map +1 -1
  66. package/dist/services/mm-api-service/mm-api-service.d.ts +13 -7
  67. package/dist/services/mm-api-service/mm-api-service.d.ts.map +1 -1
  68. package/dist/services/mm-api-service/types/entity-transformer.d.ts +2 -2
  69. package/dist/services/mm-api-service/types/entity-transformer.d.ts.map +1 -1
  70. package/dist/services/mm-api-service/types/receive-types.d.ts +3 -0
  71. package/dist/services/mm-api-service/types/receive-types.d.ts.map +1 -1
  72. package/dist/services/nats-service/nats-service.d.ts +114 -0
  73. package/dist/services/nats-service/nats-service.d.ts.map +1 -0
  74. package/dist/services/nats-service/test-nats-subscriber.d.ts +6 -0
  75. package/dist/services/nats-service/test-nats-subscriber.d.ts.map +1 -0
  76. package/dist/services/psql-erp-service/index.d.ts +3 -3
  77. package/dist/services/psql-erp-service/index.d.ts.map +1 -1
  78. package/dist/services/psql-erp-service/psql-service.d.ts +2 -2
  79. package/dist/services/psql-erp-service/psql-service.d.ts.map +1 -1
  80. package/dist/services/reporting-service/index.d.ts +1 -1
  81. package/dist/services/reporting-service/index.d.ts.map +1 -1
  82. package/dist/services/reporting-service/logger.d.ts.map +1 -1
  83. package/dist/services/sql-server-erp-service/index.d.ts +3 -3
  84. package/dist/services/sql-server-erp-service/index.d.ts.map +1 -1
  85. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts +2 -2
  86. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts.map +1 -1
  87. package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts +3 -3
  88. package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts.map +1 -1
  89. package/dist/services/sql-server-erp-service/sql-server-service.d.ts +2 -2
  90. package/dist/services/sql-server-erp-service/sql-server-service.d.ts.map +1 -1
  91. package/dist/services/sqlite-service/index.d.ts +1 -1
  92. package/dist/services/sqlite-service/index.d.ts.map +1 -1
  93. package/dist/types/erp-connector.d.ts +1 -1
  94. package/dist/types/erp-connector.d.ts.map +1 -1
  95. package/dist/types/index.d.ts +2 -2
  96. package/dist/types/index.d.ts.map +1 -1
  97. package/dist/utils/connector-factory.d.ts +1 -1
  98. package/dist/utils/connector-factory.d.ts.map +1 -1
  99. package/dist/utils/connector-log/log-deduper.d.ts +1 -1
  100. package/dist/utils/connector-log/log-deduper.d.ts.map +1 -1
  101. package/dist/utils/connector-log/mm-connector-logger-example.d.ts +0 -1
  102. package/dist/utils/connector-log/mm-connector-logger.d.ts +1 -1
  103. package/dist/utils/connector-log/mm-connector-logger.d.ts.map +1 -1
  104. package/dist/utils/erp-type-from-entity.d.ts +1 -1
  105. package/dist/utils/erp-type-from-entity.d.ts.map +1 -1
  106. package/dist/utils/error-formatter.d.ts +19 -0
  107. package/dist/utils/error-formatter.d.ts.map +1 -0
  108. package/dist/utils/index.d.ts +38 -33
  109. package/dist/utils/index.d.ts.map +1 -1
  110. package/dist/utils/mm-labor-ticket-helpers.d.ts +1 -1
  111. package/dist/utils/mm-labor-ticket-helpers.d.ts.map +1 -1
  112. package/dist/utils/removeExtraneousFields.d.ts +1 -1
  113. package/dist/utils/removeExtraneousFields.d.ts.map +1 -1
  114. package/dist/utils/removeIdFieldFromPayload.d.ts +1 -1
  115. package/dist/utils/removeIdFieldFromPayload.d.ts.map +1 -1
  116. package/dist/utils/resource-group.d.ts +1 -1
  117. package/dist/utils/resource-group.d.ts.map +1 -1
  118. package/dist/utils/standard-process-drivers/error-processor.d.ts +3 -3
  119. package/dist/utils/standard-process-drivers/error-processor.d.ts.map +1 -1
  120. package/dist/utils/standard-process-drivers/index.d.ts +3 -3
  121. package/dist/utils/standard-process-drivers/index.d.ts.map +1 -1
  122. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts +1 -1
  123. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts.map +1 -1
  124. package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts +4 -4
  125. package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts.map +1 -1
  126. package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts +4 -4
  127. package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts.map +1 -1
  128. package/package.json +10 -6
  129. package/src/index.ts +45 -42
  130. package/src/knexfile.ts +0 -1
  131. package/src/services/caching-service/batch-cache-manager.ts +2 -2
  132. package/src/services/caching-service/hashed-cache-manager.ts +5 -5
  133. package/src/services/caching-service/index.ts +1 -1
  134. package/src/services/caching-service/record-tracking-manager.ts +2 -2
  135. package/src/services/data-sync-service/configuration-manager.ts +2 -2
  136. package/src/services/data-sync-service/data-sync-service.ts +19 -10
  137. package/src/services/data-sync-service/index.ts +3 -3
  138. package/src/services/data-sync-service/jobs/clean-up-expired-cache.ts +3 -3
  139. package/src/services/data-sync-service/jobs/from-erp.ts +5 -10
  140. package/src/services/data-sync-service/jobs/retry-failed-labor-tickets.ts +2 -2
  141. package/src/services/data-sync-service/jobs/run-migrations.ts +2 -2
  142. package/src/services/data-sync-service/jobs/to-erp.ts +7 -3
  143. package/src/services/data-sync-service/nats-labor-ticket-listener.ts +341 -0
  144. package/src/services/erp-api-services/errors.ts +3 -3
  145. package/src/services/erp-api-services/graphql/graphql-service.ts +5 -5
  146. package/src/services/erp-api-services/index.ts +8 -8
  147. package/src/services/erp-api-services/rest/rest-api-service.ts +4 -4
  148. package/src/services/erp-api-services/types.ts +2 -2
  149. package/src/services/mm-api-service/company-info.ts +87 -0
  150. package/src/services/mm-api-service/index.ts +14 -6
  151. package/src/services/mm-api-service/mm-api-service.ts +29 -12
  152. package/src/services/mm-api-service/token-mgr.ts +4 -4
  153. package/src/services/mm-api-service/types/entity-transformer.ts +3 -3
  154. package/src/services/mm-api-service/types/receive-types.ts +1 -0
  155. package/src/services/nats-service/nats-service.ts +351 -0
  156. package/src/services/nats-service/test-nats-subscriber.ts +96 -0
  157. package/src/services/psql-erp-service/index.ts +3 -3
  158. package/src/services/psql-erp-service/psql-service.ts +4 -4
  159. package/src/services/reporting-service/index.ts +1 -1
  160. package/src/services/reporting-service/logger.ts +81 -111
  161. package/src/services/sql-server-erp-service/index.ts +3 -3
  162. package/src/services/sql-server-erp-service/internal/sql-labor-ticket-operations.ts +2 -2
  163. package/src/services/sql-server-erp-service/internal/sql-transaction-manager.ts +1 -1
  164. package/src/services/sql-server-erp-service/sql-server-helpers.ts +6 -6
  165. package/src/services/sql-server-erp-service/sql-server-service.ts +4 -4
  166. package/src/services/sqlite-service/index.ts +1 -1
  167. package/src/services/sqlite-service/sqlite-coordinator.ts +2 -2
  168. package/src/types/erp-connector.ts +1 -1
  169. package/src/types/index.ts +2 -2
  170. package/src/utils/application-initializer.ts +5 -5
  171. package/src/utils/connector-factory.ts +2 -2
  172. package/src/utils/connector-log/log-deduper.ts +2 -2
  173. package/src/utils/connector-log/mm-connector-logger.ts +3 -3
  174. package/src/utils/erp-type-from-entity.ts +1 -1
  175. package/src/utils/error-formatter.ts +205 -0
  176. package/src/utils/http-client.ts +3 -2
  177. package/src/utils/index.ts +39 -33
  178. package/src/utils/local-data-store/database-lock.ts +1 -1
  179. package/src/utils/mm-labor-ticket-helpers.ts +2 -2
  180. package/src/utils/removeExtraneousFields.ts +1 -1
  181. package/src/utils/removeIdFieldFromPayload.ts +1 -1
  182. package/src/utils/resource-group.ts +2 -2
  183. package/src/utils/standard-process-drivers/error-processor.ts +5 -5
  184. package/src/utils/standard-process-drivers/index.ts +3 -3
  185. package/src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts +6 -6
  186. package/src/utils/standard-process-drivers/mm-entity-processor.ts +7 -7
  187. package/src/utils/standard-process-drivers/standard-process-drivers.ts +6 -6
  188. package/src/utils/time-utils.ts +3 -3
  189. package/src/utils/timezone.ts +2 -2
  190. package/dist/index.js +0 -48
  191. package/dist/index.js.map +0 -1
  192. package/dist/knexfile.js +0 -19
  193. package/dist/knexfile.js.map +0 -1
  194. package/dist/migrations/20241015162631_create_cache_table.d.ts +0 -4
  195. package/dist/migrations/20241015162631_create_cache_table.d.ts.map +0 -1
  196. package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts +0 -4
  197. package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts.map +0 -1
  198. package/dist/migrations/20250103162631_create_record_tracking_table.d.ts +0 -4
  199. package/dist/migrations/20250103162631_create_record_tracking_table.d.ts.map +0 -1
  200. package/dist/services/caching-service/batch-cache-manager.js +0 -84
  201. package/dist/services/caching-service/batch-cache-manager.js.map +0 -1
  202. package/dist/services/caching-service/hashed-cache-manager.js +0 -223
  203. package/dist/services/caching-service/hashed-cache-manager.js.map +0 -1
  204. package/dist/services/caching-service/index.js +0 -2
  205. package/dist/services/caching-service/index.js.map +0 -1
  206. package/dist/services/caching-service/record-tracking-manager.js +0 -28
  207. package/dist/services/caching-service/record-tracking-manager.js.map +0 -1
  208. package/dist/services/data-sync-service/configuration-manager.js +0 -163
  209. package/dist/services/data-sync-service/configuration-manager.js.map +0 -1
  210. package/dist/services/data-sync-service/data-sync-service.js +0 -95
  211. package/dist/services/data-sync-service/data-sync-service.js.map +0 -1
  212. package/dist/services/data-sync-service/index.js +0 -10
  213. package/dist/services/data-sync-service/index.js.map +0 -1
  214. package/dist/services/erp-api-services/errors.js +0 -83
  215. package/dist/services/erp-api-services/errors.js.map +0 -1
  216. package/dist/services/erp-api-services/graphql/graphql-service.js +0 -102
  217. package/dist/services/erp-api-services/graphql/graphql-service.js.map +0 -1
  218. package/dist/services/erp-api-services/graphql/types.js +0 -6
  219. package/dist/services/erp-api-services/graphql/types.js.map +0 -1
  220. package/dist/services/erp-api-services/index.js +0 -13
  221. package/dist/services/erp-api-services/index.js.map +0 -1
  222. package/dist/services/erp-api-services/oauth-client.js +0 -41
  223. package/dist/services/erp-api-services/oauth-client.js.map +0 -1
  224. package/dist/services/erp-api-services/rest/get-query-params.js +0 -23
  225. package/dist/services/erp-api-services/rest/get-query-params.js.map +0 -1
  226. package/dist/services/erp-api-services/rest/rest-api-service.js +0 -163
  227. package/dist/services/erp-api-services/rest/rest-api-service.js.map +0 -1
  228. package/dist/services/erp-api-services/types.js +0 -2
  229. package/dist/services/erp-api-services/types.js.map +0 -1
  230. package/dist/services/mm-api-service/index.js +0 -15
  231. package/dist/services/mm-api-service/index.js.map +0 -1
  232. package/dist/services/mm-api-service/mm-api-service.js +0 -519
  233. package/dist/services/mm-api-service/mm-api-service.js.map +0 -1
  234. package/dist/services/mm-api-service/token-mgr.js +0 -113
  235. package/dist/services/mm-api-service/token-mgr.js.map +0 -1
  236. package/dist/services/mm-api-service/types/checkpoint.js +0 -2
  237. package/dist/services/mm-api-service/types/checkpoint.js.map +0 -1
  238. package/dist/services/mm-api-service/types/entity-transformer.js +0 -186
  239. package/dist/services/mm-api-service/types/entity-transformer.js.map +0 -1
  240. package/dist/services/mm-api-service/types/mm-response-interfaces.js +0 -34
  241. package/dist/services/mm-api-service/types/mm-response-interfaces.js.map +0 -1
  242. package/dist/services/mm-api-service/types/receive-types.js +0 -55
  243. package/dist/services/mm-api-service/types/receive-types.js.map +0 -1
  244. package/dist/services/mm-api-service/types/send-types.js +0 -337
  245. package/dist/services/mm-api-service/types/send-types.js.map +0 -1
  246. package/dist/services/psql-erp-service/configuration.js +0 -2
  247. package/dist/services/psql-erp-service/configuration.js.map +0 -1
  248. package/dist/services/psql-erp-service/index.js +0 -10
  249. package/dist/services/psql-erp-service/index.js.map +0 -1
  250. package/dist/services/psql-erp-service/internal/types/psql-types.js +0 -5
  251. package/dist/services/psql-erp-service/internal/types/psql-types.js.map +0 -1
  252. package/dist/services/psql-erp-service/psql-helpers.js +0 -99
  253. package/dist/services/psql-erp-service/psql-helpers.js.map +0 -1
  254. package/dist/services/psql-erp-service/psql-service.js +0 -187
  255. package/dist/services/psql-erp-service/psql-service.js.map +0 -1
  256. package/dist/services/reporting-service/index.js +0 -5
  257. package/dist/services/reporting-service/index.js.map +0 -1
  258. package/dist/services/reporting-service/logger.js +0 -217
  259. package/dist/services/reporting-service/logger.js.map +0 -1
  260. package/dist/services/sql-server-erp-service/configuration.js +0 -2
  261. package/dist/services/sql-server-erp-service/configuration.js.map +0 -1
  262. package/dist/services/sql-server-erp-service/index.js +0 -11
  263. package/dist/services/sql-server-erp-service/index.js.map +0 -1
  264. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js +0 -50
  265. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js.map +0 -1
  266. package/dist/services/sql-server-erp-service/internal/sql-server-config.js +0 -40
  267. package/dist/services/sql-server-erp-service/internal/sql-server-config.js.map +0 -1
  268. package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js +0 -36
  269. package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js.map +0 -1
  270. package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js +0 -2
  271. package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js.map +0 -1
  272. package/dist/services/sql-server-erp-service/sql-server-helpers.js +0 -66
  273. package/dist/services/sql-server-erp-service/sql-server-helpers.js.map +0 -1
  274. package/dist/services/sql-server-erp-service/sql-server-service.js +0 -154
  275. package/dist/services/sql-server-erp-service/sql-server-service.js.map +0 -1
  276. package/dist/services/sql-server-erp-service/types/sql-input-param.js +0 -2
  277. package/dist/services/sql-server-erp-service/types/sql-input-param.js.map +0 -1
  278. package/dist/services/sqlite-service/index.js +0 -2
  279. package/dist/services/sqlite-service/index.js.map +0 -1
  280. package/dist/services/sqlite-service/sqlite-coordinator.js +0 -60
  281. package/dist/services/sqlite-service/sqlite-coordinator.js.map +0 -1
  282. package/dist/types/erp-connector.js +0 -2
  283. package/dist/types/erp-connector.js.map +0 -1
  284. package/dist/types/erp-types.js +0 -13
  285. package/dist/types/erp-types.js.map +0 -1
  286. package/dist/types/index.js +0 -6
  287. package/dist/types/index.js.map +0 -1
  288. package/dist/utils/application-initializer.js +0 -55
  289. package/dist/utils/application-initializer.js.map +0 -1
  290. package/dist/utils/cleanup-numbers.js +0 -6
  291. package/dist/utils/cleanup-numbers.js.map +0 -1
  292. package/dist/utils/connector-factory.js +0 -34
  293. package/dist/utils/connector-factory.js.map +0 -1
  294. package/dist/utils/connector-log/log-deduper.js +0 -240
  295. package/dist/utils/connector-log/log-deduper.js.map +0 -1
  296. package/dist/utils/connector-log/mm-connector-logger-example.js +0 -88
  297. package/dist/utils/connector-log/mm-connector-logger-example.js.map +0 -1
  298. package/dist/utils/connector-log/mm-connector-logger.js +0 -151
  299. package/dist/utils/connector-log/mm-connector-logger.js.map +0 -1
  300. package/dist/utils/data-transformation.js +0 -38
  301. package/dist/utils/data-transformation.js.map +0 -1
  302. package/dist/utils/erp-type-from-entity.js +0 -6
  303. package/dist/utils/erp-type-from-entity.js.map +0 -1
  304. package/dist/utils/error-utils.js +0 -21
  305. package/dist/utils/error-utils.js.map +0 -1
  306. package/dist/utils/http-client.js +0 -186
  307. package/dist/utils/http-client.js.map +0 -1
  308. package/dist/utils/index.js +0 -65
  309. package/dist/utils/index.js.map +0 -1
  310. package/dist/utils/local-data-store/database-lock.js +0 -68
  311. package/dist/utils/local-data-store/database-lock.js.map +0 -1
  312. package/dist/utils/local-data-store/jobs-shared-data.js +0 -116
  313. package/dist/utils/local-data-store/jobs-shared-data.js.map +0 -1
  314. package/dist/utils/mm-labor-ticket-helpers.js +0 -23
  315. package/dist/utils/mm-labor-ticket-helpers.js.map +0 -1
  316. package/dist/utils/removeExtraneousFields.js +0 -16
  317. package/dist/utils/removeExtraneousFields.js.map +0 -1
  318. package/dist/utils/removeIdFieldFromPayload.js +0 -16
  319. package/dist/utils/removeIdFieldFromPayload.js.map +0 -1
  320. package/dist/utils/resource-group.js +0 -59
  321. package/dist/utils/resource-group.js.map +0 -1
  322. package/dist/utils/standard-process-drivers/error-processor.js +0 -262
  323. package/dist/utils/standard-process-drivers/error-processor.js.map +0 -1
  324. package/dist/utils/standard-process-drivers/index.js +0 -4
  325. package/dist/utils/standard-process-drivers/index.js.map +0 -1
  326. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js +0 -164
  327. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js.map +0 -1
  328. package/dist/utils/standard-process-drivers/mm-entity-processor.js +0 -168
  329. package/dist/utils/standard-process-drivers/mm-entity-processor.js.map +0 -1
  330. package/dist/utils/standard-process-drivers/standard-process-drivers.js +0 -324
  331. package/dist/utils/standard-process-drivers/standard-process-drivers.js.map +0 -1
  332. package/dist/utils/time-utils.js +0 -96
  333. package/dist/utils/time-utils.js.map +0 -1
  334. package/dist/utils/timezone.js +0 -105
  335. package/dist/utils/timezone.js.map +0 -1
  336. package/dist/utils/trimObjectValues.js +0 -11
  337. package/dist/utils/trimObjectValues.js.map +0 -1
  338. package/dist/utils/uniqueRows.js +0 -35
  339. package/dist/utils/uniqueRows.js.map +0 -1
@@ -0,0 +1,87 @@
1
+ import { CoreConfiguration } from "../data-sync-service/configuration-manager";
2
+ import { HTTPClientFactory } from "../../utils/http-client";
3
+ import { logger } from "../reporting-service";
4
+
5
+ // Cache for company info to avoid repeated API calls
6
+ let companyInfoCache: {
7
+ timezone: string;
8
+ locationRef: string;
9
+ companyId: string;
10
+ } | null = null;
11
+
12
+ export interface CompanyInfo {
13
+ timezone: string;
14
+ locationRef: string;
15
+ companyId: string;
16
+ }
17
+
18
+ /**
19
+ * Fetches company information from /accounts/current endpoint
20
+ * Results are cached to avoid repeated API calls
21
+ * @returns Promise<CompanyInfo> Company information including timezone, locationRef, and companyId
22
+ * @throws Error if unable to fetch company information
23
+ */
24
+ export const getCompanyInfo = async (): Promise<CompanyInfo> => {
25
+ // Return cached value if available
26
+ if (companyInfoCache) {
27
+ return companyInfoCache;
28
+ }
29
+
30
+ try {
31
+ // Get the configuration
32
+ const config = CoreConfiguration.inst();
33
+ const apiUrl = config.mmApiBaseUrl;
34
+ const authToken = config.mmApiAuthToken;
35
+
36
+ if (!apiUrl || !authToken) {
37
+ throw new Error("Missing required configuration for company info fetch");
38
+ }
39
+
40
+ // Create HTTP client
41
+ const client = HTTPClientFactory.getInstance({
42
+ baseUrl: apiUrl,
43
+ retryAttempts: config.mmApiRetryAttempts,
44
+ });
45
+
46
+ // Fetch user/company information from the API
47
+ const response = await client.request<{
48
+ company: {
49
+ timezone: string;
50
+ id: string;
51
+ };
52
+ locationRef: number;
53
+ }>({
54
+ url: "/accounts/current?includeLocation=true",
55
+ method: "GET",
56
+ headers: {
57
+ Authorization: `Bearer ${authToken}`,
58
+ },
59
+ });
60
+
61
+ const userInfo = response.data;
62
+ if (!userInfo?.company) {
63
+ throw new Error("Unable to retrieve company information from API");
64
+ }
65
+
66
+ // Debug: Log what we actually got from the API
67
+ logger.info("Fetched company info from /accounts/current", {
68
+ locationRef: userInfo.locationRef,
69
+ companyId: userInfo.company.id,
70
+ timezone: userInfo.company.timezone,
71
+ });
72
+
73
+ // Cache and return company info - locationRef is at top level, not in company
74
+ companyInfoCache = {
75
+ timezone: userInfo.company.timezone,
76
+ locationRef: String(userInfo.locationRef), // Convert number to string
77
+ companyId: userInfo.company.id,
78
+ };
79
+
80
+ return companyInfoCache;
81
+ } catch (error) {
82
+ throw new Error(
83
+ `Failed to get company info: ${error instanceof Error ? error.message : "Unknown error"}`
84
+ );
85
+ }
86
+ };
87
+
@@ -1,9 +1,9 @@
1
- import { MMApiClient } from "./mm-api-service.js";
1
+ import { MMApiClient } from "./mm-api-service";
2
2
  import type {
3
3
  MMReceiveLaborTicket,
4
4
  MMReceiveLaborTicketReason,
5
5
  MMReceiveLaborTicketWorkOrderOperation,
6
- } from "./types/receive-types.js";
6
+ } from "./types/receive-types";
7
7
  import {
8
8
  MMSendPerson,
9
9
  MMSendResource,
@@ -14,8 +14,8 @@ import {
14
14
  MMSendReason,
15
15
  MMSendLaborTicket,
16
16
  MMSendWorkOrderBatch,
17
- } from "./types/send-types.js";
18
- import type { IToRESTApiObject } from "./types/send-types.js";
17
+ } from "./types/send-types";
18
+ import type { IToRESTApiObject } from "./types/send-types";
19
19
  import type {
20
20
  MMApiBaseResponse,
21
21
  MM200NonLaborTicketResponse,
@@ -26,7 +26,9 @@ import type {
26
26
  MM500LaborTicketException,
27
27
  MMGraphQLResourceResponse,
28
28
  MMMachineGroupsResponse,
29
- } from "./types/mm-response-interfaces.js";
29
+ } from "./types/mm-response-interfaces";
30
+ import { getCompanyInfo } from "./company-info";
31
+ import type { CompanyInfo } from "./company-info";
30
32
 
31
33
  /**
32
34
  * A class to manage interactions with the MM API
@@ -52,7 +54,7 @@ export type {
52
54
  /**
53
55
  * Types related of labor tickets received from the MM API
54
56
  */
55
- export { MMReceiveLaborTicket } from "./types/receive-types.js";
57
+ export { MMReceiveLaborTicket } from "./types/receive-types";
56
58
  export type {
57
59
  MMReceiveLaborTicketReason,
58
60
  MMReceiveLaborTicketWorkOrderOperation,
@@ -81,3 +83,9 @@ export {
81
83
  * Batch interfaces for sending multiple related entities
82
84
  */
83
85
  export type { MMSendWorkOrderBatch };
86
+
87
+ /**
88
+ * Company information utilities
89
+ */
90
+ export { getCompanyInfo };
91
+ export type { CompanyInfo };
@@ -1,22 +1,22 @@
1
- import logger from "../reporting-service/logger.js";
2
- import { ERPObjType } from "../../types/erp-types.js";
3
- import { MMReceiveLaborTicket } from "./types/receive-types.js";
4
- import { MMTokenManager } from "./token-mgr.js";
5
- import * as MM_SEND_TYPES from "./types/send-types.js";
1
+ import logger from "../reporting-service/logger";
2
+ import { ERPObjType } from "../../types/erp-types";
3
+ import { MMReceiveLaborTicket } from "./types/receive-types";
4
+ import { MMTokenManager } from "./token-mgr";
5
+ import * as MM_SEND_TYPES from "./types/send-types";
6
6
  import {
7
7
  HTTPClient,
8
8
  HTTPMethod,
9
9
  HTTPRequestConfig,
10
10
  HTTPClientFactory,
11
- } from "../../utils/http-client.js";
12
- import { Checkpoint } from "./types/checkpoint.js";
13
- import { CoreConfiguration } from "../data-sync-service/configuration-manager.js";
14
- import { ErrorHandler } from "../erp-api-services/errors.js";
11
+ } from "../../utils/http-client";
12
+ import { Checkpoint } from "./types/checkpoint";
13
+ import { CoreConfiguration } from "../data-sync-service/configuration-manager";
14
+ import { ErrorHandler } from "../erp-api-services/errors";
15
15
  import {
16
16
  MMApiBaseResponse,
17
17
  MMGraphQLResourceResponse,
18
18
  MMMachineGroupsResponse,
19
- } from "./types/mm-response-interfaces.js";
19
+ } from "./types/mm-response-interfaces";
20
20
 
21
21
  const MAPPING = "MAPPING";
22
22
  const CHECKPOINTS = "CHECKPOINTS";
@@ -80,9 +80,12 @@ export class MMApiClient {
80
80
  return typeof err === "object" && err !== null && "status" in err;
81
81
  };
82
82
 
83
- // Check if this looks like an auth error - only retry on explicit auth status codes
83
+ // Check if this looks like an auth error - retry on auth status codes or JWT expiration errors
84
84
  const isAuthError =
85
- hasStatus(error) && (error.status === 401 || error.status === 403);
85
+ hasStatus(error) && (error.status === 401 || error.status === 403) ||
86
+ (hasStatus(error) && error.status === 500 &&
87
+ typeof (error as any).data?.error === 'string' &&
88
+ (error as any).data.error.includes('JWT'));
86
89
 
87
90
  if (isAuthError && !options.token) {
88
91
  // Only retry if we used cached token
@@ -506,6 +509,20 @@ export class MMApiClient {
506
509
  return updates.data.map((ticket) => new MMReceiveLaborTicket(ticket));
507
510
  }
508
511
 
512
+ /**
513
+ * Fetch a single labor ticket by reference from the MM API
514
+ * @param laborTicketRef The labor ticket reference to fetch
515
+ * @returns Promise with the labor ticket data
516
+ */
517
+ async fetchLaborTicketByRef(
518
+ laborTicketRef: string
519
+ ): Promise<MMReceiveLaborTicket> {
520
+ const response = (await this.getData(
521
+ `${this.resourceURLs[ERPObjType.LABOR_TICKETS]}/${laborTicketRef}`
522
+ )) as { data: MMReceiveLaborTicket };
523
+ return new MMReceiveLaborTicket(response.data);
524
+ }
525
+
509
526
  /**
510
527
  * Fetch a checkpoint for a specific system, table, and checkpoint type
511
528
  * @param checkpoint The checkpoint to fetch
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  getCachedMMToken,
3
3
  setCachedMMToken,
4
- } from "../../utils/local-data-store/jobs-shared-data.js";
5
- import { HTTPClient, HTTPClientFactory } from "../../utils/http-client.js";
6
- import { CoreConfiguration } from "../data-sync-service/configuration-manager.js";
7
- import { logger } from "../reporting-service/index.js";
4
+ } from "../../utils/local-data-store/jobs-shared-data";
5
+ import { HTTPClient, HTTPClientFactory } from "../../utils/http-client";
6
+ import { CoreConfiguration } from "../data-sync-service/configuration-manager";
7
+ import { logger } from "../reporting-service";
8
8
 
9
9
  /**
10
10
  * Manages the MM API token with caching and expiration checking
@@ -1,5 +1,5 @@
1
- import { ERPObjType } from "../../../types/erp-types.js";
2
- import { IToRESTApiObject } from "../index.js";
1
+ import { ERPObjType } from "../../../types/erp-types";
2
+ import { IToRESTApiObject } from "..";
3
3
  import {
4
4
  MMSendPerson,
5
5
  MMSendResource,
@@ -9,7 +9,7 @@ import {
9
9
  MMSendWorkOrderOperation,
10
10
  MMSendLaborTicket,
11
11
  MMSendReason,
12
- } from "../index.js";
12
+ } from "..";
13
13
 
14
14
  /**
15
15
  * Utility class for transforming entities to/from non-typed and typed objects
@@ -42,6 +42,7 @@ export class MMReceiveLaborTicket {
42
42
  personId!: string; // The person who did the work
43
43
  reasons?: MMReceiveLaborTicketReason[];
44
44
  resourceId!: string; // The physical resource that did the work
45
+ resource?: { name: string }; // The resource name (available from export/updates endpoint)
45
46
  sequenceNumber!: number; // Which sequence this operation is for in the order, associates back to a part_operation with the part_number from the work_order, and sequence_number from the op
46
47
  split!: string; // Batch number if order split for staggered delivery. If not available in the ERP, default to an empty string
47
48
  state!: string; // The current state of the labor ticket (e.g., "CLOSED/OPEN")
@@ -0,0 +1,351 @@
1
+ /**
2
+ * NATS Service - Central connection and subscription management
3
+ * Allows connectors to register handlers for different NATS subjects
4
+ */
5
+
6
+ import { connect, NatsConnection, StringCodec, Subscription } from "nats";
7
+ import { logger } from "../reporting-service";
8
+
9
+ const sc = StringCodec();
10
+
11
+ export interface NatsMessageHandler {
12
+ /**
13
+ * Handler function for NATS messages
14
+ * - Return a value to reply (if msg has reply subject)
15
+ * - Return void/undefined for pub-sub (no reply)
16
+ */
17
+ handle: (data: any, subject: string) => Promise<any | void>;
18
+ }
19
+
20
+ export interface NatsHandlerRegistration {
21
+ /**
22
+ * Subject pattern to subscribe to (supports wildcards: *, >)
23
+ * Examples:
24
+ * - "mm.14.epic01.labor-ticket.*" (single level wildcard)
25
+ * - "mm.14.epic01.erp.>" (multi-level wildcard)
26
+ */
27
+ subject: string;
28
+
29
+ /**
30
+ * Handler for this subject
31
+ */
32
+ handler: NatsMessageHandler;
33
+
34
+ /**
35
+ * Optional description for logging/debugging
36
+ */
37
+ description?: string;
38
+ }
39
+
40
+ export interface NatsServiceConfig {
41
+ /**
42
+ * NATS server URLs
43
+ */
44
+ servers: string | string[];
45
+
46
+ /**
47
+ * Connection name (for monitoring)
48
+ */
49
+ name: string;
50
+
51
+ /**
52
+ * Location reference (for subject namespacing)
53
+ */
54
+ locationRef: string;
55
+
56
+ /**
57
+ * ERP type (epicor, infor, etc.)
58
+ */
59
+ erpType: string;
60
+
61
+ /**
62
+ * Enable/disable NATS
63
+ */
64
+ enabled: boolean;
65
+
66
+ /**
67
+ * Auto-reconnect settings
68
+ */
69
+ reconnect?: boolean;
70
+ maxReconnectAttempts?: number;
71
+ reconnectTimeWait?: number;
72
+ }
73
+
74
+ export class NatsService {
75
+ private connection: NatsConnection | null = null;
76
+ private subscriptions: Map<string, Subscription> = new Map();
77
+ private config: NatsServiceConfig;
78
+ private handlers: NatsHandlerRegistration[] = [];
79
+ private statusPublishTimer: NodeJS.Timeout | null = null;
80
+
81
+ constructor(config: NatsServiceConfig) {
82
+ this.config = config;
83
+ }
84
+
85
+ /**
86
+ * Register a handler for a specific subject pattern
87
+ */
88
+ registerHandler(registration: NatsHandlerRegistration): void {
89
+ logger.info("Registering NATS handler", {
90
+ subject: registration.subject,
91
+ description: registration.description,
92
+ });
93
+ this.handlers.push(registration);
94
+ }
95
+
96
+ /**
97
+ * Connect to NATS and start all registered handlers
98
+ */
99
+ async connect(): Promise<void> {
100
+ if (!this.config.enabled) {
101
+ logger.info("NATS is disabled, skipping connection");
102
+ return;
103
+ }
104
+
105
+ try {
106
+ logger.info("Connecting to NATS...", {
107
+ servers: this.config.servers,
108
+ name: this.config.name,
109
+ });
110
+
111
+ this.connection = await connect({
112
+ servers: this.config.servers,
113
+ name: this.config.name,
114
+ reconnect: this.config.reconnect ?? true,
115
+ maxReconnectAttempts: this.config.maxReconnectAttempts ?? -1,
116
+ reconnectTimeWait: this.config.reconnectTimeWait ?? 2000,
117
+ });
118
+
119
+ logger.info("Connected to NATS", {
120
+ server: this.connection.getServer(),
121
+ clientId: this.connection.info?.client_id,
122
+ });
123
+
124
+ // Start all registered handlers
125
+ for (const registration of this.handlers) {
126
+ await this.startHandler(registration);
127
+ }
128
+
129
+ // Start automatic status publishing
130
+ this.startStatusPublishing();
131
+
132
+ // Monitor connection status
133
+ this.monitorConnection();
134
+
135
+ // Graceful shutdown
136
+ this.setupShutdown();
137
+ } catch (error) {
138
+ logger.error("Failed to connect to NATS", { error });
139
+ throw error;
140
+ }
141
+ }
142
+
143
+ /**
144
+ * Start a single handler (subscribe to its subject)
145
+ */
146
+ private async startHandler(registration: NatsHandlerRegistration): Promise<void> {
147
+ if (!this.connection) {
148
+ throw new Error("NATS connection not established");
149
+ }
150
+
151
+ const sub = this.connection.subscribe(registration.subject);
152
+ this.subscriptions.set(registration.subject, sub);
153
+
154
+ logger.info("Started NATS handler", {
155
+ subject: registration.subject,
156
+ description: registration.description,
157
+ });
158
+
159
+ // Process messages
160
+ (async () => {
161
+ for await (const msg of sub) {
162
+ try {
163
+ const data = sc.decode(msg.data);
164
+
165
+ logger.info("Received NATS message", {
166
+ subject: msg.subject,
167
+ hasReply: !!msg.reply,
168
+ });
169
+
170
+ // Parse JSON if possible
171
+ let parsedData: any;
172
+ try {
173
+ parsedData = JSON.parse(data);
174
+ } catch {
175
+ parsedData = data;
176
+ }
177
+
178
+ // Call handler
179
+ const response = await registration.handler.handle(parsedData, msg.subject);
180
+
181
+ // If there's a reply subject and handler returned something, reply
182
+ if (msg.reply && response !== undefined) {
183
+ const responseStr = JSON.stringify(response);
184
+ msg.respond(sc.encode(responseStr));
185
+ logger.info("Sent reply", { replySubject: msg.reply });
186
+ }
187
+ } catch (error) {
188
+ logger.error("Error handling NATS message", {
189
+ subject: msg.subject,
190
+ error,
191
+ });
192
+
193
+ // Send error response if reply expected
194
+ if (msg.reply) {
195
+ const errorResponse = {
196
+ status: "error",
197
+ error: {
198
+ message: error instanceof Error ? error.message : "Unknown error",
199
+ code: "HANDLER_ERROR",
200
+ },
201
+ };
202
+ msg.respond(sc.encode(JSON.stringify(errorResponse)));
203
+ }
204
+ }
205
+ }
206
+ })();
207
+ }
208
+
209
+ /**
210
+ * Publish a message to a subject (for pub/sub)
211
+ */
212
+ async publish(subject: string, data: any): Promise<void> {
213
+ if (!this.connection) {
214
+ throw new Error("NATS connection not established");
215
+ }
216
+
217
+ const message = typeof data === "string" ? data : JSON.stringify(data);
218
+ this.connection.publish(subject, sc.encode(message));
219
+
220
+ logger.info("Published NATS message", { subject });
221
+ }
222
+
223
+ /**
224
+ * Send a request and wait for reply (for request-reply)
225
+ */
226
+ async request(subject: string, data: any, timeoutMs: number = 30000): Promise<any> {
227
+ if (!this.connection) {
228
+ throw new Error("NATS connection not established");
229
+ }
230
+
231
+ const message = typeof data === "string" ? data : JSON.stringify(data);
232
+ const response = await this.connection.request(
233
+ subject,
234
+ sc.encode(message),
235
+ { timeout: timeoutMs }
236
+ );
237
+
238
+ const responseData = sc.decode(response.data);
239
+
240
+ try {
241
+ return JSON.parse(responseData);
242
+ } catch {
243
+ return responseData;
244
+ }
245
+ }
246
+
247
+ /**
248
+ * Check if connected to NATS
249
+ */
250
+ isConnected(): boolean {
251
+ return this.connection !== null && !this.connection.isClosed();
252
+ }
253
+
254
+ /**
255
+ * Start automatic status publishing (every 30 seconds)
256
+ */
257
+ private startStatusPublishing(): void {
258
+ logger.info("Starting status publishing (every 30 seconds)");
259
+
260
+ // Publish immediately on start
261
+ this.publishStatus();
262
+
263
+ // Then publish every 30 seconds
264
+ this.statusPublishTimer = setInterval(() => {
265
+ this.publishStatus();
266
+ }, 30000);
267
+ }
268
+
269
+ /**
270
+ * Publish connector status
271
+ */
272
+ private async publishStatus(): Promise<void> {
273
+ try {
274
+ const status = {
275
+ timestamp: new Date().toISOString(),
276
+ locationRef: this.config.locationRef,
277
+ erpType: this.config.erpType,
278
+ natsConnected: this.isConnected(),
279
+ };
280
+
281
+ await this.publish(
282
+ `mm.14.${this.config.locationRef}.erp.status`,
283
+ status
284
+ );
285
+
286
+ logger.debug("Published connector status");
287
+ } catch (error) {
288
+ logger.error("Failed to publish status", { error });
289
+ }
290
+ }
291
+
292
+ /**
293
+ * Monitor connection status
294
+ */
295
+ private monitorConnection(): void {
296
+ if (!this.connection) return;
297
+
298
+ (async () => {
299
+ for await (const status of this.connection!.status()) {
300
+ // Only log important events, skip pingTimer
301
+ if (status.type !== "pingTimer") {
302
+ logger.info("NATS connection status", {
303
+ type: status.type,
304
+ data: status.data,
305
+ });
306
+ }
307
+ }
308
+ })();
309
+ }
310
+
311
+ /**
312
+ * Setup graceful shutdown
313
+ */
314
+ private setupShutdown(): void {
315
+ const shutdown = async () => {
316
+ logger.info("Shutting down NATS service...");
317
+ await this.disconnect();
318
+ process.exit(0);
319
+ };
320
+
321
+ process.on("SIGINT", shutdown);
322
+ process.on("SIGTERM", shutdown);
323
+ }
324
+
325
+ /**
326
+ * Disconnect from NATS
327
+ */
328
+ async disconnect(): Promise<void> {
329
+ // Stop status publishing
330
+ if (this.statusPublishTimer) {
331
+ clearInterval(this.statusPublishTimer);
332
+ this.statusPublishTimer = null;
333
+ }
334
+
335
+ // Close connection
336
+ if (this.connection) {
337
+ await this.connection.drain();
338
+ this.connection = null;
339
+ this.subscriptions.clear();
340
+ logger.info("Disconnected from NATS");
341
+ }
342
+ }
343
+
344
+ /**
345
+ * Get the location reference
346
+ */
347
+ getLocationRef(): string {
348
+ return this.config.locationRef;
349
+ }
350
+ }
351
+
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Simple proof-of-concept NATS subscriber
3
+ * Subscribes to mm.14.> and replies with "hello world"
4
+ */
5
+
6
+ import { connect, StringCodec } from "nats";
7
+ import { logger } from "../../services/reporting-service";
8
+
9
+ const sc = StringCodec();
10
+
11
+ async function startTestSubscriber() {
12
+ try {
13
+ // Connect to NATS server
14
+ const nc = await connect({
15
+ servers: "nats://localhost:4222",
16
+ name: "mm-erp-sdk-test-subscriber",
17
+ });
18
+
19
+ logger.info("Connected to NATS server", {
20
+ server: nc.getServer(),
21
+ clientId: nc.info?.client_id,
22
+ });
23
+
24
+ // Subscribe to all messages on mm.14.>
25
+ const sub = nc.subscribe("mm.14.>");
26
+
27
+ logger.info("Subscribed to mm.14.> - waiting for messages...");
28
+
29
+ // Process incoming messages
30
+ (async () => {
31
+ for await (const msg of sub) {
32
+ const data = sc.decode(msg.data);
33
+
34
+ logger.info("📨 Received NATS message", {
35
+ subject: msg.subject,
36
+ data: data,
37
+ reply: msg.reply,
38
+ });
39
+
40
+ console.log("\n=== NATS MESSAGE RECEIVED ===");
41
+ console.log("Subject:", msg.subject);
42
+ console.log("Data:", data);
43
+ console.log("Reply subject:", msg.reply);
44
+ console.log("============================\n");
45
+
46
+ // Reply if there's a reply subject
47
+ if (msg.reply) {
48
+ const replyMessage = JSON.stringify({
49
+ message: "hello world",
50
+ timestamp: new Date().toISOString(),
51
+ receivedSubject: msg.subject,
52
+ receivedData: data,
53
+ });
54
+
55
+ msg.respond(sc.encode(replyMessage));
56
+
57
+ logger.info("✅ Sent reply: hello world", {
58
+ replySubject: msg.reply,
59
+ });
60
+
61
+ console.log("✅ Replied with: hello world\n");
62
+ }
63
+ }
64
+ })();
65
+
66
+ // Handle connection events
67
+ (async () => {
68
+ for await (const status of nc.status()) {
69
+ logger.info("NATS connection status", {
70
+ type: status.type,
71
+ data: status.data,
72
+ });
73
+ console.log(`Connection status: ${status.type}`, status.data);
74
+ }
75
+ })();
76
+
77
+ // Graceful shutdown
78
+ const shutdown = async () => {
79
+ logger.info("Shutting down NATS subscriber...");
80
+ await nc.drain();
81
+ process.exit(0);
82
+ };
83
+
84
+ process.on("SIGINT", shutdown);
85
+ process.on("SIGTERM", shutdown);
86
+
87
+ } catch (error) {
88
+ logger.error("Failed to connect to NATS", { error });
89
+ console.error("Error connecting to NATS:", error);
90
+ process.exit(1);
91
+ }
92
+ }
93
+
94
+ // Start the subscriber
95
+ startTestSubscriber();
96
+