@formo/analytics 1.16.0 → 1.16.2
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 +20 -14
- package/dist/cjs/src/FormoAnalytics.d.ts.map +1 -1
- package/dist/cjs/src/FormoAnalytics.js +105 -136
- package/dist/cjs/src/FormoAnalytics.js.map +1 -1
- package/dist/cjs/src/FormoAnalyticsProvider.d.ts +1 -1
- package/dist/cjs/src/FormoAnalyticsProvider.d.ts.map +1 -1
- package/dist/cjs/src/FormoAnalyticsProvider.js +4 -4
- package/dist/cjs/src/FormoAnalyticsProvider.js.map +1 -1
- package/dist/cjs/src/constants/config.d.ts +597 -597
- package/dist/cjs/src/constants/config.d.ts.map +1 -1
- package/dist/cjs/src/constants/config.js.map +1 -1
- package/dist/cjs/src/constants/index.d.ts +0 -1
- package/dist/cjs/src/constants/index.d.ts.map +1 -1
- package/dist/cjs/src/constants/index.js +0 -1
- package/dist/cjs/src/constants/index.js.map +1 -1
- package/dist/cjs/src/lib/event/EventFactory.d.ts +62 -0
- package/dist/cjs/src/lib/event/EventFactory.d.ts.map +1 -0
- package/dist/cjs/src/lib/event/EventFactory.js +188 -0
- package/dist/cjs/src/lib/event/EventFactory.js.map +1 -0
- package/dist/cjs/src/lib/event/index.d.ts +3 -0
- package/dist/cjs/src/lib/event/index.d.ts.map +1 -0
- package/dist/cjs/src/lib/event/index.js +19 -0
- package/dist/cjs/src/lib/event/index.js.map +1 -0
- package/dist/cjs/src/lib/event/type.d.ts +6 -0
- package/dist/cjs/src/lib/event/type.d.ts.map +1 -0
- package/dist/cjs/src/lib/event/type.js +3 -0
- package/dist/cjs/src/lib/event/type.js.map +1 -0
- package/dist/cjs/src/lib/index.d.ts +1 -0
- package/dist/cjs/src/lib/index.d.ts.map +1 -1
- package/dist/cjs/src/lib/index.js +1 -0
- package/dist/cjs/src/lib/index.js.map +1 -1
- package/dist/cjs/src/lib/{logger.d.ts → logger/Logger.d.ts} +5 -5
- package/dist/cjs/src/lib/logger/Logger.d.ts.map +1 -0
- package/dist/cjs/src/lib/{logger.js → logger/Logger.js} +1 -1
- package/dist/cjs/src/lib/logger/Logger.js.map +1 -0
- package/dist/cjs/src/lib/logger/index.d.ts +3 -0
- package/dist/cjs/src/lib/logger/index.d.ts.map +1 -0
- package/dist/cjs/src/lib/logger/index.js +19 -0
- package/dist/cjs/src/lib/logger/index.js.map +1 -0
- package/dist/cjs/src/lib/logger/type.d.ts +14 -0
- package/dist/cjs/src/lib/logger/type.d.ts.map +1 -0
- package/dist/cjs/src/lib/logger/type.js +3 -0
- package/dist/cjs/src/lib/logger/type.js.map +1 -0
- package/dist/{esm/src/lib/queue.d.ts → cjs/src/lib/queue/EventQueue.d.ts} +5 -4
- package/dist/cjs/src/lib/queue/EventQueue.d.ts.map +1 -0
- package/dist/cjs/src/lib/{queue.js → queue/EventQueue.js} +9 -6
- package/dist/cjs/src/lib/queue/EventQueue.js.map +1 -0
- package/dist/cjs/src/lib/queue/index.d.ts +3 -0
- package/dist/cjs/src/lib/queue/index.d.ts.map +1 -0
- package/dist/cjs/src/lib/queue/index.js +19 -0
- package/dist/cjs/src/lib/queue/index.js.map +1 -0
- package/dist/cjs/src/lib/queue/type.d.ts +6 -0
- package/dist/cjs/src/lib/queue/type.d.ts.map +1 -0
- package/dist/cjs/src/lib/queue/type.js +3 -0
- package/dist/cjs/src/lib/queue/type.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 +44 -2
- 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/address.d.ts +3 -0
- package/dist/cjs/src/utils/address.d.ts.map +1 -0
- package/dist/cjs/src/utils/address.js +32 -0
- package/dist/cjs/src/utils/address.js.map +1 -0
- package/dist/cjs/src/utils/base.d.ts +0 -7
- package/dist/cjs/src/utils/base.d.ts.map +1 -1
- package/dist/cjs/src/utils/base.js +1 -106
- package/dist/cjs/src/utils/base.js.map +1 -1
- package/dist/cjs/src/utils/converter.d.ts +5 -0
- package/dist/cjs/src/utils/converter.d.ts.map +1 -0
- package/dist/cjs/src/utils/converter.js +52 -0
- package/dist/cjs/src/utils/converter.js.map +1 -0
- package/dist/cjs/src/utils/generate.d.ts +4 -0
- package/dist/cjs/src/utils/generate.d.ts.map +1 -0
- package/dist/cjs/src/utils/generate.js +60 -0
- package/dist/cjs/src/utils/generate.js.map +1 -0
- package/dist/cjs/src/utils/index.d.ts +3 -1
- package/dist/cjs/src/utils/index.d.ts.map +1 -1
- package/dist/cjs/src/utils/index.js +3 -1
- package/dist/cjs/src/utils/index.js.map +1 -1
- package/dist/cjs/src/validators/address.d.ts +5 -0
- package/dist/cjs/src/validators/address.d.ts.map +1 -0
- package/dist/cjs/src/validators/address.js +64 -0
- package/dist/cjs/src/validators/address.js.map +1 -0
- package/dist/cjs/src/validators/agent.d.ts +2 -0
- package/dist/cjs/src/validators/agent.d.ts.map +1 -0
- package/dist/cjs/src/{utils/is.js → validators/agent.js} +2 -5
- package/dist/cjs/src/validators/agent.js.map +1 -0
- package/dist/cjs/src/validators/index.d.ts +7 -0
- package/dist/cjs/src/validators/index.d.ts.map +1 -0
- package/dist/cjs/src/validators/index.js +23 -0
- package/dist/cjs/src/validators/index.js.map +1 -0
- package/dist/cjs/src/validators/object.d.ts +2 -0
- package/dist/cjs/src/validators/object.d.ts.map +1 -0
- package/dist/cjs/src/validators/object.js +10 -0
- package/dist/cjs/src/validators/object.js.map +1 -0
- package/dist/cjs/src/validators/string.d.ts +3 -0
- package/dist/cjs/src/validators/string.d.ts.map +1 -0
- package/dist/cjs/src/validators/string.js +8 -0
- package/dist/cjs/src/validators/string.js.map +1 -0
- package/dist/cjs/src/validators/type-check.d.ts +14 -0
- package/dist/cjs/src/validators/type-check.d.ts.map +1 -0
- package/dist/cjs/src/validators/type-check.js +61 -0
- package/dist/cjs/src/validators/type-check.js.map +1 -0
- package/dist/cjs/src/validators/uint8array.d.ts +3 -0
- package/dist/cjs/src/validators/uint8array.d.ts.map +1 -0
- package/dist/cjs/src/validators/uint8array.js +21 -0
- package/dist/cjs/src/validators/uint8array.js.map +1 -0
- package/dist/cjs/test/lib.spec.js +9 -2
- package/dist/cjs/test/lib.spec.js.map +1 -1
- package/dist/cjs/tsconfig.tsbuildinfo +1 -1
- package/dist/esm/src/FormoAnalytics.d.ts +20 -14
- package/dist/esm/src/FormoAnalytics.d.ts.map +1 -1
- package/dist/esm/src/FormoAnalytics.js +102 -133
- package/dist/esm/src/FormoAnalytics.js.map +1 -1
- package/dist/esm/src/FormoAnalyticsProvider.d.ts +1 -1
- package/dist/esm/src/FormoAnalyticsProvider.d.ts.map +1 -1
- package/dist/esm/src/FormoAnalyticsProvider.js +2 -2
- package/dist/esm/src/FormoAnalyticsProvider.js.map +1 -1
- package/dist/esm/src/constants/config.d.ts +597 -597
- package/dist/esm/src/constants/config.d.ts.map +1 -1
- package/dist/esm/src/constants/config.js.map +1 -1
- package/dist/esm/src/constants/index.d.ts +0 -1
- package/dist/esm/src/constants/index.d.ts.map +1 -1
- package/dist/esm/src/constants/index.js +0 -1
- package/dist/esm/src/constants/index.js.map +1 -1
- package/dist/esm/src/lib/event/EventFactory.d.ts +62 -0
- package/dist/esm/src/lib/event/EventFactory.d.ts.map +1 -0
- package/dist/esm/src/lib/event/EventFactory.js +185 -0
- package/dist/esm/src/lib/event/EventFactory.js.map +1 -0
- package/dist/esm/src/lib/event/index.d.ts +3 -0
- package/dist/esm/src/lib/event/index.d.ts.map +1 -0
- package/dist/esm/src/lib/event/index.js +3 -0
- package/dist/esm/src/lib/event/index.js.map +1 -0
- package/dist/esm/src/lib/event/type.d.ts +6 -0
- package/dist/esm/src/lib/event/type.d.ts.map +1 -0
- package/dist/esm/src/lib/event/type.js +2 -0
- package/dist/esm/src/lib/event/type.js.map +1 -0
- package/dist/esm/src/lib/fetch.d.ts +1 -1
- package/dist/esm/src/lib/index.d.ts +1 -0
- package/dist/esm/src/lib/index.d.ts.map +1 -1
- package/dist/esm/src/lib/index.js +1 -0
- package/dist/esm/src/lib/index.js.map +1 -1
- package/dist/esm/src/lib/{logger.d.ts → logger/Logger.d.ts} +5 -5
- package/dist/esm/src/lib/logger/Logger.d.ts.map +1 -0
- package/dist/esm/src/lib/{logger.js → logger/Logger.js} +1 -1
- package/dist/esm/src/lib/logger/Logger.js.map +1 -0
- package/dist/esm/src/lib/logger/index.d.ts +3 -0
- package/dist/esm/src/lib/logger/index.d.ts.map +1 -0
- package/dist/esm/src/lib/logger/index.js +3 -0
- package/dist/esm/src/lib/logger/index.js.map +1 -0
- package/dist/esm/src/lib/logger/type.d.ts +14 -0
- package/dist/esm/src/lib/logger/type.d.ts.map +1 -0
- package/dist/esm/src/lib/logger/type.js +2 -0
- package/dist/esm/src/lib/logger/type.js.map +1 -0
- package/dist/{cjs/src/lib/queue.d.ts → esm/src/lib/queue/EventQueue.d.ts} +5 -4
- package/dist/esm/src/lib/queue/EventQueue.d.ts.map +1 -0
- package/dist/esm/src/lib/{queue.js → queue/EventQueue.js} +9 -6
- package/dist/esm/src/lib/queue/EventQueue.js.map +1 -0
- package/dist/esm/src/lib/queue/index.d.ts +3 -0
- package/dist/esm/src/lib/queue/index.d.ts.map +1 -0
- package/dist/esm/src/lib/queue/index.js +3 -0
- package/dist/esm/src/lib/queue/index.js.map +1 -0
- package/dist/esm/src/lib/queue/type.d.ts +6 -0
- package/dist/esm/src/lib/queue/type.d.ts.map +1 -0
- package/dist/esm/src/lib/queue/type.js +2 -0
- package/dist/esm/src/lib/queue/type.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 +44 -2
- 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/address.d.ts +3 -0
- package/dist/esm/src/utils/address.d.ts.map +1 -0
- package/dist/esm/src/utils/address.js +28 -0
- package/dist/esm/src/utils/address.js.map +1 -0
- package/dist/esm/src/utils/base.d.ts +0 -7
- package/dist/esm/src/utils/base.d.ts.map +1 -1
- package/dist/esm/src/utils/base.js +0 -99
- package/dist/esm/src/utils/base.js.map +1 -1
- package/dist/esm/src/utils/converter.d.ts +5 -0
- package/dist/esm/src/utils/converter.d.ts.map +1 -0
- package/dist/esm/src/utils/converter.js +45 -0
- package/dist/esm/src/utils/converter.js.map +1 -0
- package/dist/esm/src/utils/generate.d.ts +4 -0
- package/dist/esm/src/utils/generate.d.ts.map +1 -0
- package/dist/esm/src/utils/generate.js +56 -0
- package/dist/esm/src/utils/generate.js.map +1 -0
- package/dist/esm/src/utils/index.d.ts +3 -1
- package/dist/esm/src/utils/index.d.ts.map +1 -1
- package/dist/esm/src/utils/index.js +3 -1
- package/dist/esm/src/utils/index.js.map +1 -1
- package/dist/esm/src/validators/address.d.ts +5 -0
- package/dist/esm/src/validators/address.d.ts.map +1 -0
- package/dist/esm/src/validators/address.js +58 -0
- package/dist/esm/src/validators/address.js.map +1 -0
- package/dist/esm/src/validators/agent.d.ts +2 -0
- package/dist/esm/src/validators/agent.d.ts.map +1 -0
- package/dist/esm/src/{utils/is.js → validators/agent.js} +1 -3
- package/dist/esm/src/validators/agent.js.map +1 -0
- package/dist/esm/src/validators/index.d.ts +7 -0
- package/dist/esm/src/validators/index.d.ts.map +1 -0
- package/dist/esm/src/validators/index.js +7 -0
- package/dist/esm/src/validators/index.js.map +1 -0
- package/dist/esm/src/validators/object.d.ts +2 -0
- package/dist/esm/src/validators/object.d.ts.map +1 -0
- package/dist/esm/src/validators/object.js +6 -0
- package/dist/esm/src/validators/object.js.map +1 -0
- package/dist/esm/src/validators/string.d.ts +3 -0
- package/dist/esm/src/validators/string.d.ts.map +1 -0
- package/dist/esm/src/validators/string.js +4 -0
- package/dist/esm/src/validators/string.js.map +1 -0
- package/dist/esm/src/validators/type-check.d.ts +14 -0
- package/dist/esm/src/validators/type-check.d.ts.map +1 -0
- package/dist/esm/src/validators/type-check.js +46 -0
- package/dist/esm/src/validators/type-check.js.map +1 -0
- package/dist/esm/src/validators/uint8array.d.ts +3 -0
- package/dist/esm/src/validators/uint8array.d.ts.map +1 -0
- package/dist/esm/src/validators/uint8array.js +17 -0
- package/dist/esm/src/validators/uint8array.js.map +1 -0
- package/dist/esm/test/lib.spec.js +8 -1
- package/dist/esm/test/lib.spec.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.LICENSE.txt +4 -0
- package/dist/index.umd.min.js.map +1 -1
- package/package.json +14 -3
- package/src/FormoAnalytics.ts +106 -162
- package/src/FormoAnalyticsProvider.tsx +2 -2
- package/src/constants/config.ts +1 -1
- package/src/constants/index.ts +0 -1
- package/src/global.d.ts +4 -4
- package/src/lib/event/EventFactory.ts +263 -0
- package/src/lib/event/index.ts +2 -0
- package/src/lib/event/type.ts +11 -0
- package/src/lib/index.ts +1 -0
- package/src/lib/{logger.ts → logger/Logger.ts} +4 -4
- package/src/lib/logger/index.ts +2 -0
- package/src/lib/logger/type.ts +14 -0
- package/src/lib/{queue.ts → queue/EventQueue.ts} +13 -9
- package/src/lib/queue/index.ts +2 -0
- package/src/lib/queue/type.ts +6 -0
- package/src/types/base.ts +2 -0
- package/src/types/events.ts +53 -2
- package/src/utils/address.ts +43 -0
- package/src/utils/base.ts +0 -62
- package/src/utils/converter.ts +44 -0
- package/src/utils/generate.ts +16 -0
- package/src/utils/index.ts +3 -1
- package/src/validators/address.ts +69 -0
- package/src/{utils/is.ts → validators/agent.ts} +0 -4
- package/src/validators/index.ts +6 -0
- package/src/validators/object.ts +4 -0
- package/src/validators/string.ts +4 -0
- package/src/validators/type-check.ts +61 -0
- package/src/validators/uint8array.ts +17 -0
- package/test/lib.spec.ts +13 -1
- package/webpack.config.ts +12 -12
- package/dist/cjs/src/constants/regex.d.ts +0 -4
- package/dist/cjs/src/constants/regex.d.ts.map +0 -1
- package/dist/cjs/src/constants/regex.js +0 -7
- package/dist/cjs/src/constants/regex.js.map +0 -1
- package/dist/cjs/src/lib/logger.d.ts.map +0 -1
- package/dist/cjs/src/lib/logger.js.map +0 -1
- package/dist/cjs/src/lib/queue.d.ts.map +0 -1
- package/dist/cjs/src/lib/queue.js.map +0 -1
- package/dist/cjs/src/utils/is.d.ts +0 -3
- package/dist/cjs/src/utils/is.d.ts.map +0 -1
- package/dist/cjs/src/utils/is.js.map +0 -1
- package/dist/esm/src/constants/regex.d.ts +0 -4
- package/dist/esm/src/constants/regex.d.ts.map +0 -1
- package/dist/esm/src/constants/regex.js +0 -4
- package/dist/esm/src/constants/regex.js.map +0 -1
- package/dist/esm/src/lib/logger.d.ts.map +0 -1
- package/dist/esm/src/lib/logger.js.map +0 -1
- package/dist/esm/src/lib/queue.d.ts.map +0 -1
- package/dist/esm/src/lib/queue.js.map +0 -1
- package/dist/esm/src/utils/is.d.ts +0 -3
- package/dist/esm/src/utils/is.d.ts.map +0 -1
- package/dist/esm/src/utils/is.js.map +0 -1
- package/src/constants/regex.ts +0 -3
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { UUID } from "crypto";
|
|
2
|
+
import { COUNTRY_LIST } from "../../constants";
|
|
3
|
+
import {
|
|
4
|
+
Address,
|
|
5
|
+
APIEvent,
|
|
6
|
+
ChainID,
|
|
7
|
+
SignatureStatus,
|
|
8
|
+
TransactionStatus,
|
|
9
|
+
} from "../../types";
|
|
10
|
+
import { logger } from "../logger";
|
|
11
|
+
import { IEventFactory } from "./type";
|
|
12
|
+
import { toChecksumAddress, toSnakeCase } from "../../utils";
|
|
13
|
+
|
|
14
|
+
class EventFactory implements IEventFactory {
|
|
15
|
+
constructor() {}
|
|
16
|
+
|
|
17
|
+
private getLocation(): string | undefined {
|
|
18
|
+
try {
|
|
19
|
+
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
|
|
20
|
+
if (timezone in COUNTRY_LIST)
|
|
21
|
+
return COUNTRY_LIST[timezone as keyof typeof COUNTRY_LIST];
|
|
22
|
+
return timezone;
|
|
23
|
+
} catch (error) {
|
|
24
|
+
logger.error("Error resolving timezone:", error);
|
|
25
|
+
return "";
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
private getLanguage(): string {
|
|
30
|
+
try {
|
|
31
|
+
return (
|
|
32
|
+
(navigator.languages && navigator.languages.length
|
|
33
|
+
? navigator.languages[0]
|
|
34
|
+
: navigator.language) || "en"
|
|
35
|
+
);
|
|
36
|
+
} catch (error) {
|
|
37
|
+
logger.error("Error resolving language:", error);
|
|
38
|
+
return "en";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
private buildCommonProperties(
|
|
43
|
+
anonymous_id: UUID,
|
|
44
|
+
user_id: string | null,
|
|
45
|
+
address: string | null,
|
|
46
|
+
action: string
|
|
47
|
+
) {
|
|
48
|
+
// common properties
|
|
49
|
+
return {
|
|
50
|
+
anonymous_id,
|
|
51
|
+
user_id,
|
|
52
|
+
address: address && toChecksumAddress(address),
|
|
53
|
+
timestamp: new Date().toISOString(),
|
|
54
|
+
action,
|
|
55
|
+
version: "1",
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private buildCommonPayload() {
|
|
60
|
+
const url = new URL(window.location.href);
|
|
61
|
+
|
|
62
|
+
const location = this.getLocation();
|
|
63
|
+
const language = this.getLanguage();
|
|
64
|
+
|
|
65
|
+
// common properties
|
|
66
|
+
return {
|
|
67
|
+
"user-agent": window.navigator.userAgent,
|
|
68
|
+
href: url.href,
|
|
69
|
+
locale: language,
|
|
70
|
+
location,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
generatePageEvent() {
|
|
75
|
+
const url = new URL(window.location.href);
|
|
76
|
+
const params = new URLSearchParams(url.search);
|
|
77
|
+
const pathname = window.location.pathname;
|
|
78
|
+
const hash = window.location.hash;
|
|
79
|
+
|
|
80
|
+
return {
|
|
81
|
+
pathname: pathname || url.pathname,
|
|
82
|
+
hash: hash || url.hash,
|
|
83
|
+
referrer: document.referrer,
|
|
84
|
+
utm_source: params.get("utm_source")?.trim() || "",
|
|
85
|
+
utm_medium: params.get("utm_medium")?.trim() || "",
|
|
86
|
+
utm_campaign: params.get("utm_campaign")?.trim() || "",
|
|
87
|
+
utm_content: params.get("utm_content")?.trim() || "",
|
|
88
|
+
utm_term: params.get("utm_term")?.trim() || "",
|
|
89
|
+
ref: params.get("ref")?.trim() || "",
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
generateConnectEvent(chainId: ChainID, address: Address) {
|
|
94
|
+
return {
|
|
95
|
+
chainId,
|
|
96
|
+
address,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
generateDisconnectEvent(chainId: ChainID, address: Address) {
|
|
101
|
+
return {
|
|
102
|
+
chainId,
|
|
103
|
+
address,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
generateDetectWalletEvent(providerName: string, rdns: string) {
|
|
108
|
+
return {
|
|
109
|
+
providerName,
|
|
110
|
+
rdns,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
generateIdentifyEvent(
|
|
115
|
+
address: Address | null,
|
|
116
|
+
providerName: string,
|
|
117
|
+
rdns: string
|
|
118
|
+
) {
|
|
119
|
+
return {
|
|
120
|
+
address,
|
|
121
|
+
providerName,
|
|
122
|
+
rdns,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
generateChainChangedEvent(chainId: ChainID, address: Address) {
|
|
127
|
+
return {
|
|
128
|
+
chainId,
|
|
129
|
+
address,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
generateSignatureEvent(
|
|
134
|
+
status: SignatureStatus,
|
|
135
|
+
chainId: ChainID,
|
|
136
|
+
address: Address,
|
|
137
|
+
message: string,
|
|
138
|
+
signatureHash: string
|
|
139
|
+
) {
|
|
140
|
+
return {
|
|
141
|
+
status,
|
|
142
|
+
chainId,
|
|
143
|
+
address,
|
|
144
|
+
message,
|
|
145
|
+
signatureHash,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
generateTransactionEvent(
|
|
150
|
+
status: TransactionStatus,
|
|
151
|
+
chainId: ChainID,
|
|
152
|
+
address: Address,
|
|
153
|
+
data: string,
|
|
154
|
+
to: string,
|
|
155
|
+
value: string,
|
|
156
|
+
transactionHash: string
|
|
157
|
+
) {
|
|
158
|
+
return {
|
|
159
|
+
status,
|
|
160
|
+
chainId,
|
|
161
|
+
address,
|
|
162
|
+
data,
|
|
163
|
+
to,
|
|
164
|
+
value,
|
|
165
|
+
transactionHash,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
generateCustomEvent(args: any) {
|
|
170
|
+
if (typeof args !== "object") {
|
|
171
|
+
logger.warn("Invalid event data");
|
|
172
|
+
return {};
|
|
173
|
+
}
|
|
174
|
+
const { action, ...rest } = args;
|
|
175
|
+
|
|
176
|
+
return {
|
|
177
|
+
...rest,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
create(
|
|
182
|
+
anonymous_id: UUID,
|
|
183
|
+
user_id: string | null,
|
|
184
|
+
address: string | null,
|
|
185
|
+
event: APIEvent
|
|
186
|
+
) {
|
|
187
|
+
const commonProperties = this.buildCommonProperties(
|
|
188
|
+
anonymous_id,
|
|
189
|
+
user_id,
|
|
190
|
+
address,
|
|
191
|
+
event.action
|
|
192
|
+
);
|
|
193
|
+
const payload = this.buildCommonPayload();
|
|
194
|
+
let eventSpecificPayload = this.generateCustomEvent(event);
|
|
195
|
+
if (event.action === "page_hit") {
|
|
196
|
+
eventSpecificPayload = this.generatePageEvent();
|
|
197
|
+
}
|
|
198
|
+
if (event.action === "connect") {
|
|
199
|
+
eventSpecificPayload = this.generateConnectEvent(
|
|
200
|
+
event.chainId,
|
|
201
|
+
event.address
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
if (event.action === "disconnect") {
|
|
205
|
+
eventSpecificPayload = this.generateDisconnectEvent(
|
|
206
|
+
event.chainId,
|
|
207
|
+
event.address
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
if (event.action === "detect_wallet") {
|
|
211
|
+
eventSpecificPayload = this.generateDetectWalletEvent(
|
|
212
|
+
event.providerName,
|
|
213
|
+
event.rdns
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
if (event.action === "identify") {
|
|
217
|
+
eventSpecificPayload = this.generateIdentifyEvent(
|
|
218
|
+
event.address,
|
|
219
|
+
event.providerName,
|
|
220
|
+
event.rdns
|
|
221
|
+
);
|
|
222
|
+
}
|
|
223
|
+
if (event.action === "chain_changed") {
|
|
224
|
+
eventSpecificPayload = this.generateChainChangedEvent(
|
|
225
|
+
event.chainId,
|
|
226
|
+
event.address
|
|
227
|
+
);
|
|
228
|
+
}
|
|
229
|
+
if (event.action === "signature") {
|
|
230
|
+
eventSpecificPayload = this.generateSignatureEvent(
|
|
231
|
+
event.status,
|
|
232
|
+
event.chainId,
|
|
233
|
+
event.address,
|
|
234
|
+
event.message,
|
|
235
|
+
event.signatureHash
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
if (event.action === "transaction") {
|
|
239
|
+
eventSpecificPayload = this.generateTransactionEvent(
|
|
240
|
+
event.status,
|
|
241
|
+
event.chainId,
|
|
242
|
+
event.address,
|
|
243
|
+
event.data,
|
|
244
|
+
event.to,
|
|
245
|
+
event.value,
|
|
246
|
+
event.transactionHash
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return toSnakeCase(
|
|
251
|
+
{
|
|
252
|
+
...commonProperties,
|
|
253
|
+
payload: {
|
|
254
|
+
...payload,
|
|
255
|
+
...eventSpecificPayload,
|
|
256
|
+
},
|
|
257
|
+
},
|
|
258
|
+
["user-agent"]
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export { EventFactory };
|
package/src/lib/index.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
import { ILogger, LogLevel } from "./type";
|
|
2
2
|
|
|
3
|
-
export class Logger {
|
|
4
|
-
private static instance:
|
|
3
|
+
export class Logger implements ILogger {
|
|
4
|
+
private static instance: ILogger;
|
|
5
5
|
private enabledLevels: Set<LogLevel>;
|
|
6
6
|
private enabled: boolean;
|
|
7
7
|
|
|
@@ -32,7 +32,7 @@ export class Logger {
|
|
|
32
32
|
public static getInstance(config?: {
|
|
33
33
|
enabled?: boolean;
|
|
34
34
|
enabledLevels?: LogLevel[];
|
|
35
|
-
}):
|
|
35
|
+
}): ILogger {
|
|
36
36
|
if (!Logger.instance) {
|
|
37
37
|
Logger.instance = new Logger(
|
|
38
38
|
config?.enabled ?? false,
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface ILogger {
|
|
2
|
+
setEnabledLevels(levels: LogLevel[]): void;
|
|
3
|
+
getEnabledLevels(): LogLevel[];
|
|
4
|
+
setEnabled(enabled: boolean): void;
|
|
5
|
+
isLoggingEnabled(): boolean;
|
|
6
|
+
log(...data: any[]): void;
|
|
7
|
+
info(...data: any[]): void;
|
|
8
|
+
debug(...data: any[]): void;
|
|
9
|
+
warn(...data: any[]): void;
|
|
10
|
+
error(...data: any[]): void;
|
|
11
|
+
trace(...data: any[]): void;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export type LogLevel = "debug" | "info" | "warn" | "error" | "trace";
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import isNetworkError from "is-network-error";
|
|
2
|
-
import {
|
|
2
|
+
import { IFormoEvent, IFormoEventPayload } from "../../types";
|
|
3
3
|
import {
|
|
4
4
|
clampNumber,
|
|
5
5
|
getActionDescriptor,
|
|
6
6
|
hash,
|
|
7
7
|
millisecondsToSecond,
|
|
8
8
|
toDateHourMinute,
|
|
9
|
-
} from "
|
|
10
|
-
import { logger } from "
|
|
11
|
-
import { EVENTS_API_REQUEST_HEADER } from "
|
|
12
|
-
import fetch from "
|
|
9
|
+
} from "../../utils";
|
|
10
|
+
import { logger } from "../logger";
|
|
11
|
+
import { EVENTS_API_REQUEST_HEADER } from "../../constants";
|
|
12
|
+
import fetch from "../fetch";
|
|
13
|
+
import { IEventQueue } from "./type";
|
|
13
14
|
const noop = () => {};
|
|
14
15
|
|
|
15
16
|
type QueueItem = {
|
|
16
|
-
message:
|
|
17
|
+
message: IFormoEventPayload;
|
|
17
18
|
callback: (...args: any) => any;
|
|
18
19
|
};
|
|
19
20
|
|
|
@@ -43,7 +44,7 @@ const DEFAULT_FLUSH_INTERVAL = 1_000 * 30; // 1 MINUTE
|
|
|
43
44
|
const MAX_FLUSH_INTERVAL = 1_000 * 300; // 5 MINUTES
|
|
44
45
|
const MIN_FLUSH_INTERVAL = 1_000 * 10; // 10 SECONDS
|
|
45
46
|
|
|
46
|
-
export class EventQueue {
|
|
47
|
+
export class EventQueue implements IEventQueue {
|
|
47
48
|
private writeKey: string;
|
|
48
49
|
private url: string;
|
|
49
50
|
private queue: QueueItem[] = [];
|
|
@@ -96,7 +97,7 @@ export class EventQueue {
|
|
|
96
97
|
}
|
|
97
98
|
|
|
98
99
|
//#region Public functions
|
|
99
|
-
async enqueue(event:
|
|
100
|
+
async enqueue(event: IFormoEvent, callback?: (...args: any) => void) {
|
|
100
101
|
callback = callback || noop;
|
|
101
102
|
|
|
102
103
|
const formattedTimestamp = toDateHourMinute(new Date(event.timestamp));
|
|
@@ -115,7 +116,10 @@ export class EventQueue {
|
|
|
115
116
|
return;
|
|
116
117
|
}
|
|
117
118
|
|
|
118
|
-
this.queue.push({
|
|
119
|
+
this.queue.push({
|
|
120
|
+
message: { ...event, timestamp: originTimestamp, id: eventId },
|
|
121
|
+
callback,
|
|
122
|
+
});
|
|
119
123
|
|
|
120
124
|
logger.log(
|
|
121
125
|
`Event enqueued: ${getActionDescriptor(event.action, event.payload)}`
|
package/src/types/base.ts
CHANGED
|
@@ -7,6 +7,8 @@ export type ChainID = number;
|
|
|
7
7
|
// Address (EVM, Solana, etc.)
|
|
8
8
|
export type Address = string;
|
|
9
9
|
|
|
10
|
+
export type ValidInputTypes = Uint8Array | bigint | string | number | boolean;
|
|
11
|
+
|
|
10
12
|
export interface Options {
|
|
11
13
|
provider?: EIP1193Provider;
|
|
12
14
|
trackLocalhost?: boolean;
|
package/src/types/events.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { UUID } from "crypto";
|
|
2
|
+
import { Address, ChainID } from "./base";
|
|
2
3
|
|
|
3
|
-
export interface
|
|
4
|
+
export interface IFormoEvent {
|
|
4
5
|
anonymous_id: UUID;
|
|
5
6
|
user_id: string | null;
|
|
6
7
|
action: string;
|
|
@@ -10,10 +11,60 @@ export interface RequestEvent {
|
|
|
10
11
|
version: string;
|
|
11
12
|
}
|
|
12
13
|
|
|
13
|
-
export type
|
|
14
|
+
export type IFormoEventPayload = IFormoEvent & {
|
|
14
15
|
id: string;
|
|
15
16
|
};
|
|
16
17
|
|
|
18
|
+
export type APIEvent =
|
|
19
|
+
| {
|
|
20
|
+
action: "page_hit";
|
|
21
|
+
}
|
|
22
|
+
| {
|
|
23
|
+
action: "detect_wallet";
|
|
24
|
+
providerName: string;
|
|
25
|
+
rdns: string;
|
|
26
|
+
}
|
|
27
|
+
| {
|
|
28
|
+
action: "identify";
|
|
29
|
+
address: string;
|
|
30
|
+
providerName: string;
|
|
31
|
+
rdns: string;
|
|
32
|
+
userId?: string;
|
|
33
|
+
}
|
|
34
|
+
| {
|
|
35
|
+
action: "chain_changed";
|
|
36
|
+
chainId: ChainID;
|
|
37
|
+
address: Address;
|
|
38
|
+
}
|
|
39
|
+
| {
|
|
40
|
+
action: "transaction";
|
|
41
|
+
status: TransactionStatus;
|
|
42
|
+
chainId: ChainID;
|
|
43
|
+
address: Address;
|
|
44
|
+
data: string;
|
|
45
|
+
to: string;
|
|
46
|
+
value: string;
|
|
47
|
+
transactionHash: string;
|
|
48
|
+
}
|
|
49
|
+
| {
|
|
50
|
+
action: "signature";
|
|
51
|
+
status: SignatureStatus;
|
|
52
|
+
chainId: ChainID;
|
|
53
|
+
address: Address;
|
|
54
|
+
message: string;
|
|
55
|
+
signatureHash: string;
|
|
56
|
+
}
|
|
57
|
+
| {
|
|
58
|
+
action: "disconnect";
|
|
59
|
+
chainId: ChainID;
|
|
60
|
+
address: Address;
|
|
61
|
+
}
|
|
62
|
+
| {
|
|
63
|
+
action: "connect";
|
|
64
|
+
chainId: ChainID;
|
|
65
|
+
address: Address;
|
|
66
|
+
};
|
|
67
|
+
|
|
17
68
|
export enum SignatureStatus {
|
|
18
69
|
REQUESTED = "requested",
|
|
19
70
|
REJECTED = "rejected",
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Address } from "../types";
|
|
2
|
+
import { keccak256 } from "ethereum-cryptography/keccak.js";
|
|
3
|
+
import { utf8ToBytes } from "ethereum-cryptography/utils.js";
|
|
4
|
+
import {
|
|
5
|
+
ensureIfUint8Array,
|
|
6
|
+
isAddress,
|
|
7
|
+
uint8ArrayToHexString,
|
|
8
|
+
} from "../validators";
|
|
9
|
+
import { isNullish } from "../validators/object";
|
|
10
|
+
|
|
11
|
+
export const toChecksumAddress = (address: Address): string => {
|
|
12
|
+
if (!isAddress(address, false)) {
|
|
13
|
+
throw new Error("Invalid address " + address);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const lowerCaseAddress = address.toLowerCase().replace(/^0x/i, "");
|
|
17
|
+
|
|
18
|
+
const hash = uint8ArrayToHexString(
|
|
19
|
+
keccak256(ensureIfUint8Array(utf8ToBytes(lowerCaseAddress)))
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
if (
|
|
23
|
+
isNullish(hash) ||
|
|
24
|
+
hash ===
|
|
25
|
+
"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"
|
|
26
|
+
)
|
|
27
|
+
return ""; // // EIP-1052 if hash is equal to c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470, keccak was given empty data
|
|
28
|
+
|
|
29
|
+
let checksumAddress = "0x";
|
|
30
|
+
|
|
31
|
+
const addressHash = hash.replace(/^0x/i, "");
|
|
32
|
+
|
|
33
|
+
for (let i = 0; i < lowerCaseAddress.length; i += 1) {
|
|
34
|
+
// If ith character is 8 to f then make it uppercase
|
|
35
|
+
if (parseInt(addressHash[i], 16) > 7) {
|
|
36
|
+
checksumAddress += lowerCaseAddress[i].toUpperCase();
|
|
37
|
+
} else {
|
|
38
|
+
checksumAddress += lowerCaseAddress[i];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
return checksumAddress;
|
|
43
|
+
};
|
package/src/utils/base.ts
CHANGED
|
@@ -1,65 +1,3 @@
|
|
|
1
|
-
import { UUID } from "crypto";
|
|
2
|
-
|
|
3
|
-
const toSnake = (str: string) =>
|
|
4
|
-
str
|
|
5
|
-
.replace(/([a-z])([A-Z])/g, "$1_$2")
|
|
6
|
-
.replace(/[\s-]+/g, "_")
|
|
7
|
-
.toLowerCase();
|
|
8
|
-
|
|
9
|
-
// Converts object keys to snake_case, omitting keys in the omitKeys array
|
|
10
|
-
export function toSnakeCase(obj: any, omitKeys: string[] = []) {
|
|
11
|
-
const convert = (data: any): any => {
|
|
12
|
-
if (Array.isArray(data)) {
|
|
13
|
-
return data.map(convert); // Recursively handle array elements
|
|
14
|
-
} else if (data !== null && typeof data === "object") {
|
|
15
|
-
return Object.keys(data).reduce((acc: any, key) => {
|
|
16
|
-
// If the key is in omitKeys, keep it as it is
|
|
17
|
-
const resultKey = omitKeys.includes(key) ? key : toSnake(key);
|
|
18
|
-
acc[resultKey] = omitKeys.includes(key)
|
|
19
|
-
? data[key]
|
|
20
|
-
: convert(data[key]);
|
|
21
|
-
return acc;
|
|
22
|
-
}, {});
|
|
23
|
-
}
|
|
24
|
-
return data;
|
|
25
|
-
};
|
|
26
|
-
|
|
27
|
-
return convert(obj);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export const millisecondsToSecond = (milliseconds: number): number =>
|
|
31
|
-
Math.ceil(milliseconds / 1_000);
|
|
32
|
-
|
|
33
|
-
export const toDateHourMinute = (date: Date) =>
|
|
34
|
-
date.getUTCFullYear() +
|
|
35
|
-
"-" +
|
|
36
|
-
("0" + (date.getUTCMonth() + 1)).slice(-2) +
|
|
37
|
-
"-" +
|
|
38
|
-
("0" + date.getUTCDate()).slice(-2) +
|
|
39
|
-
" " +
|
|
40
|
-
("0" + date.getUTCHours()).slice(-2) +
|
|
41
|
-
":" +
|
|
42
|
-
("0" + date.getUTCMinutes()).slice(-2);
|
|
43
|
-
|
|
44
|
-
export const clampNumber = (value: number, max: number, min: number) => {
|
|
45
|
-
return Math.min(Math.max(value, min), max);
|
|
46
|
-
};
|
|
47
|
-
|
|
48
1
|
export const getActionDescriptor = (action: string, payload: any): string => {
|
|
49
2
|
return `${action}${payload?.status ? ` ${payload?.status}` : ""}`;
|
|
50
3
|
};
|
|
51
|
-
|
|
52
|
-
export async function hash(input: string): Promise<string> {
|
|
53
|
-
const hashBuffer = await crypto.subtle.digest(
|
|
54
|
-
"SHA-256",
|
|
55
|
-
new TextEncoder().encode(input)
|
|
56
|
-
);
|
|
57
|
-
const byteArray = new Uint8Array(hashBuffer);
|
|
58
|
-
return Array.from(byteArray)
|
|
59
|
-
.map((byte) => byte.toString(16).padStart(2, "0"))
|
|
60
|
-
.join("");
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export function generateNativeUUID(): UUID {
|
|
64
|
-
return crypto.randomUUID();
|
|
65
|
-
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const toSnake = (str: string) =>
|
|
2
|
+
str
|
|
3
|
+
.replace(/([a-z])([A-Z])/g, "$1_$2")
|
|
4
|
+
.replace(/[\s-]+/g, "_")
|
|
5
|
+
.toLowerCase();
|
|
6
|
+
|
|
7
|
+
// Converts object keys to snake_case, omitting keys in the omitKeys array
|
|
8
|
+
export function toSnakeCase(obj: any, omitKeys: string[] = []) {
|
|
9
|
+
const convert = (data: any): any => {
|
|
10
|
+
if (Array.isArray(data)) {
|
|
11
|
+
return data.map(convert); // Recursively handle array elements
|
|
12
|
+
} else if (data !== null && typeof data === "object") {
|
|
13
|
+
return Object.keys(data).reduce((acc: any, key) => {
|
|
14
|
+
// If the key is in omitKeys, keep it as it is
|
|
15
|
+
const resultKey = omitKeys.includes(key) ? key : toSnake(key);
|
|
16
|
+
acc[resultKey] = omitKeys.includes(key)
|
|
17
|
+
? data[key]
|
|
18
|
+
: convert(data[key]);
|
|
19
|
+
return acc;
|
|
20
|
+
}, {});
|
|
21
|
+
}
|
|
22
|
+
return data;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
return convert(obj);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const millisecondsToSecond = (milliseconds: number): number =>
|
|
29
|
+
Math.ceil(milliseconds / 1_000);
|
|
30
|
+
|
|
31
|
+
export const toDateHourMinute = (date: Date) =>
|
|
32
|
+
date.getUTCFullYear() +
|
|
33
|
+
"-" +
|
|
34
|
+
("0" + (date.getUTCMonth() + 1)).slice(-2) +
|
|
35
|
+
"-" +
|
|
36
|
+
("0" + date.getUTCDate()).slice(-2) +
|
|
37
|
+
" " +
|
|
38
|
+
("0" + date.getUTCHours()).slice(-2) +
|
|
39
|
+
":" +
|
|
40
|
+
("0" + date.getUTCMinutes()).slice(-2);
|
|
41
|
+
|
|
42
|
+
export const clampNumber = (value: number, max: number, min: number) => {
|
|
43
|
+
return Math.min(Math.max(value, min), max);
|
|
44
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { UUID } from "crypto";
|
|
2
|
+
|
|
3
|
+
export async function hash(input: string): Promise<string> {
|
|
4
|
+
const hashBuffer = await crypto.subtle.digest(
|
|
5
|
+
"SHA-256",
|
|
6
|
+
new TextEncoder().encode(input)
|
|
7
|
+
);
|
|
8
|
+
const byteArray = new Uint8Array(hashBuffer);
|
|
9
|
+
return Array.from(byteArray)
|
|
10
|
+
.map((byte) => byte.toString(16).padStart(2, "0"))
|
|
11
|
+
.join("");
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export function generateNativeUUID(): UUID {
|
|
15
|
+
return crypto.randomUUID();
|
|
16
|
+
}
|
package/src/utils/index.ts
CHANGED