@formo/analytics 1.17.8 → 1.18.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 (62) hide show
  1. package/README.md +0 -1
  2. package/dist/cjs/src/FormoAnalytics.d.ts +20 -13
  3. package/dist/cjs/src/FormoAnalytics.d.ts.map +1 -1
  4. package/dist/cjs/src/FormoAnalytics.js +368 -199
  5. package/dist/cjs/src/FormoAnalytics.js.map +1 -1
  6. package/dist/cjs/src/FormoAnalyticsProvider.js +4 -4
  7. package/dist/cjs/src/FormoAnalyticsProvider.js.map +1 -1
  8. package/dist/cjs/src/lib/event/EventFactory.d.ts +3 -2
  9. package/dist/cjs/src/lib/event/EventFactory.d.ts.map +1 -1
  10. package/dist/cjs/src/lib/event/EventFactory.js +17 -5
  11. package/dist/cjs/src/lib/event/EventFactory.js.map +1 -1
  12. package/dist/cjs/src/lib/logger/Logger.js +1 -1
  13. package/dist/cjs/src/lib/logger/Logger.js.map +1 -1
  14. package/dist/cjs/src/types/base.d.ts +15 -8
  15. package/dist/cjs/src/types/base.d.ts.map +1 -1
  16. package/dist/cjs/src/types/events.d.ts +6 -3
  17. package/dist/cjs/src/types/events.d.ts.map +1 -1
  18. package/dist/cjs/src/types/events.js +2 -0
  19. package/dist/cjs/src/types/events.js.map +1 -1
  20. package/dist/cjs/src/types/provider.d.ts +3 -0
  21. package/dist/cjs/src/types/provider.d.ts.map +1 -1
  22. package/dist/cjs/src/utils/chain.d.ts +7 -0
  23. package/dist/cjs/src/utils/chain.d.ts.map +1 -0
  24. package/dist/cjs/src/utils/chain.js +17 -0
  25. package/dist/cjs/src/utils/chain.js.map +1 -0
  26. package/dist/cjs/src/validators/address.d.ts +2 -2
  27. package/dist/cjs/src/validators/address.d.ts.map +1 -1
  28. package/dist/cjs/src/validators/address.js +6 -6
  29. package/dist/cjs/src/validators/address.js.map +1 -1
  30. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  31. package/dist/esm/src/FormoAnalytics.d.ts +20 -13
  32. package/dist/esm/src/FormoAnalytics.d.ts.map +1 -1
  33. package/dist/esm/src/FormoAnalytics.js +368 -199
  34. package/dist/esm/src/FormoAnalytics.js.map +1 -1
  35. package/dist/esm/src/FormoAnalyticsProvider.js +4 -4
  36. package/dist/esm/src/FormoAnalyticsProvider.js.map +1 -1
  37. package/dist/esm/src/lib/event/EventFactory.d.ts +3 -2
  38. package/dist/esm/src/lib/event/EventFactory.d.ts.map +1 -1
  39. package/dist/esm/src/lib/event/EventFactory.js +17 -5
  40. package/dist/esm/src/lib/event/EventFactory.js.map +1 -1
  41. package/dist/esm/src/lib/logger/Logger.js +1 -1
  42. package/dist/esm/src/lib/logger/Logger.js.map +1 -1
  43. package/dist/esm/src/types/base.d.ts +15 -8
  44. package/dist/esm/src/types/base.d.ts.map +1 -1
  45. package/dist/esm/src/types/events.d.ts +6 -3
  46. package/dist/esm/src/types/events.d.ts.map +1 -1
  47. package/dist/esm/src/types/events.js +2 -0
  48. package/dist/esm/src/types/events.js.map +1 -1
  49. package/dist/esm/src/types/provider.d.ts +3 -0
  50. package/dist/esm/src/types/provider.d.ts.map +1 -1
  51. package/dist/esm/src/utils/chain.d.ts +7 -0
  52. package/dist/esm/src/utils/chain.d.ts.map +1 -0
  53. package/dist/esm/src/utils/chain.js +14 -0
  54. package/dist/esm/src/utils/chain.js.map +1 -0
  55. package/dist/esm/src/validators/address.d.ts +2 -2
  56. package/dist/esm/src/validators/address.d.ts.map +1 -1
  57. package/dist/esm/src/validators/address.js +4 -4
  58. package/dist/esm/src/validators/address.js.map +1 -1
  59. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  60. package/dist/index.umd.min.js +1 -1
  61. package/dist/index.umd.min.js.map +1 -1
  62. package/package.json +1 -1
@@ -53,6 +53,7 @@ var constants_1 = require("./constants");
53
53
  var lib_1 = require("./lib");
54
54
  var types_1 = require("./types");
55
55
  var validators_1 = require("./validators");
56
+ var chain_1 = require("./utils/chain");
56
57
  var FormoAnalytics = /** @class */ (function () {
57
58
  function FormoAnalytics(writeKey, options) {
58
59
  if (options === void 0) { options = {}; }
@@ -65,8 +66,8 @@ var FormoAnalytics = /** @class */ (function () {
65
66
  this.currentUserId = "";
66
67
  this.config = {
67
68
  writeKey: writeKey,
68
- trackLocalhost: options.trackLocalhost || false,
69
69
  };
70
+ this.options = options;
70
71
  this.session = new FormoAnalyticsSession();
71
72
  this.currentUserId =
72
73
  (0, lib_1.cookie)().get(constants_1.SESSION_USER_ID_KEY) || undefined;
@@ -95,7 +96,7 @@ var FormoAnalytics = /** @class */ (function () {
95
96
  if (provider) {
96
97
  this.trackProvider(provider);
97
98
  }
98
- this.trackFirstPageHit();
99
+ this.trackPageHit();
99
100
  this.trackPageHits();
100
101
  }
101
102
  FormoAnalytics.init = function (writeKey, options) {
@@ -129,13 +130,14 @@ var FormoAnalytics = /** @class */ (function () {
129
130
  * @param {string} name - The name of the page
130
131
  * @param {Record<string, any>} properties - Additional properties to include
131
132
  * @param {Record<string, any>} context - Additional context to include
133
+ * @param {(...args: unknown[]) => void} callback - Optional callback function
132
134
  * @returns {Promise<void>}
133
135
  */
134
- FormoAnalytics.prototype.page = function (category, name, properties, context) {
136
+ FormoAnalytics.prototype.page = function (category, name, properties, context, callback) {
135
137
  return __awaiter(this, void 0, void 0, function () {
136
138
  return __generator(this, function (_a) {
137
139
  switch (_a.label) {
138
- case 0: return [4 /*yield*/, this.trackPageHit(category, name, properties, context)];
140
+ case 0: return [4 /*yield*/, this.trackPageHit(category, name, properties, context, callback)];
139
141
  case 1:
140
142
  _a.sent();
141
143
  return [2 /*return*/];
@@ -188,9 +190,9 @@ var FormoAnalytics = /** @class */ (function () {
188
190
  });
189
191
  };
190
192
  /**
191
- * Emits a wallet disconnect event.
192
- * @param {ChainID} params.chainId
193
- * @param {Address} params.address
193
+ * Emits a disconnect wallet event.
194
+ * @param {ChainID} [params.chainId]
195
+ * @param {Address} [params.address]
194
196
  * @param {IFormoEventProperties} properties
195
197
  * @param {IFormoEventContext} context
196
198
  * @param {(...args: unknown[]) => void} callback
@@ -198,15 +200,21 @@ var FormoAnalytics = /** @class */ (function () {
198
200
  */
199
201
  FormoAnalytics.prototype.disconnect = function (params, properties, context, callback) {
200
202
  return __awaiter(this, void 0, void 0, function () {
201
- var address, chainId;
203
+ var chainId, address;
202
204
  return __generator(this, function (_a) {
203
205
  switch (_a.label) {
204
206
  case 0:
205
- address = (params === null || params === void 0 ? void 0 : params.address) || this.currentAddress;
206
207
  chainId = (params === null || params === void 0 ? void 0 : params.chainId) || this.currentChainId;
207
- return [4 /*yield*/, this.handleDisconnect(chainId, address, properties, context, callback)];
208
+ address = (params === null || params === void 0 ? void 0 : params.address) || this.currentAddress;
209
+ return [4 /*yield*/, this.trackEvent(constants_1.EventType.DISCONNECT, {
210
+ chainId: chainId,
211
+ address: address,
212
+ }, properties, context, callback)];
208
213
  case 1:
209
214
  _a.sent();
215
+ this.currentAddress = undefined;
216
+ this.currentChainId = undefined;
217
+ lib_1.logger.info("Wallet disconnected: Cleared currentAddress and currentChainId");
210
218
  return [2 /*return*/];
211
219
  }
212
220
  });
@@ -438,6 +446,7 @@ var FormoAnalytics = /** @class */ (function () {
438
446
  SDK tracking and event listener functions
439
447
  */
440
448
  FormoAnalytics.prototype.trackProvider = function (provider) {
449
+ lib_1.logger.info("trackProvider", provider);
441
450
  try {
442
451
  if (provider === this._provider) {
443
452
  lib_1.logger.warn("TrackProvider: Provider already tracked.");
@@ -455,168 +464,54 @@ var FormoAnalytics = /** @class */ (function () {
455
464
  }
456
465
  this._provider = provider;
457
466
  // Register listeners for web3 provider events
458
- this.registerAddressChangedListener();
467
+ this.registerAccountsChangedListener();
459
468
  this.registerChainChangedListener();
460
- this.registerSignatureListener();
461
- this.registerTransactionListener();
469
+ this.registerConnectListener();
470
+ this.registerRequestListeners();
462
471
  }
463
472
  catch (error) {
464
473
  lib_1.logger.error("Error tracking provider:", error);
465
474
  }
466
475
  };
467
- FormoAnalytics.prototype.registerAddressChangedListener = function () {
476
+ FormoAnalytics.prototype.registerAccountsChangedListener = function () {
468
477
  var _this = this;
469
- var _a, _b;
478
+ var _a;
479
+ lib_1.logger.info("registerAccountsChangedListener");
470
480
  var listener = function () {
471
481
  var args = [];
472
482
  for (var _i = 0; _i < arguments.length; _i++) {
473
483
  args[_i] = arguments[_i];
474
484
  }
475
- return _this.onAddressChanged(args[0]);
485
+ return _this.onAccountsChanged(args[0]);
476
486
  };
477
487
  (_a = this._provider) === null || _a === void 0 ? void 0 : _a.on("accountsChanged", listener);
478
488
  this._providerListeners["accountsChanged"] = listener;
479
- var onAddressDisconnected = this.onAddressDisconnected.bind(this);
480
- (_b = this._provider) === null || _b === void 0 ? void 0 : _b.on("disconnect", onAddressDisconnected);
481
- this._providerListeners["disconnect"] = onAddressDisconnected;
482
- };
483
- FormoAnalytics.prototype.registerChainChangedListener = function () {
484
- var _this = this;
485
- var _a;
486
- var listener = function () {
487
- var args = [];
488
- for (var _i = 0; _i < arguments.length; _i++) {
489
- args[_i] = arguments[_i];
490
- }
491
- return _this.onChainChanged(args[0]);
492
- };
493
- (_a = this.provider) === null || _a === void 0 ? void 0 : _a.on("chainChanged", listener);
494
- this._providerListeners["chainChanged"] = listener;
495
489
  };
496
- FormoAnalytics.prototype.registerSignatureListener = function () {
497
- var _this = this;
498
- var _a;
499
- if (!this.provider) {
500
- lib_1.logger.error("Provider not found for signature tracking");
501
- return;
502
- }
503
- if (((_a = Object.getOwnPropertyDescriptor(this.provider, "request")) === null || _a === void 0 ? void 0 : _a.writable) ===
504
- false) {
505
- lib_1.logger.warn("Provider.request is not writable");
506
- return;
507
- }
508
- var request = this.provider.request.bind(this.provider);
509
- this.provider.request = function (_a) { return __awaiter(_this, [_a], void 0, function (_b) {
510
- var response, error_1, rpcError;
511
- var method = _b.method, params = _b.params;
512
- return __generator(this, function (_c) {
513
- switch (_c.label) {
514
- case 0:
515
- if (!(Array.isArray(params) &&
516
- ["eth_signTypedData_v4", "personal_sign"].includes(method))) return [3 /*break*/, 4];
517
- // Emit signature request event
518
- this.signature(__assign({ status: types_1.SignatureStatus.REQUESTED }, this.buildSignatureEventPayload(method, params)));
519
- _c.label = 1;
520
- case 1:
521
- _c.trys.push([1, 3, , 4]);
522
- return [4 /*yield*/, request({ method: method, params: params })];
523
- case 2:
524
- response = (_c.sent());
525
- if (response) {
526
- // Emit signature confirmed event
527
- this.signature(__assign({ status: types_1.SignatureStatus.CONFIRMED }, this.buildSignatureEventPayload(method, params, response)));
528
- }
529
- return [2 /*return*/, response];
530
- case 3:
531
- error_1 = _c.sent();
532
- rpcError = error_1;
533
- if (rpcError && (rpcError === null || rpcError === void 0 ? void 0 : rpcError.code) === 4001) {
534
- // Emit signature rejected event
535
- this.signature(__assign({ status: types_1.SignatureStatus.REJECTED }, this.buildSignatureEventPayload(method, params)));
536
- }
537
- throw error_1;
538
- case 4: return [2 /*return*/, request({ method: method, params: params })];
539
- }
540
- });
541
- }); };
542
- return;
543
- };
544
- FormoAnalytics.prototype.registerTransactionListener = function () {
545
- var _this = this;
546
- var _a;
547
- if (!this.provider) {
548
- lib_1.logger.error("Provider not found for transaction tracking");
549
- return;
550
- }
551
- if (((_a = Object.getOwnPropertyDescriptor(this.provider, "request")) === null || _a === void 0 ? void 0 : _a.writable) ===
552
- false) {
553
- lib_1.logger.warn("Provider.request is not writable");
554
- return;
555
- }
556
- var request = this.provider.request.bind(this.provider);
557
- this.provider.request = function (_a) { return __awaiter(_this, [_a], void 0, function (_b) {
558
- var payload, transactionHash, error_2, rpcError;
559
- var method = _b.method, params = _b.params;
560
- return __generator(this, function (_c) {
561
- switch (_c.label) {
562
- case 0:
563
- if (!(Array.isArray(params) &&
564
- method === "eth_sendTransaction" &&
565
- params[0])) return [3 /*break*/, 5];
566
- return [4 /*yield*/, this.buildTransactionEventPayload(params)];
567
- case 1:
568
- payload = _c.sent();
569
- this.transaction(__assign({ status: types_1.TransactionStatus.STARTED }, payload));
570
- _c.label = 2;
571
- case 2:
572
- _c.trys.push([2, 4, , 5]);
573
- return [4 /*yield*/, request({ method: method, params: params })];
574
- case 3:
575
- transactionHash = (_c.sent());
576
- // Track transaction broadcast
577
- this.transaction(__assign(__assign({ status: types_1.TransactionStatus.BROADCASTED }, payload), { transactionHash: transactionHash }));
578
- return [2 /*return*/];
579
- case 4:
580
- error_2 = _c.sent();
581
- lib_1.logger.error("Transaction error:", error_2);
582
- rpcError = error_2;
583
- if (rpcError && (rpcError === null || rpcError === void 0 ? void 0 : rpcError.code) === 4001) {
584
- // Emit transaction rejected event
585
- this.transaction(__assign({ status: types_1.TransactionStatus.REJECTED }, payload));
586
- }
587
- throw error_2;
588
- case 5: return [2 /*return*/, request({ method: method, params: params })];
589
- }
590
- });
591
- }); };
592
- return;
593
- };
594
- FormoAnalytics.prototype.onAddressChanged = function (addresses) {
595
- return __awaiter(this, void 0, void 0, function () {
596
- return __generator(this, function (_a) {
597
- if (addresses.length > 0) {
598
- this.onAddressConnected(addresses[0]);
599
- }
600
- else {
601
- this.onAddressDisconnected();
602
- }
603
- return [2 /*return*/];
604
- });
605
- });
606
- };
607
- FormoAnalytics.prototype.onAddressConnected = function (address) {
490
+ FormoAnalytics.prototype.onAccountsChanged = function (accounts) {
608
491
  return __awaiter(this, void 0, void 0, function () {
609
- var _a;
492
+ var address, _a;
610
493
  return __generator(this, function (_b) {
611
494
  switch (_b.label) {
612
495
  case 0:
613
- if (address === this.currentAddress)
496
+ lib_1.logger.info("onAccountsChanged", accounts);
497
+ if (!(accounts.length === 0)) return [3 /*break*/, 2];
498
+ // Handle wallet disconnect
499
+ return [4 /*yield*/, this.disconnect()];
500
+ case 1:
501
+ // Handle wallet disconnect
502
+ _b.sent();
503
+ return [2 /*return*/];
504
+ case 2:
505
+ address = accounts[0];
506
+ if (address === this.currentAddress) {
614
507
  // We have already reported this address
615
508
  return [2 /*return*/];
509
+ }
510
+ // Handle wallet connect
616
511
  this.currentAddress = address;
617
512
  _a = this;
618
513
  return [4 /*yield*/, this.getCurrentChainId()];
619
- case 1:
514
+ case 3:
620
515
  _a.currentChainId = _b.sent();
621
516
  this.connect({ chainId: this.currentChainId, address: address });
622
517
  return [2 /*return*/];
@@ -624,38 +519,19 @@ var FormoAnalytics = /** @class */ (function () {
624
519
  });
625
520
  });
626
521
  };
627
- FormoAnalytics.prototype.handleDisconnect = function (chainId, address, properties, context, callback) {
628
- return __awaiter(this, void 0, void 0, function () {
629
- var payload;
630
- return __generator(this, function (_a) {
631
- switch (_a.label) {
632
- case 0:
633
- payload = {
634
- chainId: chainId || this.currentChainId,
635
- address: address || this.currentAddress,
636
- };
637
- this.currentChainId = undefined;
638
- this.currentAddress = undefined;
639
- (0, lib_1.cookie)().remove(constants_1.SESSION_USER_ID_KEY);
640
- return [4 /*yield*/, this.trackEvent(constants_1.EventType.DISCONNECT, payload, properties, context, callback)];
641
- case 1:
642
- _a.sent();
643
- return [2 /*return*/];
644
- }
645
- });
646
- });
647
- };
648
- FormoAnalytics.prototype.onAddressDisconnected = function () {
649
- return __awaiter(this, void 0, void 0, function () {
650
- return __generator(this, function (_a) {
651
- switch (_a.label) {
652
- case 0: return [4 /*yield*/, this.handleDisconnect(this.currentChainId, this.currentAddress)];
653
- case 1:
654
- _a.sent();
655
- return [2 /*return*/];
656
- }
657
- });
658
- });
522
+ FormoAnalytics.prototype.registerChainChangedListener = function () {
523
+ var _this = this;
524
+ var _a;
525
+ lib_1.logger.info("registerChainChangedListener");
526
+ var listener = function () {
527
+ var args = [];
528
+ for (var _i = 0; _i < arguments.length; _i++) {
529
+ args[_i] = arguments[_i];
530
+ }
531
+ return _this.onChainChanged(args[0]);
532
+ };
533
+ (_a = this.provider) === null || _a === void 0 ? void 0 : _a.on("chainChanged", listener);
534
+ this._providerListeners["chainChanged"] = listener;
659
535
  };
660
536
  FormoAnalytics.prototype.onChainChanged = function (chainIdHex) {
661
537
  return __awaiter(this, void 0, void 0, function () {
@@ -663,7 +539,8 @@ var FormoAnalytics = /** @class */ (function () {
663
539
  return __generator(this, function (_a) {
664
540
  switch (_a.label) {
665
541
  case 0:
666
- this.currentChainId = parseInt(chainIdHex);
542
+ lib_1.logger.info("onChainChanged", chainIdHex);
543
+ this.currentChainId = (0, chain_1.parseChainId)(chainIdHex);
667
544
  if (!!this.currentAddress) return [3 /*break*/, 2];
668
545
  if (!this.provider) {
669
546
  lib_1.logger.info("OnChainChanged: Provider not found. CHAIN_CHANGED not reported");
@@ -694,13 +571,217 @@ var FormoAnalytics = /** @class */ (function () {
694
571
  });
695
572
  });
696
573
  };
697
- FormoAnalytics.prototype.trackFirstPageHit = function () {
574
+ FormoAnalytics.prototype.registerConnectListener = function () {
575
+ var _this = this;
576
+ var _a;
577
+ lib_1.logger.info("registerConnectListener");
578
+ var listener = function () {
579
+ var args = [];
580
+ for (var _i = 0; _i < arguments.length; _i++) {
581
+ args[_i] = arguments[_i];
582
+ }
583
+ var connection = args[0];
584
+ _this.onConnected(connection);
585
+ };
586
+ (_a = this._provider) === null || _a === void 0 ? void 0 : _a.on("connect", listener);
587
+ this._providerListeners["connect"] = listener;
588
+ };
589
+ FormoAnalytics.prototype.onConnected = function (connection) {
590
+ return __awaiter(this, void 0, void 0, function () {
591
+ var chainId, address, e_2;
592
+ return __generator(this, function (_a) {
593
+ switch (_a.label) {
594
+ case 0:
595
+ lib_1.logger.info("onConnected", connection);
596
+ _a.label = 1;
597
+ case 1:
598
+ _a.trys.push([1, 3, , 4]);
599
+ if (!connection || typeof connection.chainId !== 'string')
600
+ return [2 /*return*/];
601
+ chainId = (0, chain_1.parseChainId)(connection.chainId);
602
+ return [4 /*yield*/, this.getAddress()];
603
+ case 2:
604
+ address = _a.sent();
605
+ if (chainId !== null && chainId !== undefined && address) {
606
+ this.connect({ chainId: chainId, address: address });
607
+ }
608
+ return [3 /*break*/, 4];
609
+ case 3:
610
+ e_2 = _a.sent();
611
+ lib_1.logger.error("Error handling connect event", e_2);
612
+ return [3 /*break*/, 4];
613
+ case 4: return [2 /*return*/];
614
+ }
615
+ });
616
+ });
617
+ };
618
+ FormoAnalytics.prototype.registerRequestListeners = function () {
619
+ var _this = this;
620
+ var _a;
621
+ lib_1.logger.info("registerRequestListeners");
622
+ if (!this.provider) {
623
+ lib_1.logger.error("Provider not found for request (signature, transaction) tracking");
624
+ return;
625
+ }
626
+ if (((_a = Object.getOwnPropertyDescriptor(this.provider, "request")) === null || _a === void 0 ? void 0 : _a.writable) ===
627
+ false) {
628
+ lib_1.logger.warn("Provider.request is not writable");
629
+ return;
630
+ }
631
+ var request = this.provider.request.bind(this.provider);
632
+ this.provider.request = function (_a) { return __awaiter(_this, [_a], void 0, function (_b) {
633
+ var response_1, error_1, transactionHash_1, error_2;
634
+ var _this = this;
635
+ var method = _b.method, params = _b.params;
636
+ return __generator(this, function (_c) {
637
+ switch (_c.label) {
638
+ case 0:
639
+ if (!(Array.isArray(params) &&
640
+ ["eth_signTypedData_v4", "personal_sign"].includes(method))) return [3 /*break*/, 4];
641
+ // Fire-and-forget tracking
642
+ (function () { return __awaiter(_this, void 0, void 0, function () {
643
+ return __generator(this, function (_a) {
644
+ try {
645
+ this.signature(__assign({ status: types_1.SignatureStatus.REQUESTED }, this.buildSignatureEventPayload(method, params)));
646
+ }
647
+ catch (e) {
648
+ lib_1.logger.error("Formo: Failed to track signature request", e);
649
+ }
650
+ return [2 /*return*/];
651
+ });
652
+ }); })();
653
+ _c.label = 1;
654
+ case 1:
655
+ _c.trys.push([1, 3, , 4]);
656
+ return [4 /*yield*/, request({ method: method, params: params })];
657
+ case 2:
658
+ response_1 = (_c.sent());
659
+ (function () { return __awaiter(_this, void 0, void 0, function () {
660
+ return __generator(this, function (_a) {
661
+ try {
662
+ if (response_1) {
663
+ this.signature(__assign({ status: types_1.SignatureStatus.CONFIRMED }, this.buildSignatureEventPayload(method, params, response_1)));
664
+ }
665
+ }
666
+ catch (e) {
667
+ lib_1.logger.error("Formo: Failed to track signature confirmation", e);
668
+ }
669
+ return [2 /*return*/];
670
+ });
671
+ }); })();
672
+ return [2 /*return*/, response_1];
673
+ case 3:
674
+ error_1 = _c.sent();
675
+ (function () { return __awaiter(_this, void 0, void 0, function () {
676
+ var rpcError;
677
+ return __generator(this, function (_a) {
678
+ try {
679
+ rpcError = error_1;
680
+ if (rpcError && (rpcError === null || rpcError === void 0 ? void 0 : rpcError.code) === 4001) {
681
+ this.signature(__assign({ status: types_1.SignatureStatus.REJECTED }, this.buildSignatureEventPayload(method, params)));
682
+ }
683
+ }
684
+ catch (e) {
685
+ lib_1.logger.error("Formo: Failed to track signature rejection", e);
686
+ }
687
+ return [2 /*return*/];
688
+ });
689
+ }); })();
690
+ throw error_1;
691
+ case 4:
692
+ if (!(Array.isArray(params) &&
693
+ method === "eth_sendTransaction" &&
694
+ params[0])) return [3 /*break*/, 8];
695
+ (function () { return __awaiter(_this, void 0, void 0, function () {
696
+ var payload, e_3;
697
+ return __generator(this, function (_a) {
698
+ switch (_a.label) {
699
+ case 0:
700
+ _a.trys.push([0, 2, , 3]);
701
+ return [4 /*yield*/, this.buildTransactionEventPayload(params)];
702
+ case 1:
703
+ payload = _a.sent();
704
+ this.transaction(__assign({ status: types_1.TransactionStatus.STARTED }, payload));
705
+ return [3 /*break*/, 3];
706
+ case 2:
707
+ e_3 = _a.sent();
708
+ lib_1.logger.error("Formo: Failed to track transaction start", e_3);
709
+ return [3 /*break*/, 3];
710
+ case 3: return [2 /*return*/];
711
+ }
712
+ });
713
+ }); })();
714
+ _c.label = 5;
715
+ case 5:
716
+ _c.trys.push([5, 7, , 8]);
717
+ return [4 /*yield*/, request({
718
+ method: method,
719
+ params: params,
720
+ })];
721
+ case 6:
722
+ transactionHash_1 = (_c.sent());
723
+ (function () { return __awaiter(_this, void 0, void 0, function () {
724
+ var payload, e_4;
725
+ return __generator(this, function (_a) {
726
+ switch (_a.label) {
727
+ case 0:
728
+ _a.trys.push([0, 2, , 3]);
729
+ return [4 /*yield*/, this.buildTransactionEventPayload(params)];
730
+ case 1:
731
+ payload = _a.sent();
732
+ this.transaction(__assign(__assign({ status: types_1.TransactionStatus.BROADCASTED }, payload), { transactionHash: transactionHash_1 }));
733
+ // Start async polling for transaction receipt
734
+ this.pollTransactionReceipt(transactionHash_1, payload);
735
+ return [3 /*break*/, 3];
736
+ case 2:
737
+ e_4 = _a.sent();
738
+ lib_1.logger.error("Formo: Failed to track transaction broadcast", e_4);
739
+ return [3 /*break*/, 3];
740
+ case 3: return [2 /*return*/];
741
+ }
742
+ });
743
+ }); })();
744
+ return [2 /*return*/, transactionHash_1];
745
+ case 7:
746
+ error_2 = _c.sent();
747
+ (function () { return __awaiter(_this, void 0, void 0, function () {
748
+ var rpcError, payload, e_5;
749
+ return __generator(this, function (_a) {
750
+ switch (_a.label) {
751
+ case 0:
752
+ _a.trys.push([0, 3, , 4]);
753
+ rpcError = error_2;
754
+ if (!(rpcError && (rpcError === null || rpcError === void 0 ? void 0 : rpcError.code) === 4001)) return [3 /*break*/, 2];
755
+ return [4 /*yield*/, this.buildTransactionEventPayload(params)];
756
+ case 1:
757
+ payload = _a.sent();
758
+ this.transaction(__assign({ status: types_1.TransactionStatus.REJECTED }, payload));
759
+ _a.label = 2;
760
+ case 2: return [3 /*break*/, 4];
761
+ case 3:
762
+ e_5 = _a.sent();
763
+ lib_1.logger.error("Formo: Failed to track transaction rejection", e_5);
764
+ return [3 /*break*/, 4];
765
+ case 4: return [2 /*return*/];
766
+ }
767
+ });
768
+ }); })();
769
+ throw error_2;
770
+ case 8: return [2 /*return*/, request({ method: method, params: params })];
771
+ }
772
+ });
773
+ }); };
774
+ };
775
+ FormoAnalytics.prototype.onLocationChange = function () {
698
776
  return __awaiter(this, void 0, void 0, function () {
777
+ var currentUrl;
699
778
  return __generator(this, function (_a) {
700
- if ((0, lib_1.cookie)().get(constants_1.SESSION_CURRENT_URL_KEY) === null) {
779
+ currentUrl = (0, lib_1.cookie)().get(constants_1.SESSION_CURRENT_URL_KEY);
780
+ if (currentUrl !== window.location.href) {
701
781
  (0, lib_1.cookie)().set(constants_1.SESSION_CURRENT_URL_KEY, window.location.href);
782
+ this.trackPageHit();
702
783
  }
703
- return [2 /*return*/, this.trackPageHit()];
784
+ return [2 /*return*/];
704
785
  });
705
786
  });
706
787
  };
@@ -735,25 +816,13 @@ var FormoAnalytics = /** @class */ (function () {
735
816
  });
736
817
  });
737
818
  };
738
- FormoAnalytics.prototype.onLocationChange = function () {
739
- return __awaiter(this, void 0, void 0, function () {
740
- var currentUrl;
741
- return __generator(this, function (_a) {
742
- currentUrl = (0, lib_1.cookie)().get(constants_1.SESSION_CURRENT_URL_KEY);
743
- if (currentUrl !== window.location.href) {
744
- (0, lib_1.cookie)().set(constants_1.SESSION_CURRENT_URL_KEY, window.location.href);
745
- this.trackPageHit();
746
- }
747
- return [2 /*return*/];
748
- });
749
- });
750
- };
751
819
  FormoAnalytics.prototype.trackPageHit = function (category, name, properties, context, callback) {
752
820
  return __awaiter(this, void 0, void 0, function () {
753
821
  var _this = this;
754
822
  return __generator(this, function (_a) {
755
- if (!this.config.trackLocalhost && (0, validators_1.isLocalhost)()) {
756
- return [2 /*return*/, lib_1.logger.warn("Track page hit: Ignoring event because website is running locally")];
823
+ if (!this.shouldTrack()) {
824
+ lib_1.logger.info("Track page hit: Skipping event due to tracking configuration");
825
+ return [2 /*return*/];
757
826
  }
758
827
  setTimeout(function () { return __awaiter(_this, void 0, void 0, function () {
759
828
  return __generator(this, function (_a) {
@@ -772,6 +841,10 @@ var FormoAnalytics = /** @class */ (function () {
772
841
  return __awaiter(this, void 0, void 0, function () {
773
842
  return __generator(this, function (_a) {
774
843
  try {
844
+ if (!this.shouldTrack()) {
845
+ lib_1.logger.info("Skipping ".concat(type, " event due to tracking configuration"));
846
+ return [2 /*return*/];
847
+ }
775
848
  this.eventManager.addEvent(__assign(__assign({ type: type }, payload), { properties: properties, context: context, callback: callback }), this.currentAddress, this.currentUserId);
776
849
  }
777
850
  catch (error) {
@@ -781,6 +854,46 @@ var FormoAnalytics = /** @class */ (function () {
781
854
  });
782
855
  });
783
856
  };
857
+ /**
858
+ * Determines if tracking should be enabled based on configuration
859
+ * @returns {boolean} True if tracking should be enabled
860
+ */
861
+ FormoAnalytics.prototype.shouldTrack = function () {
862
+ // Check if tracking is explicitly provided as a boolean
863
+ if (typeof this.options.tracking === 'boolean') {
864
+ return this.options.tracking;
865
+ }
866
+ // Handle object configuration with exclusion rules
867
+ if (this.options.tracking !== null &&
868
+ typeof this.options.tracking === 'object' &&
869
+ !Array.isArray(this.options.tracking)) {
870
+ var _a = this.options.tracking, _b = _a.excludeHosts, excludeHosts = _b === void 0 ? [] : _b, _c = _a.excludePaths, excludePaths = _c === void 0 ? [] : _c, _d = _a.excludeChains, excludeChains = _d === void 0 ? [] : _d;
871
+ // Check hostname exclusions - use exact matching
872
+ if (excludeHosts.length > 0 && typeof window !== 'undefined') {
873
+ var hostname = window.location.hostname;
874
+ if (excludeHosts.includes(hostname)) {
875
+ return false;
876
+ }
877
+ }
878
+ // Check path exclusions - use exact matching
879
+ if (excludePaths.length > 0 && typeof window !== 'undefined') {
880
+ var pathname = window.location.pathname;
881
+ if (excludePaths.includes(pathname)) {
882
+ return false;
883
+ }
884
+ }
885
+ // Check chainId exclusions
886
+ if (excludeChains.length > 0 &&
887
+ this.currentChainId &&
888
+ excludeChains.includes(this.currentChainId)) {
889
+ return false;
890
+ }
891
+ // If nothing is excluded, tracking is enabled
892
+ return true;
893
+ }
894
+ // Default behavior: track everywhere except localhost
895
+ return !(0, validators_1.isLocalhost)();
896
+ };
784
897
  /*
785
898
  Utility functions
786
899
  */
@@ -936,7 +1049,7 @@ var FormoAnalytics = /** @class */ (function () {
936
1049
  lib_1.logger.info("Chain id not found");
937
1050
  return [2 /*return*/, 0];
938
1051
  }
939
- return [2 /*return*/, parseInt(chainIdHex, 16)];
1052
+ return [2 /*return*/, (0, chain_1.parseChainId)(chainIdHex)];
940
1053
  case 3:
941
1054
  err_5 = _b.sent();
942
1055
  lib_1.logger.error("eth_chainId threw an error:", err_5);
@@ -984,6 +1097,62 @@ var FormoAnalytics = /** @class */ (function () {
984
1097
  });
985
1098
  });
986
1099
  };
1100
+ /**
1101
+ * Polls for transaction receipt and emits tx.status = CONFIRMED or REVERTED.
1102
+ */
1103
+ FormoAnalytics.prototype.pollTransactionReceipt = function (transactionHash_2, payload_1) {
1104
+ return __awaiter(this, arguments, void 0, function (transactionHash, payload, maxAttempts, intervalMs) {
1105
+ var attempts, provider, poll;
1106
+ var _this = this;
1107
+ if (maxAttempts === void 0) { maxAttempts = 10; }
1108
+ if (intervalMs === void 0) { intervalMs = 3000; }
1109
+ return __generator(this, function (_a) {
1110
+ attempts = 0;
1111
+ provider = this.provider;
1112
+ if (!provider)
1113
+ return [2 /*return*/];
1114
+ poll = function () { return __awaiter(_this, void 0, void 0, function () {
1115
+ var receipt, e_6;
1116
+ return __generator(this, function (_a) {
1117
+ switch (_a.label) {
1118
+ case 0:
1119
+ _a.trys.push([0, 2, , 3]);
1120
+ return [4 /*yield*/, provider.request({
1121
+ method: "eth_getTransactionReceipt",
1122
+ params: [transactionHash],
1123
+ })];
1124
+ case 1:
1125
+ receipt = (_a.sent());
1126
+ if (receipt) {
1127
+ // status: 1 = success, 0 = reverted
1128
+ if (receipt.status === "0x1" || receipt.status === 1) {
1129
+ this.transaction(__assign(__assign({ status: types_1.TransactionStatus.CONFIRMED }, payload), { transactionHash: transactionHash }));
1130
+ return [2 /*return*/];
1131
+ }
1132
+ else if (receipt.status === "0x0" || receipt.status === 0) {
1133
+ this.transaction(__assign(__assign({ status: types_1.TransactionStatus.REVERTED }, payload), { transactionHash: transactionHash }));
1134
+ return [2 /*return*/];
1135
+ }
1136
+ }
1137
+ return [3 /*break*/, 3];
1138
+ case 2:
1139
+ e_6 = _a.sent();
1140
+ lib_1.logger.error("Error polling transaction receipt", e_6);
1141
+ return [3 /*break*/, 3];
1142
+ case 3:
1143
+ attempts++;
1144
+ if (attempts < maxAttempts) {
1145
+ setTimeout(poll, intervalMs);
1146
+ }
1147
+ return [2 /*return*/];
1148
+ }
1149
+ });
1150
+ }); };
1151
+ poll();
1152
+ return [2 /*return*/];
1153
+ });
1154
+ });
1155
+ };
987
1156
  return FormoAnalytics;
988
1157
  }());
989
1158
  exports.FormoAnalytics = FormoAnalytics;