@formo/analytics 1.16.3 → 1.16.5
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 +22 -14
- 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 +2 -1
- package/dist/cjs/src/validators/index.d.ts.map +1 -1
- package/dist/cjs/src/validators/index.js +2 -1
- package/dist/cjs/src/validators/index.js.map +1 -1
- package/dist/cjs/src/validators/network.d.ts +2 -0
- package/dist/cjs/src/validators/network.d.ts.map +1 -0
- package/dist/cjs/src/validators/network.js +31 -0
- package/dist/cjs/src/validators/network.js.map +1 -0
- 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 +21 -13
- 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 +2 -1
- package/dist/esm/src/validators/index.d.ts.map +1 -1
- package/dist/esm/src/validators/index.js +2 -1
- package/dist/esm/src/validators/index.js.map +1 -1
- package/dist/esm/src/validators/network.d.ts +2 -0
- package/dist/esm/src/validators/network.d.ts.map +1 -0
- package/dist/esm/src/validators/network.js +28 -0
- package/dist/esm/src/validators/network.js.map +1 -0
- 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 -3
- 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 -162
- 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 +23 -11
- 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 +2 -1
- package/src/validators/network.ts +34 -0
- 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
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Address, APIEvent } from "../../types";
|
|
2
|
+
import { logger } from "../logger";
|
|
3
|
+
import { IEventQueue } from "../queue";
|
|
4
|
+
import { EventFactory } from "./EventFactory";
|
|
5
|
+
import { IEventFactory, IEventManager } from "./type";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* A service to generate valid event payloads and queue them for processing
|
|
9
|
+
*/
|
|
10
|
+
class EventManager implements IEventManager {
|
|
11
|
+
eventQueue: IEventQueue;
|
|
12
|
+
eventFactory: IEventFactory;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
*
|
|
16
|
+
* @param eventQueue Event queue instance
|
|
17
|
+
*/
|
|
18
|
+
constructor(eventQueue: IEventQueue) {
|
|
19
|
+
this.eventQueue = eventQueue;
|
|
20
|
+
this.eventFactory = new EventFactory();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Consumes a new incoming event
|
|
25
|
+
* @param event Incoming event data
|
|
26
|
+
*/
|
|
27
|
+
addEvent(event: APIEvent, address?: Address, userId?: string): void {
|
|
28
|
+
const { callback, ..._event } = event;
|
|
29
|
+
const formoEvent = this.eventFactory.create(_event, address, userId);
|
|
30
|
+
this.eventQueue.enqueue(formoEvent, (err, _, data) => {
|
|
31
|
+
if (err) {
|
|
32
|
+
logger.error("Error sending events:", err);
|
|
33
|
+
} else logger.info(`Events sent successfully: ${data.length} events`);
|
|
34
|
+
callback?.(err, _, data);
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export { EventManager };
|
package/src/lib/event/index.ts
CHANGED
package/src/lib/event/type.ts
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import { Address, APIEvent, IFormoEvent } from "../../types";
|
|
2
|
+
|
|
3
|
+
export interface IEventManager {
|
|
4
|
+
addEvent(event: APIEvent, address?: Address, userId?: string): void;
|
|
5
|
+
}
|
|
3
6
|
|
|
4
7
|
export interface IEventFactory {
|
|
5
|
-
create(
|
|
6
|
-
anonymous_id: UUID,
|
|
7
|
-
user_id: string | null,
|
|
8
|
-
address: string | null,
|
|
9
|
-
event: APIEvent
|
|
10
|
-
): IFormoEvent;
|
|
8
|
+
create(event: APIEvent, address?: Address, userId?: string): IFormoEvent;
|
|
11
9
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { LOCAL_ANONYMOUS_ID_KEY } from "../../constants";
|
|
2
|
+
import { AnonymousID } from "../../types";
|
|
3
|
+
import { generateNativeUUID } from "../../utils";
|
|
4
|
+
import { local } from "../storage";
|
|
5
|
+
|
|
6
|
+
const generateAnonymousId = (): AnonymousID => {
|
|
7
|
+
const storedAnonymousId = local.get(LOCAL_ANONYMOUS_ID_KEY);
|
|
8
|
+
if (storedAnonymousId && typeof storedAnonymousId === "string")
|
|
9
|
+
return storedAnonymousId as AnonymousID;
|
|
10
|
+
const newAnonymousId = generateNativeUUID();
|
|
11
|
+
local.set(LOCAL_ANONYMOUS_ID_KEY, newAnonymousId);
|
|
12
|
+
return newAnonymousId;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export { generateAnonymousId };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import isNetworkError from "
|
|
1
|
+
import { isNetworkError } from "../../validators";
|
|
2
2
|
import { IFormoEvent, IFormoEventPayload } from "../../types";
|
|
3
3
|
import {
|
|
4
4
|
clampNumber,
|
|
@@ -18,6 +18,10 @@ type QueueItem = {
|
|
|
18
18
|
callback: (...args: any) => any;
|
|
19
19
|
};
|
|
20
20
|
|
|
21
|
+
type IFormoEventFlushPayload = IFormoEventPayload & {
|
|
22
|
+
sent_at: string;
|
|
23
|
+
};
|
|
24
|
+
|
|
21
25
|
type Options = {
|
|
22
26
|
url: string;
|
|
23
27
|
flushAt?: number;
|
|
@@ -97,17 +101,19 @@ export class EventQueue implements IEventQueue {
|
|
|
97
101
|
}
|
|
98
102
|
|
|
99
103
|
//#region Public functions
|
|
104
|
+
private async generateMessageId(event: IFormoEvent): Promise<string> {
|
|
105
|
+
const formattedTimestamp = toDateHourMinute(new Date(event.original_timestamp));
|
|
106
|
+
const eventForHashing = { ...event, original_timestamp: formattedTimestamp };
|
|
107
|
+
const eventString = JSON.stringify(eventForHashing);
|
|
108
|
+
return hash(eventString);
|
|
109
|
+
}
|
|
110
|
+
|
|
100
111
|
async enqueue(event: IFormoEvent, callback?: (...args: any) => void) {
|
|
101
112
|
callback = callback || noop;
|
|
102
113
|
|
|
103
|
-
const
|
|
104
|
-
const originTimestamp = event.timestamp;
|
|
105
|
-
event.timestamp = formattedTimestamp;
|
|
106
|
-
|
|
107
|
-
const eventString = JSON.stringify(event);
|
|
108
|
-
const eventId = await hash(eventString);
|
|
114
|
+
const message_id = await this.generateMessageId(event);
|
|
109
115
|
// check if the message already exists
|
|
110
|
-
if (await this.isDuplicate(
|
|
116
|
+
if (await this.isDuplicate(message_id)) {
|
|
111
117
|
logger.warn(
|
|
112
118
|
`Event already enqueued, try again after ${millisecondsToSecond(
|
|
113
119
|
this.flushIntervalMs
|
|
@@ -117,12 +123,12 @@ export class EventQueue implements IEventQueue {
|
|
|
117
123
|
}
|
|
118
124
|
|
|
119
125
|
this.queue.push({
|
|
120
|
-
message: { ...event,
|
|
126
|
+
message: { ...event, message_id },
|
|
121
127
|
callback,
|
|
122
128
|
});
|
|
123
129
|
|
|
124
130
|
logger.log(
|
|
125
|
-
`Event enqueued: ${getActionDescriptor(event.
|
|
131
|
+
`Event enqueued: ${getActionDescriptor(event.type, event.properties)}`
|
|
126
132
|
);
|
|
127
133
|
|
|
128
134
|
if (!this.flushed) {
|
|
@@ -170,7 +176,13 @@ export class EventQueue implements IEventQueue {
|
|
|
170
176
|
|
|
171
177
|
const items = this.queue.splice(0, this.flushAt);
|
|
172
178
|
this.payloadHashes.clear();
|
|
173
|
-
|
|
179
|
+
|
|
180
|
+
// Generate sent_at once for the entire batch
|
|
181
|
+
const sentAt = new Date().toISOString();
|
|
182
|
+
const data: IFormoEventFlushPayload[] = items.map((item) => ({
|
|
183
|
+
...item.message,
|
|
184
|
+
sent_at: sentAt
|
|
185
|
+
}));
|
|
174
186
|
|
|
175
187
|
const done = (err?: Error) => {
|
|
176
188
|
items.forEach(({ message, callback }) => callback(err, message, data));
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import _isPlaceholder from "./_isPlaceholder";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Optimized internal one-arity curry function.
|
|
5
|
+
*
|
|
6
|
+
* @private
|
|
7
|
+
* @category Function
|
|
8
|
+
* @param {Function} fn The function to curry.
|
|
9
|
+
* @return {Function} The curried function.
|
|
10
|
+
*/
|
|
11
|
+
export default function _curry1(fn: Function) {
|
|
12
|
+
return function f1(a: any) {
|
|
13
|
+
if (arguments.length === 0 || _isPlaceholder(a)) {
|
|
14
|
+
return f1;
|
|
15
|
+
} else {
|
|
16
|
+
return fn.apply(this, arguments);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import _curry1 from "./_curry1";
|
|
2
|
+
import _isPlaceholder from "./_isPlaceholder";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Optimized internal two-arity curry function.
|
|
6
|
+
*
|
|
7
|
+
* @private
|
|
8
|
+
* @category Function
|
|
9
|
+
* @param {Function} fn The function to curry.
|
|
10
|
+
* @return {Function} The curried function.
|
|
11
|
+
*/
|
|
12
|
+
export default function _curry2(fn: Function) {
|
|
13
|
+
return function f2(a: any, b: any) {
|
|
14
|
+
switch (arguments.length) {
|
|
15
|
+
case 0:
|
|
16
|
+
return f2;
|
|
17
|
+
case 1:
|
|
18
|
+
return _isPlaceholder(a)
|
|
19
|
+
? f2
|
|
20
|
+
: _curry1(function (_b: any) {
|
|
21
|
+
return fn(a, _b);
|
|
22
|
+
});
|
|
23
|
+
default:
|
|
24
|
+
return _isPlaceholder(a) && _isPlaceholder(b)
|
|
25
|
+
? f2
|
|
26
|
+
: _isPlaceholder(a)
|
|
27
|
+
? _curry1(function (_a: any) {
|
|
28
|
+
return fn(_a, b);
|
|
29
|
+
})
|
|
30
|
+
: _isPlaceholder(b)
|
|
31
|
+
? _curry1(function (_b: any) {
|
|
32
|
+
return fn(a, _b);
|
|
33
|
+
})
|
|
34
|
+
: fn(a, b);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import _curry1 from "./_curry1";
|
|
2
|
+
import _curry2 from "./_curry2";
|
|
3
|
+
import _isPlaceholder from "./_isPlaceholder";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Optimized internal three-arity curry function.
|
|
7
|
+
*
|
|
8
|
+
* @private
|
|
9
|
+
* @category Function
|
|
10
|
+
* @param {Function} fn The function to curry.
|
|
11
|
+
* @return {Function} The curried function.
|
|
12
|
+
*/
|
|
13
|
+
export default function _curry3(fn: Function) {
|
|
14
|
+
return function f3(a: any, b: any, c: any) {
|
|
15
|
+
switch (arguments.length) {
|
|
16
|
+
case 0:
|
|
17
|
+
return f3;
|
|
18
|
+
case 1:
|
|
19
|
+
return _isPlaceholder(a)
|
|
20
|
+
? f3
|
|
21
|
+
: _curry2(function (_b: any, _c: any) {
|
|
22
|
+
return fn(a, _b, _c);
|
|
23
|
+
});
|
|
24
|
+
case 2:
|
|
25
|
+
return _isPlaceholder(a) && _isPlaceholder(b)
|
|
26
|
+
? f3
|
|
27
|
+
: _isPlaceholder(a)
|
|
28
|
+
? _curry2(function (_a: any, _c: any) {
|
|
29
|
+
return fn(_a, b, _c);
|
|
30
|
+
})
|
|
31
|
+
: _isPlaceholder(b)
|
|
32
|
+
? _curry2(function (_b: any, _c: any) {
|
|
33
|
+
return fn(a, _b, _c);
|
|
34
|
+
})
|
|
35
|
+
: _curry1(function (_c: any) {
|
|
36
|
+
return fn(a, b, _c);
|
|
37
|
+
});
|
|
38
|
+
default:
|
|
39
|
+
return _isPlaceholder(a) && _isPlaceholder(b) && _isPlaceholder(c)
|
|
40
|
+
? f3
|
|
41
|
+
: _isPlaceholder(a) && _isPlaceholder(b)
|
|
42
|
+
? _curry2(function (_a: any, _b: any) {
|
|
43
|
+
return fn(_a, _b, c);
|
|
44
|
+
})
|
|
45
|
+
: _isPlaceholder(a) && _isPlaceholder(c)
|
|
46
|
+
? _curry2(function (_a: any, _c: any) {
|
|
47
|
+
return fn(_a, b, _c);
|
|
48
|
+
})
|
|
49
|
+
: _isPlaceholder(b) && _isPlaceholder(c)
|
|
50
|
+
? _curry2(function (_b: any, _c: any) {
|
|
51
|
+
return fn(a, _b, _c);
|
|
52
|
+
})
|
|
53
|
+
: _isPlaceholder(a)
|
|
54
|
+
? _curry1(function (_a: any) {
|
|
55
|
+
return fn(_a, b, c);
|
|
56
|
+
})
|
|
57
|
+
: _isPlaceholder(b)
|
|
58
|
+
? _curry1(function (_b: any) {
|
|
59
|
+
return fn(a, _b, c);
|
|
60
|
+
})
|
|
61
|
+
: _isPlaceholder(c)
|
|
62
|
+
? _curry1(function (_c: any) {
|
|
63
|
+
return fn(a, b, _c);
|
|
64
|
+
})
|
|
65
|
+
: fn(a, b, c);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import _curry2 from "./internal/_curry2";
|
|
2
|
+
import mergeDeepWithKey from "./mergeDeepWithKey";
|
|
3
|
+
|
|
4
|
+
const mergeDeepRight = _curry2(function mergeDeepRight(lObj: any, rObj: any) {
|
|
5
|
+
return mergeDeepWithKey(
|
|
6
|
+
function (_: Function, __: any, rVal: any) {
|
|
7
|
+
return rVal;
|
|
8
|
+
},
|
|
9
|
+
lObj,
|
|
10
|
+
rObj
|
|
11
|
+
);
|
|
12
|
+
});
|
|
13
|
+
export default mergeDeepRight;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import _curry3 from "./internal/_curry3";
|
|
2
|
+
import _isObject from "./internal/_isObject";
|
|
3
|
+
import mergeWithKey from "./mergeWithKey";
|
|
4
|
+
|
|
5
|
+
const mergeDeepWithKey = _curry3(function mergeDeepWithKey(
|
|
6
|
+
fn: Function,
|
|
7
|
+
lObj: any,
|
|
8
|
+
rObj: any
|
|
9
|
+
) {
|
|
10
|
+
return mergeWithKey(
|
|
11
|
+
function (k: Function, lVal: any, rVal: any) {
|
|
12
|
+
if (_isObject(lVal) && _isObject(rVal)) {
|
|
13
|
+
return mergeDeepWithKey(fn, lVal, rVal);
|
|
14
|
+
} else {
|
|
15
|
+
return fn(k, lVal, rVal);
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
lObj,
|
|
19
|
+
rObj
|
|
20
|
+
);
|
|
21
|
+
});
|
|
22
|
+
export default mergeDeepWithKey;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import _curry3 from "./internal/_curry3";
|
|
2
|
+
import _has from "./internal/_has";
|
|
3
|
+
|
|
4
|
+
const mergeWithKey = _curry3(function mergeWithKey(
|
|
5
|
+
fn: Function,
|
|
6
|
+
l: any,
|
|
7
|
+
r: any
|
|
8
|
+
) {
|
|
9
|
+
const result: any = {};
|
|
10
|
+
let k;
|
|
11
|
+
l = l || {};
|
|
12
|
+
r = r || {};
|
|
13
|
+
|
|
14
|
+
for (k in l) {
|
|
15
|
+
if (_has(k, l)) {
|
|
16
|
+
result[k] = _has(k, r) ? fn(k, l[k], r[k]) : l[k];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
for (k in r) {
|
|
21
|
+
if (_has(k, r) && !_has(k, result)) {
|
|
22
|
+
result[k] = r[k];
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
return result;
|
|
27
|
+
});
|
|
28
|
+
export default mergeWithKey;
|
|
@@ -41,6 +41,10 @@ export class NativeStorage {
|
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
|
|
44
|
+
public isAvailable(): boolean {
|
|
45
|
+
return this.isBrowser;
|
|
46
|
+
}
|
|
47
|
+
|
|
44
48
|
public set(key: string, value: any): void {
|
|
45
49
|
if (typeof value === "boolean") value = value === true ? "true" : "false";
|
|
46
50
|
if (typeof value === "object")
|
package/src/types/base.ts
CHANGED
package/src/types/events.ts
CHANGED
|
@@ -1,69 +1,104 @@
|
|
|
1
1
|
import { UUID } from "crypto";
|
|
2
|
-
import { Address, ChainID } from "./base";
|
|
2
|
+
import { Address, ChainID, Nullable } from "./base";
|
|
3
|
+
import { TEventChannel, TEventType } from "../constants";
|
|
3
4
|
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
address: string
|
|
10
|
-
|
|
5
|
+
export type AnonymousID = UUID;
|
|
6
|
+
|
|
7
|
+
export interface ICommonProperties {
|
|
8
|
+
anonymous_id: AnonymousID;
|
|
9
|
+
user_id: Nullable<string>;
|
|
10
|
+
address: Nullable<string>;
|
|
11
|
+
type: TEventType;
|
|
12
|
+
channel: TEventChannel;
|
|
11
13
|
version: string;
|
|
14
|
+
original_timestamp: string;
|
|
15
|
+
event?: Nullable<string>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type IFormoEventProperties = Record<string, unknown>;
|
|
19
|
+
export type IFormoEventContext = Record<string, unknown>;
|
|
20
|
+
export type UTMParameters = Record<string, string>;
|
|
21
|
+
|
|
22
|
+
export interface IFormoEvent extends ICommonProperties {
|
|
23
|
+
context: Nullable<IFormoEventContext>;
|
|
24
|
+
properties: Nullable<IFormoEventProperties>;
|
|
12
25
|
}
|
|
13
26
|
|
|
14
27
|
export type IFormoEventPayload = IFormoEvent & {
|
|
15
|
-
|
|
28
|
+
message_id: string;
|
|
16
29
|
};
|
|
17
30
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
31
|
+
//#region Specific Event Types
|
|
32
|
+
export interface PageAPIEvent {
|
|
33
|
+
type: "page";
|
|
34
|
+
name?: string;
|
|
35
|
+
category?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface DetectAPIEvent {
|
|
38
|
+
type: "detect";
|
|
39
|
+
providerName: string;
|
|
40
|
+
rdns: string;
|
|
41
|
+
}
|
|
42
|
+
export interface IdentifyAPIEvent {
|
|
43
|
+
type: "identify";
|
|
44
|
+
address: string;
|
|
45
|
+
providerName: string;
|
|
46
|
+
rdns: string;
|
|
47
|
+
userId?: Nullable<string>;
|
|
48
|
+
}
|
|
49
|
+
export interface ChainAPIEvent {
|
|
50
|
+
type: "chain";
|
|
51
|
+
chainId: ChainID;
|
|
52
|
+
address: Address;
|
|
53
|
+
}
|
|
54
|
+
export interface TransactionAPIEvent {
|
|
55
|
+
type: "transaction";
|
|
56
|
+
status: TransactionStatus;
|
|
57
|
+
chainId: ChainID;
|
|
58
|
+
address: Address;
|
|
59
|
+
data: string;
|
|
60
|
+
to: string;
|
|
61
|
+
value: string;
|
|
62
|
+
transactionHash: string;
|
|
63
|
+
}
|
|
64
|
+
export interface SignatureAPIEvent {
|
|
65
|
+
type: "signature";
|
|
66
|
+
status: SignatureStatus;
|
|
67
|
+
chainId: ChainID;
|
|
68
|
+
address: Address;
|
|
69
|
+
message: string;
|
|
70
|
+
signatureHash: string;
|
|
71
|
+
}
|
|
72
|
+
export interface ConnectAPIEvent {
|
|
73
|
+
type: "connect";
|
|
74
|
+
chainId: ChainID;
|
|
75
|
+
address: Address;
|
|
76
|
+
}
|
|
77
|
+
export interface DisconnectAPIEvent {
|
|
78
|
+
type: "disconnect";
|
|
79
|
+
chainId: ChainID;
|
|
80
|
+
address: Address;
|
|
81
|
+
}
|
|
82
|
+
export interface TrackAPIEvent {
|
|
83
|
+
type: "track";
|
|
84
|
+
event: string;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
export type APIEvent = {
|
|
88
|
+
properties?: IFormoEventProperties;
|
|
89
|
+
context?: IFormoEventContext;
|
|
90
|
+
callback?: (...args: unknown[]) => void;
|
|
91
|
+
} & (
|
|
92
|
+
| PageAPIEvent
|
|
93
|
+
| DetectAPIEvent
|
|
94
|
+
| IdentifyAPIEvent
|
|
95
|
+
| ChainAPIEvent
|
|
96
|
+
| TransactionAPIEvent
|
|
97
|
+
| SignatureAPIEvent
|
|
98
|
+
| ConnectAPIEvent
|
|
99
|
+
| DisconnectAPIEvent
|
|
100
|
+
| TrackAPIEvent
|
|
101
|
+
);
|
|
67
102
|
|
|
68
103
|
export enum SignatureStatus {
|
|
69
104
|
REQUESTED = "requested",
|
package/src/utils/base.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export const getActionDescriptor = (
|
|
2
|
-
return `${
|
|
1
|
+
export const getActionDescriptor = (type: string, properties: any): string => {
|
|
2
|
+
return `${type}${properties?.status ? ` ${properties?.status}` : ""}`;
|
|
3
3
|
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
const getFormattedTimestamp = (date: Date): string => date.toISOString();
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* To get the current timestamp in ISO string format
|
|
5
|
+
* @returns ISO formatted timestamp string
|
|
6
|
+
*/
|
|
7
|
+
const getCurrentTimeFormatted = (): string => getFormattedTimestamp(new Date());
|
|
8
|
+
|
|
9
|
+
export { getCurrentTimeFormatted, getFormattedTimestamp };
|