@formo/analytics-react-native 0.1.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 (247) hide show
  1. package/README.md +302 -0
  2. package/lib/commonjs/FormoAnalytics.js +526 -0
  3. package/lib/commonjs/FormoAnalytics.js.map +1 -0
  4. package/lib/commonjs/FormoAnalyticsProvider.js +265 -0
  5. package/lib/commonjs/FormoAnalyticsProvider.js.map +1 -0
  6. package/lib/commonjs/constants/config.js +69 -0
  7. package/lib/commonjs/constants/config.js.map +1 -0
  8. package/lib/commonjs/constants/events.js +30 -0
  9. package/lib/commonjs/constants/events.js.map +1 -0
  10. package/lib/commonjs/constants/index.js +39 -0
  11. package/lib/commonjs/constants/index.js.map +1 -0
  12. package/lib/commonjs/constants/storage.js +23 -0
  13. package/lib/commonjs/constants/storage.js.map +1 -0
  14. package/lib/commonjs/index.js +65 -0
  15. package/lib/commonjs/index.js.map +1 -0
  16. package/lib/commonjs/lib/consent/index.js +56 -0
  17. package/lib/commonjs/lib/consent/index.js.map +1 -0
  18. package/lib/commonjs/lib/event/EventFactory.js +493 -0
  19. package/lib/commonjs/lib/event/EventFactory.js.map +1 -0
  20. package/lib/commonjs/lib/event/EventManager.js +46 -0
  21. package/lib/commonjs/lib/event/EventManager.js.map +1 -0
  22. package/lib/commonjs/lib/event/EventQueue.js +290 -0
  23. package/lib/commonjs/lib/event/EventQueue.js.map +1 -0
  24. package/lib/commonjs/lib/event/index.js +50 -0
  25. package/lib/commonjs/lib/event/index.js.map +1 -0
  26. package/lib/commonjs/lib/event/types.js +6 -0
  27. package/lib/commonjs/lib/event/types.js.map +1 -0
  28. package/lib/commonjs/lib/lifecycle/index.js +196 -0
  29. package/lib/commonjs/lib/lifecycle/index.js.map +1 -0
  30. package/lib/commonjs/lib/logger/index.js +48 -0
  31. package/lib/commonjs/lib/logger/index.js.map +1 -0
  32. package/lib/commonjs/lib/session/index.js +109 -0
  33. package/lib/commonjs/lib/session/index.js.map +1 -0
  34. package/lib/commonjs/lib/storage/AsyncStorageAdapter.js +164 -0
  35. package/lib/commonjs/lib/storage/AsyncStorageAdapter.js.map +1 -0
  36. package/lib/commonjs/lib/storage/MemoryStorage.js +41 -0
  37. package/lib/commonjs/lib/storage/MemoryStorage.js.map +1 -0
  38. package/lib/commonjs/lib/storage/StorageBlueprint.js +24 -0
  39. package/lib/commonjs/lib/storage/StorageBlueprint.js.map +1 -0
  40. package/lib/commonjs/lib/storage/StorageManager.js +126 -0
  41. package/lib/commonjs/lib/storage/StorageManager.js.map +1 -0
  42. package/lib/commonjs/lib/storage/index.js +49 -0
  43. package/lib/commonjs/lib/storage/index.js.map +1 -0
  44. package/lib/commonjs/lib/storage/types.js +2 -0
  45. package/lib/commonjs/lib/storage/types.js.map +1 -0
  46. package/lib/commonjs/lib/wagmi/WagmiEventHandler.js +445 -0
  47. package/lib/commonjs/lib/wagmi/WagmiEventHandler.js.map +1 -0
  48. package/lib/commonjs/lib/wagmi/index.js +28 -0
  49. package/lib/commonjs/lib/wagmi/index.js.map +1 -0
  50. package/lib/commonjs/lib/wagmi/types.js +2 -0
  51. package/lib/commonjs/lib/wagmi/types.js.map +1 -0
  52. package/lib/commonjs/types/base.js +6 -0
  53. package/lib/commonjs/types/base.js.map +1 -0
  54. package/lib/commonjs/types/events.js +22 -0
  55. package/lib/commonjs/types/events.js.map +1 -0
  56. package/lib/commonjs/types/index.js +28 -0
  57. package/lib/commonjs/types/index.js.map +1 -0
  58. package/lib/commonjs/utils/address.js +82 -0
  59. package/lib/commonjs/utils/address.js.map +1 -0
  60. package/lib/commonjs/utils/hash.js +30 -0
  61. package/lib/commonjs/utils/hash.js.map +1 -0
  62. package/lib/commonjs/utils/helpers.js +116 -0
  63. package/lib/commonjs/utils/helpers.js.map +1 -0
  64. package/lib/commonjs/utils/index.js +61 -0
  65. package/lib/commonjs/utils/index.js.map +1 -0
  66. package/lib/commonjs/utils/timestamp.js +34 -0
  67. package/lib/commonjs/utils/timestamp.js.map +1 -0
  68. package/lib/commonjs/utils/trafficSource.js +147 -0
  69. package/lib/commonjs/utils/trafficSource.js.map +1 -0
  70. package/lib/commonjs/version.js +10 -0
  71. package/lib/commonjs/version.js.map +1 -0
  72. package/lib/module/FormoAnalytics.js +519 -0
  73. package/lib/module/FormoAnalytics.js.map +1 -0
  74. package/lib/module/FormoAnalyticsProvider.js +256 -0
  75. package/lib/module/FormoAnalyticsProvider.js.map +1 -0
  76. package/lib/module/constants/config.js +62 -0
  77. package/lib/module/constants/config.js.map +1 -0
  78. package/lib/module/constants/events.js +24 -0
  79. package/lib/module/constants/events.js.map +1 -0
  80. package/lib/module/constants/index.js +4 -0
  81. package/lib/module/constants/index.js.map +1 -0
  82. package/lib/module/constants/storage.js +17 -0
  83. package/lib/module/constants/storage.js.map +1 -0
  84. package/lib/module/index.js +51 -0
  85. package/lib/module/index.js.map +1 -0
  86. package/lib/module/lib/consent/index.js +49 -0
  87. package/lib/module/lib/consent/index.js.map +1 -0
  88. package/lib/module/lib/event/EventFactory.js +488 -0
  89. package/lib/module/lib/event/EventFactory.js.map +1 -0
  90. package/lib/module/lib/event/EventManager.js +41 -0
  91. package/lib/module/lib/event/EventManager.js.map +1 -0
  92. package/lib/module/lib/event/EventQueue.js +283 -0
  93. package/lib/module/lib/event/EventQueue.js.map +1 -0
  94. package/lib/module/lib/event/index.js +5 -0
  95. package/lib/module/lib/event/index.js.map +1 -0
  96. package/lib/module/lib/event/types.js +2 -0
  97. package/lib/module/lib/event/types.js.map +1 -0
  98. package/lib/module/lib/lifecycle/index.js +190 -0
  99. package/lib/module/lib/lifecycle/index.js.map +1 -0
  100. package/lib/module/lib/logger/index.js +42 -0
  101. package/lib/module/lib/logger/index.js.map +1 -0
  102. package/lib/module/lib/session/index.js +92 -0
  103. package/lib/module/lib/session/index.js.map +1 -0
  104. package/lib/module/lib/storage/AsyncStorageAdapter.js +158 -0
  105. package/lib/module/lib/storage/AsyncStorageAdapter.js.map +1 -0
  106. package/lib/module/lib/storage/MemoryStorage.js +35 -0
  107. package/lib/module/lib/storage/MemoryStorage.js.map +1 -0
  108. package/lib/module/lib/storage/StorageBlueprint.js +18 -0
  109. package/lib/module/lib/storage/StorageBlueprint.js.map +1 -0
  110. package/lib/module/lib/storage/StorageManager.js +115 -0
  111. package/lib/module/lib/storage/StorageManager.js.map +1 -0
  112. package/lib/module/lib/storage/index.js +5 -0
  113. package/lib/module/lib/storage/index.js.map +1 -0
  114. package/lib/module/lib/storage/types.js +2 -0
  115. package/lib/module/lib/storage/types.js.map +1 -0
  116. package/lib/module/lib/wagmi/WagmiEventHandler.js +439 -0
  117. package/lib/module/lib/wagmi/WagmiEventHandler.js.map +1 -0
  118. package/lib/module/lib/wagmi/index.js +3 -0
  119. package/lib/module/lib/wagmi/index.js.map +1 -0
  120. package/lib/module/lib/wagmi/types.js +2 -0
  121. package/lib/module/lib/wagmi/types.js.map +1 -0
  122. package/lib/module/types/base.js +2 -0
  123. package/lib/module/types/base.js.map +1 -0
  124. package/lib/module/types/events.js +17 -0
  125. package/lib/module/types/events.js.map +1 -0
  126. package/lib/module/types/index.js +3 -0
  127. package/lib/module/types/index.js.map +1 -0
  128. package/lib/module/utils/address.js +74 -0
  129. package/lib/module/utils/address.js.map +1 -0
  130. package/lib/module/utils/hash.js +24 -0
  131. package/lib/module/utils/hash.js.map +1 -0
  132. package/lib/module/utils/helpers.js +105 -0
  133. package/lib/module/utils/helpers.js.map +1 -0
  134. package/lib/module/utils/index.js +6 -0
  135. package/lib/module/utils/index.js.map +1 -0
  136. package/lib/module/utils/timestamp.js +26 -0
  137. package/lib/module/utils/timestamp.js.map +1 -0
  138. package/lib/module/utils/trafficSource.js +137 -0
  139. package/lib/module/utils/trafficSource.js.map +1 -0
  140. package/lib/module/version.js +4 -0
  141. package/lib/module/version.js.map +1 -0
  142. package/lib/typescript/FormoAnalytics.d.ts +163 -0
  143. package/lib/typescript/FormoAnalytics.d.ts.map +1 -0
  144. package/lib/typescript/FormoAnalyticsProvider.d.ts +29 -0
  145. package/lib/typescript/FormoAnalyticsProvider.d.ts.map +1 -0
  146. package/lib/typescript/constants/config.d.ts +8 -0
  147. package/lib/typescript/constants/config.d.ts.map +1 -0
  148. package/lib/typescript/constants/events.d.ts +23 -0
  149. package/lib/typescript/constants/events.d.ts.map +1 -0
  150. package/lib/typescript/constants/index.d.ts +4 -0
  151. package/lib/typescript/constants/index.d.ts.map +1 -0
  152. package/lib/typescript/constants/storage.d.ts +10 -0
  153. package/lib/typescript/constants/storage.d.ts.map +1 -0
  154. package/lib/typescript/index.d.ts +44 -0
  155. package/lib/typescript/index.d.ts.map +1 -0
  156. package/lib/typescript/lib/consent/index.d.ts +13 -0
  157. package/lib/typescript/lib/consent/index.d.ts.map +1 -0
  158. package/lib/typescript/lib/event/EventFactory.d.ts +61 -0
  159. package/lib/typescript/lib/event/EventFactory.d.ts.map +1 -0
  160. package/lib/typescript/lib/event/EventManager.d.ts +17 -0
  161. package/lib/typescript/lib/event/EventManager.d.ts.map +1 -0
  162. package/lib/typescript/lib/event/EventQueue.d.ts +74 -0
  163. package/lib/typescript/lib/event/EventQueue.d.ts.map +1 -0
  164. package/lib/typescript/lib/event/index.d.ts +5 -0
  165. package/lib/typescript/lib/event/index.d.ts.map +1 -0
  166. package/lib/typescript/lib/event/types.d.ts +23 -0
  167. package/lib/typescript/lib/event/types.d.ts.map +1 -0
  168. package/lib/typescript/lib/lifecycle/index.d.ts +46 -0
  169. package/lib/typescript/lib/lifecycle/index.d.ts.map +1 -0
  170. package/lib/typescript/lib/logger/index.d.ts +19 -0
  171. package/lib/typescript/lib/logger/index.d.ts.map +1 -0
  172. package/lib/typescript/lib/session/index.d.ts +41 -0
  173. package/lib/typescript/lib/session/index.d.ts.map +1 -0
  174. package/lib/typescript/lib/storage/AsyncStorageAdapter.d.ts +48 -0
  175. package/lib/typescript/lib/storage/AsyncStorageAdapter.d.ts.map +1 -0
  176. package/lib/typescript/lib/storage/MemoryStorage.d.ts +18 -0
  177. package/lib/typescript/lib/storage/MemoryStorage.d.ts.map +1 -0
  178. package/lib/typescript/lib/storage/StorageBlueprint.d.ts +21 -0
  179. package/lib/typescript/lib/storage/StorageBlueprint.d.ts.map +1 -0
  180. package/lib/typescript/lib/storage/StorageManager.d.ts +45 -0
  181. package/lib/typescript/lib/storage/StorageManager.d.ts.map +1 -0
  182. package/lib/typescript/lib/storage/index.d.ts +5 -0
  183. package/lib/typescript/lib/storage/index.d.ts.map +1 -0
  184. package/lib/typescript/lib/storage/types.d.ts +22 -0
  185. package/lib/typescript/lib/storage/types.d.ts.map +1 -0
  186. package/lib/typescript/lib/wagmi/WagmiEventHandler.d.ts +104 -0
  187. package/lib/typescript/lib/wagmi/WagmiEventHandler.d.ts.map +1 -0
  188. package/lib/typescript/lib/wagmi/index.d.ts +3 -0
  189. package/lib/typescript/lib/wagmi/index.d.ts.map +1 -0
  190. package/lib/typescript/lib/wagmi/types.d.ts +54 -0
  191. package/lib/typescript/lib/wagmi/types.d.ts.map +1 -0
  192. package/lib/typescript/types/base.d.ts +219 -0
  193. package/lib/typescript/types/base.d.ts.map +1 -0
  194. package/lib/typescript/types/events.d.ts +111 -0
  195. package/lib/typescript/types/events.d.ts.map +1 -0
  196. package/lib/typescript/types/index.d.ts +3 -0
  197. package/lib/typescript/types/index.d.ts.map +1 -0
  198. package/lib/typescript/utils/address.d.ts +25 -0
  199. package/lib/typescript/utils/address.d.ts.map +1 -0
  200. package/lib/typescript/utils/hash.d.ts +10 -0
  201. package/lib/typescript/utils/hash.d.ts.map +1 -0
  202. package/lib/typescript/utils/helpers.d.ts +26 -0
  203. package/lib/typescript/utils/helpers.d.ts.map +1 -0
  204. package/lib/typescript/utils/index.d.ts +6 -0
  205. package/lib/typescript/utils/index.d.ts.map +1 -0
  206. package/lib/typescript/utils/timestamp.d.ts +13 -0
  207. package/lib/typescript/utils/timestamp.d.ts.map +1 -0
  208. package/lib/typescript/utils/trafficSource.d.ts +30 -0
  209. package/lib/typescript/utils/trafficSource.d.ts.map +1 -0
  210. package/lib/typescript/version.d.ts +2 -0
  211. package/lib/typescript/version.d.ts.map +1 -0
  212. package/package.json +143 -0
  213. package/src/FormoAnalytics.ts +685 -0
  214. package/src/FormoAnalyticsProvider.tsx +296 -0
  215. package/src/constants/config.ts +62 -0
  216. package/src/constants/events.ts +26 -0
  217. package/src/constants/index.ts +3 -0
  218. package/src/constants/storage.ts +16 -0
  219. package/src/index.ts +55 -0
  220. package/src/lib/consent/index.ts +52 -0
  221. package/src/lib/event/EventFactory.ts +682 -0
  222. package/src/lib/event/EventManager.ts +50 -0
  223. package/src/lib/event/EventQueue.ts +371 -0
  224. package/src/lib/event/index.ts +4 -0
  225. package/src/lib/event/types.ts +107 -0
  226. package/src/lib/lifecycle/index.ts +215 -0
  227. package/src/lib/logger/index.ts +56 -0
  228. package/src/lib/session/index.ts +103 -0
  229. package/src/lib/storage/AsyncStorageAdapter.ts +173 -0
  230. package/src/lib/storage/MemoryStorage.ts +43 -0
  231. package/src/lib/storage/StorageBlueprint.ts +30 -0
  232. package/src/lib/storage/StorageManager.ts +121 -0
  233. package/src/lib/storage/index.ts +4 -0
  234. package/src/lib/storage/types.ts +23 -0
  235. package/src/lib/wagmi/WagmiEventHandler.ts +574 -0
  236. package/src/lib/wagmi/index.ts +2 -0
  237. package/src/lib/wagmi/types.ts +71 -0
  238. package/src/types/base.ts +287 -0
  239. package/src/types/events.ts +140 -0
  240. package/src/types/index.ts +2 -0
  241. package/src/utils/address.ts +84 -0
  242. package/src/utils/hash.ts +23 -0
  243. package/src/utils/helpers.ts +139 -0
  244. package/src/utils/index.ts +5 -0
  245. package/src/utils/timestamp.ts +25 -0
  246. package/src/utils/trafficSource.ts +153 -0
  247. package/src/version.ts +3 -0
@@ -0,0 +1,283 @@
1
+ import { AppState } from "react-native";
2
+ import { EVENTS_API_REQUEST_HEADER } from "../../constants";
3
+ import { clampNumber, getActionDescriptor, millisecondsToSecond, isNetworkError } from "../../utils";
4
+ import { hash } from "../../utils/hash";
5
+ import { toDateHourMinute } from "../../utils/timestamp";
6
+ import { logger } from "../logger";
7
+ const DEFAULT_RETRY = 3;
8
+ const MAX_RETRY = 5;
9
+ const MIN_RETRY = 1;
10
+ const DEFAULT_FLUSH_AT = 20;
11
+ const MAX_FLUSH_AT = 20;
12
+ const MIN_FLUSH_AT = 1;
13
+ const DEFAULT_QUEUE_SIZE = 1_024 * 500; // 500kB
14
+ const MAX_QUEUE_SIZE = 1_024 * 500; // 500kB
15
+ const MIN_QUEUE_SIZE = 200; // 200 bytes
16
+
17
+ const DEFAULT_FLUSH_INTERVAL = 1_000 * 30; // 30 seconds
18
+ const MAX_FLUSH_INTERVAL = 1_000 * 300; // 5 minutes
19
+ const MIN_FLUSH_INTERVAL = 1_000 * 10; // 10 seconds
20
+
21
+ const noop = () => {};
22
+
23
+ /**
24
+ * Event queue for React Native
25
+ * Handles batching, flushing, and retries with app lifecycle awareness
26
+ */
27
+ export class EventQueue {
28
+ queue = [];
29
+ timer = null;
30
+ payloadHashes = new Set();
31
+ flushMutex = Promise.resolve();
32
+ appStateSubscription = null;
33
+ constructor(writeKey, options) {
34
+ this.writeKey = writeKey;
35
+ this.apiHost = options.apiHost;
36
+ this.retryCount = clampNumber(options.retryCount || DEFAULT_RETRY, MAX_RETRY, MIN_RETRY);
37
+ this.flushAt = clampNumber(options.flushAt || DEFAULT_FLUSH_AT, MAX_FLUSH_AT, MIN_FLUSH_AT);
38
+ this.maxQueueSize = clampNumber(options.maxQueueSize || DEFAULT_QUEUE_SIZE, MAX_QUEUE_SIZE, MIN_QUEUE_SIZE);
39
+ this.flushIntervalMs = clampNumber(options.flushInterval || DEFAULT_FLUSH_INTERVAL, MAX_FLUSH_INTERVAL, MIN_FLUSH_INTERVAL);
40
+ // Set up app state listener for React Native
41
+ this.setupAppStateListener();
42
+ }
43
+
44
+ /**
45
+ * Set up listener for app state changes
46
+ * Flush events when app goes to background
47
+ */
48
+ setupAppStateListener() {
49
+ this.appStateSubscription = AppState.addEventListener("change", this.handleAppStateChange.bind(this));
50
+ }
51
+
52
+ /**
53
+ * Handle app state changes
54
+ */
55
+ handleAppStateChange(nextAppState) {
56
+ // Flush when app goes to background or becomes inactive
57
+ if (nextAppState === "background" || nextAppState === "inactive") {
58
+ logger.debug("EventQueue: App going to background, flushing events");
59
+ this.flush().catch(error => {
60
+ logger.error("EventQueue: Failed to flush on background", error);
61
+ });
62
+ }
63
+ }
64
+
65
+ /**
66
+ * Generate message ID for deduplication
67
+ */
68
+ async generateMessageId(event) {
69
+ const formattedTimestamp = toDateHourMinute(new Date(event.original_timestamp));
70
+ const eventForHashing = {
71
+ ...event,
72
+ original_timestamp: formattedTimestamp
73
+ };
74
+ const eventString = JSON.stringify(eventForHashing);
75
+ return hash(eventString);
76
+ }
77
+
78
+ /**
79
+ * Check if event is a duplicate
80
+ */
81
+ isDuplicate(eventId) {
82
+ if (this.payloadHashes.has(eventId)) return true;
83
+ this.payloadHashes.add(eventId);
84
+ return false;
85
+ }
86
+
87
+ /**
88
+ * Add event to queue
89
+ */
90
+ async enqueue(event, callback) {
91
+ callback = callback || noop;
92
+ const message_id = await this.generateMessageId(event);
93
+
94
+ // Check for duplicate
95
+ if (this.isDuplicate(message_id)) {
96
+ logger.warn(`Event already enqueued, try again after ${millisecondsToSecond(this.flushIntervalMs)} seconds.`);
97
+ return;
98
+ }
99
+ this.queue.push({
100
+ message: {
101
+ ...event,
102
+ message_id
103
+ },
104
+ callback,
105
+ hash: message_id
106
+ });
107
+ logger.log(`Event enqueued: ${getActionDescriptor(event.type, event.properties)}`);
108
+ const hasReachedFlushAt = this.queue.length >= this.flushAt;
109
+ const hasReachedQueueSize = this.queue.reduce((acc, item) => acc + JSON.stringify(item).length, 0) >= this.maxQueueSize;
110
+ if (hasReachedFlushAt || hasReachedQueueSize) {
111
+ // Clear timer to prevent double flush
112
+ if (this.timer) {
113
+ clearTimeout(this.timer);
114
+ this.timer = null;
115
+ }
116
+ // Flush uses internal mutex to serialize operations
117
+ this.flush().catch(error => {
118
+ logger.error("EventQueue: Failed to flush on threshold", error);
119
+ });
120
+ return;
121
+ }
122
+ if (this.flushIntervalMs && !this.timer) {
123
+ this.timer = setTimeout(this.flush.bind(this), this.flushIntervalMs);
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Flush events to API
129
+ * Uses a mutex to ensure only one flush operation runs at a time,
130
+ * preventing race conditions with re-queued items on failure.
131
+ */
132
+ async flush(callback) {
133
+ callback = callback || noop;
134
+ if (this.timer) {
135
+ clearTimeout(this.timer);
136
+ this.timer = null;
137
+ }
138
+
139
+ // Use mutex to serialize flush operations and prevent race conditions
140
+ const previousMutex = this.flushMutex;
141
+ let resolveMutex;
142
+ this.flushMutex = new Promise(resolve => {
143
+ resolveMutex = resolve;
144
+ });
145
+ try {
146
+ // Wait for any previous flush to complete
147
+ await previousMutex;
148
+ if (!this.queue.length) {
149
+ callback();
150
+ return;
151
+ }
152
+ const items = this.queue.splice(0, this.flushAt);
153
+ const sentAt = new Date().toISOString();
154
+ const data = items.map(item => ({
155
+ ...item.message,
156
+ sent_at: sentAt
157
+ }));
158
+ const done = err => {
159
+ items.forEach(({
160
+ message,
161
+ callback: itemCallback
162
+ }) => itemCallback(err, message, data));
163
+ callback(err, data);
164
+ };
165
+ try {
166
+ await this.sendWithRetry(data);
167
+ // Only remove hashes after successful send
168
+ items.forEach(item => this.payloadHashes.delete(item.hash));
169
+ done();
170
+ logger.info(`Events sent successfully: ${data.length} events`);
171
+ } catch (err) {
172
+ // Re-add items to the front of the queue for retry on next flush
173
+ // Note: We intentionally keep hashes in payloadHashes to prevent duplicate
174
+ // events from being enqueued while these items are pending retry.
175
+ this.queue.unshift(...items);
176
+ done(err);
177
+ logger.error("Error sending events, re-queued for retry:", err);
178
+ throw err;
179
+ }
180
+ } finally {
181
+ resolveMutex();
182
+ }
183
+ }
184
+
185
+ /**
186
+ * Send events with retry logic
187
+ */
188
+ async sendWithRetry(data, attempt = 0) {
189
+ try {
190
+ const response = await fetch(this.apiHost, {
191
+ method: "POST",
192
+ headers: EVENTS_API_REQUEST_HEADER(this.writeKey),
193
+ body: JSON.stringify(data)
194
+ });
195
+ if (!response.ok) {
196
+ const shouldRetry = this.shouldRetry(response.status);
197
+ if (shouldRetry && attempt < this.retryCount) {
198
+ const delay = Math.pow(2, attempt) * 1000;
199
+ await new Promise(resolve => setTimeout(() => resolve(), delay));
200
+ return this.sendWithRetry(data, attempt + 1);
201
+ }
202
+ throw new Error(`HTTP error! status: ${response.status}`);
203
+ }
204
+ } catch (error) {
205
+ if (isNetworkError(error) && attempt < this.retryCount) {
206
+ const delay = Math.pow(2, attempt) * 1000;
207
+ logger.warn(`Network error, retrying in ${delay}ms...`);
208
+ await new Promise(resolve => setTimeout(() => resolve(), delay));
209
+ return this.sendWithRetry(data, attempt + 1);
210
+ }
211
+ throw error;
212
+ }
213
+ }
214
+
215
+ /**
216
+ * Check if error should be retried
217
+ */
218
+ shouldRetry(status) {
219
+ // Retry on server errors (5xx) and rate limiting (429)
220
+ return status >= 500 && status <= 599 || status === 429;
221
+ }
222
+
223
+ /**
224
+ * Discard all pending events without sending them.
225
+ * Used when the user opts out of tracking to prevent queued events
226
+ * from being sent after consent is revoked.
227
+ */
228
+ clear() {
229
+ this.queue = [];
230
+ this.payloadHashes.clear();
231
+ if (this.timer) {
232
+ clearTimeout(this.timer);
233
+ this.timer = null;
234
+ }
235
+ logger.debug("EventQueue: Cleared all pending events");
236
+ }
237
+
238
+ /**
239
+ * Clean up resources, flushing any pending events first
240
+ */
241
+ async cleanup() {
242
+ // Flush all remaining queued events before teardown
243
+ // Loop until queue is empty since flush() only sends flushAt events per call
244
+ // Safety limit prevents infinite loops if flush silently fails
245
+ const maxAttempts = Math.ceil(this.queue.length / this.flushAt) + 3;
246
+ let attempts = 0;
247
+ const initialQueueLength = this.queue.length;
248
+ while (this.queue.length > 0 && attempts < maxAttempts) {
249
+ const queueLengthBefore = this.queue.length;
250
+ try {
251
+ await this.flush();
252
+ } catch (error) {
253
+ logger.error("EventQueue: Failed to flush during cleanup", error);
254
+ // Break on error to avoid infinite loop if flush keeps failing
255
+ break;
256
+ }
257
+
258
+ // If queue length didn't decrease, flush is silently failing
259
+ if (this.queue.length >= queueLengthBefore) {
260
+ logger.warn("EventQueue: Flush did not reduce queue size, aborting cleanup");
261
+ break;
262
+ }
263
+ attempts++;
264
+ }
265
+ if (attempts >= maxAttempts && this.queue.length > 0) {
266
+ logger.warn(`EventQueue: Cleanup safety limit reached. Discarding ${this.queue.length} events.`);
267
+ this.queue = [];
268
+ this.payloadHashes.clear();
269
+ }
270
+ if (initialQueueLength > 0) {
271
+ logger.debug(`EventQueue: Cleanup completed, flushed ${initialQueueLength - this.queue.length} events`);
272
+ }
273
+ if (this.timer) {
274
+ clearTimeout(this.timer);
275
+ this.timer = null;
276
+ }
277
+ if (this.appStateSubscription) {
278
+ this.appStateSubscription.remove();
279
+ this.appStateSubscription = null;
280
+ }
281
+ }
282
+ }
283
+ //# sourceMappingURL=EventQueue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AppState","EVENTS_API_REQUEST_HEADER","clampNumber","getActionDescriptor","millisecondsToSecond","isNetworkError","hash","toDateHourMinute","logger","DEFAULT_RETRY","MAX_RETRY","MIN_RETRY","DEFAULT_FLUSH_AT","MAX_FLUSH_AT","MIN_FLUSH_AT","DEFAULT_QUEUE_SIZE","MAX_QUEUE_SIZE","MIN_QUEUE_SIZE","DEFAULT_FLUSH_INTERVAL","MAX_FLUSH_INTERVAL","MIN_FLUSH_INTERVAL","noop","EventQueue","queue","timer","payloadHashes","Set","flushMutex","Promise","resolve","appStateSubscription","constructor","writeKey","options","apiHost","retryCount","flushAt","maxQueueSize","flushIntervalMs","flushInterval","setupAppStateListener","addEventListener","handleAppStateChange","bind","nextAppState","debug","flush","catch","error","generateMessageId","event","formattedTimestamp","Date","original_timestamp","eventForHashing","eventString","JSON","stringify","isDuplicate","eventId","has","add","enqueue","callback","message_id","warn","push","message","log","type","properties","hasReachedFlushAt","length","hasReachedQueueSize","reduce","acc","item","clearTimeout","setTimeout","previousMutex","resolveMutex","items","splice","sentAt","toISOString","data","map","sent_at","done","err","forEach","itemCallback","sendWithRetry","delete","info","unshift","attempt","response","fetch","method","headers","body","ok","shouldRetry","status","delay","Math","pow","Error","clear","cleanup","maxAttempts","ceil","attempts","initialQueueLength","queueLengthBefore","remove"],"sourceRoot":"../../../../src","sources":["lib/event/EventQueue.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ export * from "./EventFactory";
2
+ export * from "./EventManager";
3
+ export * from "./EventQueue";
4
+ export * from "./types";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["lib/event/index.ts"],"mappings":"AAAA,cAAc,gBAAgB;AAC9B,cAAc,gBAAgB;AAC9B,cAAc,cAAc;AAC5B,cAAc,SAAS","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../../../src","sources":["lib/event/types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * Application Lifecycle Event Manager
3
+ *
4
+ * Tracks application lifecycle events following the Segment/RudderStack spec:
5
+ * - Application Installed (first launch)
6
+ * - Application Updated (version/build changed)
7
+ * - Application Opened (every cold start + foreground return)
8
+ * - Application Backgrounded (app goes to background)
9
+ *
10
+ * Detection is JS-side using AsyncStorage (no native modules required).
11
+ */
12
+
13
+ import { AppState, Linking } from "react-native";
14
+ import { logger } from "../logger";
15
+ import { storage, getStorageManager } from "../storage";
16
+ import { LOCAL_APP_VERSION_KEY, LOCAL_APP_BUILD_KEY } from "../../constants/storage";
17
+
18
+ /** Interface for the analytics instance to avoid circular deps */
19
+
20
+ /** App version info resolved from device or config */
21
+
22
+ /**
23
+ * Resolves current app version and build from device info modules or options.
24
+ * Uses the same fallback chain as EventFactory.getDeviceInfo().
25
+ */
26
+ async function resolveAppVersionInfo(appOptions) {
27
+ // Use explicit options first
28
+ if (appOptions?.version && appOptions?.build) {
29
+ return {
30
+ version: appOptions.version,
31
+ build: appOptions.build
32
+ };
33
+ }
34
+
35
+ // Try react-native-device-info
36
+ try {
37
+ const DeviceInfo = require("react-native-device-info").default;
38
+ return {
39
+ version: appOptions?.version || DeviceInfo.getVersion(),
40
+ build: appOptions?.build || DeviceInfo.getBuildNumber()
41
+ };
42
+ } catch {
43
+ // Not available
44
+ }
45
+
46
+ // Try expo-application
47
+ try {
48
+ const ExpoApplication = require("expo-application");
49
+ return {
50
+ version: appOptions?.version || ExpoApplication.nativeApplicationVersion || "",
51
+ build: appOptions?.build || ExpoApplication.nativeBuildVersion || ""
52
+ };
53
+ } catch {
54
+ // Not available
55
+ }
56
+ return {
57
+ version: appOptions?.version || "",
58
+ build: appOptions?.build || ""
59
+ };
60
+ }
61
+ export class AppLifecycleManager {
62
+ appStateSubscription = null;
63
+ lastAppState = AppState.currentState;
64
+ appVersionInfo = {
65
+ version: "",
66
+ build: ""
67
+ };
68
+ constructor(analytics) {
69
+ this.analytics = analytics;
70
+ }
71
+
72
+ /**
73
+ * Initialize lifecycle tracking.
74
+ * Detects install/update, fires Application Opened, and sets up AppState listener.
75
+ */
76
+ async start(appOptions) {
77
+ this.appVersionInfo = await resolveAppVersionInfo(appOptions);
78
+
79
+ // Detect install vs update
80
+ await this.detectInstallOrUpdate();
81
+
82
+ // Fire Application Opened (cold start)
83
+ let initialUrl;
84
+ try {
85
+ const url = await Linking.getInitialURL();
86
+ if (url) {
87
+ initialUrl = url;
88
+ }
89
+ } catch {
90
+ // Linking not available
91
+ }
92
+ await this.analytics.track("Application Opened", {
93
+ version: this.appVersionInfo.version,
94
+ build: this.appVersionInfo.build,
95
+ from_background: false,
96
+ ...(initialUrl && {
97
+ url: initialUrl
98
+ })
99
+ });
100
+
101
+ // Subscribe to AppState changes
102
+ this.appStateSubscription = AppState.addEventListener("change", this.handleAppStateChange.bind(this));
103
+ logger.info("AppLifecycleManager: Started");
104
+ }
105
+
106
+ /**
107
+ * Compare stored version/build with current to detect install or update.
108
+ * Requires persistent storage (AsyncStorage) — skips if only MemoryStorage is available,
109
+ * since MemoryStorage is empty on every cold start and would false-positive as "installed".
110
+ */
111
+ async detectInstallOrUpdate() {
112
+ const manager = getStorageManager();
113
+ const hasPersistentStorage = manager?.hasPersistentStorage() ?? false;
114
+ if (!hasPersistentStorage) {
115
+ logger.warn("AppLifecycleManager: AsyncStorage not available, skipping install/update detection. " + "Provide asyncStorage to FormoAnalyticsProvider for accurate lifecycle tracking.");
116
+ return;
117
+ }
118
+ const previousVersion = storage().get(LOCAL_APP_VERSION_KEY);
119
+ const previousBuild = storage().get(LOCAL_APP_BUILD_KEY);
120
+ const {
121
+ version,
122
+ build
123
+ } = this.appVersionInfo;
124
+ if (previousVersion === null && previousBuild === null) {
125
+ // No stored version — first install
126
+ logger.info("AppLifecycleManager: Application Installed");
127
+ await this.analytics.track("Application Installed", {
128
+ version,
129
+ build
130
+ });
131
+ } else if (previousVersion !== version || previousBuild !== build) {
132
+ // Version or build changed — update
133
+ logger.info("AppLifecycleManager: Application Updated");
134
+ await this.analytics.track("Application Updated", {
135
+ version,
136
+ build,
137
+ previous_version: previousVersion || "",
138
+ previous_build: previousBuild || ""
139
+ });
140
+ }
141
+
142
+ // Persist current version/build for next comparison
143
+ // Use setAsync to ensure data is written to AsyncStorage before continuing,
144
+ // preventing duplicate install events if the app is terminated before persistence completes
145
+ await storage().setAsync(LOCAL_APP_VERSION_KEY, version);
146
+ await storage().setAsync(LOCAL_APP_BUILD_KEY, build);
147
+ }
148
+
149
+ /**
150
+ * Handle AppState transitions for foreground/background events.
151
+ */
152
+ handleAppStateChange(nextAppState) {
153
+ // Ignore "inactive" (iOS transitional state) and "unknown"
154
+ if (nextAppState === "inactive" || nextAppState === "unknown") {
155
+ return;
156
+ }
157
+ if (nextAppState === "active" && this.lastAppState === "background") {
158
+ // Returning from background
159
+ this.analytics.track("Application Opened", {
160
+ version: this.appVersionInfo.version,
161
+ build: this.appVersionInfo.build,
162
+ from_background: true
163
+ }).catch(error => {
164
+ logger.error("AppLifecycleManager: Error tracking Application Opened", error);
165
+ });
166
+ }
167
+ if (nextAppState === "background" && this.lastAppState === "active") {
168
+ // Going to background
169
+ this.analytics.track("Application Backgrounded", {
170
+ version: this.appVersionInfo.version,
171
+ build: this.appVersionInfo.build
172
+ }).catch(error => {
173
+ logger.error("AppLifecycleManager: Error tracking Application Backgrounded", error);
174
+ });
175
+ }
176
+ this.lastAppState = nextAppState;
177
+ }
178
+
179
+ /**
180
+ * Clean up AppState listener.
181
+ */
182
+ cleanup() {
183
+ if (this.appStateSubscription) {
184
+ this.appStateSubscription.remove();
185
+ this.appStateSubscription = null;
186
+ }
187
+ logger.info("AppLifecycleManager: Cleaned up");
188
+ }
189
+ }
190
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["AppState","Linking","logger","storage","getStorageManager","LOCAL_APP_VERSION_KEY","LOCAL_APP_BUILD_KEY","resolveAppVersionInfo","appOptions","version","build","DeviceInfo","require","default","getVersion","getBuildNumber","ExpoApplication","nativeApplicationVersion","nativeBuildVersion","AppLifecycleManager","appStateSubscription","lastAppState","currentState","appVersionInfo","constructor","analytics","start","detectInstallOrUpdate","initialUrl","url","getInitialURL","track","from_background","addEventListener","handleAppStateChange","bind","info","manager","hasPersistentStorage","warn","previousVersion","get","previousBuild","previous_version","previous_build","setAsync","nextAppState","catch","error","cleanup","remove"],"sourceRoot":"../../../../src","sources":["lib/lifecycle/index.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,42 @@
1
+ class LoggerClass {
2
+ config = {
3
+ enabled: false,
4
+ enabledLevels: []
5
+ };
6
+ init(config) {
7
+ this.config = config;
8
+ }
9
+ shouldLog(level) {
10
+ if (!this.config.enabled) return false;
11
+ if (this.config.enabledLevels?.length === 0) return true;
12
+ return this.config.enabledLevels?.includes(level) ?? false;
13
+ }
14
+ debug(...args) {
15
+ if (this.shouldLog("debug")) {
16
+ console.debug("[Formo RN]", ...args);
17
+ }
18
+ }
19
+ info(...args) {
20
+ if (this.shouldLog("info")) {
21
+ console.info("[Formo RN]", ...args);
22
+ }
23
+ }
24
+ warn(...args) {
25
+ if (this.shouldLog("warn")) {
26
+ console.warn("[Formo RN]", ...args);
27
+ }
28
+ }
29
+ error(...args) {
30
+ if (this.shouldLog("error")) {
31
+ console.error("[Formo RN]", ...args);
32
+ }
33
+ }
34
+ log(...args) {
35
+ if (this.shouldLog("log")) {
36
+ console.log("[Formo RN]", ...args);
37
+ }
38
+ }
39
+ }
40
+ export const Logger = new LoggerClass();
41
+ export const logger = Logger;
42
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["LoggerClass","config","enabled","enabledLevels","init","shouldLog","level","length","includes","debug","args","console","info","warn","error","log","Logger","logger"],"sourceRoot":"../../../../src","sources":["lib/logger/index.ts"],"mappings":"AAOA,MAAMA,WAAW,CAAC;EACRC,MAAM,GAAiB;IAC7BC,OAAO,EAAE,KAAK;IACdC,aAAa,EAAE;EACjB,CAAC;EAEDC,IAAIA,CAACH,MAAoB,EAAE;IACzB,IAAI,CAACA,MAAM,GAAGA,MAAM;EACtB;EAEQI,SAASA,CAACC,KAAe,EAAW;IAC1C,IAAI,CAAC,IAAI,CAACL,MAAM,CAACC,OAAO,EAAE,OAAO,KAAK;IACtC,IAAI,IAAI,CAACD,MAAM,CAACE,aAAa,EAAEI,MAAM,KAAK,CAAC,EAAE,OAAO,IAAI;IACxD,OAAO,IAAI,CAACN,MAAM,CAACE,aAAa,EAAEK,QAAQ,CAACF,KAAK,CAAC,IAAI,KAAK;EAC5D;EAEAG,KAAKA,CAAC,GAAGC,IAAe,EAAE;IACxB,IAAI,IAAI,CAACL,SAAS,CAAC,OAAO,CAAC,EAAE;MAC3BM,OAAO,CAACF,KAAK,CAAC,YAAY,EAAE,GAAGC,IAAI,CAAC;IACtC;EACF;EAEAE,IAAIA,CAAC,GAAGF,IAAe,EAAE;IACvB,IAAI,IAAI,CAACL,SAAS,CAAC,MAAM,CAAC,EAAE;MAC1BM,OAAO,CAACC,IAAI,CAAC,YAAY,EAAE,GAAGF,IAAI,CAAC;IACrC;EACF;EAEAG,IAAIA,CAAC,GAAGH,IAAe,EAAE;IACvB,IAAI,IAAI,CAACL,SAAS,CAAC,MAAM,CAAC,EAAE;MAC1BM,OAAO,CAACE,IAAI,CAAC,YAAY,EAAE,GAAGH,IAAI,CAAC;IACrC;EACF;EAEAI,KAAKA,CAAC,GAAGJ,IAAe,EAAE;IACxB,IAAI,IAAI,CAACL,SAAS,CAAC,OAAO,CAAC,EAAE;MAC3BM,OAAO,CAACG,KAAK,CAAC,YAAY,EAAE,GAAGJ,IAAI,CAAC;IACtC;EACF;EAEAK,GAAGA,CAAC,GAAGL,IAAe,EAAE;IACtB,IAAI,IAAI,CAACL,SAAS,CAAC,KAAK,CAAC,EAAE;MACzBM,OAAO,CAACI,GAAG,CAAC,YAAY,EAAE,GAAGL,IAAI,CAAC;IACpC;EACF;AACF;AAEA,OAAO,MAAMM,MAAM,GAAG,IAAIhB,WAAW,CAAC,CAAC;AACvC,OAAO,MAAMiB,MAAM,GAAGD,MAAM","ignoreList":[]}
@@ -0,0 +1,92 @@
1
+ import { SESSION_WALLET_DETECTED_KEY, SESSION_WALLET_IDENTIFIED_KEY } from "../../constants";
2
+ import { storage } from "../storage";
3
+ import { logger } from "../logger";
4
+ export { SESSION_WALLET_DETECTED_KEY, SESSION_WALLET_IDENTIFIED_KEY };
5
+
6
+ /**
7
+ * Session manager for tracking wallet detection and identification
8
+ * Persists to session storage to avoid duplicate detection/identification events
9
+ * within the same session
10
+ */
11
+ export class FormoAnalyticsSession {
12
+ detectedWallets = new Set();
13
+ identifiedWallets = new Set();
14
+ constructor() {
15
+ this.loadFromStorage();
16
+ }
17
+
18
+ /**
19
+ * Load session state from storage
20
+ */
21
+ loadFromStorage() {
22
+ try {
23
+ const detected = storage().get(SESSION_WALLET_DETECTED_KEY);
24
+ if (detected) {
25
+ const parsed = JSON.parse(detected);
26
+ this.detectedWallets = new Set(parsed);
27
+ }
28
+ const identified = storage().get(SESSION_WALLET_IDENTIFIED_KEY);
29
+ if (identified) {
30
+ const parsed = JSON.parse(identified);
31
+ this.identifiedWallets = new Set(parsed);
32
+ }
33
+ } catch (error) {
34
+ logger.debug("Session: Failed to load from storage", error);
35
+ }
36
+ }
37
+
38
+ /**
39
+ * Save session state to storage
40
+ */
41
+ saveToStorage() {
42
+ try {
43
+ storage().set(SESSION_WALLET_DETECTED_KEY, JSON.stringify(Array.from(this.detectedWallets)));
44
+ storage().set(SESSION_WALLET_IDENTIFIED_KEY, JSON.stringify(Array.from(this.identifiedWallets)));
45
+ } catch (error) {
46
+ logger.debug("Session: Failed to save to storage", error);
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Check if a wallet has been detected in this session
52
+ */
53
+ isWalletDetected(rdns) {
54
+ return this.detectedWallets.has(rdns);
55
+ }
56
+
57
+ /**
58
+ * Mark a wallet as detected
59
+ */
60
+ markWalletDetected(rdns) {
61
+ this.detectedWallets.add(rdns);
62
+ this.saveToStorage();
63
+ }
64
+
65
+ /**
66
+ * Check if a wallet + address combination has been identified
67
+ */
68
+ isWalletIdentified(address, rdns) {
69
+ const key = `${address.toLowerCase()}:${rdns}`;
70
+ return this.identifiedWallets.has(key);
71
+ }
72
+
73
+ /**
74
+ * Mark a wallet + address combination as identified
75
+ */
76
+ markWalletIdentified(address, rdns) {
77
+ const key = `${address.toLowerCase()}:${rdns}`;
78
+ this.identifiedWallets.add(key);
79
+ this.saveToStorage();
80
+ }
81
+
82
+ /**
83
+ * Clear all session data
84
+ */
85
+ clear() {
86
+ this.detectedWallets.clear();
87
+ this.identifiedWallets.clear();
88
+ storage().remove(SESSION_WALLET_DETECTED_KEY);
89
+ storage().remove(SESSION_WALLET_IDENTIFIED_KEY);
90
+ }
91
+ }
92
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["SESSION_WALLET_DETECTED_KEY","SESSION_WALLET_IDENTIFIED_KEY","storage","logger","FormoAnalyticsSession","detectedWallets","Set","identifiedWallets","constructor","loadFromStorage","detected","get","parsed","JSON","parse","identified","error","debug","saveToStorage","set","stringify","Array","from","isWalletDetected","rdns","has","markWalletDetected","add","isWalletIdentified","address","key","toLowerCase","markWalletIdentified","clear","remove"],"sourceRoot":"../../../../src","sources":["lib/session/index.ts"],"mappings":"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","ignoreList":[]}