@customerio/cdp-analytics-browser 0.0.1

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 (516) hide show
  1. package/LICENSE.MD +22 -0
  2. package/README.md +21 -0
  3. package/dist/cjs/browser/browser-umd.js +20 -0
  4. package/dist/cjs/browser/browser-umd.js.map +1 -0
  5. package/dist/cjs/browser/index.js +310 -0
  6. package/dist/cjs/browser/index.js.map +1 -0
  7. package/dist/cjs/browser/standalone-analytics.js +60 -0
  8. package/dist/cjs/browser/standalone-analytics.js.map +1 -0
  9. package/dist/cjs/browser/standalone.js +83 -0
  10. package/dist/cjs/browser/standalone.js.map +1 -0
  11. package/dist/cjs/core/analytics/index.js +544 -0
  12. package/dist/cjs/core/analytics/index.js.map +1 -0
  13. package/dist/cjs/core/analytics/interfaces.js +3 -0
  14. package/dist/cjs/core/analytics/interfaces.js.map +1 -0
  15. package/dist/cjs/core/arguments-resolver/index.js +106 -0
  16. package/dist/cjs/core/arguments-resolver/index.js.map +1 -0
  17. package/dist/cjs/core/auto-track.js +108 -0
  18. package/dist/cjs/core/auto-track.js.map +1 -0
  19. package/dist/cjs/core/buffer/index.js +237 -0
  20. package/dist/cjs/core/buffer/index.js.map +1 -0
  21. package/dist/cjs/core/buffer/snippet.js +30 -0
  22. package/dist/cjs/core/buffer/snippet.js.map +1 -0
  23. package/dist/cjs/core/callback/index.js +7 -0
  24. package/dist/cjs/core/callback/index.js.map +1 -0
  25. package/dist/cjs/core/connection/index.js +16 -0
  26. package/dist/cjs/core/connection/index.js.map +1 -0
  27. package/dist/cjs/core/context/index.js +19 -0
  28. package/dist/cjs/core/context/index.js.map +1 -0
  29. package/dist/cjs/core/environment/index.js +12 -0
  30. package/dist/cjs/core/environment/index.js.map +1 -0
  31. package/dist/cjs/core/events/index.js +134 -0
  32. package/dist/cjs/core/events/index.js.map +1 -0
  33. package/dist/cjs/core/events/interfaces.js +3 -0
  34. package/dist/cjs/core/events/interfaces.js.map +1 -0
  35. package/dist/cjs/core/inspector/index.js +14 -0
  36. package/dist/cjs/core/inspector/index.js.map +1 -0
  37. package/dist/cjs/core/plugin/index.js +3 -0
  38. package/dist/cjs/core/plugin/index.js.map +1 -0
  39. package/dist/cjs/core/query-string/gracefulDecodeURIComponent.js +20 -0
  40. package/dist/cjs/core/query-string/gracefulDecodeURIComponent.js.map +1 -0
  41. package/dist/cjs/core/query-string/index.js +48 -0
  42. package/dist/cjs/core/query-string/index.js.map +1 -0
  43. package/dist/cjs/core/query-string/pickPrefix.js +20 -0
  44. package/dist/cjs/core/query-string/pickPrefix.js.map +1 -0
  45. package/dist/cjs/core/queue/event-queue.js +15 -0
  46. package/dist/cjs/core/queue/event-queue.js.map +1 -0
  47. package/dist/cjs/core/stats/index.js +23 -0
  48. package/dist/cjs/core/stats/index.js.map +1 -0
  49. package/dist/cjs/core/stats/remote-metrics.js +107 -0
  50. package/dist/cjs/core/stats/remote-metrics.js.map +1 -0
  51. package/dist/cjs/core/user/index.js +422 -0
  52. package/dist/cjs/core/user/index.js.map +1 -0
  53. package/dist/cjs/core/user/tld.js +64 -0
  54. package/dist/cjs/core/user/tld.js.map +1 -0
  55. package/dist/cjs/generated/version.js +6 -0
  56. package/dist/cjs/generated/version.js.map +1 -0
  57. package/dist/cjs/index.js +11 -0
  58. package/dist/cjs/index.js.map +1 -0
  59. package/dist/cjs/lib/bind-all.js +17 -0
  60. package/dist/cjs/lib/bind-all.js.map +1 -0
  61. package/dist/cjs/lib/browser-polyfill.js +22 -0
  62. package/dist/cjs/lib/browser-polyfill.js.map +1 -0
  63. package/dist/cjs/lib/create-deferred.js +21 -0
  64. package/dist/cjs/lib/create-deferred.js.map +1 -0
  65. package/dist/cjs/lib/csp-detection.js +33 -0
  66. package/dist/cjs/lib/csp-detection.js.map +1 -0
  67. package/dist/cjs/lib/embedded-write-key.js +22 -0
  68. package/dist/cjs/lib/embedded-write-key.js.map +1 -0
  69. package/dist/cjs/lib/fetch.js +19 -0
  70. package/dist/cjs/lib/fetch.js.map +1 -0
  71. package/dist/cjs/lib/get-global.js +21 -0
  72. package/dist/cjs/lib/get-global.js.map +1 -0
  73. package/dist/cjs/lib/get-process-env.js +15 -0
  74. package/dist/cjs/lib/get-process-env.js.map +1 -0
  75. package/dist/cjs/lib/group-by.js +28 -0
  76. package/dist/cjs/lib/group-by.js.map +1 -0
  77. package/dist/cjs/lib/is-plan-event-enabled.js +20 -0
  78. package/dist/cjs/lib/is-plan-event-enabled.js.map +1 -0
  79. package/dist/cjs/lib/is-thenable.js +15 -0
  80. package/dist/cjs/lib/is-thenable.js.map +1 -0
  81. package/dist/cjs/lib/load-script.js +56 -0
  82. package/dist/cjs/lib/load-script.js.map +1 -0
  83. package/dist/cjs/lib/merged-options.js +31 -0
  84. package/dist/cjs/lib/merged-options.js.map +1 -0
  85. package/dist/cjs/lib/on-page-leave.js +35 -0
  86. package/dist/cjs/lib/on-page-leave.js.map +1 -0
  87. package/dist/cjs/lib/p-while.js +25 -0
  88. package/dist/cjs/lib/p-while.js.map +1 -0
  89. package/dist/cjs/lib/parse-cdn.js +79 -0
  90. package/dist/cjs/lib/parse-cdn.js.map +1 -0
  91. package/dist/cjs/lib/priority-queue/backoff.js +10 -0
  92. package/dist/cjs/lib/priority-queue/backoff.js.map +1 -0
  93. package/dist/cjs/lib/priority-queue/index.js +7 -0
  94. package/dist/cjs/lib/priority-queue/index.js.map +1 -0
  95. package/dist/cjs/lib/priority-queue/persisted.js +108 -0
  96. package/dist/cjs/lib/priority-queue/persisted.js.map +1 -0
  97. package/dist/cjs/lib/sleep.js +10 -0
  98. package/dist/cjs/lib/sleep.js.map +1 -0
  99. package/dist/cjs/lib/to-facade.js +32 -0
  100. package/dist/cjs/lib/to-facade.js.map +1 -0
  101. package/dist/cjs/node/index.js +43 -0
  102. package/dist/cjs/node/index.js.map +1 -0
  103. package/dist/cjs/node/node.browser.js +13 -0
  104. package/dist/cjs/node/node.browser.js.map +1 -0
  105. package/dist/cjs/plugins/ajs-destination/index.js +345 -0
  106. package/dist/cjs/plugins/ajs-destination/index.js.map +1 -0
  107. package/dist/cjs/plugins/ajs-destination/loader.js +110 -0
  108. package/dist/cjs/plugins/ajs-destination/loader.js.map +1 -0
  109. package/dist/cjs/plugins/ajs-destination/types.js +3 -0
  110. package/dist/cjs/plugins/ajs-destination/types.js.map +1 -0
  111. package/dist/cjs/plugins/ajs-destination/utils.js +23 -0
  112. package/dist/cjs/plugins/ajs-destination/utils.js.map +1 -0
  113. package/dist/cjs/plugins/analytics-node/index.js +65 -0
  114. package/dist/cjs/plugins/analytics-node/index.js.map +1 -0
  115. package/dist/cjs/plugins/customerio/batched-dispatcher.js +102 -0
  116. package/dist/cjs/plugins/customerio/batched-dispatcher.js.map +1 -0
  117. package/dist/cjs/plugins/customerio/fetch-dispatcher.js +18 -0
  118. package/dist/cjs/plugins/customerio/fetch-dispatcher.js.map +1 -0
  119. package/dist/cjs/plugins/customerio/index.js +97 -0
  120. package/dist/cjs/plugins/customerio/index.js.map +1 -0
  121. package/dist/cjs/plugins/customerio/normalize.js +176 -0
  122. package/dist/cjs/plugins/customerio/normalize.js.map +1 -0
  123. package/dist/cjs/plugins/customerio/schedule-flush.js +76 -0
  124. package/dist/cjs/plugins/customerio/schedule-flush.js.map +1 -0
  125. package/dist/cjs/plugins/legacy-video-plugins/index.js +25 -0
  126. package/dist/cjs/plugins/legacy-video-plugins/index.js.map +1 -0
  127. package/dist/cjs/plugins/middleware/index.js +124 -0
  128. package/dist/cjs/plugins/middleware/index.js.map +1 -0
  129. package/dist/cjs/plugins/page-enrichment/index.js +98 -0
  130. package/dist/cjs/plugins/page-enrichment/index.js.map +1 -0
  131. package/dist/cjs/plugins/remote-loader/index.js +211 -0
  132. package/dist/cjs/plugins/remote-loader/index.js.map +1 -0
  133. package/dist/cjs/plugins/remote-middleware/index.js +70 -0
  134. package/dist/cjs/plugins/remote-middleware/index.js.map +1 -0
  135. package/dist/cjs/plugins/routing-middleware/index.js +26 -0
  136. package/dist/cjs/plugins/routing-middleware/index.js.map +1 -0
  137. package/dist/cjs/plugins/schema-filter/index.js +67 -0
  138. package/dist/cjs/plugins/schema-filter/index.js.map +1 -0
  139. package/dist/cjs/plugins/validation/index.js +70 -0
  140. package/dist/cjs/plugins/validation/index.js.map +1 -0
  141. package/dist/pkg/browser/browser-umd.js +17 -0
  142. package/dist/pkg/browser/browser-umd.js.map +1 -0
  143. package/dist/pkg/browser/index.js +306 -0
  144. package/dist/pkg/browser/index.js.map +1 -0
  145. package/dist/pkg/browser/standalone-analytics.js +56 -0
  146. package/dist/pkg/browser/standalone-analytics.js.map +1 -0
  147. package/dist/pkg/browser/standalone.js +81 -0
  148. package/dist/pkg/browser/standalone.js.map +1 -0
  149. package/dist/pkg/core/analytics/index.js +541 -0
  150. package/dist/pkg/core/analytics/index.js.map +1 -0
  151. package/dist/pkg/core/analytics/interfaces.js +2 -0
  152. package/dist/pkg/core/analytics/interfaces.js.map +1 -0
  153. package/dist/pkg/core/arguments-resolver/index.js +99 -0
  154. package/dist/pkg/core/arguments-resolver/index.js.map +1 -0
  155. package/dist/pkg/core/auto-track.js +103 -0
  156. package/dist/pkg/core/auto-track.js.map +1 -0
  157. package/dist/pkg/core/buffer/index.js +231 -0
  158. package/dist/pkg/core/buffer/index.js.map +1 -0
  159. package/dist/pkg/core/buffer/snippet.js +25 -0
  160. package/dist/pkg/core/buffer/snippet.js.map +1 -0
  161. package/dist/pkg/core/callback/index.js +2 -0
  162. package/dist/pkg/core/callback/index.js.map +1 -0
  163. package/dist/pkg/core/connection/index.js +11 -0
  164. package/dist/pkg/core/connection/index.js.map +1 -0
  165. package/dist/pkg/core/context/index.js +16 -0
  166. package/dist/pkg/core/context/index.js.map +1 -0
  167. package/dist/pkg/core/environment/index.js +7 -0
  168. package/dist/pkg/core/environment/index.js.map +1 -0
  169. package/dist/pkg/core/events/index.js +131 -0
  170. package/dist/pkg/core/events/index.js.map +1 -0
  171. package/dist/pkg/core/events/interfaces.js +2 -0
  172. package/dist/pkg/core/events/interfaces.js.map +1 -0
  173. package/dist/pkg/core/inspector/index.js +10 -0
  174. package/dist/pkg/core/inspector/index.js.map +1 -0
  175. package/dist/pkg/core/plugin/index.js +2 -0
  176. package/dist/pkg/core/plugin/index.js.map +1 -0
  177. package/dist/pkg/core/query-string/gracefulDecodeURIComponent.js +16 -0
  178. package/dist/pkg/core/query-string/gracefulDecodeURIComponent.js.map +1 -0
  179. package/dist/pkg/core/query-string/index.js +44 -0
  180. package/dist/pkg/core/query-string/index.js.map +1 -0
  181. package/dist/pkg/core/query-string/pickPrefix.js +16 -0
  182. package/dist/pkg/core/query-string/pickPrefix.js.map +1 -0
  183. package/dist/pkg/core/queue/event-queue.js +12 -0
  184. package/dist/pkg/core/queue/event-queue.js.map +1 -0
  185. package/dist/pkg/core/stats/index.js +20 -0
  186. package/dist/pkg/core/stats/index.js.map +1 -0
  187. package/dist/pkg/core/stats/remote-metrics.js +104 -0
  188. package/dist/pkg/core/stats/remote-metrics.js.map +1 -0
  189. package/dist/pkg/core/user/index.js +418 -0
  190. package/dist/pkg/core/user/index.js.map +1 -0
  191. package/dist/pkg/core/user/tld.js +59 -0
  192. package/dist/pkg/core/user/tld.js.map +1 -0
  193. package/dist/pkg/generated/version.js +3 -0
  194. package/dist/pkg/generated/version.js.map +1 -0
  195. package/dist/pkg/index.js +8 -0
  196. package/dist/pkg/index.js.map +1 -0
  197. package/dist/pkg/lib/bind-all.js +14 -0
  198. package/dist/pkg/lib/bind-all.js.map +1 -0
  199. package/dist/pkg/lib/browser-polyfill.js +18 -0
  200. package/dist/pkg/lib/browser-polyfill.js.map +1 -0
  201. package/dist/pkg/lib/create-deferred.js +17 -0
  202. package/dist/pkg/lib/create-deferred.js.map +1 -0
  203. package/dist/pkg/lib/csp-detection.js +29 -0
  204. package/dist/pkg/lib/csp-detection.js.map +1 -0
  205. package/dist/pkg/lib/embedded-write-key.js +18 -0
  206. package/dist/pkg/lib/embedded-write-key.js.map +1 -0
  207. package/dist/pkg/lib/fetch.js +14 -0
  208. package/dist/pkg/lib/fetch.js.map +1 -0
  209. package/dist/pkg/lib/get-global.js +17 -0
  210. package/dist/pkg/lib/get-global.js.map +1 -0
  211. package/dist/pkg/lib/get-process-env.js +11 -0
  212. package/dist/pkg/lib/get-process-env.js.map +1 -0
  213. package/dist/pkg/lib/group-by.js +24 -0
  214. package/dist/pkg/lib/group-by.js.map +1 -0
  215. package/dist/pkg/lib/is-plan-event-enabled.js +16 -0
  216. package/dist/pkg/lib/is-plan-event-enabled.js.map +1 -0
  217. package/dist/pkg/lib/is-thenable.js +11 -0
  218. package/dist/pkg/lib/is-thenable.js.map +1 -0
  219. package/dist/pkg/lib/load-script.js +51 -0
  220. package/dist/pkg/lib/load-script.js.map +1 -0
  221. package/dist/pkg/lib/merged-options.js +27 -0
  222. package/dist/pkg/lib/merged-options.js.map +1 -0
  223. package/dist/pkg/lib/on-page-leave.js +31 -0
  224. package/dist/pkg/lib/on-page-leave.js.map +1 -0
  225. package/dist/pkg/lib/p-while.js +21 -0
  226. package/dist/pkg/lib/p-while.js.map +1 -0
  227. package/dist/pkg/lib/parse-cdn.js +72 -0
  228. package/dist/pkg/lib/parse-cdn.js.map +1 -0
  229. package/dist/pkg/lib/priority-queue/backoff.js +6 -0
  230. package/dist/pkg/lib/priority-queue/backoff.js.map +1 -0
  231. package/dist/pkg/lib/priority-queue/index.js +3 -0
  232. package/dist/pkg/lib/priority-queue/index.js.map +1 -0
  233. package/dist/pkg/lib/priority-queue/persisted.js +105 -0
  234. package/dist/pkg/lib/priority-queue/persisted.js.map +1 -0
  235. package/dist/pkg/lib/sleep.js +6 -0
  236. package/dist/pkg/lib/sleep.js.map +1 -0
  237. package/dist/pkg/lib/to-facade.js +28 -0
  238. package/dist/pkg/lib/to-facade.js.map +1 -0
  239. package/dist/pkg/node/index.js +40 -0
  240. package/dist/pkg/node/index.js.map +1 -0
  241. package/dist/pkg/node/node.browser.js +10 -0
  242. package/dist/pkg/node/node.browser.js.map +1 -0
  243. package/dist/pkg/plugins/ajs-destination/index.js +341 -0
  244. package/dist/pkg/plugins/ajs-destination/index.js.map +1 -0
  245. package/dist/pkg/plugins/ajs-destination/loader.js +102 -0
  246. package/dist/pkg/plugins/ajs-destination/loader.js.map +1 -0
  247. package/dist/pkg/plugins/ajs-destination/types.js +2 -0
  248. package/dist/pkg/plugins/ajs-destination/types.js.map +1 -0
  249. package/dist/pkg/plugins/ajs-destination/utils.js +18 -0
  250. package/dist/pkg/plugins/ajs-destination/utils.js.map +1 -0
  251. package/dist/pkg/plugins/analytics-node/index.js +60 -0
  252. package/dist/pkg/plugins/analytics-node/index.js.map +1 -0
  253. package/dist/pkg/plugins/customerio/batched-dispatcher.js +99 -0
  254. package/dist/pkg/plugins/customerio/batched-dispatcher.js.map +1 -0
  255. package/dist/pkg/plugins/customerio/fetch-dispatcher.js +15 -0
  256. package/dist/pkg/plugins/customerio/fetch-dispatcher.js.map +1 -0
  257. package/dist/pkg/plugins/customerio/index.js +93 -0
  258. package/dist/pkg/plugins/customerio/index.js.map +1 -0
  259. package/dist/pkg/plugins/customerio/normalize.js +168 -0
  260. package/dist/pkg/plugins/customerio/normalize.js.map +1 -0
  261. package/dist/pkg/plugins/customerio/schedule-flush.js +72 -0
  262. package/dist/pkg/plugins/customerio/schedule-flush.js.map +1 -0
  263. package/dist/pkg/plugins/legacy-video-plugins/index.js +25 -0
  264. package/dist/pkg/plugins/legacy-video-plugins/index.js.map +1 -0
  265. package/dist/pkg/plugins/middleware/index.js +119 -0
  266. package/dist/pkg/plugins/middleware/index.js.map +1 -0
  267. package/dist/pkg/plugins/page-enrichment/index.js +93 -0
  268. package/dist/pkg/plugins/page-enrichment/index.js.map +1 -0
  269. package/dist/pkg/plugins/remote-loader/index.js +207 -0
  270. package/dist/pkg/plugins/remote-loader/index.js.map +1 -0
  271. package/dist/pkg/plugins/remote-middleware/index.js +66 -0
  272. package/dist/pkg/plugins/remote-middleware/index.js.map +1 -0
  273. package/dist/pkg/plugins/routing-middleware/index.js +21 -0
  274. package/dist/pkg/plugins/routing-middleware/index.js.map +1 -0
  275. package/dist/pkg/plugins/schema-filter/index.js +63 -0
  276. package/dist/pkg/plugins/schema-filter/index.js.map +1 -0
  277. package/dist/pkg/plugins/validation/index.js +63 -0
  278. package/dist/pkg/plugins/validation/index.js.map +1 -0
  279. package/dist/types/browser/browser-umd.d.ts +2 -0
  280. package/dist/types/browser/browser-umd.d.ts.map +1 -0
  281. package/dist/types/browser/index.d.ts +86 -0
  282. package/dist/types/browser/index.d.ts.map +1 -0
  283. package/dist/types/browser/standalone-analytics.d.ts +16 -0
  284. package/dist/types/browser/standalone-analytics.d.ts.map +1 -0
  285. package/dist/types/browser/standalone.d.ts +2 -0
  286. package/dist/types/browser/standalone.d.ts.map +1 -0
  287. package/dist/types/core/analytics/index.d.ts +116 -0
  288. package/dist/types/core/analytics/index.d.ts.map +1 -0
  289. package/dist/types/core/analytics/interfaces.d.ts +77 -0
  290. package/dist/types/core/analytics/interfaces.d.ts.map +1 -0
  291. package/dist/types/core/arguments-resolver/index.d.ts +34 -0
  292. package/dist/types/core/arguments-resolver/index.d.ts.map +1 -0
  293. package/dist/types/core/auto-track.d.ts +10 -0
  294. package/dist/types/core/auto-track.d.ts.map +1 -0
  295. package/dist/types/core/buffer/index.d.ts +86 -0
  296. package/dist/types/core/buffer/index.d.ts.map +1 -0
  297. package/dist/types/core/buffer/snippet.d.ts +10 -0
  298. package/dist/types/core/buffer/snippet.d.ts.map +1 -0
  299. package/dist/types/core/callback/index.d.ts +2 -0
  300. package/dist/types/core/callback/index.d.ts.map +1 -0
  301. package/dist/types/core/connection/index.d.ts +3 -0
  302. package/dist/types/core/connection/index.d.ts.map +1 -0
  303. package/dist/types/core/context/index.d.ts +9 -0
  304. package/dist/types/core/context/index.d.ts.map +1 -0
  305. package/dist/types/core/environment/index.d.ts +3 -0
  306. package/dist/types/core/environment/index.d.ts.map +1 -0
  307. package/dist/types/core/events/index.d.ts +21 -0
  308. package/dist/types/core/events/index.d.ts.map +1 -0
  309. package/dist/types/core/events/interfaces.d.ts +9 -0
  310. package/dist/types/core/events/interfaces.d.ts.map +1 -0
  311. package/dist/types/core/inspector/index.d.ts +3 -0
  312. package/dist/types/core/inspector/index.d.ts.map +1 -0
  313. package/dist/types/core/plugin/index.d.ts +11 -0
  314. package/dist/types/core/plugin/index.d.ts.map +1 -0
  315. package/dist/types/core/query-string/gracefulDecodeURIComponent.d.ts +9 -0
  316. package/dist/types/core/query-string/gracefulDecodeURIComponent.d.ts.map +1 -0
  317. package/dist/types/core/query-string/index.d.ts +7 -0
  318. package/dist/types/core/query-string/index.d.ts.map +1 -0
  319. package/dist/types/core/query-string/pickPrefix.d.ts +9 -0
  320. package/dist/types/core/query-string/pickPrefix.d.ts.map +1 -0
  321. package/dist/types/core/queue/event-queue.d.ts +8 -0
  322. package/dist/types/core/queue/event-queue.d.ts.map +1 -0
  323. package/dist/types/core/stats/index.d.ts +7 -0
  324. package/dist/types/core/stats/index.d.ts.map +1 -0
  325. package/dist/types/core/stats/remote-metrics.d.ts +29 -0
  326. package/dist/types/core/stats/remote-metrics.d.ts.map +1 -0
  327. package/dist/types/core/user/index.d.ts +128 -0
  328. package/dist/types/core/user/index.d.ts.map +1 -0
  329. package/dist/types/core/user/tld.d.ts +2 -0
  330. package/dist/types/core/user/tld.d.ts.map +1 -0
  331. package/dist/types/generated/version.d.ts +2 -0
  332. package/dist/types/generated/version.d.ts.map +1 -0
  333. package/dist/types/index.d.ts +9 -0
  334. package/dist/types/index.d.ts.map +1 -0
  335. package/dist/types/lib/bind-all.d.ts +4 -0
  336. package/dist/types/lib/bind-all.d.ts.map +1 -0
  337. package/dist/types/lib/browser-polyfill.d.ts +2 -0
  338. package/dist/types/lib/browser-polyfill.d.ts.map +1 -0
  339. package/dist/types/lib/create-deferred.d.ts +9 -0
  340. package/dist/types/lib/create-deferred.d.ts.map +1 -0
  341. package/dist/types/lib/csp-detection.d.ts +4 -0
  342. package/dist/types/lib/csp-detection.d.ts.map +1 -0
  343. package/dist/types/lib/embedded-write-key.d.ts +7 -0
  344. package/dist/types/lib/embedded-write-key.d.ts.map +1 -0
  345. package/dist/types/lib/fetch.d.ts +5 -0
  346. package/dist/types/lib/fetch.d.ts.map +1 -0
  347. package/dist/types/lib/get-global.d.ts +2 -0
  348. package/dist/types/lib/get-global.d.ts.map +1 -0
  349. package/dist/types/lib/get-process-env.d.ts +8 -0
  350. package/dist/types/lib/get-process-env.d.ts.map +1 -0
  351. package/dist/types/lib/group-by.d.ts +4 -0
  352. package/dist/types/lib/group-by.d.ts.map +1 -0
  353. package/dist/types/lib/is-plan-event-enabled.d.ts +9 -0
  354. package/dist/types/lib/is-plan-event-enabled.d.ts.map +1 -0
  355. package/dist/types/lib/is-thenable.d.ts +6 -0
  356. package/dist/types/lib/is-thenable.d.ts.map +1 -0
  357. package/dist/types/lib/load-script.d.ts +3 -0
  358. package/dist/types/lib/load-script.d.ts.map +1 -0
  359. package/dist/types/lib/merged-options.d.ts +13 -0
  360. package/dist/types/lib/merged-options.d.ts.map +1 -0
  361. package/dist/types/lib/on-page-leave.d.ts +11 -0
  362. package/dist/types/lib/on-page-leave.d.ts.map +1 -0
  363. package/dist/types/lib/p-while.d.ts +2 -0
  364. package/dist/types/lib/p-while.d.ts.map +1 -0
  365. package/dist/types/lib/parse-cdn.d.ts +10 -0
  366. package/dist/types/lib/parse-cdn.d.ts.map +1 -0
  367. package/dist/types/lib/priority-queue/backoff.d.ts +13 -0
  368. package/dist/types/lib/priority-queue/backoff.d.ts.map +1 -0
  369. package/dist/types/lib/priority-queue/index.d.ts +3 -0
  370. package/dist/types/lib/priority-queue/index.d.ts.map +1 -0
  371. package/dist/types/lib/priority-queue/persisted.d.ts +6 -0
  372. package/dist/types/lib/priority-queue/persisted.d.ts.map +1 -0
  373. package/dist/types/lib/sleep.d.ts +2 -0
  374. package/dist/types/lib/sleep.d.ts.map +1 -0
  375. package/dist/types/lib/to-facade.d.ts +7 -0
  376. package/dist/types/lib/to-facade.d.ts.map +1 -0
  377. package/dist/types/node/index.d.ts +8 -0
  378. package/dist/types/node/index.d.ts.map +1 -0
  379. package/dist/types/node/node.browser.d.ts +4 -0
  380. package/dist/types/node/node.browser.d.ts.map +1 -0
  381. package/dist/types/plugins/ajs-destination/index.d.ts +42 -0
  382. package/dist/types/plugins/ajs-destination/index.d.ts.map +1 -0
  383. package/dist/types/plugins/ajs-destination/loader.d.ts +12 -0
  384. package/dist/types/plugins/ajs-destination/loader.d.ts.map +1 -0
  385. package/dist/types/plugins/ajs-destination/types.d.ts +36 -0
  386. package/dist/types/plugins/ajs-destination/types.d.ts.map +1 -0
  387. package/dist/types/plugins/ajs-destination/utils.d.ts +5 -0
  388. package/dist/types/plugins/ajs-destination/utils.d.ts.map +1 -0
  389. package/dist/types/plugins/analytics-node/index.d.ts +12 -0
  390. package/dist/types/plugins/analytics-node/index.d.ts.map +1 -0
  391. package/dist/types/plugins/customerio/batched-dispatcher.d.ts +8 -0
  392. package/dist/types/plugins/customerio/batched-dispatcher.d.ts.map +1 -0
  393. package/dist/types/plugins/customerio/fetch-dispatcher.d.ts +8 -0
  394. package/dist/types/plugins/customerio/fetch-dispatcher.d.ts.map +1 -0
  395. package/dist/types/plugins/customerio/index.d.ts +26 -0
  396. package/dist/types/plugins/customerio/index.d.ts.map +1 -0
  397. package/dist/types/plugins/customerio/normalize.d.ts +12 -0
  398. package/dist/types/plugins/customerio/normalize.d.ts.map +1 -0
  399. package/dist/types/plugins/customerio/schedule-flush.d.ts +5 -0
  400. package/dist/types/plugins/customerio/schedule-flush.d.ts.map +1 -0
  401. package/dist/types/plugins/legacy-video-plugins/index.d.ts +3 -0
  402. package/dist/types/plugins/legacy-video-plugins/index.d.ts.map +1 -0
  403. package/dist/types/plugins/middleware/index.d.ts +18 -0
  404. package/dist/types/plugins/middleware/index.d.ts.map +1 -0
  405. package/dist/types/plugins/page-enrichment/index.d.ts +21 -0
  406. package/dist/types/plugins/page-enrichment/index.d.ts.map +1 -0
  407. package/dist/types/plugins/remote-loader/index.d.ts +43 -0
  408. package/dist/types/plugins/remote-loader/index.d.ts.map +1 -0
  409. package/dist/types/plugins/remote-middleware/index.d.ts +5 -0
  410. package/dist/types/plugins/remote-middleware/index.d.ts.map +1 -0
  411. package/dist/types/plugins/routing-middleware/index.d.ts +13 -0
  412. package/dist/types/plugins/routing-middleware/index.d.ts.map +1 -0
  413. package/dist/types/plugins/schema-filter/index.d.ts +5 -0
  414. package/dist/types/plugins/schema-filter/index.d.ts.map +1 -0
  415. package/dist/types/plugins/validation/index.d.ts +7 -0
  416. package/dist/types/plugins/validation/index.d.ts.map +1 -0
  417. package/dist/umd/799.bundle.f804d7b881cf284fbd56.js +1 -0
  418. package/dist/umd/799.bundle.f804d7b881cf284fbd56.js.gz +0 -0
  419. package/dist/umd/870.bundle.e0b7bfa4797bb87217c9.js +1 -0
  420. package/dist/umd/870.bundle.e0b7bfa4797bb87217c9.js.gz +0 -0
  421. package/dist/umd/ajs-destination.bundle.847bf422720e5616c9d5.js +1 -0
  422. package/dist/umd/ajs-destination.bundle.847bf422720e5616c9d5.js.gz +0 -0
  423. package/dist/umd/auto-track.bundle.758629f7a47544af2d44.js +1 -0
  424. package/dist/umd/auto-track.bundle.758629f7a47544af2d44.js.gz +0 -0
  425. package/dist/umd/index.js +1 -0
  426. package/dist/umd/index.js.gz +0 -0
  427. package/dist/umd/legacyVideos.bundle.d7ac356ab28fab36e111.js +1 -0
  428. package/dist/umd/legacyVideos.bundle.d7ac356ab28fab36e111.js.gz +0 -0
  429. package/dist/umd/queryString.bundle.913501e40ce64ef92884.js +1 -0
  430. package/dist/umd/queryString.bundle.913501e40ce64ef92884.js.gz +0 -0
  431. package/dist/umd/remoteMiddleware.bundle.3bc569811c4c2c93d90c.js +1 -0
  432. package/dist/umd/remoteMiddleware.bundle.3bc569811c4c2c93d90c.js.gz +0 -0
  433. package/dist/umd/schemaFilter.bundle.bb8180ae95843c8f138e.js +1 -0
  434. package/dist/umd/schemaFilter.bundle.bb8180ae95843c8f138e.js.gz +0 -0
  435. package/dist/umd/standalone.js +1 -0
  436. package/dist/umd/standalone.js.gz +0 -0
  437. package/dist/umd/tsub-middleware.bundle.af0f402084ddd2b605cc.js +1 -0
  438. package/dist/umd/tsub-middleware.bundle.af0f402084ddd2b605cc.js.gz +0 -0
  439. package/package.json +103 -0
  440. package/src/browser/browser-umd.ts +19 -0
  441. package/src/browser/index.ts +397 -0
  442. package/src/browser/standalone-analytics.ts +74 -0
  443. package/src/browser/standalone.ts +78 -0
  444. package/src/core/analytics/index.ts +567 -0
  445. package/src/core/analytics/interfaces.ts +100 -0
  446. package/src/core/arguments-resolver/index.ts +166 -0
  447. package/src/core/auto-track.ts +152 -0
  448. package/src/core/buffer/index.ts +289 -0
  449. package/src/core/buffer/snippet.ts +43 -0
  450. package/src/core/callback/index.ts +1 -0
  451. package/src/core/connection/index.ts +13 -0
  452. package/src/core/context/index.ts +21 -0
  453. package/src/core/environment/index.ts +7 -0
  454. package/src/core/events/index.ts +254 -0
  455. package/src/core/events/interfaces.ts +36 -0
  456. package/src/core/inspector/index.ts +14 -0
  457. package/src/core/plugin/index.ts +12 -0
  458. package/src/core/query-string/gracefulDecodeURIComponent.ts +16 -0
  459. package/src/core/query-string/index.ts +64 -0
  460. package/src/core/query-string/pickPrefix.ts +20 -0
  461. package/src/core/queue/event-queue.ts +11 -0
  462. package/src/core/stats/index.ts +15 -0
  463. package/src/core/stats/remote-metrics.ts +137 -0
  464. package/src/core/user/index.ts +534 -0
  465. package/src/core/user/tld.ts +65 -0
  466. package/src/generated/version.ts +2 -0
  467. package/src/index.ts +10 -0
  468. package/src/lib/bind-all.ts +19 -0
  469. package/src/lib/browser-polyfill.ts +23 -0
  470. package/src/lib/create-deferred.ts +16 -0
  471. package/src/lib/csp-detection.ts +26 -0
  472. package/src/lib/embedded-write-key.ts +24 -0
  473. package/src/lib/fetch.ts +10 -0
  474. package/src/lib/get-global.ts +16 -0
  475. package/src/lib/get-process-env.ts +11 -0
  476. package/src/lib/group-by.ts +30 -0
  477. package/src/lib/is-plan-event-enabled.ts +20 -0
  478. package/src/lib/is-thenable.ts +9 -0
  479. package/src/lib/load-script.ts +66 -0
  480. package/src/lib/merged-options.ts +46 -0
  481. package/src/lib/on-page-leave.ts +29 -0
  482. package/src/lib/p-while.ts +12 -0
  483. package/src/lib/parse-cdn.ts +85 -0
  484. package/src/lib/priority-queue/backoff.ts +24 -0
  485. package/src/lib/priority-queue/index.ts +6 -0
  486. package/src/lib/priority-queue/persisted.ts +127 -0
  487. package/src/lib/sleep.ts +4 -0
  488. package/src/lib/to-facade.ts +53 -0
  489. package/src/node/index.ts +36 -0
  490. package/src/node/node.browser.ts +7 -0
  491. package/src/plugins/ajs-destination/index.ts +388 -0
  492. package/src/plugins/ajs-destination/loader.ts +127 -0
  493. package/src/plugins/ajs-destination/types.ts +44 -0
  494. package/src/plugins/ajs-destination/utils.ts +34 -0
  495. package/src/plugins/analytics-node/index.ts +64 -0
  496. package/src/plugins/customerio/batched-dispatcher.ts +115 -0
  497. package/src/plugins/customerio/fetch-dispatcher.ts +24 -0
  498. package/src/plugins/customerio/index.ts +142 -0
  499. package/src/plugins/customerio/normalize.ts +223 -0
  500. package/src/plugins/customerio/schedule-flush.ts +58 -0
  501. package/src/plugins/legacy-video-plugins/index.ts +16 -0
  502. package/src/plugins/middleware/index.ts +131 -0
  503. package/src/plugins/page-enrichment/index.ts +127 -0
  504. package/src/plugins/remote-loader/index.ts +240 -0
  505. package/src/plugins/remote-middleware/index.ts +44 -0
  506. package/src/plugins/routing-middleware/index.ts +37 -0
  507. package/src/plugins/schema-filter/index.ts +90 -0
  508. package/src/plugins/validation/index.ts +80 -0
  509. package/src/test-helpers/browser-storage.ts +72 -0
  510. package/src/test-helpers/factories.ts +18 -0
  511. package/src/test-helpers/fetch-parse.ts +8 -0
  512. package/src/test-helpers/fixtures/cdn-settings.ts +299 -0
  513. package/src/test-helpers/fixtures/classic-destination.ts +25 -0
  514. package/src/test-helpers/fixtures/create-fetch-method.ts +24 -0
  515. package/src/test-helpers/test-writekeys.ts +5 -0
  516. package/src/test-helpers/type-assertions.ts +11 -0
@@ -0,0 +1,254 @@
1
+ import { v4 as uuid } from '@lukeed/uuid'
2
+ import { dset } from 'dset'
3
+ import { ID, User } from '../user'
4
+ import {
5
+ Options,
6
+ Integrations,
7
+ EventProperties,
8
+ Traits,
9
+ CustomerioEvent,
10
+ } from './interfaces'
11
+ import md5 from 'spark-md5'
12
+
13
+ export * from './interfaces'
14
+
15
+ export class EventFactory {
16
+ user: User
17
+
18
+ constructor(user: User) {
19
+ this.user = user
20
+ }
21
+
22
+ track(
23
+ event: string,
24
+ properties?: EventProperties,
25
+ options?: Options,
26
+ globalIntegrations?: Integrations
27
+ ): CustomerioEvent {
28
+ return this.normalize({
29
+ ...this.baseEvent(),
30
+ event,
31
+ type: 'track' as const,
32
+ properties,
33
+ options: { ...options },
34
+ integrations: { ...globalIntegrations },
35
+ })
36
+ }
37
+
38
+ page(
39
+ category: string | null,
40
+ page: string | null,
41
+ properties?: EventProperties,
42
+ options?: Options,
43
+ globalIntegrations?: Integrations
44
+ ): CustomerioEvent {
45
+ const event: Partial<CustomerioEvent> = {
46
+ type: 'page' as const,
47
+ properties: { ...properties },
48
+ options: { ...options },
49
+ integrations: { ...globalIntegrations },
50
+ }
51
+
52
+ if (category !== null) {
53
+ event.category = category
54
+ event.properties = event.properties ?? {}
55
+ event.properties.category = category
56
+ }
57
+
58
+ if (page !== null) {
59
+ event.name = page
60
+ }
61
+
62
+ return this.normalize({
63
+ ...this.baseEvent(),
64
+ ...event,
65
+ } as CustomerioEvent)
66
+ }
67
+
68
+ screen(
69
+ category: string | null,
70
+ screen: string | null,
71
+ properties?: EventProperties,
72
+ options?: Options,
73
+ globalIntegrations?: Integrations
74
+ ): CustomerioEvent {
75
+ const event: Partial<CustomerioEvent> = {
76
+ type: 'screen' as const,
77
+ properties: { ...properties },
78
+ options: { ...options },
79
+ integrations: { ...globalIntegrations },
80
+ }
81
+
82
+ if (category !== null) {
83
+ event.category = category
84
+ }
85
+
86
+ if (screen !== null) {
87
+ event.name = screen
88
+ }
89
+
90
+ return this.normalize({
91
+ ...this.baseEvent(),
92
+ ...event,
93
+ } as CustomerioEvent)
94
+ }
95
+
96
+ identify(
97
+ userId: ID,
98
+ traits?: Traits,
99
+ options?: Options,
100
+ globalIntegrations?: Integrations
101
+ ): CustomerioEvent {
102
+ return this.normalize({
103
+ ...this.baseEvent(),
104
+ type: 'identify' as const,
105
+ userId,
106
+ traits,
107
+ options: { ...options },
108
+ integrations: { ...globalIntegrations },
109
+ })
110
+ }
111
+
112
+ group(
113
+ groupId: ID,
114
+ traits?: Traits,
115
+ options?: Options,
116
+ globalIntegrations?: Integrations
117
+ ): CustomerioEvent {
118
+ return this.normalize({
119
+ ...this.baseEvent(),
120
+ type: 'group' as const,
121
+ traits,
122
+ options: { ...options },
123
+ integrations: { ...globalIntegrations },
124
+ groupId,
125
+ })
126
+ }
127
+
128
+ alias(
129
+ to: string,
130
+ from: string | null,
131
+ options?: Options,
132
+ globalIntegrations?: Integrations
133
+ ): CustomerioEvent {
134
+ const base: Partial<CustomerioEvent> = {
135
+ userId: to,
136
+ type: 'alias' as const,
137
+ options: { ...options },
138
+ integrations: { ...globalIntegrations },
139
+ }
140
+
141
+ if (from !== null) {
142
+ base.previousId = from
143
+ }
144
+
145
+ if (to === undefined) {
146
+ return this.normalize({
147
+ ...base,
148
+ ...this.baseEvent(),
149
+ } as CustomerioEvent)
150
+ }
151
+
152
+ return this.normalize({
153
+ ...this.baseEvent(),
154
+ ...base,
155
+ } as CustomerioEvent)
156
+ }
157
+
158
+ private baseEvent(): Partial<CustomerioEvent> {
159
+ const base: Partial<CustomerioEvent> = {
160
+ integrations: {},
161
+ options: {},
162
+ }
163
+
164
+ const user = this.user
165
+
166
+ if (user.id()) {
167
+ base.userId = user.id()
168
+ }
169
+
170
+ if (user.anonymousId()) {
171
+ base.anonymousId = user.anonymousId()
172
+ }
173
+
174
+ return base
175
+ }
176
+
177
+ /**
178
+ * Builds the context part of an event based on "foreign" keys that
179
+ * are provided in the `Options` parameter for an Event
180
+ */
181
+ private context(event: CustomerioEvent): [object, object] {
182
+ const optionsKeys = ['integrations', 'anonymousId', 'timestamp', 'userId']
183
+
184
+ const options = event.options ?? {}
185
+ delete options['integrations']
186
+
187
+ const providedOptionsKeys = Object.keys(options)
188
+
189
+ const context = event.options?.context ?? {}
190
+ const overrides = {}
191
+
192
+ providedOptionsKeys.forEach((key) => {
193
+ if (key === 'context') {
194
+ return
195
+ }
196
+
197
+ if (optionsKeys.includes(key)) {
198
+ dset(overrides, key, options[key])
199
+ } else {
200
+ dset(context, key, options[key])
201
+ }
202
+ })
203
+
204
+ return [context, overrides]
205
+ }
206
+
207
+ public normalize(event: CustomerioEvent): CustomerioEvent {
208
+ // set anonymousId globally if we encounter an override
209
+ event.options?.anonymousId &&
210
+ this.user.anonymousId(event.options.anonymousId)
211
+
212
+ const integrationBooleans = Object.keys(event.integrations ?? {}).reduce(
213
+ (integrationNames, name) => {
214
+ return {
215
+ ...integrationNames,
216
+ [name]: Boolean(event.integrations?.[name]),
217
+ }
218
+ },
219
+ {} as Record<string, boolean>
220
+ )
221
+
222
+ // This is pretty trippy, but here's what's going on:
223
+ // - a) We don't pass initial integration options as part of the event, only if they're true or false
224
+ // - b) We do accept per integration overrides (like integrations.Amplitude.sessionId) at the event level
225
+ // Hence the need to convert base integration options to booleans, but maintain per event integration overrides
226
+ const allIntegrations = {
227
+ // Base config integrations object as booleans
228
+ ...integrationBooleans,
229
+
230
+ // Per event overrides, for things like amplitude sessionId, for example
231
+ ...event.options?.integrations,
232
+ }
233
+
234
+ const [context, overrides] = this.context(event)
235
+ const { options, ...rest } = event
236
+
237
+ const body = {
238
+ timestamp: new Date(),
239
+ ...rest,
240
+ context,
241
+ integrations: allIntegrations,
242
+ ...overrides,
243
+ }
244
+
245
+ const messageId = 'ajs-next-' + md5.hash(JSON.stringify(body) + uuid())
246
+
247
+ const evt: CustomerioEvent = {
248
+ ...body,
249
+ messageId,
250
+ }
251
+
252
+ return evt
253
+ }
254
+ }
@@ -0,0 +1,36 @@
1
+ import {
2
+ CoreOptions,
3
+ CoreCustomerioEvent,
4
+ Callback,
5
+ Integrations,
6
+ Plan,
7
+ TrackPlan,
8
+ PlanEvent,
9
+ JSONArray,
10
+ JSONValue,
11
+ JSONPrimitive,
12
+ JSONObject,
13
+ GroupTraits,
14
+ UserTraits,
15
+ Traits,
16
+ } from '@customerio/cdp-analytics-core'
17
+
18
+ export interface Options extends CoreOptions { }
19
+
20
+ export type { GroupTraits, UserTraits, Traits }
21
+
22
+ export type EventProperties = Record<string, any>
23
+
24
+ export interface CustomerioEvent extends CoreCustomerioEvent { }
25
+
26
+ export type {
27
+ Integrations,
28
+ Plan,
29
+ TrackPlan,
30
+ PlanEvent,
31
+ Callback,
32
+ JSONArray,
33
+ JSONValue,
34
+ JSONPrimitive,
35
+ JSONObject,
36
+ }
@@ -0,0 +1,14 @@
1
+ import { getGlobal } from '../../lib/get-global'
2
+ import type { Analytics } from '../analytics'
3
+
4
+ const env = getGlobal()
5
+
6
+ // The code below assumes the inspector extension will use Object.assign
7
+ // to add the inspect interface on to this object reference (unless the
8
+ // extension code ran first and has already set up the variable)
9
+ const inspectorHost: {
10
+ attach: (analytics: Analytics) => void
11
+ } = ((env as any)['__INSPECTOR__'] ??= {})
12
+
13
+ export const attachInspector = (analytics: Analytics) =>
14
+ inspectorHost.attach?.(analytics as any)
@@ -0,0 +1,12 @@
1
+ import type { CorePlugin } from '@customerio/cdp-analytics-core'
2
+ import type { DestinationMiddlewareFunction } from '../../plugins/middleware'
3
+ import type { Analytics } from '../analytics'
4
+ import type { Context } from '../context'
5
+
6
+ export interface Plugin extends CorePlugin<Context, Analytics> { }
7
+
8
+ export interface DestinationPlugin extends Plugin {
9
+ addMiddleware: (...fns: DestinationMiddlewareFunction[]) => void
10
+ }
11
+
12
+ export type AnyBrowserPlugin = Plugin | DestinationPlugin
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Tries to gets the unencoded version of an encoded component of a
3
+ * Uniform Resource Identifier (URI). If input string is malformed,
4
+ * returns it back as-is.
5
+ *
6
+ * Note: All occurences of the `+` character become ` ` (spaces).
7
+ **/
8
+ export function gracefulDecodeURIComponent(
9
+ encodedURIComponent: string
10
+ ): string {
11
+ try {
12
+ return decodeURIComponent(encodedURIComponent.replace(/\+/g, ' '))
13
+ } catch {
14
+ return encodedURIComponent
15
+ }
16
+ }
@@ -0,0 +1,64 @@
1
+ import { pickPrefix } from './pickPrefix'
2
+ import { gracefulDecodeURIComponent } from './gracefulDecodeURIComponent'
3
+ import { Analytics } from '../analytics'
4
+ import { Context } from '../context'
5
+ import { isPlainObject } from '@customerio/cdp-analytics-core'
6
+
7
+ export interface QueryStringParams {
8
+ [key: string]: string | null
9
+ }
10
+
11
+ export function queryString(
12
+ analytics: Analytics,
13
+ query: string
14
+ ): Promise<Context[]> {
15
+ const a = document.createElement('a')
16
+ a.href = query
17
+ const parsed = a.search.slice(1)
18
+ const params = parsed.split('&').reduce((acc: QueryStringParams, str) => {
19
+ const [k, v] = str.split('=')
20
+ acc[k] = gracefulDecodeURIComponent(v)
21
+ return acc
22
+ }, {})
23
+
24
+ const calls = []
25
+
26
+ const { ajs_uid, ajs_event, ajs_aid } = params
27
+ const { aid: aidPattern = /.+/, uid: uidPattern = /.+/ } = isPlainObject(
28
+ analytics.options.useQueryString
29
+ )
30
+ ? analytics.options.useQueryString
31
+ : {}
32
+
33
+ if (ajs_aid) {
34
+ const anonId = Array.isArray(params.ajs_aid)
35
+ ? params.ajs_aid[0]
36
+ : params.ajs_aid
37
+
38
+ if (aidPattern.test(anonId)) {
39
+ analytics.setAnonymousId(anonId)
40
+ }
41
+ }
42
+
43
+ if (ajs_uid) {
44
+ const uid = Array.isArray(params.ajs_uid)
45
+ ? params.ajs_uid[0]
46
+ : params.ajs_uid
47
+
48
+ if (uidPattern.test(uid)) {
49
+ const traits = pickPrefix('ajs_trait_', params)
50
+
51
+ calls.push(analytics.identify(uid, traits))
52
+ }
53
+ }
54
+
55
+ if (ajs_event) {
56
+ const event = Array.isArray(params.ajs_event)
57
+ ? params.ajs_event[0]
58
+ : params.ajs_event
59
+ const props = pickPrefix('ajs_prop_', params)
60
+ calls.push(analytics.track(event, props))
61
+ }
62
+
63
+ return Promise.all(calls)
64
+ }
@@ -0,0 +1,20 @@
1
+ import { QueryStringParams } from '.'
2
+
3
+ /**
4
+ * Returns an object containing only the properties prefixed by the input
5
+ * string.
6
+ * Ex: prefix('ajs_traits_', { ajs_traits_address: '123 St' })
7
+ * will return { address: '123 St' }
8
+ **/
9
+ export function pickPrefix(
10
+ prefix: string,
11
+ object: QueryStringParams
12
+ ): QueryStringParams {
13
+ return Object.keys(object).reduce((acc: QueryStringParams, key: string) => {
14
+ if (key.startsWith(prefix)) {
15
+ const field = key.substr(prefix.length)
16
+ acc[field] = object[key]!
17
+ }
18
+ return acc
19
+ }, {})
20
+ }
@@ -0,0 +1,11 @@
1
+ import { PriorityQueue } from '../../lib/priority-queue'
2
+ import { PersistedPriorityQueue } from '../../lib/priority-queue/persisted'
3
+ import { Context } from '../context'
4
+ import { AnyBrowserPlugin } from '../plugin'
5
+ import { CoreEventQueue } from '@customerio/cdp-analytics-core'
6
+
7
+ export class EventQueue extends CoreEventQueue<Context, AnyBrowserPlugin> {
8
+ constructor(priorityQueue?: PriorityQueue<Context>) {
9
+ super(priorityQueue ?? new PersistedPriorityQueue(4, 'event-queue'))
10
+ }
11
+ }
@@ -0,0 +1,15 @@
1
+ import { CoreStats } from '@customerio/cdp-analytics-core'
2
+ import { MetricsOptions, RemoteMetrics } from './remote-metrics'
3
+
4
+ let remoteMetrics: RemoteMetrics | undefined
5
+
6
+ export class Stats extends CoreStats {
7
+ static initRemoteMetrics(options?: MetricsOptions) {
8
+ remoteMetrics = new RemoteMetrics(options)
9
+ }
10
+
11
+ override increment(metric: string, by?: number, tags?: string[]): void {
12
+ super.increment(metric, by, tags)
13
+ remoteMetrics?.increment(metric, tags ?? [])
14
+ }
15
+ }
@@ -0,0 +1,137 @@
1
+ import { fetch } from '../../lib/fetch'
2
+ import { version } from '../../generated/version'
3
+ import { getVersionType } from '../../plugins/customerio/normalize'
4
+
5
+ export interface MetricsOptions {
6
+ host?: string
7
+ sampleRate?: number
8
+ flushTimer?: number
9
+ maxQueueSize?: number
10
+ }
11
+
12
+ type RemoteMetric = {
13
+ type: 'Counter'
14
+ metric: string
15
+ value: 1
16
+ tags: {
17
+ library: string
18
+ library_version: string
19
+ [key: string]: string
20
+ }
21
+ }
22
+
23
+ const createRemoteMetric = (
24
+ metric: string,
25
+ tags: string[],
26
+ versionType: 'web' | 'npm'
27
+ ): RemoteMetric => {
28
+ const formattedTags = tags.reduce((acc, t) => {
29
+ const [k, v] = t.split(':')
30
+ acc[k] = v
31
+ return acc
32
+ }, {} as Record<string, string>)
33
+
34
+ return {
35
+ type: 'Counter',
36
+ metric,
37
+ value: 1,
38
+ tags: {
39
+ ...formattedTags,
40
+ library: 'analytics.js',
41
+ library_version:
42
+ versionType === 'web' ? `next-${version}` : `npm:next-${version}`,
43
+ },
44
+ }
45
+ }
46
+
47
+ function logError(err: unknown): void {
48
+ console.error('Error sending performance metrics', err)
49
+ }
50
+
51
+ export class RemoteMetrics {
52
+ private host: string
53
+ private flushTimer: number
54
+ private maxQueueSize: number
55
+
56
+ sampleRate: number
57
+ queue: RemoteMetric[]
58
+
59
+ constructor(options?: MetricsOptions) {
60
+ this.host = options?.host ?? 'cdp.customer.io/v1'
61
+ this.sampleRate = options?.sampleRate ?? 1
62
+ this.flushTimer = options?.flushTimer ?? 30 * 1000 /* 30s */
63
+ this.maxQueueSize = options?.maxQueueSize ?? 20
64
+
65
+ this.queue = []
66
+
67
+ if (this.sampleRate > 0) {
68
+ let flushing = false
69
+
70
+ const run = (): void => {
71
+ if (flushing) {
72
+ return
73
+ }
74
+
75
+ flushing = true
76
+ this.flush().catch(logError)
77
+
78
+ flushing = false
79
+
80
+ setTimeout(run, this.flushTimer)
81
+ }
82
+ run()
83
+ }
84
+ }
85
+
86
+ increment(metric: string, tags: string[]): void {
87
+ // All metrics are part of an allow list in Tracking API
88
+ if (!metric.includes('analytics_js.')) {
89
+ return
90
+ }
91
+
92
+ // /m doesn't like empty tags
93
+ if (tags.length === 0) {
94
+ return
95
+ }
96
+
97
+ if (Math.random() > this.sampleRate) {
98
+ return
99
+ }
100
+
101
+ if (this.queue.length >= this.maxQueueSize) {
102
+ return
103
+ }
104
+
105
+ const remoteMetric = createRemoteMetric(metric, tags, getVersionType())
106
+ this.queue.push(remoteMetric)
107
+
108
+ if (metric.includes('error')) {
109
+ this.flush().catch(logError)
110
+ }
111
+ }
112
+
113
+ async flush(): Promise<void> {
114
+ if (this.queue.length <= 0) {
115
+ return
116
+ }
117
+
118
+ await this.send().catch((error) => {
119
+ logError(error)
120
+ this.sampleRate = 0
121
+ })
122
+ }
123
+
124
+ private async send(): Promise<Response> {
125
+ const payload = { series: this.queue }
126
+ this.queue = []
127
+
128
+ const headers = { 'Content-Type': 'text/plain' }
129
+ const url = `https://${this.host}/m`
130
+
131
+ return fetch(url, {
132
+ headers,
133
+ body: JSON.stringify(payload),
134
+ method: 'POST',
135
+ })
136
+ }
137
+ }