flowgrid-sdk 1.2.1 → 1.3.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 (312) hide show
  1. package/README.md +224 -250
  2. package/dist/237.flowgrid.min.js +2 -0
  3. package/dist/237.flowgrid.min.js.map +1 -0
  4. package/dist/546.flowgrid.min.js +3 -0
  5. package/dist/546.flowgrid.min.js.LICENSE.txt +14 -0
  6. package/dist/546.flowgrid.min.js.map +1 -0
  7. package/dist/EXAMPLE.d.ts +1 -0
  8. package/dist/EXAMPLE.js +55 -0
  9. package/dist/EXAMPLE.js.map +1 -0
  10. package/dist/browser.d.ts +46 -103
  11. package/dist/browser.js +102 -0
  12. package/dist/browser.js.map +1 -0
  13. package/dist/flowgrid.min.js +1 -1
  14. package/dist/flowgrid.min.js.map +1 -1
  15. package/dist/index.d.ts +7 -8
  16. package/dist/index.js +64 -1
  17. package/dist/index.js.map +1 -1
  18. package/dist/lib/client/transport.d.ts +14 -4
  19. package/dist/lib/client/transport.js +432 -0
  20. package/dist/lib/client/transport.js.map +1 -0
  21. package/dist/lib/consent/index.d.ts +0 -5
  22. package/dist/lib/consent/index.js +32 -0
  23. package/dist/lib/consent/index.js.map +1 -0
  24. package/dist/lib/consent/manager.js +336 -0
  25. package/dist/lib/consent/manager.js.map +1 -0
  26. package/dist/lib/consent/types.d.ts +3 -20
  27. package/dist/lib/consent/types.js +10 -0
  28. package/dist/lib/consent/types.js.map +1 -0
  29. package/dist/lib/features/analytics/attribution.d.ts +6 -47
  30. package/dist/lib/features/analytics/attribution.js +181 -0
  31. package/dist/lib/features/analytics/attribution.js.map +1 -0
  32. package/dist/lib/features/analytics/events.d.ts +1 -28
  33. package/dist/lib/features/analytics/events.js +256 -0
  34. package/dist/lib/features/analytics/events.js.map +1 -0
  35. package/dist/lib/features/analytics/funnels.js +260 -0
  36. package/dist/lib/features/analytics/funnels.js.map +1 -0
  37. package/dist/lib/features/analytics/heatmaps.d.ts +12 -19
  38. package/dist/lib/features/analytics/heatmaps.js +258 -0
  39. package/dist/lib/features/analytics/heatmaps.js.map +1 -0
  40. package/dist/lib/features/analytics/identify.d.ts +1 -21
  41. package/dist/lib/features/analytics/identify.js +213 -0
  42. package/dist/lib/features/analytics/identify.js.map +1 -0
  43. package/dist/lib/features/analytics/index.d.ts +2 -0
  44. package/dist/lib/features/analytics/index.js +15 -0
  45. package/dist/lib/features/analytics/index.js.map +1 -0
  46. package/dist/lib/features/analytics/page-views.d.ts +13 -30
  47. package/dist/lib/features/analytics/page-views.js +268 -0
  48. package/dist/lib/features/analytics/page-views.js.map +1 -0
  49. package/dist/lib/features/analytics/performance.d.ts +18 -24
  50. package/dist/lib/features/analytics/performance.js +232 -0
  51. package/dist/lib/features/analytics/performance.js.map +1 -0
  52. package/dist/lib/features/analytics/replay.d.ts +170 -0
  53. package/dist/lib/features/analytics/replay.js +381 -0
  54. package/dist/lib/features/analytics/replay.js.map +1 -0
  55. package/dist/lib/features/analytics/retention.d.ts +1 -76
  56. package/dist/lib/features/analytics/retention.js +135 -0
  57. package/dist/lib/features/analytics/retention.js.map +1 -0
  58. package/dist/lib/features/analytics/sessions.d.ts +12 -37
  59. package/dist/lib/features/analytics/sessions.js +213 -0
  60. package/dist/lib/features/analytics/sessions.js.map +1 -0
  61. package/dist/lib/features/core/activation.d.ts +1 -24
  62. package/dist/lib/features/core/activation.js +175 -0
  63. package/dist/lib/features/core/activation.js.map +1 -0
  64. package/dist/lib/features/core/experiment.d.ts +53 -21
  65. package/dist/lib/features/core/experiment.js +554 -0
  66. package/dist/lib/features/core/experiment.js.map +1 -0
  67. package/dist/lib/features/core/index.js +9 -0
  68. package/dist/lib/features/core/index.js.map +1 -0
  69. package/dist/lib/features/core/track-feature.d.ts +1 -8
  70. package/dist/lib/features/core/track-feature.js +119 -0
  71. package/dist/lib/features/core/track-feature.js.map +1 -0
  72. package/dist/lib/features/core/track-prompt.d.ts +5 -8
  73. package/dist/lib/features/core/track-prompt.js +181 -0
  74. package/dist/lib/features/core/track-prompt.js.map +1 -0
  75. package/dist/lib/features/ecommerce/cart.d.ts +1 -24
  76. package/dist/lib/features/ecommerce/cart.js +244 -0
  77. package/dist/lib/features/ecommerce/cart.js.map +1 -0
  78. package/dist/lib/features/ecommerce/checkout.d.ts +1 -28
  79. package/dist/lib/features/ecommerce/checkout.js +254 -0
  80. package/dist/lib/features/ecommerce/checkout.js.map +1 -0
  81. package/dist/lib/features/ecommerce/index.d.ts +0 -2
  82. package/dist/lib/features/ecommerce/index.js +15 -0
  83. package/dist/lib/features/ecommerce/index.js.map +1 -0
  84. package/dist/lib/features/ecommerce/ltv.d.ts +1 -69
  85. package/dist/lib/features/ecommerce/ltv.js +114 -0
  86. package/dist/lib/features/ecommerce/ltv.js.map +1 -0
  87. package/dist/lib/features/ecommerce/products.d.ts +1 -33
  88. package/dist/lib/features/ecommerce/products.js +223 -0
  89. package/dist/lib/features/ecommerce/products.js.map +1 -0
  90. package/dist/lib/features/ecommerce/promotions.d.ts +1 -30
  91. package/dist/lib/features/ecommerce/promotions.js +197 -0
  92. package/dist/lib/features/ecommerce/promotions.js.map +1 -0
  93. package/dist/lib/features/ecommerce/purchases.d.ts +1 -48
  94. package/dist/lib/features/ecommerce/purchases.js +193 -0
  95. package/dist/lib/features/ecommerce/purchases.js.map +1 -0
  96. package/dist/lib/features/ecommerce/refunds.d.ts +1 -27
  97. package/dist/lib/features/ecommerce/refunds.js +195 -0
  98. package/dist/lib/features/ecommerce/refunds.js.map +1 -0
  99. package/dist/lib/features/ecommerce/search.d.ts +1 -24
  100. package/dist/lib/features/ecommerce/search.js +156 -0
  101. package/dist/lib/features/ecommerce/search.js.map +1 -0
  102. package/dist/lib/features/ecommerce/subscriptions.d.ts +1 -28
  103. package/dist/lib/features/ecommerce/subscriptions.js +207 -0
  104. package/dist/lib/features/ecommerce/subscriptions.js.map +1 -0
  105. package/dist/lib/features/ecommerce/wishlist.d.ts +1 -28
  106. package/dist/lib/features/ecommerce/wishlist.js +186 -0
  107. package/dist/lib/features/ecommerce/wishlist.js.map +1 -0
  108. package/dist/lib/features/enterprise/acquisition.d.ts +2 -57
  109. package/dist/lib/features/enterprise/acquisition.js +166 -0
  110. package/dist/lib/features/enterprise/acquisition.js.map +1 -0
  111. package/dist/lib/features/enterprise/alerts.d.ts +1 -37
  112. package/dist/lib/features/enterprise/alerts.js +246 -0
  113. package/dist/lib/features/enterprise/alerts.js.map +1 -0
  114. package/dist/lib/features/enterprise/churn.d.ts +1 -42
  115. package/dist/lib/features/enterprise/churn.js +175 -0
  116. package/dist/lib/features/enterprise/churn.js.map +1 -0
  117. package/dist/lib/features/enterprise/cohorts.d.ts +1 -37
  118. package/dist/lib/features/enterprise/cohorts.js +201 -0
  119. package/dist/lib/features/enterprise/cohorts.js.map +1 -0
  120. package/dist/lib/features/enterprise/engagement.d.ts +40 -46
  121. package/dist/lib/features/enterprise/engagement.js +335 -0
  122. package/dist/lib/features/enterprise/engagement.js.map +1 -0
  123. package/dist/lib/features/enterprise/forecasting.d.ts +0 -50
  124. package/dist/lib/features/enterprise/forecasting.js +232 -0
  125. package/dist/lib/features/enterprise/forecasting.js.map +1 -0
  126. package/dist/lib/features/enterprise/index.d.ts +1 -1
  127. package/dist/lib/features/enterprise/index.js +76 -0
  128. package/dist/lib/features/enterprise/index.js.map +1 -0
  129. package/dist/lib/features/enterprise/monetization.d.ts +1 -60
  130. package/dist/lib/features/enterprise/monetization.js +146 -0
  131. package/dist/lib/features/enterprise/monetization.js.map +1 -0
  132. package/dist/lib/features/enterprise/multi-path-funnels.d.ts +1 -17
  133. package/dist/lib/features/enterprise/multi-path-funnels.js +205 -0
  134. package/dist/lib/features/enterprise/multi-path-funnels.js.map +1 -0
  135. package/dist/lib/features/enterprise/paths.d.ts +1 -56
  136. package/dist/lib/features/enterprise/paths.js +149 -0
  137. package/dist/lib/features/enterprise/paths.js.map +1 -0
  138. package/dist/lib/features/enterprise/security.d.ts +8 -57
  139. package/dist/lib/features/enterprise/security.js +202 -0
  140. package/dist/lib/features/enterprise/security.js.map +1 -0
  141. package/dist/lib/features/enterprise/support.d.ts +3 -42
  142. package/dist/lib/features/enterprise/support.js +162 -0
  143. package/dist/lib/features/enterprise/support.js.map +1 -0
  144. package/dist/lib/flowgrid.d.ts +278 -0
  145. package/dist/lib/flowgrid.js +323 -0
  146. package/dist/lib/flowgrid.js.map +1 -0
  147. package/dist/lib/frameworks/index.d.ts +13 -6
  148. package/dist/lib/frameworks/index.js +18 -0
  149. package/dist/lib/frameworks/index.js.map +1 -0
  150. package/dist/lib/frameworks/nextjs/client.js +355 -0
  151. package/dist/lib/frameworks/nextjs/client.js.map +1 -0
  152. package/dist/lib/frameworks/nextjs/index.js +31 -0
  153. package/dist/lib/frameworks/nextjs/index.js.map +1 -0
  154. package/dist/lib/frameworks/nextjs/server.js +259 -0
  155. package/dist/lib/frameworks/nextjs/server.js.map +1 -0
  156. package/dist/lib/frameworks/node/index.js +391 -0
  157. package/dist/lib/frameworks/node/index.js.map +1 -0
  158. package/dist/lib/frameworks/nuxt/index.js +288 -0
  159. package/dist/lib/frameworks/nuxt/index.js.map +1 -0
  160. package/dist/lib/frameworks/react/CookieBanner.js +166 -0
  161. package/dist/lib/frameworks/react/CookieBanner.js.map +1 -0
  162. package/dist/lib/frameworks/react/index.js +271 -0
  163. package/dist/lib/frameworks/react/index.js.map +1 -0
  164. package/dist/lib/frameworks/vue/CookieBanner.js +165 -0
  165. package/dist/lib/frameworks/vue/CookieBanner.js.map +1 -0
  166. package/dist/lib/frameworks/vue/index.js +390 -0
  167. package/dist/lib/frameworks/vue/index.js.map +1 -0
  168. package/dist/lib/tracking/analytics/attribution.d.ts +14 -0
  169. package/dist/lib/tracking/analytics/attribution.js +18 -0
  170. package/dist/lib/tracking/analytics/attribution.js.map +1 -0
  171. package/dist/lib/tracking/analytics/events.d.ts +26 -0
  172. package/dist/lib/tracking/analytics/events.js +30 -0
  173. package/dist/lib/tracking/analytics/events.js.map +1 -0
  174. package/dist/lib/tracking/analytics/funnels.d.ts +16 -0
  175. package/dist/lib/tracking/analytics/funnels.js +22 -0
  176. package/dist/lib/tracking/analytics/funnels.js.map +1 -0
  177. package/dist/lib/tracking/analytics/heatmaps.d.ts +27 -0
  178. package/dist/lib/tracking/analytics/heatmaps.js +22 -0
  179. package/dist/lib/tracking/analytics/heatmaps.js.map +1 -0
  180. package/dist/lib/tracking/analytics/identify.d.ts +16 -0
  181. package/dist/lib/tracking/analytics/identify.js +22 -0
  182. package/dist/lib/tracking/analytics/identify.js.map +1 -0
  183. package/dist/lib/tracking/analytics/index.d.ts +10 -0
  184. package/dist/lib/tracking/analytics/index.js +11 -0
  185. package/dist/lib/tracking/analytics/index.js.map +1 -0
  186. package/dist/lib/tracking/analytics/page-views.d.ts +29 -0
  187. package/dist/lib/tracking/analytics/page-views.js +50 -0
  188. package/dist/lib/tracking/analytics/page-views.js.map +1 -0
  189. package/dist/lib/tracking/analytics/performance.d.ts +22 -0
  190. package/dist/lib/tracking/analytics/performance.js +22 -0
  191. package/dist/lib/tracking/analytics/performance.js.map +1 -0
  192. package/dist/lib/tracking/analytics/replay.d.ts +34 -0
  193. package/dist/lib/tracking/analytics/replay.js +46 -0
  194. package/dist/lib/tracking/analytics/replay.js.map +1 -0
  195. package/dist/lib/tracking/analytics/retention.d.ts +10 -0
  196. package/dist/lib/tracking/analytics/retention.js +10 -0
  197. package/dist/lib/tracking/analytics/retention.js.map +1 -0
  198. package/dist/lib/tracking/analytics/sessions.d.ts +20 -0
  199. package/dist/lib/tracking/analytics/sessions.js +26 -0
  200. package/dist/lib/tracking/analytics/sessions.js.map +1 -0
  201. package/dist/lib/tracking/core/activation.d.ts +23 -0
  202. package/dist/lib/tracking/core/activation.js +33 -0
  203. package/dist/lib/tracking/core/activation.js.map +1 -0
  204. package/dist/lib/tracking/core/experiment.d.ts +122 -0
  205. package/dist/lib/tracking/core/experiment.js +150 -0
  206. package/dist/lib/tracking/core/experiment.js.map +1 -0
  207. package/dist/lib/tracking/core/feature.d.ts +13 -0
  208. package/dist/lib/tracking/core/feature.js +14 -0
  209. package/dist/lib/tracking/core/feature.js.map +1 -0
  210. package/dist/lib/tracking/core/index.d.ts +4 -0
  211. package/dist/lib/tracking/core/index.js +5 -0
  212. package/dist/lib/tracking/core/index.js.map +1 -0
  213. package/dist/lib/tracking/core/prompt.d.ts +18 -0
  214. package/dist/lib/tracking/core/prompt.js +26 -0
  215. package/dist/lib/tracking/core/prompt.js.map +1 -0
  216. package/dist/lib/tracking/ecommerce/cart.d.ts +17 -0
  217. package/dist/lib/tracking/ecommerce/cart.js +22 -0
  218. package/dist/lib/tracking/ecommerce/cart.js.map +1 -0
  219. package/dist/lib/tracking/ecommerce/checkout.d.ts +17 -0
  220. package/dist/lib/tracking/ecommerce/checkout.js +22 -0
  221. package/dist/lib/tracking/ecommerce/checkout.js.map +1 -0
  222. package/dist/lib/tracking/ecommerce/index.d.ts +10 -0
  223. package/dist/lib/tracking/ecommerce/index.js +11 -0
  224. package/dist/lib/tracking/ecommerce/index.js.map +1 -0
  225. package/dist/lib/tracking/ecommerce/ltv.d.ts +15 -0
  226. package/dist/lib/tracking/ecommerce/ltv.js +14 -0
  227. package/dist/lib/tracking/ecommerce/ltv.js.map +1 -0
  228. package/dist/lib/tracking/ecommerce/products.d.ts +15 -0
  229. package/dist/lib/tracking/ecommerce/products.js +18 -0
  230. package/dist/lib/tracking/ecommerce/products.js.map +1 -0
  231. package/dist/lib/tracking/ecommerce/promotions.d.ts +14 -0
  232. package/dist/lib/tracking/ecommerce/promotions.js +25 -0
  233. package/dist/lib/tracking/ecommerce/promotions.js.map +1 -0
  234. package/dist/lib/tracking/ecommerce/purchases.d.ts +11 -0
  235. package/dist/lib/tracking/ecommerce/purchases.js +10 -0
  236. package/dist/lib/tracking/ecommerce/purchases.js.map +1 -0
  237. package/dist/lib/tracking/ecommerce/refunds.d.ts +17 -0
  238. package/dist/lib/tracking/ecommerce/refunds.js +22 -0
  239. package/dist/lib/tracking/ecommerce/refunds.js.map +1 -0
  240. package/dist/lib/tracking/ecommerce/search.d.ts +24 -0
  241. package/dist/lib/tracking/ecommerce/search.js +22 -0
  242. package/dist/lib/tracking/ecommerce/search.js.map +1 -0
  243. package/dist/lib/tracking/ecommerce/subscriptions.d.ts +21 -0
  244. package/dist/lib/tracking/ecommerce/subscriptions.js +38 -0
  245. package/dist/lib/tracking/ecommerce/subscriptions.js.map +1 -0
  246. package/dist/lib/tracking/ecommerce/wishlist.d.ts +19 -0
  247. package/dist/lib/tracking/ecommerce/wishlist.js +26 -0
  248. package/dist/lib/tracking/ecommerce/wishlist.js.map +1 -0
  249. package/dist/lib/tracking/enterprise/acquisition.d.ts +25 -0
  250. package/dist/lib/tracking/enterprise/acquisition.js +22 -0
  251. package/dist/lib/tracking/enterprise/acquisition.js.map +1 -0
  252. package/dist/lib/tracking/enterprise/alerts.d.ts +32 -0
  253. package/dist/lib/tracking/enterprise/alerts.js +30 -0
  254. package/dist/lib/tracking/enterprise/alerts.js.map +1 -0
  255. package/dist/lib/tracking/enterprise/churn.d.ts +23 -0
  256. package/dist/lib/tracking/enterprise/churn.js +22 -0
  257. package/dist/lib/tracking/enterprise/churn.js.map +1 -0
  258. package/dist/lib/tracking/enterprise/cohorts.d.ts +18 -0
  259. package/dist/lib/tracking/enterprise/cohorts.js +18 -0
  260. package/dist/lib/tracking/enterprise/cohorts.js.map +1 -0
  261. package/dist/lib/tracking/enterprise/engagement.d.ts +31 -0
  262. package/dist/lib/tracking/enterprise/engagement.js +44 -0
  263. package/dist/lib/tracking/enterprise/engagement.js.map +1 -0
  264. package/dist/lib/tracking/enterprise/forecasting.d.ts +18 -0
  265. package/dist/lib/tracking/enterprise/forecasting.js +22 -0
  266. package/dist/lib/tracking/enterprise/forecasting.js.map +1 -0
  267. package/dist/lib/tracking/enterprise/index.d.ts +11 -0
  268. package/dist/lib/tracking/enterprise/index.js +12 -0
  269. package/dist/lib/tracking/enterprise/index.js.map +1 -0
  270. package/dist/lib/tracking/enterprise/monetization.d.ts +14 -0
  271. package/dist/lib/tracking/enterprise/monetization.js +10 -0
  272. package/dist/lib/tracking/enterprise/monetization.js.map +1 -0
  273. package/dist/lib/tracking/enterprise/multi-path-funnels.d.ts +20 -0
  274. package/dist/lib/tracking/enterprise/multi-path-funnels.js +18 -0
  275. package/dist/lib/tracking/enterprise/multi-path-funnels.js.map +1 -0
  276. package/dist/lib/tracking/enterprise/paths.d.ts +20 -0
  277. package/dist/lib/tracking/enterprise/paths.js +18 -0
  278. package/dist/lib/tracking/enterprise/paths.js.map +1 -0
  279. package/dist/lib/tracking/enterprise/security.d.ts +28 -0
  280. package/dist/lib/tracking/enterprise/security.js +26 -0
  281. package/dist/lib/tracking/enterprise/security.js.map +1 -0
  282. package/dist/lib/tracking/enterprise/support.d.ts +25 -0
  283. package/dist/lib/tracking/enterprise/support.js +22 -0
  284. package/dist/lib/tracking/enterprise/support.js.map +1 -0
  285. package/dist/lib/tracking/index.d.ts +4 -0
  286. package/dist/lib/tracking/index.js +5 -0
  287. package/dist/lib/tracking/index.js.map +1 -0
  288. package/dist/lib/types/analytics.d.ts +10 -2
  289. package/dist/lib/types/analytics.js +6 -0
  290. package/dist/lib/types/analytics.js.map +1 -0
  291. package/dist/lib/types/common.js +6 -0
  292. package/dist/lib/types/common.js.map +1 -0
  293. package/dist/lib/types/ecommerce.js +6 -0
  294. package/dist/lib/types/ecommerce.js.map +1 -0
  295. package/dist/lib/types/index.js +8 -0
  296. package/dist/lib/types/index.js.map +1 -0
  297. package/dist/lib/utils/browser.d.ts +16 -0
  298. package/dist/lib/utils/browser.js +32 -0
  299. package/dist/lib/utils/browser.js.map +1 -0
  300. package/dist/lib/utils/identity.js +346 -0
  301. package/dist/lib/utils/identity.js.map +1 -0
  302. package/dist/lib/utils/storage.js +105 -0
  303. package/dist/lib/utils/storage.js.map +1 -0
  304. package/dist/umd/237.index.js +2 -0
  305. package/dist/umd/237.index.js.map +1 -0
  306. package/dist/umd/546.index.js +3 -0
  307. package/dist/umd/546.index.js.LICENSE.txt +14 -0
  308. package/dist/umd/546.index.js.map +1 -0
  309. package/dist/umd/index.js +2 -0
  310. package/dist/umd/index.js.map +1 -0
  311. package/package.json +27 -80
  312. package/dist/lib/features/ecommerce/inventory.d.ts +0 -219
@@ -0,0 +1,170 @@
1
+ /**
2
+ * @fileoverview Session Replay (rrweb) capture.
3
+ * @module features/analytics/replay
4
+ *
5
+ * @description
6
+ * Browser-only DOM session replay powered by [rrweb](https://github.com/rrweb-io/rrweb).
7
+ * Records DOM mutations, mouse, scroll, input, and viewport events, batches them
8
+ * into chunks, and ships them to the FlowGrid backend at `call=replay_chunk`.
9
+ *
10
+ * Loaded dynamically so it is only pulled into the bundle when `start()` is
11
+ * called in a browser environment.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const stop = await fg.replay.start({
16
+ * sampleRate: 1.0,
17
+ * maskAllInputs: true,
18
+ * });
19
+ * // ...later
20
+ * stop();
21
+ * ```
22
+ */
23
+ import { FlowGridTransport } from "../../client/transport";
24
+ import { type Teardown } from "../../utils/browser";
25
+ export interface SessionReplayOptions {
26
+ /** Explicit enable switch. Pass `false` to keep the recorder disabled. */
27
+ enabled?: boolean;
28
+ /** Sampling rate 0.0-1.0. Default 1.0 (record every session). */
29
+ sampleRate?: number;
30
+ /** Existing session ID to attach the recording to. Auto-generated otherwise. */
31
+ sessionId?: string;
32
+ /** User ID for the recording, if known. */
33
+ userId?: string;
34
+ /** Mask all `<input>`, `<textarea>` and `[contenteditable]` values. Default true. */
35
+ maskAllInputs?: boolean;
36
+ /** Mask text content under elements matching this CSS class. Default `"fg-mask"`. */
37
+ maskTextClass?: string | RegExp;
38
+ /** Skip recording elements matching this CSS class entirely. Default `"fg-block"`. */
39
+ blockClass?: string | RegExp;
40
+ /** Ignore events on elements matching this CSS class. Default `"fg-ignore"`. */
41
+ ignoreClass?: string;
42
+ /** Flush buffered events at most every N ms. Default 5000. */
43
+ flushIntervalMs?: number;
44
+ /** Force flush when buffer reaches N bytes (approximate). Default 512KB. */
45
+ flushBytes?: number;
46
+ /** Maximum recording length per session in ms. Default 30 minutes. */
47
+ maxDurationMs?: number;
48
+ /** Hard cap on total bytes captured per session. Default 10MB. */
49
+ maxBytes?: number;
50
+ /** Invoked when recorder state changes or lifecycle metadata is updated. */
51
+ onStatus?: (status: SessionReplayStatus) => void;
52
+ /** Invoked after a chunk is accepted for transport. */
53
+ onFlush?: (metadata: SessionReplayFlushMetadata) => void;
54
+ /** Invoked when events are dropped due to limits or serialization issues. */
55
+ onDrop?: (metadata: SessionReplayDropMetadata) => void;
56
+ /** Invoked when recorder setup or teardown fails. */
57
+ onError?: (error: Error, context: SessionReplayErrorContext) => void;
58
+ }
59
+ export type SessionReplayState = "idle" | "starting" | "recording" | "stopped" | "disabled" | "sampled_out" | "error";
60
+ export type SessionReplayFlushReason = "interval" | "size" | "visibility_hidden" | "pagehide" | "manual" | "stop" | "max_duration" | "max_bytes";
61
+ export interface SessionReplayStatus {
62
+ state: SessionReplayState;
63
+ sessionId?: string;
64
+ userId?: string;
65
+ startedAt?: string;
66
+ sequence: number;
67
+ bufferedEvents: number;
68
+ bufferedBytes: number;
69
+ totalBytes: number;
70
+ droppedEvents: number;
71
+ recorderVersion: string;
72
+ lastFlushReason?: SessionReplayFlushReason;
73
+ lastError?: string;
74
+ }
75
+ export interface SessionReplayFlushMetadata {
76
+ sessionId: string;
77
+ userId?: string;
78
+ sequence: number;
79
+ eventsCount: number;
80
+ byteSize: number;
81
+ reason: SessionReplayFlushReason;
82
+ isFinal: boolean;
83
+ droppedEvents: number;
84
+ capturedAt: string;
85
+ idempotencyKey: string;
86
+ }
87
+ export interface SessionReplayDropMetadata {
88
+ sessionId?: string;
89
+ reason: "serialization_error" | "max_bytes";
90
+ droppedEvents: number;
91
+ byteSize?: number;
92
+ maxBytes?: number;
93
+ }
94
+ export interface SessionReplayErrorContext {
95
+ phase: "import" | "record" | "flush" | "stop";
96
+ sessionId?: string;
97
+ }
98
+ export interface SessionReplaySendChunkOptions {
99
+ userId?: string;
100
+ sequence?: number;
101
+ useBeacon?: boolean;
102
+ startedAt?: string;
103
+ capturedAt?: string;
104
+ pageUrl?: string;
105
+ isFinal?: boolean;
106
+ reason?: SessionReplayFlushReason;
107
+ privacy?: ReplayPrivacyMetadata;
108
+ droppedEvents?: number;
109
+ recorderVersion?: string;
110
+ }
111
+ export interface ReplayPrivacyMetadata {
112
+ masking_mode: "all_inputs" | "selective" | "custom";
113
+ blocked_selectors: string[];
114
+ redacted_fields: string[];
115
+ consent_state: "granted" | "denied" | "unknown";
116
+ sampling_state: "sampled_in" | "sampled_out";
117
+ }
118
+ export declare class SessionReplay extends FlowGridTransport {
119
+ private disabled;
120
+ private active;
121
+ private state;
122
+ private boundUserId?;
123
+ private lastError?;
124
+ /**
125
+ * Begin capturing the current page as a replay session. Returns a teardown
126
+ * function that flushes the final buffer (via `sendBeacon` when possible)
127
+ * and detaches the recorder.
128
+ *
129
+ * No-op on the server or when the browser fails sampling.
130
+ */
131
+ start(options?: SessionReplayOptions): Promise<Teardown>;
132
+ /** Enable replay capture and start recording immediately. */
133
+ enable(options?: SessionReplayOptions): Promise<Teardown>;
134
+ /** Disable replay capture and stop any active recording. */
135
+ disable(): void;
136
+ /** Stop recording and flush the final chunk with lifecycle metadata. */
137
+ stop(reason?: SessionReplayFlushReason): void;
138
+ /** Flush buffered rrweb events without stopping the recorder. */
139
+ flush(reason?: SessionReplayFlushReason, options?: {
140
+ useBeacon?: boolean;
141
+ isFinal?: boolean;
142
+ }): Promise<void>;
143
+ /** Bind a known user to subsequent chunks in the active recording. */
144
+ identify(userId: string): void;
145
+ /** Current recorder health/lifecycle state. */
146
+ getStatus(): SessionReplayStatus;
147
+ /**
148
+ * Manually persist a single rrweb event chunk. Most callers should use
149
+ * `start()` instead; this is exposed for tests and advanced integrations
150
+ * that drive `rrweb.record()` themselves.
151
+ */
152
+ sendChunk(sessionId: string, events: unknown[], options?: SessionReplaySendChunkOptions): Promise<void>;
153
+ private postReplayChunk;
154
+ private captureEvent;
155
+ private cleanupActive;
156
+ private normalizeOptions;
157
+ private createStatus;
158
+ private setState;
159
+ private emitStatus;
160
+ private handleError;
161
+ private createPrivacyMetadata;
162
+ private selectorList;
163
+ private getPageUrl;
164
+ private createIdempotencyKey;
165
+ private measureEvents;
166
+ private toError;
167
+ private resolveSessionId;
168
+ private generateId;
169
+ }
170
+ export default SessionReplay;
@@ -0,0 +1,381 @@
1
+ /**
2
+ * @fileoverview Session Replay (rrweb) capture.
3
+ * @module features/analytics/replay
4
+ *
5
+ * @description
6
+ * Browser-only DOM session replay powered by [rrweb](https://github.com/rrweb-io/rrweb).
7
+ * Records DOM mutations, mouse, scroll, input, and viewport events, batches them
8
+ * into chunks, and ships them to the FlowGrid backend at `call=replay_chunk`.
9
+ *
10
+ * Loaded dynamically so it is only pulled into the bundle when `start()` is
11
+ * called in a browser environment.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const stop = await fg.replay.start({
16
+ * sampleRate: 1.0,
17
+ * maskAllInputs: true,
18
+ * });
19
+ * // ...later
20
+ * stop();
21
+ * ```
22
+ */
23
+ import { FlowGridTransport } from "../../client/transport";
24
+ import { isBrowser, getDocument } from "../../utils/browser";
25
+ const DEFAULT_FLUSH_MS = 5000;
26
+ const DEFAULT_FLUSH_BYTES = 512 * 1024;
27
+ const DEFAULT_MAX_DURATION_MS = 30 * 60 * 1000;
28
+ const DEFAULT_MAX_BYTES = 10 * 1024 * 1024;
29
+ const STORAGE_KEY = "flowgrid:replaySessionId";
30
+ const RECORDER_VERSION = "rrweb@2";
31
+ // ============================================================================
32
+ // SESSION REPLAY CLASS
33
+ // ============================================================================
34
+ export class SessionReplay extends FlowGridTransport {
35
+ constructor() {
36
+ super(...arguments);
37
+ this.disabled = false;
38
+ this.active = null;
39
+ this.state = "idle";
40
+ }
41
+ /**
42
+ * Begin capturing the current page as a replay session. Returns a teardown
43
+ * function that flushes the final buffer (via `sendBeacon` when possible)
44
+ * and detaches the recorder.
45
+ *
46
+ * No-op on the server or when the browser fails sampling.
47
+ */
48
+ async start(options = {}) {
49
+ if (options.enabled === false || this.disabled) {
50
+ this.setState("disabled", options);
51
+ return () => { };
52
+ }
53
+ if (this.active && !this.active.stopped) {
54
+ this.emitStatus(this.active.options);
55
+ return () => this.stop("manual");
56
+ }
57
+ if (!isBrowser())
58
+ return () => { };
59
+ this.setState("starting", options);
60
+ const sampleRate = options.sampleRate ?? 1.0;
61
+ if (sampleRate < 1 && Math.random() > sampleRate) {
62
+ this.setState("sampled_out", options);
63
+ return () => { };
64
+ }
65
+ let rrweb;
66
+ try {
67
+ rrweb = await import("rrweb");
68
+ }
69
+ catch (error) {
70
+ this.handleError(this.toError(error), { phase: "import" }, options);
71
+ return () => { };
72
+ }
73
+ const doc = getDocument();
74
+ if (!doc)
75
+ return () => { };
76
+ const sessionId = options.sessionId ?? this.resolveSessionId();
77
+ const normalizedOptions = this.normalizeOptions(options);
78
+ const startedAtMs = Date.now();
79
+ const active = {
80
+ sessionId,
81
+ userId: options.userId ?? this.boundUserId,
82
+ startedAtMs,
83
+ startedAt: new Date(startedAtMs).toISOString(),
84
+ sequence: 0,
85
+ buffer: [],
86
+ bufferBytes: 0,
87
+ totalBytes: 0,
88
+ droppedEvents: 0,
89
+ stopped: false,
90
+ flushTimer: setInterval(() => { void this.flush("interval"); }, normalizedOptions.flushIntervalMs),
91
+ durationGuard: setTimeout(() => this.stop("max_duration"), normalizedOptions.maxDurationMs),
92
+ onVisibility: () => {
93
+ if (doc.visibilityState === "hidden")
94
+ void this.flush("visibility_hidden", { useBeacon: true });
95
+ },
96
+ onPageHide: () => { void this.flush("pagehide", { useBeacon: true }); },
97
+ options: normalizedOptions,
98
+ };
99
+ this.active = active;
100
+ try {
101
+ active.stopRecording = rrweb.record({
102
+ emit: (event) => this.captureEvent(event),
103
+ maskAllInputs: normalizedOptions.maskAllInputs,
104
+ maskTextClass: normalizedOptions.maskTextClass ?? "fg-mask",
105
+ blockClass: normalizedOptions.blockClass ?? "fg-block",
106
+ ignoreClass: normalizedOptions.ignoreClass ?? "fg-ignore",
107
+ });
108
+ }
109
+ catch (error) {
110
+ this.handleError(this.toError(error), {
111
+ phase: "record", sessionId
112
+ }, normalizedOptions);
113
+ active.stopped = true;
114
+ this.cleanupActive("stop");
115
+ this.active = null;
116
+ return () => { };
117
+ }
118
+ doc.addEventListener("visibilitychange", active.onVisibility);
119
+ window.addEventListener("pagehide", active.onPageHide);
120
+ this.setState("recording", normalizedOptions);
121
+ return () => this.stop("manual");
122
+ }
123
+ /** Enable replay capture and start recording immediately. */
124
+ enable(options = {}) {
125
+ this.disabled = false;
126
+ return this.start({ ...options, enabled: true });
127
+ }
128
+ /** Disable replay capture and stop any active recording. */
129
+ disable() {
130
+ this.disabled = true;
131
+ this.stop("manual");
132
+ this.setState("disabled", this.active?.options);
133
+ }
134
+ /** Stop recording and flush the final chunk with lifecycle metadata. */
135
+ stop(reason = "stop") {
136
+ const active = this.active;
137
+ if (!active || active.stopped)
138
+ return;
139
+ active.stopped = true;
140
+ this.cleanupActive(reason);
141
+ void this.flush(reason, { useBeacon: true, isFinal: true });
142
+ this.setState("stopped", active.options, reason);
143
+ this.active = null;
144
+ }
145
+ /** Flush buffered rrweb events without stopping the recorder. */
146
+ async flush(reason = "manual", options = {}) {
147
+ const active = this.active;
148
+ if (!active || active.buffer.length === 0)
149
+ return;
150
+ const events = active.buffer;
151
+ const eventsCount = events.length;
152
+ const byteSize = active.bufferBytes;
153
+ const sequence = active.sequence++;
154
+ active.buffer = [];
155
+ active.bufferBytes = 0;
156
+ const capturedAt = new Date().toISOString();
157
+ const idempotencyKey = this.createIdempotencyKey(active.sessionId, sequence, byteSize);
158
+ const metadata = {
159
+ sessionId: active.sessionId,
160
+ userId: active.userId,
161
+ sequence,
162
+ eventsCount,
163
+ byteSize,
164
+ reason,
165
+ isFinal: options.isFinal === true,
166
+ droppedEvents: active.droppedEvents,
167
+ capturedAt,
168
+ idempotencyKey,
169
+ };
170
+ try {
171
+ await this.postReplayChunk(active.sessionId, events, {
172
+ userId: active.userId,
173
+ sequence,
174
+ useBeacon: options.useBeacon,
175
+ startedAt: active.startedAt,
176
+ capturedAt,
177
+ pageUrl: this.getPageUrl(),
178
+ isFinal: metadata.isFinal,
179
+ reason,
180
+ privacy: this.createPrivacyMetadata(active.options, "sampled_in"),
181
+ droppedEvents: active.droppedEvents,
182
+ recorderVersion: RECORDER_VERSION,
183
+ }, idempotencyKey);
184
+ active.options.onFlush?.(metadata);
185
+ this.emitStatus(active.options, reason);
186
+ }
187
+ catch (error) {
188
+ this.handleError(this.toError(error), { phase: "flush", sessionId: active.sessionId }, active.options);
189
+ }
190
+ }
191
+ /** Bind a known user to subsequent chunks in the active recording. */
192
+ identify(userId) {
193
+ this.boundUserId = userId;
194
+ if (this.active) {
195
+ this.active.userId = userId;
196
+ this.emitStatus(this.active.options);
197
+ }
198
+ }
199
+ /** Current recorder health/lifecycle state. */
200
+ getStatus() {
201
+ return this.createStatus(this.active?.options);
202
+ }
203
+ /**
204
+ * Manually persist a single rrweb event chunk. Most callers should use
205
+ * `start()` instead; this is exposed for tests and advanced integrations
206
+ * that drive `rrweb.record()` themselves.
207
+ */
208
+ async sendChunk(sessionId, events, options = {}) {
209
+ if (events.length === 0)
210
+ return;
211
+ await this.postReplayChunk(sessionId, events, options);
212
+ }
213
+ async postReplayChunk(sessionId, events, options, idempotencyKey = this.createIdempotencyKey(sessionId, options.sequence ?? 0, this.measureEvents(events))) {
214
+ await this.postRaw("replay_chunk", {
215
+ type: "replay_chunk",
216
+ session_id: sessionId,
217
+ user_id: options.userId,
218
+ sequence: options.sequence ?? 0,
219
+ started_at: options.startedAt,
220
+ captured_at: options.capturedAt ?? new Date().toISOString(),
221
+ events,
222
+ page_url: options.pageUrl ?? this.getPageUrl(),
223
+ idempotency_key: idempotencyKey,
224
+ compression: "none",
225
+ is_final: options.isFinal === true,
226
+ chunk_kind: options.isFinal ? "final" : "partial",
227
+ flush_reason: options.reason ?? "manual",
228
+ dropped_events: options.droppedEvents ?? 0,
229
+ recorder_version: options.recorderVersion ?? RECORDER_VERSION,
230
+ privacy: options.privacy ?? this.createPrivacyMetadata(undefined, "sampled_in"),
231
+ }, { useBeacon: options.useBeacon });
232
+ }
233
+ captureEvent(event) {
234
+ const active = this.active;
235
+ if (!active || active.stopped)
236
+ return;
237
+ let size = 0;
238
+ try {
239
+ size = JSON.stringify(event).length;
240
+ }
241
+ catch {
242
+ active.droppedEvents++;
243
+ active.options.onDrop?.({
244
+ sessionId: active.sessionId,
245
+ reason: "serialization_error",
246
+ droppedEvents: active.droppedEvents,
247
+ });
248
+ return;
249
+ }
250
+ if (active.totalBytes + size > active.options.maxBytes) {
251
+ active.droppedEvents++;
252
+ active.options.onDrop?.({
253
+ sessionId: active.sessionId,
254
+ reason: "max_bytes",
255
+ droppedEvents: active.droppedEvents,
256
+ byteSize: active.totalBytes + size,
257
+ maxBytes: active.options.maxBytes,
258
+ });
259
+ this.stop("max_bytes");
260
+ return;
261
+ }
262
+ active.totalBytes += size;
263
+ active.buffer.push(event);
264
+ active.bufferBytes += size;
265
+ if (active.bufferBytes >= active.options.flushBytes) {
266
+ void this.flush("size");
267
+ }
268
+ }
269
+ cleanupActive(reason) {
270
+ const active = this.active;
271
+ if (!active)
272
+ return;
273
+ const doc = getDocument();
274
+ clearInterval(active.flushTimer);
275
+ clearTimeout(active.durationGuard);
276
+ doc?.removeEventListener("visibilitychange", active.onVisibility);
277
+ window.removeEventListener("pagehide", active.onPageHide);
278
+ try {
279
+ active.stopRecording?.();
280
+ }
281
+ catch (error) {
282
+ this.handleError(this.toError(error), { phase: "stop", sessionId: active.sessionId }, active.options);
283
+ }
284
+ this.emitStatus(active.options, reason);
285
+ }
286
+ normalizeOptions(options) {
287
+ return {
288
+ ...options,
289
+ flushIntervalMs: options.flushIntervalMs ?? DEFAULT_FLUSH_MS,
290
+ flushBytes: options.flushBytes ?? DEFAULT_FLUSH_BYTES,
291
+ maxDurationMs: options.maxDurationMs ?? DEFAULT_MAX_DURATION_MS,
292
+ maxBytes: options.maxBytes ?? DEFAULT_MAX_BYTES,
293
+ maskAllInputs: options.maskAllInputs ?? true,
294
+ };
295
+ }
296
+ createStatus(options, reason) {
297
+ const active = this.active;
298
+ return {
299
+ state: this.state,
300
+ sessionId: active?.sessionId,
301
+ userId: active?.userId ?? this.boundUserId,
302
+ startedAt: active?.startedAt,
303
+ sequence: active?.sequence ?? 0,
304
+ bufferedEvents: active?.buffer.length ?? 0,
305
+ bufferedBytes: active?.bufferBytes ?? 0,
306
+ totalBytes: active?.totalBytes ?? 0,
307
+ droppedEvents: active?.droppedEvents ?? 0,
308
+ recorderVersion: RECORDER_VERSION,
309
+ lastFlushReason: reason,
310
+ lastError: this.lastError,
311
+ };
312
+ }
313
+ setState(state, options, reason) {
314
+ this.state = state;
315
+ this.emitStatus(options, reason);
316
+ }
317
+ emitStatus(options, reason) {
318
+ options?.onStatus?.(this.createStatus(options, reason));
319
+ }
320
+ handleError(error, context, options) {
321
+ this.lastError = error.message;
322
+ this.state = "error";
323
+ options?.onError?.(error, context);
324
+ this.emitStatus(options);
325
+ }
326
+ createPrivacyMetadata(options, samplingState = "sampled_in") {
327
+ return {
328
+ masking_mode: options?.maskAllInputs === false ? "selective" : "all_inputs",
329
+ blocked_selectors: this.selectorList(options?.blockClass ?? "fg-block"),
330
+ redacted_fields: this.selectorList(options?.maskTextClass ?? "fg-mask"),
331
+ consent_state: FlowGridTransport.hasConsent("analytics") ? "granted" : "denied",
332
+ sampling_state: samplingState,
333
+ };
334
+ }
335
+ selectorList(selector) {
336
+ return typeof selector === "string" ? [selector] : [selector.source];
337
+ }
338
+ getPageUrl() {
339
+ try {
340
+ return typeof location !== "undefined" ? location.href : "";
341
+ }
342
+ catch {
343
+ return "";
344
+ }
345
+ }
346
+ createIdempotencyKey(sessionId, sequence, byteSize) {
347
+ return `${this.webId}:${sessionId}:${sequence}:${byteSize}`;
348
+ }
349
+ measureEvents(events) {
350
+ try {
351
+ return JSON.stringify(events).length;
352
+ }
353
+ catch {
354
+ return 0;
355
+ }
356
+ }
357
+ toError(error) {
358
+ return error instanceof Error ? error : new Error(String(error));
359
+ }
360
+ resolveSessionId() {
361
+ try {
362
+ const existing = sessionStorage.getItem(STORAGE_KEY);
363
+ if (existing)
364
+ return existing;
365
+ const fresh = this.generateId();
366
+ sessionStorage.setItem(STORAGE_KEY, fresh);
367
+ return fresh;
368
+ }
369
+ catch {
370
+ return this.generateId();
371
+ }
372
+ }
373
+ generateId() {
374
+ const cryptoObj = (typeof crypto !== "undefined" ? crypto : undefined);
375
+ if (cryptoObj?.randomUUID)
376
+ return cryptoObj.randomUUID();
377
+ return `rep_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
378
+ }
379
+ }
380
+ export default SessionReplay;
381
+ //# sourceMappingURL=replay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"replay.js","sourceRoot":"","sources":["../../../../src/lib/features/analytics/replay.ts"],"names":[],"mappings":"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"}
@@ -44,7 +44,7 @@
44
44
  * ```
45
45
  */
46
46
  import { FlowGridTransport } from "../../client/transport";
47
- import { RetentionCohort, UserLifecycleStage, LifecycleMetrics, DateRangeFilter, TimeGranularity, TimeSeriesData } from "../../types";
47
+ import { RetentionCohort, UserLifecycleStage, DateRangeFilter, TimeGranularity, TimeSeriesData } from "../../types";
48
48
  /**
49
49
  * Configuration for tracking user activity.
50
50
  */
@@ -215,80 +215,5 @@ export declare class Retention extends FlowGridTransport {
215
215
  * @returns Promise resolving to stage change response
216
216
  */
217
217
  trackLifecycleChange(userId: string, stage: UserLifecycleStage, previousStage?: UserLifecycleStage): Promise<ActivityResponse>;
218
- /**
219
- * Gets cohort-based retention analysis.
220
- *
221
- * @param config - Cohort analysis configuration
222
- * @returns Promise resolving to cohort analysis data
223
- *
224
- * @example
225
- * ```typescript
226
- * const analysis = await retention.getCohortAnalysis({
227
- * filter: { range: 'last90days' },
228
- * granularity: 'week',
229
- * periods: 12
230
- * });
231
- *
232
- * // Heatmap visualization
233
- * const heatmap = analysis.matrix.map(cohort => ({
234
- * y: cohort.cohort,
235
- * data: cohort.periods.map(p => ({
236
- * x: `Period ${p.period}`,
237
- * value: p.retentionRate
238
- * }))
239
- * }));
240
- *
241
- * // Retention curve (average across cohorts)
242
- * const curve = [1, 7, 14, 30].map(day => ({
243
- * x: `Day ${day}`,
244
- * y: getAvgRetention(analysis.cohorts, day)
245
- * }));
246
- * ```
247
- */
248
- getCohortAnalysis(config?: CohortAnalysisConfig): Promise<CohortAnalysisData>;
249
- /**
250
- * Gets user stickiness metrics (DAU/MAU).
251
- *
252
- * @param filter - Date range filter
253
- * @returns Promise resolving to stickiness data
254
- *
255
- * @example
256
- * ```typescript
257
- * const stickiness = await retention.getStickiness({
258
- * range: 'last30days'
259
- * });
260
- *
261
- * console.log(`DAU/MAU: ${(stickiness.dauMauRatio * 100).toFixed(1)}%`);
262
- *
263
- * // Trend chart
264
- * const trendData = stickiness.trendData.data;
265
- * ```
266
- */
267
- getStickiness(filter?: DateRangeFilter): Promise<StickinessData>;
268
- /**
269
- * Gets churn analysis and at-risk users.
270
- *
271
- * @param filter - Date range filter
272
- * @returns Promise resolving to churn analysis data
273
- *
274
- * @example
275
- * ```typescript
276
- * const churn = await retention.getChurnAnalysis({
277
- * range: 'thisMonth'
278
- * });
279
- *
280
- * // Alert on high churn segments
281
- * churn.bySegment
282
- * .filter(s => s.churnRate > 0.1)
283
- * .forEach(s => console.warn(`High churn in ${s.segment}`));
284
- * ```
285
- */
286
- getChurnAnalysis(filter?: DateRangeFilter): Promise<ChurnAnalysisData>;
287
- /**
288
- * Gets user lifecycle distribution.
289
- *
290
- * @returns Promise resolving to lifecycle metrics
291
- */
292
- getLifecycleMetrics(): Promise<LifecycleMetrics>;
293
218
  }
294
219
  export default Retention;