@amplitude/analytics-core 2.5.5 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/lib/cjs/__mocks__/logger.js +1 -0
  2. package/lib/cjs/__mocks__/logger.js.map +1 -1
  3. package/lib/cjs/analytics-connector.d.ts +5 -0
  4. package/lib/cjs/analytics-connector.d.ts.map +1 -0
  5. package/lib/cjs/analytics-connector.js +20 -0
  6. package/lib/cjs/analytics-connector.js.map +1 -0
  7. package/lib/cjs/config.d.ts +107 -3
  8. package/lib/cjs/config.d.ts.map +1 -1
  9. package/lib/cjs/config.js +4 -3
  10. package/lib/cjs/config.js.map +1 -1
  11. package/lib/cjs/cookie-name.d.ts +3 -0
  12. package/lib/cjs/cookie-name.d.ts.map +1 -0
  13. package/lib/cjs/cookie-name.js +15 -0
  14. package/lib/cjs/cookie-name.js.map +1 -0
  15. package/lib/cjs/core-client.d.ts +154 -14
  16. package/lib/cjs/core-client.d.ts.map +1 -1
  17. package/lib/cjs/core-client.js +2 -1
  18. package/lib/cjs/core-client.js.map +1 -1
  19. package/lib/cjs/event-bridge/event-bridge-channel.d.ts +4 -3
  20. package/lib/cjs/event-bridge/event-bridge-channel.d.ts.map +1 -1
  21. package/lib/cjs/event-bridge/event-bridge-channel.js +1 -0
  22. package/lib/cjs/event-bridge/event-bridge-channel.js.map +1 -1
  23. package/lib/cjs/event-bridge/event-bridge-container.d.ts +1 -1
  24. package/lib/cjs/event-bridge/event-bridge-container.d.ts.map +1 -1
  25. package/lib/cjs/event-bridge/event-bridge-container.js +1 -0
  26. package/lib/cjs/event-bridge/event-bridge-container.js.map +1 -1
  27. package/lib/cjs/event-bridge/event-bridge.d.ts +9 -2
  28. package/lib/cjs/event-bridge/event-bridge.d.ts.map +1 -1
  29. package/lib/cjs/event-bridge/event-bridge.js +1 -0
  30. package/lib/cjs/event-bridge/event-bridge.js.map +1 -1
  31. package/lib/cjs/global-scope.d.ts +2 -0
  32. package/lib/cjs/global-scope.d.ts.map +1 -0
  33. package/lib/cjs/global-scope.js +28 -0
  34. package/lib/cjs/global-scope.js.map +1 -0
  35. package/lib/cjs/identify.d.ts +48 -1
  36. package/lib/cjs/identify.d.ts.map +1 -1
  37. package/lib/cjs/identify.js +33 -16
  38. package/lib/cjs/identify.js.map +1 -1
  39. package/lib/cjs/index.d.ts +37 -8
  40. package/lib/cjs/index.d.ts.map +1 -1
  41. package/lib/cjs/index.js +40 -6
  42. package/lib/cjs/index.js.map +1 -1
  43. package/lib/cjs/language.d.ts +2 -0
  44. package/lib/cjs/language.d.ts.map +1 -0
  45. package/lib/cjs/language.js +13 -0
  46. package/lib/cjs/language.js.map +1 -0
  47. package/lib/cjs/logger.d.ts +27 -1
  48. package/lib/cjs/logger.d.ts.map +1 -1
  49. package/lib/cjs/logger.js +9 -8
  50. package/lib/cjs/logger.js.map +1 -1
  51. package/lib/cjs/plugins/destination.d.ts +20 -7
  52. package/lib/cjs/plugins/destination.d.ts.map +1 -1
  53. package/lib/cjs/plugins/destination.js +70 -56
  54. package/lib/cjs/plugins/destination.js.map +1 -1
  55. package/lib/cjs/plugins/identity.d.ts +11 -0
  56. package/lib/cjs/plugins/identity.d.ts.map +1 -0
  57. package/lib/cjs/plugins/identity.js +37 -0
  58. package/lib/cjs/plugins/identity.js.map +1 -0
  59. package/lib/cjs/query-params.d.ts +3 -0
  60. package/lib/cjs/query-params.d.ts.map +1 -0
  61. package/lib/cjs/query-params.js +36 -0
  62. package/lib/cjs/query-params.js.map +1 -0
  63. package/lib/cjs/revenue.d.ts +45 -1
  64. package/lib/cjs/revenue.d.ts.map +1 -1
  65. package/lib/cjs/revenue.js +33 -7
  66. package/lib/cjs/revenue.js.map +1 -1
  67. package/lib/cjs/session.d.ts +2 -0
  68. package/lib/cjs/session.d.ts.map +1 -0
  69. package/lib/cjs/session.js +11 -0
  70. package/lib/cjs/session.js.map +1 -0
  71. package/lib/cjs/storage/cookie.d.ts +13 -0
  72. package/lib/cjs/storage/cookie.d.ts.map +1 -0
  73. package/lib/cjs/storage/cookie.js +172 -0
  74. package/lib/cjs/storage/cookie.js.map +1 -0
  75. package/lib/cjs/storage/helpers.d.ts +2 -0
  76. package/lib/cjs/storage/helpers.d.ts.map +1 -0
  77. package/lib/cjs/storage/helpers.js +11 -0
  78. package/lib/cjs/storage/helpers.js.map +1 -0
  79. package/lib/cjs/storage/memory.d.ts +1 -1
  80. package/lib/cjs/storage/memory.d.ts.map +1 -1
  81. package/lib/cjs/storage/memory.js +1 -0
  82. package/lib/cjs/storage/memory.js.map +1 -1
  83. package/lib/cjs/timeline.d.ts +8 -3
  84. package/lib/cjs/timeline.d.ts.map +1 -1
  85. package/lib/cjs/timeline.js +1 -0
  86. package/lib/cjs/timeline.js.map +1 -1
  87. package/lib/cjs/transports/base.d.ts +4 -1
  88. package/lib/cjs/transports/base.d.ts.map +1 -1
  89. package/lib/cjs/transports/base.js +14 -16
  90. package/lib/cjs/transports/base.js.map +1 -1
  91. package/lib/cjs/transports/fetch.d.ts +8 -0
  92. package/lib/cjs/transports/fetch.d.ts.map +1 -0
  93. package/lib/cjs/transports/fetch.js +50 -0
  94. package/lib/cjs/transports/fetch.js.map +1 -0
  95. package/lib/cjs/types/browser-client.d.ts +131 -0
  96. package/lib/cjs/types/browser-client.d.ts.map +1 -0
  97. package/lib/cjs/types/browser-client.js +3 -0
  98. package/lib/cjs/types/browser-client.js.map +1 -0
  99. package/lib/cjs/types/browser-config.d.ts +216 -0
  100. package/lib/cjs/types/browser-config.d.ts.map +1 -0
  101. package/lib/cjs/types/browser-config.js +3 -0
  102. package/lib/cjs/types/browser-config.js.map +1 -0
  103. package/lib/cjs/types/constants.d.ts.map +1 -0
  104. package/lib/cjs/{constants.js → types/constants.js} +1 -0
  105. package/lib/cjs/types/constants.js.map +1 -0
  106. package/lib/cjs/types/element-interactions.d.ts +73 -0
  107. package/lib/cjs/types/element-interactions.d.ts.map +1 -0
  108. package/lib/cjs/types/element-interactions.js +34 -0
  109. package/lib/cjs/types/element-interactions.js.map +1 -0
  110. package/lib/cjs/types/event/base-event.d.ts +64 -0
  111. package/lib/cjs/types/event/base-event.d.ts.map +1 -0
  112. package/lib/cjs/types/event/base-event.js +3 -0
  113. package/lib/cjs/types/event/base-event.js.map +1 -0
  114. package/lib/cjs/types/event/event.d.ts +68 -0
  115. package/lib/cjs/types/event/event.d.ts.map +1 -0
  116. package/lib/cjs/types/event/event.js +31 -0
  117. package/lib/cjs/types/event/event.js.map +1 -0
  118. package/lib/cjs/types/event/ingestion-metadata.d.ts +19 -0
  119. package/lib/cjs/types/event/ingestion-metadata.d.ts.map +1 -0
  120. package/lib/cjs/types/event/ingestion-metadata.js +3 -0
  121. package/lib/cjs/types/event/ingestion-metadata.js.map +1 -0
  122. package/lib/cjs/types/event/plan.d.ts +14 -0
  123. package/lib/cjs/types/event/plan.d.ts.map +1 -0
  124. package/lib/cjs/types/event/plan.js +3 -0
  125. package/lib/cjs/types/event/plan.js.map +1 -0
  126. package/lib/cjs/types/event-callback.d.ts +3 -0
  127. package/lib/cjs/types/event-callback.d.ts.map +1 -0
  128. package/lib/cjs/types/event-callback.js +3 -0
  129. package/lib/cjs/types/event-callback.js.map +1 -0
  130. package/lib/cjs/types/loglevel.d.ts +8 -0
  131. package/lib/cjs/types/loglevel.d.ts.map +1 -0
  132. package/lib/cjs/types/loglevel.js +12 -0
  133. package/lib/cjs/types/loglevel.js.map +1 -0
  134. package/lib/cjs/types/messages.d.ts.map +1 -0
  135. package/lib/cjs/{messages.js → types/messages.js} +1 -0
  136. package/lib/cjs/types/messages.js.map +1 -0
  137. package/lib/cjs/types/offline.d.ts +2 -0
  138. package/lib/cjs/types/offline.d.ts.map +1 -0
  139. package/lib/cjs/types/offline.js +5 -0
  140. package/lib/cjs/types/offline.js.map +1 -0
  141. package/lib/cjs/types/page-view-tracking.d.ts +9 -0
  142. package/lib/cjs/types/page-view-tracking.d.ts.map +1 -0
  143. package/lib/cjs/types/page-view-tracking.js +3 -0
  144. package/lib/cjs/types/page-view-tracking.js.map +1 -0
  145. package/lib/cjs/types/payload.d.ts +13 -0
  146. package/lib/cjs/types/payload.d.ts.map +1 -0
  147. package/lib/cjs/types/payload.js +3 -0
  148. package/lib/cjs/types/payload.js.map +1 -0
  149. package/lib/cjs/types/plugin.d.ts +30 -0
  150. package/lib/cjs/types/plugin.d.ts.map +1 -0
  151. package/lib/cjs/types/plugin.js +3 -0
  152. package/lib/cjs/types/plugin.js.map +1 -0
  153. package/lib/cjs/types/response.d.ts +81 -0
  154. package/lib/cjs/types/response.d.ts.map +1 -0
  155. package/lib/cjs/types/response.js +3 -0
  156. package/lib/cjs/types/response.js.map +1 -0
  157. package/lib/cjs/types/result.d.ts +7 -0
  158. package/lib/cjs/types/result.d.ts.map +1 -0
  159. package/lib/cjs/types/result.js +3 -0
  160. package/lib/cjs/types/result.js.map +1 -0
  161. package/lib/cjs/types/server-zone.d.ts +9 -0
  162. package/lib/cjs/types/server-zone.d.ts.map +1 -0
  163. package/lib/cjs/types/server-zone.js +12 -0
  164. package/lib/cjs/types/server-zone.js.map +1 -0
  165. package/lib/cjs/types/status.d.ts +22 -0
  166. package/lib/cjs/types/status.d.ts.map +1 -0
  167. package/lib/cjs/types/status.js +26 -0
  168. package/lib/cjs/types/status.js.map +1 -0
  169. package/lib/cjs/types/storage.d.ts +16 -0
  170. package/lib/cjs/types/storage.d.ts.map +1 -0
  171. package/lib/cjs/types/storage.js +3 -0
  172. package/lib/cjs/types/storage.js.map +1 -0
  173. package/lib/cjs/types/transport.d.ts +7 -0
  174. package/lib/cjs/types/transport.d.ts.map +1 -0
  175. package/lib/cjs/types/transport.js +3 -0
  176. package/lib/cjs/types/transport.js.map +1 -0
  177. package/lib/cjs/types/user-session.d.ts +11 -0
  178. package/lib/cjs/types/user-session.d.ts.map +1 -0
  179. package/lib/cjs/types/user-session.js +3 -0
  180. package/lib/cjs/types/user-session.js.map +1 -0
  181. package/lib/cjs/utils/chunk.js +1 -0
  182. package/lib/cjs/utils/chunk.js.map +1 -1
  183. package/lib/cjs/utils/debug.d.ts +1 -1
  184. package/lib/cjs/utils/debug.d.ts.map +1 -1
  185. package/lib/cjs/utils/debug.js +3 -6
  186. package/lib/cjs/utils/debug.js.map +1 -1
  187. package/lib/cjs/utils/event-builder.d.ts +5 -2
  188. package/lib/cjs/utils/event-builder.d.ts.map +1 -1
  189. package/lib/cjs/utils/event-builder.js +6 -5
  190. package/lib/cjs/utils/event-builder.js.map +1 -1
  191. package/lib/cjs/utils/result-builder.d.ts +2 -1
  192. package/lib/cjs/utils/result-builder.d.ts.map +1 -1
  193. package/lib/cjs/utils/result-builder.js +3 -2
  194. package/lib/cjs/utils/result-builder.js.map +1 -1
  195. package/lib/cjs/utils/return-wrapper.d.ts +3 -1
  196. package/lib/cjs/utils/return-wrapper.d.ts.map +1 -1
  197. package/lib/cjs/utils/return-wrapper.js +1 -0
  198. package/lib/cjs/utils/return-wrapper.js.map +1 -1
  199. package/lib/cjs/utils/uuid.js +1 -0
  200. package/lib/cjs/utils/uuid.js.map +1 -1
  201. package/lib/cjs/utils/valid-properties.js +1 -0
  202. package/lib/cjs/utils/valid-properties.js.map +1 -1
  203. package/lib/esm/analytics-connector.d.ts +5 -0
  204. package/lib/esm/analytics-connector.d.ts.map +1 -0
  205. package/lib/esm/analytics-connector.js +14 -0
  206. package/lib/esm/analytics-connector.js.map +1 -0
  207. package/lib/esm/config.d.ts +107 -3
  208. package/lib/esm/config.d.ts.map +1 -1
  209. package/lib/esm/config.js +2 -2
  210. package/lib/esm/config.js.map +1 -1
  211. package/lib/esm/cookie-name.d.ts +3 -0
  212. package/lib/esm/cookie-name.d.ts.map +1 -0
  213. package/lib/esm/cookie-name.js +10 -0
  214. package/lib/esm/cookie-name.js.map +1 -0
  215. package/lib/esm/core-client.d.ts +154 -14
  216. package/lib/esm/core-client.d.ts.map +1 -1
  217. package/lib/esm/core-client.js +1 -1
  218. package/lib/esm/core-client.js.map +1 -1
  219. package/lib/esm/event-bridge/event-bridge-channel.d.ts +4 -3
  220. package/lib/esm/event-bridge/event-bridge-channel.d.ts.map +1 -1
  221. package/lib/esm/event-bridge/event-bridge-channel.js.map +1 -1
  222. package/lib/esm/event-bridge/event-bridge-container.d.ts +1 -1
  223. package/lib/esm/event-bridge/event-bridge-container.d.ts.map +1 -1
  224. package/lib/esm/event-bridge/event-bridge-container.js.map +1 -1
  225. package/lib/esm/event-bridge/event-bridge.d.ts +9 -2
  226. package/lib/esm/event-bridge/event-bridge.d.ts.map +1 -1
  227. package/lib/esm/event-bridge/event-bridge.js.map +1 -1
  228. package/lib/esm/global-scope.d.ts +2 -0
  229. package/lib/esm/global-scope.d.ts.map +1 -0
  230. package/lib/esm/global-scope.js +24 -0
  231. package/lib/esm/global-scope.js.map +1 -0
  232. package/lib/esm/identify.d.ts +48 -1
  233. package/lib/esm/identify.d.ts.map +1 -1
  234. package/lib/esm/identify.js +18 -2
  235. package/lib/esm/identify.js.map +1 -1
  236. package/lib/esm/index.d.ts +37 -8
  237. package/lib/esm/index.d.ts.map +1 -1
  238. package/lib/esm/index.js +16 -2
  239. package/lib/esm/index.js.map +1 -1
  240. package/lib/esm/language.d.ts +2 -0
  241. package/lib/esm/language.d.ts.map +1 -0
  242. package/lib/esm/language.js +9 -0
  243. package/lib/esm/language.js.map +1 -0
  244. package/lib/esm/logger.d.ts +27 -1
  245. package/lib/esm/logger.d.ts.map +1 -1
  246. package/lib/esm/logger.js +1 -1
  247. package/lib/esm/logger.js.map +1 -1
  248. package/lib/esm/plugins/destination.d.ts +20 -7
  249. package/lib/esm/plugins/destination.d.ts.map +1 -1
  250. package/lib/esm/plugins/destination.js +64 -51
  251. package/lib/esm/plugins/destination.js.map +1 -1
  252. package/lib/esm/plugins/identity.d.ts +11 -0
  253. package/lib/esm/plugins/identity.d.ts.map +1 -0
  254. package/lib/esm/plugins/identity.js +34 -0
  255. package/lib/esm/plugins/identity.js.map +1 -0
  256. package/lib/esm/query-params.d.ts +3 -0
  257. package/lib/esm/query-params.d.ts.map +1 -0
  258. package/lib/esm/query-params.js +31 -0
  259. package/lib/esm/query-params.js.map +1 -0
  260. package/lib/esm/revenue.d.ts +45 -1
  261. package/lib/esm/revenue.d.ts.map +1 -1
  262. package/lib/esm/revenue.js +26 -1
  263. package/lib/esm/revenue.js.map +1 -1
  264. package/lib/esm/session.d.ts +2 -0
  265. package/lib/esm/session.d.ts.map +1 -0
  266. package/lib/esm/session.js +7 -0
  267. package/lib/esm/session.js.map +1 -0
  268. package/lib/esm/storage/cookie.d.ts +13 -0
  269. package/lib/esm/storage/cookie.d.ts.map +1 -0
  270. package/lib/esm/storage/cookie.js +169 -0
  271. package/lib/esm/storage/cookie.js.map +1 -0
  272. package/lib/esm/storage/helpers.d.ts +2 -0
  273. package/lib/esm/storage/helpers.d.ts.map +1 -0
  274. package/lib/esm/storage/helpers.js +7 -0
  275. package/lib/esm/storage/helpers.js.map +1 -0
  276. package/lib/esm/storage/memory.d.ts +1 -1
  277. package/lib/esm/storage/memory.d.ts.map +1 -1
  278. package/lib/esm/storage/memory.js.map +1 -1
  279. package/lib/esm/timeline.d.ts +8 -3
  280. package/lib/esm/timeline.d.ts.map +1 -1
  281. package/lib/esm/timeline.js.map +1 -1
  282. package/lib/esm/transports/base.d.ts +4 -1
  283. package/lib/esm/transports/base.d.ts.map +1 -1
  284. package/lib/esm/transports/base.js +1 -4
  285. package/lib/esm/transports/base.js.map +1 -1
  286. package/lib/esm/transports/fetch.d.ts +8 -0
  287. package/lib/esm/transports/fetch.d.ts.map +1 -0
  288. package/lib/esm/transports/fetch.js +47 -0
  289. package/lib/esm/transports/fetch.js.map +1 -0
  290. package/lib/esm/types/browser-client.d.ts +131 -0
  291. package/lib/esm/types/browser-client.d.ts.map +1 -0
  292. package/lib/esm/types/browser-client.js +2 -0
  293. package/lib/esm/types/browser-client.js.map +1 -0
  294. package/lib/esm/types/browser-config.d.ts +216 -0
  295. package/lib/esm/types/browser-config.d.ts.map +1 -0
  296. package/lib/esm/types/browser-config.js +2 -0
  297. package/lib/esm/types/browser-config.js.map +1 -0
  298. package/lib/esm/types/constants.d.ts.map +1 -0
  299. package/lib/esm/types/constants.js.map +1 -0
  300. package/lib/esm/types/element-interactions.d.ts +73 -0
  301. package/lib/esm/types/element-interactions.d.ts.map +1 -0
  302. package/lib/esm/types/element-interactions.js +31 -0
  303. package/lib/esm/types/element-interactions.js.map +1 -0
  304. package/lib/esm/types/event/base-event.d.ts +64 -0
  305. package/lib/esm/types/event/base-event.d.ts.map +1 -0
  306. package/lib/esm/types/event/base-event.js +2 -0
  307. package/lib/esm/types/event/base-event.js.map +1 -0
  308. package/lib/esm/types/event/event.d.ts +68 -0
  309. package/lib/esm/types/event/event.d.ts.map +1 -0
  310. package/lib/esm/types/event/event.js +28 -0
  311. package/lib/esm/types/event/event.js.map +1 -0
  312. package/lib/esm/types/event/ingestion-metadata.d.ts +19 -0
  313. package/lib/esm/types/event/ingestion-metadata.d.ts.map +1 -0
  314. package/lib/esm/types/event/ingestion-metadata.js +2 -0
  315. package/lib/esm/types/event/ingestion-metadata.js.map +1 -0
  316. package/lib/esm/types/event/plan.d.ts +14 -0
  317. package/lib/esm/types/event/plan.d.ts.map +1 -0
  318. package/lib/esm/types/event/plan.js +2 -0
  319. package/lib/esm/types/event/plan.js.map +1 -0
  320. package/lib/esm/types/event-callback.d.ts +3 -0
  321. package/lib/esm/types/event-callback.d.ts.map +1 -0
  322. package/lib/esm/types/event-callback.js +2 -0
  323. package/lib/esm/types/event-callback.js.map +1 -0
  324. package/lib/esm/types/loglevel.d.ts +8 -0
  325. package/lib/esm/types/loglevel.d.ts.map +1 -0
  326. package/lib/esm/types/loglevel.js +9 -0
  327. package/lib/esm/types/loglevel.js.map +1 -0
  328. package/lib/esm/types/messages.d.ts.map +1 -0
  329. package/lib/esm/types/messages.js.map +1 -0
  330. package/lib/esm/types/offline.d.ts +2 -0
  331. package/lib/esm/types/offline.d.ts.map +1 -0
  332. package/lib/esm/types/offline.js +2 -0
  333. package/lib/esm/types/offline.js.map +1 -0
  334. package/lib/esm/types/page-view-tracking.d.ts +9 -0
  335. package/lib/esm/types/page-view-tracking.d.ts.map +1 -0
  336. package/lib/esm/types/page-view-tracking.js +2 -0
  337. package/lib/esm/types/page-view-tracking.js.map +1 -0
  338. package/lib/esm/types/payload.d.ts +13 -0
  339. package/lib/esm/types/payload.d.ts.map +1 -0
  340. package/lib/esm/types/payload.js +2 -0
  341. package/lib/esm/types/payload.js.map +1 -0
  342. package/lib/esm/types/plugin.d.ts +30 -0
  343. package/lib/esm/types/plugin.d.ts.map +1 -0
  344. package/lib/esm/types/plugin.js +2 -0
  345. package/lib/esm/types/plugin.js.map +1 -0
  346. package/lib/esm/types/response.d.ts +81 -0
  347. package/lib/esm/types/response.d.ts.map +1 -0
  348. package/lib/esm/types/response.js +2 -0
  349. package/lib/esm/types/response.js.map +1 -0
  350. package/lib/esm/types/result.d.ts +7 -0
  351. package/lib/esm/types/result.d.ts.map +1 -0
  352. package/lib/esm/types/result.js +2 -0
  353. package/lib/esm/types/result.js.map +1 -0
  354. package/lib/esm/types/server-zone.d.ts +9 -0
  355. package/lib/esm/types/server-zone.d.ts.map +1 -0
  356. package/lib/esm/types/server-zone.js +9 -0
  357. package/lib/esm/types/server-zone.js.map +1 -0
  358. package/lib/esm/types/status.d.ts +22 -0
  359. package/lib/esm/types/status.d.ts.map +1 -0
  360. package/lib/esm/types/status.js +23 -0
  361. package/lib/esm/types/status.js.map +1 -0
  362. package/lib/esm/types/storage.d.ts +16 -0
  363. package/lib/esm/types/storage.d.ts.map +1 -0
  364. package/lib/esm/types/storage.js +2 -0
  365. package/lib/esm/types/storage.js.map +1 -0
  366. package/lib/esm/types/transport.d.ts +7 -0
  367. package/lib/esm/types/transport.d.ts.map +1 -0
  368. package/lib/esm/types/transport.js +2 -0
  369. package/lib/esm/types/transport.js.map +1 -0
  370. package/lib/esm/types/user-session.d.ts +11 -0
  371. package/lib/esm/types/user-session.d.ts.map +1 -0
  372. package/lib/esm/types/user-session.js +2 -0
  373. package/lib/esm/types/user-session.js.map +1 -0
  374. package/lib/esm/utils/debug.d.ts +1 -1
  375. package/lib/esm/utils/debug.d.ts.map +1 -1
  376. package/lib/esm/utils/debug.js +1 -5
  377. package/lib/esm/utils/debug.js.map +1 -1
  378. package/lib/esm/utils/event-builder.d.ts +5 -2
  379. package/lib/esm/utils/event-builder.d.ts.map +1 -1
  380. package/lib/esm/utils/event-builder.js +1 -1
  381. package/lib/esm/utils/event-builder.js.map +1 -1
  382. package/lib/esm/utils/result-builder.d.ts +2 -1
  383. package/lib/esm/utils/result-builder.d.ts.map +1 -1
  384. package/lib/esm/utils/result-builder.js +1 -1
  385. package/lib/esm/utils/result-builder.js.map +1 -1
  386. package/lib/esm/utils/return-wrapper.d.ts +3 -1
  387. package/lib/esm/utils/return-wrapper.d.ts.map +1 -1
  388. package/lib/esm/utils/return-wrapper.js.map +1 -1
  389. package/package.json +2 -3
  390. package/lib/cjs/constants.d.ts.map +0 -1
  391. package/lib/cjs/constants.js.map +0 -1
  392. package/lib/cjs/messages.d.ts.map +0 -1
  393. package/lib/cjs/messages.js.map +0 -1
  394. package/lib/esm/constants.d.ts.map +0 -1
  395. package/lib/esm/constants.js.map +0 -1
  396. package/lib/esm/messages.d.ts.map +0 -1
  397. package/lib/esm/messages.js.map +0 -1
  398. /package/lib/cjs/{constants.d.ts → types/constants.d.ts} +0 -0
  399. /package/lib/cjs/{messages.d.ts → types/messages.d.ts} +0 -0
  400. /package/lib/esm/{constants.d.ts → types/constants.d.ts} +0 -0
  401. /package/lib/esm/{constants.js → types/constants.js} +0 -0
  402. /package/lib/esm/{messages.d.ts → types/messages.d.ts} +0 -0
  403. /package/lib/esm/{messages.js → types/messages.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":";;AAAA,8DAAyE;AAEzE,IAAM,MAAM,GAAG,mBAAmB,CAAC;AAEnC;IAGE;QACE,IAAI,CAAC,QAAQ,GAAG,0BAAQ,CAAC,IAAI,CAAC;IAChC,CAAC;IAED,wBAAO,GAAP;QACE,IAAI,CAAC,QAAQ,GAAG,0BAAQ,CAAC,IAAI,CAAC;IAChC,CAAC;IAED,uBAAM,GAAN,UAAO,QAAkC;QAAlC,yBAAA,EAAA,WAAqB,0BAAQ,CAAC,IAAI;QACvC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,oBAAG,GAAH;QAAI,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QAChB,IAAI,IAAI,CAAC,QAAQ,GAAG,0BAAQ,CAAC,OAAO,EAAE;YACpC,OAAO;SACR;QACD,OAAO,CAAC,GAAG,CAAC,UAAG,MAAM,oBAAU,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;IACnD,CAAC;IAED,qBAAI,GAAJ;QAAK,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QACjB,IAAI,IAAI,CAAC,QAAQ,GAAG,0BAAQ,CAAC,IAAI,EAAE;YACjC,OAAO;SACR;QACD,OAAO,CAAC,IAAI,CAAC,UAAG,MAAM,qBAAW,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;IACrD,CAAC;IAED,sBAAK,GAAL;QAAM,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QAClB,IAAI,IAAI,CAAC,QAAQ,GAAG,0BAAQ,CAAC,KAAK,EAAE;YAClC,OAAO;SACR;QACD,OAAO,CAAC,KAAK,CAAC,UAAG,MAAM,sBAAY,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;IACvD,CAAC;IAED,sBAAK,GAAL;QAAM,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QAClB,IAAI,IAAI,CAAC,QAAQ,GAAG,0BAAQ,CAAC,KAAK,EAAE;YAClC,OAAO;SACR;QACD,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,UAAG,MAAM,sBAAY,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;IACrD,CAAC;IACH,aAAC;AAAD,CAAC,AA3CD,IA2CC;AA3CY,wBAAM","sourcesContent":["import { LogLevel, Logger as ILogger } from '@amplitude/analytics-types';\n\nconst PREFIX = 'Amplitude Logger ';\n\nexport class Logger implements ILogger {\n logLevel: LogLevel;\n\n constructor() {\n this.logLevel = LogLevel.None;\n }\n\n disable(): void {\n this.logLevel = LogLevel.None;\n }\n\n enable(logLevel: LogLevel = LogLevel.Warn): void {\n this.logLevel = logLevel;\n }\n\n log(...args: any[]): void {\n if (this.logLevel < LogLevel.Verbose) {\n return;\n }\n console.log(`${PREFIX}[Log]: ${args.join(' ')}`);\n }\n\n warn(...args: any[]): void {\n if (this.logLevel < LogLevel.Warn) {\n return;\n }\n console.warn(`${PREFIX}[Warn]: ${args.join(' ')}`);\n }\n\n error(...args: any[]): void {\n if (this.logLevel < LogLevel.Error) {\n return;\n }\n console.error(`${PREFIX}[Error]: ${args.join(' ')}`);\n }\n\n debug(...args: any[]): void {\n if (this.logLevel < LogLevel.Debug) {\n return;\n }\n // console.debug output is hidden by default in chrome\n console.log(`${PREFIX}[Debug]: ${args.join(' ')}`);\n }\n}\n"]}
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAE5C,IAAM,MAAM,GAAG,mBAAmB,CAAC;AA2BnC;IAGE;QACE,IAAI,CAAC,QAAQ,GAAG,mBAAQ,CAAC,IAAI,CAAC;IAChC,CAAC;IAED,wBAAO,GAAP;QACE,IAAI,CAAC,QAAQ,GAAG,mBAAQ,CAAC,IAAI,CAAC;IAChC,CAAC;IAED,uBAAM,GAAN,UAAO,QAAkC;QAAlC,yBAAA,EAAA,WAAqB,mBAAQ,CAAC,IAAI;QACvC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,oBAAG,GAAH;QAAI,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QAChB,IAAI,IAAI,CAAC,QAAQ,GAAG,mBAAQ,CAAC,OAAO,EAAE;YACpC,OAAO;SACR;QACD,OAAO,CAAC,GAAG,CAAC,UAAG,MAAM,oBAAU,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;IACnD,CAAC;IAED,qBAAI,GAAJ;QAAK,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QACjB,IAAI,IAAI,CAAC,QAAQ,GAAG,mBAAQ,CAAC,IAAI,EAAE;YACjC,OAAO;SACR;QACD,OAAO,CAAC,IAAI,CAAC,UAAG,MAAM,qBAAW,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;IACrD,CAAC;IAED,sBAAK,GAAL;QAAM,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QAClB,IAAI,IAAI,CAAC,QAAQ,GAAG,mBAAQ,CAAC,KAAK,EAAE;YAClC,OAAO;SACR;QACD,OAAO,CAAC,KAAK,CAAC,UAAG,MAAM,sBAAY,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;IACvD,CAAC;IAED,sBAAK,GAAL;QAAM,cAAc;aAAd,UAAc,EAAd,qBAAc,EAAd,IAAc;YAAd,yBAAc;;QAClB,IAAI,IAAI,CAAC,QAAQ,GAAG,mBAAQ,CAAC,KAAK,EAAE;YAClC,OAAO;SACR;QACD,sDAAsD;QACtD,OAAO,CAAC,GAAG,CAAC,UAAG,MAAM,sBAAY,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;IACrD,CAAC;IACH,aAAC;AAAD,CAAC,AA3CD,IA2CC;AA3CY,wBAAM","sourcesContent":["import { LogLevel } from './types/loglevel';\n\nconst PREFIX = 'Amplitude Logger ';\n\nexport interface ILogger {\n disable(): void;\n enable(logLevel: LogLevel): void;\n log(...args: any[]): void;\n warn(...args: any[]): void;\n error(...args: any[]): void;\n debug(...args: any[]): void;\n}\n\nexport interface LogConfig {\n logger: ILogger;\n logLevel: LogLevel;\n}\n\ntype TimeKey = 'start' | 'end';\n\nexport interface DebugContext {\n type: string;\n name: string;\n args: string[] | string;\n stacktrace?: string[] | string;\n time?: { [key in TimeKey]?: string };\n states?: { [key: string]: any };\n}\n\nexport class Logger implements ILogger {\n logLevel: LogLevel;\n\n constructor() {\n this.logLevel = LogLevel.None;\n }\n\n disable(): void {\n this.logLevel = LogLevel.None;\n }\n\n enable(logLevel: LogLevel = LogLevel.Warn): void {\n this.logLevel = logLevel;\n }\n\n log(...args: any[]): void {\n if (this.logLevel < LogLevel.Verbose) {\n return;\n }\n console.log(`${PREFIX}[Log]: ${args.join(' ')}`);\n }\n\n warn(...args: any[]): void {\n if (this.logLevel < LogLevel.Warn) {\n return;\n }\n console.warn(`${PREFIX}[Warn]: ${args.join(' ')}`);\n }\n\n error(...args: any[]): void {\n if (this.logLevel < LogLevel.Error) {\n return;\n }\n console.error(`${PREFIX}[Error]: ${args.join(' ')}`);\n }\n\n debug(...args: any[]): void {\n if (this.logLevel < LogLevel.Debug) {\n return;\n }\n // console.debug output is hidden by default in chrome\n console.log(`${PREFIX}[Debug]: ${args.join(' ')}`);\n }\n}\n"]}
@@ -1,4 +1,15 @@
1
- import { Config, DestinationContext as Context, DestinationPlugin, Event, InvalidResponse, PayloadTooLargeResponse, RateLimitResponse, Response, Result, SuccessResponse } from '@amplitude/analytics-types';
1
+ import { DestinationPlugin } from '../types/plugin';
2
+ import { Event } from '../types/event/event';
3
+ import { Result } from '../types/result';
4
+ import { Response, InvalidResponse, PayloadTooLargeResponse, RateLimitResponse, SuccessResponse } from '../types/response';
5
+ import { IConfig } from '../config';
6
+ import { EventCallback } from '../types/event-callback';
7
+ export interface Context {
8
+ event: Event;
9
+ attempts: number;
10
+ callback: EventCallback;
11
+ timeout: number;
12
+ }
2
13
  export declare function getResponseBodyString(res: Response): string;
3
14
  export declare class Destination implements DestinationPlugin {
4
15
  name: string;
@@ -6,15 +17,17 @@ export declare class Destination implements DestinationPlugin {
6
17
  retryTimeout: number;
7
18
  throttleTimeout: number;
8
19
  storageKey: string;
9
- config: Config;
10
- private scheduled;
20
+ config: IConfig;
21
+ scheduleId: ReturnType<typeof setTimeout> | null;
22
+ scheduledTimeout: number;
23
+ flushId: ReturnType<typeof setTimeout> | null;
11
24
  queue: Context[];
12
- setup(config: Config): Promise<undefined>;
25
+ setup(config: IConfig): Promise<undefined>;
13
26
  execute(event: Event): Promise<Result>;
14
- getTryableList(list: Context[]): Context[];
15
- scheduleTryable(list: Context[], shouldAddToQueue?: boolean): void;
16
- addToQueue(...list: Context[]): void;
27
+ removeEventsExceedFlushMaxRetries(list: Context[]): Context[];
28
+ scheduleEvents(list: Context[]): void;
17
29
  schedule(timeout: number): void;
30
+ resetSchedule(): void;
18
31
  flush(useRetry?: boolean): Promise<void>;
19
32
  send(list: Context[], useRetry?: boolean): Promise<void>;
20
33
  handleResponse(res: Response, list: Context[]): void;
@@ -1 +1 @@
1
- {"version":3,"file":"destination.d.ts","sourceRoot":"","sources":["../../../src/plugins/destination.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,MAAM,EACN,kBAAkB,IAAI,OAAO,EAC7B,iBAAiB,EACjB,KAAK,EACL,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,QAAQ,EACR,MAAM,EAEN,eAAe,EAChB,MAAM,4BAA4B,CAAC;AAmBpC,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,QAAQ,UAUlD;AAED,qBAAa,WAAY,YAAW,iBAAiB;IACnD,IAAI,SAAe;IACnB,IAAI,gBAA0B;IAE9B,YAAY,SAAQ;IACpB,eAAe,SAAS;IACxB,UAAU,SAAM;IAIhB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,SAAS,CAA8C;IAC/D,KAAK,EAAE,OAAO,EAAE,CAAM;IAEhB,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAY/C,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAiBtC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE;IAW9B,eAAe,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,gBAAgB,UAAQ;IAkBzD,UAAU,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IAM7B,QAAQ,CAAC,OAAO,EAAE,MAAM;IAclB,KAAK,CAAC,QAAQ,UAAQ;IA4BtB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,QAAQ,UAAO;IA2C3C,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;IA6B7C,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE;IAI3D,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE;IA+B3D,6BAA6B,CAAC,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,OAAO,EAAE;IAe3E,uBAAuB,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE;IA+B/D,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE;IAUnC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAK7D;;;;;;OAMG;IACH,UAAU;IASV;;OAEG;IACH,YAAY,CAAC,cAAc,EAAE,OAAO,EAAE;CAOvC"}
1
+ {"version":3,"file":"destination.d.ts","sourceRoot":"","sources":["../../../src/plugins/destination.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAEzC,OAAO,EACL,QAAQ,EACR,eAAe,EACf,uBAAuB,EACvB,iBAAiB,EACjB,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAa3B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,aAAa,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAOD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,QAAQ,UAUlD;AAED,qBAAa,WAAY,YAAW,iBAAiB;IACnD,IAAI,SAAe;IACnB,IAAI,gBAA0B;IAE9B,YAAY,SAAQ;IACpB,eAAe,SAAS;IACxB,UAAU,SAAM;IAIhB,MAAM,EAAE,OAAO,CAAC;IAKhB,UAAU,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAQ;IAExD,gBAAgB,SAAK;IAGrB,OAAO,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAQ;IACrD,KAAK,EAAE,OAAO,EAAE,CAAM;IAEhB,KAAK,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,SAAS,CAAC;IAYhD,OAAO,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBtC,iCAAiC,CAAC,IAAI,EAAE,OAAO,EAAE;IAWjD,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE;IAU9B,QAAQ,CAAC,OAAO,EAAE,MAAM;IAsBxB,aAAa;IAMP,KAAK,CAAC,QAAQ,UAAQ;IAoCtB,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,QAAQ,UAAO;IA2C3C,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE;IA6B7C,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE;IAI3D,qBAAqB,CAAC,GAAG,EAAE,eAAe,EAAE,IAAI,EAAE,OAAO,EAAE;IA+B3D,6BAA6B,CAAC,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,OAAO,EAAE;IAe3E,uBAAuB,CAAC,GAAG,EAAE,iBAAiB,EAAE,IAAI,EAAE,OAAO,EAAE;IA+B/D,mBAAmB,CAAC,IAAI,EAAE,OAAO,EAAE;IAUnC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAK7D;;;;;;OAMG;IACH,UAAU;IASV;;OAEG;IACH,YAAY,CAAC,cAAc,EAAE,OAAO,EAAE;CAOvC"}
@@ -1,9 +1,10 @@
1
+ "use strict";
1
2
  Object.defineProperty(exports, "__esModule", { value: true });
2
3
  exports.Destination = exports.getResponseBodyString = void 0;
3
4
  var tslib_1 = require("tslib");
4
- var analytics_types_1 = require("@amplitude/analytics-types");
5
- var messages_1 = require("../messages");
6
- var constants_1 = require("../constants");
5
+ var status_1 = require("../types/status");
6
+ var messages_1 = require("../types/messages");
7
+ var constants_1 = require("../types/constants");
7
8
  var chunk_1 = require("../utils/chunk");
8
9
  var result_builder_1 = require("../utils/result-builder");
9
10
  var config_1 = require("../config");
@@ -33,7 +34,16 @@ var Destination = /** @class */ (function () {
33
34
  this.retryTimeout = 1000;
34
35
  this.throttleTimeout = 30000;
35
36
  this.storageKey = '';
36
- this.scheduled = null;
37
+ // Indicator of whether events that are scheduled (but not flushed yet).
38
+ // When flush:
39
+ // 1. assign `scheduleId` to `flushId`
40
+ // 2. set `scheduleId` to null
41
+ this.scheduleId = null;
42
+ // Timeout in milliseconds of current schedule
43
+ this.scheduledTimeout = 0;
44
+ // Indicator of whether current flush resolves.
45
+ // When flush resolves, set `flushId` to null
46
+ this.flushId = null;
37
47
  this.queue = [];
38
48
  }
39
49
  Destination.prototype.setup = function (config) {
@@ -70,60 +80,58 @@ var Destination = /** @class */ (function () {
70
80
  callback: function (result) { return resolve(result); },
71
81
  timeout: 0,
72
82
  };
73
- void _this.addToQueue(context);
83
+ _this.queue.push(context);
84
+ _this.schedule(_this.config.flushIntervalMillis);
85
+ _this.saveEvents();
74
86
  });
75
87
  };
76
- Destination.prototype.getTryableList = function (list) {
88
+ Destination.prototype.removeEventsExceedFlushMaxRetries = function (list) {
77
89
  var _this = this;
78
90
  return list.filter(function (context) {
91
+ context.attempts += 1;
79
92
  if (context.attempts < _this.config.flushMaxRetries) {
80
- context.attempts += 1;
81
93
  return true;
82
94
  }
83
95
  void _this.fulfillRequest([context], 500, messages_1.MAX_RETRIES_EXCEEDED_MESSAGE);
84
96
  return false;
85
97
  });
86
98
  };
87
- Destination.prototype.scheduleTryable = function (list, shouldAddToQueue) {
99
+ Destination.prototype.scheduleEvents = function (list) {
88
100
  var _this = this;
89
- if (shouldAddToQueue === void 0) { shouldAddToQueue = false; }
90
101
  list.forEach(function (context) {
91
- // Only need to concat the queue for the first time
92
- if (shouldAddToQueue) {
93
- _this.queue = _this.queue.concat(context);
94
- }
95
- if (context.timeout === 0) {
96
- _this.schedule(_this.config.flushIntervalMillis);
97
- return;
98
- }
99
- setTimeout(function () {
100
- context.timeout = 0;
101
- _this.schedule(0);
102
- }, context.timeout);
102
+ _this.schedule(context.timeout === 0 ? _this.config.flushIntervalMillis : context.timeout);
103
103
  });
104
104
  };
105
- Destination.prototype.addToQueue = function () {
106
- var list = [];
107
- for (var _i = 0; _i < arguments.length; _i++) {
108
- list[_i] = arguments[_i];
109
- }
110
- var tryable = this.getTryableList(list);
111
- this.scheduleTryable(tryable, true);
112
- this.saveEvents();
113
- };
105
+ // Schedule a flush in timeout when
106
+ // 1. No schedule
107
+ // 2. Timeout greater than existing timeout.
108
+ // This makes sure that when throttled, no flush when throttle timeout expires.
114
109
  Destination.prototype.schedule = function (timeout) {
115
110
  var _this = this;
116
- if (this.scheduled || this.config.offline) {
111
+ if (this.config.offline) {
117
112
  return;
118
113
  }
119
- this.scheduled = setTimeout(function () {
120
- void _this.flush(true).then(function () {
121
- if (_this.queue.length > 0) {
122
- _this.schedule(timeout);
123
- }
124
- });
125
- }, timeout);
114
+ if (this.scheduleId === null || (this.scheduleId && timeout > this.scheduledTimeout)) {
115
+ if (this.scheduleId) {
116
+ clearTimeout(this.scheduleId);
117
+ }
118
+ this.scheduledTimeout = timeout;
119
+ this.scheduleId = setTimeout(function () {
120
+ _this.queue = _this.queue.map(function (context) {
121
+ context.timeout = 0;
122
+ return context;
123
+ });
124
+ void _this.flush(true);
125
+ }, timeout);
126
+ return;
127
+ }
128
+ };
129
+ // Mark current schedule is flushed.
130
+ Destination.prototype.resetSchedule = function () {
131
+ this.scheduleId = null;
132
+ this.scheduledTimeout = 0;
126
133
  };
134
+ // Flush all events regardless of their timeout
127
135
  Destination.prototype.flush = function (useRetry) {
128
136
  if (useRetry === void 0) { useRetry = false; }
129
137
  return tslib_1.__awaiter(this, void 0, void 0, function () {
@@ -134,16 +142,20 @@ var Destination = /** @class */ (function () {
134
142
  case 0:
135
143
  // Skip flush if offline
136
144
  if (this.config.offline) {
145
+ this.resetSchedule();
137
146
  this.config.loggerProvider.debug('Skipping flush while offline.');
138
147
  return [2 /*return*/];
139
148
  }
149
+ if (this.flushId) {
150
+ this.resetSchedule();
151
+ this.config.loggerProvider.debug('Skipping flush because previous flush has not resolved.');
152
+ return [2 /*return*/];
153
+ }
154
+ this.flushId = this.scheduleId;
155
+ this.resetSchedule();
140
156
  list = [];
141
157
  later = [];
142
158
  this.queue.forEach(function (context) { return (context.timeout === 0 ? list.push(context) : later.push(context)); });
143
- if (this.scheduled) {
144
- clearTimeout(this.scheduled);
145
- this.scheduled = null;
146
- }
147
159
  batches = (0, chunk_1.chunk)(list, this.config.flushQueueSize);
148
160
  // Promise.all() doesn't guarantee resolve order.
149
161
  // Sequentially resolve to make sure backend receives events in order
@@ -162,7 +174,9 @@ var Destination = /** @class */ (function () {
162
174
  // Promise.all() doesn't guarantee resolve order.
163
175
  // Sequentially resolve to make sure backend receives events in order
164
176
  _a.sent();
165
- this.scheduleTryable(later);
177
+ // Mark current flush is done
178
+ this.flushId = null;
179
+ this.scheduleEvents(this.queue);
166
180
  return [2 /*return*/];
167
181
  }
168
182
  });
@@ -218,7 +232,7 @@ var Destination = /** @class */ (function () {
218
232
  e_1 = _a.sent();
219
233
  errorMessage = getErrorMessage(e_1);
220
234
  this.config.loggerProvider.error(errorMessage);
221
- this.handleResponse({ status: analytics_types_1.Status.Failed, statusCode: 0 }, list);
235
+ this.handleResponse({ status: status_1.Status.Failed, statusCode: 0 }, list);
222
236
  return [3 /*break*/, 4];
223
237
  case 4: return [2 /*return*/];
224
238
  }
@@ -228,19 +242,19 @@ var Destination = /** @class */ (function () {
228
242
  Destination.prototype.handleResponse = function (res, list) {
229
243
  var status = res.status;
230
244
  switch (status) {
231
- case analytics_types_1.Status.Success: {
245
+ case status_1.Status.Success: {
232
246
  this.handleSuccessResponse(res, list);
233
247
  break;
234
248
  }
235
- case analytics_types_1.Status.Invalid: {
249
+ case status_1.Status.Invalid: {
236
250
  this.handleInvalidResponse(res, list);
237
251
  break;
238
252
  }
239
- case analytics_types_1.Status.PayloadTooLarge: {
253
+ case status_1.Status.PayloadTooLarge: {
240
254
  this.handlePayloadTooLargeResponse(res, list);
241
255
  break;
242
256
  }
243
- case analytics_types_1.Status.RateLimit: {
257
+ case status_1.Status.RateLimit: {
244
258
  this.handleRateLimitResponse(res, list);
245
259
  break;
246
260
  }
@@ -274,8 +288,8 @@ var Destination = /** @class */ (function () {
274
288
  // log intermediate event status before retry
275
289
  this.config.loggerProvider.warn(getResponseBodyString(res));
276
290
  }
277
- var tryable = this.getTryableList(retry);
278
- this.scheduleTryable(tryable);
291
+ var tryable = this.removeEventsExceedFlushMaxRetries(retry);
292
+ this.scheduleEvents(tryable);
279
293
  };
280
294
  Destination.prototype.handlePayloadTooLargeResponse = function (res, list) {
281
295
  if (list.length === 1) {
@@ -285,8 +299,8 @@ var Destination = /** @class */ (function () {
285
299
  // log intermediate event status before retry
286
300
  this.config.loggerProvider.warn(getResponseBodyString(res));
287
301
  this.config.flushQueueSize /= 2;
288
- var tryable = this.getTryableList(list);
289
- this.scheduleTryable(tryable);
302
+ var tryable = this.removeEventsExceedFlushMaxRetries(list);
303
+ this.scheduleEvents(tryable);
290
304
  };
291
305
  Destination.prototype.handleRateLimitResponse = function (res, list) {
292
306
  var _this = this;
@@ -311,8 +325,8 @@ var Destination = /** @class */ (function () {
311
325
  // log intermediate event status before retry
312
326
  this.config.loggerProvider.warn(getResponseBodyString(res));
313
327
  }
314
- var tryable = this.getTryableList(retry);
315
- this.scheduleTryable(tryable);
328
+ var tryable = this.removeEventsExceedFlushMaxRetries(retry);
329
+ this.scheduleEvents(tryable);
316
330
  };
317
331
  Destination.prototype.handleOtherResponse = function (list) {
318
332
  var _this = this;
@@ -320,8 +334,8 @@ var Destination = /** @class */ (function () {
320
334
  context.timeout = context.attempts * _this.retryTimeout;
321
335
  return context;
322
336
  });
323
- var tryable = this.getTryableList(later);
324
- this.scheduleTryable(tryable);
337
+ var tryable = this.removeEventsExceedFlushMaxRetries(later);
338
+ this.scheduleEvents(tryable);
325
339
  };
326
340
  Destination.prototype.fulfillRequest = function (list, code, message) {
327
341
  this.removeEvents(list);
@@ -1 +1 @@
1
- {"version":3,"file":"destination.js","sourceRoot":"","sources":["../../../src/plugins/destination.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Config,\n DestinationContext as Context,\n DestinationPlugin,\n Event,\n InvalidResponse,\n PayloadTooLargeResponse,\n RateLimitResponse,\n Response,\n Result,\n Status,\n SuccessResponse,\n} from '@amplitude/analytics-types';\nimport {\n INVALID_API_KEY,\n MAX_RETRIES_EXCEEDED_MESSAGE,\n MISSING_API_KEY_MESSAGE,\n SUCCESS_MESSAGE,\n UNEXPECTED_ERROR_MESSAGE,\n} from '../messages';\nimport { STORAGE_PREFIX } from '../constants';\nimport { chunk } from '../utils/chunk';\nimport { buildResult } from '../utils/result-builder';\nimport { createServerConfig, RequestMetadata } from '../config';\nimport { UUID } from '../utils/uuid';\n\nfunction getErrorMessage(error: unknown) {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\nexport function getResponseBodyString(res: Response) {\n let responseBodyString = '';\n try {\n if ('body' in res) {\n responseBodyString = JSON.stringify(res.body, null, 2);\n }\n } catch {\n // to avoid crash, but don't care about the error, add comment to avoid empty block lint error\n }\n return responseBodyString;\n}\n\nexport class Destination implements DestinationPlugin {\n name = 'amplitude';\n type = 'destination' as const;\n\n retryTimeout = 1000;\n throttleTimeout = 30000;\n storageKey = '';\n // this.config is defined in setup() which will always be called first\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n config: Config;\n private scheduled: ReturnType<typeof setTimeout> | null = null;\n queue: Context[] = [];\n\n async setup(config: Config): Promise<undefined> {\n this.config = config;\n\n this.storageKey = `${STORAGE_PREFIX}_${this.config.apiKey.substring(0, 10)}`;\n const unsent = await this.config.storageProvider?.get(this.storageKey);\n if (unsent && unsent.length > 0) {\n void Promise.all(unsent.map((event) => this.execute(event))).catch();\n }\n\n return Promise.resolve(undefined);\n }\n\n execute(event: Event): Promise<Result> {\n // Assign insert_id for dropping invalid event later\n if (!event.insert_id) {\n event.insert_id = UUID();\n }\n\n return new Promise((resolve) => {\n const context = {\n event,\n attempts: 0,\n callback: (result: Result) => resolve(result),\n timeout: 0,\n };\n void this.addToQueue(context);\n });\n }\n\n getTryableList(list: Context[]) {\n return list.filter((context) => {\n if (context.attempts < this.config.flushMaxRetries) {\n context.attempts += 1;\n return true;\n }\n void this.fulfillRequest([context], 500, MAX_RETRIES_EXCEEDED_MESSAGE);\n return false;\n });\n }\n\n scheduleTryable(list: Context[], shouldAddToQueue = false) {\n list.forEach((context) => {\n // Only need to concat the queue for the first time\n if (shouldAddToQueue) {\n this.queue = this.queue.concat(context);\n }\n if (context.timeout === 0) {\n this.schedule(this.config.flushIntervalMillis);\n return;\n }\n\n setTimeout(() => {\n context.timeout = 0;\n this.schedule(0);\n }, context.timeout);\n });\n }\n\n addToQueue(...list: Context[]) {\n const tryable = this.getTryableList(list);\n this.scheduleTryable(tryable, true);\n this.saveEvents();\n }\n\n schedule(timeout: number) {\n if (this.scheduled || this.config.offline) {\n return;\n }\n\n this.scheduled = setTimeout(() => {\n void this.flush(true).then(() => {\n if (this.queue.length > 0) {\n this.schedule(timeout);\n }\n });\n }, timeout);\n }\n\n async flush(useRetry = false) {\n // Skip flush if offline\n if (this.config.offline) {\n this.config.loggerProvider.debug('Skipping flush while offline.');\n return;\n }\n\n const list: Context[] = [];\n const later: Context[] = [];\n this.queue.forEach((context) => (context.timeout === 0 ? list.push(context) : later.push(context)));\n\n if (this.scheduled) {\n clearTimeout(this.scheduled);\n this.scheduled = null;\n }\n\n const batches = chunk(list, this.config.flushQueueSize);\n\n // Promise.all() doesn't guarantee resolve order.\n // Sequentially resolve to make sure backend receives events in order\n await batches.reduce(async (promise, batch) => {\n await promise;\n return await this.send(batch, useRetry);\n }, Promise.resolve());\n\n this.scheduleTryable(later);\n }\n\n async send(list: Context[], useRetry = true) {\n if (!this.config.apiKey) {\n return this.fulfillRequest(list, 400, MISSING_API_KEY_MESSAGE);\n }\n\n const payload = {\n api_key: this.config.apiKey,\n events: list.map((context) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { extra, ...eventWithoutExtra } = context.event;\n return eventWithoutExtra;\n }),\n options: {\n min_id_length: this.config.minIdLength,\n },\n client_upload_time: new Date().toISOString(),\n request_metadata: this.config.requestMetadata,\n };\n this.config.requestMetadata = new RequestMetadata();\n\n try {\n const { serverUrl } = createServerConfig(this.config.serverUrl, this.config.serverZone, this.config.useBatch);\n const res = await this.config.transportProvider.send(serverUrl, payload);\n if (res === null) {\n this.fulfillRequest(list, 0, UNEXPECTED_ERROR_MESSAGE);\n return;\n }\n if (!useRetry) {\n if ('body' in res) {\n this.fulfillRequest(list, res.statusCode, `${res.status}: ${getResponseBodyString(res)}`);\n } else {\n this.fulfillRequest(list, res.statusCode, res.status);\n }\n return;\n }\n this.handleResponse(res, list);\n } catch (e) {\n const errorMessage = getErrorMessage(e);\n this.config.loggerProvider.error(errorMessage);\n this.handleResponse({ status: Status.Failed, statusCode: 0 }, list);\n }\n }\n\n handleResponse(res: Response, list: Context[]) {\n const { status } = res;\n\n switch (status) {\n case Status.Success: {\n this.handleSuccessResponse(res, list);\n break;\n }\n case Status.Invalid: {\n this.handleInvalidResponse(res, list);\n break;\n }\n case Status.PayloadTooLarge: {\n this.handlePayloadTooLargeResponse(res, list);\n break;\n }\n case Status.RateLimit: {\n this.handleRateLimitResponse(res, list);\n break;\n }\n default: {\n // log intermediate event status before retry\n this.config.loggerProvider.warn(`{code: 0, error: \"Status '${status}' provided for ${list.length} events\"}`);\n this.handleOtherResponse(list);\n break;\n }\n }\n }\n\n handleSuccessResponse(res: SuccessResponse, list: Context[]) {\n this.fulfillRequest(list, res.statusCode, SUCCESS_MESSAGE);\n }\n\n handleInvalidResponse(res: InvalidResponse, list: Context[]) {\n if (res.body.missingField || res.body.error.startsWith(INVALID_API_KEY)) {\n this.fulfillRequest(list, res.statusCode, res.body.error);\n return;\n }\n\n const dropIndex = [\n ...Object.values(res.body.eventsWithInvalidFields),\n ...Object.values(res.body.eventsWithMissingFields),\n ...Object.values(res.body.eventsWithInvalidIdLengths),\n ...res.body.silencedEvents,\n ].flat();\n const dropIndexSet = new Set(dropIndex);\n\n const retry = list.filter((context, index) => {\n if (dropIndexSet.has(index)) {\n this.fulfillRequest([context], res.statusCode, res.body.error);\n return;\n }\n return true;\n });\n\n if (retry.length > 0) {\n // log intermediate event status before retry\n this.config.loggerProvider.warn(getResponseBodyString(res));\n }\n\n const tryable = this.getTryableList(retry);\n this.scheduleTryable(tryable);\n }\n\n handlePayloadTooLargeResponse(res: PayloadTooLargeResponse, list: Context[]) {\n if (list.length === 1) {\n this.fulfillRequest(list, res.statusCode, res.body.error);\n return;\n }\n\n // log intermediate event status before retry\n this.config.loggerProvider.warn(getResponseBodyString(res));\n\n this.config.flushQueueSize /= 2;\n\n const tryable = this.getTryableList(list);\n this.scheduleTryable(tryable);\n }\n\n handleRateLimitResponse(res: RateLimitResponse, list: Context[]) {\n const dropUserIds = Object.keys(res.body.exceededDailyQuotaUsers);\n const dropDeviceIds = Object.keys(res.body.exceededDailyQuotaDevices);\n const throttledIndex = res.body.throttledEvents;\n const dropUserIdsSet = new Set(dropUserIds);\n const dropDeviceIdsSet = new Set(dropDeviceIds);\n const throttledIndexSet = new Set(throttledIndex);\n\n const retry = list.filter((context, index) => {\n if (\n (context.event.user_id && dropUserIdsSet.has(context.event.user_id)) ||\n (context.event.device_id && dropDeviceIdsSet.has(context.event.device_id))\n ) {\n this.fulfillRequest([context], res.statusCode, res.body.error);\n return;\n }\n if (throttledIndexSet.has(index)) {\n context.timeout = this.throttleTimeout;\n }\n return true;\n });\n\n if (retry.length > 0) {\n // log intermediate event status before retry\n this.config.loggerProvider.warn(getResponseBodyString(res));\n }\n\n const tryable = this.getTryableList(retry);\n this.scheduleTryable(tryable);\n }\n\n handleOtherResponse(list: Context[]) {\n const later = list.map((context) => {\n context.timeout = context.attempts * this.retryTimeout;\n return context;\n });\n\n const tryable = this.getTryableList(later);\n this.scheduleTryable(tryable);\n }\n\n fulfillRequest(list: Context[], code: number, message: string) {\n this.removeEvents(list);\n list.forEach((context) => context.callback(buildResult(context.event, code, message)));\n }\n\n /**\n * This is called on\n * 1) new events are added to queue; or\n * 2) response comes back for a request\n *\n * Update the event storage based on the queue\n */\n saveEvents() {\n if (!this.config.storageProvider) {\n return;\n }\n\n const updatedEvents = this.queue.map((context) => context.event);\n void this.config.storageProvider.set(this.storageKey, updatedEvents);\n }\n\n /**\n * This is called on response comes back for a request\n */\n removeEvents(eventsToRemove: Context[]) {\n this.queue = this.queue.filter(\n (queuedContext) => !eventsToRemove.some((context) => context.event.insert_id === queuedContext.event.insert_id),\n );\n\n this.saveEvents();\n }\n}\n"]}
1
+ {"version":3,"file":"destination.js","sourceRoot":"","sources":["../../../src/plugins/destination.ts"],"names":[],"mappings":";;;;AAGA,0CAAyC;AAQzC,8CAM2B;AAC3B,gDAAoD;AACpD,wCAAuC;AACvC,0DAAsD;AACtD,oCAAgE;AAChE,sCAAqC;AAWrC,SAAS,eAAe,CAAC,KAAc;IACrC,IAAI,KAAK,YAAY,KAAK;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IACjD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACvB,CAAC;AAED,SAAgB,qBAAqB,CAAC,GAAa;IACjD,IAAI,kBAAkB,GAAG,EAAE,CAAC;IAC5B,IAAI;QACF,IAAI,MAAM,IAAI,GAAG,EAAE;YACjB,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;SACxD;KACF;IAAC,WAAM;QACN,8FAA8F;KAC/F;IACD,OAAO,kBAAkB,CAAC;AAC5B,CAAC;AAVD,sDAUC;AAED;IAAA;QACE,SAAI,GAAG,WAAW,CAAC;QACnB,SAAI,GAAG,aAAsB,CAAC;QAE9B,iBAAY,GAAG,IAAI,CAAC;QACpB,oBAAe,GAAG,KAAK,CAAC;QACxB,eAAU,GAAG,EAAE,CAAC;QAKhB,wEAAwE;QACxE,cAAc;QACd,wCAAwC;QACxC,gCAAgC;QAChC,eAAU,GAAyC,IAAI,CAAC;QACxD,8CAA8C;QAC9C,qBAAgB,GAAG,CAAC,CAAC;QACrB,+CAA+C;QAC/C,6CAA6C;QAC7C,YAAO,GAAyC,IAAI,CAAC;QACrD,UAAK,GAAc,EAAE,CAAC;IAwTxB,CAAC;IAtTO,2BAAK,GAAX,UAAY,MAAe;;;;;;;;wBACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;wBAErB,IAAI,CAAC,UAAU,GAAG,UAAG,0BAAc,cAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAE,CAAC;wBAC9D,qBAAM,CAAA,MAAA,IAAI,CAAC,MAAM,CAAC,eAAe,0CAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA,EAAA;;wBAAhE,MAAM,GAAG,SAAuD;wBACtE,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE;4BAC/B,KAAK,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAC,KAAK,IAAK,OAAA,KAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAnB,CAAmB,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;yBACtE;wBAED,sBAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAC;;;;KACnC;IAED,6BAAO,GAAP,UAAQ,KAAY;QAApB,iBAiBC;QAhBC,oDAAoD;QACpD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;YACpB,KAAK,CAAC,SAAS,GAAG,IAAA,WAAI,GAAE,CAAC;SAC1B;QAED,OAAO,IAAI,OAAO,CAAC,UAAC,OAAO;YACzB,IAAM,OAAO,GAAG;gBACd,KAAK,OAAA;gBACL,QAAQ,EAAE,CAAC;gBACX,QAAQ,EAAE,UAAC,MAAc,IAAK,OAAA,OAAO,CAAC,MAAM,CAAC,EAAf,CAAe;gBAC7C,OAAO,EAAE,CAAC;aACX,CAAC;YACF,KAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzB,KAAI,CAAC,QAAQ,CAAC,KAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;YAC/C,KAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC,CAAC,CAAC;IACL,CAAC;IAED,uDAAiC,GAAjC,UAAkC,IAAe;QAAjD,iBASC;QARC,OAAO,IAAI,CAAC,MAAM,CAAC,UAAC,OAAO;YACzB,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC;YACtB,IAAI,OAAO,CAAC,QAAQ,GAAG,KAAI,CAAC,MAAM,CAAC,eAAe,EAAE;gBAClD,OAAO,IAAI,CAAC;aACb;YACD,KAAK,KAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,uCAA4B,CAAC,CAAC;YACvE,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;IAED,oCAAc,GAAd,UAAe,IAAe;QAA9B,iBAIC;QAHC,IAAI,CAAC,OAAO,CAAC,UAAC,OAAO;YACnB,KAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC3F,CAAC,CAAC,CAAC;IACL,CAAC;IAED,mCAAmC;IACnC,iBAAiB;IACjB,4CAA4C;IAC5C,+EAA+E;IAC/E,8BAAQ,GAAR,UAAS,OAAe;QAAxB,iBAmBC;QAlBC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;YACvB,OAAO;SACR;QAED,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,IAAI,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,EAAE;YACpF,IAAI,IAAI,CAAC,UAAU,EAAE;gBACnB,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;aAC/B;YACD,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC;YAChC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;gBAC3B,KAAI,CAAC,KAAK,GAAG,KAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAC,OAAO;oBAClC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC;oBACpB,OAAO,OAAO,CAAC;gBACjB,CAAC,CAAC,CAAC;gBACH,KAAK,KAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC,EAAE,OAAO,CAAC,CAAC;YACZ,OAAO;SACR;IACH,CAAC;IAED,oCAAoC;IACpC,mCAAa,GAAb;QACE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,+CAA+C;IACzC,2BAAK,GAAX,UAAY,QAAgB;QAAhB,yBAAA,EAAA,gBAAgB;;;;;;;wBAC1B,wBAAwB;wBACxB,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;4BACvB,IAAI,CAAC,aAAa,EAAE,CAAC;4BACrB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;4BAClE,sBAAO;yBACR;wBAED,IAAI,IAAI,CAAC,OAAO,EAAE;4BAChB,IAAI,CAAC,aAAa,EAAE,CAAC;4BACrB,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;4BAC5F,sBAAO;yBACR;wBAED,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC;wBAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;wBAEf,IAAI,GAAc,EAAE,CAAC;wBACrB,KAAK,GAAc,EAAE,CAAC;wBAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,CAAC,OAAO,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAlE,CAAkE,CAAC,CAAC;wBAE9F,OAAO,GAAG,IAAA,aAAK,EAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;wBAExD,iDAAiD;wBACjD,qEAAqE;wBACrE,qBAAM,OAAO,CAAC,MAAM,CAAC,UAAO,OAAO,EAAE,KAAK;;;gDACxC,qBAAM,OAAO,EAAA;;4CAAb,SAAa,CAAC;4CACP,qBAAM,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAA;gDAAvC,sBAAO,SAAgC,EAAC;;;iCACzC,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,EAAA;;wBALrB,iDAAiD;wBACjD,qEAAqE;wBACrE,SAGqB,CAAC;wBAEtB,6BAA6B;wBAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;wBAEpB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;;;;KACjC;IAEK,0BAAI,GAAV,UAAW,IAAe,EAAE,QAAe;QAAf,yBAAA,EAAA,eAAe;;;;;;wBACzC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;4BACvB,sBAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,kCAAuB,CAAC,EAAC;yBAChE;wBAEK,OAAO,GAAG;4BACd,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;4BAC3B,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,UAAC,OAAO;gCACvB,6DAA6D;gCAC7D,IAAM,KAAkC,OAAO,CAAC,KAAK,EAA7C,KAAK,WAAA,EAAK,iBAAiB,sBAA7B,SAA+B,CAAgB,CAAC;gCACtD,OAAO,iBAAiB,CAAC;4BAC3B,CAAC,CAAC;4BACF,OAAO,EAAE;gCACP,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;6BACvC;4BACD,kBAAkB,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;4BAC5C,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,eAAe;yBAC9C,CAAC;wBACF,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,IAAI,wBAAe,EAAE,CAAC;;;;wBAG1C,SAAS,GAAK,IAAA,2BAAkB,EAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,UAA5F,CAA6F;wBAClG,qBAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAA;;wBAAlE,GAAG,GAAG,SAA4D;wBACxE,IAAI,GAAG,KAAK,IAAI,EAAE;4BAChB,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC,EAAE,mCAAwB,CAAC,CAAC;4BACvD,sBAAO;yBACR;wBACD,IAAI,CAAC,QAAQ,EAAE;4BACb,IAAI,MAAM,IAAI,GAAG,EAAE;gCACjB,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,UAAG,GAAG,CAAC,MAAM,eAAK,qBAAqB,CAAC,GAAG,CAAC,CAAE,CAAC,CAAC;6BAC3F;iCAAM;gCACL,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;6BACvD;4BACD,sBAAO;yBACR;wBACD,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;;;;wBAEzB,YAAY,GAAG,eAAe,CAAC,GAAC,CAAC,CAAC;wBACxC,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;wBAC/C,IAAI,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,eAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;;;;;;KAEvE;IAED,oCAAc,GAAd,UAAe,GAAa,EAAE,IAAe;QACnC,IAAA,MAAM,GAAK,GAAG,OAAR,CAAS;QAEvB,QAAQ,MAAM,EAAE;YACd,KAAK,eAAM,CAAC,OAAO,CAAC,CAAC;gBACnB,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACtC,MAAM;aACP;YACD,KAAK,eAAM,CAAC,OAAO,CAAC,CAAC;gBACnB,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACtC,MAAM;aACP;YACD,KAAK,eAAM,CAAC,eAAe,CAAC,CAAC;gBAC3B,IAAI,CAAC,6BAA6B,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC9C,MAAM;aACP;YACD,KAAK,eAAM,CAAC,SAAS,CAAC,CAAC;gBACrB,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBACxC,MAAM;aACP;YACD,OAAO,CAAC,CAAC;gBACP,6CAA6C;gBAC7C,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,qCAA6B,MAAM,4BAAkB,IAAI,CAAC,MAAM,eAAW,CAAC,CAAC;gBAC7G,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;gBAC/B,MAAM;aACP;SACF;IACH,CAAC;IAED,2CAAqB,GAArB,UAAsB,GAAoB,EAAE,IAAe;QACzD,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,0BAAe,CAAC,CAAC;IAC7D,CAAC;IAED,2CAAqB,GAArB,UAAsB,GAAoB,EAAE,IAAe;QAA3D,iBA6BC;QA5BC,IAAI,GAAG,CAAC,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,0BAAe,CAAC,EAAE;YACvE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1D,OAAO;SACR;QAED,IAAM,SAAS,GAAG,2GACb,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,0BAC/C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,0BAC/C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,0BAClD,GAAG,CAAC,IAAI,CAAC,cAAc,UAC1B,IAAI,EAAE,CAAC;QACT,IAAM,YAAY,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QAExC,IAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAC,OAAO,EAAE,KAAK;YACvC,IAAI,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBAC3B,KAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC/D,OAAO;aACR;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,6CAA6C;YAC7C,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;SAC7D;QAED,IAAM,OAAO,GAAG,IAAI,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,mDAA6B,GAA7B,UAA8B,GAA4B,EAAE,IAAe;QACzE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE;YACrB,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1D,OAAO;SACR;QAED,6CAA6C;QAC7C,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;QAE5D,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,CAAC;QAEhC,IAAM,OAAO,GAAG,IAAI,CAAC,iCAAiC,CAAC,IAAI,CAAC,CAAC;QAC7D,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,6CAAuB,GAAvB,UAAwB,GAAsB,EAAE,IAAe;QAA/D,iBA6BC;QA5BC,IAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAClE,IAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACtE,IAAM,cAAc,GAAG,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC;QAChD,IAAM,cAAc,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QAC5C,IAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QAChD,IAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC;QAElD,IAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAC,OAAO,EAAE,KAAK;YACvC,IACE,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,IAAI,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACpE,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,EAC1E;gBACA,KAAI,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC/D,OAAO;aACR;YACD,IAAI,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBAChC,OAAO,CAAC,OAAO,GAAG,KAAI,CAAC,eAAe,CAAC;aACxC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;YACpB,6CAA6C;YAC7C,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,CAAC,CAAC;SAC7D;QAED,IAAM,OAAO,GAAG,IAAI,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,yCAAmB,GAAnB,UAAoB,IAAe;QAAnC,iBAQC;QAPC,IAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,UAAC,OAAO;YAC7B,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,KAAI,CAAC,YAAY,CAAC;YACvD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,IAAM,OAAO,GAAG,IAAI,CAAC,iCAAiC,CAAC,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;IAC/B,CAAC;IAED,oCAAc,GAAd,UAAe,IAAe,EAAE,IAAY,EAAE,OAAe;QAC3D,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,QAAQ,CAAC,IAAA,4BAAW,EAAC,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,EAA3D,CAA2D,CAAC,CAAC;IACzF,CAAC;IAED;;;;;;OAMG;IACH,gCAAU,GAAV;QACE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE;YAChC,OAAO;SACR;QAED,IAAM,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,KAAK,EAAb,CAAa,CAAC,CAAC;QACjE,KAAK,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IACvE,CAAC;IAED;;OAEG;IACH,kCAAY,GAAZ,UAAa,cAAyB;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAC5B,UAAC,aAAa,IAAK,OAAA,CAAC,cAAc,CAAC,IAAI,CAAC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,KAAK,CAAC,SAAS,KAAK,aAAa,CAAC,KAAK,CAAC,SAAS,EAAzD,CAAyD,CAAC,EAA5F,CAA4F,CAChH,CAAC;QAEF,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IACH,kBAAC;AAAD,CAAC,AA7UD,IA6UC;AA7UY,kCAAW","sourcesContent":["import { DestinationPlugin } from '../types/plugin';\nimport { Event } from '../types/event/event';\nimport { Result } from '../types/result';\nimport { Status } from '../types/status';\nimport {\n Response,\n InvalidResponse,\n PayloadTooLargeResponse,\n RateLimitResponse,\n SuccessResponse,\n} from '../types/response';\nimport {\n INVALID_API_KEY,\n MAX_RETRIES_EXCEEDED_MESSAGE,\n MISSING_API_KEY_MESSAGE,\n SUCCESS_MESSAGE,\n UNEXPECTED_ERROR_MESSAGE,\n} from '../types/messages';\nimport { STORAGE_PREFIX } from '../types/constants';\nimport { chunk } from '../utils/chunk';\nimport { buildResult } from '../utils/result-builder';\nimport { createServerConfig, RequestMetadata } from '../config';\nimport { UUID } from '../utils/uuid';\nimport { IConfig } from '../config';\nimport { EventCallback } from '../types/event-callback';\n\nexport interface Context {\n event: Event;\n attempts: number;\n callback: EventCallback;\n timeout: number;\n}\n\nfunction getErrorMessage(error: unknown) {\n if (error instanceof Error) return error.message;\n return String(error);\n}\n\nexport function getResponseBodyString(res: Response) {\n let responseBodyString = '';\n try {\n if ('body' in res) {\n responseBodyString = JSON.stringify(res.body, null, 2);\n }\n } catch {\n // to avoid crash, but don't care about the error, add comment to avoid empty block lint error\n }\n return responseBodyString;\n}\n\nexport class Destination implements DestinationPlugin {\n name = 'amplitude';\n type = 'destination' as const;\n\n retryTimeout = 1000;\n throttleTimeout = 30000;\n storageKey = '';\n // this.config is defined in setup() which will always be called first\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n config: IConfig;\n // Indicator of whether events that are scheduled (but not flushed yet).\n // When flush:\n // 1. assign `scheduleId` to `flushId`\n // 2. set `scheduleId` to null\n scheduleId: ReturnType<typeof setTimeout> | null = null;\n // Timeout in milliseconds of current schedule\n scheduledTimeout = 0;\n // Indicator of whether current flush resolves.\n // When flush resolves, set `flushId` to null\n flushId: ReturnType<typeof setTimeout> | null = null;\n queue: Context[] = [];\n\n async setup(config: IConfig): Promise<undefined> {\n this.config = config;\n\n this.storageKey = `${STORAGE_PREFIX}_${this.config.apiKey.substring(0, 10)}`;\n const unsent = await this.config.storageProvider?.get(this.storageKey);\n if (unsent && unsent.length > 0) {\n void Promise.all(unsent.map((event) => this.execute(event))).catch();\n }\n\n return Promise.resolve(undefined);\n }\n\n execute(event: Event): Promise<Result> {\n // Assign insert_id for dropping invalid event later\n if (!event.insert_id) {\n event.insert_id = UUID();\n }\n\n return new Promise((resolve) => {\n const context = {\n event,\n attempts: 0,\n callback: (result: Result) => resolve(result),\n timeout: 0,\n };\n this.queue.push(context);\n this.schedule(this.config.flushIntervalMillis);\n this.saveEvents();\n });\n }\n\n removeEventsExceedFlushMaxRetries(list: Context[]) {\n return list.filter((context) => {\n context.attempts += 1;\n if (context.attempts < this.config.flushMaxRetries) {\n return true;\n }\n void this.fulfillRequest([context], 500, MAX_RETRIES_EXCEEDED_MESSAGE);\n return false;\n });\n }\n\n scheduleEvents(list: Context[]) {\n list.forEach((context) => {\n this.schedule(context.timeout === 0 ? this.config.flushIntervalMillis : context.timeout);\n });\n }\n\n // Schedule a flush in timeout when\n // 1. No schedule\n // 2. Timeout greater than existing timeout.\n // This makes sure that when throttled, no flush when throttle timeout expires.\n schedule(timeout: number) {\n if (this.config.offline) {\n return;\n }\n\n if (this.scheduleId === null || (this.scheduleId && timeout > this.scheduledTimeout)) {\n if (this.scheduleId) {\n clearTimeout(this.scheduleId);\n }\n this.scheduledTimeout = timeout;\n this.scheduleId = setTimeout(() => {\n this.queue = this.queue.map((context) => {\n context.timeout = 0;\n return context;\n });\n void this.flush(true);\n }, timeout);\n return;\n }\n }\n\n // Mark current schedule is flushed.\n resetSchedule() {\n this.scheduleId = null;\n this.scheduledTimeout = 0;\n }\n\n // Flush all events regardless of their timeout\n async flush(useRetry = false) {\n // Skip flush if offline\n if (this.config.offline) {\n this.resetSchedule();\n this.config.loggerProvider.debug('Skipping flush while offline.');\n return;\n }\n\n if (this.flushId) {\n this.resetSchedule();\n this.config.loggerProvider.debug('Skipping flush because previous flush has not resolved.');\n return;\n }\n\n this.flushId = this.scheduleId;\n this.resetSchedule();\n\n const list: Context[] = [];\n const later: Context[] = [];\n this.queue.forEach((context) => (context.timeout === 0 ? list.push(context) : later.push(context)));\n\n const batches = chunk(list, this.config.flushQueueSize);\n\n // Promise.all() doesn't guarantee resolve order.\n // Sequentially resolve to make sure backend receives events in order\n await batches.reduce(async (promise, batch) => {\n await promise;\n return await this.send(batch, useRetry);\n }, Promise.resolve());\n\n // Mark current flush is done\n this.flushId = null;\n\n this.scheduleEvents(this.queue);\n }\n\n async send(list: Context[], useRetry = true) {\n if (!this.config.apiKey) {\n return this.fulfillRequest(list, 400, MISSING_API_KEY_MESSAGE);\n }\n\n const payload = {\n api_key: this.config.apiKey,\n events: list.map((context) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { extra, ...eventWithoutExtra } = context.event;\n return eventWithoutExtra;\n }),\n options: {\n min_id_length: this.config.minIdLength,\n },\n client_upload_time: new Date().toISOString(),\n request_metadata: this.config.requestMetadata,\n };\n this.config.requestMetadata = new RequestMetadata();\n\n try {\n const { serverUrl } = createServerConfig(this.config.serverUrl, this.config.serverZone, this.config.useBatch);\n const res = await this.config.transportProvider.send(serverUrl, payload);\n if (res === null) {\n this.fulfillRequest(list, 0, UNEXPECTED_ERROR_MESSAGE);\n return;\n }\n if (!useRetry) {\n if ('body' in res) {\n this.fulfillRequest(list, res.statusCode, `${res.status}: ${getResponseBodyString(res)}`);\n } else {\n this.fulfillRequest(list, res.statusCode, res.status);\n }\n return;\n }\n this.handleResponse(res, list);\n } catch (e) {\n const errorMessage = getErrorMessage(e);\n this.config.loggerProvider.error(errorMessage);\n this.handleResponse({ status: Status.Failed, statusCode: 0 }, list);\n }\n }\n\n handleResponse(res: Response, list: Context[]) {\n const { status } = res;\n\n switch (status) {\n case Status.Success: {\n this.handleSuccessResponse(res, list);\n break;\n }\n case Status.Invalid: {\n this.handleInvalidResponse(res, list);\n break;\n }\n case Status.PayloadTooLarge: {\n this.handlePayloadTooLargeResponse(res, list);\n break;\n }\n case Status.RateLimit: {\n this.handleRateLimitResponse(res, list);\n break;\n }\n default: {\n // log intermediate event status before retry\n this.config.loggerProvider.warn(`{code: 0, error: \"Status '${status}' provided for ${list.length} events\"}`);\n this.handleOtherResponse(list);\n break;\n }\n }\n }\n\n handleSuccessResponse(res: SuccessResponse, list: Context[]) {\n this.fulfillRequest(list, res.statusCode, SUCCESS_MESSAGE);\n }\n\n handleInvalidResponse(res: InvalidResponse, list: Context[]) {\n if (res.body.missingField || res.body.error.startsWith(INVALID_API_KEY)) {\n this.fulfillRequest(list, res.statusCode, res.body.error);\n return;\n }\n\n const dropIndex = [\n ...Object.values(res.body.eventsWithInvalidFields),\n ...Object.values(res.body.eventsWithMissingFields),\n ...Object.values(res.body.eventsWithInvalidIdLengths),\n ...res.body.silencedEvents,\n ].flat();\n const dropIndexSet = new Set(dropIndex);\n\n const retry = list.filter((context, index) => {\n if (dropIndexSet.has(index)) {\n this.fulfillRequest([context], res.statusCode, res.body.error);\n return;\n }\n return true;\n });\n\n if (retry.length > 0) {\n // log intermediate event status before retry\n this.config.loggerProvider.warn(getResponseBodyString(res));\n }\n\n const tryable = this.removeEventsExceedFlushMaxRetries(retry);\n this.scheduleEvents(tryable);\n }\n\n handlePayloadTooLargeResponse(res: PayloadTooLargeResponse, list: Context[]) {\n if (list.length === 1) {\n this.fulfillRequest(list, res.statusCode, res.body.error);\n return;\n }\n\n // log intermediate event status before retry\n this.config.loggerProvider.warn(getResponseBodyString(res));\n\n this.config.flushQueueSize /= 2;\n\n const tryable = this.removeEventsExceedFlushMaxRetries(list);\n this.scheduleEvents(tryable);\n }\n\n handleRateLimitResponse(res: RateLimitResponse, list: Context[]) {\n const dropUserIds = Object.keys(res.body.exceededDailyQuotaUsers);\n const dropDeviceIds = Object.keys(res.body.exceededDailyQuotaDevices);\n const throttledIndex = res.body.throttledEvents;\n const dropUserIdsSet = new Set(dropUserIds);\n const dropDeviceIdsSet = new Set(dropDeviceIds);\n const throttledIndexSet = new Set(throttledIndex);\n\n const retry = list.filter((context, index) => {\n if (\n (context.event.user_id && dropUserIdsSet.has(context.event.user_id)) ||\n (context.event.device_id && dropDeviceIdsSet.has(context.event.device_id))\n ) {\n this.fulfillRequest([context], res.statusCode, res.body.error);\n return;\n }\n if (throttledIndexSet.has(index)) {\n context.timeout = this.throttleTimeout;\n }\n return true;\n });\n\n if (retry.length > 0) {\n // log intermediate event status before retry\n this.config.loggerProvider.warn(getResponseBodyString(res));\n }\n\n const tryable = this.removeEventsExceedFlushMaxRetries(retry);\n this.scheduleEvents(tryable);\n }\n\n handleOtherResponse(list: Context[]) {\n const later = list.map((context) => {\n context.timeout = context.attempts * this.retryTimeout;\n return context;\n });\n\n const tryable = this.removeEventsExceedFlushMaxRetries(later);\n this.scheduleEvents(tryable);\n }\n\n fulfillRequest(list: Context[], code: number, message: string) {\n this.removeEvents(list);\n list.forEach((context) => context.callback(buildResult(context.event, code, message)));\n }\n\n /**\n * This is called on\n * 1) new events are added to queue; or\n * 2) response comes back for a request\n *\n * Update the event storage based on the queue\n */\n saveEvents() {\n if (!this.config.storageProvider) {\n return;\n }\n\n const updatedEvents = this.queue.map((context) => context.event);\n void this.config.storageProvider.set(this.storageKey, updatedEvents);\n }\n\n /**\n * This is called on response comes back for a request\n */\n removeEvents(eventsToRemove: Context[]) {\n this.queue = this.queue.filter(\n (queuedContext) => !eventsToRemove.some((context) => context.event.insert_id === queuedContext.event.insert_id),\n );\n\n this.saveEvents();\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { BeforePlugin } from '../types/plugin';
2
+ import { IConfig } from '../config';
3
+ import { Event } from '../types/event/event';
4
+ export declare class IdentityEventSender implements BeforePlugin {
5
+ name: string;
6
+ type: "before";
7
+ identityStore: import("@amplitude/analytics-connector/dist/types/src/identityStore").IdentityStoreImpl;
8
+ execute(context: Event): Promise<Event>;
9
+ setup(config: IConfig): Promise<void>;
10
+ }
11
+ //# sourceMappingURL=identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../../../src/plugins/identity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAG7C,qBAAa,mBAAoB,YAAW,YAAY;IACtD,IAAI,SAAc;IAClB,IAAI,WAAqB;IAEzB,aAAa,0FAAyC;IAEhD,OAAO,CAAC,OAAO,EAAE,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAQvC,KAAK,CAAC,MAAM,EAAE,OAAO;CAK5B"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IdentityEventSender = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var analytics_connector_1 = require("../analytics-connector");
6
+ var IdentityEventSender = /** @class */ (function () {
7
+ function IdentityEventSender() {
8
+ this.name = 'identity';
9
+ this.type = 'before';
10
+ this.identityStore = (0, analytics_connector_1.getAnalyticsConnector)().identityStore;
11
+ }
12
+ IdentityEventSender.prototype.execute = function (context) {
13
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
14
+ var userProperties;
15
+ return tslib_1.__generator(this, function (_a) {
16
+ userProperties = context.user_properties;
17
+ if (userProperties) {
18
+ this.identityStore.editIdentity().updateUserProperties(userProperties).commit();
19
+ }
20
+ return [2 /*return*/, context];
21
+ });
22
+ });
23
+ };
24
+ IdentityEventSender.prototype.setup = function (config) {
25
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
26
+ return tslib_1.__generator(this, function (_a) {
27
+ if (config.instanceName) {
28
+ this.identityStore = (0, analytics_connector_1.getAnalyticsConnector)(config.instanceName).identityStore;
29
+ }
30
+ return [2 /*return*/];
31
+ });
32
+ });
33
+ };
34
+ return IdentityEventSender;
35
+ }());
36
+ exports.IdentityEventSender = IdentityEventSender;
37
+ //# sourceMappingURL=identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../../../src/plugins/identity.ts"],"names":[],"mappings":";;;;AAGA,8DAA+D;AAE/D;IAAA;QACE,SAAI,GAAG,UAAU,CAAC;QAClB,SAAI,GAAG,QAAiB,CAAC;QAEzB,kBAAa,GAAG,IAAA,2CAAqB,GAAE,CAAC,aAAa,CAAC;IAexD,CAAC;IAbO,qCAAO,GAAb,UAAc,OAAc;;;;gBACpB,cAAc,GAAG,OAAO,CAAC,eAAsC,CAAC;gBACtE,IAAI,cAAc,EAAE;oBAClB,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE,CAAC;iBACjF;gBACD,sBAAO,OAAO,EAAC;;;KAChB;IAEK,mCAAK,GAAX,UAAY,MAAe;;;gBACzB,IAAI,MAAM,CAAC,YAAY,EAAE;oBACvB,IAAI,CAAC,aAAa,GAAG,IAAA,2CAAqB,EAAC,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,CAAC;iBAC/E;;;;KACF;IACH,0BAAC;AAAD,CAAC,AAnBD,IAmBC;AAnBY,kDAAmB","sourcesContent":["import { BeforePlugin } from '../types/plugin';\nimport { IConfig } from '../config';\nimport { Event } from '../types/event/event';\nimport { getAnalyticsConnector } from '../analytics-connector';\n\nexport class IdentityEventSender implements BeforePlugin {\n name = 'identity';\n type = 'before' as const;\n\n identityStore = getAnalyticsConnector().identityStore;\n\n async execute(context: Event): Promise<Event> {\n const userProperties = context.user_properties as Record<string, any>;\n if (userProperties) {\n this.identityStore.editIdentity().updateUserProperties(userProperties).commit();\n }\n return context;\n }\n\n async setup(config: IConfig) {\n if (config.instanceName) {\n this.identityStore = getAnalyticsConnector(config.instanceName).identityStore;\n }\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export declare const getQueryParams: () => Record<string, string | undefined>;
2
+ export declare const tryDecodeURIComponent: (value?: string) => string;
3
+ //# sourceMappingURL=query-params.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-params.d.ts","sourceRoot":"","sources":["../../src/query-params.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,cAAc,QAAO,OAAO,MAAM,EAAE,MAAM,GAAG,SAAS,CAkBlE,CAAC;AAEF,eAAO,MAAM,qBAAqB,4BAMjC,CAAC"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tryDecodeURIComponent = exports.getQueryParams = void 0;
4
+ var global_scope_1 = require("./global-scope");
5
+ var getQueryParams = function () {
6
+ var _a;
7
+ var globalScope = (0, global_scope_1.getGlobalScope)();
8
+ /* istanbul ignore if */
9
+ if (!((_a = globalScope === null || globalScope === void 0 ? void 0 : globalScope.location) === null || _a === void 0 ? void 0 : _a.search)) {
10
+ return {};
11
+ }
12
+ var pairs = globalScope.location.search.substring(1).split('&').filter(Boolean);
13
+ var params = pairs.reduce(function (acc, curr) {
14
+ var query = curr.split('=', 2);
15
+ var key = (0, exports.tryDecodeURIComponent)(query[0]);
16
+ var value = (0, exports.tryDecodeURIComponent)(query[1]);
17
+ if (!value) {
18
+ return acc;
19
+ }
20
+ acc[key] = value;
21
+ return acc;
22
+ }, {});
23
+ return params;
24
+ };
25
+ exports.getQueryParams = getQueryParams;
26
+ var tryDecodeURIComponent = function (value) {
27
+ if (value === void 0) { value = ''; }
28
+ try {
29
+ return decodeURIComponent(value);
30
+ }
31
+ catch (_a) {
32
+ return '';
33
+ }
34
+ };
35
+ exports.tryDecodeURIComponent = tryDecodeURIComponent;
36
+ //# sourceMappingURL=query-params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-params.js","sourceRoot":"","sources":["../../src/query-params.ts"],"names":[],"mappings":";;;AAAA,+CAAgD;AAEzC,IAAM,cAAc,GAAG;;IAC5B,IAAM,WAAW,GAAG,IAAA,6BAAc,GAAE,CAAC;IACrC,wBAAwB;IACxB,IAAI,CAAC,CAAA,MAAA,WAAW,aAAX,WAAW,uBAAX,WAAW,CAAE,QAAQ,0CAAE,MAAM,CAAA,EAAE;QAClC,OAAO,EAAE,CAAC;KACX;IACD,IAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClF,IAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAqC,UAAC,GAAG,EAAE,IAAI;QACxE,IAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACjC,IAAM,GAAG,GAAG,IAAA,6BAAqB,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAM,KAAK,GAAG,IAAA,6BAAqB,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,KAAK,EAAE;YACV,OAAO,GAAG,CAAC;SACZ;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACjB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAlBW,QAAA,cAAc,kBAkBzB;AAEK,IAAM,qBAAqB,GAAG,UAAC,KAAU;IAAV,sBAAA,EAAA,UAAU;IAC9C,IAAI;QACF,OAAO,kBAAkB,CAAC,KAAK,CAAC,CAAC;KAClC;IAAC,WAAM;QACN,OAAO,EAAE,CAAC;KACX;AACH,CAAC,CAAC;AANW,QAAA,qBAAqB,yBAMhC","sourcesContent":["import { getGlobalScope } from './global-scope';\n\nexport const getQueryParams = (): Record<string, string | undefined> => {\n const globalScope = getGlobalScope();\n /* istanbul ignore if */\n if (!globalScope?.location?.search) {\n return {};\n }\n const pairs = globalScope.location.search.substring(1).split('&').filter(Boolean);\n const params = pairs.reduce<Record<string, string | undefined>>((acc, curr) => {\n const query = curr.split('=', 2);\n const key = tryDecodeURIComponent(query[0]);\n const value = tryDecodeURIComponent(query[1]);\n if (!value) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n return params;\n};\n\nexport const tryDecodeURIComponent = (value = '') => {\n try {\n return decodeURIComponent(value);\n } catch {\n return '';\n }\n};\n"]}
@@ -1,20 +1,64 @@
1
- import { RevenueEventProperties, Revenue as IRevenue, ValidPropertyType } from '@amplitude/analytics-types';
1
+ export interface IRevenue {
2
+ getEventProperties(): RevenueEventProperties;
3
+ setProductId(productId: string): IRevenue;
4
+ setQuantity(quantity: number): IRevenue;
5
+ setPrice(price: number): IRevenue;
6
+ setRevenueType(revenueType: string): IRevenue;
7
+ setCurrency(currency: string): IRevenue;
8
+ setEventProperties(properties: {
9
+ [key: string]: any;
10
+ }): IRevenue;
11
+ setRevenue(revenue: number): IRevenue;
12
+ setReceipt(receipt: string): IRevenue;
13
+ setReceiptSig(receiptSig: string): IRevenue;
14
+ }
2
15
  export declare class Revenue implements IRevenue {
3
16
  private productId;
4
17
  private quantity;
5
18
  private price;
6
19
  private revenueType?;
20
+ private currency?;
7
21
  private properties?;
8
22
  private revenue?;
23
+ private receipt?;
24
+ private receiptSig?;
9
25
  constructor();
10
26
  setProductId(productId: string): this;
11
27
  setQuantity(quantity: number): this;
12
28
  setPrice(price: number): this;
13
29
  setRevenueType(revenueType: string): this;
30
+ setCurrency(currency: string): this;
14
31
  setRevenue(revenue: number): this;
32
+ setReceipt(receipt: string): this;
33
+ setReceiptSig(receiptSig: string): this;
15
34
  setEventProperties(properties: {
16
35
  [key: string]: ValidPropertyType;
17
36
  }): this;
18
37
  getEventProperties(): RevenueEventProperties;
19
38
  }
39
+ export interface RevenueEventProperties {
40
+ [RevenueProperty.REVENUE_PRODUCT_ID]?: string;
41
+ [RevenueProperty.REVENUE_QUANTITY]?: number;
42
+ [RevenueProperty.REVENUE_PRICE]?: number;
43
+ [RevenueProperty.REVENUE_TYPE]?: string;
44
+ [RevenueProperty.REVENUE_CURRENCY]?: string;
45
+ [RevenueProperty.REVENUE]?: number;
46
+ [RevenueProperty.RECEIPT]?: string;
47
+ [RevenueProperty.RECEIPT_SIG]?: string;
48
+ }
49
+ export declare enum RevenueProperty {
50
+ REVENUE_PRODUCT_ID = "$productId",
51
+ REVENUE_QUANTITY = "$quantity",
52
+ REVENUE_PRICE = "$price",
53
+ REVENUE_TYPE = "$revenueType",
54
+ REVENUE_CURRENCY = "$currency",
55
+ REVENUE = "$revenue",
56
+ RECEIPT = "$receipt",
57
+ RECEIPT_SIG = "$receiptSig"
58
+ }
59
+ export type ValidPropertyType = number | string | boolean | Array<string | number> | {
60
+ [key: string]: ValidPropertyType;
61
+ } | Array<{
62
+ [key: string]: ValidPropertyType;
63
+ }>;
20
64
  //# sourceMappingURL=revenue.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"revenue.d.ts","sourceRoot":"","sources":["../../src/revenue.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,sBAAsB,EACtB,OAAO,IAAI,QAAQ,EACnB,iBAAiB,EAClB,MAAM,4BAA4B,CAAC;AAGpC,qBAAa,OAAQ,YAAW,QAAQ;IACtC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,UAAU,CAAC,CAAyB;IAC5C,OAAO,CAAC,OAAO,CAAC,CAAS;;IAQzB,YAAY,CAAC,SAAS,EAAE,MAAM;IAK9B,WAAW,CAAC,QAAQ,EAAE,MAAM;IAO5B,QAAQ,CAAC,KAAK,EAAE,MAAM;IAKtB,cAAc,CAAC,WAAW,EAAE,MAAM;IAKlC,UAAU,CAAC,OAAO,EAAE,MAAM;IAK1B,kBAAkB,CAAC,UAAU,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAA;KAAE;IAOnE,kBAAkB,IAAI,sBAAsB;CAS7C"}
1
+ {"version":3,"file":"revenue.d.ts","sourceRoot":"","sources":["../../src/revenue.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,QAAQ;IACvB,kBAAkB,IAAI,sBAAsB,CAAC;IAC7C,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC1C,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,QAAQ,CAAC;IAClC,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,QAAQ,CAAC;IAC9C,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAAC;IACxC,kBAAkB,CAAC,UAAU,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,GAAG,QAAQ,CAAC;IACjE,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;IACtC,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC;IACtC,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,QAAQ,CAAC;CAC7C;AAED,qBAAa,OAAQ,YAAW,QAAQ;IACtC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAC,CAAyB;IAC5C,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,OAAO,CAAC,CAAS;IACzB,OAAO,CAAC,UAAU,CAAC,CAAS;;IAQ5B,YAAY,CAAC,SAAS,EAAE,MAAM;IAK9B,WAAW,CAAC,QAAQ,EAAE,MAAM;IAO5B,QAAQ,CAAC,KAAK,EAAE,MAAM;IAKtB,cAAc,CAAC,WAAW,EAAE,MAAM;IAKlC,WAAW,CAAC,QAAQ,EAAE,MAAM;IAK5B,UAAU,CAAC,OAAO,EAAE,MAAM;IAK1B,UAAU,CAAC,OAAO,EAAE,MAAM;IAK1B,aAAa,CAAC,UAAU,EAAE,MAAM;IAKhC,kBAAkB,CAAC,UAAU,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAA;KAAE;IAOnE,kBAAkB,IAAI,sBAAsB;CAY7C;AAED,MAAM,WAAW,sBAAsB;IACrC,CAAC,eAAe,CAAC,kBAAkB,CAAC,CAAC,EAAE,MAAM,CAAC;IAC9C,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC;IAC5C,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,EAAE,MAAM,CAAC;IACzC,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC;IACxC,CAAC,eAAe,CAAC,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC;IAC5C,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;IACnC,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;IACnC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC;CACxC;AAED,oBAAY,eAAe;IACzB,kBAAkB,eAAe;IACjC,gBAAgB,cAAc;IAC9B,aAAa,WAAW;IACxB,YAAY,iBAAiB;IAC7B,gBAAgB,cAAc;IAC9B,OAAO,aAAa;IACpB,OAAO,aAAa;IACpB,WAAW,gBAAgB;CAC5B;AAED,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,MAAM,GACN,OAAO,GACP,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GACtB;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAA;CAAE,GACpC,KAAK,CAAC;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,CAAA;CAAE,CAAC,CAAC"}