@adtrackify/at-service-common 4.0.31 → 4.0.33

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 (843) hide show
  1. package/dist/cjs/__tests__/clients/acuity-client.spec.d.ts +1 -1
  2. package/dist/cjs/__tests__/clients/acuity-client.spec.js +43 -43
  3. package/dist/cjs/__tests__/clients/cross-platform-compression.spec.d.ts +1 -1
  4. package/dist/cjs/__tests__/clients/cross-platform-compression.spec.js +354 -354
  5. package/dist/cjs/__tests__/clients/dynamodb-client.spec.d.ts +1 -1
  6. package/dist/cjs/__tests__/clients/dynamodb-client.spec.js +194 -194
  7. package/dist/cjs/__tests__/clients/event-collector-client.spec.d.ts +1 -1
  8. package/dist/cjs/__tests__/clients/event-collector-client.spec.js +227 -227
  9. package/dist/cjs/__tests__/clients/open-exchange-rates-client.spec.d.ts +1 -1
  10. package/dist/cjs/__tests__/clients/open-exchange-rates-client.spec.js +55 -55
  11. package/dist/cjs/__tests__/clients/sqs-bundled-client.spec.d.ts +1 -1
  12. package/dist/cjs/__tests__/clients/sqs-bundled-client.spec.js +931 -931
  13. package/dist/cjs/__tests__/clients/sqs-bundling-contracts.spec.d.ts +1 -1
  14. package/dist/cjs/__tests__/clients/sqs-bundling-contracts.spec.js +563 -563
  15. package/dist/cjs/__tests__/clients/sqs-client.spec.d.ts +1 -1
  16. package/dist/cjs/__tests__/clients/sqs-client.spec.js +191 -191
  17. package/dist/cjs/__tests__/clients/sqs-unbundle.spec.d.ts +1 -1
  18. package/dist/cjs/__tests__/clients/sqs-unbundle.spec.js +1357 -1357
  19. package/dist/cjs/__tests__/db/contact-enrichments-db-service.spec.d.ts +1 -1
  20. package/dist/cjs/__tests__/db/contact-enrichments-db-service.spec.js +68 -68
  21. package/dist/cjs/__tests__/db/destinations-db-service.spec.d.ts +1 -1
  22. package/dist/cjs/__tests__/db/destinations-db-service.spec.js +125 -125
  23. package/dist/cjs/__tests__/db/products-db-service.spec.d.ts +1 -1
  24. package/dist/cjs/__tests__/db/products-db-service.spec.js +89 -89
  25. package/dist/cjs/__tests__/db/shared-read-db-services.spec.d.ts +1 -1
  26. package/dist/cjs/__tests__/db/shared-read-db-services.spec.js +89 -89
  27. package/dist/cjs/__tests__/db/shopify-app-installs-db-service.spec.d.ts +1 -1
  28. package/dist/cjs/__tests__/db/shopify-app-installs-db-service.spec.js +104 -104
  29. package/dist/cjs/__tests__/db/subscriptions-db-service.spec.d.ts +1 -1
  30. package/dist/cjs/__tests__/db/subscriptions-db-service.spec.js +95 -95
  31. package/dist/cjs/__tests__/db/user-accounts-db-service.spec.d.ts +1 -1
  32. package/dist/cjs/__tests__/db/user-accounts-db-service.spec.js +76 -76
  33. package/dist/cjs/__tests__/helpers/account-users-helper.spec.d.ts +1 -1
  34. package/dist/cjs/__tests__/helpers/account-users-helper.spec.js +220 -220
  35. package/dist/cjs/__tests__/helpers/acuity-helper.spec.d.ts +1 -1
  36. package/dist/cjs/__tests__/helpers/acuity-helper.spec.js +69 -69
  37. package/dist/cjs/__tests__/helpers/api-key-auth-helper.spec.d.ts +1 -1
  38. package/dist/cjs/__tests__/helpers/api-key-auth-helper.spec.js +82 -82
  39. package/dist/cjs/__tests__/helpers/cognito-auth-helper.spec.d.ts +1 -1
  40. package/dist/cjs/__tests__/helpers/cognito-auth-helper.spec.js +46 -46
  41. package/dist/cjs/__tests__/helpers/order-calculation-helper.spec.d.ts +1 -0
  42. package/dist/cjs/__tests__/helpers/order-calculation-helper.spec.js +153 -0
  43. package/dist/cjs/__tests__/helpers/order-calculation-helper.spec.js.map +1 -0
  44. package/dist/cjs/__tests__/helpers/public-api-response-helper.spec.d.ts +1 -1
  45. package/dist/cjs/__tests__/helpers/public-api-response-helper.spec.js +60 -60
  46. package/dist/cjs/__tests__/identity-cache/helpers.spec.d.ts +1 -1
  47. package/dist/cjs/__tests__/identity-cache/helpers.spec.js +592 -592
  48. package/dist/cjs/__tests__/identity-cache/identity-cache-db-service.spec.d.ts +1 -1
  49. package/dist/cjs/__tests__/identity-cache/identity-cache-db-service.spec.js +676 -676
  50. package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.d.ts +1 -1
  51. package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.js +555 -555
  52. package/dist/cjs/__tests__/identity-cache/identity-cache-tier-routing.spec.d.ts +1 -1
  53. package/dist/cjs/__tests__/identity-cache/identity-cache-tier-routing.spec.js +631 -631
  54. package/dist/cjs/__tests__/identity-cache/identity-client.spec.d.ts +1 -1
  55. package/dist/cjs/__tests__/identity-cache/identity-client.spec.js +359 -359
  56. package/dist/cjs/__tests__/identity-cache/identity-gateway-cache-hit.spec.d.ts +1 -1
  57. package/dist/cjs/__tests__/identity-cache/identity-gateway-cache-hit.spec.js +137 -137
  58. package/dist/cjs/__tests__/identity-cache/identity-gateway-cache-miss.spec.d.ts +1 -1
  59. package/dist/cjs/__tests__/identity-cache/identity-gateway-cache-miss.spec.js +152 -152
  60. package/dist/cjs/__tests__/identity-cache/identity-gateway-constructor.spec.d.ts +1 -1
  61. package/dist/cjs/__tests__/identity-cache/identity-gateway-constructor.spec.js +71 -71
  62. package/dist/cjs/__tests__/identity-cache/identity-gateway-edge-cases.spec.d.ts +1 -1
  63. package/dist/cjs/__tests__/identity-cache/identity-gateway-edge-cases.spec.js +88 -88
  64. package/dist/cjs/__tests__/identity-cache/identity-gateway-enqueue-async.spec.d.ts +1 -1
  65. package/dist/cjs/__tests__/identity-cache/identity-gateway-enqueue-async.spec.js +135 -135
  66. package/dist/cjs/__tests__/identity-cache/identity-gateway-stale-cache.spec.d.ts +1 -1
  67. package/dist/cjs/__tests__/identity-cache/identity-gateway-stale-cache.spec.js +223 -223
  68. package/dist/cjs/__tests__/identity-cache/identity-gateway-test-setup.d.ts +28 -28
  69. package/dist/cjs/__tests__/identity-cache/identity-gateway-test-setup.js +89 -89
  70. package/dist/cjs/__tests__/identity-cache/trait-merging-and-staleness.spec.d.ts +1 -1
  71. package/dist/cjs/__tests__/identity-cache/trait-merging-and-staleness.spec.js +1770 -1770
  72. package/dist/cjs/__tests__/identity-cache/volatile-traits-optimization.spec.d.ts +1 -1
  73. package/dist/cjs/__tests__/identity-cache/volatile-traits-optimization.spec.js +818 -818
  74. package/dist/cjs/__tests__/integration/sqs-bundling-roundtrip.spec.d.ts +1 -1
  75. package/dist/cjs/__tests__/integration/sqs-bundling-roundtrip.spec.js +584 -584
  76. package/dist/cjs/__tests__/libs/compress-decompress.spec.d.ts +1 -1
  77. package/dist/cjs/__tests__/libs/compress-decompress.spec.js +16 -16
  78. package/dist/cjs/__tests__/libs/contacts.spec.d.ts +1 -1
  79. package/dist/cjs/__tests__/libs/contacts.spec.js +294 -294
  80. package/dist/cjs/__tests__/libs/currency.spec.d.ts +1 -1
  81. package/dist/cjs/__tests__/libs/currency.spec.js +220 -220
  82. package/dist/cjs/__tests__/libs/dates.spec.d.ts +1 -1
  83. package/dist/cjs/__tests__/libs/dates.spec.js +130 -130
  84. package/dist/cjs/__tests__/libs/domain.spec.d.ts +1 -1
  85. package/dist/cjs/__tests__/libs/domain.spec.js +107 -107
  86. package/dist/cjs/__tests__/libs/numbers.spec.d.ts +1 -1
  87. package/dist/cjs/__tests__/libs/numbers.spec.js +261 -261
  88. package/dist/cjs/__tests__/s3-client/s3-client.spec.d.ts +1 -1
  89. package/dist/cjs/__tests__/s3-client/s3-client.spec.js +33 -33
  90. package/dist/cjs/__tests__/services/acuity-api-service.spec.d.ts +1 -1
  91. package/dist/cjs/__tests__/services/acuity-api-service.spec.js +71 -71
  92. package/dist/cjs/__tests__/services/cost/cost-calculation-types.spec.d.ts +1 -1
  93. package/dist/cjs/__tests__/services/cost/cost-calculation-types.spec.js +23 -23
  94. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.d.ts +1 -1
  95. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.js +3349 -3319
  96. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.js.map +1 -1
  97. package/dist/cjs/__tests__/services/cost/cost-currency-service.spec.d.ts +1 -1
  98. package/dist/cjs/__tests__/services/cost/cost-currency-service.spec.js +114 -114
  99. package/dist/cjs/__tests__/services/cost/cost-filter-service.spec.d.ts +1 -1
  100. package/dist/cjs/__tests__/services/cost/cost-filter-service.spec.js +468 -468
  101. package/dist/cjs/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.d.ts +1 -1
  102. package/dist/cjs/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js +310 -206
  103. package/dist/cjs/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js.map +1 -1
  104. package/dist/cjs/__tests__/services/currency-exchange-rate-lookup-service.spec.d.ts +1 -1
  105. package/dist/cjs/__tests__/services/currency-exchange-rate-lookup-service.spec.js +34 -34
  106. package/dist/cjs/__tests__/services/email-verification/contact-email-verification-service.spec.d.ts +1 -1
  107. package/dist/cjs/__tests__/services/email-verification/contact-email-verification-service.spec.js +93 -93
  108. package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.d.ts +1 -1
  109. package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.js +57 -57
  110. package/dist/cjs/__tests__/services/events/collect-queue-tracking-service.spec.d.ts +1 -1
  111. package/dist/cjs/__tests__/services/events/collect-queue-tracking-service.spec.js +229 -229
  112. package/dist/cjs/__tests__/services/events/tracking-event-sqs-service.spec.d.ts +1 -1
  113. package/dist/cjs/__tests__/services/events/tracking-event-sqs-service.spec.js +191 -191
  114. package/dist/cjs/__tests__/shopify/shopify-graphql-transformer.spec.d.ts +1 -1
  115. package/dist/cjs/__tests__/shopify/shopify-graphql-transformer.spec.js +35 -35
  116. package/dist/cjs/__tests__/unit/libs/api-router/public-api-router.spec.d.ts +1 -1
  117. package/dist/cjs/__tests__/unit/libs/api-router/public-api-router.spec.js +181 -181
  118. package/dist/cjs/__tests__/unit/libs/api-router/route-matcher.spec.d.ts +1 -1
  119. package/dist/cjs/__tests__/unit/libs/api-router/route-matcher.spec.js +69 -69
  120. package/dist/cjs/__tests__/utils/custom-measure-formula-utils.spec.d.ts +1 -1
  121. package/dist/cjs/__tests__/utils/custom-measure-formula-utils.spec.js +146 -146
  122. package/dist/cjs/clients/generic/cognito-client.d.ts +23 -23
  123. package/dist/cjs/clients/generic/cognito-client.js +209 -209
  124. package/dist/cjs/clients/generic/dynamodb-client.d.ts +20 -20
  125. package/dist/cjs/clients/generic/dynamodb-client.js +235 -235
  126. package/dist/cjs/clients/generic/eventbridge-client.d.ts +14 -14
  127. package/dist/cjs/clients/generic/eventbridge-client.js +51 -51
  128. package/dist/cjs/clients/generic/http-client.d.ts +14 -14
  129. package/dist/cjs/clients/generic/http-client.js +61 -61
  130. package/dist/cjs/clients/generic/index.d.ts +13 -13
  131. package/dist/cjs/clients/generic/index.js +29 -29
  132. package/dist/cjs/clients/generic/lambda-invoke-client.d.ts +10 -10
  133. package/dist/cjs/clients/generic/lambda-invoke-client.js +39 -39
  134. package/dist/cjs/clients/generic/location-client.d.ts +8 -8
  135. package/dist/cjs/clients/generic/location-client.js +31 -31
  136. package/dist/cjs/clients/generic/redis-client.d.ts +33 -33
  137. package/dist/cjs/clients/generic/redis-client.js +191 -191
  138. package/dist/cjs/clients/generic/s3-client.d.ts +23 -23
  139. package/dist/cjs/clients/generic/s3-client.js +216 -216
  140. package/dist/cjs/clients/generic/singlestore-db-client.d.ts +14 -14
  141. package/dist/cjs/clients/generic/singlestore-db-client.js +67 -67
  142. package/dist/cjs/clients/generic/sqs-bundled-client.d.ts +15 -15
  143. package/dist/cjs/clients/generic/sqs-bundled-client.js +311 -311
  144. package/dist/cjs/clients/generic/sqs-bundled-client.types.d.ts +53 -53
  145. package/dist/cjs/clients/generic/sqs-bundled-client.types.js +17 -17
  146. package/dist/cjs/clients/generic/sqs-client.d.ts +53 -53
  147. package/dist/cjs/clients/generic/sqs-client.js +285 -285
  148. package/dist/cjs/clients/generic/sqs-unbundle.d.ts +32 -32
  149. package/dist/cjs/clients/generic/sqs-unbundle.js +144 -144
  150. package/dist/cjs/clients/index.d.ts +3 -3
  151. package/dist/cjs/clients/index.js +19 -19
  152. package/dist/cjs/clients/internal-api/accounts-client.d.ts +91 -91
  153. package/dist/cjs/clients/internal-api/accounts-client.js +129 -129
  154. package/dist/cjs/clients/internal-api/cache-lambda-client.d.ts +26 -26
  155. package/dist/cjs/clients/internal-api/cache-lambda-client.js +89 -89
  156. package/dist/cjs/clients/internal-api/db-management-client.d.ts +18 -18
  157. package/dist/cjs/clients/internal-api/db-management-client.js +36 -36
  158. package/dist/cjs/clients/internal-api/destinations-client.d.ts +34 -34
  159. package/dist/cjs/clients/internal-api/destinations-client.js +79 -79
  160. package/dist/cjs/clients/internal-api/event-collector-client.d.ts +122 -122
  161. package/dist/cjs/clients/internal-api/event-collector-client.js +78 -78
  162. package/dist/cjs/clients/internal-api/identity-client.d.ts +41 -41
  163. package/dist/cjs/clients/internal-api/identity-client.js +137 -137
  164. package/dist/cjs/clients/internal-api/index.d.ts +9 -9
  165. package/dist/cjs/clients/internal-api/index.js +25 -25
  166. package/dist/cjs/clients/internal-api/shopify-app-install-client.d.ts +37 -37
  167. package/dist/cjs/clients/internal-api/shopify-app-install-client.js +81 -81
  168. package/dist/cjs/clients/internal-api/subscriptions-client.d.ts +26 -26
  169. package/dist/cjs/clients/internal-api/subscriptions-client.js +77 -77
  170. package/dist/cjs/clients/internal-api/users-auth-client.d.ts +35 -35
  171. package/dist/cjs/clients/internal-api/users-auth-client.js +110 -110
  172. package/dist/cjs/clients/third-party/acuity-client.d.ts +10 -10
  173. package/dist/cjs/clients/third-party/acuity-client.js +40 -40
  174. package/dist/cjs/clients/third-party/emailable-client.d.ts +7 -7
  175. package/dist/cjs/clients/third-party/emailable-client.js +25 -25
  176. package/dist/cjs/clients/third-party/exchange-rate-api-client.d.ts +17 -17
  177. package/dist/cjs/clients/third-party/exchange-rate-api-client.js +19 -19
  178. package/dist/cjs/clients/third-party/index.d.ts +6 -6
  179. package/dist/cjs/clients/third-party/index.js +22 -22
  180. package/dist/cjs/clients/third-party/loops-client.d.ts +10 -10
  181. package/dist/cjs/clients/third-party/loops-client.js +30 -30
  182. package/dist/cjs/clients/third-party/open-exchange-rates-client.d.ts +8 -8
  183. package/dist/cjs/clients/third-party/open-exchange-rates-client.js +27 -27
  184. package/dist/cjs/clients/third-party/shopify/graphql-analytics-queries.d.ts +18 -18
  185. package/dist/cjs/clients/third-party/shopify/graphql-analytics-queries.js +22 -22
  186. package/dist/cjs/clients/third-party/shopify/graphql-order-queries.d.ts +25 -25
  187. package/dist/cjs/clients/third-party/shopify/graphql-order-queries.js +4 -4
  188. package/dist/cjs/clients/third-party/shopify/graphql-product-queries.d.ts +2 -2
  189. package/dist/cjs/clients/third-party/shopify/graphql-product-queries.js +5 -5
  190. package/dist/cjs/clients/third-party/shopify/shopify-graphql-client.d.ts +42 -42
  191. package/dist/cjs/clients/third-party/shopify/shopify-graphql-client.js +352 -352
  192. package/dist/cjs/clients/third-party/shopify-client.d.ts +29 -29
  193. package/dist/cjs/clients/third-party/shopify-client.js +146 -146
  194. package/dist/cjs/constants/index.d.ts +1 -1
  195. package/dist/cjs/constants/index.js +17 -17
  196. package/dist/cjs/constants/sqs.d.ts +20 -20
  197. package/dist/cjs/constants/sqs.js +26 -26
  198. package/dist/cjs/helpers/account-users-helper.d.ts +2 -2
  199. package/dist/cjs/helpers/account-users-helper.js +22 -22
  200. package/dist/cjs/helpers/acuity-helper.d.ts +4 -4
  201. package/dist/cjs/helpers/acuity-helper.js +56 -56
  202. package/dist/cjs/helpers/api-key-auth-helper.d.ts +9 -9
  203. package/dist/cjs/helpers/api-key-auth-helper.js +40 -40
  204. package/dist/cjs/helpers/api-key-authorizer-helper.d.ts +36 -36
  205. package/dist/cjs/helpers/api-key-authorizer-helper.js +87 -87
  206. package/dist/cjs/helpers/cognito-auth-helper.d.ts +5 -5
  207. package/dist/cjs/helpers/cognito-auth-helper.js +14 -14
  208. package/dist/cjs/helpers/index.d.ts +12 -11
  209. package/dist/cjs/helpers/index.js +28 -27
  210. package/dist/cjs/helpers/index.js.map +1 -1
  211. package/dist/cjs/helpers/input-validation-helper.d.ts +3 -3
  212. package/dist/cjs/helpers/input-validation-helper.js +22 -22
  213. package/dist/cjs/helpers/logging-helper.d.ts +16 -16
  214. package/dist/cjs/helpers/logging-helper.js +84 -84
  215. package/dist/cjs/helpers/order-calculation-helper.d.ts +13 -0
  216. package/dist/cjs/helpers/order-calculation-helper.js +118 -0
  217. package/dist/cjs/helpers/order-calculation-helper.js.map +1 -0
  218. package/dist/cjs/helpers/public-api-response-helper.d.ts +21 -21
  219. package/dist/cjs/helpers/public-api-response-helper.js +45 -45
  220. package/dist/cjs/helpers/response-helper.d.ts +18 -18
  221. package/dist/cjs/helpers/response-helper.js +43 -43
  222. package/dist/cjs/helpers/shopify-helper.d.ts +9 -9
  223. package/dist/cjs/helpers/shopify-helper.js +26 -26
  224. package/dist/cjs/helpers/sqs-utils.d.ts +6 -6
  225. package/dist/cjs/helpers/sqs-utils.js +14 -14
  226. package/dist/cjs/index.d.ts +7 -7
  227. package/dist/cjs/index.js +23 -23
  228. package/dist/cjs/libs/api-router/index.d.ts +2 -2
  229. package/dist/cjs/libs/api-router/index.js +18 -18
  230. package/dist/cjs/libs/api-router/public-api-router.d.ts +3 -3
  231. package/dist/cjs/libs/api-router/public-api-router.js +36 -36
  232. package/dist/cjs/libs/api-router/route-matcher.d.ts +21 -21
  233. package/dist/cjs/libs/api-router/route-matcher.js +36 -36
  234. package/dist/cjs/libs/click-id-parser.d.ts +23 -23
  235. package/dist/cjs/libs/click-id-parser.js +49 -49
  236. package/dist/cjs/libs/compression.d.ts +2 -2
  237. package/dist/cjs/libs/compression.js +33 -33
  238. package/dist/cjs/libs/contacts.d.ts +7 -7
  239. package/dist/cjs/libs/contacts.js +152 -152
  240. package/dist/cjs/libs/cookie.d.ts +17 -17
  241. package/dist/cjs/libs/cookie.js +76 -76
  242. package/dist/cjs/libs/crypto.d.ts +4 -4
  243. package/dist/cjs/libs/crypto.js +25 -25
  244. package/dist/cjs/libs/csv.d.ts +2 -2
  245. package/dist/cjs/libs/csv.js +35 -35
  246. package/dist/cjs/libs/currency.d.ts +1 -1
  247. package/dist/cjs/libs/currency.js +29 -29
  248. package/dist/cjs/libs/dates.d.ts +12 -12
  249. package/dist/cjs/libs/dates.js +96 -96
  250. package/dist/cjs/libs/domain.d.ts +2 -2
  251. package/dist/cjs/libs/domain.js +38 -38
  252. package/dist/cjs/libs/emails.d.ts +8 -8
  253. package/dist/cjs/libs/emails.js +154 -154
  254. package/dist/cjs/libs/http-error.d.ts +21 -21
  255. package/dist/cjs/libs/http-error.js +63 -63
  256. package/dist/cjs/libs/http-status-codes.d.ts +58 -58
  257. package/dist/cjs/libs/http-status-codes.js +62 -62
  258. package/dist/cjs/libs/index.d.ts +19 -19
  259. package/dist/cjs/libs/index.js +35 -35
  260. package/dist/cjs/libs/numbers.d.ts +1 -1
  261. package/dist/cjs/libs/numbers.js +15 -15
  262. package/dist/cjs/libs/referrer-parser/index.d.ts +2 -2
  263. package/dist/cjs/libs/referrer-parser/index.js +18 -18
  264. package/dist/cjs/libs/referrer-parser/referrer-data.d.ts +9 -9
  265. package/dist/cjs/libs/referrer-parser/referrer-data.js +3307 -3307
  266. package/dist/cjs/libs/referrer-parser/referrer-parser-util.d.ts +20 -20
  267. package/dist/cjs/libs/referrer-parser/referrer-parser-util.js +131 -131
  268. package/dist/cjs/libs/strings.d.ts +3 -3
  269. package/dist/cjs/libs/strings.js +46 -46
  270. package/dist/cjs/libs/traits.d.ts +6 -6
  271. package/dist/cjs/libs/traits.js +65 -65
  272. package/dist/cjs/libs/url.d.ts +1 -1
  273. package/dist/cjs/libs/url.js +13 -13
  274. package/dist/cjs/services/acuity-api-service.d.ts +9 -9
  275. package/dist/cjs/services/acuity-api-service.js +73 -73
  276. package/dist/cjs/services/cache/generic-cached-object.d.ts +5 -5
  277. package/dist/cjs/services/cache/generic-cached-object.js +2 -2
  278. package/dist/cjs/services/cache/index.d.ts +1 -1
  279. package/dist/cjs/services/cache/index.js +17 -17
  280. package/dist/cjs/services/cache/product-cache-service.d.ts +21 -21
  281. package/dist/cjs/services/cache/product-cache-service.js +76 -76
  282. package/dist/cjs/services/cost/cost-calculation-types.d.ts +69 -69
  283. package/dist/cjs/services/cost/cost-calculation-types.js +19 -19
  284. package/dist/cjs/services/cost/cost-calculator-service.d.ts +24 -24
  285. package/dist/cjs/services/cost/cost-calculator-service.js +461 -456
  286. package/dist/cjs/services/cost/cost-calculator-service.js.map +1 -1
  287. package/dist/cjs/services/cost/cost-currency-service.d.ts +6 -6
  288. package/dist/cjs/services/cost/cost-currency-service.js +87 -87
  289. package/dist/cjs/services/cost/cost-filter-service.d.ts +10 -10
  290. package/dist/cjs/services/cost/cost-filter-service.js +121 -121
  291. package/dist/cjs/services/cost/index.d.ts +5 -5
  292. package/dist/cjs/services/cost/index.js +21 -21
  293. package/dist/cjs/services/cost/order-cost/index.d.ts +2 -2
  294. package/dist/cjs/services/cost/order-cost/index.js +18 -18
  295. package/dist/cjs/services/cost/order-cost/order-cost-resolution-service.d.ts +21 -23
  296. package/dist/cjs/services/cost/order-cost/order-cost-resolution-service.js +288 -361
  297. package/dist/cjs/services/cost/order-cost/order-cost-resolution-service.js.map +1 -1
  298. package/dist/cjs/services/cost/order-cost/order-cost-resolution-types.d.ts +31 -37
  299. package/dist/cjs/services/cost/order-cost/order-cost-resolution-types.js +2 -2
  300. package/dist/cjs/services/currency-exchange-rate-lookup-service.d.ts +12 -12
  301. package/dist/cjs/services/currency-exchange-rate-lookup-service.js +94 -94
  302. package/dist/cjs/services/db/accounts-db-service.d.ts +9 -9
  303. package/dist/cjs/services/db/accounts-db-service.js +33 -33
  304. package/dist/cjs/services/db/api-keys-db-service.d.ts +10 -10
  305. package/dist/cjs/services/db/api-keys-db-service.js +36 -36
  306. package/dist/cjs/services/db/contact-enrichments-db-service.d.ts +15 -15
  307. package/dist/cjs/services/db/contact-enrichments-db-service.js +94 -94
  308. package/dist/cjs/services/db/currency-exchange-rates-db-service.d.ts +21 -21
  309. package/dist/cjs/services/db/currency-exchange-rates-db-service.js +39 -39
  310. package/dist/cjs/services/db/custom-measures-db-service.d.ts +14 -14
  311. package/dist/cjs/services/db/custom-measures-db-service.js +48 -48
  312. package/dist/cjs/services/db/destinations-db-service.d.ts +13 -13
  313. package/dist/cjs/services/db/destinations-db-service.js +74 -74
  314. package/dist/cjs/services/db/identity-cache-db-service.d.ts +28 -28
  315. package/dist/cjs/services/db/identity-cache-db-service.js +320 -320
  316. package/dist/cjs/services/db/identity-cache-dynamodb-service/constants.d.ts +3 -3
  317. package/dist/cjs/services/db/identity-cache-dynamodb-service/constants.js +6 -6
  318. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.d.ts +20 -20
  319. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js +362 -362
  320. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-gateway-service.d.ts +23 -23
  321. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-gateway-service.js +222 -222
  322. package/dist/cjs/services/db/identity-cache-dynamodb-service/index.d.ts +4 -4
  323. package/dist/cjs/services/db/identity-cache-dynamodb-service/index.js +20 -20
  324. package/dist/cjs/services/db/identity-cache-dynamodb-service/key-builders.d.ts +12 -12
  325. package/dist/cjs/services/db/identity-cache-dynamodb-service/key-builders.js +31 -31
  326. package/dist/cjs/services/db/identity-cache-dynamodb-service/types.d.ts +71 -71
  327. package/dist/cjs/services/db/identity-cache-dynamodb-service/types.js +28 -28
  328. package/dist/cjs/services/db/index.d.ts +22 -22
  329. package/dist/cjs/services/db/index.js +38 -38
  330. package/dist/cjs/services/db/log-events-db-service.d.ts +11 -11
  331. package/dist/cjs/services/db/log-events-db-service.js +181 -181
  332. package/dist/cjs/services/db/pixels-db-service.d.ts +8 -8
  333. package/dist/cjs/services/db/pixels-db-service.js +35 -35
  334. package/dist/cjs/services/db/products-db-service-types.d.ts +10 -10
  335. package/dist/cjs/services/db/products-db-service-types.js +2 -2
  336. package/dist/cjs/services/db/products-db-service.d.ts +19 -19
  337. package/dist/cjs/services/db/products-db-service.js +281 -281
  338. package/dist/cjs/services/db/purchasable-contacts-db-service.d.ts +9 -9
  339. package/dist/cjs/services/db/purchasable-contacts-db-service.js +43 -43
  340. package/dist/cjs/services/db/purchased-contacts/index.d.ts +2 -2
  341. package/dist/cjs/services/db/purchased-contacts/index.js +18 -18
  342. package/dist/cjs/services/db/purchased-contacts/purchased-contacts-db-service.d.ts +18 -18
  343. package/dist/cjs/services/db/purchased-contacts/purchased-contacts-db-service.js +152 -152
  344. package/dist/cjs/services/db/purchased-contacts/types.d.ts +11 -11
  345. package/dist/cjs/services/db/purchased-contacts/types.js +2 -2
  346. package/dist/cjs/services/db/shopify-app-installs-db-service.d.ts +10 -10
  347. package/dist/cjs/services/db/shopify-app-installs-db-service.js +52 -52
  348. package/dist/cjs/services/db/shopify-products-cache-db-service.d.ts +16 -16
  349. package/dist/cjs/services/db/shopify-products-cache-db-service.js +73 -73
  350. package/dist/cjs/services/db/subscriptions-db-service.d.ts +11 -11
  351. package/dist/cjs/services/db/subscriptions-db-service.js +38 -38
  352. package/dist/cjs/services/db/tracking-events-db-service.d.ts +21 -21
  353. package/dist/cjs/services/db/tracking-events-db-service.js +188 -188
  354. package/dist/cjs/services/db/user-accounts-db-service.d.ts +7 -7
  355. package/dist/cjs/services/db/user-accounts-db-service.js +17 -17
  356. package/dist/cjs/services/email-verification/contact-email-verification-service.d.ts +7 -7
  357. package/dist/cjs/services/email-verification/contact-email-verification-service.js +101 -101
  358. package/dist/cjs/services/email-verification/email-verification-service.d.ts +19 -19
  359. package/dist/cjs/services/email-verification/email-verification-service.js +131 -131
  360. package/dist/cjs/services/email-verification/index.d.ts +2 -2
  361. package/dist/cjs/services/email-verification/index.js +18 -18
  362. package/dist/cjs/services/eventbridge-integration-service.d.ts +9 -9
  363. package/dist/cjs/services/eventbridge-integration-service.js +28 -28
  364. package/dist/cjs/services/events/build-collect-queue-tracking-event.d.ts +11 -11
  365. package/dist/cjs/services/events/build-collect-queue-tracking-event.js +23 -23
  366. package/dist/cjs/services/events/collect-queue-tracking-service.d.ts +12 -12
  367. package/dist/cjs/services/events/collect-queue-tracking-service.js +22 -22
  368. package/dist/cjs/services/events/index.d.ts +5 -5
  369. package/dist/cjs/services/events/index.js +21 -21
  370. package/dist/cjs/services/events/log-event-service.d.ts +19 -19
  371. package/dist/cjs/services/events/log-event-service.js +77 -77
  372. package/dist/cjs/services/events/metric-event-service.d.ts +9 -9
  373. package/dist/cjs/services/events/metric-event-service.js +49 -49
  374. package/dist/cjs/services/events/tracking-event-sqs-service.d.ts +8 -8
  375. package/dist/cjs/services/events/tracking-event-sqs-service.js +36 -36
  376. package/dist/cjs/services/generic-cache-service.d.ts +7 -7
  377. package/dist/cjs/services/generic-cache-service.js +33 -33
  378. package/dist/cjs/services/index.d.ts +11 -11
  379. package/dist/cjs/services/index.js +27 -27
  380. package/dist/cjs/services/ipdata-lookup-service.d.ts +20 -20
  381. package/dist/cjs/services/ipdata-lookup-service.js +112 -112
  382. package/dist/cjs/services/shopify/index.d.ts +2 -2
  383. package/dist/cjs/services/shopify/index.js +18 -18
  384. package/dist/cjs/services/shopify/products/index.d.ts +1 -1
  385. package/dist/cjs/services/shopify/products/index.js +17 -17
  386. package/dist/cjs/services/shopify/products/shopify-products-serviceV2.d.ts +17 -17
  387. package/dist/cjs/services/shopify/products/shopify-products-serviceV2.js +112 -112
  388. package/dist/cjs/services/shopify/shopify-graphql-transformer.d.ts +8 -8
  389. package/dist/cjs/services/shopify/shopify-graphql-transformer.js +141 -141
  390. package/dist/cjs/types/acuity-types.d.ts +74 -74
  391. package/dist/cjs/types/acuity-types.js +2 -2
  392. package/dist/cjs/types/api-response.d.ts +6 -6
  393. package/dist/cjs/types/api-response.js +2 -2
  394. package/dist/cjs/types/index.d.ts +6 -6
  395. package/dist/cjs/types/index.js +35 -35
  396. package/dist/cjs/types/internal-events/event-detail-types.d.ts +20 -20
  397. package/dist/cjs/types/internal-events/event-detail-types.js +27 -27
  398. package/dist/cjs/types/internal-events/index.d.ts +1 -1
  399. package/dist/cjs/types/internal-events/index.js +17 -17
  400. package/dist/cjs/types/open-exchange-rates-types.d.ts +10 -10
  401. package/dist/cjs/types/open-exchange-rates-types.js +2 -2
  402. package/dist/cjs/types/public-api-types.d.ts +24 -24
  403. package/dist/cjs/types/public-api-types.js +13 -13
  404. package/dist/cjs/types/shopify-graphql-types/admin.generated.d.ts +123 -123
  405. package/dist/cjs/types/shopify-graphql-types/admin.generated.js +2 -2
  406. package/dist/cjs/types/shopify-graphql-types/admin.types.d.ts +26289 -26289
  407. package/dist/cjs/types/shopify-graphql-types/admin.types.js +5311 -5311
  408. package/dist/cjs/types/shopify-graphql-types/index.d.ts +2 -2
  409. package/dist/cjs/types/shopify-graphql-types/index.js +18 -18
  410. package/dist/cjs/types/shopify-rest-types.d.ts +767 -767
  411. package/dist/cjs/types/shopify-rest-types.js +2 -2
  412. package/dist/cjs/utils/compression.d.ts +36 -36
  413. package/dist/cjs/utils/compression.js +198 -198
  414. package/dist/cjs/utils/custom-measure-formula-utils.d.ts +6 -6
  415. package/dist/cjs/utils/custom-measure-formula-utils.js +209 -209
  416. package/dist/cjs/utils/index.d.ts +4 -4
  417. package/dist/cjs/utils/index.js +20 -20
  418. package/dist/cjs/utils/retry-envelope.d.ts +12 -12
  419. package/dist/cjs/utils/retry-envelope.js +28 -28
  420. package/dist/cjs/utils/size.d.ts +2 -2
  421. package/dist/cjs/utils/size.js +49 -49
  422. package/dist/esm/__tests__/clients/acuity-client.spec.d.ts +1 -1
  423. package/dist/esm/__tests__/clients/acuity-client.spec.js +41 -41
  424. package/dist/esm/__tests__/clients/cross-platform-compression.spec.d.ts +1 -1
  425. package/dist/esm/__tests__/clients/cross-platform-compression.spec.js +329 -329
  426. package/dist/esm/__tests__/clients/dynamodb-client.spec.d.ts +1 -1
  427. package/dist/esm/__tests__/clients/dynamodb-client.spec.js +192 -192
  428. package/dist/esm/__tests__/clients/event-collector-client.spec.d.ts +1 -1
  429. package/dist/esm/__tests__/clients/event-collector-client.spec.js +225 -225
  430. package/dist/esm/__tests__/clients/open-exchange-rates-client.spec.d.ts +1 -1
  431. package/dist/esm/__tests__/clients/open-exchange-rates-client.spec.js +53 -53
  432. package/dist/esm/__tests__/clients/sqs-bundled-client.spec.d.ts +1 -1
  433. package/dist/esm/__tests__/clients/sqs-bundled-client.spec.js +906 -906
  434. package/dist/esm/__tests__/clients/sqs-bundling-contracts.spec.d.ts +1 -1
  435. package/dist/esm/__tests__/clients/sqs-bundling-contracts.spec.js +538 -538
  436. package/dist/esm/__tests__/clients/sqs-client.spec.d.ts +1 -1
  437. package/dist/esm/__tests__/clients/sqs-client.spec.js +189 -189
  438. package/dist/esm/__tests__/clients/sqs-unbundle.spec.d.ts +1 -1
  439. package/dist/esm/__tests__/clients/sqs-unbundle.spec.js +1355 -1355
  440. package/dist/esm/__tests__/db/contact-enrichments-db-service.spec.d.ts +1 -1
  441. package/dist/esm/__tests__/db/contact-enrichments-db-service.spec.js +66 -66
  442. package/dist/esm/__tests__/db/destinations-db-service.spec.d.ts +1 -1
  443. package/dist/esm/__tests__/db/destinations-db-service.spec.js +123 -123
  444. package/dist/esm/__tests__/db/products-db-service.spec.d.ts +1 -1
  445. package/dist/esm/__tests__/db/products-db-service.spec.js +87 -87
  446. package/dist/esm/__tests__/db/shared-read-db-services.spec.d.ts +1 -1
  447. package/dist/esm/__tests__/db/shared-read-db-services.spec.js +87 -87
  448. package/dist/esm/__tests__/db/shopify-app-installs-db-service.spec.d.ts +1 -1
  449. package/dist/esm/__tests__/db/shopify-app-installs-db-service.spec.js +102 -102
  450. package/dist/esm/__tests__/db/subscriptions-db-service.spec.d.ts +1 -1
  451. package/dist/esm/__tests__/db/subscriptions-db-service.spec.js +93 -93
  452. package/dist/esm/__tests__/db/user-accounts-db-service.spec.d.ts +1 -1
  453. package/dist/esm/__tests__/db/user-accounts-db-service.spec.js +74 -74
  454. package/dist/esm/__tests__/helpers/account-users-helper.spec.d.ts +1 -1
  455. package/dist/esm/__tests__/helpers/account-users-helper.spec.js +218 -218
  456. package/dist/esm/__tests__/helpers/acuity-helper.spec.d.ts +1 -1
  457. package/dist/esm/__tests__/helpers/acuity-helper.spec.js +67 -67
  458. package/dist/esm/__tests__/helpers/api-key-auth-helper.spec.d.ts +1 -1
  459. package/dist/esm/__tests__/helpers/api-key-auth-helper.spec.js +80 -80
  460. package/dist/esm/__tests__/helpers/cognito-auth-helper.spec.d.ts +1 -1
  461. package/dist/esm/__tests__/helpers/cognito-auth-helper.spec.js +44 -44
  462. package/dist/esm/__tests__/helpers/order-calculation-helper.spec.d.ts +1 -0
  463. package/dist/esm/__tests__/helpers/order-calculation-helper.spec.js +151 -0
  464. package/dist/esm/__tests__/helpers/order-calculation-helper.spec.js.map +1 -0
  465. package/dist/esm/__tests__/helpers/public-api-response-helper.spec.d.ts +1 -1
  466. package/dist/esm/__tests__/helpers/public-api-response-helper.spec.js +55 -55
  467. package/dist/esm/__tests__/identity-cache/helpers.spec.d.ts +1 -1
  468. package/dist/esm/__tests__/identity-cache/helpers.spec.js +590 -590
  469. package/dist/esm/__tests__/identity-cache/identity-cache-db-service.spec.d.ts +1 -1
  470. package/dist/esm/__tests__/identity-cache/identity-cache-db-service.spec.js +674 -674
  471. package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.d.ts +1 -1
  472. package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.js +553 -553
  473. package/dist/esm/__tests__/identity-cache/identity-cache-tier-routing.spec.d.ts +1 -1
  474. package/dist/esm/__tests__/identity-cache/identity-cache-tier-routing.spec.js +629 -629
  475. package/dist/esm/__tests__/identity-cache/identity-client.spec.d.ts +1 -1
  476. package/dist/esm/__tests__/identity-cache/identity-client.spec.js +357 -357
  477. package/dist/esm/__tests__/identity-cache/identity-gateway-cache-hit.spec.d.ts +1 -1
  478. package/dist/esm/__tests__/identity-cache/identity-gateway-cache-hit.spec.js +135 -135
  479. package/dist/esm/__tests__/identity-cache/identity-gateway-cache-miss.spec.d.ts +1 -1
  480. package/dist/esm/__tests__/identity-cache/identity-gateway-cache-miss.spec.js +150 -150
  481. package/dist/esm/__tests__/identity-cache/identity-gateway-constructor.spec.d.ts +1 -1
  482. package/dist/esm/__tests__/identity-cache/identity-gateway-constructor.spec.js +69 -69
  483. package/dist/esm/__tests__/identity-cache/identity-gateway-edge-cases.spec.d.ts +1 -1
  484. package/dist/esm/__tests__/identity-cache/identity-gateway-edge-cases.spec.js +86 -86
  485. package/dist/esm/__tests__/identity-cache/identity-gateway-enqueue-async.spec.d.ts +1 -1
  486. package/dist/esm/__tests__/identity-cache/identity-gateway-enqueue-async.spec.js +133 -133
  487. package/dist/esm/__tests__/identity-cache/identity-gateway-stale-cache.spec.d.ts +1 -1
  488. package/dist/esm/__tests__/identity-cache/identity-gateway-stale-cache.spec.js +221 -221
  489. package/dist/esm/__tests__/identity-cache/identity-gateway-test-setup.d.ts +28 -28
  490. package/dist/esm/__tests__/identity-cache/identity-gateway-test-setup.js +82 -82
  491. package/dist/esm/__tests__/identity-cache/trait-merging-and-staleness.spec.d.ts +1 -1
  492. package/dist/esm/__tests__/identity-cache/trait-merging-and-staleness.spec.js +1768 -1768
  493. package/dist/esm/__tests__/identity-cache/volatile-traits-optimization.spec.d.ts +1 -1
  494. package/dist/esm/__tests__/identity-cache/volatile-traits-optimization.spec.js +816 -816
  495. package/dist/esm/__tests__/integration/sqs-bundling-roundtrip.spec.d.ts +1 -1
  496. package/dist/esm/__tests__/integration/sqs-bundling-roundtrip.spec.js +582 -582
  497. package/dist/esm/__tests__/libs/compress-decompress.spec.d.ts +1 -1
  498. package/dist/esm/__tests__/libs/compress-decompress.spec.js +14 -14
  499. package/dist/esm/__tests__/libs/contacts.spec.d.ts +1 -1
  500. package/dist/esm/__tests__/libs/contacts.spec.js +292 -292
  501. package/dist/esm/__tests__/libs/currency.spec.d.ts +1 -1
  502. package/dist/esm/__tests__/libs/currency.spec.js +218 -218
  503. package/dist/esm/__tests__/libs/dates.spec.d.ts +1 -1
  504. package/dist/esm/__tests__/libs/dates.spec.js +128 -128
  505. package/dist/esm/__tests__/libs/domain.spec.d.ts +1 -1
  506. package/dist/esm/__tests__/libs/domain.spec.js +105 -105
  507. package/dist/esm/__tests__/libs/numbers.spec.d.ts +1 -1
  508. package/dist/esm/__tests__/libs/numbers.spec.js +259 -259
  509. package/dist/esm/__tests__/s3-client/s3-client.spec.d.ts +1 -1
  510. package/dist/esm/__tests__/s3-client/s3-client.spec.js +31 -31
  511. package/dist/esm/__tests__/services/acuity-api-service.spec.d.ts +1 -1
  512. package/dist/esm/__tests__/services/acuity-api-service.spec.js +69 -69
  513. package/dist/esm/__tests__/services/cost/cost-calculation-types.spec.d.ts +1 -1
  514. package/dist/esm/__tests__/services/cost/cost-calculation-types.spec.js +21 -21
  515. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.d.ts +1 -1
  516. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.js +3347 -3317
  517. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.js.map +1 -1
  518. package/dist/esm/__tests__/services/cost/cost-currency-service.spec.d.ts +1 -1
  519. package/dist/esm/__tests__/services/cost/cost-currency-service.spec.js +112 -112
  520. package/dist/esm/__tests__/services/cost/cost-filter-service.spec.d.ts +1 -1
  521. package/dist/esm/__tests__/services/cost/cost-filter-service.spec.js +466 -466
  522. package/dist/esm/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.d.ts +1 -1
  523. package/dist/esm/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js +308 -204
  524. package/dist/esm/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js.map +1 -1
  525. package/dist/esm/__tests__/services/currency-exchange-rate-lookup-service.spec.d.ts +1 -1
  526. package/dist/esm/__tests__/services/currency-exchange-rate-lookup-service.spec.js +32 -32
  527. package/dist/esm/__tests__/services/email-verification/contact-email-verification-service.spec.d.ts +1 -1
  528. package/dist/esm/__tests__/services/email-verification/contact-email-verification-service.spec.js +91 -91
  529. package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.d.ts +1 -1
  530. package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.js +55 -55
  531. package/dist/esm/__tests__/services/events/collect-queue-tracking-service.spec.d.ts +1 -1
  532. package/dist/esm/__tests__/services/events/collect-queue-tracking-service.spec.js +227 -227
  533. package/dist/esm/__tests__/services/events/tracking-event-sqs-service.spec.d.ts +1 -1
  534. package/dist/esm/__tests__/services/events/tracking-event-sqs-service.spec.js +189 -189
  535. package/dist/esm/__tests__/shopify/shopify-graphql-transformer.spec.d.ts +1 -1
  536. package/dist/esm/__tests__/shopify/shopify-graphql-transformer.spec.js +33 -33
  537. package/dist/esm/__tests__/unit/libs/api-router/public-api-router.spec.d.ts +1 -1
  538. package/dist/esm/__tests__/unit/libs/api-router/public-api-router.spec.js +156 -156
  539. package/dist/esm/__tests__/unit/libs/api-router/route-matcher.spec.d.ts +1 -1
  540. package/dist/esm/__tests__/unit/libs/api-router/route-matcher.spec.js +67 -67
  541. package/dist/esm/__tests__/utils/custom-measure-formula-utils.spec.d.ts +1 -1
  542. package/dist/esm/__tests__/utils/custom-measure-formula-utils.spec.js +144 -144
  543. package/dist/esm/clients/generic/cognito-client.d.ts +23 -23
  544. package/dist/esm/clients/generic/cognito-client.js +204 -204
  545. package/dist/esm/clients/generic/dynamodb-client.d.ts +20 -20
  546. package/dist/esm/clients/generic/dynamodb-client.js +231 -231
  547. package/dist/esm/clients/generic/eventbridge-client.d.ts +14 -14
  548. package/dist/esm/clients/generic/eventbridge-client.js +47 -47
  549. package/dist/esm/clients/generic/http-client.d.ts +14 -14
  550. package/dist/esm/clients/generic/http-client.js +53 -53
  551. package/dist/esm/clients/generic/index.d.ts +13 -13
  552. package/dist/esm/clients/generic/index.js +13 -13
  553. package/dist/esm/clients/generic/lambda-invoke-client.d.ts +10 -10
  554. package/dist/esm/clients/generic/lambda-invoke-client.js +35 -35
  555. package/dist/esm/clients/generic/location-client.d.ts +8 -8
  556. package/dist/esm/clients/generic/location-client.js +27 -27
  557. package/dist/esm/clients/generic/redis-client.d.ts +33 -33
  558. package/dist/esm/clients/generic/redis-client.js +184 -184
  559. package/dist/esm/clients/generic/s3-client.d.ts +23 -23
  560. package/dist/esm/clients/generic/s3-client.js +209 -209
  561. package/dist/esm/clients/generic/singlestore-db-client.d.ts +14 -14
  562. package/dist/esm/clients/generic/singlestore-db-client.js +40 -40
  563. package/dist/esm/clients/generic/sqs-bundled-client.d.ts +15 -15
  564. package/dist/esm/clients/generic/sqs-bundled-client.js +307 -307
  565. package/dist/esm/clients/generic/sqs-bundled-client.types.d.ts +53 -53
  566. package/dist/esm/clients/generic/sqs-bundled-client.types.js +14 -14
  567. package/dist/esm/clients/generic/sqs-client.d.ts +53 -53
  568. package/dist/esm/clients/generic/sqs-client.js +281 -281
  569. package/dist/esm/clients/generic/sqs-unbundle.d.ts +32 -32
  570. package/dist/esm/clients/generic/sqs-unbundle.js +137 -137
  571. package/dist/esm/clients/index.d.ts +3 -3
  572. package/dist/esm/clients/index.js +3 -3
  573. package/dist/esm/clients/internal-api/accounts-client.d.ts +91 -91
  574. package/dist/esm/clients/internal-api/accounts-client.js +125 -125
  575. package/dist/esm/clients/internal-api/cache-lambda-client.d.ts +26 -26
  576. package/dist/esm/clients/internal-api/cache-lambda-client.js +85 -85
  577. package/dist/esm/clients/internal-api/db-management-client.d.ts +18 -18
  578. package/dist/esm/clients/internal-api/db-management-client.js +32 -32
  579. package/dist/esm/clients/internal-api/destinations-client.d.ts +34 -34
  580. package/dist/esm/clients/internal-api/destinations-client.js +75 -75
  581. package/dist/esm/clients/internal-api/event-collector-client.d.ts +122 -122
  582. package/dist/esm/clients/internal-api/event-collector-client.js +74 -74
  583. package/dist/esm/clients/internal-api/identity-client.d.ts +41 -41
  584. package/dist/esm/clients/internal-api/identity-client.js +133 -133
  585. package/dist/esm/clients/internal-api/index.d.ts +9 -9
  586. package/dist/esm/clients/internal-api/index.js +9 -9
  587. package/dist/esm/clients/internal-api/shopify-app-install-client.d.ts +37 -37
  588. package/dist/esm/clients/internal-api/shopify-app-install-client.js +77 -77
  589. package/dist/esm/clients/internal-api/subscriptions-client.d.ts +26 -26
  590. package/dist/esm/clients/internal-api/subscriptions-client.js +73 -73
  591. package/dist/esm/clients/internal-api/users-auth-client.d.ts +35 -35
  592. package/dist/esm/clients/internal-api/users-auth-client.js +106 -106
  593. package/dist/esm/clients/third-party/acuity-client.d.ts +10 -10
  594. package/dist/esm/clients/third-party/acuity-client.js +36 -36
  595. package/dist/esm/clients/third-party/emailable-client.d.ts +7 -7
  596. package/dist/esm/clients/third-party/emailable-client.js +21 -21
  597. package/dist/esm/clients/third-party/exchange-rate-api-client.d.ts +17 -17
  598. package/dist/esm/clients/third-party/exchange-rate-api-client.js +15 -15
  599. package/dist/esm/clients/third-party/index.d.ts +6 -6
  600. package/dist/esm/clients/third-party/index.js +6 -6
  601. package/dist/esm/clients/third-party/loops-client.d.ts +10 -10
  602. package/dist/esm/clients/third-party/loops-client.js +26 -26
  603. package/dist/esm/clients/third-party/open-exchange-rates-client.d.ts +8 -8
  604. package/dist/esm/clients/third-party/open-exchange-rates-client.js +23 -23
  605. package/dist/esm/clients/third-party/shopify/graphql-analytics-queries.d.ts +18 -18
  606. package/dist/esm/clients/third-party/shopify/graphql-analytics-queries.js +19 -19
  607. package/dist/esm/clients/third-party/shopify/graphql-order-queries.d.ts +25 -25
  608. package/dist/esm/clients/third-party/shopify/graphql-order-queries.js +1 -1
  609. package/dist/esm/clients/third-party/shopify/graphql-product-queries.d.ts +2 -2
  610. package/dist/esm/clients/third-party/shopify/graphql-product-queries.js +2 -2
  611. package/dist/esm/clients/third-party/shopify/shopify-graphql-client.d.ts +42 -42
  612. package/dist/esm/clients/third-party/shopify/shopify-graphql-client.js +348 -348
  613. package/dist/esm/clients/third-party/shopify-client.d.ts +29 -29
  614. package/dist/esm/clients/third-party/shopify-client.js +142 -142
  615. package/dist/esm/constants/index.d.ts +1 -1
  616. package/dist/esm/constants/index.js +1 -1
  617. package/dist/esm/constants/sqs.d.ts +20 -20
  618. package/dist/esm/constants/sqs.js +22 -22
  619. package/dist/esm/helpers/account-users-helper.d.ts +2 -2
  620. package/dist/esm/helpers/account-users-helper.js +18 -18
  621. package/dist/esm/helpers/acuity-helper.d.ts +4 -4
  622. package/dist/esm/helpers/acuity-helper.js +51 -51
  623. package/dist/esm/helpers/api-key-auth-helper.d.ts +9 -9
  624. package/dist/esm/helpers/api-key-auth-helper.js +35 -35
  625. package/dist/esm/helpers/api-key-authorizer-helper.d.ts +36 -36
  626. package/dist/esm/helpers/api-key-authorizer-helper.js +83 -83
  627. package/dist/esm/helpers/cognito-auth-helper.d.ts +5 -5
  628. package/dist/esm/helpers/cognito-auth-helper.js +10 -10
  629. package/dist/esm/helpers/index.d.ts +12 -11
  630. package/dist/esm/helpers/index.js +12 -11
  631. package/dist/esm/helpers/index.js.map +1 -1
  632. package/dist/esm/helpers/input-validation-helper.d.ts +3 -3
  633. package/dist/esm/helpers/input-validation-helper.js +18 -18
  634. package/dist/esm/helpers/logging-helper.d.ts +16 -16
  635. package/dist/esm/helpers/logging-helper.js +56 -56
  636. package/dist/esm/helpers/order-calculation-helper.d.ts +13 -0
  637. package/dist/esm/helpers/order-calculation-helper.js +112 -0
  638. package/dist/esm/helpers/order-calculation-helper.js.map +1 -0
  639. package/dist/esm/helpers/public-api-response-helper.d.ts +21 -21
  640. package/dist/esm/helpers/public-api-response-helper.js +38 -38
  641. package/dist/esm/helpers/response-helper.d.ts +18 -18
  642. package/dist/esm/helpers/response-helper.js +37 -37
  643. package/dist/esm/helpers/shopify-helper.d.ts +9 -9
  644. package/dist/esm/helpers/shopify-helper.js +21 -21
  645. package/dist/esm/helpers/sqs-utils.d.ts +6 -6
  646. package/dist/esm/helpers/sqs-utils.js +9 -9
  647. package/dist/esm/index.d.ts +7 -7
  648. package/dist/esm/index.js +7 -7
  649. package/dist/esm/libs/api-router/index.d.ts +2 -2
  650. package/dist/esm/libs/api-router/index.js +2 -2
  651. package/dist/esm/libs/api-router/public-api-router.d.ts +3 -3
  652. package/dist/esm/libs/api-router/public-api-router.js +32 -32
  653. package/dist/esm/libs/api-router/route-matcher.d.ts +21 -21
  654. package/dist/esm/libs/api-router/route-matcher.js +30 -30
  655. package/dist/esm/libs/click-id-parser.d.ts +23 -23
  656. package/dist/esm/libs/click-id-parser.js +45 -45
  657. package/dist/esm/libs/compression.d.ts +2 -2
  658. package/dist/esm/libs/compression.js +25 -25
  659. package/dist/esm/libs/contacts.d.ts +7 -7
  660. package/dist/esm/libs/contacts.js +143 -143
  661. package/dist/esm/libs/cookie.d.ts +17 -17
  662. package/dist/esm/libs/cookie.js +70 -70
  663. package/dist/esm/libs/crypto.d.ts +4 -4
  664. package/dist/esm/libs/crypto.js +15 -15
  665. package/dist/esm/libs/csv.d.ts +2 -2
  666. package/dist/esm/libs/csv.js +30 -30
  667. package/dist/esm/libs/currency.d.ts +1 -1
  668. package/dist/esm/libs/currency.js +22 -22
  669. package/dist/esm/libs/dates.d.ts +12 -12
  670. package/dist/esm/libs/dates.js +83 -83
  671. package/dist/esm/libs/domain.d.ts +2 -2
  672. package/dist/esm/libs/domain.js +33 -33
  673. package/dist/esm/libs/emails.d.ts +8 -8
  674. package/dist/esm/libs/emails.js +146 -146
  675. package/dist/esm/libs/http-error.d.ts +21 -21
  676. package/dist/esm/libs/http-error.js +59 -59
  677. package/dist/esm/libs/http-status-codes.d.ts +58 -58
  678. package/dist/esm/libs/http-status-codes.js +59 -59
  679. package/dist/esm/libs/index.d.ts +19 -19
  680. package/dist/esm/libs/index.js +19 -19
  681. package/dist/esm/libs/numbers.d.ts +1 -1
  682. package/dist/esm/libs/numbers.js +11 -11
  683. package/dist/esm/libs/referrer-parser/index.d.ts +2 -2
  684. package/dist/esm/libs/referrer-parser/index.js +2 -2
  685. package/dist/esm/libs/referrer-parser/referrer-data.d.ts +9 -9
  686. package/dist/esm/libs/referrer-parser/referrer-data.js +3304 -3304
  687. package/dist/esm/libs/referrer-parser/referrer-parser-util.d.ts +20 -20
  688. package/dist/esm/libs/referrer-parser/referrer-parser-util.js +124 -124
  689. package/dist/esm/libs/strings.d.ts +3 -3
  690. package/dist/esm/libs/strings.js +40 -40
  691. package/dist/esm/libs/traits.d.ts +6 -6
  692. package/dist/esm/libs/traits.js +54 -54
  693. package/dist/esm/libs/url.d.ts +1 -1
  694. package/dist/esm/libs/url.js +9 -9
  695. package/dist/esm/services/acuity-api-service.d.ts +9 -9
  696. package/dist/esm/services/acuity-api-service.js +69 -69
  697. package/dist/esm/services/cache/generic-cached-object.d.ts +5 -5
  698. package/dist/esm/services/cache/generic-cached-object.js +1 -1
  699. package/dist/esm/services/cache/index.d.ts +1 -1
  700. package/dist/esm/services/cache/index.js +1 -1
  701. package/dist/esm/services/cache/product-cache-service.d.ts +21 -21
  702. package/dist/esm/services/cache/product-cache-service.js +68 -68
  703. package/dist/esm/services/cost/cost-calculation-types.d.ts +69 -69
  704. package/dist/esm/services/cost/cost-calculation-types.js +15 -15
  705. package/dist/esm/services/cost/cost-calculator-service.d.ts +24 -24
  706. package/dist/esm/services/cost/cost-calculator-service.js +455 -450
  707. package/dist/esm/services/cost/cost-calculator-service.js.map +1 -1
  708. package/dist/esm/services/cost/cost-currency-service.d.ts +6 -6
  709. package/dist/esm/services/cost/cost-currency-service.js +84 -84
  710. package/dist/esm/services/cost/cost-filter-service.d.ts +10 -10
  711. package/dist/esm/services/cost/cost-filter-service.js +118 -118
  712. package/dist/esm/services/cost/index.d.ts +5 -5
  713. package/dist/esm/services/cost/index.js +5 -5
  714. package/dist/esm/services/cost/order-cost/index.d.ts +2 -2
  715. package/dist/esm/services/cost/order-cost/index.js +2 -2
  716. package/dist/esm/services/cost/order-cost/order-cost-resolution-service.d.ts +21 -23
  717. package/dist/esm/services/cost/order-cost/order-cost-resolution-service.js +282 -355
  718. package/dist/esm/services/cost/order-cost/order-cost-resolution-service.js.map +1 -1
  719. package/dist/esm/services/cost/order-cost/order-cost-resolution-types.d.ts +31 -37
  720. package/dist/esm/services/cost/order-cost/order-cost-resolution-types.js +1 -1
  721. package/dist/esm/services/currency-exchange-rate-lookup-service.d.ts +12 -12
  722. package/dist/esm/services/currency-exchange-rate-lookup-service.js +90 -90
  723. package/dist/esm/services/db/accounts-db-service.d.ts +9 -9
  724. package/dist/esm/services/db/accounts-db-service.js +29 -29
  725. package/dist/esm/services/db/api-keys-db-service.d.ts +10 -10
  726. package/dist/esm/services/db/api-keys-db-service.js +32 -32
  727. package/dist/esm/services/db/contact-enrichments-db-service.d.ts +15 -15
  728. package/dist/esm/services/db/contact-enrichments-db-service.js +90 -90
  729. package/dist/esm/services/db/currency-exchange-rates-db-service.d.ts +21 -21
  730. package/dist/esm/services/db/currency-exchange-rates-db-service.js +35 -35
  731. package/dist/esm/services/db/custom-measures-db-service.d.ts +14 -14
  732. package/dist/esm/services/db/custom-measures-db-service.js +44 -44
  733. package/dist/esm/services/db/destinations-db-service.d.ts +13 -13
  734. package/dist/esm/services/db/destinations-db-service.js +70 -70
  735. package/dist/esm/services/db/identity-cache-db-service.d.ts +28 -28
  736. package/dist/esm/services/db/identity-cache-db-service.js +313 -313
  737. package/dist/esm/services/db/identity-cache-dynamodb-service/constants.d.ts +3 -3
  738. package/dist/esm/services/db/identity-cache-dynamodb-service/constants.js +3 -3
  739. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.d.ts +20 -20
  740. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js +358 -358
  741. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-gateway-service.d.ts +23 -23
  742. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-gateway-service.js +218 -218
  743. package/dist/esm/services/db/identity-cache-dynamodb-service/index.d.ts +4 -4
  744. package/dist/esm/services/db/identity-cache-dynamodb-service/index.js +4 -4
  745. package/dist/esm/services/db/identity-cache-dynamodb-service/key-builders.d.ts +12 -12
  746. package/dist/esm/services/db/identity-cache-dynamodb-service/key-builders.js +23 -23
  747. package/dist/esm/services/db/identity-cache-dynamodb-service/types.d.ts +71 -71
  748. package/dist/esm/services/db/identity-cache-dynamodb-service/types.js +25 -25
  749. package/dist/esm/services/db/index.d.ts +22 -22
  750. package/dist/esm/services/db/index.js +22 -22
  751. package/dist/esm/services/db/log-events-db-service.d.ts +11 -11
  752. package/dist/esm/services/db/log-events-db-service.js +177 -177
  753. package/dist/esm/services/db/pixels-db-service.d.ts +8 -8
  754. package/dist/esm/services/db/pixels-db-service.js +31 -31
  755. package/dist/esm/services/db/products-db-service-types.d.ts +10 -10
  756. package/dist/esm/services/db/products-db-service-types.js +1 -1
  757. package/dist/esm/services/db/products-db-service.d.ts +19 -19
  758. package/dist/esm/services/db/products-db-service.js +277 -277
  759. package/dist/esm/services/db/purchasable-contacts-db-service.d.ts +9 -9
  760. package/dist/esm/services/db/purchasable-contacts-db-service.js +39 -39
  761. package/dist/esm/services/db/purchased-contacts/index.d.ts +2 -2
  762. package/dist/esm/services/db/purchased-contacts/index.js +2 -2
  763. package/dist/esm/services/db/purchased-contacts/purchased-contacts-db-service.d.ts +18 -18
  764. package/dist/esm/services/db/purchased-contacts/purchased-contacts-db-service.js +148 -148
  765. package/dist/esm/services/db/purchased-contacts/types.d.ts +11 -11
  766. package/dist/esm/services/db/purchased-contacts/types.js +1 -1
  767. package/dist/esm/services/db/shopify-app-installs-db-service.d.ts +10 -10
  768. package/dist/esm/services/db/shopify-app-installs-db-service.js +48 -48
  769. package/dist/esm/services/db/shopify-products-cache-db-service.d.ts +16 -16
  770. package/dist/esm/services/db/shopify-products-cache-db-service.js +66 -66
  771. package/dist/esm/services/db/subscriptions-db-service.d.ts +11 -11
  772. package/dist/esm/services/db/subscriptions-db-service.js +34 -34
  773. package/dist/esm/services/db/tracking-events-db-service.d.ts +21 -21
  774. package/dist/esm/services/db/tracking-events-db-service.js +184 -184
  775. package/dist/esm/services/db/user-accounts-db-service.d.ts +7 -7
  776. package/dist/esm/services/db/user-accounts-db-service.js +13 -13
  777. package/dist/esm/services/email-verification/contact-email-verification-service.d.ts +7 -7
  778. package/dist/esm/services/email-verification/contact-email-verification-service.js +97 -97
  779. package/dist/esm/services/email-verification/email-verification-service.d.ts +19 -19
  780. package/dist/esm/services/email-verification/email-verification-service.js +127 -127
  781. package/dist/esm/services/email-verification/index.d.ts +2 -2
  782. package/dist/esm/services/email-verification/index.js +2 -2
  783. package/dist/esm/services/eventbridge-integration-service.d.ts +9 -9
  784. package/dist/esm/services/eventbridge-integration-service.js +24 -24
  785. package/dist/esm/services/events/build-collect-queue-tracking-event.d.ts +11 -11
  786. package/dist/esm/services/events/build-collect-queue-tracking-event.js +19 -19
  787. package/dist/esm/services/events/collect-queue-tracking-service.d.ts +12 -12
  788. package/dist/esm/services/events/collect-queue-tracking-service.js +18 -18
  789. package/dist/esm/services/events/index.d.ts +5 -5
  790. package/dist/esm/services/events/index.js +5 -5
  791. package/dist/esm/services/events/log-event-service.d.ts +19 -19
  792. package/dist/esm/services/events/log-event-service.js +73 -73
  793. package/dist/esm/services/events/metric-event-service.d.ts +9 -9
  794. package/dist/esm/services/events/metric-event-service.js +45 -45
  795. package/dist/esm/services/events/tracking-event-sqs-service.d.ts +8 -8
  796. package/dist/esm/services/events/tracking-event-sqs-service.js +32 -32
  797. package/dist/esm/services/generic-cache-service.d.ts +7 -7
  798. package/dist/esm/services/generic-cache-service.js +29 -29
  799. package/dist/esm/services/index.d.ts +11 -11
  800. package/dist/esm/services/index.js +11 -11
  801. package/dist/esm/services/ipdata-lookup-service.d.ts +20 -20
  802. package/dist/esm/services/ipdata-lookup-service.js +108 -108
  803. package/dist/esm/services/shopify/index.d.ts +2 -2
  804. package/dist/esm/services/shopify/index.js +2 -2
  805. package/dist/esm/services/shopify/products/index.d.ts +1 -1
  806. package/dist/esm/services/shopify/products/index.js +1 -1
  807. package/dist/esm/services/shopify/products/shopify-products-serviceV2.d.ts +17 -17
  808. package/dist/esm/services/shopify/products/shopify-products-serviceV2.js +108 -108
  809. package/dist/esm/services/shopify/shopify-graphql-transformer.d.ts +8 -8
  810. package/dist/esm/services/shopify/shopify-graphql-transformer.js +138 -138
  811. package/dist/esm/types/acuity-types.d.ts +74 -74
  812. package/dist/esm/types/acuity-types.js +1 -1
  813. package/dist/esm/types/api-response.d.ts +6 -6
  814. package/dist/esm/types/api-response.js +1 -1
  815. package/dist/esm/types/index.d.ts +6 -6
  816. package/dist/esm/types/index.js +6 -6
  817. package/dist/esm/types/internal-events/event-detail-types.d.ts +20 -20
  818. package/dist/esm/types/internal-events/event-detail-types.js +24 -24
  819. package/dist/esm/types/internal-events/index.d.ts +1 -1
  820. package/dist/esm/types/internal-events/index.js +1 -1
  821. package/dist/esm/types/open-exchange-rates-types.d.ts +10 -10
  822. package/dist/esm/types/open-exchange-rates-types.js +1 -1
  823. package/dist/esm/types/public-api-types.d.ts +24 -24
  824. package/dist/esm/types/public-api-types.js +10 -10
  825. package/dist/esm/types/shopify-graphql-types/admin.generated.d.ts +123 -123
  826. package/dist/esm/types/shopify-graphql-types/admin.generated.js +1 -1
  827. package/dist/esm/types/shopify-graphql-types/admin.types.d.ts +26289 -26289
  828. package/dist/esm/types/shopify-graphql-types/admin.types.js +5299 -5299
  829. package/dist/esm/types/shopify-graphql-types/index.d.ts +2 -2
  830. package/dist/esm/types/shopify-graphql-types/index.js +2 -2
  831. package/dist/esm/types/shopify-rest-types.d.ts +767 -767
  832. package/dist/esm/types/shopify-rest-types.js +1 -1
  833. package/dist/esm/utils/compression.d.ts +36 -36
  834. package/dist/esm/utils/compression.js +187 -187
  835. package/dist/esm/utils/custom-measure-formula-utils.d.ts +6 -6
  836. package/dist/esm/utils/custom-measure-formula-utils.js +201 -201
  837. package/dist/esm/utils/index.d.ts +4 -4
  838. package/dist/esm/utils/index.js +4 -4
  839. package/dist/esm/utils/retry-envelope.d.ts +12 -12
  840. package/dist/esm/utils/retry-envelope.js +22 -22
  841. package/dist/esm/utils/size.d.ts +2 -2
  842. package/dist/esm/utils/size.js +44 -44
  843. package/package.json +136 -136
@@ -1,583 +1,583 @@
1
- import { BundledSQSClient } from '../../clients/generic/sqs-bundled-client';
2
- import { CompressionAlgorithm } from '../../clients/generic/sqs-bundled-client.types';
3
- import { unbundleRecords } from '../../clients/generic/sqs-unbundle';
4
- import { compress } from '../../utils/compression';
5
- import { createSqsLimits, SQS_1MB } from '../../constants/sqs';
6
- jest.mock('../../helpers/logging-helper', () => ({
7
- Logger: {
8
- debug: jest.fn(),
9
- info: jest.fn(),
10
- warn: jest.fn(),
11
- error: jest.fn(),
12
- },
13
- }));
14
- function makeTestEvent(id, name = 'test', value, metadata) {
15
- return { id, name, value, metadata };
16
- }
17
- function makeRealisticTrackingEvent(index) {
18
- return {
19
- anonymousId: `anon-${index}-${Math.random().toString(36).substring(7)}`,
20
- accountId: `acc-${index % 10}`,
21
- pixelId: `pixel-${index % 5}`,
22
- eventType: ['track', 'identify', 'page'][index % 3] ?? 'track',
23
- eventName: ['purchase', 'add_to_cart', 'page_view', 'begin_checkout'][index % 4] ?? 'track',
24
- timestamp: new Date(Date.now() - index * 1000).toISOString(),
25
- context: {
26
- page: {
27
- url: `https://example.com/product/${index}`,
28
- path: `/product/${index}`,
29
- title: `Product ${index} - Example Store`,
30
- referrer: index % 3 === 0 ? 'https://google.com' : '',
31
- },
32
- userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
33
- ip: `192.168.${index % 256}.${(index * 7) % 256}`,
34
- locale: ['en-US', 'en-GB', 'de-DE', 'fr-FR'][index % 4] ?? 'en-US',
35
- timezone: 'America/New_York',
36
- },
37
- properties: {
38
- productId: `prod-${index}`,
39
- productName: `Amazing Product ${index}`,
40
- price: 29.99 + (index % 100),
41
- currency: 'USD',
42
- quantity: (index % 5) + 1,
43
- category: ['Electronics', 'Clothing', 'Home', 'Sports'][index % 4],
44
- customFields: {
45
- brand: `Brand${index % 20}`,
46
- sku: `SKU-${index}-${Date.now()}`,
47
- inStock: index % 2 === 0,
48
- },
49
- },
50
- shopifyData: index % 3 === 0
51
- ? {
52
- checkoutToken: `checkout-${index}`,
53
- orderId: index % 5 === 0 ? `order-${index}` : undefined,
54
- customerEmail: `customer${index}@example.com`,
55
- lineItems: Array.from({ length: (index % 3) + 1 }, (_, j) => ({
56
- variantId: `variant-${index}-${j}`,
57
- title: `Line Item ${j}`,
58
- price: 19.99 + j * 10,
59
- quantity: j + 1,
60
- })),
61
- }
62
- : undefined,
63
- };
64
- }
65
- function simulateSqsDelivery(envelopes) {
66
- return envelopes.map((env, i) => ({
67
- messageId: `msg-${i}-${Date.now()}`,
68
- body: JSON.stringify({ messageBody: env }),
69
- }));
70
- }
71
- describe('Full Round-Trip: Producer → Consumer', () => {
72
- let mockSqsClient;
73
- let capturedEnvelopes;
74
- beforeEach(() => {
75
- capturedEnvelopes = [];
76
- mockSqsClient = {
77
- buildAndSendMessagesV2: jest.fn(async (_type, envelopes) => {
78
- capturedEnvelopes.push(...envelopes);
79
- return {
80
- successCount: envelopes.length,
81
- failedCount: 0,
82
- batchCount: 1,
83
- failedMessages: [],
84
- };
85
- }),
86
- queueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789/test-queue',
87
- limits: createSqsLimits(SQS_1MB),
88
- };
89
- });
90
- describe('1. Basic round-trip test (100 items)', () => {
91
- it('100 items survive complete round-trip with deep equality', async () => {
92
- const bundledClient = new BundledSQSClient(mockSqsClient, {
93
- compression: CompressionAlgorithm.ZSTD,
94
- compressionLevel: 3,
95
- });
96
- const originalItems = Array.from({ length: 100 }, (_, i) => ({
97
- id: `event-${i}`,
98
- name: 'purchase',
99
- value: i * 99.99,
100
- metadata: { source: 'test', index: i },
101
- }));
102
- await bundledClient.sendBundled('test', originalItems);
103
- expect(capturedEnvelopes.length).toBeGreaterThanOrEqual(1);
104
- const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
105
- const { items: recoveredItems, stats } = await unbundleRecords(sqsRecords);
106
- expect(recoveredItems).toHaveLength(100);
107
- expect(recoveredItems).toEqual(originalItems);
108
- expect(stats.bundledSqsRecords).toBe(capturedEnvelopes.length);
109
- expect(stats.failedRecords).toBe(0);
110
- });
111
- it('preserves all primitive types correctly', async () => {
112
- const bundledClient = new BundledSQSClient(mockSqsClient, {
113
- compression: CompressionAlgorithm.ZSTD,
114
- });
115
- const originalItems = [
116
- { id: 'str', name: 'string-test', value: undefined },
117
- { id: 'num', name: 'number-test', value: 123.456 },
118
- { id: 'zero', name: 'zero-test', value: 0 },
119
- { id: 'neg', name: 'negative-test', value: -999.99 },
120
- { id: 'big', name: 'big-number', value: Number.MAX_SAFE_INTEGER },
121
- ];
122
- await bundledClient.sendBundled('test', originalItems);
123
- const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
124
- const { items: recoveredItems } = await unbundleRecords(sqsRecords);
125
- expect(recoveredItems).toEqual(originalItems);
126
- });
127
- });
128
- describe('2. Large scale round-trip (1000 items)', () => {
129
- it('1000 items survive round-trip with no data loss', async () => {
130
- const bundledClient = new BundledSQSClient(mockSqsClient, {
131
- compression: CompressionAlgorithm.ZSTD,
132
- compressionLevel: 3,
133
- });
134
- const originalItems = Array.from({ length: 1000 }, (_, i) => ({
135
- id: `event-${i.toString().padStart(4, '0')}`,
136
- name: `type-${i % 10}`,
137
- value: i * 1.5,
138
- metadata: {
139
- batch: Math.floor(i / 100),
140
- position: i % 100,
141
- timestamp: Date.now() + i,
142
- },
143
- }));
144
- await bundledClient.sendBundled('test', originalItems);
145
- const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
146
- const { items: recoveredItems, stats } = await unbundleRecords(sqsRecords);
147
- expect(recoveredItems).toHaveLength(1000);
148
- expect(stats.totalItems).toBe(1000);
149
- expect(stats.failedRecords).toBe(0);
150
- const recoveredIds = recoveredItems.map((item) => item.id);
151
- const originalIds = originalItems.map((item) => item.id);
152
- expect(new Set(recoveredIds)).toEqual(new Set(originalIds));
153
- expect(recoveredItems).toEqual(originalItems);
154
- });
155
- it('preserves order within each bundle', async () => {
156
- const bundledClient = new BundledSQSClient(mockSqsClient, {
157
- compression: CompressionAlgorithm.ZSTD,
158
- maxItemsPerBundle: 100,
159
- });
160
- const originalItems = Array.from({ length: 500 }, (_, i) => makeTestEvent(`seq-${i}`, 'ordered', i));
161
- await bundledClient.sendBundled('test', originalItems);
162
- const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
163
- const { items: recoveredItems } = await unbundleRecords(sqsRecords);
164
- let currentBundleStart = 0;
165
- for (const envelope of capturedEnvelopes) {
166
- const bundleSize = envelope.n;
167
- const bundleItems = recoveredItems.slice(currentBundleStart, currentBundleStart + bundleSize);
168
- for (let j = 1; j < bundleItems.length; j++) {
169
- const prevValue = bundleItems[j - 1]?.value ?? 0;
170
- const currValue = bundleItems[j]?.value ?? 0;
171
- expect(currValue).toBeGreaterThan(prevValue);
172
- }
173
- currentBundleStart += bundleSize;
174
- }
175
- });
176
- });
177
- describe('3. Compression round-trip verification', () => {
178
- it('ZSTD compressed data decompresses to byte-exact JSON', async () => {
179
- const bundledClient = new BundledSQSClient(mockSqsClient, {
180
- compression: CompressionAlgorithm.ZSTD,
181
- compressionLevel: 5,
182
- });
183
- const originalItems = Array.from({ length: 50 }, (_, i) => ({
184
- id: `compress-test-${i}`,
185
- name: 'compression-verification',
186
- value: i * 123.456789,
187
- metadata: {
188
- unicode: '日本語テスト',
189
- emoji: '🚀✨🎉',
190
- special: 'line\nbreak\ttab\r\nwindows',
191
- quotes: '"double" and \'single\'',
192
- },
193
- }));
194
- const originalJson = JSON.stringify(originalItems);
195
- await bundledClient.sendBundled('test', originalItems);
196
- const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
197
- const { items: recoveredItems } = await unbundleRecords(sqsRecords);
198
- const recoveredJson = JSON.stringify(recoveredItems);
199
- expect(recoveredJson).toBe(originalJson);
200
- expect(recoveredItems).toEqual(originalItems);
201
- });
202
- it('verifies actual compression occurred', async () => {
203
- const bundledClient = new BundledSQSClient(mockSqsClient, {
204
- compression: CompressionAlgorithm.ZSTD,
205
- compressionLevel: 3,
206
- });
207
- const originalItems = Array.from({ length: 200 }, (_, i) => ({
208
- id: `item-${i}`,
209
- name: 'repetitive-data-for-compression',
210
- value: i,
211
- metadata: {
212
- commonField1: 'this is repeated many times',
213
- commonField2: 'another repeated value',
214
- },
215
- }));
216
- const originalSizeBytes = Buffer.byteLength(JSON.stringify(originalItems), 'utf8');
217
- await bundledClient.sendBundled('test', originalItems);
218
- for (const envelope of capturedEnvelopes) {
219
- expect(envelope.c).toBe(CompressionAlgorithm.ZSTD);
220
- expect(typeof envelope.p).toBe('string');
221
- const compressedSizeBytes = Buffer.byteLength(envelope.p, 'utf8');
222
- expect(compressedSizeBytes).toBeLessThan(originalSizeBytes);
223
- }
224
- });
225
- });
226
- describe('4. Mixed message types round-trip', () => {
227
- it('handles mix of NONE and ZSTD compression in same batch', async () => {
228
- const zstdClient = new BundledSQSClient(mockSqsClient, {
229
- compression: CompressionAlgorithm.ZSTD,
230
- });
231
- const noneClient = new BundledSQSClient(mockSqsClient, {
232
- compression: CompressionAlgorithm.NONE,
233
- });
234
- const zstdItems = [
235
- makeTestEvent('zstd-1', 'compressed', 100),
236
- makeTestEvent('zstd-2', 'compressed', 200),
237
- ];
238
- const noneItems = [
239
- makeTestEvent('none-1', 'uncompressed', 300),
240
- makeTestEvent('none-2', 'uncompressed', 400),
241
- ];
242
- await zstdClient.sendBundled('test', zstdItems);
243
- const zstdEnvelopes = [...capturedEnvelopes];
244
- capturedEnvelopes = [];
245
- await noneClient.sendBundled('test', noneItems);
246
- const noneEnvelopes = [...capturedEnvelopes];
247
- const allEnvelopes = [...zstdEnvelopes, ...noneEnvelopes];
248
- const sqsRecords = simulateSqsDelivery(allEnvelopes);
249
- const { items: recoveredItems, stats } = await unbundleRecords(sqsRecords);
250
- expect(recoveredItems).toHaveLength(4);
251
- expect(stats.bundledSqsRecords).toBe(2);
252
- expect(stats.failedRecords).toBe(0);
253
- const zstdRecovered = recoveredItems.filter((item) => item.name === 'compressed');
254
- const noneRecovered = recoveredItems.filter((item) => item.name === 'uncompressed');
255
- expect(zstdRecovered).toHaveLength(2);
256
- expect(noneRecovered).toHaveLength(2);
257
- expect(zstdRecovered).toEqual(zstdItems);
258
- expect(noneRecovered).toEqual(noneItems);
259
- });
260
- it('handles mixed bundled and legacy messages', async () => {
261
- const bundledClient = new BundledSQSClient(mockSqsClient, {
262
- compression: CompressionAlgorithm.ZSTD,
263
- });
264
- const bundledItems = [
265
- makeTestEvent('bundled-1', 'bundled', 100),
266
- makeTestEvent('bundled-2', 'bundled', 200),
267
- ];
268
- await bundledClient.sendBundled('test', bundledItems);
269
- const legacyRecord = {
270
- messageId: 'legacy-msg-1',
271
- body: JSON.stringify(makeTestEvent('legacy-1', 'legacy', 999)),
272
- };
273
- const wrappedLegacyRecord = {
274
- messageId: 'legacy-msg-2',
275
- body: JSON.stringify({ messageBody: makeTestEvent('legacy-2', 'wrapped-legacy', 888) }),
276
- };
277
- const bundledRecords = simulateSqsDelivery(capturedEnvelopes);
278
- const allRecords = [...bundledRecords, legacyRecord, wrappedLegacyRecord];
279
- const { items: recoveredItems, stats } = await unbundleRecords(allRecords);
280
- expect(recoveredItems).toHaveLength(4);
281
- expect(stats.bundledSqsRecords).toBe(1);
282
- expect(stats.legacySqsRecords).toBe(2);
283
- expect(stats.failedRecords).toBe(0);
284
- });
285
- });
286
- describe('5. Error injection round-trip', () => {
287
- it('recovers valid bundles while reporting corrupted bundle in failedMessageIds', async () => {
288
- const bundledClient = new BundledSQSClient(mockSqsClient, {
289
- compression: CompressionAlgorithm.ZSTD,
290
- });
291
- const validItems1 = [makeTestEvent('valid-1', 'first-batch', 100)];
292
- const validItems2 = [makeTestEvent('valid-2', 'second-batch', 200)];
293
- await bundledClient.sendBundled('test', validItems1);
294
- const envelope1 = { ...capturedEnvelopes[0] };
295
- capturedEnvelopes = [];
296
- await bundledClient.sendBundled('test', validItems2);
297
- const envelope2 = { ...capturedEnvelopes[0] };
298
- const corruptedEnvelope = {
299
- v: 1,
300
- c: CompressionAlgorithm.ZSTD,
301
- n: 10,
302
- s: 1000,
303
- p: 'dGhpcyBpcyBub3QgdmFsaWQgenN0ZA==',
304
- };
305
- const records = [
306
- { messageId: 'valid-1', body: JSON.stringify({ messageBody: envelope1 }) },
307
- { messageId: 'corrupted', body: JSON.stringify({ messageBody: corruptedEnvelope }) },
308
- { messageId: 'valid-2', body: JSON.stringify({ messageBody: envelope2 }) },
309
- ];
310
- const { items: recoveredItems, failedMessageIds, stats } = await unbundleRecords(records);
311
- expect(recoveredItems).toHaveLength(2);
312
- expect(recoveredItems[0]?.id).toBe('valid-1');
313
- expect(recoveredItems[1]?.id).toBe('valid-2');
314
- expect(failedMessageIds).toContain('corrupted');
315
- expect(failedMessageIds).toHaveLength(1);
316
- expect(stats.bundledSqsRecords).toBe(2);
317
- expect(stats.failedRecords).toBe(1);
318
- expect(stats.totalItems).toBe(2);
319
- });
320
- it('handles invalid JSON gracefully', async () => {
321
- const bundledClient = new BundledSQSClient(mockSqsClient, {
322
- compression: CompressionAlgorithm.ZSTD,
323
- });
324
- const validItems = [makeTestEvent('valid', 'test', 100)];
325
- await bundledClient.sendBundled('test', validItems);
326
- const records = [
327
- ...simulateSqsDelivery(capturedEnvelopes),
328
- { messageId: 'invalid-json-1', body: 'not-valid-json{{{' },
329
- { messageId: 'invalid-json-2', body: '{"incomplete":' },
330
- { messageId: 'empty', body: '' },
331
- ];
332
- const { items: recoveredItems, failedMessageIds, stats } = await unbundleRecords(records);
333
- expect(recoveredItems).toHaveLength(1);
334
- expect(recoveredItems[0]?.id).toBe('valid');
335
- expect(failedMessageIds).toContain('invalid-json-1');
336
- expect(failedMessageIds).toContain('invalid-json-2');
337
- expect(failedMessageIds).toContain('empty');
338
- expect(failedMessageIds).toHaveLength(3);
339
- expect(stats.failedRecords).toBe(3);
340
- });
341
- it('handles decompression bomb protection', async () => {
342
- const largeItems = Array.from({ length: 1000 }, (_, i) => ({
343
- id: `item-${i}`,
344
- data: 'x'.repeat(1000),
345
- }));
346
- const json = JSON.stringify(largeItems);
347
- const compressed = await compress(Buffer.from(json, 'utf8'), CompressionAlgorithm.ZSTD, 3);
348
- const base64 = compressed.toString('base64');
349
- const bigEnvelope = {
350
- v: 1,
351
- c: CompressionAlgorithm.ZSTD,
352
- n: 1000,
353
- s: json.length,
354
- p: base64,
355
- };
356
- const records = [{ messageId: 'too-large', body: JSON.stringify({ messageBody: bigEnvelope }) }];
357
- const { failedMessageIds, stats } = await unbundleRecords(records, {
358
- maxDecompressedSizeBytes: 100 * 1024,
359
- });
360
- expect(failedMessageIds).toContain('too-large');
361
- expect(stats.failedRecords).toBe(1);
362
- });
363
- });
364
- describe('6. Realistic event types round-trip', () => {
365
- it('TrackingEvent-like structures survive round-trip exactly', async () => {
366
- const realisticMockSqs = {
367
- buildAndSendMessagesV2: jest.fn(async (_type, envelopes) => {
368
- capturedEnvelopes = [];
369
- capturedEnvelopes.push(...envelopes);
370
- return {
371
- successCount: envelopes.length,
372
- failedCount: 0,
373
- batchCount: 1,
374
- failedMessages: [],
375
- };
376
- }),
377
- queueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789/test-queue',
378
- limits: createSqsLimits(SQS_1MB),
379
- };
380
- const bundledClient = new BundledSQSClient(realisticMockSqs, {
381
- compression: CompressionAlgorithm.ZSTD,
382
- compressionLevel: 3,
383
- });
384
- const originalEvents = Array.from({ length: 100 }, (_, i) => makeRealisticTrackingEvent(i));
385
- await bundledClient.sendBundled('tracking-events', originalEvents);
386
- const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
387
- const { items: recoveredEvents, stats } = await unbundleRecords(sqsRecords);
388
- expect(recoveredEvents).toHaveLength(100);
389
- expect(stats.failedRecords).toBe(0);
390
- expect(recoveredEvents).toEqual(originalEvents);
391
- for (let i = 0; i < originalEvents.length; i++) {
392
- const original = originalEvents[i];
393
- const recovered = recoveredEvents[i];
394
- expect(recovered?.anonymousId).toBe(original?.anonymousId);
395
- expect(recovered?.context.page.url).toBe(original?.context.page.url);
396
- expect(recovered?.properties.price).toBe(original?.properties.price);
397
- if (original?.shopifyData) {
398
- expect(recovered?.shopifyData).toEqual(original.shopifyData);
399
- }
400
- }
401
- });
402
- it('preserves nested object structures exactly', async () => {
403
- const bundledClient = new BundledSQSClient(mockSqsClient, {
404
- compression: CompressionAlgorithm.ZSTD,
405
- });
406
- const deeplyNestedItems = [
407
- {
408
- id: 'nested-1',
409
- name: 'deep-nesting',
410
- nested: {
411
- level1: {
412
- level2: {
413
- deep: 'very deep value',
414
- },
415
- },
416
- },
417
- },
418
- {
419
- id: 'nested-2',
420
- name: 'with-arrays',
421
- tags: ['tag1', 'tag2', 'tag3'],
422
- metadata: {
423
- array: [1, 2, 3],
424
- object: { a: 1, b: 2 },
425
- mixed: [{ key: 'value' }, [1, 2, 3]],
426
- },
427
- },
428
- ];
429
- await bundledClient.sendBundled('test', deeplyNestedItems);
430
- const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
431
- const { items: recoveredItems } = await unbundleRecords(sqsRecords);
432
- expect(recoveredItems).toEqual(deeplyNestedItems);
433
- expect(recoveredItems[0]?.nested?.level1.level2.deep).toBe('very deep value');
434
- expect(recoveredItems[1]?.tags).toEqual(['tag1', 'tag2', 'tag3']);
435
- });
436
- });
437
- describe('7. High compression ratio round-trip', () => {
438
- it('highly repetitive data compresses and decompresses correctly', async () => {
439
- const bundledClient = new BundledSQSClient(mockSqsClient, {
440
- compression: CompressionAlgorithm.ZSTD,
441
- compressionLevel: 3,
442
- });
443
- const repetitiveString = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
444
- const originalItems = Array.from({ length: 200 }, (_, i) => ({
445
- id: `repetitive-${i}`,
446
- name: repetitiveString,
447
- value: 42,
448
- metadata: {
449
- field1: repetitiveString,
450
- field2: repetitiveString,
451
- field3: repetitiveString,
452
- field4: repetitiveString,
453
- field5: repetitiveString,
454
- },
455
- }));
456
- const originalSizeBytes = Buffer.byteLength(JSON.stringify(originalItems), 'utf8');
457
- await bundledClient.sendBundled('test', originalItems);
458
- let totalCompressedSize = 0;
459
- for (const envelope of capturedEnvelopes) {
460
- expect(typeof envelope.p).toBe('string');
461
- totalCompressedSize += Buffer.byteLength(envelope.p, 'utf8');
462
- }
463
- const compressionRatio = originalSizeBytes / totalCompressedSize;
464
- expect(compressionRatio).toBeGreaterThan(5);
465
- const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
466
- const { items: recoveredItems, stats } = await unbundleRecords(sqsRecords);
467
- expect(recoveredItems).toHaveLength(200);
468
- expect(recoveredItems).toEqual(originalItems);
469
- expect(stats.failedRecords).toBe(0);
470
- for (const item of recoveredItems) {
471
- expect(item.name).toBe(repetitiveString);
472
- expect(item.value).toBe(42);
473
- expect(item.metadata?.field1).toBe(repetitiveString);
474
- }
475
- });
476
- it('varying compression levels all round-trip correctly', async () => {
477
- const items = Array.from({ length: 50 }, (_, i) => makeTestEvent(`level-test-${i}`, 'compression-level', i));
478
- for (const level of [1, 3, 9, 15]) {
479
- capturedEnvelopes = [];
480
- const bundledClient = new BundledSQSClient(mockSqsClient, {
481
- compression: CompressionAlgorithm.ZSTD,
482
- compressionLevel: level,
483
- });
484
- await bundledClient.sendBundled('test', items);
485
- const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
486
- const { items: recoveredItems, stats } = await unbundleRecords(sqsRecords);
487
- expect(recoveredItems).toEqual(items);
488
- expect(stats.failedRecords).toBe(0);
489
- }
490
- });
491
- });
492
- describe('8. Edge cases', () => {
493
- it('empty arrays survive round-trip', async () => {
494
- const bundledClient = new BundledSQSClient(mockSqsClient, {
495
- compression: CompressionAlgorithm.ZSTD,
496
- });
497
- const result = await bundledClient.sendBundled('test', []);
498
- expect(result.totalItems).toBe(0);
499
- expect(capturedEnvelopes).toHaveLength(0);
500
- });
501
- it('single item survives round-trip', async () => {
502
- const bundledClient = new BundledSQSClient(mockSqsClient, {
503
- compression: CompressionAlgorithm.ZSTD,
504
- });
505
- const singleItem = [makeTestEvent('single', 'lone-wolf', 999)];
506
- await bundledClient.sendBundled('test', singleItem);
507
- const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
508
- const { items: recoveredItems } = await unbundleRecords(sqsRecords);
509
- expect(recoveredItems).toHaveLength(1);
510
- expect(recoveredItems).toEqual(singleItem);
511
- });
512
- it('special characters survive round-trip', async () => {
513
- const bundledClient = new BundledSQSClient(mockSqsClient, {
514
- compression: CompressionAlgorithm.ZSTD,
515
- });
516
- const specialCharsItems = [
517
- {
518
- id: 'unicode-日本語',
519
- name: '中文测试',
520
- metadata: {
521
- emoji: '🎉🚀✨💯',
522
- rtl: 'مرحبا بالعالم',
523
- escape: '\\n\\t\\r',
524
- quotes: '"double" \'single\' `backtick`',
525
- angle: '<script>alert("xss")</script>',
526
- null_char: 'before\x00after',
527
- },
528
- },
529
- ];
530
- await bundledClient.sendBundled('test', specialCharsItems);
531
- const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
532
- const { items: recoveredItems } = await unbundleRecords(sqsRecords);
533
- expect(recoveredItems).toEqual(specialCharsItems);
534
- });
535
- it('null and undefined values are handled correctly', async () => {
536
- const bundledClient = new BundledSQSClient(mockSqsClient, {
537
- compression: CompressionAlgorithm.ZSTD,
538
- });
539
- const itemsWithNulls = [
540
- { id: 'null-test', name: 'test', value: undefined },
541
- {
542
- id: 'explicit-null',
543
- name: 'test',
544
- metadata: { key: null },
545
- },
546
- ];
547
- await bundledClient.sendBundled('test', itemsWithNulls);
548
- const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
549
- const { items: recoveredItems } = await unbundleRecords(sqsRecords);
550
- expect(recoveredItems[0]?.value).toBeUndefined();
551
- expect(recoveredItems[1]?.metadata?.key).toBeNull();
552
- });
553
- it('recordMap correctly tracks items back to SQS messages', async () => {
554
- const bundledClient = new BundledSQSClient(mockSqsClient, {
555
- compression: CompressionAlgorithm.ZSTD,
556
- maxItemsPerBundle: 3,
557
- });
558
- const items = Array.from({ length: 10 }, (_, i) => makeTestEvent(`item-${i}`, 'tracking', i));
559
- await bundledClient.sendBundled('test', items);
560
- const sqsRecords = capturedEnvelopes.map((env, i) => ({
561
- messageId: `bundle-${i}`,
562
- body: JSON.stringify({ messageBody: env }),
563
- }));
564
- const { items: recoveredItems, recordMap, stats } = await unbundleRecords(sqsRecords);
565
- expect(recoveredItems).toHaveLength(10);
566
- const messageIdCounts = new Map();
567
- for (const item of recoveredItems) {
568
- const messageId = recordMap.get(item);
569
- expect(messageId).toBeDefined();
570
- if (messageId) {
571
- messageIdCounts.set(messageId, (messageIdCounts.get(messageId) ?? 0) + 1);
572
- }
573
- }
574
- expect(messageIdCounts.size).toBe(capturedEnvelopes.length);
575
- for (const [messageId, count] of messageIdCounts) {
576
- expect(count).toBeLessThanOrEqual(3);
577
- expect(messageId).toMatch(/^bundle-\d+$/);
578
- }
579
- expect(stats.bundledSqsRecords).toBe(capturedEnvelopes.length);
580
- });
581
- });
582
- });
1
+ import { BundledSQSClient } from '../../clients/generic/sqs-bundled-client';
2
+ import { CompressionAlgorithm } from '../../clients/generic/sqs-bundled-client.types';
3
+ import { unbundleRecords } from '../../clients/generic/sqs-unbundle';
4
+ import { compress } from '../../utils/compression';
5
+ import { createSqsLimits, SQS_1MB } from '../../constants/sqs';
6
+ jest.mock('../../helpers/logging-helper', () => ({
7
+ Logger: {
8
+ debug: jest.fn(),
9
+ info: jest.fn(),
10
+ warn: jest.fn(),
11
+ error: jest.fn(),
12
+ },
13
+ }));
14
+ function makeTestEvent(id, name = 'test', value, metadata) {
15
+ return { id, name, value, metadata };
16
+ }
17
+ function makeRealisticTrackingEvent(index) {
18
+ return {
19
+ anonymousId: `anon-${index}-${Math.random().toString(36).substring(7)}`,
20
+ accountId: `acc-${index % 10}`,
21
+ pixelId: `pixel-${index % 5}`,
22
+ eventType: ['track', 'identify', 'page'][index % 3] ?? 'track',
23
+ eventName: ['purchase', 'add_to_cart', 'page_view', 'begin_checkout'][index % 4] ?? 'track',
24
+ timestamp: new Date(Date.now() - index * 1000).toISOString(),
25
+ context: {
26
+ page: {
27
+ url: `https://example.com/product/${index}`,
28
+ path: `/product/${index}`,
29
+ title: `Product ${index} - Example Store`,
30
+ referrer: index % 3 === 0 ? 'https://google.com' : '',
31
+ },
32
+ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
33
+ ip: `192.168.${index % 256}.${(index * 7) % 256}`,
34
+ locale: ['en-US', 'en-GB', 'de-DE', 'fr-FR'][index % 4] ?? 'en-US',
35
+ timezone: 'America/New_York',
36
+ },
37
+ properties: {
38
+ productId: `prod-${index}`,
39
+ productName: `Amazing Product ${index}`,
40
+ price: 29.99 + (index % 100),
41
+ currency: 'USD',
42
+ quantity: (index % 5) + 1,
43
+ category: ['Electronics', 'Clothing', 'Home', 'Sports'][index % 4],
44
+ customFields: {
45
+ brand: `Brand${index % 20}`,
46
+ sku: `SKU-${index}-${Date.now()}`,
47
+ inStock: index % 2 === 0,
48
+ },
49
+ },
50
+ shopifyData: index % 3 === 0
51
+ ? {
52
+ checkoutToken: `checkout-${index}`,
53
+ orderId: index % 5 === 0 ? `order-${index}` : undefined,
54
+ customerEmail: `customer${index}@example.com`,
55
+ lineItems: Array.from({ length: (index % 3) + 1 }, (_, j) => ({
56
+ variantId: `variant-${index}-${j}`,
57
+ title: `Line Item ${j}`,
58
+ price: 19.99 + j * 10,
59
+ quantity: j + 1,
60
+ })),
61
+ }
62
+ : undefined,
63
+ };
64
+ }
65
+ function simulateSqsDelivery(envelopes) {
66
+ return envelopes.map((env, i) => ({
67
+ messageId: `msg-${i}-${Date.now()}`,
68
+ body: JSON.stringify({ messageBody: env }),
69
+ }));
70
+ }
71
+ describe('Full Round-Trip: Producer → Consumer', () => {
72
+ let mockSqsClient;
73
+ let capturedEnvelopes;
74
+ beforeEach(() => {
75
+ capturedEnvelopes = [];
76
+ mockSqsClient = {
77
+ buildAndSendMessagesV2: jest.fn(async (_type, envelopes) => {
78
+ capturedEnvelopes.push(...envelopes);
79
+ return {
80
+ successCount: envelopes.length,
81
+ failedCount: 0,
82
+ batchCount: 1,
83
+ failedMessages: [],
84
+ };
85
+ }),
86
+ queueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789/test-queue',
87
+ limits: createSqsLimits(SQS_1MB),
88
+ };
89
+ });
90
+ describe('1. Basic round-trip test (100 items)', () => {
91
+ it('100 items survive complete round-trip with deep equality', async () => {
92
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
93
+ compression: CompressionAlgorithm.ZSTD,
94
+ compressionLevel: 3,
95
+ });
96
+ const originalItems = Array.from({ length: 100 }, (_, i) => ({
97
+ id: `event-${i}`,
98
+ name: 'purchase',
99
+ value: i * 99.99,
100
+ metadata: { source: 'test', index: i },
101
+ }));
102
+ await bundledClient.sendBundled('test', originalItems);
103
+ expect(capturedEnvelopes.length).toBeGreaterThanOrEqual(1);
104
+ const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
105
+ const { items: recoveredItems, stats } = await unbundleRecords(sqsRecords);
106
+ expect(recoveredItems).toHaveLength(100);
107
+ expect(recoveredItems).toEqual(originalItems);
108
+ expect(stats.bundledSqsRecords).toBe(capturedEnvelopes.length);
109
+ expect(stats.failedRecords).toBe(0);
110
+ });
111
+ it('preserves all primitive types correctly', async () => {
112
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
113
+ compression: CompressionAlgorithm.ZSTD,
114
+ });
115
+ const originalItems = [
116
+ { id: 'str', name: 'string-test', value: undefined },
117
+ { id: 'num', name: 'number-test', value: 123.456 },
118
+ { id: 'zero', name: 'zero-test', value: 0 },
119
+ { id: 'neg', name: 'negative-test', value: -999.99 },
120
+ { id: 'big', name: 'big-number', value: Number.MAX_SAFE_INTEGER },
121
+ ];
122
+ await bundledClient.sendBundled('test', originalItems);
123
+ const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
124
+ const { items: recoveredItems } = await unbundleRecords(sqsRecords);
125
+ expect(recoveredItems).toEqual(originalItems);
126
+ });
127
+ });
128
+ describe('2. Large scale round-trip (1000 items)', () => {
129
+ it('1000 items survive round-trip with no data loss', async () => {
130
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
131
+ compression: CompressionAlgorithm.ZSTD,
132
+ compressionLevel: 3,
133
+ });
134
+ const originalItems = Array.from({ length: 1000 }, (_, i) => ({
135
+ id: `event-${i.toString().padStart(4, '0')}`,
136
+ name: `type-${i % 10}`,
137
+ value: i * 1.5,
138
+ metadata: {
139
+ batch: Math.floor(i / 100),
140
+ position: i % 100,
141
+ timestamp: Date.now() + i,
142
+ },
143
+ }));
144
+ await bundledClient.sendBundled('test', originalItems);
145
+ const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
146
+ const { items: recoveredItems, stats } = await unbundleRecords(sqsRecords);
147
+ expect(recoveredItems).toHaveLength(1000);
148
+ expect(stats.totalItems).toBe(1000);
149
+ expect(stats.failedRecords).toBe(0);
150
+ const recoveredIds = recoveredItems.map((item) => item.id);
151
+ const originalIds = originalItems.map((item) => item.id);
152
+ expect(new Set(recoveredIds)).toEqual(new Set(originalIds));
153
+ expect(recoveredItems).toEqual(originalItems);
154
+ });
155
+ it('preserves order within each bundle', async () => {
156
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
157
+ compression: CompressionAlgorithm.ZSTD,
158
+ maxItemsPerBundle: 100,
159
+ });
160
+ const originalItems = Array.from({ length: 500 }, (_, i) => makeTestEvent(`seq-${i}`, 'ordered', i));
161
+ await bundledClient.sendBundled('test', originalItems);
162
+ const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
163
+ const { items: recoveredItems } = await unbundleRecords(sqsRecords);
164
+ let currentBundleStart = 0;
165
+ for (const envelope of capturedEnvelopes) {
166
+ const bundleSize = envelope.n;
167
+ const bundleItems = recoveredItems.slice(currentBundleStart, currentBundleStart + bundleSize);
168
+ for (let j = 1; j < bundleItems.length; j++) {
169
+ const prevValue = bundleItems[j - 1]?.value ?? 0;
170
+ const currValue = bundleItems[j]?.value ?? 0;
171
+ expect(currValue).toBeGreaterThan(prevValue);
172
+ }
173
+ currentBundleStart += bundleSize;
174
+ }
175
+ });
176
+ });
177
+ describe('3. Compression round-trip verification', () => {
178
+ it('ZSTD compressed data decompresses to byte-exact JSON', async () => {
179
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
180
+ compression: CompressionAlgorithm.ZSTD,
181
+ compressionLevel: 5,
182
+ });
183
+ const originalItems = Array.from({ length: 50 }, (_, i) => ({
184
+ id: `compress-test-${i}`,
185
+ name: 'compression-verification',
186
+ value: i * 123.456789,
187
+ metadata: {
188
+ unicode: '日本語テスト',
189
+ emoji: '🚀✨🎉',
190
+ special: 'line\nbreak\ttab\r\nwindows',
191
+ quotes: '"double" and \'single\'',
192
+ },
193
+ }));
194
+ const originalJson = JSON.stringify(originalItems);
195
+ await bundledClient.sendBundled('test', originalItems);
196
+ const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
197
+ const { items: recoveredItems } = await unbundleRecords(sqsRecords);
198
+ const recoveredJson = JSON.stringify(recoveredItems);
199
+ expect(recoveredJson).toBe(originalJson);
200
+ expect(recoveredItems).toEqual(originalItems);
201
+ });
202
+ it('verifies actual compression occurred', async () => {
203
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
204
+ compression: CompressionAlgorithm.ZSTD,
205
+ compressionLevel: 3,
206
+ });
207
+ const originalItems = Array.from({ length: 200 }, (_, i) => ({
208
+ id: `item-${i}`,
209
+ name: 'repetitive-data-for-compression',
210
+ value: i,
211
+ metadata: {
212
+ commonField1: 'this is repeated many times',
213
+ commonField2: 'another repeated value',
214
+ },
215
+ }));
216
+ const originalSizeBytes = Buffer.byteLength(JSON.stringify(originalItems), 'utf8');
217
+ await bundledClient.sendBundled('test', originalItems);
218
+ for (const envelope of capturedEnvelopes) {
219
+ expect(envelope.c).toBe(CompressionAlgorithm.ZSTD);
220
+ expect(typeof envelope.p).toBe('string');
221
+ const compressedSizeBytes = Buffer.byteLength(envelope.p, 'utf8');
222
+ expect(compressedSizeBytes).toBeLessThan(originalSizeBytes);
223
+ }
224
+ });
225
+ });
226
+ describe('4. Mixed message types round-trip', () => {
227
+ it('handles mix of NONE and ZSTD compression in same batch', async () => {
228
+ const zstdClient = new BundledSQSClient(mockSqsClient, {
229
+ compression: CompressionAlgorithm.ZSTD,
230
+ });
231
+ const noneClient = new BundledSQSClient(mockSqsClient, {
232
+ compression: CompressionAlgorithm.NONE,
233
+ });
234
+ const zstdItems = [
235
+ makeTestEvent('zstd-1', 'compressed', 100),
236
+ makeTestEvent('zstd-2', 'compressed', 200),
237
+ ];
238
+ const noneItems = [
239
+ makeTestEvent('none-1', 'uncompressed', 300),
240
+ makeTestEvent('none-2', 'uncompressed', 400),
241
+ ];
242
+ await zstdClient.sendBundled('test', zstdItems);
243
+ const zstdEnvelopes = [...capturedEnvelopes];
244
+ capturedEnvelopes = [];
245
+ await noneClient.sendBundled('test', noneItems);
246
+ const noneEnvelopes = [...capturedEnvelopes];
247
+ const allEnvelopes = [...zstdEnvelopes, ...noneEnvelopes];
248
+ const sqsRecords = simulateSqsDelivery(allEnvelopes);
249
+ const { items: recoveredItems, stats } = await unbundleRecords(sqsRecords);
250
+ expect(recoveredItems).toHaveLength(4);
251
+ expect(stats.bundledSqsRecords).toBe(2);
252
+ expect(stats.failedRecords).toBe(0);
253
+ const zstdRecovered = recoveredItems.filter((item) => item.name === 'compressed');
254
+ const noneRecovered = recoveredItems.filter((item) => item.name === 'uncompressed');
255
+ expect(zstdRecovered).toHaveLength(2);
256
+ expect(noneRecovered).toHaveLength(2);
257
+ expect(zstdRecovered).toEqual(zstdItems);
258
+ expect(noneRecovered).toEqual(noneItems);
259
+ });
260
+ it('handles mixed bundled and legacy messages', async () => {
261
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
262
+ compression: CompressionAlgorithm.ZSTD,
263
+ });
264
+ const bundledItems = [
265
+ makeTestEvent('bundled-1', 'bundled', 100),
266
+ makeTestEvent('bundled-2', 'bundled', 200),
267
+ ];
268
+ await bundledClient.sendBundled('test', bundledItems);
269
+ const legacyRecord = {
270
+ messageId: 'legacy-msg-1',
271
+ body: JSON.stringify(makeTestEvent('legacy-1', 'legacy', 999)),
272
+ };
273
+ const wrappedLegacyRecord = {
274
+ messageId: 'legacy-msg-2',
275
+ body: JSON.stringify({ messageBody: makeTestEvent('legacy-2', 'wrapped-legacy', 888) }),
276
+ };
277
+ const bundledRecords = simulateSqsDelivery(capturedEnvelopes);
278
+ const allRecords = [...bundledRecords, legacyRecord, wrappedLegacyRecord];
279
+ const { items: recoveredItems, stats } = await unbundleRecords(allRecords);
280
+ expect(recoveredItems).toHaveLength(4);
281
+ expect(stats.bundledSqsRecords).toBe(1);
282
+ expect(stats.legacySqsRecords).toBe(2);
283
+ expect(stats.failedRecords).toBe(0);
284
+ });
285
+ });
286
+ describe('5. Error injection round-trip', () => {
287
+ it('recovers valid bundles while reporting corrupted bundle in failedMessageIds', async () => {
288
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
289
+ compression: CompressionAlgorithm.ZSTD,
290
+ });
291
+ const validItems1 = [makeTestEvent('valid-1', 'first-batch', 100)];
292
+ const validItems2 = [makeTestEvent('valid-2', 'second-batch', 200)];
293
+ await bundledClient.sendBundled('test', validItems1);
294
+ const envelope1 = { ...capturedEnvelopes[0] };
295
+ capturedEnvelopes = [];
296
+ await bundledClient.sendBundled('test', validItems2);
297
+ const envelope2 = { ...capturedEnvelopes[0] };
298
+ const corruptedEnvelope = {
299
+ v: 1,
300
+ c: CompressionAlgorithm.ZSTD,
301
+ n: 10,
302
+ s: 1000,
303
+ p: 'dGhpcyBpcyBub3QgdmFsaWQgenN0ZA==',
304
+ };
305
+ const records = [
306
+ { messageId: 'valid-1', body: JSON.stringify({ messageBody: envelope1 }) },
307
+ { messageId: 'corrupted', body: JSON.stringify({ messageBody: corruptedEnvelope }) },
308
+ { messageId: 'valid-2', body: JSON.stringify({ messageBody: envelope2 }) },
309
+ ];
310
+ const { items: recoveredItems, failedMessageIds, stats } = await unbundleRecords(records);
311
+ expect(recoveredItems).toHaveLength(2);
312
+ expect(recoveredItems[0]?.id).toBe('valid-1');
313
+ expect(recoveredItems[1]?.id).toBe('valid-2');
314
+ expect(failedMessageIds).toContain('corrupted');
315
+ expect(failedMessageIds).toHaveLength(1);
316
+ expect(stats.bundledSqsRecords).toBe(2);
317
+ expect(stats.failedRecords).toBe(1);
318
+ expect(stats.totalItems).toBe(2);
319
+ });
320
+ it('handles invalid JSON gracefully', async () => {
321
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
322
+ compression: CompressionAlgorithm.ZSTD,
323
+ });
324
+ const validItems = [makeTestEvent('valid', 'test', 100)];
325
+ await bundledClient.sendBundled('test', validItems);
326
+ const records = [
327
+ ...simulateSqsDelivery(capturedEnvelopes),
328
+ { messageId: 'invalid-json-1', body: 'not-valid-json{{{' },
329
+ { messageId: 'invalid-json-2', body: '{"incomplete":' },
330
+ { messageId: 'empty', body: '' },
331
+ ];
332
+ const { items: recoveredItems, failedMessageIds, stats } = await unbundleRecords(records);
333
+ expect(recoveredItems).toHaveLength(1);
334
+ expect(recoveredItems[0]?.id).toBe('valid');
335
+ expect(failedMessageIds).toContain('invalid-json-1');
336
+ expect(failedMessageIds).toContain('invalid-json-2');
337
+ expect(failedMessageIds).toContain('empty');
338
+ expect(failedMessageIds).toHaveLength(3);
339
+ expect(stats.failedRecords).toBe(3);
340
+ });
341
+ it('handles decompression bomb protection', async () => {
342
+ const largeItems = Array.from({ length: 1000 }, (_, i) => ({
343
+ id: `item-${i}`,
344
+ data: 'x'.repeat(1000),
345
+ }));
346
+ const json = JSON.stringify(largeItems);
347
+ const compressed = await compress(Buffer.from(json, 'utf8'), CompressionAlgorithm.ZSTD, 3);
348
+ const base64 = compressed.toString('base64');
349
+ const bigEnvelope = {
350
+ v: 1,
351
+ c: CompressionAlgorithm.ZSTD,
352
+ n: 1000,
353
+ s: json.length,
354
+ p: base64,
355
+ };
356
+ const records = [{ messageId: 'too-large', body: JSON.stringify({ messageBody: bigEnvelope }) }];
357
+ const { failedMessageIds, stats } = await unbundleRecords(records, {
358
+ maxDecompressedSizeBytes: 100 * 1024,
359
+ });
360
+ expect(failedMessageIds).toContain('too-large');
361
+ expect(stats.failedRecords).toBe(1);
362
+ });
363
+ });
364
+ describe('6. Realistic event types round-trip', () => {
365
+ it('TrackingEvent-like structures survive round-trip exactly', async () => {
366
+ const realisticMockSqs = {
367
+ buildAndSendMessagesV2: jest.fn(async (_type, envelopes) => {
368
+ capturedEnvelopes = [];
369
+ capturedEnvelopes.push(...envelopes);
370
+ return {
371
+ successCount: envelopes.length,
372
+ failedCount: 0,
373
+ batchCount: 1,
374
+ failedMessages: [],
375
+ };
376
+ }),
377
+ queueUrl: 'https://sqs.us-east-1.amazonaws.com/123456789/test-queue',
378
+ limits: createSqsLimits(SQS_1MB),
379
+ };
380
+ const bundledClient = new BundledSQSClient(realisticMockSqs, {
381
+ compression: CompressionAlgorithm.ZSTD,
382
+ compressionLevel: 3,
383
+ });
384
+ const originalEvents = Array.from({ length: 100 }, (_, i) => makeRealisticTrackingEvent(i));
385
+ await bundledClient.sendBundled('tracking-events', originalEvents);
386
+ const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
387
+ const { items: recoveredEvents, stats } = await unbundleRecords(sqsRecords);
388
+ expect(recoveredEvents).toHaveLength(100);
389
+ expect(stats.failedRecords).toBe(0);
390
+ expect(recoveredEvents).toEqual(originalEvents);
391
+ for (let i = 0; i < originalEvents.length; i++) {
392
+ const original = originalEvents[i];
393
+ const recovered = recoveredEvents[i];
394
+ expect(recovered?.anonymousId).toBe(original?.anonymousId);
395
+ expect(recovered?.context.page.url).toBe(original?.context.page.url);
396
+ expect(recovered?.properties.price).toBe(original?.properties.price);
397
+ if (original?.shopifyData) {
398
+ expect(recovered?.shopifyData).toEqual(original.shopifyData);
399
+ }
400
+ }
401
+ });
402
+ it('preserves nested object structures exactly', async () => {
403
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
404
+ compression: CompressionAlgorithm.ZSTD,
405
+ });
406
+ const deeplyNestedItems = [
407
+ {
408
+ id: 'nested-1',
409
+ name: 'deep-nesting',
410
+ nested: {
411
+ level1: {
412
+ level2: {
413
+ deep: 'very deep value',
414
+ },
415
+ },
416
+ },
417
+ },
418
+ {
419
+ id: 'nested-2',
420
+ name: 'with-arrays',
421
+ tags: ['tag1', 'tag2', 'tag3'],
422
+ metadata: {
423
+ array: [1, 2, 3],
424
+ object: { a: 1, b: 2 },
425
+ mixed: [{ key: 'value' }, [1, 2, 3]],
426
+ },
427
+ },
428
+ ];
429
+ await bundledClient.sendBundled('test', deeplyNestedItems);
430
+ const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
431
+ const { items: recoveredItems } = await unbundleRecords(sqsRecords);
432
+ expect(recoveredItems).toEqual(deeplyNestedItems);
433
+ expect(recoveredItems[0]?.nested?.level1.level2.deep).toBe('very deep value');
434
+ expect(recoveredItems[1]?.tags).toEqual(['tag1', 'tag2', 'tag3']);
435
+ });
436
+ });
437
+ describe('7. High compression ratio round-trip', () => {
438
+ it('highly repetitive data compresses and decompresses correctly', async () => {
439
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
440
+ compression: CompressionAlgorithm.ZSTD,
441
+ compressionLevel: 3,
442
+ });
443
+ const repetitiveString = 'AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
444
+ const originalItems = Array.from({ length: 200 }, (_, i) => ({
445
+ id: `repetitive-${i}`,
446
+ name: repetitiveString,
447
+ value: 42,
448
+ metadata: {
449
+ field1: repetitiveString,
450
+ field2: repetitiveString,
451
+ field3: repetitiveString,
452
+ field4: repetitiveString,
453
+ field5: repetitiveString,
454
+ },
455
+ }));
456
+ const originalSizeBytes = Buffer.byteLength(JSON.stringify(originalItems), 'utf8');
457
+ await bundledClient.sendBundled('test', originalItems);
458
+ let totalCompressedSize = 0;
459
+ for (const envelope of capturedEnvelopes) {
460
+ expect(typeof envelope.p).toBe('string');
461
+ totalCompressedSize += Buffer.byteLength(envelope.p, 'utf8');
462
+ }
463
+ const compressionRatio = originalSizeBytes / totalCompressedSize;
464
+ expect(compressionRatio).toBeGreaterThan(5);
465
+ const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
466
+ const { items: recoveredItems, stats } = await unbundleRecords(sqsRecords);
467
+ expect(recoveredItems).toHaveLength(200);
468
+ expect(recoveredItems).toEqual(originalItems);
469
+ expect(stats.failedRecords).toBe(0);
470
+ for (const item of recoveredItems) {
471
+ expect(item.name).toBe(repetitiveString);
472
+ expect(item.value).toBe(42);
473
+ expect(item.metadata?.field1).toBe(repetitiveString);
474
+ }
475
+ });
476
+ it('varying compression levels all round-trip correctly', async () => {
477
+ const items = Array.from({ length: 50 }, (_, i) => makeTestEvent(`level-test-${i}`, 'compression-level', i));
478
+ for (const level of [1, 3, 9, 15]) {
479
+ capturedEnvelopes = [];
480
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
481
+ compression: CompressionAlgorithm.ZSTD,
482
+ compressionLevel: level,
483
+ });
484
+ await bundledClient.sendBundled('test', items);
485
+ const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
486
+ const { items: recoveredItems, stats } = await unbundleRecords(sqsRecords);
487
+ expect(recoveredItems).toEqual(items);
488
+ expect(stats.failedRecords).toBe(0);
489
+ }
490
+ });
491
+ });
492
+ describe('8. Edge cases', () => {
493
+ it('empty arrays survive round-trip', async () => {
494
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
495
+ compression: CompressionAlgorithm.ZSTD,
496
+ });
497
+ const result = await bundledClient.sendBundled('test', []);
498
+ expect(result.totalItems).toBe(0);
499
+ expect(capturedEnvelopes).toHaveLength(0);
500
+ });
501
+ it('single item survives round-trip', async () => {
502
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
503
+ compression: CompressionAlgorithm.ZSTD,
504
+ });
505
+ const singleItem = [makeTestEvent('single', 'lone-wolf', 999)];
506
+ await bundledClient.sendBundled('test', singleItem);
507
+ const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
508
+ const { items: recoveredItems } = await unbundleRecords(sqsRecords);
509
+ expect(recoveredItems).toHaveLength(1);
510
+ expect(recoveredItems).toEqual(singleItem);
511
+ });
512
+ it('special characters survive round-trip', async () => {
513
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
514
+ compression: CompressionAlgorithm.ZSTD,
515
+ });
516
+ const specialCharsItems = [
517
+ {
518
+ id: 'unicode-日本語',
519
+ name: '中文测试',
520
+ metadata: {
521
+ emoji: '🎉🚀✨💯',
522
+ rtl: 'مرحبا بالعالم',
523
+ escape: '\\n\\t\\r',
524
+ quotes: '"double" \'single\' `backtick`',
525
+ angle: '<script>alert("xss")</script>',
526
+ null_char: 'before\x00after',
527
+ },
528
+ },
529
+ ];
530
+ await bundledClient.sendBundled('test', specialCharsItems);
531
+ const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
532
+ const { items: recoveredItems } = await unbundleRecords(sqsRecords);
533
+ expect(recoveredItems).toEqual(specialCharsItems);
534
+ });
535
+ it('null and undefined values are handled correctly', async () => {
536
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
537
+ compression: CompressionAlgorithm.ZSTD,
538
+ });
539
+ const itemsWithNulls = [
540
+ { id: 'null-test', name: 'test', value: undefined },
541
+ {
542
+ id: 'explicit-null',
543
+ name: 'test',
544
+ metadata: { key: null },
545
+ },
546
+ ];
547
+ await bundledClient.sendBundled('test', itemsWithNulls);
548
+ const sqsRecords = simulateSqsDelivery(capturedEnvelopes);
549
+ const { items: recoveredItems } = await unbundleRecords(sqsRecords);
550
+ expect(recoveredItems[0]?.value).toBeUndefined();
551
+ expect(recoveredItems[1]?.metadata?.key).toBeNull();
552
+ });
553
+ it('recordMap correctly tracks items back to SQS messages', async () => {
554
+ const bundledClient = new BundledSQSClient(mockSqsClient, {
555
+ compression: CompressionAlgorithm.ZSTD,
556
+ maxItemsPerBundle: 3,
557
+ });
558
+ const items = Array.from({ length: 10 }, (_, i) => makeTestEvent(`item-${i}`, 'tracking', i));
559
+ await bundledClient.sendBundled('test', items);
560
+ const sqsRecords = capturedEnvelopes.map((env, i) => ({
561
+ messageId: `bundle-${i}`,
562
+ body: JSON.stringify({ messageBody: env }),
563
+ }));
564
+ const { items: recoveredItems, recordMap, stats } = await unbundleRecords(sqsRecords);
565
+ expect(recoveredItems).toHaveLength(10);
566
+ const messageIdCounts = new Map();
567
+ for (const item of recoveredItems) {
568
+ const messageId = recordMap.get(item);
569
+ expect(messageId).toBeDefined();
570
+ if (messageId) {
571
+ messageIdCounts.set(messageId, (messageIdCounts.get(messageId) ?? 0) + 1);
572
+ }
573
+ }
574
+ expect(messageIdCounts.size).toBe(capturedEnvelopes.length);
575
+ for (const [messageId, count] of messageIdCounts) {
576
+ expect(count).toBeLessThanOrEqual(3);
577
+ expect(messageId).toMatch(/^bundle-\d+$/);
578
+ }
579
+ expect(stats.bundledSqsRecords).toBe(capturedEnvelopes.length);
580
+ });
581
+ });
582
+ });
583
583
  //# sourceMappingURL=sqs-bundling-roundtrip.spec.js.map