@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.
- package/README.md +0 -1
- package/dist/cjs/src/FormoAnalytics.d.ts +20 -13
- package/dist/cjs/src/FormoAnalytics.d.ts.map +1 -1
- package/dist/cjs/src/FormoAnalytics.js +368 -199
- package/dist/cjs/src/FormoAnalytics.js.map +1 -1
- package/dist/cjs/src/FormoAnalyticsProvider.js +4 -4
- package/dist/cjs/src/FormoAnalyticsProvider.js.map +1 -1
- package/dist/cjs/src/lib/event/EventFactory.d.ts +3 -2
- package/dist/cjs/src/lib/event/EventFactory.d.ts.map +1 -1
- package/dist/cjs/src/lib/event/EventFactory.js +17 -5
- package/dist/cjs/src/lib/event/EventFactory.js.map +1 -1
- package/dist/cjs/src/lib/logger/Logger.js +1 -1
- package/dist/cjs/src/lib/logger/Logger.js.map +1 -1
- package/dist/cjs/src/types/base.d.ts +15 -8
- package/dist/cjs/src/types/base.d.ts.map +1 -1
- package/dist/cjs/src/types/events.d.ts +6 -3
- package/dist/cjs/src/types/events.d.ts.map +1 -1
- package/dist/cjs/src/types/events.js +2 -0
- package/dist/cjs/src/types/events.js.map +1 -1
- package/dist/cjs/src/types/provider.d.ts +3 -0
- package/dist/cjs/src/types/provider.d.ts.map +1 -1
- package/dist/cjs/src/utils/chain.d.ts +7 -0
- package/dist/cjs/src/utils/chain.d.ts.map +1 -0
- package/dist/cjs/src/utils/chain.js +17 -0
- package/dist/cjs/src/utils/chain.js.map +1 -0
- package/dist/cjs/src/validators/address.d.ts +2 -2
- package/dist/cjs/src/validators/address.d.ts.map +1 -1
- package/dist/cjs/src/validators/address.js +6 -6
- package/dist/cjs/src/validators/address.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/src/FormoAnalytics.d.ts +20 -13
- package/dist/esm/src/FormoAnalytics.d.ts.map +1 -1
- package/dist/esm/src/FormoAnalytics.js +368 -199
- package/dist/esm/src/FormoAnalytics.js.map +1 -1
- package/dist/esm/src/FormoAnalyticsProvider.js +4 -4
- package/dist/esm/src/FormoAnalyticsProvider.js.map +1 -1
- package/dist/esm/src/lib/event/EventFactory.d.ts +3 -2
- package/dist/esm/src/lib/event/EventFactory.d.ts.map +1 -1
- package/dist/esm/src/lib/event/EventFactory.js +17 -5
- package/dist/esm/src/lib/event/EventFactory.js.map +1 -1
- package/dist/esm/src/lib/logger/Logger.js +1 -1
- package/dist/esm/src/lib/logger/Logger.js.map +1 -1
- package/dist/esm/src/types/base.d.ts +15 -8
- package/dist/esm/src/types/base.d.ts.map +1 -1
- package/dist/esm/src/types/events.d.ts +6 -3
- package/dist/esm/src/types/events.d.ts.map +1 -1
- package/dist/esm/src/types/events.js +2 -0
- package/dist/esm/src/types/events.js.map +1 -1
- package/dist/esm/src/types/provider.d.ts +3 -0
- package/dist/esm/src/types/provider.d.ts.map +1 -1
- package/dist/esm/src/utils/chain.d.ts +7 -0
- package/dist/esm/src/utils/chain.d.ts.map +1 -0
- package/dist/esm/src/utils/chain.js +14 -0
- package/dist/esm/src/utils/chain.js.map +1 -0
- package/dist/esm/src/validators/address.d.ts +2 -2
- package/dist/esm/src/validators/address.d.ts.map +1 -1
- package/dist/esm/src/validators/address.js +4 -4
- package/dist/esm/src/validators/address.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/dist/index.umd.min.js +1 -1
- package/dist/index.umd.min.js.map +1 -1
- 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.
|
|
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
|
|
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
|
|
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
|
-
|
|
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.
|
|
467
|
+
this.registerAccountsChangedListener();
|
|
459
468
|
this.registerChainChangedListener();
|
|
460
|
-
this.
|
|
461
|
-
this.
|
|
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.
|
|
476
|
+
FormoAnalytics.prototype.registerAccountsChangedListener = function () {
|
|
468
477
|
var _this = this;
|
|
469
|
-
var _a
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
|
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.
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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.
|
|
756
|
-
|
|
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*/,
|
|
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;
|