@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,519 @@
1
+ /**
2
+ * FormoAnalytics for React Native
3
+ *
4
+ * Main SDK class for tracking wallet events and user analytics in mobile dApps
5
+ */
6
+
7
+ import { EVENTS_API_HOST, EventType, LOCAL_ANONYMOUS_ID_KEY, SESSION_USER_ID_KEY, CONSENT_OPT_OUT_KEY } from "./constants";
8
+ import { initStorageManager, storage } from "./lib/storage";
9
+ import { EventManager, EventQueue } from "./lib/event";
10
+ import { logger, Logger } from "./lib/logger";
11
+ import { setConsentFlag, getConsentFlag, removeConsentFlag } from "./lib/consent";
12
+ import { FormoAnalyticsSession } from "./lib/session";
13
+ import { WagmiEventHandler } from "./lib/wagmi";
14
+ import { AppLifecycleManager } from "./lib/lifecycle";
15
+ import { toChecksumAddress, getValidAddress } from "./utils";
16
+ import { parseTrafficSource, storeTrafficSource } from "./utils/trafficSource";
17
+ export class FormoAnalytics {
18
+ currentUserId = "";
19
+ constructor(writeKey, options = {}) {
20
+ this.writeKey = writeKey;
21
+ this.options = options;
22
+ this.config = {
23
+ writeKey
24
+ };
25
+ this.session = new FormoAnalyticsSession();
26
+ this.currentUserId = storage().get(SESSION_USER_ID_KEY) || undefined;
27
+
28
+ // Bind methods
29
+ this.identify = this.identify.bind(this);
30
+ this.connect = this.connect.bind(this);
31
+ this.disconnect = this.disconnect.bind(this);
32
+ this.chain = this.chain.bind(this);
33
+ this.signature = this.signature.bind(this);
34
+ this.transaction = this.transaction.bind(this);
35
+ this.detect = this.detect.bind(this);
36
+ this.track = this.track.bind(this);
37
+ this.screen = this.screen.bind(this);
38
+ this.isAutocaptureEnabled = this.isAutocaptureEnabled.bind(this);
39
+
40
+ // Initialize logger
41
+ Logger.init({
42
+ enabled: options.logger?.enabled || false,
43
+ enabledLevels: options.logger?.levels || []
44
+ });
45
+
46
+ // Initialize event queue
47
+ this.eventQueue = new EventQueue(this.config.writeKey, {
48
+ apiHost: options.apiHost || EVENTS_API_HOST,
49
+ flushAt: options.flushAt,
50
+ retryCount: options.retryCount,
51
+ maxQueueSize: options.maxQueueSize,
52
+ flushInterval: options.flushInterval
53
+ });
54
+
55
+ // Initialize event manager
56
+ this.eventManager = new EventManager(this.eventQueue, options);
57
+
58
+ // Check consent status
59
+ if (this.hasOptedOutTracking()) {
60
+ logger.info("User has previously opted out of tracking");
61
+ }
62
+
63
+ // Initialize Wagmi handler if provided and config is valid
64
+ if (options.wagmi?.config) {
65
+ logger.info("FormoAnalytics: Initializing in Wagmi mode");
66
+ this.wagmiHandler = new WagmiEventHandler(this, options.wagmi.config, options.wagmi.queryClient);
67
+ } else if (options.wagmi) {
68
+ logger.warn("FormoAnalytics: wagmi option provided but config is missing");
69
+ }
70
+ }
71
+
72
+ /**
73
+ * Initialize the SDK
74
+ * @param writeKey - Your Formo write key
75
+ * @param options - Configuration options
76
+ * @param asyncStorage - AsyncStorage instance from @react-native-async-storage/async-storage
77
+ */
78
+ static async init(writeKey, options, asyncStorage) {
79
+ const storageManager = initStorageManager(writeKey);
80
+
81
+ // Initialize storage with AsyncStorage if provided
82
+ if (asyncStorage) {
83
+ await storageManager.initialize(asyncStorage);
84
+ }
85
+ const analytics = new FormoAnalytics(writeKey, options);
86
+
87
+ // Initialize lifecycle tracking if enabled
88
+ // Wrapped in try-catch so a transient storage failure doesn't prevent SDK init
89
+ if (analytics.isAutocaptureEnabled("lifecycle")) {
90
+ try {
91
+ analytics.lifecycleManager = new AppLifecycleManager(analytics);
92
+ await analytics.lifecycleManager.start(options?.app);
93
+ } catch (error) {
94
+ logger.error("FormoAnalytics: Failed to initialize lifecycle tracking", error);
95
+ }
96
+ }
97
+
98
+ // Call ready callback
99
+ if (options?.ready) {
100
+ options.ready(analytics);
101
+ }
102
+ return analytics;
103
+ }
104
+
105
+ /**
106
+ * Track a screen view (mobile equivalent of page view)
107
+ */
108
+ async screen(name, category, properties, context, callback) {
109
+ // Note: shouldTrack() is called in trackEvent() - no need to check here
110
+ await this.trackEvent(EventType.SCREEN, {
111
+ name,
112
+ ...(category && {
113
+ category
114
+ })
115
+ }, properties, context, callback);
116
+ }
117
+
118
+ /**
119
+ * Set traffic source from deep link URL
120
+ * Parses UTM parameters and referrer information from URL
121
+ * This is automatically persisted for the session
122
+ *
123
+ * @param url - Deep link URL (e.g., "myapp://product?utm_source=facebook&ref=friend123")
124
+ *
125
+ * @example
126
+ * ```tsx
127
+ * import { Linking } from 'react-native';
128
+ *
129
+ * // Listen for deep links
130
+ * Linking.addEventListener('url', (event) => {
131
+ * formo.setTrafficSourceFromUrl(event.url);
132
+ * });
133
+ *
134
+ * // Or get initial URL
135
+ * Linking.getInitialURL().then((url) => {
136
+ * if (url) formo.setTrafficSourceFromUrl(url);
137
+ * });
138
+ * ```
139
+ */
140
+ setTrafficSourceFromUrl(url) {
141
+ const trafficSource = parseTrafficSource(url, this.options.referral?.queryParams, this.options.referral?.pathPattern);
142
+ storeTrafficSource(trafficSource);
143
+ logger.debug("Traffic source set from URL:", trafficSource);
144
+ }
145
+
146
+ /**
147
+ * Reset the current user session
148
+ */
149
+ reset() {
150
+ this.currentUserId = undefined;
151
+ storage().remove(LOCAL_ANONYMOUS_ID_KEY);
152
+ storage().remove(SESSION_USER_ID_KEY);
153
+ this.session.clear();
154
+ }
155
+
156
+ /**
157
+ * Clean up resources
158
+ */
159
+ async cleanup() {
160
+ logger.info("FormoAnalytics: Cleaning up resources");
161
+ if (this.lifecycleManager) {
162
+ this.lifecycleManager.cleanup();
163
+ this.lifecycleManager = undefined;
164
+ }
165
+ if (this.wagmiHandler) {
166
+ this.wagmiHandler.cleanup();
167
+ this.wagmiHandler = undefined;
168
+ }
169
+ if (this.eventQueue) {
170
+ await this.eventQueue.cleanup();
171
+ }
172
+ logger.info("FormoAnalytics: Cleanup complete");
173
+ }
174
+
175
+ /**
176
+ * Track wallet connect event
177
+ */
178
+ async connect({
179
+ chainId,
180
+ address
181
+ }, properties, context, callback) {
182
+ if (chainId === null || chainId === undefined || Number(chainId) === 0) {
183
+ logger.warn("Connect: Chain ID cannot be null, undefined, or 0");
184
+ return;
185
+ }
186
+ if (!address) {
187
+ logger.warn("Connect: Address cannot be empty");
188
+ return;
189
+ }
190
+ const checksummedAddress = this.validateAndChecksumAddress(address);
191
+ if (!checksummedAddress) {
192
+ logger.warn(`Connect: Invalid address provided ("${address}")`);
193
+ return;
194
+ }
195
+
196
+ // Track event before updating state so connect events TO excluded chains are tracked
197
+ await this.trackEvent(EventType.CONNECT, {
198
+ chainId,
199
+ address: checksummedAddress
200
+ }, properties, context, callback);
201
+ this.currentChainId = chainId;
202
+ this.currentAddress = checksummedAddress;
203
+ }
204
+
205
+ /**
206
+ * Track wallet disconnect event
207
+ */
208
+ async disconnect(params, properties, context, callback) {
209
+ const chainId = params?.chainId || this.currentChainId;
210
+ const address = params?.address || this.currentAddress;
211
+ logger.info("Disconnect: Emitting disconnect event with:", {
212
+ chainId,
213
+ address
214
+ });
215
+ await this.trackEvent(EventType.DISCONNECT, {
216
+ ...(chainId && {
217
+ chainId
218
+ }),
219
+ ...(address && {
220
+ address
221
+ })
222
+ }, properties, context, callback);
223
+ this.currentAddress = undefined;
224
+ this.currentChainId = undefined;
225
+ }
226
+
227
+ /**
228
+ * Track chain change event
229
+ */
230
+ async chain({
231
+ chainId,
232
+ address
233
+ }, properties, context, callback) {
234
+ if (!chainId || Number(chainId) === 0) {
235
+ logger.warn("FormoAnalytics::chain: chainId cannot be empty or 0");
236
+ return;
237
+ }
238
+ if (isNaN(Number(chainId))) {
239
+ logger.warn("FormoAnalytics::chain: chainId must be a valid number");
240
+ return;
241
+ }
242
+ if (!address && !this.currentAddress) {
243
+ logger.warn("FormoAnalytics::chain: address was empty and no previous address recorded");
244
+ return;
245
+ }
246
+
247
+ // Track event before updating currentChainId so shouldTrack uses the previous chain
248
+ // This ensures chain change events TO excluded chains are still tracked
249
+ await this.trackEvent(EventType.CHAIN, {
250
+ chainId,
251
+ address: address || this.currentAddress
252
+ }, properties, context, callback);
253
+ this.currentChainId = chainId;
254
+ }
255
+
256
+ /**
257
+ * Track signature event
258
+ */
259
+ async signature({
260
+ status,
261
+ chainId,
262
+ address,
263
+ message,
264
+ signatureHash
265
+ }, properties, context, callback) {
266
+ if (!address) {
267
+ logger.warn("Signature: Address cannot be empty");
268
+ return;
269
+ }
270
+ await this.trackEvent(EventType.SIGNATURE, {
271
+ status,
272
+ ...(chainId !== undefined && chainId !== null && {
273
+ chainId
274
+ }),
275
+ address,
276
+ message,
277
+ ...(signatureHash && {
278
+ signatureHash
279
+ })
280
+ }, properties, context, callback);
281
+ }
282
+
283
+ /**
284
+ * Track transaction event
285
+ */
286
+ async transaction({
287
+ status,
288
+ chainId,
289
+ address,
290
+ data,
291
+ to,
292
+ value,
293
+ transactionHash,
294
+ function_name,
295
+ function_args
296
+ }, properties, context, callback) {
297
+ if (chainId === null || chainId === undefined || Number(chainId) === 0) {
298
+ logger.warn("Transaction: Chain ID cannot be null, undefined, or 0");
299
+ return;
300
+ }
301
+ if (!address) {
302
+ logger.warn("Transaction: Address cannot be empty");
303
+ return;
304
+ }
305
+ await this.trackEvent(EventType.TRANSACTION, {
306
+ status,
307
+ chainId,
308
+ address,
309
+ data,
310
+ to,
311
+ value,
312
+ ...(transactionHash && {
313
+ transactionHash
314
+ }),
315
+ ...(function_name && {
316
+ function_name
317
+ }),
318
+ ...(function_args && {
319
+ function_args
320
+ })
321
+ }, properties, context, callback);
322
+ }
323
+
324
+ /**
325
+ * Track identify event
326
+ */
327
+ async identify(params, properties, context, callback) {
328
+ try {
329
+ const {
330
+ userId,
331
+ address,
332
+ providerName,
333
+ rdns
334
+ } = params;
335
+ logger.info("Identify", address, userId, providerName, rdns);
336
+ let validAddress = undefined;
337
+ if (address) {
338
+ validAddress = this.validateAndChecksumAddress(address);
339
+ if (!validAddress) {
340
+ logger.warn(`Identify: Invalid address provided ("${address}")`);
341
+ return;
342
+ }
343
+ this.currentAddress = validAddress;
344
+ } else {
345
+ this.currentAddress = undefined;
346
+ }
347
+ if (userId) {
348
+ this.currentUserId = userId;
349
+ storage().set(SESSION_USER_ID_KEY, userId);
350
+ }
351
+
352
+ // Check for duplicate identify
353
+ const isAlreadyIdentified = validAddress ? this.session.isWalletIdentified(validAddress, rdns || "") : false;
354
+ if (isAlreadyIdentified) {
355
+ logger.info(`Identify: Wallet ${providerName || "Unknown"} with address ${validAddress} already identified`);
356
+ return;
357
+ }
358
+
359
+ // Mark as identified
360
+ if (validAddress) {
361
+ this.session.markWalletIdentified(validAddress, rdns || "");
362
+ }
363
+ await this.trackEvent(EventType.IDENTIFY, {
364
+ address: validAddress,
365
+ providerName,
366
+ userId,
367
+ rdns
368
+ }, properties, context, callback);
369
+ } catch (e) {
370
+ logger.log("identify error", e);
371
+ }
372
+ }
373
+
374
+ /**
375
+ * Track detect wallet event
376
+ */
377
+ async detect({
378
+ providerName,
379
+ rdns
380
+ }, properties, context, callback) {
381
+ if (this.session.isWalletDetected(rdns)) {
382
+ logger.warn(`Detect: Wallet ${providerName} already detected in this session`);
383
+ return;
384
+ }
385
+ this.session.markWalletDetected(rdns);
386
+ await this.trackEvent(EventType.DETECT, {
387
+ providerName,
388
+ rdns
389
+ }, properties, context, callback);
390
+ }
391
+
392
+ /**
393
+ * Track custom event
394
+ */
395
+ async track(event, properties, context, callback) {
396
+ await this.trackEvent(EventType.TRACK, {
397
+ event
398
+ }, properties, context, callback);
399
+ }
400
+
401
+ /**
402
+ * Opt out of tracking
403
+ */
404
+ optOutTracking() {
405
+ logger.info("Opting out of tracking");
406
+ setConsentFlag(this.writeKey, CONSENT_OPT_OUT_KEY, "true");
407
+ this.eventQueue.clear();
408
+ this.reset();
409
+ logger.info("Successfully opted out of tracking");
410
+ }
411
+
412
+ /**
413
+ * Opt back into tracking
414
+ */
415
+ optInTracking() {
416
+ logger.info("Opting back into tracking");
417
+ removeConsentFlag(this.writeKey, CONSENT_OPT_OUT_KEY);
418
+ logger.info("Successfully opted back into tracking");
419
+ }
420
+
421
+ /**
422
+ * Check if user has opted out
423
+ */
424
+ hasOptedOutTracking() {
425
+ return getConsentFlag(this.writeKey, CONSENT_OPT_OUT_KEY) === "true";
426
+ }
427
+
428
+ /**
429
+ * Check if autocapture is enabled for event type
430
+ */
431
+ isAutocaptureEnabled(eventType) {
432
+ if (this.options.autocapture === undefined) {
433
+ return true;
434
+ }
435
+ if (typeof this.options.autocapture === "boolean") {
436
+ return this.options.autocapture;
437
+ }
438
+ if (this.options.autocapture !== null && typeof this.options.autocapture === "object") {
439
+ const eventConfig = this.options.autocapture[eventType];
440
+ return eventConfig !== false;
441
+ }
442
+ return true;
443
+ }
444
+
445
+ /**
446
+ * Internal method to track events
447
+ * This is the single enforcement point for shouldTrack() - all public tracking
448
+ * methods (track, screen, connect, etc.) route through here
449
+ */
450
+ async trackEvent(type, payload, properties, context, callback) {
451
+ try {
452
+ if (!this.shouldTrack()) {
453
+ logger.info(`Skipping ${type} event due to tracking configuration`);
454
+ return;
455
+ }
456
+ await this.eventManager.addEvent({
457
+ type,
458
+ ...payload,
459
+ properties,
460
+ context,
461
+ callback
462
+ }, this.currentAddress, this.currentUserId);
463
+ } catch (error) {
464
+ logger.error("Error tracking event:", error);
465
+ if (this.options.errorHandler) {
466
+ try {
467
+ this.options.errorHandler(error instanceof Error ? error : new Error(String(error)));
468
+ } catch (handlerError) {
469
+ logger.error("Error in errorHandler callback:", handlerError);
470
+ }
471
+ }
472
+ }
473
+ }
474
+
475
+ /**
476
+ * Check if tracking should be enabled
477
+ */
478
+ shouldTrack() {
479
+ // Check consent
480
+ if (this.hasOptedOutTracking()) {
481
+ return false;
482
+ }
483
+
484
+ // Check tracking option
485
+ if (typeof this.options.tracking === "boolean") {
486
+ return this.options.tracking;
487
+ }
488
+
489
+ // Handle object configuration
490
+ if (this.options.tracking !== null && typeof this.options.tracking === "object" && !Array.isArray(this.options.tracking)) {
491
+ const {
492
+ excludeChains = []
493
+ } = this.options.tracking;
494
+ if (excludeChains.length > 0 && this.currentChainId && excludeChains.includes(this.currentChainId)) {
495
+ return false;
496
+ }
497
+ return true;
498
+ }
499
+
500
+ // Default: track
501
+ return true;
502
+ }
503
+
504
+ /**
505
+ * Validate and checksum address
506
+ */
507
+ validateAndChecksumAddress(address) {
508
+ const validAddress = getValidAddress(address);
509
+ return validAddress ? toChecksumAddress(validAddress) : undefined;
510
+ }
511
+
512
+ /**
513
+ * Flush pending events
514
+ */
515
+ async flush() {
516
+ await this.eventQueue.flush();
517
+ }
518
+ }
519
+ //# sourceMappingURL=FormoAnalytics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["EVENTS_API_HOST","EventType","LOCAL_ANONYMOUS_ID_KEY","SESSION_USER_ID_KEY","CONSENT_OPT_OUT_KEY","initStorageManager","storage","EventManager","EventQueue","logger","Logger","setConsentFlag","getConsentFlag","removeConsentFlag","FormoAnalyticsSession","WagmiEventHandler","AppLifecycleManager","toChecksumAddress","getValidAddress","parseTrafficSource","storeTrafficSource","FormoAnalytics","currentUserId","constructor","writeKey","options","config","session","get","undefined","identify","bind","connect","disconnect","chain","signature","transaction","detect","track","screen","isAutocaptureEnabled","init","enabled","enabledLevels","levels","eventQueue","apiHost","flushAt","retryCount","maxQueueSize","flushInterval","eventManager","hasOptedOutTracking","info","wagmi","wagmiHandler","queryClient","warn","asyncStorage","storageManager","initialize","analytics","lifecycleManager","start","app","error","ready","name","category","properties","context","callback","trackEvent","SCREEN","setTrafficSourceFromUrl","url","trafficSource","referral","queryParams","pathPattern","debug","reset","remove","clear","cleanup","chainId","address","Number","checksummedAddress","validateAndChecksumAddress","CONNECT","currentChainId","currentAddress","params","DISCONNECT","isNaN","CHAIN","status","message","signatureHash","SIGNATURE","data","to","value","transactionHash","function_name","function_args","TRANSACTION","userId","providerName","rdns","validAddress","set","isAlreadyIdentified","isWalletIdentified","markWalletIdentified","IDENTIFY","e","log","isWalletDetected","markWalletDetected","DETECT","event","TRACK","optOutTracking","optInTracking","eventType","autocapture","eventConfig","type","payload","shouldTrack","addEvent","errorHandler","Error","String","handlerError","tracking","Array","isArray","excludeChains","length","includes","flush"],"sourceRoot":"../../src","sources":["FormoAnalytics.ts"],"mappings":"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","ignoreList":[]}