@formo/analytics 1.16.4 → 1.16.6
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/dist/cjs/src/FormoAnalytics.d.ts +69 -38
- package/dist/cjs/src/FormoAnalytics.d.ts.map +1 -1
- package/dist/cjs/src/FormoAnalytics.js +143 -198
- package/dist/cjs/src/FormoAnalytics.js.map +1 -1
- package/dist/cjs/src/FormoAnalyticsProvider.js +5 -5
- package/dist/cjs/src/FormoAnalyticsProvider.js.map +1 -1
- package/dist/cjs/src/constants/config.d.ts +1 -1
- package/dist/cjs/src/constants/config.d.ts.map +1 -1
- package/dist/cjs/src/constants/config.js +1 -1
- package/dist/cjs/src/constants/config.js.map +1 -1
- package/dist/cjs/src/constants/events.d.ts +14 -5
- package/dist/cjs/src/constants/events.d.ts.map +1 -1
- package/dist/cjs/src/constants/events.js +20 -12
- package/dist/cjs/src/constants/events.js.map +1 -1
- package/dist/cjs/src/lib/event/EventFactory.d.ts +22 -54
- package/dist/cjs/src/lib/event/EventFactory.d.ts.map +1 -1
- package/dist/cjs/src/lib/event/EventFactory.js +187 -116
- package/dist/cjs/src/lib/event/EventFactory.js.map +1 -1
- package/dist/cjs/src/lib/event/EventManager.d.ts +22 -0
- package/dist/cjs/src/lib/event/EventManager.d.ts.map +1 -0
- package/dist/cjs/src/lib/event/EventManager.js +48 -0
- package/dist/cjs/src/lib/event/EventManager.js.map +1 -0
- package/dist/cjs/src/lib/event/constants.d.ts +4 -0
- package/dist/cjs/src/lib/event/constants.d.ts.map +1 -0
- package/dist/cjs/src/lib/event/constants.js +8 -0
- package/dist/cjs/src/lib/event/constants.js.map +1 -0
- package/dist/cjs/src/lib/event/index.d.ts +1 -0
- package/dist/cjs/src/lib/event/index.d.ts.map +1 -1
- package/dist/cjs/src/lib/event/index.js +1 -0
- package/dist/cjs/src/lib/event/index.js.map +1 -1
- package/dist/cjs/src/lib/event/type.d.ts +5 -3
- package/dist/cjs/src/lib/event/type.d.ts.map +1 -1
- package/dist/cjs/src/lib/event/utils.d.ts +4 -0
- package/dist/cjs/src/lib/event/utils.d.ts.map +1 -0
- package/dist/cjs/src/lib/event/utils.js +16 -0
- package/dist/cjs/src/lib/event/utils.js.map +1 -0
- package/dist/cjs/src/lib/fetch.d.ts +1 -1
- package/dist/cjs/src/lib/queue/EventQueue.d.ts +1 -0
- package/dist/cjs/src/lib/queue/EventQueue.d.ts.map +1 -1
- package/dist/cjs/src/lib/queue/EventQueue.js +20 -12
- package/dist/cjs/src/lib/queue/EventQueue.js.map +1 -1
- package/dist/cjs/src/lib/ramda/internal/_curry1.d.ts +10 -0
- package/dist/cjs/src/lib/ramda/internal/_curry1.d.ts.map +1 -0
- package/dist/cjs/src/lib/ramda/internal/_curry1.js +26 -0
- package/dist/cjs/src/lib/ramda/internal/_curry1.js.map +1 -0
- package/dist/cjs/src/lib/ramda/internal/_curry2.d.ts +10 -0
- package/dist/cjs/src/lib/ramda/internal/_curry2.d.ts.map +1 -0
- package/dist/cjs/src/lib/ramda/internal/_curry2.js +43 -0
- package/dist/cjs/src/lib/ramda/internal/_curry2.js.map +1 -0
- package/dist/cjs/src/lib/ramda/internal/_curry3.d.ts +10 -0
- package/dist/cjs/src/lib/ramda/internal/_curry3.d.ts.map +1 -0
- package/dist/cjs/src/lib/ramda/internal/_curry3.js +74 -0
- package/dist/cjs/src/lib/ramda/internal/_curry3.js.map +1 -0
- package/dist/cjs/src/lib/ramda/internal/_has.d.ts +2 -0
- package/dist/cjs/src/lib/ramda/internal/_has.d.ts.map +1 -0
- package/dist/cjs/src/lib/ramda/internal/_has.js +7 -0
- package/dist/cjs/src/lib/ramda/internal/_has.js.map +1 -0
- package/dist/cjs/src/lib/ramda/internal/_isObject.d.ts +2 -0
- package/dist/cjs/src/lib/ramda/internal/_isObject.d.ts.map +1 -0
- package/dist/cjs/src/lib/ramda/internal/_isObject.js +7 -0
- package/dist/cjs/src/lib/ramda/internal/_isObject.js.map +1 -0
- package/dist/cjs/src/lib/ramda/internal/_isPlaceholder.d.ts +2 -0
- package/dist/cjs/src/lib/ramda/internal/_isPlaceholder.d.ts.map +1 -0
- package/dist/cjs/src/lib/ramda/internal/_isPlaceholder.js +7 -0
- package/dist/cjs/src/lib/ramda/internal/_isPlaceholder.js.map +1 -0
- package/dist/cjs/src/lib/ramda/mergeDeepRight.d.ts +3 -0
- package/dist/cjs/src/lib/ramda/mergeDeepRight.d.ts.map +1 -0
- package/dist/cjs/src/lib/ramda/mergeDeepRight.js +14 -0
- package/dist/cjs/src/lib/ramda/mergeDeepRight.js.map +1 -0
- package/dist/cjs/src/lib/ramda/mergeDeepWithKey.d.ts +3 -0
- package/dist/cjs/src/lib/ramda/mergeDeepWithKey.d.ts.map +1 -0
- package/dist/cjs/src/lib/ramda/mergeDeepWithKey.js +20 -0
- package/dist/cjs/src/lib/ramda/mergeDeepWithKey.js.map +1 -0
- package/dist/cjs/src/lib/ramda/mergeWithKey.d.ts +3 -0
- package/dist/cjs/src/lib/ramda/mergeWithKey.d.ts.map +1 -0
- package/dist/cjs/src/lib/ramda/mergeWithKey.js +26 -0
- package/dist/cjs/src/lib/ramda/mergeWithKey.js.map +1 -0
- package/dist/cjs/src/lib/storage/native.d.ts +1 -0
- package/dist/cjs/src/lib/storage/native.d.ts.map +1 -1
- package/dist/cjs/src/lib/storage/native.js +3 -0
- package/dist/cjs/src/lib/storage/native.js.map +1 -1
- package/dist/cjs/src/lib/version.d.ts +2 -0
- package/dist/cjs/src/lib/version.d.ts.map +1 -0
- package/dist/cjs/src/lib/version.js +6 -0
- package/dist/cjs/src/lib/version.js.map +1 -0
- package/dist/cjs/src/types/base.d.ts +1 -0
- package/dist/cjs/src/types/base.d.ts.map +1 -1
- package/dist/cjs/src/types/events.d.ts +55 -27
- package/dist/cjs/src/types/events.d.ts.map +1 -1
- package/dist/cjs/src/types/events.js.map +1 -1
- package/dist/cjs/src/utils/base.d.ts +1 -1
- package/dist/cjs/src/utils/base.d.ts.map +1 -1
- package/dist/cjs/src/utils/base.js +2 -2
- package/dist/cjs/src/utils/base.js.map +1 -1
- package/dist/cjs/src/utils/timestamp.d.ts +8 -0
- package/dist/cjs/src/utils/timestamp.d.ts.map +1 -0
- package/dist/cjs/src/utils/timestamp.js +12 -0
- package/dist/cjs/src/utils/timestamp.js.map +1 -0
- package/dist/cjs/src/validators/checks.d.ts +77 -0
- package/dist/cjs/src/validators/checks.d.ts.map +1 -0
- package/dist/cjs/src/validators/checks.js +141 -0
- package/dist/cjs/src/validators/checks.js.map +1 -0
- package/dist/cjs/src/validators/index.d.ts +1 -1
- package/dist/cjs/src/validators/index.d.ts.map +1 -1
- package/dist/cjs/src/validators/index.js +1 -1
- package/dist/cjs/src/validators/index.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/src/FormoAnalytics.d.ts +69 -38
- package/dist/esm/src/FormoAnalytics.d.ts.map +1 -1
- package/dist/esm/src/FormoAnalytics.js +146 -201
- package/dist/esm/src/FormoAnalytics.js.map +1 -1
- package/dist/esm/src/FormoAnalyticsProvider.js +5 -5
- package/dist/esm/src/FormoAnalyticsProvider.js.map +1 -1
- package/dist/esm/src/constants/config.d.ts +1 -1
- package/dist/esm/src/constants/config.d.ts.map +1 -1
- package/dist/esm/src/constants/config.js +1 -1
- package/dist/esm/src/constants/config.js.map +1 -1
- package/dist/esm/src/constants/events.d.ts +14 -5
- package/dist/esm/src/constants/events.d.ts.map +1 -1
- package/dist/esm/src/constants/events.js +19 -11
- package/dist/esm/src/constants/events.js.map +1 -1
- package/dist/esm/src/lib/event/EventFactory.d.ts +22 -54
- package/dist/esm/src/lib/event/EventFactory.d.ts.map +1 -1
- package/dist/esm/src/lib/event/EventFactory.js +185 -117
- package/dist/esm/src/lib/event/EventFactory.js.map +1 -1
- package/dist/esm/src/lib/event/EventManager.d.ts +22 -0
- package/dist/esm/src/lib/event/EventManager.d.ts.map +1 -0
- package/dist/esm/src/lib/event/EventManager.js +45 -0
- package/dist/esm/src/lib/event/EventManager.js.map +1 -0
- package/dist/esm/src/lib/event/constants.d.ts +4 -0
- package/dist/esm/src/lib/event/constants.d.ts.map +1 -0
- package/dist/esm/src/lib/event/constants.js +4 -0
- package/dist/esm/src/lib/event/constants.js.map +1 -0
- package/dist/esm/src/lib/event/index.d.ts +1 -0
- package/dist/esm/src/lib/event/index.d.ts.map +1 -1
- package/dist/esm/src/lib/event/index.js +1 -0
- package/dist/esm/src/lib/event/index.js.map +1 -1
- package/dist/esm/src/lib/event/type.d.ts +5 -3
- package/dist/esm/src/lib/event/type.d.ts.map +1 -1
- package/dist/esm/src/lib/event/utils.d.ts +4 -0
- package/dist/esm/src/lib/event/utils.d.ts.map +1 -0
- package/dist/esm/src/lib/event/utils.js +13 -0
- package/dist/esm/src/lib/event/utils.js.map +1 -0
- package/dist/esm/src/lib/queue/EventQueue.d.ts +1 -0
- package/dist/esm/src/lib/queue/EventQueue.d.ts.map +1 -1
- package/dist/esm/src/lib/queue/EventQueue.js +20 -12
- package/dist/esm/src/lib/queue/EventQueue.js.map +1 -1
- package/dist/esm/src/lib/ramda/internal/_curry1.d.ts +10 -0
- package/dist/esm/src/lib/ramda/internal/_curry1.d.ts.map +1 -0
- package/dist/esm/src/lib/ramda/internal/_curry1.js +20 -0
- package/dist/esm/src/lib/ramda/internal/_curry1.js.map +1 -0
- package/dist/esm/src/lib/ramda/internal/_curry2.d.ts +10 -0
- package/dist/esm/src/lib/ramda/internal/_curry2.d.ts.map +1 -0
- package/dist/esm/src/lib/ramda/internal/_curry2.js +37 -0
- package/dist/esm/src/lib/ramda/internal/_curry2.js.map +1 -0
- package/dist/esm/src/lib/ramda/internal/_curry3.d.ts +10 -0
- package/dist/esm/src/lib/ramda/internal/_curry3.d.ts.map +1 -0
- package/dist/esm/src/lib/ramda/internal/_curry3.js +68 -0
- package/dist/esm/src/lib/ramda/internal/_curry3.js.map +1 -0
- package/dist/esm/src/lib/ramda/internal/_has.d.ts +2 -0
- package/dist/esm/src/lib/ramda/internal/_has.d.ts.map +1 -0
- package/dist/esm/src/lib/ramda/internal/_has.js +4 -0
- package/dist/esm/src/lib/ramda/internal/_has.js.map +1 -0
- package/dist/esm/src/lib/ramda/internal/_isObject.d.ts +2 -0
- package/dist/esm/src/lib/ramda/internal/_isObject.d.ts.map +1 -0
- package/dist/esm/src/lib/ramda/internal/_isObject.js +4 -0
- package/dist/esm/src/lib/ramda/internal/_isObject.js.map +1 -0
- package/dist/esm/src/lib/ramda/internal/_isPlaceholder.d.ts +2 -0
- package/dist/esm/src/lib/ramda/internal/_isPlaceholder.d.ts.map +1 -0
- package/dist/esm/src/lib/ramda/internal/_isPlaceholder.js +4 -0
- package/dist/esm/src/lib/ramda/internal/_isPlaceholder.js.map +1 -0
- package/dist/esm/src/lib/ramda/mergeDeepRight.d.ts +3 -0
- package/dist/esm/src/lib/ramda/mergeDeepRight.d.ts.map +1 -0
- package/dist/esm/src/lib/ramda/mergeDeepRight.js +9 -0
- package/dist/esm/src/lib/ramda/mergeDeepRight.js.map +1 -0
- package/dist/esm/src/lib/ramda/mergeDeepWithKey.d.ts +3 -0
- package/dist/esm/src/lib/ramda/mergeDeepWithKey.d.ts.map +1 -0
- package/dist/esm/src/lib/ramda/mergeDeepWithKey.js +15 -0
- package/dist/esm/src/lib/ramda/mergeDeepWithKey.js.map +1 -0
- package/dist/esm/src/lib/ramda/mergeWithKey.d.ts +3 -0
- package/dist/esm/src/lib/ramda/mergeWithKey.d.ts.map +1 -0
- package/dist/esm/src/lib/ramda/mergeWithKey.js +21 -0
- package/dist/esm/src/lib/ramda/mergeWithKey.js.map +1 -0
- package/dist/esm/src/lib/storage/native.d.ts +1 -0
- package/dist/esm/src/lib/storage/native.d.ts.map +1 -1
- package/dist/esm/src/lib/storage/native.js +3 -0
- package/dist/esm/src/lib/storage/native.js.map +1 -1
- package/dist/esm/src/lib/version.d.ts +2 -0
- package/dist/esm/src/lib/version.d.ts.map +1 -0
- package/dist/esm/src/lib/version.js +3 -0
- package/dist/esm/src/lib/version.js.map +1 -0
- package/dist/esm/src/types/base.d.ts +1 -0
- package/dist/esm/src/types/base.d.ts.map +1 -1
- package/dist/esm/src/types/events.d.ts +55 -27
- package/dist/esm/src/types/events.d.ts.map +1 -1
- package/dist/esm/src/types/events.js.map +1 -1
- package/dist/esm/src/utils/base.d.ts +1 -1
- package/dist/esm/src/utils/base.d.ts.map +1 -1
- package/dist/esm/src/utils/base.js +2 -2
- package/dist/esm/src/utils/base.js.map +1 -1
- package/dist/esm/src/utils/timestamp.d.ts +8 -0
- package/dist/esm/src/utils/timestamp.d.ts.map +1 -0
- package/dist/esm/src/utils/timestamp.js +8 -0
- package/dist/esm/src/utils/timestamp.js.map +1 -0
- package/dist/esm/src/validators/checks.d.ts +77 -0
- package/dist/esm/src/validators/checks.d.ts.map +1 -0
- package/dist/esm/src/validators/checks.js +119 -0
- package/dist/esm/src/validators/checks.js.map +1 -0
- package/dist/esm/src/validators/index.d.ts +1 -1
- package/dist/esm/src/validators/index.d.ts.map +1 -1
- package/dist/esm/src/validators/index.js +1 -1
- package/dist/esm/src/validators/index.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 +3 -2
- package/src/FormoAnalytics.ts +380 -242
- package/src/FormoAnalyticsProvider.tsx +5 -5
- package/src/constants/config.ts +1 -1
- package/src/constants/events.ts +15 -4
- package/src/lib/event/EventFactory.ts +358 -163
- package/src/lib/event/EventManager.ts +39 -0
- package/src/lib/event/constants.ts +4 -0
- package/src/lib/event/index.ts +1 -0
- package/src/lib/event/type.ts +6 -8
- package/src/lib/event/utils.ts +15 -0
- package/src/lib/queue/EventQueue.ts +22 -10
- package/src/lib/ramda/internal/_curry1.ts +19 -0
- package/src/lib/ramda/internal/_curry2.ts +37 -0
- package/src/lib/ramda/internal/_curry3.ts +68 -0
- package/src/lib/ramda/internal/_has.ts +3 -0
- package/src/lib/ramda/internal/_isObject.ts +3 -0
- package/src/lib/ramda/internal/_isPlaceholder.ts +5 -0
- package/src/lib/ramda/mergeDeepRight.ts +13 -0
- package/src/lib/ramda/mergeDeepWithKey.ts +22 -0
- package/src/lib/ramda/mergeWithKey.ts +28 -0
- package/src/lib/storage/native.ts +4 -0
- package/src/lib/version.ts +2 -0
- package/src/types/base.ts +1 -0
- package/src/types/events.ts +93 -58
- package/src/utils/base.ts +2 -2
- package/src/utils/timestamp.ts +9 -0
- package/src/validators/checks.ts +160 -0
- package/src/validators/index.ts +1 -1
- package/tsconfig.json +1 -1
- package/dist/cjs/src/validators/type-check.d.ts +0 -14
- package/dist/cjs/src/validators/type-check.d.ts.map +0 -1
- package/dist/cjs/src/validators/type-check.js +0 -61
- package/dist/cjs/src/validators/type-check.js.map +0 -1
- package/dist/esm/src/validators/type-check.d.ts +0 -14
- package/dist/esm/src/validators/type-check.d.ts.map +0 -1
- package/dist/esm/src/validators/type-check.js +0 -46
- package/dist/esm/src/validators/type-check.js.map +0 -1
- package/src/validators/type-check.ts +0 -61
package/src/FormoAnalytics.ts
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import { UUID } from "crypto";
|
|
2
1
|
import { createStore, EIP6963ProviderDetail } from "mipd";
|
|
3
2
|
import {
|
|
4
|
-
Event,
|
|
5
3
|
EVENTS_API_URL,
|
|
4
|
+
EventType,
|
|
6
5
|
LOCAL_ANONYMOUS_ID_KEY,
|
|
7
6
|
SESSION_CURRENT_URL_KEY,
|
|
8
7
|
SESSION_USER_ID_KEY,
|
|
9
8
|
SESSION_WALLET_DETECTED_KEY,
|
|
9
|
+
TEventType,
|
|
10
10
|
} from "./constants";
|
|
11
11
|
import {
|
|
12
|
-
|
|
12
|
+
EventManager,
|
|
13
13
|
EventQueue,
|
|
14
|
-
|
|
14
|
+
IEventManager,
|
|
15
15
|
local,
|
|
16
16
|
logger,
|
|
17
17
|
Logger,
|
|
@@ -22,62 +22,104 @@ import {
|
|
|
22
22
|
ChainID,
|
|
23
23
|
Config,
|
|
24
24
|
EIP1193Provider,
|
|
25
|
+
IFormoEventContext,
|
|
26
|
+
IFormoEventProperties,
|
|
25
27
|
Options,
|
|
26
28
|
RequestArguments,
|
|
27
29
|
RPCError,
|
|
28
30
|
SignatureStatus,
|
|
29
31
|
TransactionStatus,
|
|
30
32
|
} from "./types";
|
|
31
|
-
import {
|
|
32
|
-
import { isAddress, isArray, isLocalhost } from "./validators";
|
|
33
|
+
import { isAddress, isLocalhost } from "./validators";
|
|
33
34
|
|
|
34
35
|
interface IFormoAnalytics {
|
|
35
|
-
page(
|
|
36
|
+
page(
|
|
37
|
+
category?: string,
|
|
38
|
+
name?: string,
|
|
39
|
+
properties?: IFormoEventProperties,
|
|
40
|
+
context?: IFormoEventContext,
|
|
41
|
+
callback?: (...args: unknown[]) => void
|
|
42
|
+
): void;
|
|
36
43
|
reset(): void;
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
address
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
44
|
+
detect(
|
|
45
|
+
params: { rdns: string; providerName: string },
|
|
46
|
+
properties?: IFormoEventProperties,
|
|
47
|
+
context?: IFormoEventContext,
|
|
48
|
+
callback?: (...args: unknown[]) => void
|
|
49
|
+
): Promise<void>;
|
|
50
|
+
connect(
|
|
51
|
+
params: { chainId: ChainID; address: Address },
|
|
52
|
+
properties?: IFormoEventProperties,
|
|
53
|
+
context?: IFormoEventContext,
|
|
54
|
+
callback?: (...args: unknown[]) => void
|
|
55
|
+
): Promise<void>;
|
|
56
|
+
disconnect(
|
|
57
|
+
params?: { chainId?: ChainID; address?: Address },
|
|
58
|
+
properties?: IFormoEventProperties,
|
|
59
|
+
context?: IFormoEventContext,
|
|
60
|
+
callback?: (...args: unknown[]) => void
|
|
61
|
+
): Promise<void>;
|
|
62
|
+
chain(
|
|
63
|
+
params: { chainId: ChainID; address?: Address },
|
|
64
|
+
properties?: IFormoEventProperties,
|
|
65
|
+
context?: IFormoEventContext,
|
|
66
|
+
callback?: (...args: unknown[]) => void
|
|
67
|
+
): Promise<void>;
|
|
68
|
+
signature(
|
|
69
|
+
params: {
|
|
70
|
+
status: SignatureStatus;
|
|
71
|
+
chainId?: ChainID;
|
|
72
|
+
address: Address;
|
|
73
|
+
message: string;
|
|
74
|
+
signatureHash?: string;
|
|
75
|
+
},
|
|
76
|
+
properties?: IFormoEventProperties,
|
|
77
|
+
context?: IFormoEventContext,
|
|
78
|
+
callback?: (...args: unknown[]) => void
|
|
79
|
+
): Promise<void>;
|
|
80
|
+
transaction(
|
|
81
|
+
params: {
|
|
82
|
+
status: TransactionStatus;
|
|
83
|
+
chainId: ChainID;
|
|
84
|
+
address: Address;
|
|
85
|
+
data?: string;
|
|
86
|
+
to?: string;
|
|
87
|
+
value?: string;
|
|
88
|
+
transactionHash?: string;
|
|
89
|
+
},
|
|
90
|
+
properties?: IFormoEventProperties,
|
|
91
|
+
context?: IFormoEventContext,
|
|
92
|
+
callback?: (...args: unknown[]) => void
|
|
93
|
+
): Promise<void>;
|
|
56
94
|
identify(
|
|
57
|
-
params
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
95
|
+
params: {
|
|
96
|
+
address: Address;
|
|
97
|
+
providerName?: string;
|
|
98
|
+
userId?: string;
|
|
99
|
+
rdns?: string;
|
|
100
|
+
},
|
|
101
|
+
properties?: IFormoEventProperties,
|
|
102
|
+
context?: IFormoEventContext,
|
|
103
|
+
callback?: (...args: unknown[]) => void
|
|
104
|
+
): Promise<void>;
|
|
105
|
+
track(
|
|
106
|
+
event: string,
|
|
107
|
+
properties?: IFormoEventProperties,
|
|
108
|
+
context?: IFormoEventContext,
|
|
109
|
+
callback?: (...args: unknown[]) => void
|
|
65
110
|
): Promise<void>;
|
|
66
|
-
track(action: string, payload: Record<string, any>): Promise<void>;
|
|
67
111
|
}
|
|
68
112
|
|
|
69
113
|
export class FormoAnalytics implements IFormoAnalytics {
|
|
70
114
|
private _provider?: EIP1193Provider;
|
|
71
115
|
private _providerListeners: Record<string, (...args: unknown[]) => void> = {};
|
|
72
116
|
private session: FormoAnalyticsSession;
|
|
73
|
-
private
|
|
74
|
-
private anonymousId: UUID | null = null;
|
|
75
|
-
private userId: string | null = null;
|
|
76
|
-
private eventFactory: IEventFactory;
|
|
117
|
+
private eventManager: IEventManager;
|
|
77
118
|
|
|
78
119
|
config: Config;
|
|
79
120
|
currentChainId?: ChainID;
|
|
80
|
-
|
|
121
|
+
currentAddress?: Address;
|
|
122
|
+
currentUserId?: string;
|
|
81
123
|
|
|
82
124
|
private constructor(
|
|
83
125
|
public readonly writeKey: string,
|
|
@@ -89,6 +131,8 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
89
131
|
};
|
|
90
132
|
|
|
91
133
|
this.session = new FormoAnalyticsSession();
|
|
134
|
+
this.currentUserId =
|
|
135
|
+
(session.get(SESSION_USER_ID_KEY) as string) || undefined;
|
|
92
136
|
|
|
93
137
|
// Initialize logger with configuration from options
|
|
94
138
|
Logger.init({
|
|
@@ -96,18 +140,15 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
96
140
|
enabledLevels: options.logger?.levels || [],
|
|
97
141
|
});
|
|
98
142
|
|
|
99
|
-
this.
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
this.anonymousId = this.getAnonymousId();
|
|
110
|
-
this.userId = session.get(SESSION_USER_ID_KEY) as string | null;
|
|
143
|
+
this.eventManager = new EventManager(
|
|
144
|
+
new EventQueue(this.config.writeKey, {
|
|
145
|
+
url: EVENTS_API_URL,
|
|
146
|
+
flushAt: options.flushAt,
|
|
147
|
+
retryCount: options.retryCount,
|
|
148
|
+
maxQueueSize: options.maxQueueSize,
|
|
149
|
+
flushInterval: options.flushInterval,
|
|
150
|
+
})
|
|
151
|
+
);
|
|
111
152
|
|
|
112
153
|
// TODO: replace with eip6963
|
|
113
154
|
const provider = options.provider || window?.ethereum;
|
|
@@ -125,9 +166,9 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
125
166
|
): Promise<FormoAnalytics> {
|
|
126
167
|
const analytics = new FormoAnalytics(writeKey, options);
|
|
127
168
|
|
|
128
|
-
//
|
|
169
|
+
// Auto-detect wallet provider
|
|
129
170
|
const providers = await analytics.getProviders();
|
|
130
|
-
await analytics.
|
|
171
|
+
await analytics.detectWallets(providers);
|
|
131
172
|
|
|
132
173
|
return analytics;
|
|
133
174
|
}
|
|
@@ -138,10 +179,19 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
138
179
|
|
|
139
180
|
/**
|
|
140
181
|
* Emits a page visit event with the current URL information, fire on page change.
|
|
182
|
+
* @param {string} category - The category of the page
|
|
183
|
+
* @param {string} name - The name of the page
|
|
184
|
+
* @param {Record<string, any>} properties - Additional properties to include
|
|
185
|
+
* @param {Record<string, any>} context - Additional context to include
|
|
141
186
|
* @returns {Promise<void>}
|
|
142
187
|
*/
|
|
143
|
-
public async page(
|
|
144
|
-
|
|
188
|
+
public async page(
|
|
189
|
+
category?: string,
|
|
190
|
+
name?: string,
|
|
191
|
+
properties?: IFormoEventProperties,
|
|
192
|
+
context?: IFormoEventContext
|
|
193
|
+
): Promise<void> {
|
|
194
|
+
await this.trackPageHit(category, name, properties, context);
|
|
145
195
|
}
|
|
146
196
|
|
|
147
197
|
/**
|
|
@@ -149,26 +199,33 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
149
199
|
* @returns {void}
|
|
150
200
|
*/
|
|
151
201
|
public reset(): void {
|
|
152
|
-
this.
|
|
153
|
-
this.userId = null;
|
|
202
|
+
this.currentUserId = undefined;
|
|
154
203
|
local.remove(LOCAL_ANONYMOUS_ID_KEY);
|
|
155
204
|
session.remove(SESSION_USER_ID_KEY);
|
|
156
205
|
}
|
|
157
206
|
|
|
158
207
|
/**
|
|
159
|
-
* Emits a wallet
|
|
208
|
+
* Emits a connect wallet event.
|
|
160
209
|
* @param {ChainID} params.chainId
|
|
161
210
|
* @param {Address} params.address
|
|
211
|
+
* @param {IFormoEventProperties} properties
|
|
212
|
+
* @param {IFormoEventContext} context
|
|
213
|
+
* @param {(...args: unknown[]) => void} callback
|
|
162
214
|
* @throws {Error} If chainId or address is empty
|
|
163
215
|
* @returns {Promise<void>}
|
|
164
216
|
*/
|
|
165
|
-
async connect(
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
217
|
+
async connect(
|
|
218
|
+
{
|
|
219
|
+
chainId,
|
|
220
|
+
address,
|
|
221
|
+
}: {
|
|
222
|
+
chainId: ChainID;
|
|
223
|
+
address: Address;
|
|
224
|
+
},
|
|
225
|
+
properties?: IFormoEventProperties,
|
|
226
|
+
context?: IFormoEventContext,
|
|
227
|
+
callback?: (...args: unknown[]) => void
|
|
228
|
+
): Promise<void> {
|
|
172
229
|
if (!chainId) {
|
|
173
230
|
logger.warn("Connect: Chain ID cannot be empty");
|
|
174
231
|
}
|
|
@@ -177,45 +234,73 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
177
234
|
}
|
|
178
235
|
|
|
179
236
|
this.currentChainId = chainId;
|
|
180
|
-
this.
|
|
237
|
+
this.currentAddress = address;
|
|
181
238
|
|
|
182
|
-
await this.trackEvent(
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
239
|
+
await this.trackEvent(
|
|
240
|
+
EventType.CONNECT,
|
|
241
|
+
{
|
|
242
|
+
chainId,
|
|
243
|
+
address,
|
|
244
|
+
},
|
|
245
|
+
properties,
|
|
246
|
+
context,
|
|
247
|
+
callback
|
|
248
|
+
);
|
|
186
249
|
}
|
|
187
250
|
|
|
188
251
|
/**
|
|
189
252
|
* Emits a wallet disconnect event.
|
|
190
253
|
* @param {ChainID} params.chainId
|
|
191
254
|
* @param {Address} params.address
|
|
255
|
+
* @param {IFormoEventProperties} properties
|
|
256
|
+
* @param {IFormoEventContext} context
|
|
257
|
+
* @param {(...args: unknown[]) => void} callback
|
|
192
258
|
* @returns {Promise<void>}
|
|
193
259
|
*/
|
|
194
|
-
async disconnect(
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
260
|
+
async disconnect(
|
|
261
|
+
params?: {
|
|
262
|
+
chainId?: ChainID;
|
|
263
|
+
address?: Address;
|
|
264
|
+
},
|
|
265
|
+
properties?: IFormoEventProperties,
|
|
266
|
+
context?: IFormoEventContext,
|
|
267
|
+
callback?: (...args: unknown[]) => void
|
|
268
|
+
): Promise<void> {
|
|
269
|
+
const address = params?.address || this.currentAddress;
|
|
199
270
|
const chainId = params?.chainId || this.currentChainId;
|
|
200
271
|
|
|
201
|
-
await this.handleDisconnect(
|
|
272
|
+
await this.handleDisconnect(
|
|
273
|
+
chainId,
|
|
274
|
+
address,
|
|
275
|
+
properties,
|
|
276
|
+
context,
|
|
277
|
+
callback
|
|
278
|
+
);
|
|
202
279
|
}
|
|
203
280
|
|
|
204
281
|
/**
|
|
205
282
|
* Emits a chain network change event.
|
|
206
283
|
* @param {ChainID} params.chainId
|
|
207
284
|
* @param {Address} params.address
|
|
285
|
+
* @param {IFormoEventProperties} properties
|
|
286
|
+
* @param {IFormoEventContext} context
|
|
287
|
+
* @param {(...args: unknown[]) => void} callback
|
|
208
288
|
* @throws {Error} If chainId is empty, zero, or not a valid number
|
|
209
289
|
* @throws {Error} If no address is provided and no previous address is recorded
|
|
210
290
|
* @returns {Promise<void>}
|
|
211
291
|
*/
|
|
212
|
-
async chain(
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
292
|
+
async chain(
|
|
293
|
+
{
|
|
294
|
+
chainId,
|
|
295
|
+
address,
|
|
296
|
+
}: {
|
|
297
|
+
chainId: ChainID;
|
|
298
|
+
address?: Address;
|
|
299
|
+
},
|
|
300
|
+
properties?: IFormoEventProperties,
|
|
301
|
+
context?: IFormoEventContext,
|
|
302
|
+
callback?: (...args: unknown[]) => void
|
|
303
|
+
): Promise<void> {
|
|
219
304
|
if (!chainId || Number(chainId) === 0) {
|
|
220
305
|
throw new Error("FormoAnalytics::chain: chainId cannot be empty or 0");
|
|
221
306
|
}
|
|
@@ -224,7 +309,7 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
224
309
|
"FormoAnalytics::chain: chainId must be a valid decimal number"
|
|
225
310
|
);
|
|
226
311
|
}
|
|
227
|
-
if (!address && !this.
|
|
312
|
+
if (!address && !this.currentAddress) {
|
|
228
313
|
throw new Error(
|
|
229
314
|
"FormoAnalytics::chain: address was empty and no previous address has been recorded"
|
|
230
315
|
);
|
|
@@ -232,10 +317,16 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
232
317
|
|
|
233
318
|
this.currentChainId = chainId;
|
|
234
319
|
|
|
235
|
-
await this.trackEvent(
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
320
|
+
await this.trackEvent(
|
|
321
|
+
EventType.CHAIN,
|
|
322
|
+
{
|
|
323
|
+
chainId,
|
|
324
|
+
address: address || this.currentAddress,
|
|
325
|
+
},
|
|
326
|
+
properties,
|
|
327
|
+
context,
|
|
328
|
+
callback
|
|
329
|
+
);
|
|
239
330
|
}
|
|
240
331
|
|
|
241
332
|
/**
|
|
@@ -245,28 +336,42 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
245
336
|
* @param {Address} params.address
|
|
246
337
|
* @param {string} params.message
|
|
247
338
|
* @param {string} params.signatureHash - only provided if status is confirmed
|
|
339
|
+
* @param {IFormoEventProperties} properties
|
|
340
|
+
* @param {IFormoEventContext} context
|
|
341
|
+
* @param {(...args: unknown[]) => void} callback
|
|
248
342
|
* @returns {Promise<void>}
|
|
249
343
|
*/
|
|
250
|
-
async signature(
|
|
251
|
-
|
|
252
|
-
chainId,
|
|
253
|
-
address,
|
|
254
|
-
message,
|
|
255
|
-
signatureHash,
|
|
256
|
-
}: {
|
|
257
|
-
status: SignatureStatus;
|
|
258
|
-
chainId?: ChainID;
|
|
259
|
-
address: Address;
|
|
260
|
-
message: string;
|
|
261
|
-
signatureHash?: string;
|
|
262
|
-
}): Promise<void> {
|
|
263
|
-
await this.trackEvent(Event.SIGNATURE, {
|
|
344
|
+
async signature(
|
|
345
|
+
{
|
|
264
346
|
status,
|
|
265
347
|
chainId,
|
|
266
348
|
address,
|
|
267
349
|
message,
|
|
268
|
-
|
|
269
|
-
}
|
|
350
|
+
signatureHash,
|
|
351
|
+
}: {
|
|
352
|
+
status: SignatureStatus;
|
|
353
|
+
chainId?: ChainID;
|
|
354
|
+
address: Address;
|
|
355
|
+
message: string;
|
|
356
|
+
signatureHash?: string;
|
|
357
|
+
},
|
|
358
|
+
properties?: IFormoEventProperties,
|
|
359
|
+
context?: IFormoEventContext,
|
|
360
|
+
callback?: (...args: unknown[]) => void
|
|
361
|
+
): Promise<void> {
|
|
362
|
+
await this.trackEvent(
|
|
363
|
+
EventType.SIGNATURE,
|
|
364
|
+
{
|
|
365
|
+
status,
|
|
366
|
+
chainId,
|
|
367
|
+
address,
|
|
368
|
+
message,
|
|
369
|
+
...(signatureHash && { signatureHash }),
|
|
370
|
+
},
|
|
371
|
+
properties,
|
|
372
|
+
context,
|
|
373
|
+
callback
|
|
374
|
+
);
|
|
270
375
|
}
|
|
271
376
|
|
|
272
377
|
/**
|
|
@@ -278,132 +383,154 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
278
383
|
* @param {string} params.to
|
|
279
384
|
* @param {string} params.value
|
|
280
385
|
* @param {string} params.transactionHash - only provided if status is broadcasted
|
|
386
|
+
* @param {IFormoEventProperties} properties
|
|
387
|
+
* @param {IFormoEventContext} context
|
|
388
|
+
* @param {(...args: unknown[]) => void} callback
|
|
281
389
|
* @returns {Promise<void>}
|
|
282
390
|
*/
|
|
283
|
-
async transaction(
|
|
284
|
-
|
|
285
|
-
chainId,
|
|
286
|
-
address,
|
|
287
|
-
data,
|
|
288
|
-
to,
|
|
289
|
-
value,
|
|
290
|
-
transactionHash,
|
|
291
|
-
}: {
|
|
292
|
-
status: TransactionStatus;
|
|
293
|
-
chainId: ChainID;
|
|
294
|
-
address: Address;
|
|
295
|
-
data?: string;
|
|
296
|
-
to?: string;
|
|
297
|
-
value?: string;
|
|
298
|
-
transactionHash?: string;
|
|
299
|
-
}): Promise<void> {
|
|
300
|
-
await this.trackEvent(Event.TRANSACTION, {
|
|
391
|
+
async transaction(
|
|
392
|
+
{
|
|
301
393
|
status,
|
|
302
394
|
chainId,
|
|
303
395
|
address,
|
|
304
396
|
data,
|
|
305
397
|
to,
|
|
306
398
|
value,
|
|
307
|
-
|
|
308
|
-
}
|
|
399
|
+
transactionHash,
|
|
400
|
+
}: {
|
|
401
|
+
status: TransactionStatus;
|
|
402
|
+
chainId: ChainID;
|
|
403
|
+
address: Address;
|
|
404
|
+
data?: string;
|
|
405
|
+
to?: string;
|
|
406
|
+
value?: string;
|
|
407
|
+
transactionHash?: string;
|
|
408
|
+
},
|
|
409
|
+
properties?: IFormoEventProperties,
|
|
410
|
+
context?: IFormoEventContext,
|
|
411
|
+
callback?: (...args: unknown[]) => void
|
|
412
|
+
): Promise<void> {
|
|
413
|
+
await this.trackEvent(
|
|
414
|
+
EventType.TRANSACTION,
|
|
415
|
+
{
|
|
416
|
+
status,
|
|
417
|
+
chainId,
|
|
418
|
+
address,
|
|
419
|
+
data,
|
|
420
|
+
to,
|
|
421
|
+
value,
|
|
422
|
+
...(transactionHash && { transactionHash }),
|
|
423
|
+
},
|
|
424
|
+
properties,
|
|
425
|
+
context,
|
|
426
|
+
callback
|
|
427
|
+
);
|
|
309
428
|
}
|
|
310
429
|
|
|
311
430
|
/**
|
|
312
|
-
* Emits an
|
|
431
|
+
* Emits an identify event with current wallet address and provider info.
|
|
313
432
|
* @param {string} params.providerName
|
|
314
433
|
* @param {string} params.rdns
|
|
315
434
|
* @param {string} params.userId
|
|
316
435
|
* @param {string} params.address
|
|
317
|
-
*
|
|
436
|
+
* @param {IFormoEventProperties} properties
|
|
437
|
+
* @param {IFormoEventContext} context
|
|
438
|
+
* @param {(...args: unknown[]) => void} callback
|
|
318
439
|
* @returns {Promise<void>}
|
|
319
440
|
*/
|
|
320
441
|
public async identify(
|
|
321
|
-
params
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
442
|
+
params: {
|
|
443
|
+
address?: Address;
|
|
444
|
+
providerName?: string;
|
|
445
|
+
userId?: string;
|
|
446
|
+
rdns?: string;
|
|
447
|
+
},
|
|
448
|
+
properties?: IFormoEventProperties,
|
|
449
|
+
context?: IFormoEventContext,
|
|
450
|
+
callback?: (...args: unknown[]) => void
|
|
329
451
|
): Promise<void> {
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
await this.identify({
|
|
342
|
-
address,
|
|
343
|
-
providerName: eip6963ProviderDetail?.info.name,
|
|
344
|
-
rdns: eip6963ProviderDetail?.info.rdns,
|
|
345
|
-
});
|
|
346
|
-
}
|
|
347
|
-
} else {
|
|
348
|
-
// Identify without accounts
|
|
349
|
-
await this.identify({
|
|
350
|
-
address: null,
|
|
351
|
-
providerName: eip6963ProviderDetail?.info.name,
|
|
352
|
-
rdns: eip6963ProviderDetail?.info.rdns,
|
|
353
|
-
});
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
} catch (err) {
|
|
357
|
-
logger.error("Error identifying all:", err);
|
|
358
|
-
}
|
|
359
|
-
} else {
|
|
360
|
-
const { userId, address, providerName, rdns } = params as {
|
|
361
|
-
address: Address | null;
|
|
362
|
-
providerName?: string;
|
|
363
|
-
userId?: string;
|
|
364
|
-
rdns?: string;
|
|
365
|
-
};
|
|
366
|
-
if (userId) this.userId = userId || null;
|
|
367
|
-
await this.trackEvent(Event.IDENTIFY, {
|
|
452
|
+
const { userId, address, providerName, rdns } = params;
|
|
453
|
+
|
|
454
|
+
this.currentAddress = address;
|
|
455
|
+
if (userId) {
|
|
456
|
+
this.currentUserId = userId;
|
|
457
|
+
session.set(SESSION_USER_ID_KEY, userId);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
await this.trackEvent(
|
|
461
|
+
EventType.IDENTIFY,
|
|
462
|
+
{
|
|
368
463
|
address,
|
|
369
464
|
providerName,
|
|
465
|
+
userId,
|
|
370
466
|
rdns,
|
|
371
|
-
}
|
|
372
|
-
|
|
467
|
+
},
|
|
468
|
+
properties,
|
|
469
|
+
context,
|
|
470
|
+
callback
|
|
471
|
+
);
|
|
373
472
|
}
|
|
374
473
|
|
|
375
474
|
/**
|
|
376
|
-
* Emits
|
|
377
|
-
* @param {
|
|
475
|
+
* Emits a detect wallet event with current wallet provider info.
|
|
476
|
+
* @param {string} params.providerName
|
|
477
|
+
* @param {string} params.rdns
|
|
478
|
+
* @param {IFormoEventProperties} properties
|
|
479
|
+
* @param {IFormoEventContext} context
|
|
480
|
+
* @param {(...args: unknown[]) => void} callback
|
|
378
481
|
* @returns {Promise<void>}
|
|
379
482
|
*/
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
483
|
+
async detect(
|
|
484
|
+
{
|
|
485
|
+
providerName,
|
|
486
|
+
rdns,
|
|
487
|
+
}: {
|
|
488
|
+
providerName: string;
|
|
489
|
+
rdns: string;
|
|
490
|
+
},
|
|
491
|
+
properties?: IFormoEventProperties,
|
|
492
|
+
context?: IFormoEventContext,
|
|
493
|
+
callback?: (...args: unknown[]) => void
|
|
494
|
+
): Promise<void> {
|
|
387
495
|
if (this.session.isWalletDetected(rdns))
|
|
388
496
|
return logger.warn(
|
|
389
|
-
`
|
|
497
|
+
`Detect: Wallet ${providerName} already detected in this session`
|
|
390
498
|
);
|
|
391
499
|
|
|
392
|
-
this.session.
|
|
393
|
-
await this.trackEvent(
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
500
|
+
this.session.markWalletDetected(rdns);
|
|
501
|
+
await this.trackEvent(
|
|
502
|
+
EventType.DETECT,
|
|
503
|
+
{
|
|
504
|
+
providerName,
|
|
505
|
+
rdns,
|
|
506
|
+
},
|
|
507
|
+
properties,
|
|
508
|
+
context,
|
|
509
|
+
callback
|
|
510
|
+
);
|
|
397
511
|
}
|
|
398
512
|
|
|
399
513
|
/**
|
|
400
|
-
* Emits a custom event with custom
|
|
401
|
-
* @param {string}
|
|
402
|
-
* @param {
|
|
514
|
+
* Emits a custom user event with custom properties.
|
|
515
|
+
* @param {string} event The name of the tracked event
|
|
516
|
+
* @param {IFormoEventProperties} properties
|
|
517
|
+
* @param {IFormoEventContext} context
|
|
518
|
+
* @param {(...args: unknown[]) => void} callback
|
|
403
519
|
* @returns {Promise<void>}
|
|
404
520
|
*/
|
|
405
|
-
async track(
|
|
406
|
-
|
|
521
|
+
async track(
|
|
522
|
+
event: EventType,
|
|
523
|
+
properties?: IFormoEventProperties,
|
|
524
|
+
context?: IFormoEventContext,
|
|
525
|
+
callback?: (...args: unknown[]) => void
|
|
526
|
+
): Promise<void> {
|
|
527
|
+
await this.trackEvent(
|
|
528
|
+
EventType.TRACK,
|
|
529
|
+
{ event },
|
|
530
|
+
properties,
|
|
531
|
+
context,
|
|
532
|
+
callback
|
|
533
|
+
);
|
|
407
534
|
}
|
|
408
535
|
|
|
409
536
|
/*
|
|
@@ -418,7 +545,7 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
418
545
|
}
|
|
419
546
|
|
|
420
547
|
this.currentChainId = undefined;
|
|
421
|
-
this.
|
|
548
|
+
this.currentAddress = undefined;
|
|
422
549
|
|
|
423
550
|
if (this._provider) {
|
|
424
551
|
const actions = Object.keys(this._providerListeners);
|
|
@@ -584,11 +711,11 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
584
711
|
}
|
|
585
712
|
|
|
586
713
|
private async onAddressConnected(address: Address): Promise<void> {
|
|
587
|
-
if (address === this.
|
|
714
|
+
if (address === this.currentAddress)
|
|
588
715
|
// We have already reported this address
|
|
589
716
|
return;
|
|
590
717
|
|
|
591
|
-
this.
|
|
718
|
+
this.currentAddress = address;
|
|
592
719
|
|
|
593
720
|
this.currentChainId = await this.getCurrentChainId();
|
|
594
721
|
this.connect({ chainId: this.currentChainId, address });
|
|
@@ -596,29 +723,35 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
596
723
|
|
|
597
724
|
private async handleDisconnect(
|
|
598
725
|
chainId?: ChainID,
|
|
599
|
-
address?: Address
|
|
726
|
+
address?: Address,
|
|
727
|
+
properties?: IFormoEventProperties,
|
|
728
|
+
context?: IFormoEventContext,
|
|
729
|
+
callback?: (...args: unknown[]) => void
|
|
600
730
|
): Promise<void> {
|
|
601
731
|
const payload = {
|
|
602
|
-
|
|
603
|
-
address: address || this.
|
|
732
|
+
chainId: chainId || this.currentChainId,
|
|
733
|
+
address: address || this.currentAddress,
|
|
604
734
|
};
|
|
605
735
|
this.currentChainId = undefined;
|
|
606
|
-
this.
|
|
736
|
+
this.currentAddress = undefined;
|
|
607
737
|
session.remove(SESSION_USER_ID_KEY);
|
|
608
738
|
|
|
609
|
-
await this.trackEvent(
|
|
739
|
+
await this.trackEvent(
|
|
740
|
+
EventType.DISCONNECT,
|
|
741
|
+
payload,
|
|
742
|
+
properties,
|
|
743
|
+
context,
|
|
744
|
+
callback
|
|
745
|
+
);
|
|
610
746
|
}
|
|
611
747
|
|
|
612
748
|
private async onAddressDisconnected(): Promise<void> {
|
|
613
|
-
await this.handleDisconnect(
|
|
614
|
-
this.currentChainId,
|
|
615
|
-
this.currentConnectedAddress
|
|
616
|
-
);
|
|
749
|
+
await this.handleDisconnect(this.currentChainId, this.currentAddress);
|
|
617
750
|
}
|
|
618
751
|
|
|
619
752
|
private async onChainChanged(chainIdHex: string): Promise<void> {
|
|
620
753
|
this.currentChainId = parseInt(chainIdHex);
|
|
621
|
-
if (!this.
|
|
754
|
+
if (!this.currentAddress) {
|
|
622
755
|
if (!this.provider) {
|
|
623
756
|
logger.info(
|
|
624
757
|
"OnChainChanged: Provider not found. CHAIN_CHANGED not reported"
|
|
@@ -633,14 +766,14 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
633
766
|
);
|
|
634
767
|
return Promise.resolve();
|
|
635
768
|
}
|
|
636
|
-
this.
|
|
769
|
+
this.currentAddress = address;
|
|
637
770
|
}
|
|
638
771
|
|
|
639
772
|
// Proceed only if the address exists
|
|
640
|
-
if (this.
|
|
773
|
+
if (this.currentAddress) {
|
|
641
774
|
return this.chain({
|
|
642
775
|
chainId: this.currentChainId,
|
|
643
|
-
address: this.
|
|
776
|
+
address: this.currentAddress,
|
|
644
777
|
});
|
|
645
778
|
} else {
|
|
646
779
|
logger.info(
|
|
@@ -685,7 +818,13 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
685
818
|
}
|
|
686
819
|
}
|
|
687
820
|
|
|
688
|
-
private trackPageHit(
|
|
821
|
+
private async trackPageHit(
|
|
822
|
+
category?: string,
|
|
823
|
+
name?: string,
|
|
824
|
+
properties?: IFormoEventProperties,
|
|
825
|
+
context?: IFormoEventContext,
|
|
826
|
+
callback?: (...args: unknown[]) => void
|
|
827
|
+
): Promise<void> {
|
|
689
828
|
if (!this.config.trackLocalhost && isLocalhost()) {
|
|
690
829
|
return logger.warn(
|
|
691
830
|
"Track page hit: Ignoring event because website is running locally"
|
|
@@ -693,30 +832,38 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
693
832
|
}
|
|
694
833
|
|
|
695
834
|
setTimeout(async () => {
|
|
696
|
-
this.trackEvent(
|
|
835
|
+
this.trackEvent(
|
|
836
|
+
EventType.PAGE,
|
|
837
|
+
{
|
|
838
|
+
category,
|
|
839
|
+
name,
|
|
840
|
+
},
|
|
841
|
+
properties,
|
|
842
|
+
context,
|
|
843
|
+
callback
|
|
844
|
+
);
|
|
697
845
|
}, 300);
|
|
698
846
|
}
|
|
699
847
|
|
|
700
|
-
private async trackEvent(
|
|
848
|
+
private async trackEvent(
|
|
849
|
+
type: TEventType,
|
|
850
|
+
payload?: any,
|
|
851
|
+
properties?: IFormoEventProperties,
|
|
852
|
+
context?: IFormoEventContext,
|
|
853
|
+
callback?: (...args: unknown[]) => void
|
|
854
|
+
): Promise<void> {
|
|
701
855
|
try {
|
|
702
|
-
|
|
703
|
-
const user_id = this.userId;
|
|
704
|
-
|
|
705
|
-
const requestData = this.eventFactory.create(
|
|
706
|
-
this.anonymousId as UUID,
|
|
707
|
-
user_id,
|
|
708
|
-
address,
|
|
856
|
+
this.eventManager.addEvent(
|
|
709
857
|
{
|
|
710
|
-
|
|
858
|
+
type,
|
|
711
859
|
...payload,
|
|
712
|
-
|
|
860
|
+
properties,
|
|
861
|
+
context,
|
|
862
|
+
callback,
|
|
863
|
+
},
|
|
864
|
+
this.currentAddress,
|
|
865
|
+
this.currentUserId
|
|
713
866
|
);
|
|
714
|
-
|
|
715
|
-
await this.eventQueue.enqueue(requestData, (err, _, data) => {
|
|
716
|
-
if (err) {
|
|
717
|
-
logger.error("Error sending events:", err);
|
|
718
|
-
} else logger.info(`Events sent successfully: ${data.length} events`);
|
|
719
|
-
});
|
|
720
867
|
} catch (error) {
|
|
721
868
|
logger.error("Error tracking event:", error);
|
|
722
869
|
}
|
|
@@ -739,7 +886,7 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
739
886
|
return providers;
|
|
740
887
|
}
|
|
741
888
|
|
|
742
|
-
private async
|
|
889
|
+
private async detectWallets(
|
|
743
890
|
providers: readonly EIP6963ProviderDetail[]
|
|
744
891
|
): Promise<void> {
|
|
745
892
|
try {
|
|
@@ -758,17 +905,8 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
758
905
|
return this._provider;
|
|
759
906
|
}
|
|
760
907
|
|
|
761
|
-
private getAnonymousId(): UUID {
|
|
762
|
-
const storedAnonymousId = local.get(LOCAL_ANONYMOUS_ID_KEY);
|
|
763
|
-
if (storedAnonymousId && typeof storedAnonymousId === "string")
|
|
764
|
-
return storedAnonymousId as UUID;
|
|
765
|
-
const newAnonymousId = generateNativeUUID();
|
|
766
|
-
local.set(LOCAL_ANONYMOUS_ID_KEY, newAnonymousId);
|
|
767
|
-
return newAnonymousId;
|
|
768
|
-
}
|
|
769
|
-
|
|
770
908
|
private async getAddress(): Promise<Address | null> {
|
|
771
|
-
if (this.
|
|
909
|
+
if (this.currentAddress) return this.currentAddress;
|
|
772
910
|
if (!this?.provider) {
|
|
773
911
|
logger.info("The provider is not set");
|
|
774
912
|
return null;
|
|
@@ -881,7 +1019,7 @@ export class FormoAnalytics implements IFormoAnalytics {
|
|
|
881
1019
|
|
|
882
1020
|
interface IFormoAnalyticsSession {
|
|
883
1021
|
isWalletDetected(rdns: string): boolean;
|
|
884
|
-
|
|
1022
|
+
markWalletDetected(rdns: string): void;
|
|
885
1023
|
}
|
|
886
1024
|
|
|
887
1025
|
class FormoAnalyticsSession implements IFormoAnalyticsSession {
|
|
@@ -892,7 +1030,7 @@ class FormoAnalyticsSession implements IFormoAnalyticsSession {
|
|
|
892
1030
|
return rdnses.includes(rdns);
|
|
893
1031
|
}
|
|
894
1032
|
|
|
895
|
-
public
|
|
1033
|
+
public markWalletDetected(rdns: string): void {
|
|
896
1034
|
const rdnses = (session.get(SESSION_WALLET_DETECTED_KEY) as string[]) || [];
|
|
897
1035
|
rdnses.push(rdns);
|
|
898
1036
|
session.set(SESSION_WALLET_DETECTED_KEY, rdnses);
|