@freighttech/shipment-tracking 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE +25 -0
  3. package/dist/generated/entities/bic_config/index.js +21 -0
  4. package/dist/generated/entities/bic_config/index.js.map +7 -0
  5. package/dist/generated/entities/carrier_config/index.js +27 -0
  6. package/dist/generated/entities/carrier_config/index.js.map +7 -0
  7. package/dist/generated/entities/location_override/index.js +33 -0
  8. package/dist/generated/entities/location_override/index.js.map +7 -0
  9. package/dist/generated/entities/shipment/index.js +73 -0
  10. package/dist/generated/entities/shipment/index.js.map +7 -0
  11. package/dist/generated/entities/ships_go_config/index.js +31 -0
  12. package/dist/generated/entities/ships_go_config/index.js.map +7 -0
  13. package/dist/generated/entities/tracking_event/index.js +101 -0
  14. package/dist/generated/entities/tracking_event/index.js.map +7 -0
  15. package/dist/generated/entities/tracking_job/index.js +47 -0
  16. package/dist/generated/entities/tracking_job/index.js.map +7 -0
  17. package/dist/generated/entities/webhook/index.js +25 -0
  18. package/dist/generated/entities/webhook/index.js.map +7 -0
  19. package/dist/generated/entities/webhook_delivery/index.js +25 -0
  20. package/dist/generated/entities/webhook_delivery/index.js.map +7 -0
  21. package/dist/generated/entities.ids.generated.js +21 -0
  22. package/dist/generated/entities.ids.generated.js.map +7 -0
  23. package/dist/index.js +41 -0
  24. package/dist/index.js.map +7 -0
  25. package/dist/modules/shipment_tracking/acl.js +22 -0
  26. package/dist/modules/shipment_tracking/acl.js.map +7 -0
  27. package/dist/modules/shipment_tracking/api/bic-configs/route.js +176 -0
  28. package/dist/modules/shipment_tracking/api/bic-configs/route.js.map +7 -0
  29. package/dist/modules/shipment_tracking/api/bic-configs/test/route.js +95 -0
  30. package/dist/modules/shipment_tracking/api/bic-configs/test/route.js.map +7 -0
  31. package/dist/modules/shipment_tracking/api/cargo-events/route.js +93 -0
  32. package/dist/modules/shipment_tracking/api/cargo-events/route.js.map +7 -0
  33. package/dist/modules/shipment_tracking/api/carrier-configs/route.js +139 -0
  34. package/dist/modules/shipment_tracking/api/carrier-configs/route.js.map +7 -0
  35. package/dist/modules/shipment_tracking/api/dashboard/ships-map/route.js +177 -0
  36. package/dist/modules/shipment_tracking/api/dashboard/ships-map/route.js.map +7 -0
  37. package/dist/modules/shipment_tracking/api/location-overrides/route.js +179 -0
  38. package/dist/modules/shipment_tracking/api/location-overrides/route.js.map +7 -0
  39. package/dist/modules/shipment_tracking/api/openapi.js +27 -0
  40. package/dist/modules/shipment_tracking/api/openapi.js.map +7 -0
  41. package/dist/modules/shipment_tracking/api/shipments/route.js +192 -0
  42. package/dist/modules/shipment_tracking/api/shipments/route.js.map +7 -0
  43. package/dist/modules/shipment_tracking/api/shipsgo-configs/route.js +185 -0
  44. package/dist/modules/shipment_tracking/api/shipsgo-configs/route.js.map +7 -0
  45. package/dist/modules/shipment_tracking/api/tracking-jobs/route.js +144 -0
  46. package/dist/modules/shipment_tracking/api/tracking-jobs/route.js.map +7 -0
  47. package/dist/modules/shipment_tracking/api/tracking-jobs/sync/route.js +107 -0
  48. package/dist/modules/shipment_tracking/api/tracking-jobs/sync/route.js.map +7 -0
  49. package/dist/modules/shipment_tracking/api/utils.js +12 -0
  50. package/dist/modules/shipment_tracking/api/utils.js.map +7 -0
  51. package/dist/modules/shipment_tracking/api/webhooks/deliveries/route.js +76 -0
  52. package/dist/modules/shipment_tracking/api/webhooks/deliveries/route.js.map +7 -0
  53. package/dist/modules/shipment_tracking/api/webhooks/route.js +135 -0
  54. package/dist/modules/shipment_tracking/api/webhooks/route.js.map +7 -0
  55. package/dist/modules/shipment_tracking/api/webhooks/test/route.js +71 -0
  56. package/dist/modules/shipment_tracking/api/webhooks/test/route.js.map +7 -0
  57. package/dist/modules/shipment_tracking/assets/carriers/cma_cgm.png +0 -0
  58. package/dist/modules/shipment_tracking/assets/carriers/cosco.png +0 -0
  59. package/dist/modules/shipment_tracking/assets/carriers/evergreen.png +0 -0
  60. package/dist/modules/shipment_tracking/assets/carriers/hapag_lloyd.png +0 -0
  61. package/dist/modules/shipment_tracking/assets/carriers/maersk.png +0 -0
  62. package/dist/modules/shipment_tracking/assets/carriers/msc.png +0 -0
  63. package/dist/modules/shipment_tracking/assets/carriers/one.png +0 -0
  64. package/dist/modules/shipment_tracking/assets/carriers/oocl.png +0 -0
  65. package/dist/modules/shipment_tracking/assets/carriers/yang_ming.png +0 -0
  66. package/dist/modules/shipment_tracking/assets/carriers/zim.png +0 -0
  67. package/dist/modules/shipment_tracking/assets/index.js +52 -0
  68. package/dist/modules/shipment_tracking/assets/index.js.map +7 -0
  69. package/dist/modules/shipment_tracking/backend/carrier-configs/page.js +621 -0
  70. package/dist/modules/shipment_tracking/backend/carrier-configs/page.js.map +7 -0
  71. package/dist/modules/shipment_tracking/backend/carrier-configs/page.meta.js +19 -0
  72. package/dist/modules/shipment_tracking/backend/carrier-configs/page.meta.js.map +7 -0
  73. package/dist/modules/shipment_tracking/backend/location-overrides/page.js +198 -0
  74. package/dist/modules/shipment_tracking/backend/location-overrides/page.js.map +7 -0
  75. package/dist/modules/shipment_tracking/backend/location-overrides/page.meta.js +19 -0
  76. package/dist/modules/shipment_tracking/backend/location-overrides/page.meta.js.map +7 -0
  77. package/dist/modules/shipment_tracking/backend/shipment-tracking/page.js +279 -0
  78. package/dist/modules/shipment_tracking/backend/shipment-tracking/page.js.map +7 -0
  79. package/dist/modules/shipment_tracking/backend/shipment-tracking/page.meta.js +19 -0
  80. package/dist/modules/shipment_tracking/backend/shipment-tracking/page.meta.js.map +7 -0
  81. package/dist/modules/shipment_tracking/backend/tracking-jobs/page.js +10 -0
  82. package/dist/modules/shipment_tracking/backend/tracking-jobs/page.js.map +7 -0
  83. package/dist/modules/shipment_tracking/backend/tracking-jobs/page.meta.js +19 -0
  84. package/dist/modules/shipment_tracking/backend/tracking-jobs/page.meta.js.map +7 -0
  85. package/dist/modules/shipment_tracking/backend/webhooks/page.js +198 -0
  86. package/dist/modules/shipment_tracking/backend/webhooks/page.js.map +7 -0
  87. package/dist/modules/shipment_tracking/backend/webhooks/page.meta.js +19 -0
  88. package/dist/modules/shipment_tracking/backend/webhooks/page.meta.js.map +7 -0
  89. package/dist/modules/shipment_tracking/ce.js +52 -0
  90. package/dist/modules/shipment_tracking/ce.js.map +7 -0
  91. package/dist/modules/shipment_tracking/cli.js +229 -0
  92. package/dist/modules/shipment_tracking/cli.js.map +7 -0
  93. package/dist/modules/shipment_tracking/commands/bic-configs.js +66 -0
  94. package/dist/modules/shipment_tracking/commands/bic-configs.js.map +7 -0
  95. package/dist/modules/shipment_tracking/commands/carrier-configs.js +65 -0
  96. package/dist/modules/shipment_tracking/commands/carrier-configs.js.map +7 -0
  97. package/dist/modules/shipment_tracking/commands/index.js +9 -0
  98. package/dist/modules/shipment_tracking/commands/index.js.map +7 -0
  99. package/dist/modules/shipment_tracking/commands/location-overrides.js +93 -0
  100. package/dist/modules/shipment_tracking/commands/location-overrides.js.map +7 -0
  101. package/dist/modules/shipment_tracking/commands/shipments.js +200 -0
  102. package/dist/modules/shipment_tracking/commands/shipments.js.map +7 -0
  103. package/dist/modules/shipment_tracking/commands/shipsgo-configs.js +75 -0
  104. package/dist/modules/shipment_tracking/commands/shipsgo-configs.js.map +7 -0
  105. package/dist/modules/shipment_tracking/commands/tracking-jobs.js +120 -0
  106. package/dist/modules/shipment_tracking/commands/tracking-jobs.js.map +7 -0
  107. package/dist/modules/shipment_tracking/commands/tracking.js +140 -0
  108. package/dist/modules/shipment_tracking/commands/tracking.js.map +7 -0
  109. package/dist/modules/shipment_tracking/commands/webhooks.js +115 -0
  110. package/dist/modules/shipment_tracking/commands/webhooks.js.map +7 -0
  111. package/dist/modules/shipment_tracking/components/CombinedTimestampCell.js +168 -0
  112. package/dist/modules/shipment_tracking/components/CombinedTimestampCell.js.map +7 -0
  113. package/dist/modules/shipment_tracking/components/FacilityLocationInput.js +202 -0
  114. package/dist/modules/shipment_tracking/components/FacilityLocationInput.js.map +7 -0
  115. package/dist/modules/shipment_tracking/components/LocationOverrideDrawer.js +501 -0
  116. package/dist/modules/shipment_tracking/components/LocationOverrideDrawer.js.map +7 -0
  117. package/dist/modules/shipment_tracking/components/ShipmentDetailsDrawer.js +818 -0
  118. package/dist/modules/shipment_tracking/components/ShipmentDetailsDrawer.js.map +7 -0
  119. package/dist/modules/shipment_tracking/components/ShipmentDrawer.js +404 -0
  120. package/dist/modules/shipment_tracking/components/ShipmentDrawer.js.map +7 -0
  121. package/dist/modules/shipment_tracking/components/ShipsGoConfigSection.js +200 -0
  122. package/dist/modules/shipment_tracking/components/ShipsGoConfigSection.js.map +7 -0
  123. package/dist/modules/shipment_tracking/components/TimestampCell.js +108 -0
  124. package/dist/modules/shipment_tracking/components/TimestampCell.js.map +7 -0
  125. package/dist/modules/shipment_tracking/components/TrackingJobDrawer.js +343 -0
  126. package/dist/modules/shipment_tracking/components/TrackingJobDrawer.js.map +7 -0
  127. package/dist/modules/shipment_tracking/components/VesselTrackingMap.js +496 -0
  128. package/dist/modules/shipment_tracking/components/VesselTrackingMap.js.map +7 -0
  129. package/dist/modules/shipment_tracking/components/WebhookDrawer.js +332 -0
  130. package/dist/modules/shipment_tracking/components/WebhookDrawer.js.map +7 -0
  131. package/dist/modules/shipment_tracking/data/entities.js +686 -0
  132. package/dist/modules/shipment_tracking/data/entities.js.map +7 -0
  133. package/dist/modules/shipment_tracking/data/validators.js +434 -0
  134. package/dist/modules/shipment_tracking/data/validators.js.map +7 -0
  135. package/dist/modules/shipment_tracking/di.js +60 -0
  136. package/dist/modules/shipment_tracking/di.js.map +7 -0
  137. package/dist/modules/shipment_tracking/encryption.js +12 -0
  138. package/dist/modules/shipment_tracking/encryption.js.map +7 -0
  139. package/dist/modules/shipment_tracking/events.js +87 -0
  140. package/dist/modules/shipment_tracking/events.js.map +7 -0
  141. package/dist/modules/shipment_tracking/hooks/useVesselTracking.js +137 -0
  142. package/dist/modules/shipment_tracking/hooks/useVesselTracking.js.map +7 -0
  143. package/dist/modules/shipment_tracking/i18n/de.json +327 -0
  144. package/dist/modules/shipment_tracking/i18n/en.json +327 -0
  145. package/dist/modules/shipment_tracking/i18n/es.json +327 -0
  146. package/dist/modules/shipment_tracking/i18n/pl.json +327 -0
  147. package/dist/modules/shipment_tracking/index.js +15 -0
  148. package/dist/modules/shipment_tracking/index.js.map +7 -0
  149. package/dist/modules/shipment_tracking/lib/adapters/cma-cgm.js +66 -0
  150. package/dist/modules/shipment_tracking/lib/adapters/cma-cgm.js.map +7 -0
  151. package/dist/modules/shipment_tracking/lib/adapters/cosco-types.js +1 -0
  152. package/dist/modules/shipment_tracking/lib/adapters/cosco-types.js.map +7 -0
  153. package/dist/modules/shipment_tracking/lib/adapters/cosco.js +236 -0
  154. package/dist/modules/shipment_tracking/lib/adapters/cosco.js.map +7 -0
  155. package/dist/modules/shipment_tracking/lib/adapters/evergreen.js +87 -0
  156. package/dist/modules/shipment_tracking/lib/adapters/evergreen.js.map +7 -0
  157. package/dist/modules/shipment_tracking/lib/adapters/hapag-lloyd.js +68 -0
  158. package/dist/modules/shipment_tracking/lib/adapters/hapag-lloyd.js.map +7 -0
  159. package/dist/modules/shipment_tracking/lib/adapters/index.js +20 -0
  160. package/dist/modules/shipment_tracking/lib/adapters/index.js.map +7 -0
  161. package/dist/modules/shipment_tracking/lib/adapters/maersk.js +84 -0
  162. package/dist/modules/shipment_tracking/lib/adapters/maersk.js.map +7 -0
  163. package/dist/modules/shipment_tracking/lib/adapters/msc.js +170 -0
  164. package/dist/modules/shipment_tracking/lib/adapters/msc.js.map +7 -0
  165. package/dist/modules/shipment_tracking/lib/adapters/zim.js +85 -0
  166. package/dist/modules/shipment_tracking/lib/adapters/zim.js.map +7 -0
  167. package/dist/modules/shipment_tracking/lib/audit-helpers.js +20 -0
  168. package/dist/modules/shipment_tracking/lib/audit-helpers.js.map +7 -0
  169. package/dist/modules/shipment_tracking/lib/auth/base64url.js +8 -0
  170. package/dist/modules/shipment_tracking/lib/auth/base64url.js.map +7 -0
  171. package/dist/modules/shipment_tracking/lib/auth/oauth-client.js +38 -0
  172. package/dist/modules/shipment_tracking/lib/auth/oauth-client.js.map +7 -0
  173. package/dist/modules/shipment_tracking/lib/background.js +15 -0
  174. package/dist/modules/shipment_tracking/lib/background.js.map +7 -0
  175. package/dist/modules/shipment_tracking/lib/bic-api-client.js +106 -0
  176. package/dist/modules/shipment_tracking/lib/bic-api-client.js.map +7 -0
  177. package/dist/modules/shipment_tracking/lib/carrier-adapter.js +17 -0
  178. package/dist/modules/shipment_tracking/lib/carrier-adapter.js.map +7 -0
  179. package/dist/modules/shipment_tracking/lib/current-vessel.js +149 -0
  180. package/dist/modules/shipment_tracking/lib/current-vessel.js.map +7 -0
  181. package/dist/modules/shipment_tracking/lib/dcsa-event-mapping.js +124 -0
  182. package/dist/modules/shipment_tracking/lib/dcsa-event-mapping.js.map +7 -0
  183. package/dist/modules/shipment_tracking/lib/dcsa-event-parser.js +112 -0
  184. package/dist/modules/shipment_tracking/lib/dcsa-event-parser.js.map +7 -0
  185. package/dist/modules/shipment_tracking/lib/dcsa-params.js +16 -0
  186. package/dist/modules/shipment_tracking/lib/dcsa-params.js.map +7 -0
  187. package/dist/modules/shipment_tracking/lib/empty-return.js +48 -0
  188. package/dist/modules/shipment_tracking/lib/empty-return.js.map +7 -0
  189. package/dist/modules/shipment_tracking/lib/location-overrides.js +85 -0
  190. package/dist/modules/shipment_tracking/lib/location-overrides.js.map +7 -0
  191. package/dist/modules/shipment_tracking/lib/location-types.js +59 -0
  192. package/dist/modules/shipment_tracking/lib/location-types.js.map +7 -0
  193. package/dist/modules/shipment_tracking/lib/logger.js +113 -0
  194. package/dist/modules/shipment_tracking/lib/logger.js.map +7 -0
  195. package/dist/modules/shipment_tracking/lib/poi-event-processor.js +183 -0
  196. package/dist/modules/shipment_tracking/lib/poi-event-processor.js.map +7 -0
  197. package/dist/modules/shipment_tracking/lib/poi-nats-config.js +52 -0
  198. package/dist/modules/shipment_tracking/lib/poi-nats-config.js.map +7 -0
  199. package/dist/modules/shipment_tracking/lib/poi-types.js +43 -0
  200. package/dist/modules/shipment_tracking/lib/poi-types.js.map +7 -0
  201. package/dist/modules/shipment_tracking/lib/rate-limiter.js +31 -0
  202. package/dist/modules/shipment_tracking/lib/rate-limiter.js.map +7 -0
  203. package/dist/modules/shipment_tracking/lib/route-extraction.js +187 -0
  204. package/dist/modules/shipment_tracking/lib/route-extraction.js.map +7 -0
  205. package/dist/modules/shipment_tracking/lib/route-inference.js +106 -0
  206. package/dist/modules/shipment_tracking/lib/route-inference.js.map +7 -0
  207. package/dist/modules/shipment_tracking/lib/schedule-generator.js +63 -0
  208. package/dist/modules/shipment_tracking/lib/schedule-generator.js.map +7 -0
  209. package/dist/modules/shipment_tracking/lib/shipsgo-client.js +143 -0
  210. package/dist/modules/shipment_tracking/lib/shipsgo-client.js.map +7 -0
  211. package/dist/modules/shipment_tracking/lib/shipsgo-mapper.js +204 -0
  212. package/dist/modules/shipment_tracking/lib/shipsgo-mapper.js.map +7 -0
  213. package/dist/modules/shipment_tracking/lib/status-machine.js +131 -0
  214. package/dist/modules/shipment_tracking/lib/status-machine.js.map +7 -0
  215. package/dist/modules/shipment_tracking/lib/time-extraction.js +41 -0
  216. package/dist/modules/shipment_tracking/lib/time-extraction.js.map +7 -0
  217. package/dist/modules/shipment_tracking/lib/timestamp-utils.js +100 -0
  218. package/dist/modules/shipment_tracking/lib/timestamp-utils.js.map +7 -0
  219. package/dist/modules/shipment_tracking/lib/vessel-api.js +111 -0
  220. package/dist/modules/shipment_tracking/lib/vessel-api.js.map +7 -0
  221. package/dist/modules/shipment_tracking/lib/vessel-cache.js +50 -0
  222. package/dist/modules/shipment_tracking/lib/vessel-cache.js.map +7 -0
  223. package/dist/modules/shipment_tracking/lib/vessel-extraction.js +13 -0
  224. package/dist/modules/shipment_tracking/lib/vessel-extraction.js.map +7 -0
  225. package/dist/modules/shipment_tracking/lib/webhook-dispatcher.js +62 -0
  226. package/dist/modules/shipment_tracking/lib/webhook-dispatcher.js.map +7 -0
  227. package/dist/modules/shipment_tracking/migrations/Migration20260422161208_shipment_tracking.js +48 -0
  228. package/dist/modules/shipment_tracking/migrations/Migration20260422161208_shipment_tracking.js.map +7 -0
  229. package/dist/modules/shipment_tracking/migrations/Migration20260529120000_shipment_tracking_poi_region_names.js +15 -0
  230. package/dist/modules/shipment_tracking/migrations/Migration20260529120000_shipment_tracking_poi_region_names.js.map +7 -0
  231. package/dist/modules/shipment_tracking/migrations/Migration20260821120000_shipment_tracking_shipsgo.js +47 -0
  232. package/dist/modules/shipment_tracking/migrations/Migration20260821120000_shipment_tracking_shipsgo.js.map +7 -0
  233. package/dist/modules/shipment_tracking/notifications.js +145 -0
  234. package/dist/modules/shipment_tracking/notifications.js.map +7 -0
  235. package/dist/modules/shipment_tracking/services/carrierRegistry.js +24 -0
  236. package/dist/modules/shipment_tracking/services/carrierRegistry.js.map +7 -0
  237. package/dist/modules/shipment_tracking/services/poiNatsService.js +397 -0
  238. package/dist/modules/shipment_tracking/services/poiNatsService.js.map +7 -0
  239. package/dist/modules/shipment_tracking/services/shipsGoProvider.js +163 -0
  240. package/dist/modules/shipment_tracking/services/shipsGoProvider.js.map +7 -0
  241. package/dist/modules/shipment_tracking/services/trackingService.js +1283 -0
  242. package/dist/modules/shipment_tracking/services/trackingService.js.map +7 -0
  243. package/dist/modules/shipment_tracking/services/webhookService.js +263 -0
  244. package/dist/modules/shipment_tracking/services/webhookService.js.map +7 -0
  245. package/dist/modules/shipment_tracking/setup.js +72 -0
  246. package/dist/modules/shipment_tracking/setup.js.map +7 -0
  247. package/dist/modules/shipment_tracking/subscribers/cargo-event-created.js +60 -0
  248. package/dist/modules/shipment_tracking/subscribers/cargo-event-created.js.map +7 -0
  249. package/dist/modules/shipment_tracking/subscribers/dcsa-event-webhook-dispatch.js +58 -0
  250. package/dist/modules/shipment_tracking/subscribers/dcsa-event-webhook-dispatch.js.map +7 -0
  251. package/dist/modules/shipment_tracking/subscribers/poi-event-notification.js +82 -0
  252. package/dist/modules/shipment_tracking/subscribers/poi-event-notification.js.map +7 -0
  253. package/dist/modules/shipment_tracking/subscribers/poi-event-webhook-dispatch.js +53 -0
  254. package/dist/modules/shipment_tracking/subscribers/poi-event-webhook-dispatch.js.map +7 -0
  255. package/dist/modules/shipment_tracking/subscribers/shipment-status-changed.js +28 -0
  256. package/dist/modules/shipment_tracking/subscribers/shipment-status-changed.js.map +7 -0
  257. package/dist/modules/shipment_tracking/subscribers/terminal-event-ingest.js +67 -0
  258. package/dist/modules/shipment_tracking/subscribers/terminal-event-ingest.js.map +7 -0
  259. package/dist/modules/shipment_tracking/subscribers/tracking-job-initial-poll.js +30 -0
  260. package/dist/modules/shipment_tracking/subscribers/tracking-job-initial-poll.js.map +7 -0
  261. package/dist/modules/shipment_tracking/subscribers/tracking-job-webhook-dispatch.js +19 -0
  262. package/dist/modules/shipment_tracking/subscribers/tracking-job-webhook-dispatch.js.map +7 -0
  263. package/dist/modules/shipment_tracking/tables/index.js +6 -0
  264. package/dist/modules/shipment_tracking/tables/index.js.map +7 -0
  265. package/dist/modules/shipment_tracking/tables/tracking_job/table.client.js +284 -0
  266. package/dist/modules/shipment_tracking/tables/tracking_job/table.client.js.map +7 -0
  267. package/dist/modules/shipment_tracking/tables/tracking_job/table.js +36 -0
  268. package/dist/modules/shipment_tracking/tables/tracking_job/table.js.map +7 -0
  269. package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/config.js +25 -0
  270. package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/config.js.map +7 -0
  271. package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/widget.client.js +355 -0
  272. package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/widget.client.js.map +7 -0
  273. package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/widget.js +26 -0
  274. package/dist/modules/shipment_tracking/widgets/dashboard/ships-map/widget.js.map +7 -0
  275. package/dist/types/assets.d.js +1 -0
  276. package/dist/types/assets.d.js.map +7 -0
  277. package/generated/entities/bic_config/index.ts +20 -0
  278. package/generated/entities/carrier_config/index.ts +23 -0
  279. package/generated/entities/location_override/index.ts +26 -0
  280. package/generated/entities/shipment/index.ts +46 -0
  281. package/generated/entities/ships_go_config/index.ts +25 -0
  282. package/generated/entities/tracking_event/index.ts +60 -0
  283. package/generated/entities/tracking_job/index.ts +33 -0
  284. package/generated/entities/webhook/index.ts +22 -0
  285. package/generated/entities/webhook_delivery/index.ts +22 -0
  286. package/generated/entities.ids.generated.ts +47 -0
  287. package/package.json +81 -0
  288. package/src/index.ts +39 -0
  289. package/src/modules/shipment_tracking/__integration__/TC-TRACK-410-shipsgo-config-api.spec.ts +133 -0
  290. package/src/modules/shipment_tracking/__integration__/meta.ts +4 -0
  291. package/src/modules/shipment_tracking/__tests__/empty-return-stop.test.ts +231 -0
  292. package/src/modules/shipment_tracking/__tests__/fixtures/hapag-lloyd-transship-container.json +702 -0
  293. package/src/modules/shipment_tracking/__tests__/fixtures/index.ts +434 -0
  294. package/src/modules/shipment_tracking/__tests__/fixtures/maersk-multi-transship-completed.json +1518 -0
  295. package/src/modules/shipment_tracking/__tests__/fixtures/maersk-transship-intransit.json +558 -0
  296. package/src/modules/shipment_tracking/__tests__/fixtures/msc-direct.json +222 -0
  297. package/src/modules/shipment_tracking/__tests__/fixtures/msc-multi-transship-completed.json +974 -0
  298. package/src/modules/shipment_tracking/__tests__/fixtures/msc-multi.json +4846 -0
  299. package/src/modules/shipment_tracking/__tests__/fixtures/msc-transship.json +409 -0
  300. package/src/modules/shipment_tracking/__tests__/fixtures/poi-events.json +240 -0
  301. package/src/modules/shipment_tracking/__tests__/fixtures/synthetic/index.ts +138 -0
  302. package/src/modules/shipment_tracking/__tests__/fixtures/synthetic-eta-updates.json +288 -0
  303. package/src/modules/shipment_tracking/__tests__/fixtures/synthetic-route-inference.json +201 -0
  304. package/src/modules/shipment_tracking/__tests__/fixtures/synthetic-voyage-progression.json +410 -0
  305. package/src/modules/shipment_tracking/__tests__/shipsgo-air-mapper.test.ts +157 -0
  306. package/src/modules/shipment_tracking/__tests__/shipsgo-client.test.ts +155 -0
  307. package/src/modules/shipment_tracking/__tests__/shipsgo-mapper.test.ts +201 -0
  308. package/src/modules/shipment_tracking/__tests__/shipsgo-poll.test.ts +357 -0
  309. package/src/modules/shipment_tracking/__tests__/shipsgo-provider.test.ts +364 -0
  310. package/src/modules/shipment_tracking/__tests__/trackingService.integration.test.ts +2248 -0
  311. package/src/modules/shipment_tracking/__tests__/webhookPayload.test.ts +151 -0
  312. package/src/modules/shipment_tracking/acl.ts +18 -0
  313. package/src/modules/shipment_tracking/api/bic-configs/route.ts +206 -0
  314. package/src/modules/shipment_tracking/api/bic-configs/test/route.ts +108 -0
  315. package/src/modules/shipment_tracking/api/cargo-events/route.ts +101 -0
  316. package/src/modules/shipment_tracking/api/carrier-configs/route.ts +142 -0
  317. package/src/modules/shipment_tracking/api/dashboard/ships-map/route.ts +246 -0
  318. package/src/modules/shipment_tracking/api/location-overrides/route.ts +185 -0
  319. package/src/modules/shipment_tracking/api/openapi.ts +28 -0
  320. package/src/modules/shipment_tracking/api/shipments/route.ts +197 -0
  321. package/src/modules/shipment_tracking/api/shipsgo-configs/route.ts +215 -0
  322. package/src/modules/shipment_tracking/api/tracking-jobs/route.ts +149 -0
  323. package/src/modules/shipment_tracking/api/tracking-jobs/sync/route.ts +116 -0
  324. package/src/modules/shipment_tracking/api/utils.ts +10 -0
  325. package/src/modules/shipment_tracking/api/webhooks/deliveries/route.ts +82 -0
  326. package/src/modules/shipment_tracking/api/webhooks/route.ts +138 -0
  327. package/src/modules/shipment_tracking/api/webhooks/test/route.ts +84 -0
  328. package/src/modules/shipment_tracking/assets/carriers/cma_cgm.png +0 -0
  329. package/src/modules/shipment_tracking/assets/carriers/cosco.png +0 -0
  330. package/src/modules/shipment_tracking/assets/carriers/evergreen.png +0 -0
  331. package/src/modules/shipment_tracking/assets/carriers/hapag_lloyd.png +0 -0
  332. package/src/modules/shipment_tracking/assets/carriers/maersk.png +0 -0
  333. package/src/modules/shipment_tracking/assets/carriers/msc.png +0 -0
  334. package/src/modules/shipment_tracking/assets/carriers/one.png +0 -0
  335. package/src/modules/shipment_tracking/assets/carriers/oocl.png +0 -0
  336. package/src/modules/shipment_tracking/assets/carriers/yang_ming.png +0 -0
  337. package/src/modules/shipment_tracking/assets/carriers/zim.png +0 -0
  338. package/src/modules/shipment_tracking/assets/index.ts +66 -0
  339. package/src/modules/shipment_tracking/backend/carrier-configs/page.meta.ts +16 -0
  340. package/src/modules/shipment_tracking/backend/carrier-configs/page.tsx +782 -0
  341. package/src/modules/shipment_tracking/backend/location-overrides/page.meta.ts +16 -0
  342. package/src/modules/shipment_tracking/backend/location-overrides/page.tsx +241 -0
  343. package/src/modules/shipment_tracking/backend/shipment-tracking/page.meta.ts +16 -0
  344. package/src/modules/shipment_tracking/backend/shipment-tracking/page.tsx +340 -0
  345. package/src/modules/shipment_tracking/backend/tracking-jobs/page.meta.ts +16 -0
  346. package/src/modules/shipment_tracking/backend/tracking-jobs/page.tsx +16 -0
  347. package/src/modules/shipment_tracking/backend/webhooks/page.meta.ts +16 -0
  348. package/src/modules/shipment_tracking/backend/webhooks/page.tsx +228 -0
  349. package/src/modules/shipment_tracking/ce.ts +48 -0
  350. package/src/modules/shipment_tracking/cli.ts +321 -0
  351. package/src/modules/shipment_tracking/commands/bic-configs.ts +94 -0
  352. package/src/modules/shipment_tracking/commands/carrier-configs.ts +89 -0
  353. package/src/modules/shipment_tracking/commands/index.ts +8 -0
  354. package/src/modules/shipment_tracking/commands/location-overrides.ts +119 -0
  355. package/src/modules/shipment_tracking/commands/shipments.ts +247 -0
  356. package/src/modules/shipment_tracking/commands/shipsgo-configs.ts +101 -0
  357. package/src/modules/shipment_tracking/commands/tracking-jobs.ts +158 -0
  358. package/src/modules/shipment_tracking/commands/tracking.ts +230 -0
  359. package/src/modules/shipment_tracking/commands/webhooks.ts +159 -0
  360. package/src/modules/shipment_tracking/components/CombinedTimestampCell.tsx +236 -0
  361. package/src/modules/shipment_tracking/components/FacilityLocationInput.tsx +235 -0
  362. package/src/modules/shipment_tracking/components/LocationOverrideDrawer.tsx +586 -0
  363. package/src/modules/shipment_tracking/components/ShipmentDetailsDrawer.tsx +1364 -0
  364. package/src/modules/shipment_tracking/components/ShipmentDrawer.tsx +498 -0
  365. package/src/modules/shipment_tracking/components/ShipsGoConfigSection.tsx +266 -0
  366. package/src/modules/shipment_tracking/components/TimestampCell.tsx +146 -0
  367. package/src/modules/shipment_tracking/components/TrackingJobDrawer.tsx +467 -0
  368. package/src/modules/shipment_tracking/components/VesselTrackingMap.tsx +761 -0
  369. package/src/modules/shipment_tracking/components/WebhookDrawer.tsx +434 -0
  370. package/src/modules/shipment_tracking/data/entities.ts +748 -0
  371. package/src/modules/shipment_tracking/data/validators.ts +523 -0
  372. package/src/modules/shipment_tracking/di.ts +73 -0
  373. package/src/modules/shipment_tracking/encryption.ts +17 -0
  374. package/src/modules/shipment_tracking/events.ts +122 -0
  375. package/src/modules/shipment_tracking/hooks/useVesselTracking.ts +297 -0
  376. package/src/modules/shipment_tracking/i18n/de.json +327 -0
  377. package/src/modules/shipment_tracking/i18n/en.json +327 -0
  378. package/src/modules/shipment_tracking/i18n/es.json +327 -0
  379. package/src/modules/shipment_tracking/i18n/pl.json +327 -0
  380. package/src/modules/shipment_tracking/index.ts +13 -0
  381. package/src/modules/shipment_tracking/lib/__tests__/dcsa-event-mapping.test.ts +385 -0
  382. package/src/modules/shipment_tracking/lib/__tests__/dcsa-event-parser.test.ts +398 -0
  383. package/src/modules/shipment_tracking/lib/__tests__/empty-return.test.ts +174 -0
  384. package/src/modules/shipment_tracking/lib/__tests__/poi-event-processor.test.ts +699 -0
  385. package/src/modules/shipment_tracking/lib/__tests__/route-inference.test.ts +402 -0
  386. package/src/modules/shipment_tracking/lib/__tests__/status-machine.test.ts +447 -0
  387. package/src/modules/shipment_tracking/lib/__tests__/time-extraction.test.ts +331 -0
  388. package/src/modules/shipment_tracking/lib/__tests__/timestamp-utils.test.ts +260 -0
  389. package/src/modules/shipment_tracking/lib/__tests__/vessel-api.test.ts +125 -0
  390. package/src/modules/shipment_tracking/lib/__tests__/vessel-extraction.test.ts +108 -0
  391. package/src/modules/shipment_tracking/lib/adapters/cma-cgm.ts +84 -0
  392. package/src/modules/shipment_tracking/lib/adapters/cosco-types.ts +145 -0
  393. package/src/modules/shipment_tracking/lib/adapters/cosco.ts +314 -0
  394. package/src/modules/shipment_tracking/lib/adapters/evergreen.ts +107 -0
  395. package/src/modules/shipment_tracking/lib/adapters/hapag-lloyd.ts +88 -0
  396. package/src/modules/shipment_tracking/lib/adapters/index.ts +18 -0
  397. package/src/modules/shipment_tracking/lib/adapters/maersk.ts +104 -0
  398. package/src/modules/shipment_tracking/lib/adapters/msc.ts +223 -0
  399. package/src/modules/shipment_tracking/lib/adapters/zim.ts +106 -0
  400. package/src/modules/shipment_tracking/lib/audit-helpers.ts +29 -0
  401. package/src/modules/shipment_tracking/lib/auth/base64url.ts +4 -0
  402. package/src/modules/shipment_tracking/lib/auth/oauth-client.ts +53 -0
  403. package/src/modules/shipment_tracking/lib/background.ts +24 -0
  404. package/src/modules/shipment_tracking/lib/bic-api-client.ts +199 -0
  405. package/src/modules/shipment_tracking/lib/carrier-adapter.ts +136 -0
  406. package/src/modules/shipment_tracking/lib/current-vessel.ts +274 -0
  407. package/src/modules/shipment_tracking/lib/dcsa-event-mapping.ts +202 -0
  408. package/src/modules/shipment_tracking/lib/dcsa-event-parser.ts +163 -0
  409. package/src/modules/shipment_tracking/lib/dcsa-params.ts +14 -0
  410. package/src/modules/shipment_tracking/lib/empty-return.ts +122 -0
  411. package/src/modules/shipment_tracking/lib/location-overrides.ts +150 -0
  412. package/src/modules/shipment_tracking/lib/location-types.ts +154 -0
  413. package/src/modules/shipment_tracking/lib/logger.ts +195 -0
  414. package/src/modules/shipment_tracking/lib/poi-event-processor.ts +302 -0
  415. package/src/modules/shipment_tracking/lib/poi-nats-config.ts +134 -0
  416. package/src/modules/shipment_tracking/lib/poi-types.ts +198 -0
  417. package/src/modules/shipment_tracking/lib/rate-limiter.ts +58 -0
  418. package/src/modules/shipment_tracking/lib/route-extraction.ts +439 -0
  419. package/src/modules/shipment_tracking/lib/route-inference.ts +238 -0
  420. package/src/modules/shipment_tracking/lib/schedule-generator.ts +92 -0
  421. package/src/modules/shipment_tracking/lib/shipsgo-client.ts +350 -0
  422. package/src/modules/shipment_tracking/lib/shipsgo-mapper.ts +296 -0
  423. package/src/modules/shipment_tracking/lib/status-machine.ts +230 -0
  424. package/src/modules/shipment_tracking/lib/time-extraction.ts +85 -0
  425. package/src/modules/shipment_tracking/lib/timestamp-utils.ts +244 -0
  426. package/src/modules/shipment_tracking/lib/vessel-api.ts +299 -0
  427. package/src/modules/shipment_tracking/lib/vessel-cache.ts +102 -0
  428. package/src/modules/shipment_tracking/lib/vessel-extraction.ts +39 -0
  429. package/src/modules/shipment_tracking/lib/webhook-dispatcher.ts +93 -0
  430. package/src/modules/shipment_tracking/migrations/.snapshot-open-mercato.json +2914 -0
  431. package/src/modules/shipment_tracking/migrations/Migration20260422161208_shipment_tracking.ts +60 -0
  432. package/src/modules/shipment_tracking/migrations/Migration20260529120000_shipment_tracking_poi_region_names.ts +22 -0
  433. package/src/modules/shipment_tracking/migrations/Migration20260821120000_shipment_tracking_shipsgo.ts +65 -0
  434. package/src/modules/shipment_tracking/notifications.ts +151 -0
  435. package/src/modules/shipment_tracking/services/carrierRegistry.ts +29 -0
  436. package/src/modules/shipment_tracking/services/poiNatsService.ts +526 -0
  437. package/src/modules/shipment_tracking/services/shipsGoProvider.ts +231 -0
  438. package/src/modules/shipment_tracking/services/trackingService.ts +1777 -0
  439. package/src/modules/shipment_tracking/services/webhookService.ts +347 -0
  440. package/src/modules/shipment_tracking/setup.ts +99 -0
  441. package/src/modules/shipment_tracking/subscribers/__tests__/terminal-event-ingest.test.ts +141 -0
  442. package/src/modules/shipment_tracking/subscribers/cargo-event-created.ts +115 -0
  443. package/src/modules/shipment_tracking/subscribers/dcsa-event-webhook-dispatch.ts +115 -0
  444. package/src/modules/shipment_tracking/subscribers/poi-event-notification.ts +144 -0
  445. package/src/modules/shipment_tracking/subscribers/poi-event-webhook-dispatch.ts +94 -0
  446. package/src/modules/shipment_tracking/subscribers/shipment-status-changed.ts +41 -0
  447. package/src/modules/shipment_tracking/subscribers/terminal-event-ingest.ts +109 -0
  448. package/src/modules/shipment_tracking/subscribers/tracking-job-initial-poll.ts +53 -0
  449. package/src/modules/shipment_tracking/subscribers/tracking-job-webhook-dispatch.ts +50 -0
  450. package/src/modules/shipment_tracking/tables/index.ts +4 -0
  451. package/src/modules/shipment_tracking/tables/tracking_job/table.client.tsx +337 -0
  452. package/src/modules/shipment_tracking/tables/tracking_job/table.ts +34 -0
  453. package/src/modules/shipment_tracking/widgets/dashboard/ships-map/config.ts +32 -0
  454. package/src/modules/shipment_tracking/widgets/dashboard/ships-map/widget.client.tsx +448 -0
  455. package/src/modules/shipment_tracking/widgets/dashboard/ships-map/widget.ts +25 -0
  456. package/src/types/assets.d.ts +5 -0
@@ -0,0 +1,47 @@
1
+ import { Migration } from "@mikro-orm/migrations";
2
+ class Migration20260821120000_shipment_tracking_shipsgo extends Migration {
3
+ async up() {
4
+ this.addSql(`create table if not exists "shipment_tracking_shipsgo_configs" (
5
+ "id" uuid not null default gen_random_uuid(),
6
+ "organization_id" uuid not null,
7
+ "tenant_id" uuid not null,
8
+ "is_enabled" boolean not null default false,
9
+ "api_token" text not null,
10
+ "base_url" text not null default 'https://api.shipsgo.com/v2',
11
+ "ocean_enabled" boolean not null default true,
12
+ "air_enabled" boolean not null default true,
13
+ "rate_limit_requests" int not null default 60,
14
+ "rate_limit_window_seconds" int not null default 60,
15
+ "is_active" boolean not null default true,
16
+ "created_at" timestamptz not null default now(),
17
+ "updated_at" timestamptz not null default now(),
18
+ "deleted_at" timestamptz null,
19
+ constraint "shipment_tracking_shipsgo_configs_pkey" primary key ("id")
20
+ );`);
21
+ this.addSql(`create index if not exists "st_shipsgo_configs_org_tenant_idx" on "shipment_tracking_shipsgo_configs" ("organization_id", "tenant_id");`);
22
+ this.addSql(`create unique index if not exists "st_shipsgo_configs_scope_unique" on "shipment_tracking_shipsgo_configs" ("organization_id", "tenant_id");`);
23
+ this.addSql(`alter table "shipment_tracking_jobs" add column if not exists "provider" text not null default 'carrier';`);
24
+ this.addSql(`alter table "shipment_tracking_jobs" add column if not exists "mode" text not null default 'ocean';`);
25
+ this.addSql(`alter table "shipment_tracking_jobs" add column if not exists "provider_shipment_id" text null;`);
26
+ this.addSql(`alter table "shipment_tracking_shipments" add column if not exists "mode" text not null default 'ocean';`);
27
+ this.addSql(`alter table "shipment_tracking_shipments" add column if not exists "awb_number" text null;`);
28
+ this.addSql(`alter table "shipment_tracking_shipments" add column if not exists "flight_number" text null;`);
29
+ this.addSql(`alter table "shipment_tracking_shipments" add column if not exists "airline_code" text null;`);
30
+ this.addSql(`alter table "shipment_tracking_shipments" add column if not exists "airline_name" text null;`);
31
+ }
32
+ async down() {
33
+ this.addSql(`alter table "shipment_tracking_shipments" drop column if exists "airline_name";`);
34
+ this.addSql(`alter table "shipment_tracking_shipments" drop column if exists "airline_code";`);
35
+ this.addSql(`alter table "shipment_tracking_shipments" drop column if exists "flight_number";`);
36
+ this.addSql(`alter table "shipment_tracking_shipments" drop column if exists "awb_number";`);
37
+ this.addSql(`alter table "shipment_tracking_shipments" drop column if exists "mode";`);
38
+ this.addSql(`alter table "shipment_tracking_jobs" drop column if exists "provider_shipment_id";`);
39
+ this.addSql(`alter table "shipment_tracking_jobs" drop column if exists "mode";`);
40
+ this.addSql(`alter table "shipment_tracking_jobs" drop column if exists "provider";`);
41
+ this.addSql(`drop table if exists "shipment_tracking_shipsgo_configs";`);
42
+ }
43
+ }
44
+ export {
45
+ Migration20260821120000_shipment_tracking_shipsgo
46
+ };
47
+ //# sourceMappingURL=Migration20260821120000_shipment_tracking_shipsgo.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/shipment_tracking/migrations/Migration20260821120000_shipment_tracking_shipsgo.ts"],
4
+ "sourcesContent": ["import { Migration } from '@mikro-orm/migrations';\n\n/**\n * ShipsGo fallback tracking (Phase 1 \u2014 ocean fallback + air groundwork).\n *\n * Additive only:\n * - `shipment_tracking_shipsgo_configs`: per-tenant ShipsGo config (encrypted api_token).\n * - `shipment_tracking_jobs`: `provider` ('carrier'|'shipsgo'), `mode` ('ocean'|'air'),\n * `provider_shipment_id` (ShipsGo id, set on registration).\n * - `shipment_tracking_shipments`: `mode` + air fields (awb/flight/airline), all nullable.\n *\n * Existing rows default to provider='carrier', mode='ocean' \u2014 no backfill needed.\n */\nexport class Migration20260821120000_shipment_tracking_shipsgo extends Migration {\n\n override async up(): Promise<void> {\n // ShipsGoConfig\n this.addSql(`create table if not exists \"shipment_tracking_shipsgo_configs\" (\n \"id\" uuid not null default gen_random_uuid(),\n \"organization_id\" uuid not null,\n \"tenant_id\" uuid not null,\n \"is_enabled\" boolean not null default false,\n \"api_token\" text not null,\n \"base_url\" text not null default 'https://api.shipsgo.com/v2',\n \"ocean_enabled\" boolean not null default true,\n \"air_enabled\" boolean not null default true,\n \"rate_limit_requests\" int not null default 60,\n \"rate_limit_window_seconds\" int not null default 60,\n \"is_active\" boolean not null default true,\n \"created_at\" timestamptz not null default now(),\n \"updated_at\" timestamptz not null default now(),\n \"deleted_at\" timestamptz null,\n constraint \"shipment_tracking_shipsgo_configs_pkey\" primary key (\"id\")\n );`);\n this.addSql(`create index if not exists \"st_shipsgo_configs_org_tenant_idx\" on \"shipment_tracking_shipsgo_configs\" (\"organization_id\", \"tenant_id\");`);\n this.addSql(`create unique index if not exists \"st_shipsgo_configs_scope_unique\" on \"shipment_tracking_shipsgo_configs\" (\"organization_id\", \"tenant_id\");`);\n\n // TrackingJob provider/mode\n this.addSql(`alter table \"shipment_tracking_jobs\" add column if not exists \"provider\" text not null default 'carrier';`);\n this.addSql(`alter table \"shipment_tracking_jobs\" add column if not exists \"mode\" text not null default 'ocean';`);\n this.addSql(`alter table \"shipment_tracking_jobs\" add column if not exists \"provider_shipment_id\" text null;`);\n\n // Shipment mode + air fields\n this.addSql(`alter table \"shipment_tracking_shipments\" add column if not exists \"mode\" text not null default 'ocean';`);\n this.addSql(`alter table \"shipment_tracking_shipments\" add column if not exists \"awb_number\" text null;`);\n this.addSql(`alter table \"shipment_tracking_shipments\" add column if not exists \"flight_number\" text null;`);\n this.addSql(`alter table \"shipment_tracking_shipments\" add column if not exists \"airline_code\" text null;`);\n this.addSql(`alter table \"shipment_tracking_shipments\" add column if not exists \"airline_name\" text null;`);\n }\n\n override async down(): Promise<void> {\n this.addSql(`alter table \"shipment_tracking_shipments\" drop column if exists \"airline_name\";`);\n this.addSql(`alter table \"shipment_tracking_shipments\" drop column if exists \"airline_code\";`);\n this.addSql(`alter table \"shipment_tracking_shipments\" drop column if exists \"flight_number\";`);\n this.addSql(`alter table \"shipment_tracking_shipments\" drop column if exists \"awb_number\";`);\n this.addSql(`alter table \"shipment_tracking_shipments\" drop column if exists \"mode\";`);\n\n this.addSql(`alter table \"shipment_tracking_jobs\" drop column if exists \"provider_shipment_id\";`);\n this.addSql(`alter table \"shipment_tracking_jobs\" drop column if exists \"mode\";`);\n this.addSql(`alter table \"shipment_tracking_jobs\" drop column if exists \"provider\";`);\n\n this.addSql(`drop table if exists \"shipment_tracking_shipsgo_configs\";`);\n }\n\n}\n"],
5
+ "mappings": "AAAA,SAAS,iBAAiB;AAanB,MAAM,0DAA0D,UAAU;AAAA,EAE/E,MAAe,KAAoB;AAEjC,SAAK,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,OAgBT;AACH,SAAK,OAAO,yIAAyI;AACrJ,SAAK,OAAO,8IAA8I;AAG1J,SAAK,OAAO,2GAA2G;AACvH,SAAK,OAAO,qGAAqG;AACjH,SAAK,OAAO,iGAAiG;AAG7G,SAAK,OAAO,0GAA0G;AACtH,SAAK,OAAO,4FAA4F;AACxG,SAAK,OAAO,+FAA+F;AAC3G,SAAK,OAAO,8FAA8F;AAC1G,SAAK,OAAO,8FAA8F;AAAA,EAC5G;AAAA,EAEA,MAAe,OAAsB;AACnC,SAAK,OAAO,iFAAiF;AAC7F,SAAK,OAAO,iFAAiF;AAC7F,SAAK,OAAO,kFAAkF;AAC9F,SAAK,OAAO,+EAA+E;AAC3F,SAAK,OAAO,yEAAyE;AAErF,SAAK,OAAO,oFAAoF;AAChG,SAAK,OAAO,oEAAoE;AAChF,SAAK,OAAO,wEAAwE;AAEpF,SAAK,OAAO,2DAA2D;AAAA,EACzE;AAEF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,145 @@
1
+ const notificationTypes = [
2
+ // ─── Tracking Job POI Port Events ──────────────────────────────
3
+ {
4
+ type: "shipment_tracking.tracking_job.poi.port_arrival",
5
+ module: "shipment_tracking",
6
+ titleKey: "shipment_tracking.notifications.tracking_job.poi.port_arrival.title",
7
+ bodyKey: "shipment_tracking.notifications.tracking_job.poi.port_arrival.body",
8
+ icon: "anchor",
9
+ severity: "success",
10
+ actions: [
11
+ {
12
+ id: "view",
13
+ labelKey: "common.view",
14
+ variant: "outline",
15
+ href: "/backend/shipment-tracking?shipment={sourceEntityId}",
16
+ icon: "external-link"
17
+ }
18
+ ],
19
+ linkHref: "/backend/shipment-tracking?shipment={sourceEntityId}",
20
+ expiresAfterHours: 168
21
+ // 7 days
22
+ },
23
+ {
24
+ type: "shipment_tracking.tracking_job.poi.port_proximity_arrival",
25
+ module: "shipment_tracking",
26
+ titleKey: "shipment_tracking.notifications.tracking_job.poi.port_proximity_arrival.title",
27
+ bodyKey: "shipment_tracking.notifications.tracking_job.poi.port_proximity_arrival.body",
28
+ icon: "navigation",
29
+ severity: "info",
30
+ actions: [
31
+ {
32
+ id: "view",
33
+ labelKey: "common.view",
34
+ variant: "outline",
35
+ href: "/backend/shipment-tracking?shipment={sourceEntityId}",
36
+ icon: "external-link"
37
+ }
38
+ ],
39
+ linkHref: "/backend/shipment-tracking?shipment={sourceEntityId}",
40
+ expiresAfterHours: 168
41
+ },
42
+ {
43
+ type: "shipment_tracking.tracking_job.poi.port_departure",
44
+ module: "shipment_tracking",
45
+ titleKey: "shipment_tracking.notifications.tracking_job.poi.port_departure.title",
46
+ bodyKey: "shipment_tracking.notifications.tracking_job.poi.port_departure.body",
47
+ icon: "ship",
48
+ severity: "info",
49
+ actions: [
50
+ {
51
+ id: "view",
52
+ labelKey: "common.view",
53
+ variant: "outline",
54
+ href: "/backend/shipment-tracking?shipment={sourceEntityId}",
55
+ icon: "external-link"
56
+ }
57
+ ],
58
+ linkHref: "/backend/shipment-tracking?shipment={sourceEntityId}",
59
+ expiresAfterHours: 168
60
+ },
61
+ // ─── Tracking Job POI Terminal Events ──────────────────────────
62
+ {
63
+ type: "shipment_tracking.tracking_job.poi.terminal_arrival",
64
+ module: "shipment_tracking",
65
+ titleKey: "shipment_tracking.notifications.tracking_job.poi.terminal_arrival.title",
66
+ bodyKey: "shipment_tracking.notifications.tracking_job.poi.terminal_arrival.body",
67
+ icon: "container",
68
+ severity: "success",
69
+ actions: [
70
+ {
71
+ id: "view",
72
+ labelKey: "common.view",
73
+ variant: "outline",
74
+ href: "/backend/shipment-tracking?shipment={sourceEntityId}",
75
+ icon: "external-link"
76
+ }
77
+ ],
78
+ linkHref: "/backend/shipment-tracking?shipment={sourceEntityId}",
79
+ expiresAfterHours: 168
80
+ },
81
+ {
82
+ type: "shipment_tracking.tracking_job.poi.terminal_proximity_arrival",
83
+ module: "shipment_tracking",
84
+ titleKey: "shipment_tracking.notifications.tracking_job.poi.terminal_proximity_arrival.title",
85
+ bodyKey: "shipment_tracking.notifications.tracking_job.poi.terminal_proximity_arrival.body",
86
+ icon: "navigation",
87
+ severity: "info",
88
+ actions: [
89
+ {
90
+ id: "view",
91
+ labelKey: "common.view",
92
+ variant: "outline",
93
+ href: "/backend/shipment-tracking?shipment={sourceEntityId}",
94
+ icon: "external-link"
95
+ }
96
+ ],
97
+ linkHref: "/backend/shipment-tracking?shipment={sourceEntityId}",
98
+ expiresAfterHours: 168
99
+ },
100
+ {
101
+ type: "shipment_tracking.tracking_job.poi.terminal_departure",
102
+ module: "shipment_tracking",
103
+ titleKey: "shipment_tracking.notifications.tracking_job.poi.terminal_departure.title",
104
+ bodyKey: "shipment_tracking.notifications.tracking_job.poi.terminal_departure.body",
105
+ icon: "ship",
106
+ severity: "info",
107
+ actions: [
108
+ {
109
+ id: "view",
110
+ labelKey: "common.view",
111
+ variant: "outline",
112
+ href: "/backend/shipment-tracking?shipment={sourceEntityId}",
113
+ icon: "external-link"
114
+ }
115
+ ],
116
+ linkHref: "/backend/shipment-tracking?shipment={sourceEntityId}",
117
+ expiresAfterHours: 168
118
+ },
119
+ // ─── Tracking Job POI Waypoint Events ──────────────────────────
120
+ {
121
+ type: "shipment_tracking.tracking_job.poi.waypoint_reached",
122
+ module: "shipment_tracking",
123
+ titleKey: "shipment_tracking.notifications.tracking_job.poi.waypoint_reached.title",
124
+ bodyKey: "shipment_tracking.notifications.tracking_job.poi.waypoint_reached.body",
125
+ icon: "map-pin",
126
+ severity: "info",
127
+ actions: [
128
+ {
129
+ id: "view",
130
+ labelKey: "common.view",
131
+ variant: "outline",
132
+ href: "/backend/shipment-tracking?shipment={sourceEntityId}",
133
+ icon: "external-link"
134
+ }
135
+ ],
136
+ linkHref: "/backend/shipment-tracking?shipment={sourceEntityId}",
137
+ expiresAfterHours: 168
138
+ }
139
+ ];
140
+ var notifications_default = notificationTypes;
141
+ export {
142
+ notifications_default as default,
143
+ notificationTypes
144
+ };
145
+ //# sourceMappingURL=notifications.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/modules/shipment_tracking/notifications.ts"],
4
+ "sourcesContent": ["import type { NotificationTypeDefinition } from '@open-mercato/shared/modules/notifications/types'\n\n/**\n * Shipment Tracking Notification Types\n *\n * These are per-tracking-job notification types for POI proximity events.\n * Using per-job events ensures only one notification per booking/BOL,\n * regardless of how many containers are being tracked.\n */\nexport const notificationTypes: NotificationTypeDefinition[] = [\n // \u2500\u2500\u2500 Tracking Job POI Port Events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n type: 'shipment_tracking.tracking_job.poi.port_arrival',\n module: 'shipment_tracking',\n titleKey: 'shipment_tracking.notifications.tracking_job.poi.port_arrival.title',\n bodyKey: 'shipment_tracking.notifications.tracking_job.poi.port_arrival.body',\n icon: 'anchor',\n severity: 'success',\n actions: [\n {\n id: 'view',\n labelKey: 'common.view',\n variant: 'outline',\n href: '/backend/shipment-tracking?shipment={sourceEntityId}',\n icon: 'external-link',\n },\n ],\n linkHref: '/backend/shipment-tracking?shipment={sourceEntityId}',\n expiresAfterHours: 168, // 7 days\n },\n {\n type: 'shipment_tracking.tracking_job.poi.port_proximity_arrival',\n module: 'shipment_tracking',\n titleKey: 'shipment_tracking.notifications.tracking_job.poi.port_proximity_arrival.title',\n bodyKey: 'shipment_tracking.notifications.tracking_job.poi.port_proximity_arrival.body',\n icon: 'navigation',\n severity: 'info',\n actions: [\n {\n id: 'view',\n labelKey: 'common.view',\n variant: 'outline',\n href: '/backend/shipment-tracking?shipment={sourceEntityId}',\n icon: 'external-link',\n },\n ],\n linkHref: '/backend/shipment-tracking?shipment={sourceEntityId}',\n expiresAfterHours: 168,\n },\n {\n type: 'shipment_tracking.tracking_job.poi.port_departure',\n module: 'shipment_tracking',\n titleKey: 'shipment_tracking.notifications.tracking_job.poi.port_departure.title',\n bodyKey: 'shipment_tracking.notifications.tracking_job.poi.port_departure.body',\n icon: 'ship',\n severity: 'info',\n actions: [\n {\n id: 'view',\n labelKey: 'common.view',\n variant: 'outline',\n href: '/backend/shipment-tracking?shipment={sourceEntityId}',\n icon: 'external-link',\n },\n ],\n linkHref: '/backend/shipment-tracking?shipment={sourceEntityId}',\n expiresAfterHours: 168,\n },\n\n // \u2500\u2500\u2500 Tracking Job POI Terminal Events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n type: 'shipment_tracking.tracking_job.poi.terminal_arrival',\n module: 'shipment_tracking',\n titleKey: 'shipment_tracking.notifications.tracking_job.poi.terminal_arrival.title',\n bodyKey: 'shipment_tracking.notifications.tracking_job.poi.terminal_arrival.body',\n icon: 'container',\n severity: 'success',\n actions: [\n {\n id: 'view',\n labelKey: 'common.view',\n variant: 'outline',\n href: '/backend/shipment-tracking?shipment={sourceEntityId}',\n icon: 'external-link',\n },\n ],\n linkHref: '/backend/shipment-tracking?shipment={sourceEntityId}',\n expiresAfterHours: 168,\n },\n {\n type: 'shipment_tracking.tracking_job.poi.terminal_proximity_arrival',\n module: 'shipment_tracking',\n titleKey: 'shipment_tracking.notifications.tracking_job.poi.terminal_proximity_arrival.title',\n bodyKey: 'shipment_tracking.notifications.tracking_job.poi.terminal_proximity_arrival.body',\n icon: 'navigation',\n severity: 'info',\n actions: [\n {\n id: 'view',\n labelKey: 'common.view',\n variant: 'outline',\n href: '/backend/shipment-tracking?shipment={sourceEntityId}',\n icon: 'external-link',\n },\n ],\n linkHref: '/backend/shipment-tracking?shipment={sourceEntityId}',\n expiresAfterHours: 168,\n },\n {\n type: 'shipment_tracking.tracking_job.poi.terminal_departure',\n module: 'shipment_tracking',\n titleKey: 'shipment_tracking.notifications.tracking_job.poi.terminal_departure.title',\n bodyKey: 'shipment_tracking.notifications.tracking_job.poi.terminal_departure.body',\n icon: 'ship',\n severity: 'info',\n actions: [\n {\n id: 'view',\n labelKey: 'common.view',\n variant: 'outline',\n href: '/backend/shipment-tracking?shipment={sourceEntityId}',\n icon: 'external-link',\n },\n ],\n linkHref: '/backend/shipment-tracking?shipment={sourceEntityId}',\n expiresAfterHours: 168,\n },\n\n // \u2500\u2500\u2500 Tracking Job POI Waypoint Events \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n {\n type: 'shipment_tracking.tracking_job.poi.waypoint_reached',\n module: 'shipment_tracking',\n titleKey: 'shipment_tracking.notifications.tracking_job.poi.waypoint_reached.title',\n bodyKey: 'shipment_tracking.notifications.tracking_job.poi.waypoint_reached.body',\n icon: 'map-pin',\n severity: 'info',\n actions: [\n {\n id: 'view',\n labelKey: 'common.view',\n variant: 'outline',\n href: '/backend/shipment-tracking?shipment={sourceEntityId}',\n icon: 'external-link',\n },\n ],\n linkHref: '/backend/shipment-tracking?shipment={sourceEntityId}',\n expiresAfterHours: 168,\n },\n]\n\nexport default notificationTypes\n"],
5
+ "mappings": "AASO,MAAM,oBAAkD;AAAA;AAAA,EAE7D;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,UAAU;AAAA,IACV,mBAAmB;AAAA;AAAA,EACrB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,UAAU;AAAA,IACV,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,UAAU;AAAA,IACV,mBAAmB;AAAA,EACrB;AAAA;AAAA,EAGA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,UAAU;AAAA,IACV,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,UAAU;AAAA,IACV,mBAAmB;AAAA,EACrB;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,UAAU;AAAA,IACV,mBAAmB;AAAA,EACrB;AAAA;AAAA,EAGA;AAAA,IACE,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,UAAU;AAAA,QACV,SAAS;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,UAAU;AAAA,IACV,mBAAmB;AAAA,EACrB;AACF;AAEA,IAAO,wBAAQ;",
6
+ "names": []
7
+ }
@@ -0,0 +1,24 @@
1
+ class CarrierRegistryService {
2
+ constructor() {
3
+ this.adapters = /* @__PURE__ */ new Map();
4
+ }
5
+ register(adapter) {
6
+ this.adapters.set(adapter.carrierCode.toLowerCase(), adapter);
7
+ }
8
+ get(carrierCode) {
9
+ return this.adapters.get(carrierCode.toLowerCase());
10
+ }
11
+ list() {
12
+ return Array.from(this.adapters.values());
13
+ }
14
+ has(carrierCode) {
15
+ return this.adapters.has(carrierCode.toLowerCase());
16
+ }
17
+ names() {
18
+ return Array.from(this.adapters.keys());
19
+ }
20
+ }
21
+ export {
22
+ CarrierRegistryService
23
+ };
24
+ //# sourceMappingURL=carrierRegistry.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/modules/shipment_tracking/services/carrierRegistry.ts"],
4
+ "sourcesContent": ["import type { CarrierAdapter } from '../lib/carrier-adapter'\n\n/**\n * Singleton registry for carrier adapters.\n * Modules register concrete adapters at startup via DI.\n */\nexport class CarrierRegistryService {\n private adapters = new Map<string, CarrierAdapter>()\n\n register(adapter: CarrierAdapter): void {\n this.adapters.set(adapter.carrierCode.toLowerCase(), adapter)\n }\n\n get(carrierCode: string): CarrierAdapter | undefined {\n return this.adapters.get(carrierCode.toLowerCase())\n }\n\n list(): CarrierAdapter[] {\n return Array.from(this.adapters.values())\n }\n\n has(carrierCode: string): boolean {\n return this.adapters.has(carrierCode.toLowerCase())\n }\n\n names(): string[] {\n return Array.from(this.adapters.keys())\n }\n}\n"],
5
+ "mappings": "AAMO,MAAM,uBAAuB;AAAA,EAA7B;AACL,SAAQ,WAAW,oBAAI,IAA4B;AAAA;AAAA,EAEnD,SAAS,SAA+B;AACtC,SAAK,SAAS,IAAI,QAAQ,YAAY,YAAY,GAAG,OAAO;AAAA,EAC9D;AAAA,EAEA,IAAI,aAAiD;AACnD,WAAO,KAAK,SAAS,IAAI,YAAY,YAAY,CAAC;AAAA,EACpD;AAAA,EAEA,OAAyB;AACvB,WAAO,MAAM,KAAK,KAAK,SAAS,OAAO,CAAC;AAAA,EAC1C;AAAA,EAEA,IAAI,aAA8B;AAChC,WAAO,KAAK,SAAS,IAAI,YAAY,YAAY,CAAC;AAAA,EACpD;AAAA,EAEA,QAAkB;AAChB,WAAO,MAAM,KAAK,KAAK,SAAS,KAAK,CAAC;AAAA,EACxC;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,397 @@
1
+ import { connect, JSONCodec, AckPolicy, DeliverPolicy, ReplayPolicy } from "nats";
2
+ import { loadPoiNatsConfig, validatePoiNatsConfig, isPoiNatsConfigured } from "../lib/poi-nats-config.js";
3
+ import { getJobPoiEventId } from "../lib/poi-types.js";
4
+ import { mapToOpenMercatoEventId } from "../lib/poi-event-processor.js";
5
+ import {
6
+ processPoiEvent,
7
+ isEventAlreadyProcessed,
8
+ createTrackingEventFromPoi
9
+ } from "../lib/poi-event-processor.js";
10
+ import { Shipment } from "../data/entities.js";
11
+ import { trackingLogger } from "../lib/logger.js";
12
+ const LOG_COMPONENT = "poi-nats";
13
+ class PoiNatsService {
14
+ constructor(deps) {
15
+ this.connection = null;
16
+ this.jetstream = null;
17
+ this.consumer = null;
18
+ this.consumerMessages = null;
19
+ this.status = "disconnected";
20
+ this.stats = {
21
+ status: "disconnected",
22
+ messagesReceived: 0,
23
+ messagesProcessed: 0,
24
+ eventsCreated: 0,
25
+ errors: 0,
26
+ lastMessageAt: null,
27
+ connectedAt: null
28
+ };
29
+ /**
30
+ * Track per-job events already emitted in this batch to avoid duplicates.
31
+ * Key format: `${trackingJobId}:${eventType}:${sourceEventId}`
32
+ */
33
+ this.emittedJobEvents = /* @__PURE__ */ new Set();
34
+ this.deps = deps;
35
+ this.config = loadPoiNatsConfig();
36
+ }
37
+ /**
38
+ * Get current service statistics.
39
+ */
40
+ getStats() {
41
+ return { ...this.stats, status: this.status };
42
+ }
43
+ /**
44
+ * Check if the service is connected.
45
+ */
46
+ isConnected() {
47
+ return this.status === "connected";
48
+ }
49
+ /**
50
+ * Check if POI NATS integration is configured.
51
+ */
52
+ isConfigured() {
53
+ return isPoiNatsConfigured();
54
+ }
55
+ /**
56
+ * Start the NATS subscriber.
57
+ */
58
+ async start() {
59
+ if (!isPoiNatsConfigured()) {
60
+ trackingLogger.info("POI_NATS_URL not configured, skipping POI event subscription", {
61
+ component: LOG_COMPONENT
62
+ });
63
+ return;
64
+ }
65
+ if (this.status === "connected" || this.status === "connecting") {
66
+ trackingLogger.warn("Service is already started or connecting", {
67
+ component: LOG_COMPONENT,
68
+ status: this.status
69
+ });
70
+ return;
71
+ }
72
+ try {
73
+ validatePoiNatsConfig(this.config);
74
+ this.status = "connecting";
75
+ trackingLogger.info("Connecting to NATS server", {
76
+ component: LOG_COMPONENT,
77
+ serverUrl: this.config.serverUrl
78
+ });
79
+ this.connection = await connect({
80
+ servers: this.config.serverUrl,
81
+ name: this.config.connectionName,
82
+ reconnect: true,
83
+ maxReconnectAttempts: this.config.reconnect.maxAttempts,
84
+ reconnectTimeWait: this.config.reconnect.initialDelayMs,
85
+ reconnectJitter: this.config.reconnect.maxDelayMs - this.config.reconnect.initialDelayMs
86
+ });
87
+ this.status = "connected";
88
+ this.stats.connectedAt = /* @__PURE__ */ new Date();
89
+ trackingLogger.info("Connected to NATS server", { component: LOG_COMPONENT });
90
+ this.setupConnectionHandlers();
91
+ await this.subscribe();
92
+ trackingLogger.info("Subscribed to POI subject", {
93
+ component: LOG_COMPONENT,
94
+ subject: this.config.subject
95
+ });
96
+ } catch (error) {
97
+ this.status = "disconnected";
98
+ trackingLogger.error("Failed to connect to NATS", {
99
+ component: LOG_COMPONENT,
100
+ error: error instanceof Error ? error.message : String(error),
101
+ stack: error instanceof Error ? error.stack : void 0
102
+ });
103
+ throw error;
104
+ }
105
+ }
106
+ /**
107
+ * Stop the NATS subscriber gracefully.
108
+ */
109
+ async stop() {
110
+ if (!this.connection) {
111
+ return;
112
+ }
113
+ this.status = "draining";
114
+ trackingLogger.info("Draining NATS connection", { component: LOG_COMPONENT });
115
+ try {
116
+ if (this.consumerMessages) {
117
+ this.consumerMessages.stop();
118
+ this.consumerMessages = null;
119
+ }
120
+ this.consumer = null;
121
+ this.jetstream = null;
122
+ await this.connection.drain();
123
+ this.connection = null;
124
+ this.status = "closed";
125
+ trackingLogger.info("NATS connection closed", { component: LOG_COMPONENT });
126
+ } catch (error) {
127
+ trackingLogger.error("Error during NATS shutdown", {
128
+ component: LOG_COMPONENT,
129
+ error: error instanceof Error ? error.message : String(error),
130
+ stack: error instanceof Error ? error.stack : void 0
131
+ });
132
+ this.status = "disconnected";
133
+ throw error;
134
+ }
135
+ }
136
+ /**
137
+ * Subscribe to POI proximity events via JetStream.
138
+ *
139
+ * Auto-creates the durable consumer if it doesn't exist.
140
+ * Each instance gets a unique consumer name (based on JWT_SECRET hash)
141
+ * so multiple self-hosted installations can each receive all messages.
142
+ */
143
+ async subscribe() {
144
+ if (!this.connection) {
145
+ throw new Error("Not connected to NATS");
146
+ }
147
+ const jsm = await this.connection.jetstreamManager();
148
+ await this.ensureConsumer(jsm);
149
+ this.jetstream = this.connection.jetstream();
150
+ trackingLogger.debug("Binding to JetStream consumer", {
151
+ component: LOG_COMPONENT,
152
+ consumerName: this.config.consumerName,
153
+ streamName: this.config.streamName
154
+ });
155
+ this.consumer = await this.jetstream.consumers.get(
156
+ this.config.streamName,
157
+ this.config.consumerName
158
+ );
159
+ trackingLogger.debug("Consumer bound, starting to consume messages", {
160
+ component: LOG_COMPONENT,
161
+ consumerName: this.config.consumerName
162
+ });
163
+ this.consumerMessages = await this.consumer.consume();
164
+ this.processMessages();
165
+ }
166
+ /**
167
+ * Ensure the durable consumer exists on the stream.
168
+ * Creates it if it doesn't exist with the appropriate configuration.
169
+ */
170
+ async ensureConsumer(jsm) {
171
+ const consumerConfig = {
172
+ durable_name: this.config.consumerName,
173
+ ack_policy: AckPolicy.Explicit,
174
+ deliver_policy: DeliverPolicy.All,
175
+ // Replay all messages from stream start
176
+ replay_policy: ReplayPolicy.Instant,
177
+ // Don't throttle replay
178
+ filter_subject: this.config.subject,
179
+ max_deliver: 5
180
+ // Prevent infinite redelivery of poison messages
181
+ };
182
+ try {
183
+ await jsm.consumers.info(this.config.streamName, this.config.consumerName);
184
+ trackingLogger.debug("Consumer exists", {
185
+ component: LOG_COMPONENT,
186
+ consumerName: this.config.consumerName
187
+ });
188
+ } catch (error) {
189
+ const errorCode = error?.code;
190
+ if (errorCode === "404" || error?.api_error?.err_code === 10014) {
191
+ trackingLogger.info("Creating JetStream consumer", {
192
+ component: LOG_COMPONENT,
193
+ consumerName: this.config.consumerName,
194
+ streamName: this.config.streamName
195
+ });
196
+ await jsm.consumers.add(this.config.streamName, consumerConfig);
197
+ trackingLogger.info("JetStream consumer created", {
198
+ component: LOG_COMPONENT,
199
+ consumerName: this.config.consumerName
200
+ });
201
+ } else {
202
+ throw error;
203
+ }
204
+ }
205
+ }
206
+ /**
207
+ * Process incoming messages from the JetStream consumer.
208
+ */
209
+ async processMessages() {
210
+ if (!this.consumerMessages) {
211
+ return;
212
+ }
213
+ const jsonCodec = JSONCodec();
214
+ for await (const msg of this.consumerMessages) {
215
+ this.stats.messagesReceived++;
216
+ this.stats.lastMessageAt = /* @__PURE__ */ new Date();
217
+ try {
218
+ const event = jsonCodec.decode(msg.data);
219
+ if (!event || !event.type || !event.mmsi) {
220
+ trackingLogger.debug("Skipping invalid message (missing type or mmsi)", {
221
+ component: LOG_COMPONENT
222
+ });
223
+ msg.ack();
224
+ continue;
225
+ }
226
+ await this.handlePoiEvent(event);
227
+ msg.ack();
228
+ this.stats.messagesProcessed++;
229
+ } catch (error) {
230
+ this.stats.errors++;
231
+ trackingLogger.error("Error processing NATS message", {
232
+ component: LOG_COMPONENT,
233
+ error: error instanceof Error ? error.message : String(error),
234
+ stack: error instanceof Error ? error.stack : void 0
235
+ });
236
+ msg.nak();
237
+ }
238
+ }
239
+ }
240
+ /**
241
+ * Handle a single POI proximity event.
242
+ */
243
+ async handlePoiEvent(event) {
244
+ this.emittedJobEvents.clear();
245
+ trackingLogger.debug("Received POI event", {
246
+ component: LOG_COMPONENT,
247
+ eventType: event.type,
248
+ vesselName: event.shipName,
249
+ mmsi: event.mmsi
250
+ });
251
+ const em = this.deps.em().fork({ clear: true });
252
+ try {
253
+ const processed = await processPoiEvent(em, event);
254
+ if (!processed) {
255
+ return;
256
+ }
257
+ trackingLogger.info("Matched shipments for POI event", {
258
+ component: LOG_COMPONENT,
259
+ mmsi: event.mmsi,
260
+ eventType: event.type,
261
+ matchedShipmentCount: processed.shipmentIds.length
262
+ });
263
+ const affectedJobIds = /* @__PURE__ */ new Set();
264
+ for (const shipmentId of processed.shipmentIds) {
265
+ const shipment = await em.findOne(
266
+ Shipment,
267
+ { id: shipmentId },
268
+ { populate: ["trackingJob"] }
269
+ );
270
+ if (!shipment?.trackingJob) {
271
+ continue;
272
+ }
273
+ const alreadyProcessed = await isEventAlreadyProcessed(
274
+ em,
275
+ shipment.trackingJob.id,
276
+ processed.sourceEventId
277
+ );
278
+ if (alreadyProcessed) {
279
+ trackingLogger.debug("Event already processed", {
280
+ component: LOG_COMPONENT,
281
+ sourceEventId: processed.sourceEventId,
282
+ trackingJobId: shipment.trackingJob.id
283
+ });
284
+ continue;
285
+ }
286
+ const trackingEvent = createTrackingEventFromPoi(processed, shipment.trackingJob);
287
+ em.persist(trackingEvent);
288
+ this.stats.eventsCreated++;
289
+ affectedJobIds.add(shipment.trackingJob.id);
290
+ const shipmentEventId = mapToOpenMercatoEventId(event.type);
291
+ await this.deps.eventBus.emit(shipmentEventId, {
292
+ shipmentId: shipment.id,
293
+ trackingEventId: trackingEvent.id,
294
+ organizationId: shipment.organizationId,
295
+ tenantId: shipment.tenantId,
296
+ vesselName: event.shipName,
297
+ vesselMmsi: event.mmsi,
298
+ vesselImo: processed.vesselImo,
299
+ eventType: event.type,
300
+ poiCode: processed.poiCode,
301
+ latitude: event.lat,
302
+ longitude: event.lng,
303
+ eventDateTime: processed.eventDateTime.toISOString(),
304
+ distanceToPoiMeters: event.distanceToPoiMeters
305
+ });
306
+ const trackingJobId = shipment.trackingJob.id;
307
+ const jobEventKey = `${trackingJobId}:${event.type}:${processed.sourceEventId}`;
308
+ if (!this.emittedJobEvents.has(jobEventKey)) {
309
+ this.emittedJobEvents.add(jobEventKey);
310
+ const jobEventId = getJobPoiEventId(event.type);
311
+ await this.deps.eventBus.emit(jobEventId, {
312
+ trackingJobId,
313
+ shipmentId: shipment.id,
314
+ trackingEventId: trackingEvent.id,
315
+ organizationId: shipment.organizationId,
316
+ tenantId: shipment.tenantId,
317
+ vesselName: event.shipName,
318
+ vesselMmsi: event.mmsi,
319
+ vesselImo: processed.vesselImo,
320
+ eventType: event.type,
321
+ poiCode: processed.poiCode,
322
+ latitude: event.lat,
323
+ longitude: event.lng,
324
+ eventDateTime: processed.eventDateTime.toISOString(),
325
+ distanceToPoiMeters: event.distanceToPoiMeters,
326
+ // Include shipment reference info for notification body
327
+ containerNumber: shipment.containerNumber,
328
+ bookingNumber: shipment.bookingNumber,
329
+ bolNumber: shipment.bolNumber
330
+ });
331
+ trackingLogger.debug("Emitted per-job POI event", {
332
+ component: LOG_COMPONENT,
333
+ trackingJobId,
334
+ eventType: event.type
335
+ });
336
+ }
337
+ trackingLogger.info("Created tracking event from POI", {
338
+ component: LOG_COMPONENT,
339
+ shipmentId,
340
+ eventType: event.type,
341
+ trackingEventId: trackingEvent.id
342
+ });
343
+ }
344
+ await em.flush();
345
+ for (const trackingJobId of affectedJobIds) {
346
+ await this.deps.trackingService.refreshShipmentsFromEvents(em, trackingJobId);
347
+ }
348
+ } catch (error) {
349
+ trackingLogger.error("Error handling POI event", {
350
+ component: LOG_COMPONENT,
351
+ eventType: event.type,
352
+ mmsi: event.mmsi,
353
+ error: error instanceof Error ? error.message : String(error),
354
+ stack: error instanceof Error ? error.stack : void 0
355
+ });
356
+ throw error;
357
+ }
358
+ }
359
+ /**
360
+ * Set up connection event handlers.
361
+ */
362
+ setupConnectionHandlers() {
363
+ if (!this.connection) {
364
+ return;
365
+ }
366
+ ;
367
+ (async () => {
368
+ if (!this.connection) return;
369
+ for await (const status of this.connection.status()) {
370
+ switch (status.type) {
371
+ case "disconnect":
372
+ trackingLogger.warn("Disconnected from NATS server", { component: LOG_COMPONENT });
373
+ this.status = "disconnected";
374
+ break;
375
+ case "reconnect":
376
+ trackingLogger.info("Reconnected to NATS server", { component: LOG_COMPONENT });
377
+ this.status = "connected";
378
+ break;
379
+ case "reconnecting":
380
+ trackingLogger.info("Reconnecting to NATS server", { component: LOG_COMPONENT });
381
+ this.status = "connecting";
382
+ break;
383
+ case "error":
384
+ trackingLogger.error("NATS connection error", {
385
+ component: LOG_COMPONENT,
386
+ data: status.data
387
+ });
388
+ break;
389
+ }
390
+ }
391
+ })();
392
+ }
393
+ }
394
+ export {
395
+ PoiNatsService
396
+ };
397
+ //# sourceMappingURL=poiNatsService.js.map