aesirx-analytics 2.2.20 → 2.2.21

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.
@@ -1690,20 +1690,331 @@ var AnalyticsContextProvider = ({ children }) => {
1690
1690
  };
1691
1691
  var AnalyticsContextProvider_default = AnalyticsContextProvider;
1692
1692
 
1693
+ // src/lib/envHelper.ts
1694
+ var getHashKey = () => {
1695
+ let value = null;
1696
+ try {
1697
+ if (typeof process.env != "undefined") {
1698
+ value = process.env.SECURE_LOCAL_STORAGE_HASH_KEY || process.env.REACT_APP_SECURE_LOCAL_STORAGE_HASH_KEY || process.env.NEXT_PUBLIC_SECURE_LOCAL_STORAGE_HASH_KEY || process.env.VITE_SECURE_LOCAL_STORAGE_HASH_KEY;
1699
+ } else {
1700
+ console.warn(`react-secure-storage : process is not defined! Just a warning!`);
1701
+ }
1702
+ } catch (ex) {
1703
+ return null;
1704
+ }
1705
+ return value;
1706
+ };
1707
+ var getStoragePrefix = () => {
1708
+ let value = null;
1709
+ try {
1710
+ if (typeof process.env != "undefined") {
1711
+ value = process.env.SECURE_LOCAL_STORAGE_PREFIX || process.env.REACT_APP_SECURE_LOCAL_STORAGE_PREFIX || process.env.NEXT_PUBLIC_SECURE_LOCAL_STORAGE_PREFIX || process.env.VITE_SECURE_LOCAL_STORAGE_PREFIX;
1712
+ } else {
1713
+ console.warn(`react-secure-storage : process is not defined! Just a warning!`);
1714
+ }
1715
+ } catch (ex) {
1716
+ return null;
1717
+ }
1718
+ return value;
1719
+ };
1720
+ var getDisabledKeys = () => {
1721
+ let value = null;
1722
+ try {
1723
+ if (typeof process.env != "undefined") {
1724
+ value = process.env.SECURE_LOCAL_STORAGE_DISABLED_KEYS || process.env.REACT_APP_SECURE_LOCAL_STORAGE_DISABLED_KEYS || process.env.NEXT_PUBLIC_SECURE_LOCAL_STORAGE_DISABLED_KEYS || process.env.VITE_SECURE_LOCAL_STORAGE_DISABLED_KEYS;
1725
+ } else {
1726
+ console.warn(`react-secure-storage : process is not defined! Just a warning!`);
1727
+ }
1728
+ } catch (ex) {
1729
+ return null;
1730
+ }
1731
+ return value;
1732
+ };
1733
+ var envHelper = {
1734
+ getHashKey,
1735
+ getStoragePrefix,
1736
+ getDisabledKeys
1737
+ };
1738
+ var envHelper_default = envHelper;
1739
+
1740
+ // src/lib/fingerpint.lib.ts
1741
+ import murmurhash3_32_gc from "murmurhash-js/murmurhash3_gc";
1742
+
1743
+ // src/lib/utils.ts
1744
+ var FINGERPRINT_KEYS = {
1745
+ USERAGENT: "UserAgent",
1746
+ SCREEN_PRINT: "ScreenPrint",
1747
+ PLUGINS: "Plugins",
1748
+ FONTS: "Fonts",
1749
+ LOCAL_STORAGE: "LocalStorage",
1750
+ SESSION_STORAGE: "SessionStorage",
1751
+ TIMEZONE: "TimeZone",
1752
+ LANGUAGE: "Language",
1753
+ SYSTEM_LANGUAGE: "SystemLanguage",
1754
+ COOKIE: "Cookie",
1755
+ CANVAS: "Canvas",
1756
+ HOSTNAME: "Hostname"
1757
+ };
1758
+ var getDisabledKeys2 = () => {
1759
+ const DISABLED_KEYS = envHelper_default.getDisabledKeys() || "";
1760
+ if (DISABLED_KEYS === "")
1761
+ return [];
1762
+ const allOptions = [
1763
+ FINGERPRINT_KEYS.USERAGENT,
1764
+ FINGERPRINT_KEYS.SCREEN_PRINT,
1765
+ FINGERPRINT_KEYS.PLUGINS,
1766
+ FINGERPRINT_KEYS.FONTS,
1767
+ FINGERPRINT_KEYS.LOCAL_STORAGE,
1768
+ FINGERPRINT_KEYS.SESSION_STORAGE,
1769
+ FINGERPRINT_KEYS.TIMEZONE,
1770
+ FINGERPRINT_KEYS.LANGUAGE,
1771
+ FINGERPRINT_KEYS.SYSTEM_LANGUAGE,
1772
+ FINGERPRINT_KEYS.COOKIE,
1773
+ FINGERPRINT_KEYS.CANVAS,
1774
+ FINGERPRINT_KEYS.HOSTNAME
1775
+ ];
1776
+ const response = [];
1777
+ DISABLED_KEYS.split("|").forEach((key) => {
1778
+ if (key === "") {
1779
+ console.log("test");
1780
+ } else if (allOptions.includes(key))
1781
+ response.push(key);
1782
+ else
1783
+ console.warn(
1784
+ `react-secure-storage : ${key} is not present in the available disabled keys options! Please go through the documentation`
1785
+ );
1786
+ });
1787
+ return response;
1788
+ };
1789
+
1790
+ // src/lib/fingerpint.lib.ts
1791
+ var ClientJS = class {
1792
+ //
1793
+ // MAIN METHODS
1794
+ //
1795
+ // Get Fingerprint. Return a 32-bit integer representing the browsers fingerprint.
1796
+ getFingerprint() {
1797
+ const bar = "|";
1798
+ const disabledKeys = getDisabledKeys2();
1799
+ let key = "";
1800
+ if (!disabledKeys.includes(FINGERPRINT_KEYS.USERAGENT)) {
1801
+ key += navigator.userAgent + bar;
1802
+ }
1803
+ if (!disabledKeys.includes(FINGERPRINT_KEYS.HOSTNAME)) {
1804
+ key += window.location.hostname + bar;
1805
+ }
1806
+ if (!disabledKeys.includes(FINGERPRINT_KEYS.SCREEN_PRINT)) {
1807
+ key += this.getScreenPrint() + bar;
1808
+ }
1809
+ if (!disabledKeys.includes(FINGERPRINT_KEYS.PLUGINS)) {
1810
+ key += this.getPlugins() + bar;
1811
+ }
1812
+ if (!disabledKeys.includes(FINGERPRINT_KEYS.FONTS)) {
1813
+ key += this.getFonts() + bar;
1814
+ }
1815
+ if (!disabledKeys.includes(FINGERPRINT_KEYS.LOCAL_STORAGE)) {
1816
+ key += this.isLocalStorage() + bar;
1817
+ }
1818
+ if (!disabledKeys.includes(FINGERPRINT_KEYS.SESSION_STORAGE)) {
1819
+ key += this.isSessionStorage() + bar;
1820
+ }
1821
+ if (!disabledKeys.includes(FINGERPRINT_KEYS.TIMEZONE)) {
1822
+ key += this.getTimeZone() + bar;
1823
+ }
1824
+ if (!disabledKeys.includes(FINGERPRINT_KEYS.LANGUAGE)) {
1825
+ key += this.getLanguage() + bar;
1826
+ }
1827
+ if (!disabledKeys.includes(FINGERPRINT_KEYS.SYSTEM_LANGUAGE)) {
1828
+ key += this.getSystemLanguage() + bar;
1829
+ }
1830
+ if (!disabledKeys.includes(FINGERPRINT_KEYS.COOKIE)) {
1831
+ key += this.isCookie() + bar;
1832
+ }
1833
+ if (!disabledKeys.includes(FINGERPRINT_KEYS.CANVAS)) {
1834
+ key += this.getCanvasPrint();
1835
+ }
1836
+ if (key.endsWith(bar))
1837
+ key = key.substring(0, key.length - 1);
1838
+ const seed = 256;
1839
+ return murmurhash3_32_gc(key, seed);
1840
+ }
1841
+ //
1842
+ // SCREEN METHODS
1843
+ //
1844
+ // Get Screen Print. Return a string containing screen information.
1845
+ getScreenPrint() {
1846
+ return "Color Depth: " + this.getColorDepth() + ", Device XDPI: " + this.getDeviceXDPI() + ", Device YDPI: " + this.getDeviceYDPI();
1847
+ }
1848
+ // Get Color Depth. Return a string containing the color depth.
1849
+ getColorDepth() {
1850
+ return window.screen.colorDepth;
1851
+ }
1852
+ // Get Current Resolution. Return a string containing the current resolution.
1853
+ getCurrentResolution() {
1854
+ return window.screen.width + "x" + window.screen.height;
1855
+ }
1856
+ // Get Available Resolution. Return a string containing the available resolution.
1857
+ getAvailableResolution() {
1858
+ return window.screen.availWidth + "x" + window.screen.availHeight;
1859
+ }
1860
+ // Get Device XPDI. Return a string containing the device XPDI.
1861
+ getDeviceXDPI() {
1862
+ return "";
1863
+ }
1864
+ // Get Device YDPI. Return a string containing the device YDPI.
1865
+ getDeviceYDPI() {
1866
+ return "";
1867
+ }
1868
+ //
1869
+ // PLUGIN METHODS
1870
+ //
1871
+ // Get Plugins. Return a string containing a list of installed plugins.
1872
+ getPlugins() {
1873
+ let pluginsList = "";
1874
+ for (let i = 0; i < navigator.plugins.length; i++) {
1875
+ if (i === navigator.plugins.length - 1) {
1876
+ pluginsList += navigator.plugins[i].name;
1877
+ } else {
1878
+ pluginsList += navigator.plugins[i].name + ", ";
1879
+ }
1880
+ }
1881
+ return pluginsList;
1882
+ }
1883
+ //
1884
+ // FONT METHODS
1885
+ //
1886
+ // Get Fonts. Return a string containing a list of installed fonts.
1887
+ getFonts() {
1888
+ const fontString = "";
1889
+ return fontString;
1890
+ }
1891
+ //
1892
+ // STORAGE METHODS
1893
+ //
1894
+ // Is Local Storage. Check if local storage is enabled.
1895
+ isLocalStorage() {
1896
+ try {
1897
+ return !!localStorage;
1898
+ } catch (e2) {
1899
+ return true;
1900
+ }
1901
+ }
1902
+ // Is Session Storage. Check if session storage is enabled.
1903
+ isSessionStorage() {
1904
+ try {
1905
+ return !!sessionStorage;
1906
+ } catch (e2) {
1907
+ return true;
1908
+ }
1909
+ }
1910
+ // Is Cookie. Check if cookies are enabled.
1911
+ isCookie() {
1912
+ return navigator.cookieEnabled;
1913
+ }
1914
+ //
1915
+ // TIME METHODS
1916
+ //
1917
+ // Get Time Zone. Return a string containing the time zone.
1918
+ getTimeZone() {
1919
+ const rightNow = /* @__PURE__ */ new Date();
1920
+ let myNumber, formattedNumber, result;
1921
+ myNumber = String(-(rightNow.getTimezoneOffset() / 60));
1922
+ if (myNumber < 0) {
1923
+ myNumber = myNumber * -1;
1924
+ formattedNumber = ("0" + myNumber).slice(-2);
1925
+ result = "-" + formattedNumber;
1926
+ } else {
1927
+ formattedNumber = ("0" + myNumber).slice(-2);
1928
+ result = "+" + formattedNumber;
1929
+ }
1930
+ return result;
1931
+ }
1932
+ //
1933
+ // LANGUAGE METHODS
1934
+ //
1935
+ // Get Language. Return a string containing the user language.
1936
+ getLanguage() {
1937
+ return navigator.language;
1938
+ }
1939
+ // Get System Language. Return a string containing the system language.
1940
+ getSystemLanguage() {
1941
+ return navigator.language || window.navigator.language;
1942
+ }
1943
+ // Get Canvas Print. Return a string containing the canvas URI data.
1944
+ getCanvasPrint() {
1945
+ const canvas = document.createElement("canvas");
1946
+ let ctx;
1947
+ try {
1948
+ ctx = canvas.getContext("2d");
1949
+ } catch (e2) {
1950
+ return "";
1951
+ }
1952
+ const txt = "ClientJS,org <canvas> 1.0";
1953
+ ctx.textBaseline = "top";
1954
+ ctx.font = "14px 'Arial'";
1955
+ ctx.textBaseline = "alphabetic";
1956
+ ctx.fillStyle = "#f60";
1957
+ ctx.fillRect(125, 1, 62, 20);
1958
+ ctx.fillStyle = "#069";
1959
+ ctx.fillText(txt, 2, 15);
1960
+ ctx.fillStyle = "rgba(102, 204, 0, 0.7)";
1961
+ ctx.fillText(txt, 4, 17);
1962
+ return canvas.toDataURL();
1963
+ }
1964
+ };
1965
+ var clientJS = new ClientJS();
1966
+ var fingerpint_lib_default = clientJS;
1967
+
1968
+ // src/lib/fingerprint.ts
1969
+ var HASH_KEY = "E86E2612010258B35137";
1970
+ var getFingerprint = () => {
1971
+ const HASH_KEY_CUSTOM = envHelper_default.getHashKey() || HASH_KEY;
1972
+ if (typeof window === "undefined")
1973
+ return HASH_KEY_CUSTOM;
1974
+ return fingerpint_lib_default.getFingerprint() + HASH_KEY_CUSTOM;
1975
+ };
1976
+ var fingerprint_default = getFingerprint;
1977
+
1693
1978
  // src/utils/consent.ts
1694
1979
  import { stringMessage } from "@concordium/react-components";
1695
1980
  import axios from "axios";
1696
- var agreeConsents = async (endpoint, level, uuid, consent, wallet, signature, web3id, jwt, network = "concordium", gtagId, gtmId, layout) => {
1981
+ import Bowser from "bowser";
1982
+ var agreeConsents = async (endpoint, level, uuid, consent, wallet, signature, web3id, jwt, network = "concordium", gtagId, gtmId) => {
1697
1983
  const url = `${endpoint}/consent/v1/level${level}/${uuid}`;
1698
1984
  const urlV2 = `${endpoint}/consent/v2/level${level}/${uuid}`;
1699
1985
  if (sessionStorage.getItem("consentGranted") !== "true") {
1700
- gtagId && consentModeGrant(true, gtagId, layout);
1701
- gtmId && consentModeGrant(false, gtmId, layout);
1986
+ gtagId && consentModeGrant(true, gtagId);
1987
+ gtmId && consentModeGrant(false, gtmId);
1702
1988
  }
1989
+ const fingerprint = fingerprint_default();
1990
+ const { location, document: document2 } = window;
1991
+ const { pathname, search, origin } = location;
1992
+ const currentUrl = `${origin}${pathname}${search}`;
1993
+ const referer = document2.referrer ? document2.referrer : window["referer"] ? window["referer"] === "/" ? location.protocol + "//" + location.host : location.protocol + "//" + location.host + window["referer"] : "";
1994
+ const user_agent = window.navigator.userAgent;
1995
+ const browser = Bowser.parse(window.navigator.userAgent);
1996
+ const browser_name = browser?.browser?.name;
1997
+ const browser_version = browser?.browser?.version ?? "0";
1998
+ const lang = window.navigator["userLanguage"] || window.navigator.language;
1999
+ const device = browser?.platform?.model ?? browser?.platform?.type;
2000
+ const ip = "";
2001
+ const dataPayload = {
2002
+ fingerprint,
2003
+ url: currentUrl?.replace(/^(https?:\/\/)?(www\.)?/, "$1"),
2004
+ ...referer && (referer !== currentUrl || document2.referrer) && {
2005
+ referer: referer !== currentUrl ? referer?.replace(/^(https?:\/\/)?(www\.)?/, "$1") : document2.referrer?.replace(/^(https?:\/\/)?(www\.)?/, "$1")
2006
+ },
2007
+ user_agent,
2008
+ ip,
2009
+ browser_name,
2010
+ browser_version,
2011
+ lang,
2012
+ device: device?.includes("iPhone") ? "mobile" : device?.includes("iPad") ? "tablet" : device
2013
+ };
1703
2014
  try {
1704
2015
  switch (level) {
1705
2016
  case 1:
1706
- await axios.post(`${url}/${consent}`);
2017
+ await axios.post(`${url}/${consent}`, { ...dataPayload });
1707
2018
  break;
1708
2019
  case 2:
1709
2020
  await axios.post(
@@ -1720,7 +2031,8 @@ var agreeConsents = async (endpoint, level, uuid, consent, wallet, signature, we
1720
2031
  case 3:
1721
2032
  await axios.post(`${url}/${network}/${wallet}`, {
1722
2033
  signature,
1723
- consent
2034
+ consent,
2035
+ ...dataPayload
1724
2036
  });
1725
2037
  break;
1726
2038
  case 4:
@@ -1728,7 +2040,8 @@ var agreeConsents = async (endpoint, level, uuid, consent, wallet, signature, we
1728
2040
  `${urlV2}/${network}/${wallet}`,
1729
2041
  {
1730
2042
  signature,
1731
- consent
2043
+ consent,
2044
+ ...dataPayload
1732
2045
  },
1733
2046
  {
1734
2047
  headers: {
@@ -1745,19 +2058,17 @@ var agreeConsents = async (endpoint, level, uuid, consent, wallet, signature, we
1745
2058
  throw error;
1746
2059
  }
1747
2060
  };
1748
- var consentModeGrant = async (isGtag, id, layout) => {
2061
+ var consentModeGrant = async (isGtag, id) => {
1749
2062
  async function gtag(p0, p1, p2) {
1750
2063
  dataLayer.push(arguments);
1751
2064
  }
1752
- if (layout === "simple-consent-mode") {
1753
- if (isGtag && !document.querySelector(`script[src="https://www.googletagmanager.com/gtag/js?id=${id}"]`)) {
1754
- await loadGtagScript(id);
1755
- gtag("js", /* @__PURE__ */ new Date());
1756
- gtag("config", `${id}`);
1757
- } else if (!isGtag && !document.querySelector(`script[src="https://www.googletagmanager.com/gtm.js?id=${id}"]`)) {
1758
- await loadGtmScript(id);
1759
- dataLayer.push({ "gtm.start": (/* @__PURE__ */ new Date()).getTime(), event: "gtm.js" });
1760
- }
2065
+ if (isGtag && !document.querySelector(`script[src="https://www.googletagmanager.com/gtag/js?id=${id}"]`)) {
2066
+ await loadGtagScript(id);
2067
+ gtag("js", /* @__PURE__ */ new Date());
2068
+ gtag("config", `${id}`);
2069
+ } else if (!isGtag && !document.querySelector(`script[src="https://www.googletagmanager.com/gtm.js?id=${id}"]`)) {
2070
+ await loadGtmScript(id);
2071
+ dataLayer.push({ "gtm.start": (/* @__PURE__ */ new Date()).getTime(), event: "gtm.js" });
1761
2072
  }
1762
2073
  sessionStorage.setItem("consentGranted", "true");
1763
2074
  gtag("consent", "update", {
@@ -1970,6 +2281,7 @@ export {
1970
2281
  useTranslation,
1971
2282
  AnalyticsContext,
1972
2283
  AnalyticsContextProvider_default,
2284
+ fingerprint_default,
1973
2285
  agreeConsents,
1974
2286
  loadGtagScript,
1975
2287
  loadGtmScript,
@@ -0,0 +1,182 @@
1
+ import {
2
+ fingerprint_default
3
+ } from "./chunk-NTEWP6UQ.js";
4
+
5
+ // src/utils/services.ts
6
+ var cache;
7
+ var assign = (a, b) => {
8
+ Object.keys(b).forEach((key) => {
9
+ if (b[key] !== void 0)
10
+ a[key] = b[key];
11
+ });
12
+ return a;
13
+ };
14
+ var trackerService = async (endpoint, payload) => {
15
+ const fetchData = await fetch(endpoint, {
16
+ method: "POST",
17
+ body: JSON.stringify(payload),
18
+ headers: assign({ "Content-Type": "application/json" }, { ["x-tracker-cache"]: cache })
19
+ });
20
+ const response = await fetchData.json();
21
+ if (response.error) {
22
+ throw response.error;
23
+ } else {
24
+ return response;
25
+ }
26
+ };
27
+
28
+ // src/utils/index.ts
29
+ import Bowser from "bowser";
30
+ var createRequest = (endpoint, task) => {
31
+ return `${endpoint}/visitor/v1/${task}`;
32
+ };
33
+ var createRequestV2 = (endpoint, task) => {
34
+ return `${endpoint}/visitor/v2/${task}`;
35
+ };
36
+ var rememberFlow = (endpoint, flow) => {
37
+ return `${endpoint}/remember_flow/${flow}`;
38
+ };
39
+ var startTracker = async (endpoint, url, referer, user_agent, attributesVisit) => {
40
+ const allow = sessionStorage.getItem("aesirx-analytics-allow");
41
+ const reject = sessionStorage.getItem("aesirx-analytics-rejected");
42
+ if (allow === "0" || reject === "true") {
43
+ return null;
44
+ }
45
+ const { location, document: document2 } = window;
46
+ const { pathname, search, origin } = location;
47
+ url = `${origin}${pathname}${search}`;
48
+ referer = referer ? location.protocol + "//" + location.host + referer : document2.referrer ? document2.referrer : window["referer"] ? window["referer"] === "/" ? location.protocol + "//" + location.host : location.protocol + "//" + location.host + window["referer"] : "";
49
+ user_agent = window.navigator.userAgent;
50
+ const browser = Bowser.parse(window.navigator.userAgent);
51
+ const browser_name = browser?.browser?.name;
52
+ const browser_version = browser?.browser?.version ?? "0";
53
+ const lang = window.navigator["userLanguage"] || window.navigator.language;
54
+ const device = browser?.platform?.model ?? browser?.platform?.type;
55
+ const queryString = window.location.search;
56
+ const urlParams = new URLSearchParams(queryString);
57
+ const ip = "";
58
+ try {
59
+ const fingerprint = fingerprint_default();
60
+ const attributes = [];
61
+ for (const key of urlParams.keys()) {
62
+ if (key.startsWith("utm_")) {
63
+ urlParams.get(key) && attributes.push({ name: key, value: urlParams.get(key) });
64
+ }
65
+ }
66
+ if (attributesVisit?.length) {
67
+ attributesVisit?.forEach((element) => {
68
+ element?.name && attributes.push({ name: element?.name, value: element?.value });
69
+ });
70
+ }
71
+ const responseStart = await trackerService(createRequestV2(endpoint, "start"), {
72
+ fingerprint,
73
+ url: url?.replace(/^(https?:\/\/)?(www\.)?/, "$1"),
74
+ ...referer && (referer !== url || document2.referrer) && {
75
+ referer: referer !== url ? referer?.replace(/^(https?:\/\/)?(www\.)?/, "$1") : document2.referrer?.replace(/^(https?:\/\/)?(www\.)?/, "$1")
76
+ },
77
+ user_agent,
78
+ ip,
79
+ browser_name,
80
+ browser_version,
81
+ lang,
82
+ device: device?.includes("iPhone") ? "mobile" : device?.includes("iPad") ? "tablet" : device,
83
+ ...attributes?.length && {
84
+ event_name: "visit",
85
+ event_type: "action",
86
+ attributes
87
+ }
88
+ });
89
+ if (window["aesirxTrackEcommerce"] === "true" && sessionStorage.getItem("aesirx-analytics-flow") !== (await responseStart)?.flow_uuid) {
90
+ sessionStorage.setItem("aesirx-analytics-flow", (await responseStart)?.flow_uuid);
91
+ try {
92
+ await trackerService(
93
+ rememberFlow(window.location.origin, (await responseStart)?.flow_uuid),
94
+ {}
95
+ );
96
+ } catch (error) {
97
+ console.log("Remember Flow Error", error);
98
+ }
99
+ }
100
+ return responseStart;
101
+ } catch (error) {
102
+ console.error("Analytics Error: ", error);
103
+ }
104
+ };
105
+ var trackEvent = async (endpoint, referer, data) => {
106
+ const allow = sessionStorage.getItem("aesirx-analytics-allow");
107
+ const reject = sessionStorage.getItem("aesirx-analytics-rejected");
108
+ if (allow === "0" || reject === "true") {
109
+ return null;
110
+ }
111
+ const { location, document: document2 } = window;
112
+ referer = referer ? location.protocol + "//" + location.host + referer : document2.referrer ? document2.referrer : window["referer"] ? window["referer"] === "/" ? location.protocol + "//" + location.host : location.protocol + "//" + location.host + window["referer"] : "";
113
+ const url = location.protocol + "//" + location.host + location.pathname;
114
+ const user_agent = window.navigator.userAgent;
115
+ const browser = Bowser.parse(window.navigator.userAgent);
116
+ const browser_name = browser?.browser?.name;
117
+ const browser_version = browser?.browser?.version ?? "0";
118
+ const lang = window.navigator["userLanguage"] || window.navigator.language;
119
+ const device = browser?.platform?.model ?? browser?.platform?.type;
120
+ const ip = "";
121
+ const fingerprint = fingerprint_default();
122
+ const headers = { type: "application/json" };
123
+ const blobData = new Blob(
124
+ [
125
+ JSON.stringify({
126
+ fingerprint,
127
+ url: url?.replace(/^(https?:\/\/)?(www\.)?/, "$1"),
128
+ ...referer !== "/" && referer && {
129
+ referer: referer?.replace(/^(https?:\/\/)?(www\.)?/, "$1")
130
+ },
131
+ user_agent,
132
+ ip,
133
+ browser_name,
134
+ browser_version,
135
+ lang,
136
+ device: device?.includes("iPhone") ? "mobile" : device?.includes("iPad") ? "tablet" : device,
137
+ ...data
138
+ })
139
+ ],
140
+ headers
141
+ );
142
+ const responseStart = navigator.sendBeacon(createRequestV2(endpoint, "start"), blobData);
143
+ return responseStart;
144
+ };
145
+ var endTracker = (endPoint, event_uuid, visitor_uuid) => {
146
+ if (event_uuid && visitor_uuid) {
147
+ const body = {
148
+ event_uuid,
149
+ visitor_uuid
150
+ };
151
+ const headers = { type: "application/json" };
152
+ const blob = new Blob([JSON.stringify(body)], headers);
153
+ navigator.sendBeacon(createRequest(endPoint, "end"), blob);
154
+ }
155
+ };
156
+ var endTrackerVisibilityState = (endPoint) => {
157
+ document.addEventListener("visibilitychange", async () => {
158
+ if (document.visibilityState === "hidden") {
159
+ endTracker(endPoint, window["event_uuid"], window["visitor_uuid"]);
160
+ }
161
+ if (document.visibilityState === "visible") {
162
+ const response = await startTracker(endPoint, "", "", "", window["attributes"]);
163
+ window["event_uuid"] = response?.event_uuid;
164
+ }
165
+ });
166
+ window.addEventListener(
167
+ "pagehide",
168
+ (event) => {
169
+ if (event.persisted) {
170
+ endTracker(endPoint, window["event_uuid"], window["visitor_uuid"]);
171
+ }
172
+ },
173
+ false
174
+ );
175
+ };
176
+
177
+ export {
178
+ startTracker,
179
+ trackEvent,
180
+ endTracker,
181
+ endTrackerVisibilityState
182
+ };