@formo/analytics 1.25.0 → 1.26.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/LICENSE +21 -0
- package/dist/cjs/src/FormoAnalytics.d.ts +24 -14
- package/dist/cjs/src/FormoAnalytics.js +195 -255
- package/dist/cjs/src/FormoAnalyticsProvider.js +71 -13
- package/dist/{esm/src/lib/consent.d.ts → cjs/src/consent/index.d.ts} +1 -1
- package/dist/cjs/src/{lib/consent.js → consent/index.js} +1 -1
- package/dist/cjs/src/constants/base.d.ts +0 -2
- package/dist/cjs/src/constants/base.js +3 -3
- package/dist/cjs/src/constants/config.js +1 -1
- package/dist/cjs/src/{lib/event → event}/EventFactory.d.ts +1 -1
- package/dist/cjs/src/{lib/event → event}/EventFactory.js +6 -6
- package/dist/cjs/src/{lib/event → event}/EventManager.d.ts +1 -1
- package/dist/cjs/src/{lib/event → event}/EventManager.js +1 -1
- package/dist/cjs/src/{lib/event → event}/type.d.ts +1 -1
- package/dist/cjs/src/{lib/event → event}/utils.d.ts +1 -1
- package/dist/cjs/src/{lib/event → event}/utils.js +1 -1
- package/dist/cjs/src/{lib/fetch.d.ts → fetch/index.d.ts} +1 -1
- package/dist/cjs/src/{lib/fetch.js → fetch/index.js} +1 -1
- package/dist/cjs/src/provider/detection.d.ts +58 -0
- package/dist/cjs/src/provider/detection.js +103 -0
- package/dist/cjs/src/provider/index.d.ts +6 -0
- package/dist/cjs/src/provider/index.js +11 -0
- package/dist/{esm/src/lib → cjs/src}/queue/EventQueue.d.ts +1 -1
- package/dist/cjs/src/{lib/queue → queue}/EventQueue.js +3 -3
- package/dist/{esm/src/lib → cjs/src}/queue/type.d.ts +1 -1
- package/dist/cjs/src/session/index.d.ts +91 -0
- package/dist/cjs/src/session/index.js +126 -0
- package/dist/cjs/src/{lib/storage → storage}/built-in/blueprint.js +1 -1
- package/dist/cjs/src/types/base.d.ts +27 -1
- package/dist/cjs/src/validators/object.js +0 -2
- package/dist/cjs/src/version.d.ts +1 -1
- package/dist/cjs/src/version.js +1 -1
- package/dist/cjs/src/wagmi/WagmiEventHandler.d.ts +69 -0
- package/dist/cjs/src/wagmi/WagmiEventHandler.js +449 -0
- package/dist/cjs/src/wagmi/index.d.ts +9 -0
- package/dist/cjs/src/wagmi/index.js +12 -0
- package/dist/cjs/src/wagmi/types.d.ts +115 -0
- package/dist/cjs/src/wagmi/types.js +10 -0
- package/dist/esm/src/FormoAnalytics.d.ts +24 -14
- package/dist/esm/src/FormoAnalytics.js +85 -145
- package/dist/esm/src/FormoAnalyticsProvider.js +68 -10
- package/dist/{cjs/src/lib/consent.d.ts → esm/src/consent/index.d.ts} +1 -1
- package/dist/esm/src/{lib/consent.js → consent/index.js} +1 -1
- package/dist/esm/src/constants/base.d.ts +0 -2
- package/dist/esm/src/constants/base.js +2 -2
- package/dist/esm/src/constants/config.js +1 -1
- package/dist/esm/src/{lib/event → event}/EventFactory.d.ts +1 -1
- package/dist/esm/src/{lib/event → event}/EventFactory.js +6 -6
- package/dist/esm/src/{lib/event → event}/EventManager.d.ts +1 -1
- package/dist/esm/src/{lib/event → event}/EventManager.js +1 -1
- package/dist/esm/src/{lib/event → event}/type.d.ts +1 -1
- package/dist/esm/src/{lib/event → event}/utils.d.ts +1 -1
- package/dist/esm/src/{lib/event → event}/utils.js +1 -1
- package/dist/esm/src/{lib/fetch.d.ts → fetch/index.d.ts} +1 -1
- package/dist/esm/src/{lib/fetch.js → fetch/index.js} +1 -1
- package/dist/esm/src/provider/detection.d.ts +58 -0
- package/dist/esm/src/provider/detection.js +98 -0
- package/dist/esm/src/provider/index.d.ts +6 -0
- package/dist/esm/src/provider/index.js +5 -0
- package/dist/{cjs/src/lib → esm/src}/queue/EventQueue.d.ts +1 -1
- package/dist/esm/src/{lib/queue → queue}/EventQueue.js +3 -3
- package/dist/{cjs/src/lib → esm/src}/queue/type.d.ts +1 -1
- package/dist/esm/src/session/index.d.ts +91 -0
- package/dist/esm/src/session/index.js +123 -0
- package/dist/esm/src/{lib/storage → storage}/built-in/blueprint.js +1 -1
- package/dist/esm/src/types/base.d.ts +27 -1
- package/dist/esm/src/validators/object.js +0 -2
- package/dist/esm/src/version.d.ts +1 -1
- package/dist/esm/src/version.js +1 -1
- package/dist/esm/src/wagmi/WagmiEventHandler.d.ts +69 -0
- package/dist/esm/src/wagmi/WagmiEventHandler.js +446 -0
- package/dist/esm/src/wagmi/index.d.ts +9 -0
- package/dist/esm/src/wagmi/index.js +8 -0
- package/dist/esm/src/wagmi/types.d.ts +115 -0
- package/dist/esm/src/wagmi/types.js +9 -0
- package/dist/index.umd.min.js +1 -1
- package/package.json +18 -3
- package/dist/cjs/src/lib/index.d.ts +0 -7
- package/dist/cjs/src/lib/index.js +0 -28
- package/dist/esm/src/lib/index.d.ts +0 -7
- package/dist/esm/src/lib/index.js +0 -7
- /package/dist/cjs/src/{lib/browser → browser}/browsers.d.ts +0 -0
- /package/dist/cjs/src/{lib/browser → browser}/browsers.js +0 -0
- /package/dist/cjs/src/{lib/event → event}/constants.d.ts +0 -0
- /package/dist/cjs/src/{lib/event → event}/constants.js +0 -0
- /package/dist/cjs/src/{lib/event → event}/index.d.ts +0 -0
- /package/dist/cjs/src/{lib/event → event}/index.js +0 -0
- /package/dist/cjs/src/{lib/event → event}/type.js +0 -0
- /package/dist/cjs/src/{lib/logger → logger}/Logger.d.ts +0 -0
- /package/dist/cjs/src/{lib/logger → logger}/Logger.js +0 -0
- /package/dist/cjs/src/{lib/logger → logger}/index.d.ts +0 -0
- /package/dist/cjs/src/{lib/logger → logger}/index.js +0 -0
- /package/dist/cjs/src/{lib/logger → logger}/type.d.ts +0 -0
- /package/dist/cjs/src/{lib/logger → logger}/type.js +0 -0
- /package/dist/cjs/src/{lib/queue → queue}/index.d.ts +0 -0
- /package/dist/cjs/src/{lib/queue → queue}/index.js +0 -0
- /package/dist/cjs/src/{lib/queue → queue}/type.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry1.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry1.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry2.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry2.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry3.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_curry3.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_has.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_has.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isObject.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isObject.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isPlaceholder.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/internal/_isPlaceholder.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepRight.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepRight.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepWithKey.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/mergeDeepWithKey.js +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/mergeWithKey.d.ts +0 -0
- /package/dist/cjs/src/{lib/ramda → ramda}/mergeWithKey.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/StorageManager.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/StorageManager.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/blueprint.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/cookie.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/cookie.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/memory.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/memory.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/web.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/built-in/web.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/constant.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/constant.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/index.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/index.js +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/type.d.ts +0 -0
- /package/dist/cjs/src/{lib/storage → storage}/type.js +0 -0
- /package/dist/esm/src/{lib/browser → browser}/browsers.d.ts +0 -0
- /package/dist/esm/src/{lib/browser → browser}/browsers.js +0 -0
- /package/dist/esm/src/{lib/event → event}/constants.d.ts +0 -0
- /package/dist/esm/src/{lib/event → event}/constants.js +0 -0
- /package/dist/esm/src/{lib/event → event}/index.d.ts +0 -0
- /package/dist/esm/src/{lib/event → event}/index.js +0 -0
- /package/dist/esm/src/{lib/event → event}/type.js +0 -0
- /package/dist/esm/src/{lib/logger → logger}/Logger.d.ts +0 -0
- /package/dist/esm/src/{lib/logger → logger}/Logger.js +0 -0
- /package/dist/esm/src/{lib/logger → logger}/index.d.ts +0 -0
- /package/dist/esm/src/{lib/logger → logger}/index.js +0 -0
- /package/dist/esm/src/{lib/logger → logger}/type.d.ts +0 -0
- /package/dist/esm/src/{lib/logger → logger}/type.js +0 -0
- /package/dist/esm/src/{lib/queue → queue}/index.d.ts +0 -0
- /package/dist/esm/src/{lib/queue → queue}/index.js +0 -0
- /package/dist/esm/src/{lib/queue → queue}/type.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry1.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry1.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry2.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry2.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry3.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_curry3.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_has.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_has.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_isObject.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_isObject.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_isPlaceholder.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/internal/_isPlaceholder.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepRight.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepRight.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepWithKey.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/mergeDeepWithKey.js +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/mergeWithKey.d.ts +0 -0
- /package/dist/esm/src/{lib/ramda → ramda}/mergeWithKey.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/StorageManager.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/StorageManager.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/blueprint.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/cookie.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/cookie.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/memory.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/memory.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/web.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/built-in/web.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/constant.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/constant.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/index.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/index.js +0 -0
- /package/dist/esm/src/{lib/storage → storage}/type.d.ts +0 -0
- /package/dist/esm/src/{lib/storage → storage}/type.js +0 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Provider detection utilities for identifying wallet providers
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Default icon for providers without custom icons
|
|
6
|
+
*/
|
|
7
|
+
export var DEFAULT_PROVIDER_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMzIiIGhlaWdodD0iMzIiIHZpZXdCb3g9IjAgMCAzMiAzMiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHJlY3Qgd2lkdGg9IjMyIiBoZWlnaHQ9IjMyIiBmaWxsPSIjRkZGIi8+CjxwYXRoIGQ9Ik0xNiA4TDggMjRoMTZMMTYgOHoiIGZpbGw9IiMzMzMiLz4KPC9zdmc+Cg==";
|
|
8
|
+
/**
|
|
9
|
+
* Known wallet providers with their identifying flags and metadata
|
|
10
|
+
*/
|
|
11
|
+
var KNOWN_PROVIDERS = [
|
|
12
|
+
{
|
|
13
|
+
flag: 'isMetaMask',
|
|
14
|
+
name: 'MetaMask',
|
|
15
|
+
rdns: 'io.metamask',
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
flag: 'isCoinbaseWallet',
|
|
19
|
+
name: 'Coinbase Wallet',
|
|
20
|
+
rdns: 'com.coinbase.wallet',
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
flag: 'isWalletConnect',
|
|
24
|
+
name: 'WalletConnect',
|
|
25
|
+
rdns: 'com.walletconnect',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
flag: 'isTrust',
|
|
29
|
+
name: 'Trust Wallet',
|
|
30
|
+
rdns: 'com.trustwallet',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
flag: 'isBraveWallet',
|
|
34
|
+
name: 'Brave Wallet',
|
|
35
|
+
rdns: 'com.brave.wallet',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
flag: 'isPhantom',
|
|
39
|
+
name: 'Phantom',
|
|
40
|
+
rdns: 'app.phantom',
|
|
41
|
+
},
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* Attempts to detect information about an injected provider by examining
|
|
45
|
+
* common wallet-specific flags and properties.
|
|
46
|
+
*
|
|
47
|
+
* @param provider The injected provider to analyze
|
|
48
|
+
* @returns Provider information with fallback values if detection fails
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const provider = window.ethereum;
|
|
53
|
+
* const info = detectInjectedProviderInfo(provider);
|
|
54
|
+
* console.log(info.name); // "MetaMask" or "Injected Provider"
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export function detectInjectedProviderInfo(provider) {
|
|
58
|
+
// Default values for unknown providers
|
|
59
|
+
var name = "Injected Provider";
|
|
60
|
+
var rdns = "io.injected.provider";
|
|
61
|
+
// Cast to check for wallet-specific flags
|
|
62
|
+
var flags = provider;
|
|
63
|
+
// Check known providers in order of precedence
|
|
64
|
+
for (var _i = 0, KNOWN_PROVIDERS_1 = KNOWN_PROVIDERS; _i < KNOWN_PROVIDERS_1.length; _i++) {
|
|
65
|
+
var knownProvider = KNOWN_PROVIDERS_1[_i];
|
|
66
|
+
if (flags[knownProvider.flag]) {
|
|
67
|
+
name = knownProvider.name;
|
|
68
|
+
rdns = knownProvider.rdns;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
name: name,
|
|
74
|
+
rdns: rdns,
|
|
75
|
+
uuid: "injected-".concat(rdns.replace(/[^a-zA-Z0-9]/g, "-")),
|
|
76
|
+
icon: DEFAULT_PROVIDER_ICON,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Validates that a provider implements the required EIP-1193 interface
|
|
81
|
+
*
|
|
82
|
+
* @param provider The provider to validate
|
|
83
|
+
* @returns true if the provider has all required methods
|
|
84
|
+
*
|
|
85
|
+
* @example
|
|
86
|
+
* ```typescript
|
|
87
|
+
* if (isValidProvider(window.ethereum)) {
|
|
88
|
+
* // Safe to use provider
|
|
89
|
+
* }
|
|
90
|
+
* ```
|
|
91
|
+
*/
|
|
92
|
+
export function isValidProvider(provider) {
|
|
93
|
+
return (!!provider &&
|
|
94
|
+
typeof provider.request === "function" &&
|
|
95
|
+
typeof provider.on === "function" &&
|
|
96
|
+
typeof provider.removeListener === "function");
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=detection.js.map
|
|
@@ -45,10 +45,10 @@ var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
|
45
45
|
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
|
-
import { isNetworkError } from "
|
|
49
|
-
import { clampNumber, getActionDescriptor, hash, millisecondsToSecond, toDateHourMinute, } from "
|
|
48
|
+
import { isNetworkError } from "../validators";
|
|
49
|
+
import { clampNumber, getActionDescriptor, hash, millisecondsToSecond, toDateHourMinute, } from "../utils";
|
|
50
50
|
import { logger } from "../logger";
|
|
51
|
-
import { EVENTS_API_REQUEST_HEADER } from "
|
|
51
|
+
import { EVENTS_API_REQUEST_HEADER } from "../constants";
|
|
52
52
|
import fetch from "../fetch";
|
|
53
53
|
var noop = function () { };
|
|
54
54
|
var DEFAULT_RETRY = 3;
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session management for Formo Analytics
|
|
3
|
+
*
|
|
4
|
+
* Handles tracking of detected wallets and identified wallet-address pairs
|
|
5
|
+
* using cookies to maintain state across page loads within a session.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Cookie keys for session tracking
|
|
9
|
+
* NOTE: These values must match the original constants in constants/base.ts
|
|
10
|
+
* to maintain backward compatibility with existing user sessions
|
|
11
|
+
*/
|
|
12
|
+
export declare const SESSION_WALLET_DETECTED_KEY = "wallet-detected";
|
|
13
|
+
export declare const SESSION_WALLET_IDENTIFIED_KEY = "wallet-identified";
|
|
14
|
+
/**
|
|
15
|
+
* Interface for session management operations
|
|
16
|
+
*/
|
|
17
|
+
export interface IFormoAnalyticsSession {
|
|
18
|
+
/**
|
|
19
|
+
* Check if a wallet has been detected in this session
|
|
20
|
+
* @param rdns The reverse domain name (RDNS) of the wallet provider
|
|
21
|
+
*/
|
|
22
|
+
isWalletDetected(rdns: string): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Mark a wallet as detected in this session
|
|
25
|
+
* @param rdns The reverse domain name (RDNS) of the wallet provider
|
|
26
|
+
*/
|
|
27
|
+
markWalletDetected(rdns: string): void;
|
|
28
|
+
/**
|
|
29
|
+
* Check if a wallet-address pair has been identified in this session
|
|
30
|
+
* @param address The wallet address
|
|
31
|
+
* @param rdns The reverse domain name (RDNS) of the wallet provider
|
|
32
|
+
*/
|
|
33
|
+
isWalletIdentified(address: string, rdns: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Mark a wallet-address pair as identified in this session
|
|
36
|
+
* @param address The wallet address
|
|
37
|
+
* @param rdns The reverse domain name (RDNS) of the wallet provider
|
|
38
|
+
*/
|
|
39
|
+
markWalletIdentified(address: string, rdns: string): void;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Implementation of session management using cookies
|
|
43
|
+
*
|
|
44
|
+
* Tracks:
|
|
45
|
+
* - Detected wallets (by RDNS) - to prevent duplicate detection events
|
|
46
|
+
* - Identified wallet-address pairs - to prevent duplicate identification events
|
|
47
|
+
*
|
|
48
|
+
* Session data expires at end of day (86400 seconds).
|
|
49
|
+
*/
|
|
50
|
+
export declare class FormoAnalyticsSession implements IFormoAnalyticsSession {
|
|
51
|
+
/**
|
|
52
|
+
* Generate a unique key for wallet identification tracking
|
|
53
|
+
* Combines address and RDNS to track specific wallet-address combinations
|
|
54
|
+
*
|
|
55
|
+
* @param address The wallet address
|
|
56
|
+
* @param rdns The reverse domain name of the wallet provider
|
|
57
|
+
* @returns A unique identification key
|
|
58
|
+
*/
|
|
59
|
+
private generateIdentificationKey;
|
|
60
|
+
/**
|
|
61
|
+
* Check if a wallet provider has been detected in this session
|
|
62
|
+
*
|
|
63
|
+
* @param rdns The reverse domain name of the wallet provider
|
|
64
|
+
* @returns true if the wallet has been detected
|
|
65
|
+
*/
|
|
66
|
+
isWalletDetected(rdns: string): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Mark a wallet provider as detected in this session
|
|
69
|
+
* Prevents duplicate detection events from being emitted
|
|
70
|
+
*
|
|
71
|
+
* @param rdns The reverse domain name of the wallet provider
|
|
72
|
+
*/
|
|
73
|
+
markWalletDetected(rdns: string): void;
|
|
74
|
+
/**
|
|
75
|
+
* Check if a specific wallet-address combination has been identified
|
|
76
|
+
*
|
|
77
|
+
* @param address The wallet address
|
|
78
|
+
* @param rdns The reverse domain name of the wallet provider
|
|
79
|
+
* @returns true if this wallet-address pair has been identified
|
|
80
|
+
*/
|
|
81
|
+
isWalletIdentified(address: string, rdns: string): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Mark a wallet-address combination as identified in this session
|
|
84
|
+
* Prevents duplicate identification events from being emitted
|
|
85
|
+
*
|
|
86
|
+
* @param address The wallet address
|
|
87
|
+
* @param rdns The reverse domain name of the wallet provider
|
|
88
|
+
*/
|
|
89
|
+
markWalletIdentified(address: string, rdns: string): void;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Session management for Formo Analytics
|
|
3
|
+
*
|
|
4
|
+
* Handles tracking of detected wallets and identified wallet-address pairs
|
|
5
|
+
* using cookies to maintain state across page loads within a session.
|
|
6
|
+
*/
|
|
7
|
+
import { cookie } from "../storage";
|
|
8
|
+
import { logger } from "../logger";
|
|
9
|
+
/**
|
|
10
|
+
* Cookie keys for session tracking
|
|
11
|
+
* NOTE: These values must match the original constants in constants/base.ts
|
|
12
|
+
* to maintain backward compatibility with existing user sessions
|
|
13
|
+
*/
|
|
14
|
+
export var SESSION_WALLET_DETECTED_KEY = "wallet-detected";
|
|
15
|
+
export var SESSION_WALLET_IDENTIFIED_KEY = "wallet-identified";
|
|
16
|
+
/**
|
|
17
|
+
* Implementation of session management using cookies
|
|
18
|
+
*
|
|
19
|
+
* Tracks:
|
|
20
|
+
* - Detected wallets (by RDNS) - to prevent duplicate detection events
|
|
21
|
+
* - Identified wallet-address pairs - to prevent duplicate identification events
|
|
22
|
+
*
|
|
23
|
+
* Session data expires at end of day (86400 seconds).
|
|
24
|
+
*/
|
|
25
|
+
var FormoAnalyticsSession = /** @class */ (function () {
|
|
26
|
+
function FormoAnalyticsSession() {
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Generate a unique key for wallet identification tracking
|
|
30
|
+
* Combines address and RDNS to track specific wallet-address combinations
|
|
31
|
+
*
|
|
32
|
+
* @param address The wallet address
|
|
33
|
+
* @param rdns The reverse domain name of the wallet provider
|
|
34
|
+
* @returns A unique identification key
|
|
35
|
+
*/
|
|
36
|
+
FormoAnalyticsSession.prototype.generateIdentificationKey = function (address, rdns) {
|
|
37
|
+
// If rdns is missing, use address-only key as fallback for empty identifies
|
|
38
|
+
return rdns ? "".concat(address, ":").concat(rdns) : address;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Check if a wallet provider has been detected in this session
|
|
42
|
+
*
|
|
43
|
+
* @param rdns The reverse domain name of the wallet provider
|
|
44
|
+
* @returns true if the wallet has been detected
|
|
45
|
+
*/
|
|
46
|
+
FormoAnalyticsSession.prototype.isWalletDetected = function (rdns) {
|
|
47
|
+
var _a;
|
|
48
|
+
var rdnses = ((_a = cookie().get(SESSION_WALLET_DETECTED_KEY)) === null || _a === void 0 ? void 0 : _a.split(",")) || [];
|
|
49
|
+
return rdnses.includes(rdns);
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Mark a wallet provider as detected in this session
|
|
53
|
+
* Prevents duplicate detection events from being emitted
|
|
54
|
+
*
|
|
55
|
+
* @param rdns The reverse domain name of the wallet provider
|
|
56
|
+
*/
|
|
57
|
+
FormoAnalyticsSession.prototype.markWalletDetected = function (rdns) {
|
|
58
|
+
var _a;
|
|
59
|
+
var rdnses = ((_a = cookie().get(SESSION_WALLET_DETECTED_KEY)) === null || _a === void 0 ? void 0 : _a.split(",")) || [];
|
|
60
|
+
if (!rdnses.includes(rdns)) {
|
|
61
|
+
rdnses.push(rdns);
|
|
62
|
+
cookie().set(SESSION_WALLET_DETECTED_KEY, rdnses.join(","), {
|
|
63
|
+
// Expires by the end of the day
|
|
64
|
+
expires: new Date(Date.now() + 86400 * 1000).toUTCString(),
|
|
65
|
+
path: "/",
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* Check if a specific wallet-address combination has been identified
|
|
71
|
+
*
|
|
72
|
+
* @param address The wallet address
|
|
73
|
+
* @param rdns The reverse domain name of the wallet provider
|
|
74
|
+
* @returns true if this wallet-address pair has been identified
|
|
75
|
+
*/
|
|
76
|
+
FormoAnalyticsSession.prototype.isWalletIdentified = function (address, rdns) {
|
|
77
|
+
var identifiedKey = this.generateIdentificationKey(address, rdns);
|
|
78
|
+
var cookieValue = cookie().get(SESSION_WALLET_IDENTIFIED_KEY);
|
|
79
|
+
var identifiedWallets = (cookieValue === null || cookieValue === void 0 ? void 0 : cookieValue.split(",")) || [];
|
|
80
|
+
var isIdentified = identifiedWallets.includes(identifiedKey);
|
|
81
|
+
logger.debug("Session: Checking wallet identification", {
|
|
82
|
+
identifiedKey: identifiedKey,
|
|
83
|
+
isIdentified: isIdentified,
|
|
84
|
+
hasRdns: !!rdns,
|
|
85
|
+
});
|
|
86
|
+
return isIdentified;
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Mark a wallet-address combination as identified in this session
|
|
90
|
+
* Prevents duplicate identification events from being emitted
|
|
91
|
+
*
|
|
92
|
+
* @param address The wallet address
|
|
93
|
+
* @param rdns The reverse domain name of the wallet provider
|
|
94
|
+
*/
|
|
95
|
+
FormoAnalyticsSession.prototype.markWalletIdentified = function (address, rdns) {
|
|
96
|
+
var _a;
|
|
97
|
+
var identifiedKey = this.generateIdentificationKey(address, rdns);
|
|
98
|
+
var identifiedWallets = ((_a = cookie().get(SESSION_WALLET_IDENTIFIED_KEY)) === null || _a === void 0 ? void 0 : _a.split(",")) || [];
|
|
99
|
+
if (!identifiedWallets.includes(identifiedKey)) {
|
|
100
|
+
identifiedWallets.push(identifiedKey);
|
|
101
|
+
var newValue = identifiedWallets.join(",");
|
|
102
|
+
cookie().set(SESSION_WALLET_IDENTIFIED_KEY, newValue, {
|
|
103
|
+
// Expires by the end of the day
|
|
104
|
+
expires: new Date(Date.now() + 86400 * 1000).toUTCString(),
|
|
105
|
+
path: "/",
|
|
106
|
+
});
|
|
107
|
+
logger.debug("Session: Marked wallet as identified", {
|
|
108
|
+
identifiedKey: identifiedKey,
|
|
109
|
+
hasRdns: !!rdns,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
logger.info("Session: Wallet already marked as identified", {
|
|
114
|
+
identifiedKey: identifiedKey,
|
|
115
|
+
existingWallets: identifiedWallets,
|
|
116
|
+
hasRdns: !!rdns,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
return FormoAnalyticsSession;
|
|
121
|
+
}());
|
|
122
|
+
export { FormoAnalyticsSession };
|
|
123
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LogLevel } from "../
|
|
1
|
+
import { LogLevel } from "../logger";
|
|
2
2
|
import { IFormoEventContext, IFormoEventProperties, SignatureStatus, TransactionStatus } from "./events";
|
|
3
3
|
import { EIP1193Provider } from "./provider";
|
|
4
4
|
import { ReactNode } from "react";
|
|
@@ -9,6 +9,7 @@ export type ValidInputTypes = Uint8Array | bigint | string | number | boolean;
|
|
|
9
9
|
export interface IFormoAnalytics {
|
|
10
10
|
page(category?: string, name?: string, properties?: IFormoEventProperties, context?: IFormoEventContext, callback?: (...args: unknown[]) => void): Promise<void>;
|
|
11
11
|
reset(): void;
|
|
12
|
+
cleanup(): void;
|
|
12
13
|
detect(params: {
|
|
13
14
|
rdns: string;
|
|
14
15
|
providerName: string;
|
|
@@ -112,6 +113,23 @@ export interface ReferralOptions {
|
|
|
112
113
|
*/
|
|
113
114
|
pathPattern?: string;
|
|
114
115
|
}
|
|
116
|
+
/**
|
|
117
|
+
* Configuration options for Wagmi integration
|
|
118
|
+
* Allows the SDK to hook into Wagmi v2 wallet events instead of wrapping EIP-1193 providers
|
|
119
|
+
*/
|
|
120
|
+
export interface WagmiOptions {
|
|
121
|
+
/**
|
|
122
|
+
* Wagmi config instance from createConfig()
|
|
123
|
+
* The SDK will subscribe to this config's state changes to track wallet events
|
|
124
|
+
*/
|
|
125
|
+
config: any;
|
|
126
|
+
/**
|
|
127
|
+
* Optional QueryClient instance from @tanstack/react-query
|
|
128
|
+
* Required for tracking signature and transaction events via mutation cache
|
|
129
|
+
* If not provided, only connection/disconnection/chain events will be tracked
|
|
130
|
+
*/
|
|
131
|
+
queryClient?: any;
|
|
132
|
+
}
|
|
115
133
|
export interface Options {
|
|
116
134
|
provider?: EIP1193Provider;
|
|
117
135
|
tracking?: boolean | TrackingOptions;
|
|
@@ -123,6 +141,14 @@ export interface Options {
|
|
|
123
141
|
* @default true
|
|
124
142
|
*/
|
|
125
143
|
autocapture?: boolean | AutocaptureOptions;
|
|
144
|
+
/**
|
|
145
|
+
* Wagmi integration configuration
|
|
146
|
+
* When provided, the SDK will hook into Wagmi's event system instead of wrapping EIP-1193 providers
|
|
147
|
+
* This replaces the default provider tracking with Wagmi's config.subscribe() and MutationCache
|
|
148
|
+
* @requires wagmi@>=2.0.0
|
|
149
|
+
* @requires @tanstack/react-query@>=5.0.0 (for mutation tracking)
|
|
150
|
+
*/
|
|
151
|
+
wagmi?: WagmiOptions;
|
|
126
152
|
/**
|
|
127
153
|
* Custom API host for sending events through your own domain to bypass ad blockers
|
|
128
154
|
* - If not provided, events are sent directly to events.formo.so
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "1.
|
|
1
|
+
export declare const version = "1.26.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/esm/src/version.js
CHANGED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WagmiEventHandler
|
|
3
|
+
*
|
|
4
|
+
* Handles wallet event tracking by hooking into Wagmi v2's config.subscribe()
|
|
5
|
+
* and TanStack Query's MutationCache. This replaces the EIP-1193 provider
|
|
6
|
+
* wrapping approach when Wagmi mode is enabled.
|
|
7
|
+
*/
|
|
8
|
+
import { FormoAnalytics } from "../FormoAnalytics";
|
|
9
|
+
import { WagmiConfig, QueryClient } from "./types";
|
|
10
|
+
export declare class WagmiEventHandler {
|
|
11
|
+
private formo;
|
|
12
|
+
private wagmiConfig;
|
|
13
|
+
private queryClient?;
|
|
14
|
+
private unsubscribers;
|
|
15
|
+
private trackingState;
|
|
16
|
+
/**
|
|
17
|
+
* Track processed mutation states to prevent duplicate event emissions
|
|
18
|
+
* Key format: `${mutationId}:${status}`
|
|
19
|
+
*/
|
|
20
|
+
private processedMutations;
|
|
21
|
+
constructor(formoAnalytics: FormoAnalytics, wagmiConfig: WagmiConfig, queryClient?: QueryClient);
|
|
22
|
+
/**
|
|
23
|
+
* Set up listeners for wallet connection, disconnection, and chain changes
|
|
24
|
+
*/
|
|
25
|
+
private setupConnectionListeners;
|
|
26
|
+
/**
|
|
27
|
+
* Handle status changes (connect/disconnect)
|
|
28
|
+
*/
|
|
29
|
+
private handleStatusChange;
|
|
30
|
+
/**
|
|
31
|
+
* Handle chain ID changes
|
|
32
|
+
*/
|
|
33
|
+
private handleChainChange;
|
|
34
|
+
/**
|
|
35
|
+
* Set up mutation tracking for signatures and transactions
|
|
36
|
+
*/
|
|
37
|
+
private setupMutationTracking;
|
|
38
|
+
/**
|
|
39
|
+
* Handle mutation cache events (signatures, transactions)
|
|
40
|
+
*/
|
|
41
|
+
private handleMutationEvent;
|
|
42
|
+
/**
|
|
43
|
+
* Handle signature mutations (signMessage, signTypedData)
|
|
44
|
+
*/
|
|
45
|
+
private handleSignatureMutation;
|
|
46
|
+
/**
|
|
47
|
+
* Handle transaction mutations (sendTransaction, writeContract)
|
|
48
|
+
*/
|
|
49
|
+
private handleTransactionMutation;
|
|
50
|
+
/**
|
|
51
|
+
* Get the current Wagmi state
|
|
52
|
+
* Supports both getState() method and direct state property access
|
|
53
|
+
* for compatibility with different Wagmi wrappers (RainbowKit, etc.)
|
|
54
|
+
*/
|
|
55
|
+
private getState;
|
|
56
|
+
/**
|
|
57
|
+
* Get the currently connected address from Wagmi state
|
|
58
|
+
*/
|
|
59
|
+
private getConnectedAddress;
|
|
60
|
+
/**
|
|
61
|
+
* Get the connector name from Wagmi state
|
|
62
|
+
*/
|
|
63
|
+
private getConnectorName;
|
|
64
|
+
/**
|
|
65
|
+
* Clean up all subscriptions
|
|
66
|
+
*/
|
|
67
|
+
cleanup(): void;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=WagmiEventHandler.d.ts.map
|