@adtrackify/at-service-common 4.0.4 → 4.0.5

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