@machinemetrics/mm-erp-sdk 0.1.9-beta.2 → 0.1.9-beta.4

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 (316) hide show
  1. package/dist/index.d.ts +42 -42
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +48 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/knexfile.d.ts.map +1 -1
  6. package/dist/knexfile.js +19 -0
  7. package/dist/knexfile.js.map +1 -0
  8. package/dist/migrations/20241015162631_create_cache_table.d.ts +4 -0
  9. package/dist/migrations/20241015162631_create_cache_table.d.ts.map +1 -0
  10. package/dist/migrations/20241015162631_create_cache_table.js +11 -15
  11. package/dist/migrations/20241015162631_create_cache_table.js.map +1 -1
  12. package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts +4 -0
  13. package/dist/migrations/20241015162632_create_sdk_cache_table.d.ts.map +1 -0
  14. package/dist/migrations/20241015162632_create_sdk_cache_table.js +11 -15
  15. package/dist/migrations/20241015162632_create_sdk_cache_table.js.map +1 -1
  16. package/dist/migrations/20250103162631_create_record_tracking_table.d.ts +4 -0
  17. package/dist/migrations/20250103162631_create_record_tracking_table.d.ts.map +1 -0
  18. package/dist/migrations/20250103162631_create_record_tracking_table.js +14 -15
  19. package/dist/migrations/20250103162631_create_record_tracking_table.js.map +1 -1
  20. package/dist/services/caching-service/batch-cache-manager.d.ts +1 -1
  21. package/dist/services/caching-service/batch-cache-manager.d.ts.map +1 -1
  22. package/dist/services/caching-service/batch-cache-manager.js +84 -0
  23. package/dist/services/caching-service/batch-cache-manager.js.map +1 -0
  24. package/dist/services/caching-service/hashed-cache-manager.d.ts +2 -2
  25. package/dist/services/caching-service/hashed-cache-manager.d.ts.map +1 -1
  26. package/dist/services/caching-service/hashed-cache-manager.js +223 -0
  27. package/dist/services/caching-service/hashed-cache-manager.js.map +1 -0
  28. package/dist/services/caching-service/index.d.ts +1 -1
  29. package/dist/services/caching-service/index.d.ts.map +1 -1
  30. package/dist/services/caching-service/index.js +2 -0
  31. package/dist/services/caching-service/index.js.map +1 -0
  32. package/dist/services/caching-service/record-tracking-manager.d.ts +1 -1
  33. package/dist/services/caching-service/record-tracking-manager.d.ts.map +1 -1
  34. package/dist/services/caching-service/record-tracking-manager.js +28 -0
  35. package/dist/services/caching-service/record-tracking-manager.js.map +1 -0
  36. package/dist/services/data-sync-service/configuration-manager.d.ts +1 -1
  37. package/dist/services/data-sync-service/configuration-manager.d.ts.map +1 -1
  38. package/dist/services/data-sync-service/configuration-manager.js +163 -0
  39. package/dist/services/data-sync-service/configuration-manager.js.map +1 -0
  40. package/dist/services/data-sync-service/data-sync-service.d.ts.map +1 -1
  41. package/dist/services/data-sync-service/data-sync-service.js +95 -0
  42. package/dist/services/data-sync-service/data-sync-service.js.map +1 -0
  43. package/dist/services/data-sync-service/index.d.ts +3 -3
  44. package/dist/services/data-sync-service/index.d.ts.map +1 -1
  45. package/dist/services/data-sync-service/index.js +10 -0
  46. package/dist/services/data-sync-service/index.js.map +1 -0
  47. package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js +40 -39
  48. package/dist/services/data-sync-service/jobs/clean-up-expired-cache.js.map +1 -1
  49. package/dist/services/data-sync-service/jobs/from-erp.js +48 -43
  50. package/dist/services/data-sync-service/jobs/from-erp.js.map +1 -1
  51. package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js +36 -35
  52. package/dist/services/data-sync-service/jobs/retry-failed-labor-tickets.js.map +1 -1
  53. package/dist/services/data-sync-service/jobs/run-migrations.js +22 -21
  54. package/dist/services/data-sync-service/jobs/run-migrations.js.map +1 -1
  55. package/dist/services/data-sync-service/jobs/to-erp.js +48 -42
  56. package/dist/services/data-sync-service/jobs/to-erp.js.map +1 -1
  57. package/dist/services/erp-api-services/errors.d.ts +1 -1
  58. package/dist/services/erp-api-services/errors.d.ts.map +1 -1
  59. package/dist/services/erp-api-services/errors.js +83 -0
  60. package/dist/services/erp-api-services/errors.js.map +1 -0
  61. package/dist/services/erp-api-services/graphql/graphql-service.d.ts +2 -2
  62. package/dist/services/erp-api-services/graphql/graphql-service.d.ts.map +1 -1
  63. package/dist/services/erp-api-services/graphql/graphql-service.js +102 -0
  64. package/dist/services/erp-api-services/graphql/graphql-service.js.map +1 -0
  65. package/dist/services/erp-api-services/graphql/types.js +6 -0
  66. package/dist/services/erp-api-services/graphql/types.js.map +1 -0
  67. package/dist/services/erp-api-services/index.d.ts +8 -8
  68. package/dist/services/erp-api-services/index.d.ts.map +1 -1
  69. package/dist/services/erp-api-services/index.js +13 -0
  70. package/dist/services/erp-api-services/index.js.map +1 -0
  71. package/dist/services/erp-api-services/oauth-client.js +41 -0
  72. package/dist/services/erp-api-services/oauth-client.js.map +1 -0
  73. package/dist/services/erp-api-services/rest/get-query-params.js +23 -0
  74. package/dist/services/erp-api-services/rest/get-query-params.js.map +1 -0
  75. package/dist/services/erp-api-services/rest/rest-api-service.d.ts +2 -2
  76. package/dist/services/erp-api-services/rest/rest-api-service.d.ts.map +1 -1
  77. package/dist/services/erp-api-services/rest/rest-api-service.js +163 -0
  78. package/dist/services/erp-api-services/rest/rest-api-service.js.map +1 -0
  79. package/dist/services/erp-api-services/types.d.ts +2 -2
  80. package/dist/services/erp-api-services/types.d.ts.map +1 -1
  81. package/dist/services/erp-api-services/types.js +2 -0
  82. package/dist/services/erp-api-services/types.js.map +1 -0
  83. package/dist/services/mm-api-service/index.d.ts +6 -6
  84. package/dist/services/mm-api-service/index.d.ts.map +1 -1
  85. package/dist/services/mm-api-service/index.js +15 -0
  86. package/dist/services/mm-api-service/index.js.map +1 -0
  87. package/dist/services/mm-api-service/mm-api-service.d.ts +7 -7
  88. package/dist/services/mm-api-service/mm-api-service.d.ts.map +1 -1
  89. package/dist/services/mm-api-service/mm-api-service.js +519 -0
  90. package/dist/services/mm-api-service/mm-api-service.js.map +1 -0
  91. package/dist/services/mm-api-service/token-mgr.js +113 -0
  92. package/dist/services/mm-api-service/token-mgr.js.map +1 -0
  93. package/dist/services/mm-api-service/types/checkpoint.js +2 -0
  94. package/dist/services/mm-api-service/types/checkpoint.js.map +1 -0
  95. package/dist/services/mm-api-service/types/entity-transformer.d.ts +2 -2
  96. package/dist/services/mm-api-service/types/entity-transformer.d.ts.map +1 -1
  97. package/dist/services/mm-api-service/types/entity-transformer.js +186 -0
  98. package/dist/services/mm-api-service/types/entity-transformer.js.map +1 -0
  99. package/dist/services/mm-api-service/types/mm-response-interfaces.js +34 -0
  100. package/dist/services/mm-api-service/types/mm-response-interfaces.js.map +1 -0
  101. package/dist/services/mm-api-service/types/receive-types.js +55 -0
  102. package/dist/services/mm-api-service/types/receive-types.js.map +1 -0
  103. package/dist/services/mm-api-service/types/send-types.js +337 -0
  104. package/dist/services/mm-api-service/types/send-types.js.map +1 -0
  105. package/dist/services/psql-erp-service/configuration.js +2 -0
  106. package/dist/services/psql-erp-service/configuration.js.map +1 -0
  107. package/dist/services/psql-erp-service/index.d.ts +3 -3
  108. package/dist/services/psql-erp-service/index.d.ts.map +1 -1
  109. package/dist/services/psql-erp-service/index.js +10 -0
  110. package/dist/services/psql-erp-service/index.js.map +1 -0
  111. package/dist/services/psql-erp-service/internal/types/psql-types.js +5 -0
  112. package/dist/services/psql-erp-service/internal/types/psql-types.js.map +1 -0
  113. package/dist/services/psql-erp-service/psql-helpers.js +99 -0
  114. package/dist/services/psql-erp-service/psql-helpers.js.map +1 -0
  115. package/dist/services/psql-erp-service/psql-service.d.ts +2 -2
  116. package/dist/services/psql-erp-service/psql-service.d.ts.map +1 -1
  117. package/dist/services/psql-erp-service/psql-service.js +187 -0
  118. package/dist/services/psql-erp-service/psql-service.js.map +1 -0
  119. package/dist/services/reporting-service/index.d.ts +1 -1
  120. package/dist/services/reporting-service/index.d.ts.map +1 -1
  121. package/dist/services/reporting-service/index.js +5 -0
  122. package/dist/services/reporting-service/index.js.map +1 -0
  123. package/dist/services/reporting-service/logger.js +217 -0
  124. package/dist/services/reporting-service/logger.js.map +1 -0
  125. package/dist/services/sql-server-erp-service/configuration.js +2 -0
  126. package/dist/services/sql-server-erp-service/configuration.js.map +1 -0
  127. package/dist/services/sql-server-erp-service/index.d.ts +3 -3
  128. package/dist/services/sql-server-erp-service/index.d.ts.map +1 -1
  129. package/dist/services/sql-server-erp-service/index.js +11 -0
  130. package/dist/services/sql-server-erp-service/index.js.map +1 -0
  131. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts +2 -2
  132. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.d.ts.map +1 -1
  133. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js +50 -0
  134. package/dist/services/sql-server-erp-service/internal/sql-labor-ticket-operations.js.map +1 -0
  135. package/dist/services/sql-server-erp-service/internal/sql-server-config.js +40 -0
  136. package/dist/services/sql-server-erp-service/internal/sql-server-config.js.map +1 -0
  137. package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js +36 -0
  138. package/dist/services/sql-server-erp-service/internal/sql-transaction-manager.js.map +1 -0
  139. package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js +2 -0
  140. package/dist/services/sql-server-erp-service/internal/types/sql-server-types.js.map +1 -0
  141. package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts +3 -3
  142. package/dist/services/sql-server-erp-service/sql-server-helpers.d.ts.map +1 -1
  143. package/dist/services/sql-server-erp-service/sql-server-helpers.js +66 -0
  144. package/dist/services/sql-server-erp-service/sql-server-helpers.js.map +1 -0
  145. package/dist/services/sql-server-erp-service/sql-server-service.d.ts +2 -2
  146. package/dist/services/sql-server-erp-service/sql-server-service.d.ts.map +1 -1
  147. package/dist/services/sql-server-erp-service/sql-server-service.js +154 -0
  148. package/dist/services/sql-server-erp-service/sql-server-service.js.map +1 -0
  149. package/dist/services/sql-server-erp-service/types/sql-input-param.js +2 -0
  150. package/dist/services/sql-server-erp-service/types/sql-input-param.js.map +1 -0
  151. package/dist/services/sqlite-service/index.d.ts +1 -1
  152. package/dist/services/sqlite-service/index.d.ts.map +1 -1
  153. package/dist/services/sqlite-service/index.js +2 -0
  154. package/dist/services/sqlite-service/index.js.map +1 -0
  155. package/dist/services/sqlite-service/sqlite-coordinator.js +60 -0
  156. package/dist/services/sqlite-service/sqlite-coordinator.js.map +1 -0
  157. package/dist/types/erp-connector.d.ts +1 -1
  158. package/dist/types/erp-connector.d.ts.map +1 -1
  159. package/dist/types/erp-connector.js +2 -0
  160. package/dist/types/erp-connector.js.map +1 -0
  161. package/dist/types/erp-types.js +13 -0
  162. package/dist/types/erp-types.js.map +1 -0
  163. package/dist/types/index.d.ts +2 -2
  164. package/dist/types/index.d.ts.map +1 -1
  165. package/dist/types/index.js +6 -0
  166. package/dist/types/index.js.map +1 -0
  167. package/dist/utils/application-initializer.js +55 -0
  168. package/dist/utils/application-initializer.js.map +1 -0
  169. package/dist/utils/cleanup-numbers.js +6 -0
  170. package/dist/utils/cleanup-numbers.js.map +1 -0
  171. package/dist/utils/connector-factory.d.ts +1 -1
  172. package/dist/utils/connector-factory.d.ts.map +1 -1
  173. package/dist/utils/connector-factory.js +34 -0
  174. package/dist/utils/connector-factory.js.map +1 -0
  175. package/dist/utils/connector-log/log-deduper.d.ts +1 -1
  176. package/dist/utils/connector-log/log-deduper.d.ts.map +1 -1
  177. package/dist/utils/connector-log/log-deduper.js +240 -0
  178. package/dist/utils/connector-log/log-deduper.js.map +1 -0
  179. package/dist/utils/connector-log/mm-connector-logger-example.d.ts +1 -0
  180. package/dist/utils/connector-log/mm-connector-logger-example.js +88 -0
  181. package/dist/utils/connector-log/mm-connector-logger-example.js.map +1 -0
  182. package/dist/utils/connector-log/mm-connector-logger.d.ts +1 -1
  183. package/dist/utils/connector-log/mm-connector-logger.d.ts.map +1 -1
  184. package/dist/utils/connector-log/mm-connector-logger.js +151 -0
  185. package/dist/utils/connector-log/mm-connector-logger.js.map +1 -0
  186. package/dist/utils/data-transformation.js +38 -0
  187. package/dist/utils/data-transformation.js.map +1 -0
  188. package/dist/utils/erp-type-from-entity.d.ts +1 -1
  189. package/dist/utils/erp-type-from-entity.d.ts.map +1 -1
  190. package/dist/utils/erp-type-from-entity.js +6 -0
  191. package/dist/utils/erp-type-from-entity.js.map +1 -0
  192. package/dist/utils/error-utils.js +21 -0
  193. package/dist/utils/error-utils.js.map +1 -0
  194. package/dist/utils/http-client.js +186 -0
  195. package/dist/utils/http-client.js.map +1 -0
  196. package/dist/utils/index.d.ts +33 -33
  197. package/dist/utils/index.d.ts.map +1 -1
  198. package/dist/utils/index.js +65 -0
  199. package/dist/utils/index.js.map +1 -0
  200. package/dist/utils/local-data-store/database-lock.js +68 -0
  201. package/dist/utils/local-data-store/database-lock.js.map +1 -0
  202. package/dist/utils/local-data-store/jobs-shared-data.js +116 -0
  203. package/dist/utils/local-data-store/jobs-shared-data.js.map +1 -0
  204. package/dist/utils/mm-labor-ticket-helpers.d.ts +1 -1
  205. package/dist/utils/mm-labor-ticket-helpers.d.ts.map +1 -1
  206. package/dist/utils/mm-labor-ticket-helpers.js +23 -0
  207. package/dist/utils/mm-labor-ticket-helpers.js.map +1 -0
  208. package/dist/utils/removeExtraneousFields.d.ts +1 -1
  209. package/dist/utils/removeExtraneousFields.d.ts.map +1 -1
  210. package/dist/utils/removeExtraneousFields.js +16 -0
  211. package/dist/utils/removeExtraneousFields.js.map +1 -0
  212. package/dist/utils/removeIdFieldFromPayload.d.ts +1 -1
  213. package/dist/utils/removeIdFieldFromPayload.d.ts.map +1 -1
  214. package/dist/utils/removeIdFieldFromPayload.js +16 -0
  215. package/dist/utils/removeIdFieldFromPayload.js.map +1 -0
  216. package/dist/utils/resource-group.d.ts +1 -1
  217. package/dist/utils/resource-group.d.ts.map +1 -1
  218. package/dist/utils/resource-group.js +59 -0
  219. package/dist/utils/resource-group.js.map +1 -0
  220. package/dist/utils/standard-process-drivers/error-processor.d.ts +3 -3
  221. package/dist/utils/standard-process-drivers/error-processor.d.ts.map +1 -1
  222. package/dist/utils/standard-process-drivers/error-processor.js +262 -0
  223. package/dist/utils/standard-process-drivers/error-processor.js.map +1 -0
  224. package/dist/utils/standard-process-drivers/index.d.ts +3 -3
  225. package/dist/utils/standard-process-drivers/index.d.ts.map +1 -1
  226. package/dist/utils/standard-process-drivers/index.js +4 -0
  227. package/dist/utils/standard-process-drivers/index.js.map +1 -0
  228. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts +1 -1
  229. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.d.ts.map +1 -1
  230. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js +164 -0
  231. package/dist/utils/standard-process-drivers/labor-ticket-erp-synchronizer.js.map +1 -0
  232. package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts +4 -4
  233. package/dist/utils/standard-process-drivers/mm-entity-processor.d.ts.map +1 -1
  234. package/dist/utils/standard-process-drivers/mm-entity-processor.js +168 -0
  235. package/dist/utils/standard-process-drivers/mm-entity-processor.js.map +1 -0
  236. package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts +4 -4
  237. package/dist/utils/standard-process-drivers/standard-process-drivers.d.ts.map +1 -1
  238. package/dist/utils/standard-process-drivers/standard-process-drivers.js +324 -0
  239. package/dist/utils/standard-process-drivers/standard-process-drivers.js.map +1 -0
  240. package/dist/utils/time-utils.js +96 -0
  241. package/dist/utils/time-utils.js.map +1 -0
  242. package/dist/utils/timezone.js +105 -0
  243. package/dist/utils/timezone.js.map +1 -0
  244. package/dist/utils/trimObjectValues.js +11 -0
  245. package/dist/utils/trimObjectValues.js.map +1 -0
  246. package/dist/utils/uniqueRows.js +35 -0
  247. package/dist/utils/uniqueRows.js.map +1 -0
  248. package/package.json +5 -6
  249. package/src/index.ts +42 -42
  250. package/src/knexfile.ts +1 -0
  251. package/src/services/caching-service/batch-cache-manager.ts +2 -2
  252. package/src/services/caching-service/hashed-cache-manager.ts +5 -5
  253. package/src/services/caching-service/index.ts +1 -1
  254. package/src/services/caching-service/record-tracking-manager.ts +2 -2
  255. package/src/services/data-sync-service/configuration-manager.ts +2 -2
  256. package/src/services/data-sync-service/data-sync-service.ts +9 -3
  257. package/src/services/data-sync-service/index.ts +3 -3
  258. package/src/services/data-sync-service/jobs/clean-up-expired-cache.ts +3 -3
  259. package/src/services/data-sync-service/jobs/from-erp.ts +3 -3
  260. package/src/services/data-sync-service/jobs/retry-failed-labor-tickets.ts +2 -2
  261. package/src/services/data-sync-service/jobs/run-migrations.ts +2 -2
  262. package/src/services/data-sync-service/jobs/to-erp.ts +2 -2
  263. package/src/services/erp-api-services/errors.ts +3 -3
  264. package/src/services/erp-api-services/graphql/graphql-service.ts +5 -5
  265. package/src/services/erp-api-services/index.ts +8 -8
  266. package/src/services/erp-api-services/rest/rest-api-service.ts +4 -4
  267. package/src/services/erp-api-services/types.ts +2 -2
  268. package/src/services/mm-api-service/index.ts +6 -6
  269. package/src/services/mm-api-service/mm-api-service.ts +10 -10
  270. package/src/services/mm-api-service/token-mgr.ts +4 -4
  271. package/src/services/mm-api-service/types/entity-transformer.ts +3 -3
  272. package/src/services/psql-erp-service/index.ts +3 -3
  273. package/src/services/psql-erp-service/psql-service.ts +4 -4
  274. package/src/services/reporting-service/index.ts +1 -1
  275. package/src/services/sql-server-erp-service/index.ts +3 -3
  276. package/src/services/sql-server-erp-service/internal/sql-labor-ticket-operations.ts +2 -2
  277. package/src/services/sql-server-erp-service/internal/sql-transaction-manager.ts +1 -1
  278. package/src/services/sql-server-erp-service/sql-server-helpers.ts +6 -6
  279. package/src/services/sql-server-erp-service/sql-server-service.ts +4 -4
  280. package/src/services/sqlite-service/index.ts +1 -1
  281. package/src/services/sqlite-service/sqlite-coordinator.ts +2 -2
  282. package/src/types/erp-connector.ts +1 -1
  283. package/src/types/index.ts +2 -2
  284. package/src/utils/application-initializer.ts +5 -5
  285. package/src/utils/connector-factory.ts +2 -2
  286. package/src/utils/connector-log/log-deduper.ts +2 -2
  287. package/src/utils/connector-log/mm-connector-logger.ts +3 -3
  288. package/src/utils/erp-type-from-entity.ts +1 -1
  289. package/src/utils/http-client.ts +1 -1
  290. package/src/utils/index.ts +33 -33
  291. package/src/utils/local-data-store/database-lock.ts +1 -1
  292. package/src/utils/mm-labor-ticket-helpers.ts +2 -2
  293. package/src/utils/removeExtraneousFields.ts +1 -1
  294. package/src/utils/removeIdFieldFromPayload.ts +1 -1
  295. package/src/utils/resource-group.ts +2 -2
  296. package/src/utils/standard-process-drivers/error-processor.ts +5 -5
  297. package/src/utils/standard-process-drivers/index.ts +3 -3
  298. package/src/utils/standard-process-drivers/labor-ticket-erp-synchronizer.ts +6 -6
  299. package/src/utils/standard-process-drivers/mm-entity-processor.ts +7 -7
  300. package/src/utils/standard-process-drivers/standard-process-drivers.ts +6 -6
  301. package/src/utils/time-utils.ts +3 -3
  302. package/src/utils/timezone.ts +2 -2
  303. package/dist/config-Bax6Ofp5.js +0 -418
  304. package/dist/config-Bax6Ofp5.js.map +0 -1
  305. package/dist/connector-factory-BaMIlES8.js +0 -30
  306. package/dist/connector-factory-BaMIlES8.js.map +0 -1
  307. package/dist/hashed-cache-manager-C1u9jQgY.js +0 -322
  308. package/dist/hashed-cache-manager-C1u9jQgY.js.map +0 -1
  309. package/dist/index-BkVlW0ZW.js +0 -192
  310. package/dist/index-BkVlW0ZW.js.map +0 -1
  311. package/dist/knexfile-Bng2Ru9c.js +0 -20
  312. package/dist/knexfile-Bng2Ru9c.js.map +0 -1
  313. package/dist/logger-DW5fyhVS.js +0 -17593
  314. package/dist/logger-DW5fyhVS.js.map +0 -1
  315. package/dist/mm-erp-sdk.js +0 -4266
  316. package/dist/mm-erp-sdk.js.map +0 -1
@@ -1,322 +0,0 @@
1
- import knex from "knex";
2
- import { c as config } from "./knexfile-Bng2Ru9c.js";
3
- import stringify from "json-stable-stringify";
4
- import XXH from "xxhashjs";
5
- import "./config-Bax6Ofp5.js";
6
- import { c as configureLogger, l as logger } from "./logger-DW5fyhVS.js";
7
- import "./index-BkVlW0ZW.js";
8
- class CoreConfiguration {
9
- static instance;
10
- // General Configuration
11
- logLevel;
12
- erpSystem;
13
- nodeEnv;
14
- // MM API (aka "Mapping") Service
15
- mmERPSvcApiBaseUrl;
16
- mmApiBaseUrl;
17
- mmApiAuthToken;
18
- mmApiRetryAttempts;
19
- // Caching (optionally used for interacting with the MM API)
20
- cacheTTL;
21
- // ERP API Service
22
- erpApiPagingLimit;
23
- //Pagination limit for ERP API
24
- // Job timing Intervals
25
- fromErpInterval;
26
- toErpInterval;
27
- retryLaborTicketsInterval;
28
- cacheExpirationCheckInterval;
29
- constructor() {
30
- this.logLevel = process.env.LOG_LEVEL || "info";
31
- this.erpSystem = process.env.ERP_SYSTEM || "template";
32
- this.nodeEnv = process.env.NODE_ENV || "development";
33
- this.mmERPSvcApiBaseUrl = process.env.MM_MAPPING_SERVICE_URL || "";
34
- console.log("=== CONFIG DEBUG ===");
35
- console.log("MM_MAPPING_AUTH_SERVICE_URL env var:", process.env.MM_MAPPING_AUTH_SERVICE_URL);
36
- this.mmApiBaseUrl = process.env.MM_MAPPING_AUTH_SERVICE_URL || "";
37
- console.log("mmApiBaseUrl set to:", this.mmApiBaseUrl);
38
- console.log("=== END CONFIG DEBUG ===");
39
- this.mmApiAuthToken = process.env.MM_MAPPING_SERVICE_TOKEN || "";
40
- this.mmApiRetryAttempts = parseInt(process.env.RETRY_ATTEMPTS || "0");
41
- this.erpApiPagingLimit = parseInt(process.env.ERP_PAGINATION_LIMIT || "0");
42
- this.fromErpInterval = process.env.FROM_ERP_INTERVAL || process.env.POLL_INTERVAL || "5 min";
43
- this.toErpInterval = process.env.TO_ERP_INTERVAL || "5 min";
44
- this.retryLaborTicketsInterval = process.env.RETRY_LABOR_TICKETS_INTERVAL || "30 min";
45
- this.cacheExpirationCheckInterval = process.env.CACHE_EXPIRATION_CHECK_INTERVAL || "5 min";
46
- const cacheTTLDef = 7 * 24 * 60 * 60;
47
- this.cacheTTL = parseInt(process.env.CACHE_TTL || cacheTTLDef.toString());
48
- configureLogger(this.logLevel, this.nodeEnv);
49
- }
50
- static inst() {
51
- if (!CoreConfiguration.instance) {
52
- CoreConfiguration.instance = new CoreConfiguration();
53
- }
54
- return CoreConfiguration.instance;
55
- }
56
- /**
57
- * Returns a sanitized version of the configuration for safe logging.
58
- * Masks sensitive fields like authentication tokens.
59
- */
60
- toSafeLogObject() {
61
- const maskSensitiveValue = (value) => {
62
- if (!value || value.length === 0) {
63
- return "";
64
- }
65
- if (value.length < 6) {
66
- return "********";
67
- }
68
- return value.substring(0, 3) + "********" + value.substring(value.length - 3);
69
- };
70
- return {
71
- logLevel: this.logLevel,
72
- erpSystem: this.erpSystem,
73
- nodeEnv: this.nodeEnv,
74
- mmERPSvcApiBaseUrl: this.mmERPSvcApiBaseUrl,
75
- mmApiBaseUrl: this.mmApiBaseUrl,
76
- mmApiAuthToken: maskSensitiveValue(this.mmApiAuthToken),
77
- mmApiRetryAttempts: this.mmApiRetryAttempts,
78
- cacheTTL: this.cacheTTL,
79
- erpApiPagingLimit: this.erpApiPagingLimit,
80
- fromErpInterval: this.fromErpInterval,
81
- toErpInterval: this.toErpInterval,
82
- retryLaborTicketsInterval: this.retryLaborTicketsInterval,
83
- cacheExpirationCheckInterval: this.cacheExpirationCheckInterval
84
- };
85
- }
86
- }
87
- const getSQLServerConfiguration = () => {
88
- return {
89
- username: process.env.ERP_SQLSERVER_USERNAME || "",
90
- password: process.env.ERP_SQLSERVER_PASSWORD || "",
91
- database: process.env.ERP_SQLSERVER_DATABASE || "",
92
- host: process.env.ERP_SQLSERVER_HOST || process.env.ERP_SQLSERVER_SERVER || "",
93
- port: process.env.ERP_SQLSERVER_PORT || "1433",
94
- connectionTimeout: process.env.ERP_SQLSERVER_CONNECTION_TIMEOUT || "30000",
95
- requestTimeout: process.env.ERP_SQLSERVER_REQUEST_TIMEOUT || "60000",
96
- poolMax: process.env.ERP_SQLSERVER_MAX || "10",
97
- poolMin: process.env.ERP_SQLSERVER_MIN || "0",
98
- idleTimeoutMillis: process.env.ERP_SQLSERVER_IDLE_TIMEOUT_MMILLIS || "30000",
99
- encrypt: process.env.ERP_SQLSERVER_ENCRYPT === "true",
100
- trustServer: process.env.ERP_SQLSERVER_TRUST_SERVER === "true"
101
- };
102
- };
103
- class ErpApiConnectionParams {
104
- constructor(erpApiUrl, erpApiClientId, erpApiClientSecret, erpApiOrganizationId, erpAuthBaseUrl, retryAttempts = 3) {
105
- this.erpApiUrl = erpApiUrl;
106
- this.erpApiClientId = erpApiClientId;
107
- this.erpApiClientSecret = erpApiClientSecret;
108
- this.erpApiOrganizationId = erpApiOrganizationId;
109
- this.erpAuthBaseUrl = erpAuthBaseUrl;
110
- this.retryAttempts = retryAttempts;
111
- }
112
- }
113
- const getErpApiConnectionParams = () => {
114
- return new ErpApiConnectionParams(
115
- process.env.ERP_API_URL || "",
116
- process.env.ERP_API_CLIENT_ID || "",
117
- process.env.ERP_API_CLIENT_SECRET || "",
118
- process.env.ERP_API_ORGANIZATION_ID || "",
119
- process.env.ERP_AUTH_BASE_URL || "",
120
- parseInt(process.env.ERP_API_RETRY_ATTEMPTS || "3")
121
- );
122
- };
123
- class HashedCacheManager {
124
- static TABLE_NAME = "sdk_cache";
125
- db;
126
- options;
127
- static SEED = 43981;
128
- // Arbitrary seed for hashing
129
- isDestroyed = false;
130
- metrics = {
131
- recordCounts: {}
132
- };
133
- constructor(options) {
134
- this.options = {
135
- ttl: options?.ttl || CoreConfiguration.inst().cacheTTL,
136
- tableName: options?.tableName || HashedCacheManager.TABLE_NAME
137
- };
138
- this.db = knex({
139
- ...config.local,
140
- pool: {
141
- min: 0,
142
- max: 10
143
- }
144
- });
145
- }
146
- /**
147
- * Checks if the cache manager is still valid
148
- * @throws Error if the cache manager has been destroyed
149
- */
150
- checkValid() {
151
- if (this.isDestroyed) {
152
- throw new Error("Cache manager has been destroyed");
153
- }
154
- }
155
- /**
156
- * Generates a stable hash of a record using JSON stringify + xxhash
157
- */
158
- static hashRecord(record) {
159
- try {
160
- const serialized = stringify(record);
161
- if (!serialized) {
162
- throw new Error("Failed to serialize record for hashing");
163
- }
164
- const hash = XXH.h64(serialized, HashedCacheManager.SEED).toString(16);
165
- return hash;
166
- } catch (error) {
167
- if (error instanceof Error && error.message.includes("circular")) {
168
- throw new Error("Failed to serialize record for hashing");
169
- }
170
- throw error;
171
- }
172
- }
173
- /**
174
- * Gets a record from the cache
175
- * @param type The type of record
176
- * @param hash The hash of the record
177
- * @returns The record if it exists, null otherwise
178
- */
179
- async getRecord(type, hash) {
180
- this.checkValid();
181
- return this.db(this.options.tableName).select("key").where({ type, key: hash }).first();
182
- }
183
- /**
184
- * Stores a record in the cache
185
- * @param type The type of record
186
- * @param record The record to store
187
- * @returns true if a new record was created, false if an existing record was updated
188
- */
189
- async store(type, record) {
190
- if (!this.isDestroyed && record) {
191
- try {
192
- const hash = HashedCacheManager.hashRecord(record);
193
- const now = /* @__PURE__ */ new Date();
194
- const existing = await this.db(this.options.tableName).where({
195
- type,
196
- key: hash
197
- }).first();
198
- if (existing) {
199
- return false;
200
- } else {
201
- const result = await this.db(this.options.tableName).insert({
202
- type,
203
- key: hash,
204
- created_at: now
205
- }).returning("id");
206
- return result.length > 0;
207
- }
208
- } catch (error) {
209
- logger.error("Error storing record:", error);
210
- throw error;
211
- }
212
- }
213
- return false;
214
- }
215
- /**
216
- * Checks if a record has changed since last seen
217
- * @param type The type of record
218
- * @param record The record to check
219
- * @returns true if the record has changed or is new
220
- */
221
- async hasChanged(type, record) {
222
- this.checkValid();
223
- const newHash = HashedCacheManager.hashRecord(record);
224
- const existing = await this.getRecord(type, newHash);
225
- return !existing;
226
- }
227
- /**
228
- * Checks if a record has changed and stores it if it has
229
- * @param type The type of record
230
- * @param record The record to check and store
231
- * @returns true if the record was changed or is new
232
- */
233
- async upsert(type, record) {
234
- this.checkValid();
235
- const hasChanged = await this.hasChanged(type, record);
236
- if (hasChanged) {
237
- await this.store(type, record);
238
- }
239
- return hasChanged;
240
- }
241
- /**
242
- * Removes expired records based on TTL
243
- */
244
- async removeExpiredObjects() {
245
- this.checkValid();
246
- const ttl = this.options.ttl;
247
- if (!ttl) return;
248
- const ttlMilliseconds = ttl * 1e3;
249
- const expirationLimitDate = new Date(Date.now() - ttlMilliseconds);
250
- const expirationLimit = expirationLimitDate.toISOString().slice(0, 19).replace("T", " ");
251
- await this.db(this.options.tableName).where("created_at", "<", expirationLimit).del();
252
- }
253
- /**
254
- * Gets all records of a specific type
255
- */
256
- async getRecordsByType(type) {
257
- this.checkValid();
258
- const records = await this.db(this.options.tableName).select("key").where({ type });
259
- return records.map((record) => record.key);
260
- }
261
- /**
262
- * Removes all records of a specific type
263
- */
264
- async removeRecordsByType(type) {
265
- this.checkValid();
266
- await this.db(this.options.tableName).where({ type }).del();
267
- }
268
- /**
269
- * Removes a specific record
270
- */
271
- async removeRecord(type, record) {
272
- if (!this.isDestroyed) {
273
- try {
274
- const hash = HashedCacheManager.hashRecord(record);
275
- await this.db(this.options.tableName).where({ type, key: hash }).del();
276
- } catch (error) {
277
- logger.error("Error removing record:", error);
278
- throw error;
279
- }
280
- }
281
- }
282
- /**
283
- * Clears all records from the cache
284
- */
285
- async clear() {
286
- this.checkValid();
287
- await this.db(this.options.tableName).del();
288
- }
289
- /**
290
- * Cleans up database connection and marks the cache manager as destroyed
291
- */
292
- async destroy() {
293
- if (!this.isDestroyed) {
294
- await this.db.destroy();
295
- this.isDestroyed = true;
296
- }
297
- }
298
- /**
299
- * Gets the current cache metrics
300
- * @returns The current cache metrics
301
- */
302
- async getMetrics() {
303
- this.checkValid();
304
- const counts = await this.db(this.options.tableName).select("type").count("* as count").groupBy("type");
305
- this.metrics.recordCounts = counts.reduce(
306
- (acc, row) => {
307
- acc[row.type] = parseInt(row.count, 10);
308
- return acc;
309
- },
310
- {}
311
- );
312
- return this.metrics;
313
- }
314
- }
315
- export {
316
- CoreConfiguration as C,
317
- ErpApiConnectionParams as E,
318
- HashedCacheManager as H,
319
- getSQLServerConfiguration as a,
320
- getErpApiConnectionParams as g
321
- };
322
- //# sourceMappingURL=hashed-cache-manager-C1u9jQgY.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hashed-cache-manager-C1u9jQgY.js","sources":["../src/services/data-sync-service/configuration-manager.ts","../src/services/caching-service/hashed-cache-manager.ts"],"sourcesContent":["import \"dotenv/config\";\nimport { configureLogger } from \"../reporting-service/logger\";\nimport { SQLServerConfiguration } from \"../sql-server-erp-service/configuration\";\n\nexport class CoreConfiguration {\n private static instance: CoreConfiguration;\n\n // General Configuration\n public readonly logLevel: string;\n public readonly erpSystem: string;\n public readonly nodeEnv: string;\n\n // MM API (aka \"Mapping\") Service\n public readonly mmERPSvcApiBaseUrl: string;\n public readonly mmApiBaseUrl: string;\n public readonly mmApiAuthToken: string;\n public readonly mmApiRetryAttempts: number;\n\n // Caching (optionally used for interacting with the MM API)\n public readonly cacheTTL: number;\n\n // ERP API Service\n public readonly erpApiPagingLimit: number; //Pagination limit for ERP API\n\n // Job timing Intervals\n public readonly fromErpInterval: string;\n public readonly toErpInterval: string;\n public readonly retryLaborTicketsInterval: string;\n public readonly cacheExpirationCheckInterval: string;\n\n private constructor() {\n this.logLevel = process.env.LOG_LEVEL || \"info\";\n this.erpSystem = process.env.ERP_SYSTEM || \"template\";\n this.nodeEnv = process.env.NODE_ENV || \"development\";\n\n //#region MM API (aka \"Mapping\") Service\n /**\n * MM ERP Service REST API URL (typically https://erp-api.svc.machinemetrics.com)\n */\n this.mmERPSvcApiBaseUrl = process.env.MM_MAPPING_SERVICE_URL || \"\";\n\n /**\n * MM REST API URL (typically https://api.machinemetrics.com)\n */\n console.log(\"=== CONFIG DEBUG ===\");\n console.log(\"MM_MAPPING_AUTH_SERVICE_URL env var:\", process.env.MM_MAPPING_AUTH_SERVICE_URL);\n this.mmApiBaseUrl = process.env.MM_MAPPING_AUTH_SERVICE_URL || \"\";\n console.log(\"mmApiBaseUrl set to:\", this.mmApiBaseUrl);\n console.log(\"=== END CONFIG DEBUG ===\");\n\n /**\n * Company Auth Token\n */\n this.mmApiAuthToken = process.env.MM_MAPPING_SERVICE_TOKEN || \"\";\n\n /**\n * Number of retry attempts for MM API calls\n */\n this.mmApiRetryAttempts = parseInt(process.env.RETRY_ATTEMPTS || \"0\");\n //#endregion MM API (aka \"Mapping\") Service\n\n /**\n * Default pagination limit for ERP API\n */\n this.erpApiPagingLimit = parseInt(process.env.ERP_PAGINATION_LIMIT || \"0\");\n //#endregion ERP API Service\n\n /**\n * For how to define the intervals, see Bree's documentation: https://github.com/breejs/bree\n */\n this.fromErpInterval =\n process.env.FROM_ERP_INTERVAL || process.env.POLL_INTERVAL || \"5 min\";\n this.toErpInterval = process.env.TO_ERP_INTERVAL || \"5 min\";\n this.retryLaborTicketsInterval =\n process.env.RETRY_LABOR_TICKETS_INTERVAL || \"30 min\";\n this.cacheExpirationCheckInterval =\n process.env.CACHE_EXPIRATION_CHECK_INTERVAL || \"5 min\";\n\n /**\n * Cache TTL (in seconds)\n */\n const cacheTTLDef = 7 * 24 * 60 * 60; // 7 days\n this.cacheTTL = parseInt(process.env.CACHE_TTL || cacheTTLDef.toString());\n\n // Configure the logger with our settings\n configureLogger(this.logLevel, this.nodeEnv);\n }\n\n public static inst(): CoreConfiguration {\n if (!CoreConfiguration.instance) {\n CoreConfiguration.instance = new CoreConfiguration();\n }\n return CoreConfiguration.instance;\n }\n\n /**\n * Returns a sanitized version of the configuration for safe logging.\n * Masks sensitive fields like authentication tokens.\n */\n public toSafeLogObject(): Record<string, unknown> {\n const maskSensitiveValue = (value: string): string => {\n if (!value || value.length === 0) {\n return \"\";\n }\n if (value.length < 6) {\n return \"********\";\n }\n // Show first 3 and last 3 characters, mask the middle\n return value.substring(0, 3) + \"********\" + value.substring(value.length - 3);\n };\n\n return {\n logLevel: this.logLevel,\n erpSystem: this.erpSystem,\n nodeEnv: this.nodeEnv,\n mmERPSvcApiBaseUrl: this.mmERPSvcApiBaseUrl,\n mmApiBaseUrl: this.mmApiBaseUrl,\n mmApiAuthToken: maskSensitiveValue(this.mmApiAuthToken),\n mmApiRetryAttempts: this.mmApiRetryAttempts,\n cacheTTL: this.cacheTTL,\n erpApiPagingLimit: this.erpApiPagingLimit,\n fromErpInterval: this.fromErpInterval,\n toErpInterval: this.toErpInterval,\n retryLaborTicketsInterval: this.retryLaborTicketsInterval,\n cacheExpirationCheckInterval: this.cacheExpirationCheckInterval,\n };\n }\n}\n\n/**\n * Helper function to get the SQL Server Configuration for collectors that use SQL Server to interact with the ERP\n */\nexport const getSQLServerConfiguration = (): SQLServerConfiguration => {\n return {\n username: process.env.ERP_SQLSERVER_USERNAME || \"\",\n password: process.env.ERP_SQLSERVER_PASSWORD || \"\",\n database: process.env.ERP_SQLSERVER_DATABASE || \"\",\n host:\n process.env.ERP_SQLSERVER_HOST || process.env.ERP_SQLSERVER_SERVER || \"\",\n port: process.env.ERP_SQLSERVER_PORT || \"1433\",\n connectionTimeout: process.env.ERP_SQLSERVER_CONNECTION_TIMEOUT || \"30000\",\n requestTimeout: process.env.ERP_SQLSERVER_REQUEST_TIMEOUT || \"60000\",\n poolMax: process.env.ERP_SQLSERVER_MAX || \"10\",\n poolMin: process.env.ERP_SQLSERVER_MIN || \"0\",\n idleTimeoutMillis:\n process.env.ERP_SQLSERVER_IDLE_TIMEOUT_MMILLIS || \"30000\",\n encrypt: process.env.ERP_SQLSERVER_ENCRYPT === \"true\",\n trustServer: process.env.ERP_SQLSERVER_TRUST_SERVER === \"true\",\n };\n};\n\n/**\n * Parameters required to connect to an ERP system via its API.\n * Contains all the necessary settings to establish a connection and authenticate with an ERP system's API.\n */\nexport class ErpApiConnectionParams {\n constructor(\n public readonly erpApiUrl: string, // Base url of ERP\n public readonly erpApiClientId: string, // Client ID to authenticate with ERP\n public readonly erpApiClientSecret: string, // Client Secret to authenticate with ERP\n public readonly erpApiOrganizationId: string, // Organization / tenant Id\n public readonly erpAuthBaseUrl: string, // Auth base url\n public readonly retryAttempts: number = 3 // Number of retry attempts for API calls\n ) {}\n}\n\n/**\n * Helper function to get the ERP API Connection Parameters\n * Not all connectors use these, but keeping these commonly values in one place may\n * make it easier to set and understand env var names set in App.\n */\nexport const getErpApiConnectionParams = (): ErpApiConnectionParams => {\n return new ErpApiConnectionParams(\n process.env.ERP_API_URL || \"\",\n process.env.ERP_API_CLIENT_ID || \"\",\n process.env.ERP_API_CLIENT_SECRET || \"\",\n process.env.ERP_API_ORGANIZATION_ID || \"\",\n process.env.ERP_AUTH_BASE_URL || \"\",\n parseInt(process.env.ERP_API_RETRY_ATTEMPTS || \"3\")\n );\n};\n","import knex, { Knex } from \"knex\";\nimport config from \"../../knexfile\";\nimport stringify from \"json-stable-stringify\";\nimport XXH from \"xxhashjs\";\nimport { ERPObjType } from \"../../types/erp-types\";\nimport { CacheMetrics } from \"./index\";\nimport { CoreConfiguration } from \"../data-sync-service/configuration-manager\";\nimport { logger } from \"../reporting-service\";\n\ntype HashedCacheManagerOptions = {\n ttl?: number;\n tableName?: string;\n};\n\nexport class HashedCacheManager {\n private static TABLE_NAME = \"sdk_cache\";\n private db: Knex;\n private options: HashedCacheManagerOptions;\n private static readonly SEED = 0xabcd; // Arbitrary seed for hashing\n private isDestroyed: boolean = false;\n private metrics: CacheMetrics = {\n recordCounts: {},\n };\n\n constructor(options?: HashedCacheManagerOptions) {\n this.options = {\n ttl: options?.ttl || CoreConfiguration.inst().cacheTTL,\n tableName: options?.tableName || HashedCacheManager.TABLE_NAME,\n };\n this.db = knex({\n ...config.local,\n pool: {\n min: 0,\n max: 10,\n },\n });\n }\n\n /**\n * Checks if the cache manager is still valid\n * @throws Error if the cache manager has been destroyed\n */\n private checkValid(): void {\n if (this.isDestroyed) {\n throw new Error(\"Cache manager has been destroyed\");\n }\n }\n\n /**\n * Generates a stable hash of a record using JSON stringify + xxhash\n */\n public static hashRecord(record: object): string {\n try {\n const serialized = stringify(record);\n if (!serialized) {\n throw new Error(\"Failed to serialize record for hashing\");\n }\n const hash = XXH.h64(serialized, HashedCacheManager.SEED).toString(16);\n return hash;\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"circular\")) {\n throw new Error(\"Failed to serialize record for hashing\");\n }\n throw error;\n }\n }\n\n /**\n * Gets a record from the cache\n * @param type The type of record\n * @param hash The hash of the record\n * @returns The record if it exists, null otherwise\n */\n private async getRecord(\n type: ERPObjType,\n hash: string\n ): Promise<{ key: string } | null> {\n this.checkValid();\n return this.db(this.options.tableName)\n .select(\"key\")\n .where({ type, key: hash })\n .first();\n }\n\n /**\n * Stores a record in the cache\n * @param type The type of record\n * @param record The record to store\n * @returns true if a new record was created, false if an existing record was updated\n */\n public async store(type: ERPObjType, record: object): Promise<boolean> {\n if (!this.isDestroyed && record) {\n try {\n const hash = HashedCacheManager.hashRecord(record);\n const now = new Date();\n\n // First check if record exists with same type and hash\n const existing = await this.db(this.options.tableName)\n .where({\n type,\n key: hash,\n })\n .first();\n\n if (existing) {\n return false; // No need to update, hash hasn't changed\n } else {\n // Insert new record with minimal data\n const result = await this.db(this.options.tableName)\n .insert({\n type,\n key: hash,\n created_at: now,\n })\n .returning(\"id\");\n return result.length > 0;\n }\n } catch (error) {\n logger.error(\"Error storing record:\", error);\n throw error;\n }\n }\n return false;\n }\n\n /**\n * Checks if a record has changed since last seen\n * @param type The type of record\n * @param record The record to check\n * @returns true if the record has changed or is new\n */\n async hasChanged(type: ERPObjType, record: object): Promise<boolean> {\n this.checkValid();\n const newHash = HashedCacheManager.hashRecord(record);\n const existing = await this.getRecord(type, newHash);\n return !existing;\n }\n\n /**\n * Checks if a record has changed and stores it if it has\n * @param type The type of record\n * @param record The record to check and store\n * @returns true if the record was changed or is new\n */\n async upsert(type: ERPObjType, record: object): Promise<boolean> {\n this.checkValid();\n const hasChanged = await this.hasChanged(type, record);\n if (hasChanged) {\n await this.store(type, record as Record<string, unknown>);\n }\n return hasChanged;\n }\n\n /**\n * Removes expired records based on TTL\n */\n async removeExpiredObjects(): Promise<void> {\n this.checkValid();\n const ttl = this.options.ttl;\n if (!ttl) return;\n\n const ttlMilliseconds = ttl * 1000;\n const expirationLimitDate = new Date(Date.now() - ttlMilliseconds);\n const expirationLimit = expirationLimitDate\n .toISOString()\n .slice(0, 19)\n .replace(\"T\", \" \");\n\n await this.db(this.options.tableName)\n .where(\"created_at\", \"<\", expirationLimit)\n .del();\n }\n\n /**\n * Gets all records of a specific type\n */\n async getRecordsByType(type: ERPObjType): Promise<string[]> {\n this.checkValid();\n const records = await this.db(this.options.tableName)\n .select(\"key\")\n .where({ type });\n\n return records.map((record) => record.key);\n }\n\n /**\n * Removes all records of a specific type\n */\n async removeRecordsByType(type: ERPObjType): Promise<void> {\n this.checkValid();\n await this.db(this.options.tableName).where({ type }).del();\n }\n\n /**\n * Removes a specific record\n */\n public async removeRecord(type: ERPObjType, record: object): Promise<void> {\n if (!this.isDestroyed) {\n try {\n const hash = HashedCacheManager.hashRecord(record);\n await this.db(this.options.tableName)\n .where({ type, key: hash }) // Use key for deletion\n .del();\n } catch (error) {\n logger.error(\"Error removing record:\", error);\n throw error;\n }\n }\n }\n\n /**\n * Clears all records from the cache\n */\n async clear(): Promise<void> {\n this.checkValid();\n await this.db(this.options.tableName).del();\n }\n\n /**\n * Cleans up database connection and marks the cache manager as destroyed\n */\n async destroy(): Promise<void> {\n if (!this.isDestroyed) {\n await this.db.destroy();\n this.isDestroyed = true;\n }\n }\n\n /**\n * Gets the current cache metrics\n * @returns The current cache metrics\n */\n async getMetrics(): Promise<CacheMetrics> {\n this.checkValid();\n\n // Get counts for each type\n const counts = (await this.db(this.options.tableName)\n .select(\"type\")\n .count(\"* as count\")\n .groupBy(\"type\")) as Array<{ type: string; count: string }>;\n\n // Update metrics\n this.metrics.recordCounts = counts.reduce(\n (acc, row) => {\n acc[row.type] = parseInt(row.count, 10);\n return acc;\n },\n {} as Record<string, number>\n );\n\n return this.metrics;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,192 +0,0 @@
1
- import fs, { mkdirSync } from "fs";
2
- import path from "path";
3
- import { l as logger } from "./logger-DW5fyhVS.js";
4
- const STORAGE_FILE = path.join("/tmp", "job-state.json");
5
- const parentDir = path.dirname(STORAGE_FILE);
6
- try {
7
- mkdirSync(parentDir, { recursive: true });
8
- } catch (error) {
9
- if (error.code !== "EEXIST") {
10
- throw error;
11
- }
12
- }
13
- const ensureStorageFile = () => {
14
- if (!fs.existsSync(STORAGE_FILE)) {
15
- fs.writeFileSync(STORAGE_FILE, JSON.stringify({}), "utf-8");
16
- }
17
- };
18
- const readStorage = () => {
19
- ensureStorageFile();
20
- try {
21
- return JSON.parse(fs.readFileSync(STORAGE_FILE, "utf-8"));
22
- } catch (error) {
23
- console.error(`Failed to read storage from ${STORAGE_FILE}:`, error);
24
- return {};
25
- }
26
- };
27
- const writeStorage = (data) => {
28
- ensureStorageFile();
29
- fs.writeFileSync(STORAGE_FILE, JSON.stringify(data, null, 2), "utf-8");
30
- };
31
- const readDatabaseLockState = () => {
32
- return readStorage();
33
- };
34
- const writeDatabaseLockState = (data) => {
35
- writeStorage(data);
36
- };
37
- const getInitialLoadComplete = () => {
38
- const data = readStorage();
39
- return data.initialLoadComplete ?? false;
40
- };
41
- const setInitialLoadComplete = (complete) => {
42
- const data = readStorage();
43
- data.initialLoadComplete = complete;
44
- writeStorage(data);
45
- };
46
- const getCachedTimezoneOffset = () => {
47
- const data = readStorage();
48
- return data.timezoneOffset ?? 0;
49
- };
50
- const setTimezoneOffsetInCache = (offset) => {
51
- const data = readStorage();
52
- data.timezoneOffset = offset;
53
- writeStorage(data);
54
- };
55
- const getCachedTimezoneName = () => {
56
- const data = readStorage();
57
- return data.timezoneName ?? null;
58
- };
59
- const setTimezoneNameInCache = (timezone) => {
60
- const data = readStorage();
61
- data.timezoneName = timezone;
62
- writeStorage(data);
63
- };
64
- const getCachedMMToken = () => {
65
- const data = readStorage();
66
- return data.mmApiToken ?? null;
67
- };
68
- const setCachedMMToken = (tokenData) => {
69
- const data = readStorage();
70
- data.mmApiToken = tokenData;
71
- writeStorage(data);
72
- };
73
- const getDatabaseLock = () => {
74
- const data = readDatabaseLockState();
75
- return data.databaseLock ?? {
76
- isLocked: false,
77
- lockedBy: "",
78
- lockedAt: null
79
- };
80
- };
81
- const acquireDatabaseLock = (processName) => {
82
- const data = readDatabaseLockState();
83
- const currentLock = data.databaseLock ?? {
84
- isLocked: false,
85
- lockedBy: "",
86
- lockedAt: null
87
- };
88
- if (currentLock.isLocked) {
89
- return false;
90
- }
91
- data.databaseLock = {
92
- isLocked: true,
93
- lockedBy: processName,
94
- lockedAt: (/* @__PURE__ */ new Date()).toISOString()
95
- };
96
- writeDatabaseLockState(data);
97
- return true;
98
- };
99
- const releaseDatabaseLock = (processName) => {
100
- const data = readDatabaseLockState();
101
- const currentLock = data.databaseLock ?? {
102
- isLocked: false,
103
- lockedBy: "",
104
- lockedAt: null
105
- };
106
- if (!currentLock.isLocked || currentLock.lockedBy !== processName) {
107
- return false;
108
- }
109
- data.databaseLock = {
110
- isLocked: false,
111
- lockedBy: "",
112
- lockedAt: null
113
- };
114
- writeDatabaseLockState(data);
115
- return true;
116
- };
117
- const isDatabaseAvailable = () => {
118
- const lock = getDatabaseLock();
119
- return !lock.isLocked;
120
- };
121
- class SQLiteCoordinator {
122
- static LOCK_TIMEOUT_MS = 3e4;
123
- // 30 seconds
124
- static LOCK_RETRY_INTERVAL_MS = 1e3;
125
- // 1 second
126
- /**
127
- * Performs startup checks to ensure no stale locks exist
128
- * Should be called when the application starts
129
- */
130
- static async performStartupCheck() {
131
- const currentLock = getDatabaseLock();
132
- if (currentLock.isLocked) {
133
- logger.warn(
134
- `Found existing lock held by ${currentLock.lockedBy}, releasing for clean startup`
135
- );
136
- releaseDatabaseLock(currentLock.lockedBy);
137
- }
138
- }
139
- /**
140
- * Attempts to acquire the database lock
141
- * @param processName Name of the process requesting the lock
142
- * @returns true if lock was acquired, false if database is already locked
143
- */
144
- static async tryAcquireLock(processName) {
145
- return acquireDatabaseLock(processName);
146
- }
147
- /**
148
- * Executes a database operation with proper locking
149
- * @param processName Name of the process executing the operation
150
- * @param operation The operation to execute
151
- * @returns The result of the operation
152
- */
153
- static async executeWithLock(processName, operation) {
154
- const startTime = Date.now();
155
- while (Date.now() - startTime < this.LOCK_TIMEOUT_MS) {
156
- if (await this.tryAcquireLock(processName)) {
157
- try {
158
- const result = await operation();
159
- return result;
160
- } finally {
161
- releaseDatabaseLock(processName);
162
- }
163
- }
164
- await new Promise(
165
- (resolve) => setTimeout(resolve, this.LOCK_RETRY_INTERVAL_MS)
166
- );
167
- }
168
- throw new Error(
169
- `Failed to acquire database lock after ${this.LOCK_TIMEOUT_MS}ms`
170
- );
171
- }
172
- /**
173
- * Checks if the database is currently available for operations
174
- * @returns true if the database is available, false if locked
175
- */
176
- static isAvailable() {
177
- const lock = getDatabaseLock();
178
- return !lock.isLocked;
179
- }
180
- }
181
- export {
182
- SQLiteCoordinator as S,
183
- setTimezoneOffsetInCache as a,
184
- setTimezoneNameInCache as b,
185
- getCachedTimezoneOffset as c,
186
- getInitialLoadComplete as d,
187
- setInitialLoadComplete as e,
188
- getCachedTimezoneName as f,
189
- getCachedMMToken as g,
190
- setCachedMMToken as s
191
- };
192
- //# sourceMappingURL=index-BkVlW0ZW.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-BkVlW0ZW.js","sources":["../src/utils/local-data-store/jobs-shared-data.ts","../src/utils/local-data-store/database-lock.ts","../src/services/sqlite-service/sqlite-coordinator.ts"],"sourcesContent":["import fs from \"fs\";\nimport path from \"path\";\nimport { mkdirSync } from \"fs\";\n\n/**\n * This file contains the logic for storing and retrieving data from the job state file.\n * It is used to store data that is shared between jobs, and (more importantly) across job instances.\n */\n\nconst STORAGE_FILE = path.join(\"/tmp\", \"job-state.json\");\n\n// Ensure parent directory exists\nconst parentDir = path.dirname(STORAGE_FILE);\ntry {\n mkdirSync(parentDir, { recursive: true });\n} catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n}\n\n//#region Non-exported functions\nconst ensureStorageFile = () => {\n if (!fs.existsSync(STORAGE_FILE)) {\n fs.writeFileSync(STORAGE_FILE, JSON.stringify({}), \"utf-8\");\n }\n};\n\nconst readStorage = (): Record<string, unknown> => {\n ensureStorageFile();\n try {\n return JSON.parse(fs.readFileSync(STORAGE_FILE, \"utf-8\"));\n } catch (error) {\n console.error(`Failed to read storage from ${STORAGE_FILE}:`, error);\n return {};\n }\n};\n\nconst writeStorage = (data: Record<string, unknown>): void => {\n ensureStorageFile();\n fs.writeFileSync(STORAGE_FILE, JSON.stringify(data, null, 2), \"utf-8\");\n};\n//#endregion\n\n//#region Database lock storage functions\n/**\n * Reads the database lock state from the shared storage file\n * @returns The data stored in the file\n */\nexport const readDatabaseLockState = (): Record<string, unknown> => {\n return readStorage();\n};\n\n/**\n * Writes the database lock state to the shared storage file\n * @param data The lock state data to write\n */\nexport const writeDatabaseLockState = (data: Record<string, unknown>): void => {\n writeStorage(data);\n};\n//#endregion\n\nexport const getInitialLoadComplete = (): boolean => {\n const data = readStorage();\n return (data.initialLoadComplete as boolean) ?? false;\n};\n\nexport const setInitialLoadComplete = (complete: boolean): void => {\n const data = readStorage();\n data.initialLoadComplete = complete;\n writeStorage(data);\n};\n\n/**\n * Gets the company's cached current timezone offset (e.g., -5)\n * @returns The cached timezone offset or 0 if not found\n */\nexport const getCachedTimezoneOffset = (): number => {\n const data = readStorage();\n return (data.timezoneOffset as number) ?? 0;\n};\n\n/**\n * Sets the company's current timezone offset in the cache\n * @param offset The timezone offset in hours\n */\nexport const setTimezoneOffsetInCache = (offset: number): void => {\n const data = readStorage();\n data.timezoneOffset = offset;\n writeStorage(data);\n};\n\n/**\n * Gets the cached timezone name (e.g., \"America/New_York\")\n * @returns The cached timezone name or null if not found\n */\nexport const getCachedTimezoneName = (): string | null => {\n const data = readStorage();\n return (data.timezoneName as string) ?? null;\n};\n\n/**\n * Sets the timezone name in the cache\n * @param timezone The timezone name (e.g., \"America/New_York\")\n */\nexport const setTimezoneNameInCache = (timezone: string): void => {\n const data = readStorage();\n data.timezoneName = timezone;\n writeStorage(data);\n};\n\ninterface CachedToken {\n token: string;\n expiration: number | null;\n}\n\n/**\n * Gets the cached MM API token and its expiration\n * @returns The cached token and expiration or null if not found\n */\nexport const getCachedMMToken = (): CachedToken | null => {\n const data = readStorage();\n return (data.mmApiToken as CachedToken) ?? null;\n};\n\n/**\n * Sets the MM API token and its expiration in the cache\n * @param tokenData The token and expiration to cache\n */\nexport const setCachedMMToken = (tokenData: CachedToken): void => {\n const data = readStorage();\n data.mmApiToken = tokenData;\n writeStorage(data);\n};\n","import {\n readDatabaseLockState,\n writeDatabaseLockState,\n} from \"./jobs-shared-data\";\n\ninterface DatabaseLock {\n isLocked: boolean;\n lockedBy: string;\n lockedAt: string | null;\n}\n\n/**\n * Gets the current database lock state\n * @returns The current database lock state\n */\nexport const getDatabaseLock = (): DatabaseLock => {\n const data = readDatabaseLockState();\n return (\n (data.databaseLock as DatabaseLock) ?? {\n isLocked: false,\n lockedBy: \"\",\n lockedAt: null,\n }\n );\n};\n\n/**\n * Attempts to acquire the database lock\n * @param processName Name of the process requesting the lock\n * @returns true if lock was acquired, false if database is already locked\n */\nexport const acquireDatabaseLock = (processName: string): boolean => {\n const data = readDatabaseLockState();\n const currentLock = (data.databaseLock as DatabaseLock) ?? {\n isLocked: false,\n lockedBy: \"\",\n lockedAt: null,\n };\n\n if (currentLock.isLocked) {\n return false;\n }\n\n data.databaseLock = {\n isLocked: true,\n lockedBy: processName,\n lockedAt: new Date().toISOString(),\n };\n writeDatabaseLockState(data);\n return true;\n};\n\n/**\n * Releases the database lock\n * @param processName Name of the process releasing the lock\n * @returns true if lock was released, false if process doesn't own the lock\n */\nexport const releaseDatabaseLock = (processName: string): boolean => {\n const data = readDatabaseLockState();\n const currentLock = (data.databaseLock as DatabaseLock) ?? {\n isLocked: false,\n lockedBy: \"\",\n lockedAt: null,\n };\n\n if (!currentLock.isLocked || currentLock.lockedBy !== processName) {\n return false;\n }\n\n data.databaseLock = {\n isLocked: false,\n lockedBy: \"\",\n lockedAt: null,\n };\n writeDatabaseLockState(data);\n return true;\n};\n\n/**\n * Checks if the database is available for use\n * @returns true if database is available, false if locked\n */\nexport const isDatabaseAvailable = (): boolean => {\n const lock = getDatabaseLock();\n return !lock.isLocked;\n};\n","import {\n acquireDatabaseLock,\n releaseDatabaseLock,\n getDatabaseLock,\n} from \"../../utils/local-data-store/database-lock\";\nimport { logger } from \"../reporting-service\";\n\nexport class SQLiteCoordinator {\n private static readonly LOCK_TIMEOUT_MS = 30_000; // 30 seconds\n private static readonly LOCK_RETRY_INTERVAL_MS = 1_000; // 1 second\n\n /**\n * Performs startup checks to ensure no stale locks exist\n * Should be called when the application starts\n */\n static async performStartupCheck(): Promise<void> {\n const currentLock = getDatabaseLock();\n\n if (currentLock.isLocked) {\n logger.warn(\n `Found existing lock held by ${currentLock.lockedBy}, releasing for clean startup`\n );\n releaseDatabaseLock(currentLock.lockedBy);\n }\n }\n\n /**\n * Attempts to acquire the database lock\n * @param processName Name of the process requesting the lock\n * @returns true if lock was acquired, false if database is already locked\n */\n private static async tryAcquireLock(processName: string): Promise<boolean> {\n return acquireDatabaseLock(processName);\n }\n\n /**\n * Executes a database operation with proper locking\n * @param processName Name of the process executing the operation\n * @param operation The operation to execute\n * @returns The result of the operation\n */\n static async executeWithLock<T>(\n processName: string,\n operation: () => Promise<T>\n ): Promise<T> {\n const startTime = Date.now();\n\n // Try to acquire the lock with timeout\n while (Date.now() - startTime < this.LOCK_TIMEOUT_MS) {\n if (await this.tryAcquireLock(processName)) {\n try {\n // Execute the operation\n const result = await operation();\n return result;\n } finally {\n // Always release the lock\n releaseDatabaseLock(processName);\n }\n }\n\n // Wait before retrying\n await new Promise((resolve) =>\n setTimeout(resolve, this.LOCK_RETRY_INTERVAL_MS)\n );\n }\n\n throw new Error(\n `Failed to acquire database lock after ${this.LOCK_TIMEOUT_MS}ms`\n );\n }\n\n /**\n * Checks if the database is currently available for operations\n * @returns true if the database is available, false if locked\n */\n static isAvailable(): boolean {\n const lock = getDatabaseLock();\n return !lock.isLocked;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- import path from "path";
2
- import { fileURLToPath } from "url";
3
- const __dirname$1 = path.dirname(fileURLToPath(import.meta.url));
4
- const config = {
5
- local: {
6
- client: "better-sqlite3",
7
- connection: {
8
- filename: "./local.sqlite3"
9
- },
10
- useNullAsDefault: true,
11
- migrations: {
12
- directory: path.join(__dirname$1, "migrations"),
13
- extension: "js"
14
- }
15
- }
16
- };
17
- export {
18
- config as c
19
- };
20
- //# sourceMappingURL=knexfile-Bng2Ru9c.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"knexfile-Bng2Ru9c.js","sources":["../src/knexfile.ts"],"sourcesContent":["import type { Knex } from \"knex\";\nimport path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\nconst config: { [key: string]: Knex.Config } = {\n local: {\n client: \"better-sqlite3\",\n connection: {\n filename: \"./local.sqlite3\",\n },\n useNullAsDefault: true,\n migrations: {\n directory: path.join(__dirname, \"migrations\"),\n extension: \"js\",\n },\n },\n};\n\nexport default config;\n"],"names":["__dirname"],"mappings":";;AAIA,MAAMA,cAAY,KAAK,QAAQ,cAAc,YAAY,GAAG,CAAC;AAE7D,MAAM,SAAyC;AAAA,EAC7C,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,YAAY;AAAA,MACV,UAAU;AAAA,IAAA;AAAA,IAEZ,kBAAkB;AAAA,IAClB,YAAY;AAAA,MACV,WAAW,KAAK,KAAKA,aAAW,YAAY;AAAA,MAC5C,WAAW;AAAA,IAAA;AAAA,EACb;AAEJ;"}