@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.
Files changed (254) hide show
  1. package/dist/cjs/src/FormoAnalytics.d.ts +69 -38
  2. package/dist/cjs/src/FormoAnalytics.d.ts.map +1 -1
  3. package/dist/cjs/src/FormoAnalytics.js +143 -198
  4. package/dist/cjs/src/FormoAnalytics.js.map +1 -1
  5. package/dist/cjs/src/FormoAnalyticsProvider.js +5 -5
  6. package/dist/cjs/src/FormoAnalyticsProvider.js.map +1 -1
  7. package/dist/cjs/src/constants/config.d.ts +1 -1
  8. package/dist/cjs/src/constants/config.d.ts.map +1 -1
  9. package/dist/cjs/src/constants/config.js +1 -1
  10. package/dist/cjs/src/constants/config.js.map +1 -1
  11. package/dist/cjs/src/constants/events.d.ts +14 -5
  12. package/dist/cjs/src/constants/events.d.ts.map +1 -1
  13. package/dist/cjs/src/constants/events.js +20 -12
  14. package/dist/cjs/src/constants/events.js.map +1 -1
  15. package/dist/cjs/src/lib/event/EventFactory.d.ts +22 -54
  16. package/dist/cjs/src/lib/event/EventFactory.d.ts.map +1 -1
  17. package/dist/cjs/src/lib/event/EventFactory.js +187 -116
  18. package/dist/cjs/src/lib/event/EventFactory.js.map +1 -1
  19. package/dist/cjs/src/lib/event/EventManager.d.ts +22 -0
  20. package/dist/cjs/src/lib/event/EventManager.d.ts.map +1 -0
  21. package/dist/cjs/src/lib/event/EventManager.js +48 -0
  22. package/dist/cjs/src/lib/event/EventManager.js.map +1 -0
  23. package/dist/cjs/src/lib/event/constants.d.ts +4 -0
  24. package/dist/cjs/src/lib/event/constants.d.ts.map +1 -0
  25. package/dist/cjs/src/lib/event/constants.js +8 -0
  26. package/dist/cjs/src/lib/event/constants.js.map +1 -0
  27. package/dist/cjs/src/lib/event/index.d.ts +1 -0
  28. package/dist/cjs/src/lib/event/index.d.ts.map +1 -1
  29. package/dist/cjs/src/lib/event/index.js +1 -0
  30. package/dist/cjs/src/lib/event/index.js.map +1 -1
  31. package/dist/cjs/src/lib/event/type.d.ts +5 -3
  32. package/dist/cjs/src/lib/event/type.d.ts.map +1 -1
  33. package/dist/cjs/src/lib/event/utils.d.ts +4 -0
  34. package/dist/cjs/src/lib/event/utils.d.ts.map +1 -0
  35. package/dist/cjs/src/lib/event/utils.js +16 -0
  36. package/dist/cjs/src/lib/event/utils.js.map +1 -0
  37. package/dist/cjs/src/lib/fetch.d.ts +1 -1
  38. package/dist/cjs/src/lib/queue/EventQueue.d.ts +1 -0
  39. package/dist/cjs/src/lib/queue/EventQueue.d.ts.map +1 -1
  40. package/dist/cjs/src/lib/queue/EventQueue.js +20 -12
  41. package/dist/cjs/src/lib/queue/EventQueue.js.map +1 -1
  42. package/dist/cjs/src/lib/ramda/internal/_curry1.d.ts +10 -0
  43. package/dist/cjs/src/lib/ramda/internal/_curry1.d.ts.map +1 -0
  44. package/dist/cjs/src/lib/ramda/internal/_curry1.js +26 -0
  45. package/dist/cjs/src/lib/ramda/internal/_curry1.js.map +1 -0
  46. package/dist/cjs/src/lib/ramda/internal/_curry2.d.ts +10 -0
  47. package/dist/cjs/src/lib/ramda/internal/_curry2.d.ts.map +1 -0
  48. package/dist/cjs/src/lib/ramda/internal/_curry2.js +43 -0
  49. package/dist/cjs/src/lib/ramda/internal/_curry2.js.map +1 -0
  50. package/dist/cjs/src/lib/ramda/internal/_curry3.d.ts +10 -0
  51. package/dist/cjs/src/lib/ramda/internal/_curry3.d.ts.map +1 -0
  52. package/dist/cjs/src/lib/ramda/internal/_curry3.js +74 -0
  53. package/dist/cjs/src/lib/ramda/internal/_curry3.js.map +1 -0
  54. package/dist/cjs/src/lib/ramda/internal/_has.d.ts +2 -0
  55. package/dist/cjs/src/lib/ramda/internal/_has.d.ts.map +1 -0
  56. package/dist/cjs/src/lib/ramda/internal/_has.js +7 -0
  57. package/dist/cjs/src/lib/ramda/internal/_has.js.map +1 -0
  58. package/dist/cjs/src/lib/ramda/internal/_isObject.d.ts +2 -0
  59. package/dist/cjs/src/lib/ramda/internal/_isObject.d.ts.map +1 -0
  60. package/dist/cjs/src/lib/ramda/internal/_isObject.js +7 -0
  61. package/dist/cjs/src/lib/ramda/internal/_isObject.js.map +1 -0
  62. package/dist/cjs/src/lib/ramda/internal/_isPlaceholder.d.ts +2 -0
  63. package/dist/cjs/src/lib/ramda/internal/_isPlaceholder.d.ts.map +1 -0
  64. package/dist/cjs/src/lib/ramda/internal/_isPlaceholder.js +7 -0
  65. package/dist/cjs/src/lib/ramda/internal/_isPlaceholder.js.map +1 -0
  66. package/dist/cjs/src/lib/ramda/mergeDeepRight.d.ts +3 -0
  67. package/dist/cjs/src/lib/ramda/mergeDeepRight.d.ts.map +1 -0
  68. package/dist/cjs/src/lib/ramda/mergeDeepRight.js +14 -0
  69. package/dist/cjs/src/lib/ramda/mergeDeepRight.js.map +1 -0
  70. package/dist/cjs/src/lib/ramda/mergeDeepWithKey.d.ts +3 -0
  71. package/dist/cjs/src/lib/ramda/mergeDeepWithKey.d.ts.map +1 -0
  72. package/dist/cjs/src/lib/ramda/mergeDeepWithKey.js +20 -0
  73. package/dist/cjs/src/lib/ramda/mergeDeepWithKey.js.map +1 -0
  74. package/dist/cjs/src/lib/ramda/mergeWithKey.d.ts +3 -0
  75. package/dist/cjs/src/lib/ramda/mergeWithKey.d.ts.map +1 -0
  76. package/dist/cjs/src/lib/ramda/mergeWithKey.js +26 -0
  77. package/dist/cjs/src/lib/ramda/mergeWithKey.js.map +1 -0
  78. package/dist/cjs/src/lib/storage/native.d.ts +1 -0
  79. package/dist/cjs/src/lib/storage/native.d.ts.map +1 -1
  80. package/dist/cjs/src/lib/storage/native.js +3 -0
  81. package/dist/cjs/src/lib/storage/native.js.map +1 -1
  82. package/dist/cjs/src/lib/version.d.ts +2 -0
  83. package/dist/cjs/src/lib/version.d.ts.map +1 -0
  84. package/dist/cjs/src/lib/version.js +6 -0
  85. package/dist/cjs/src/lib/version.js.map +1 -0
  86. package/dist/cjs/src/types/base.d.ts +1 -0
  87. package/dist/cjs/src/types/base.d.ts.map +1 -1
  88. package/dist/cjs/src/types/events.d.ts +55 -27
  89. package/dist/cjs/src/types/events.d.ts.map +1 -1
  90. package/dist/cjs/src/types/events.js.map +1 -1
  91. package/dist/cjs/src/utils/base.d.ts +1 -1
  92. package/dist/cjs/src/utils/base.d.ts.map +1 -1
  93. package/dist/cjs/src/utils/base.js +2 -2
  94. package/dist/cjs/src/utils/base.js.map +1 -1
  95. package/dist/cjs/src/utils/timestamp.d.ts +8 -0
  96. package/dist/cjs/src/utils/timestamp.d.ts.map +1 -0
  97. package/dist/cjs/src/utils/timestamp.js +12 -0
  98. package/dist/cjs/src/utils/timestamp.js.map +1 -0
  99. package/dist/cjs/src/validators/checks.d.ts +77 -0
  100. package/dist/cjs/src/validators/checks.d.ts.map +1 -0
  101. package/dist/cjs/src/validators/checks.js +141 -0
  102. package/dist/cjs/src/validators/checks.js.map +1 -0
  103. package/dist/cjs/src/validators/index.d.ts +1 -1
  104. package/dist/cjs/src/validators/index.d.ts.map +1 -1
  105. package/dist/cjs/src/validators/index.js +1 -1
  106. package/dist/cjs/src/validators/index.js.map +1 -1
  107. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  108. package/dist/esm/src/FormoAnalytics.d.ts +69 -38
  109. package/dist/esm/src/FormoAnalytics.d.ts.map +1 -1
  110. package/dist/esm/src/FormoAnalytics.js +146 -201
  111. package/dist/esm/src/FormoAnalytics.js.map +1 -1
  112. package/dist/esm/src/FormoAnalyticsProvider.js +5 -5
  113. package/dist/esm/src/FormoAnalyticsProvider.js.map +1 -1
  114. package/dist/esm/src/constants/config.d.ts +1 -1
  115. package/dist/esm/src/constants/config.d.ts.map +1 -1
  116. package/dist/esm/src/constants/config.js +1 -1
  117. package/dist/esm/src/constants/config.js.map +1 -1
  118. package/dist/esm/src/constants/events.d.ts +14 -5
  119. package/dist/esm/src/constants/events.d.ts.map +1 -1
  120. package/dist/esm/src/constants/events.js +19 -11
  121. package/dist/esm/src/constants/events.js.map +1 -1
  122. package/dist/esm/src/lib/event/EventFactory.d.ts +22 -54
  123. package/dist/esm/src/lib/event/EventFactory.d.ts.map +1 -1
  124. package/dist/esm/src/lib/event/EventFactory.js +185 -117
  125. package/dist/esm/src/lib/event/EventFactory.js.map +1 -1
  126. package/dist/esm/src/lib/event/EventManager.d.ts +22 -0
  127. package/dist/esm/src/lib/event/EventManager.d.ts.map +1 -0
  128. package/dist/esm/src/lib/event/EventManager.js +45 -0
  129. package/dist/esm/src/lib/event/EventManager.js.map +1 -0
  130. package/dist/esm/src/lib/event/constants.d.ts +4 -0
  131. package/dist/esm/src/lib/event/constants.d.ts.map +1 -0
  132. package/dist/esm/src/lib/event/constants.js +4 -0
  133. package/dist/esm/src/lib/event/constants.js.map +1 -0
  134. package/dist/esm/src/lib/event/index.d.ts +1 -0
  135. package/dist/esm/src/lib/event/index.d.ts.map +1 -1
  136. package/dist/esm/src/lib/event/index.js +1 -0
  137. package/dist/esm/src/lib/event/index.js.map +1 -1
  138. package/dist/esm/src/lib/event/type.d.ts +5 -3
  139. package/dist/esm/src/lib/event/type.d.ts.map +1 -1
  140. package/dist/esm/src/lib/event/utils.d.ts +4 -0
  141. package/dist/esm/src/lib/event/utils.d.ts.map +1 -0
  142. package/dist/esm/src/lib/event/utils.js +13 -0
  143. package/dist/esm/src/lib/event/utils.js.map +1 -0
  144. package/dist/esm/src/lib/queue/EventQueue.d.ts +1 -0
  145. package/dist/esm/src/lib/queue/EventQueue.d.ts.map +1 -1
  146. package/dist/esm/src/lib/queue/EventQueue.js +20 -12
  147. package/dist/esm/src/lib/queue/EventQueue.js.map +1 -1
  148. package/dist/esm/src/lib/ramda/internal/_curry1.d.ts +10 -0
  149. package/dist/esm/src/lib/ramda/internal/_curry1.d.ts.map +1 -0
  150. package/dist/esm/src/lib/ramda/internal/_curry1.js +20 -0
  151. package/dist/esm/src/lib/ramda/internal/_curry1.js.map +1 -0
  152. package/dist/esm/src/lib/ramda/internal/_curry2.d.ts +10 -0
  153. package/dist/esm/src/lib/ramda/internal/_curry2.d.ts.map +1 -0
  154. package/dist/esm/src/lib/ramda/internal/_curry2.js +37 -0
  155. package/dist/esm/src/lib/ramda/internal/_curry2.js.map +1 -0
  156. package/dist/esm/src/lib/ramda/internal/_curry3.d.ts +10 -0
  157. package/dist/esm/src/lib/ramda/internal/_curry3.d.ts.map +1 -0
  158. package/dist/esm/src/lib/ramda/internal/_curry3.js +68 -0
  159. package/dist/esm/src/lib/ramda/internal/_curry3.js.map +1 -0
  160. package/dist/esm/src/lib/ramda/internal/_has.d.ts +2 -0
  161. package/dist/esm/src/lib/ramda/internal/_has.d.ts.map +1 -0
  162. package/dist/esm/src/lib/ramda/internal/_has.js +4 -0
  163. package/dist/esm/src/lib/ramda/internal/_has.js.map +1 -0
  164. package/dist/esm/src/lib/ramda/internal/_isObject.d.ts +2 -0
  165. package/dist/esm/src/lib/ramda/internal/_isObject.d.ts.map +1 -0
  166. package/dist/esm/src/lib/ramda/internal/_isObject.js +4 -0
  167. package/dist/esm/src/lib/ramda/internal/_isObject.js.map +1 -0
  168. package/dist/esm/src/lib/ramda/internal/_isPlaceholder.d.ts +2 -0
  169. package/dist/esm/src/lib/ramda/internal/_isPlaceholder.d.ts.map +1 -0
  170. package/dist/esm/src/lib/ramda/internal/_isPlaceholder.js +4 -0
  171. package/dist/esm/src/lib/ramda/internal/_isPlaceholder.js.map +1 -0
  172. package/dist/esm/src/lib/ramda/mergeDeepRight.d.ts +3 -0
  173. package/dist/esm/src/lib/ramda/mergeDeepRight.d.ts.map +1 -0
  174. package/dist/esm/src/lib/ramda/mergeDeepRight.js +9 -0
  175. package/dist/esm/src/lib/ramda/mergeDeepRight.js.map +1 -0
  176. package/dist/esm/src/lib/ramda/mergeDeepWithKey.d.ts +3 -0
  177. package/dist/esm/src/lib/ramda/mergeDeepWithKey.d.ts.map +1 -0
  178. package/dist/esm/src/lib/ramda/mergeDeepWithKey.js +15 -0
  179. package/dist/esm/src/lib/ramda/mergeDeepWithKey.js.map +1 -0
  180. package/dist/esm/src/lib/ramda/mergeWithKey.d.ts +3 -0
  181. package/dist/esm/src/lib/ramda/mergeWithKey.d.ts.map +1 -0
  182. package/dist/esm/src/lib/ramda/mergeWithKey.js +21 -0
  183. package/dist/esm/src/lib/ramda/mergeWithKey.js.map +1 -0
  184. package/dist/esm/src/lib/storage/native.d.ts +1 -0
  185. package/dist/esm/src/lib/storage/native.d.ts.map +1 -1
  186. package/dist/esm/src/lib/storage/native.js +3 -0
  187. package/dist/esm/src/lib/storage/native.js.map +1 -1
  188. package/dist/esm/src/lib/version.d.ts +2 -0
  189. package/dist/esm/src/lib/version.d.ts.map +1 -0
  190. package/dist/esm/src/lib/version.js +3 -0
  191. package/dist/esm/src/lib/version.js.map +1 -0
  192. package/dist/esm/src/types/base.d.ts +1 -0
  193. package/dist/esm/src/types/base.d.ts.map +1 -1
  194. package/dist/esm/src/types/events.d.ts +55 -27
  195. package/dist/esm/src/types/events.d.ts.map +1 -1
  196. package/dist/esm/src/types/events.js.map +1 -1
  197. package/dist/esm/src/utils/base.d.ts +1 -1
  198. package/dist/esm/src/utils/base.d.ts.map +1 -1
  199. package/dist/esm/src/utils/base.js +2 -2
  200. package/dist/esm/src/utils/base.js.map +1 -1
  201. package/dist/esm/src/utils/timestamp.d.ts +8 -0
  202. package/dist/esm/src/utils/timestamp.d.ts.map +1 -0
  203. package/dist/esm/src/utils/timestamp.js +8 -0
  204. package/dist/esm/src/utils/timestamp.js.map +1 -0
  205. package/dist/esm/src/validators/checks.d.ts +77 -0
  206. package/dist/esm/src/validators/checks.d.ts.map +1 -0
  207. package/dist/esm/src/validators/checks.js +119 -0
  208. package/dist/esm/src/validators/checks.js.map +1 -0
  209. package/dist/esm/src/validators/index.d.ts +1 -1
  210. package/dist/esm/src/validators/index.d.ts.map +1 -1
  211. package/dist/esm/src/validators/index.js +1 -1
  212. package/dist/esm/src/validators/index.js.map +1 -1
  213. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  214. package/dist/index.umd.min.js +1 -1
  215. package/dist/index.umd.min.js.map +1 -1
  216. package/package.json +3 -2
  217. package/src/FormoAnalytics.ts +380 -242
  218. package/src/FormoAnalyticsProvider.tsx +5 -5
  219. package/src/constants/config.ts +1 -1
  220. package/src/constants/events.ts +15 -4
  221. package/src/lib/event/EventFactory.ts +358 -163
  222. package/src/lib/event/EventManager.ts +39 -0
  223. package/src/lib/event/constants.ts +4 -0
  224. package/src/lib/event/index.ts +1 -0
  225. package/src/lib/event/type.ts +6 -8
  226. package/src/lib/event/utils.ts +15 -0
  227. package/src/lib/queue/EventQueue.ts +22 -10
  228. package/src/lib/ramda/internal/_curry1.ts +19 -0
  229. package/src/lib/ramda/internal/_curry2.ts +37 -0
  230. package/src/lib/ramda/internal/_curry3.ts +68 -0
  231. package/src/lib/ramda/internal/_has.ts +3 -0
  232. package/src/lib/ramda/internal/_isObject.ts +3 -0
  233. package/src/lib/ramda/internal/_isPlaceholder.ts +5 -0
  234. package/src/lib/ramda/mergeDeepRight.ts +13 -0
  235. package/src/lib/ramda/mergeDeepWithKey.ts +22 -0
  236. package/src/lib/ramda/mergeWithKey.ts +28 -0
  237. package/src/lib/storage/native.ts +4 -0
  238. package/src/lib/version.ts +2 -0
  239. package/src/types/base.ts +1 -0
  240. package/src/types/events.ts +93 -58
  241. package/src/utils/base.ts +2 -2
  242. package/src/utils/timestamp.ts +9 -0
  243. package/src/validators/checks.ts +160 -0
  244. package/src/validators/index.ts +1 -1
  245. package/tsconfig.json +1 -1
  246. package/dist/cjs/src/validators/type-check.d.ts +0 -14
  247. package/dist/cjs/src/validators/type-check.d.ts.map +0 -1
  248. package/dist/cjs/src/validators/type-check.js +0 -61
  249. package/dist/cjs/src/validators/type-check.js.map +0 -1
  250. package/dist/esm/src/validators/type-check.d.ts +0 -14
  251. package/dist/esm/src/validators/type-check.d.ts.map +0 -1
  252. package/dist/esm/src/validators/type-check.js +0 -46
  253. package/dist/esm/src/validators/type-check.js.map +0 -1
  254. 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 };
@@ -0,0 +1,4 @@
1
+ const CHANNEL = "web";
2
+ const VERSION = "0";
3
+
4
+ export { CHANNEL, VERSION };
@@ -1,2 +1,3 @@
1
1
  export * from "./EventFactory";
2
+ export * from "./EventManager";
2
3
  export * from "./type";
@@ -1,11 +1,9 @@
1
- import { UUID } from "crypto";
2
- import { APIEvent, IFormoEvent } from "../../types";
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 };
@@ -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 formattedTimestamp = toDateHourMinute(new Date(event.timestamp));
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(eventId)) {
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, timestamp: originTimestamp, id: eventId },
126
+ message: { ...event, message_id },
121
127
  callback,
122
128
  });
123
129
 
124
130
  logger.log(
125
- `Event enqueued: ${getActionDescriptor(event.action, event.payload)}`
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
- const data = items.map((item) => item.message);
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,3 @@
1
+ export default function _has(prop: any, obj: any) {
2
+ return Object.prototype.hasOwnProperty.call(obj, prop);
3
+ }
@@ -0,0 +1,3 @@
1
+ export default function _isObject(x: any) {
2
+ return Object.prototype.toString.call(x) === "[object Object]";
3
+ }
@@ -0,0 +1,5 @@
1
+ export default function _isPlaceholder(a: any) {
2
+ return (
3
+ a != null && typeof a === "object" && a["@@functional/placeholder"] === true
4
+ );
5
+ }
@@ -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")
@@ -0,0 +1,2 @@
1
+ // Generated by genversion.
2
+ export const version = '1.16.6';
package/src/types/base.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { LogLevel } from "../lib";
2
2
  import { EIP1193Provider } from "./provider";
3
3
 
4
+ export type Nullable<T> = T | null;
4
5
  // Decimal chain ID
5
6
  export type ChainID = number;
6
7
 
@@ -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 interface IFormoEvent {
5
- anonymous_id: UUID;
6
- user_id: string | null;
7
- action: string;
8
- payload: Record<string, unknown>;
9
- address: string | null;
10
- timestamp: string;
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
- id: string;
28
+ message_id: string;
16
29
  };
17
30
 
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
- };
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 = (action: string, payload: any): string => {
2
- return `${action}${payload?.status ? ` ${payload?.status}` : ""}`;
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 };