@shware/analytics 2.14.2 → 2.14.4
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/hooks/use-session-analytics.cjs +1 -1
- package/dist/hooks/use-session-analytics.cjs.map +1 -1
- package/dist/hooks/use-session-analytics.mjs +1 -1
- package/dist/hooks/use-session-analytics.mjs.map +1 -1
- package/dist/track/index.cjs +2 -1
- package/dist/track/index.cjs.map +1 -1
- package/dist/track/index.mjs +2 -1
- package/dist/track/index.mjs.map +1 -1
- package/package.json +1 -1
|
@@ -25,7 +25,7 @@ __export(use_session_analytics_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(use_session_analytics_exports);
|
|
26
26
|
var import_react = require("react");
|
|
27
27
|
var import_setup = require("../setup/index.cjs");
|
|
28
|
-
var import_track = require("../track.cjs");
|
|
28
|
+
var import_track = require("../track/index.cjs");
|
|
29
29
|
function useSessionAnalytics() {
|
|
30
30
|
const launched = (0, import_react.useRef)(false);
|
|
31
31
|
(0, import_react.useEffect)(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/use-session-analytics.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { cache } from '../setup/index';\nimport { sendBeacon, track } from '../track';\n\nexport function useSessionAnalytics() {\n const launched = useRef(false);\n\n useEffect(() => {\n if (launched.current) return;\n launched.current = true;\n const properties = { session_id: cache.session.id };\n track('session_start', properties, { enableThirdPartyTracking: false });\n }, []);\n\n useEffect(() => {\n const onBeforeUnload = () => {\n const started_at = cache.session.startedAt;\n const ended_at = new Date().toISOString();\n const ms = new Date(ended_at).getTime() - new Date(started_at).getTime();\n const duration = Number((ms / 1000).toFixed(2));\n sendBeacon('session_end', { duration, session_id: cache.session.id, started_at, ended_at });\n };\n\n window.addEventListener('beforeunload', onBeforeUnload);\n return () => window.removeEventListener('beforeunload', onBeforeUnload);\n }, []);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkC;AAClC,mBAAsB;AACtB,mBAAkC;AAE3B,SAAS,sBAAsB;AACpC,QAAM,eAAW,qBAAO,KAAK;AAE7B,8BAAU,MAAM;AACd,QAAI,SAAS,QAAS;AACtB,aAAS,UAAU;AACnB,UAAM,aAAa,EAAE,YAAY,mBAAM,QAAQ,GAAG;AAClD,4BAAM,iBAAiB,YAAY,EAAE,0BAA0B,MAAM,CAAC;AAAA,EACxE,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACd,UAAM,iBAAiB,MAAM;AAC3B,YAAM,aAAa,mBAAM,QAAQ;AACjC,YAAM,YAAW,oBAAI,KAAK,GAAE,YAAY;AACxC,YAAM,KAAK,IAAI,KAAK,QAAQ,EAAE,QAAQ,IAAI,IAAI,KAAK,UAAU,EAAE,QAAQ;AACvE,YAAM,WAAW,QAAQ,KAAK,KAAM,QAAQ,CAAC,CAAC;AAC9C,mCAAW,eAAe,EAAE,UAAU,YAAY,mBAAM,QAAQ,IAAI,YAAY,SAAS,CAAC;AAAA,IAC5F;AAEA,WAAO,iBAAiB,gBAAgB,cAAc;AACtD,WAAO,MAAM,OAAO,oBAAoB,gBAAgB,cAAc;AAAA,EACxE,GAAG,CAAC,CAAC;AACP;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/use-session-analytics.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { cache } from '../setup/index';\nimport { sendBeacon, track } from '../track/index';\n\nexport function useSessionAnalytics() {\n const launched = useRef(false);\n\n useEffect(() => {\n if (launched.current) return;\n launched.current = true;\n const properties = { session_id: cache.session.id };\n track('session_start', properties, { enableThirdPartyTracking: false });\n }, []);\n\n useEffect(() => {\n const onBeforeUnload = () => {\n const started_at = cache.session.startedAt;\n const ended_at = new Date().toISOString();\n const ms = new Date(ended_at).getTime() - new Date(started_at).getTime();\n const duration = Number((ms / 1000).toFixed(2));\n sendBeacon('session_end', { duration, session_id: cache.session.id, started_at, ended_at });\n };\n\n window.addEventListener('beforeunload', onBeforeUnload);\n return () => window.removeEventListener('beforeunload', onBeforeUnload);\n }, []);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkC;AAClC,mBAAsB;AACtB,mBAAkC;AAE3B,SAAS,sBAAsB;AACpC,QAAM,eAAW,qBAAO,KAAK;AAE7B,8BAAU,MAAM;AACd,QAAI,SAAS,QAAS;AACtB,aAAS,UAAU;AACnB,UAAM,aAAa,EAAE,YAAY,mBAAM,QAAQ,GAAG;AAClD,4BAAM,iBAAiB,YAAY,EAAE,0BAA0B,MAAM,CAAC;AAAA,EACxE,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACd,UAAM,iBAAiB,MAAM;AAC3B,YAAM,aAAa,mBAAM,QAAQ;AACjC,YAAM,YAAW,oBAAI,KAAK,GAAE,YAAY;AACxC,YAAM,KAAK,IAAI,KAAK,QAAQ,EAAE,QAAQ,IAAI,IAAI,KAAK,UAAU,EAAE,QAAQ;AACvE,YAAM,WAAW,QAAQ,KAAK,KAAM,QAAQ,CAAC,CAAC;AAC9C,mCAAW,eAAe,EAAE,UAAU,YAAY,mBAAM,QAAQ,IAAI,YAAY,SAAS,CAAC;AAAA,IAC5F;AAEA,WAAO,iBAAiB,gBAAgB,cAAc;AACtD,WAAO,MAAM,OAAO,oBAAoB,gBAAgB,cAAc;AAAA,EACxE,GAAG,CAAC,CAAC;AACP;","names":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/hooks/use-session-analytics.ts
|
|
2
2
|
import { useEffect, useRef } from "react";
|
|
3
3
|
import { cache } from "../setup/index.mjs";
|
|
4
|
-
import { sendBeacon, track } from "../track.mjs";
|
|
4
|
+
import { sendBeacon, track } from "../track/index.mjs";
|
|
5
5
|
function useSessionAnalytics() {
|
|
6
6
|
const launched = useRef(false);
|
|
7
7
|
useEffect(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/use-session-analytics.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { cache } from '../setup/index';\nimport { sendBeacon, track } from '../track';\n\nexport function useSessionAnalytics() {\n const launched = useRef(false);\n\n useEffect(() => {\n if (launched.current) return;\n launched.current = true;\n const properties = { session_id: cache.session.id };\n track('session_start', properties, { enableThirdPartyTracking: false });\n }, []);\n\n useEffect(() => {\n const onBeforeUnload = () => {\n const started_at = cache.session.startedAt;\n const ended_at = new Date().toISOString();\n const ms = new Date(ended_at).getTime() - new Date(started_at).getTime();\n const duration = Number((ms / 1000).toFixed(2));\n sendBeacon('session_end', { duration, session_id: cache.session.id, started_at, ended_at });\n };\n\n window.addEventListener('beforeunload', onBeforeUnload);\n return () => window.removeEventListener('beforeunload', onBeforeUnload);\n }, []);\n}\n"],"mappings":";AAAA,SAAS,WAAW,cAAc;AAClC,SAAS,aAAa;AACtB,SAAS,YAAY,aAAa;AAE3B,SAAS,sBAAsB;AACpC,QAAM,WAAW,OAAO,KAAK;AAE7B,YAAU,MAAM;AACd,QAAI,SAAS,QAAS;AACtB,aAAS,UAAU;AACnB,UAAM,aAAa,EAAE,YAAY,MAAM,QAAQ,GAAG;AAClD,UAAM,iBAAiB,YAAY,EAAE,0BAA0B,MAAM,CAAC;AAAA,EACxE,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,UAAM,iBAAiB,MAAM;AAC3B,YAAM,aAAa,MAAM,QAAQ;AACjC,YAAM,YAAW,oBAAI,KAAK,GAAE,YAAY;AACxC,YAAM,KAAK,IAAI,KAAK,QAAQ,EAAE,QAAQ,IAAI,IAAI,KAAK,UAAU,EAAE,QAAQ;AACvE,YAAM,WAAW,QAAQ,KAAK,KAAM,QAAQ,CAAC,CAAC;AAC9C,iBAAW,eAAe,EAAE,UAAU,YAAY,MAAM,QAAQ,IAAI,YAAY,SAAS,CAAC;AAAA,IAC5F;AAEA,WAAO,iBAAiB,gBAAgB,cAAc;AACtD,WAAO,MAAM,OAAO,oBAAoB,gBAAgB,cAAc;AAAA,EACxE,GAAG,CAAC,CAAC;AACP;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/use-session-analytics.ts"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport { cache } from '../setup/index';\nimport { sendBeacon, track } from '../track/index';\n\nexport function useSessionAnalytics() {\n const launched = useRef(false);\n\n useEffect(() => {\n if (launched.current) return;\n launched.current = true;\n const properties = { session_id: cache.session.id };\n track('session_start', properties, { enableThirdPartyTracking: false });\n }, []);\n\n useEffect(() => {\n const onBeforeUnload = () => {\n const started_at = cache.session.startedAt;\n const ended_at = new Date().toISOString();\n const ms = new Date(ended_at).getTime() - new Date(started_at).getTime();\n const duration = Number((ms / 1000).toFixed(2));\n sendBeacon('session_end', { duration, session_id: cache.session.id, started_at, ended_at });\n };\n\n window.addEventListener('beforeunload', onBeforeUnload);\n return () => window.removeEventListener('beforeunload', onBeforeUnload);\n }, []);\n}\n"],"mappings":";AAAA,SAAS,WAAW,cAAc;AAClC,SAAS,aAAa;AACtB,SAAS,YAAY,aAAa;AAE3B,SAAS,sBAAsB;AACpC,QAAM,WAAW,OAAO,KAAK;AAE7B,YAAU,MAAM;AACd,QAAI,SAAS,QAAS;AACtB,aAAS,UAAU;AACnB,UAAM,aAAa,EAAE,YAAY,MAAM,QAAQ,GAAG;AAClD,UAAM,iBAAiB,YAAY,EAAE,0BAA0B,MAAM,CAAC;AAAA,EACxE,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,UAAM,iBAAiB,MAAM;AAC3B,YAAM,aAAa,MAAM,QAAQ;AACjC,YAAM,YAAW,oBAAI,KAAK,GAAE,YAAY;AACxC,YAAM,KAAK,IAAI,KAAK,QAAQ,EAAE,QAAQ,IAAI,IAAI,KAAK,UAAU,EAAE,QAAQ;AACvE,YAAM,WAAW,QAAQ,KAAK,KAAM,QAAQ,CAAC,CAAC;AAC9C,iBAAW,eAAe,EAAE,UAAU,YAAY,MAAM,QAAQ,IAAI,YAAY,SAAS,CAAC;AAAA,IAC5F;AAEA,WAAO,iBAAiB,gBAAgB,cAAc;AACtD,WAAO,MAAM,OAAO,oBAAoB,gBAAgB,cAAc;AAAA,EACxE,GAAG,CAAC,CAAC;AACP;","names":[]}
|
package/dist/track/index.cjs
CHANGED
|
@@ -106,7 +106,8 @@ function sendBeacon(name, properties) {
|
|
|
106
106
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
107
107
|
}
|
|
108
108
|
];
|
|
109
|
-
|
|
109
|
+
const blob = new Blob([JSON.stringify(dto)], { type: "application/json" });
|
|
110
|
+
navigator.sendBeacon(`${import_setup.config.endpoint}/events`, blob);
|
|
110
111
|
}
|
|
111
112
|
// Annotate the CommonJS export names for ESM import in node:
|
|
112
113
|
0 && (module.exports = {
|
package/dist/track/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport { fetch } from '../utils/fetch';\nimport { TokenBucket } from '../utils/token-bucket';\nimport { getVisitor } from '../visitor/index';\nimport type {\n CreateTrackEventDTO,\n EventName,\n TrackEventResponse,\n TrackName,\n TrackProperties,\n} from './types';\n\nexport interface TrackOptions {\n enableThirdPartyTracking?: boolean;\n onSucceed?: (response?: TrackEventResponse[number]) => void;\n onError?: (error: unknown) => void;\n}\n\nconst defaultOptions: TrackOptions = { enableThirdPartyTracking: true };\nconst tokenBucket = new TokenBucket({ rate: 1, capacity: 20, requested: 2 });\n\ntype Item = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: TrackName<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n properties: TrackProperties<any>;\n timestamp: string;\n options: TrackOptions;\n};\n\nasync function sendEvents(events: Item[]) {\n try {\n if (events.length === 0) return;\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n timestamp: event.timestamp,\n }));\n\n const response = await fetch(`${config.endpoint}/events`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send track event: ${response.status} ${await response.text()}`);\n }\n\n const data = (await response.json()) as TrackEventResponse;\n\n let index = 0;\n while (events.length > 0) {\n const { options, name, properties } = events.shift()!;\n const eventId = data[index].id;\n options.onSucceed?.({ id: eventId });\n index++;\n if (!options.enableThirdPartyTracking || !config.thirdPartyTrackers) continue;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, eventId));\n }\n } catch (e: unknown) {\n if (e instanceof Error) console.log(e.message);\n events.forEach((event) => event.options.onError?.(e));\n }\n}\n\nconst batch = 10;\nconst delay = 2000;\nconst list: Item[] = [];\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\nexport function track<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n list.push({ name, properties, options, timestamp: new Date().toISOString() });\n if (list.length >= batch) {\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n }, delay);\n}\n\nexport async function trackAsync<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n await sendEvents([{ name, properties, options, timestamp: new Date().toISOString() }]);\n}\n\nexport function sendBeacon<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!cache.tags || !cache.visitor) return;\n const dto: CreateTrackEventDTO<T> = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n timestamp: new Date().toISOString(),\n },\n ];\n navigator.sendBeacon(`${config.endpoint}/events`,
|
|
1
|
+
{"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport { fetch } from '../utils/fetch';\nimport { TokenBucket } from '../utils/token-bucket';\nimport { getVisitor } from '../visitor/index';\nimport type {\n CreateTrackEventDTO,\n EventName,\n TrackEventResponse,\n TrackName,\n TrackProperties,\n} from './types';\n\nexport interface TrackOptions {\n enableThirdPartyTracking?: boolean;\n onSucceed?: (response?: TrackEventResponse[number]) => void;\n onError?: (error: unknown) => void;\n}\n\nconst defaultOptions: TrackOptions = { enableThirdPartyTracking: true };\nconst tokenBucket = new TokenBucket({ rate: 1, capacity: 20, requested: 2 });\n\ntype Item = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: TrackName<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n properties: TrackProperties<any>;\n timestamp: string;\n options: TrackOptions;\n};\n\nasync function sendEvents(events: Item[]) {\n try {\n if (events.length === 0) return;\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n timestamp: event.timestamp,\n }));\n\n const response = await fetch(`${config.endpoint}/events`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send track event: ${response.status} ${await response.text()}`);\n }\n\n const data = (await response.json()) as TrackEventResponse;\n\n let index = 0;\n while (events.length > 0) {\n const { options, name, properties } = events.shift()!;\n const eventId = data[index].id;\n options.onSucceed?.({ id: eventId });\n index++;\n if (!options.enableThirdPartyTracking || !config.thirdPartyTrackers) continue;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, eventId));\n }\n } catch (e: unknown) {\n if (e instanceof Error) console.log(e.message);\n events.forEach((event) => event.options.onError?.(e));\n }\n}\n\nconst batch = 10;\nconst delay = 2000;\nconst list: Item[] = [];\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\nexport function track<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n list.push({ name, properties, options, timestamp: new Date().toISOString() });\n if (list.length >= batch) {\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n }, delay);\n}\n\nexport async function trackAsync<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n await sendEvents([{ name, properties, options, timestamp: new Date().toISOString() }]);\n}\n\nexport function sendBeacon<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!cache.tags || !cache.visitor) return;\n const dto: CreateTrackEventDTO<T> = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n timestamp: new Date().toISOString(),\n },\n ];\n const blob = new Blob([JSON.stringify(dto)], { type: 'application/json' });\n navigator.sendBeacon(`${config.endpoint}/events`, blob);\n}\n"],"mappings":"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","names":["_a"]}
|
package/dist/track/index.mjs
CHANGED
|
@@ -80,7 +80,8 @@ function sendBeacon(name, properties) {
|
|
|
80
80
|
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
81
81
|
}
|
|
82
82
|
];
|
|
83
|
-
|
|
83
|
+
const blob = new Blob([JSON.stringify(dto)], { type: "application/json" });
|
|
84
|
+
navigator.sendBeacon(`${config.endpoint}/events`, blob);
|
|
84
85
|
}
|
|
85
86
|
export {
|
|
86
87
|
sendBeacon,
|
package/dist/track/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport { fetch } from '../utils/fetch';\nimport { TokenBucket } from '../utils/token-bucket';\nimport { getVisitor } from '../visitor/index';\nimport type {\n CreateTrackEventDTO,\n EventName,\n TrackEventResponse,\n TrackName,\n TrackProperties,\n} from './types';\n\nexport interface TrackOptions {\n enableThirdPartyTracking?: boolean;\n onSucceed?: (response?: TrackEventResponse[number]) => void;\n onError?: (error: unknown) => void;\n}\n\nconst defaultOptions: TrackOptions = { enableThirdPartyTracking: true };\nconst tokenBucket = new TokenBucket({ rate: 1, capacity: 20, requested: 2 });\n\ntype Item = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: TrackName<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n properties: TrackProperties<any>;\n timestamp: string;\n options: TrackOptions;\n};\n\nasync function sendEvents(events: Item[]) {\n try {\n if (events.length === 0) return;\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n timestamp: event.timestamp,\n }));\n\n const response = await fetch(`${config.endpoint}/events`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send track event: ${response.status} ${await response.text()}`);\n }\n\n const data = (await response.json()) as TrackEventResponse;\n\n let index = 0;\n while (events.length > 0) {\n const { options, name, properties } = events.shift()!;\n const eventId = data[index].id;\n options.onSucceed?.({ id: eventId });\n index++;\n if (!options.enableThirdPartyTracking || !config.thirdPartyTrackers) continue;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, eventId));\n }\n } catch (e: unknown) {\n if (e instanceof Error) console.log(e.message);\n events.forEach((event) => event.options.onError?.(e));\n }\n}\n\nconst batch = 10;\nconst delay = 2000;\nconst list: Item[] = [];\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\nexport function track<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n list.push({ name, properties, options, timestamp: new Date().toISOString() });\n if (list.length >= batch) {\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n }, delay);\n}\n\nexport async function trackAsync<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n await sendEvents([{ name, properties, options, timestamp: new Date().toISOString() }]);\n}\n\nexport function sendBeacon<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!cache.tags || !cache.visitor) return;\n const dto: CreateTrackEventDTO<T> = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n timestamp: new Date().toISOString(),\n },\n ];\n navigator.sendBeacon(`${config.endpoint}/events`,
|
|
1
|
+
{"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport { fetch } from '../utils/fetch';\nimport { TokenBucket } from '../utils/token-bucket';\nimport { getVisitor } from '../visitor/index';\nimport type {\n CreateTrackEventDTO,\n EventName,\n TrackEventResponse,\n TrackName,\n TrackProperties,\n} from './types';\n\nexport interface TrackOptions {\n enableThirdPartyTracking?: boolean;\n onSucceed?: (response?: TrackEventResponse[number]) => void;\n onError?: (error: unknown) => void;\n}\n\nconst defaultOptions: TrackOptions = { enableThirdPartyTracking: true };\nconst tokenBucket = new TokenBucket({ rate: 1, capacity: 20, requested: 2 });\n\ntype Item = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n name: TrackName<any>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n properties: TrackProperties<any>;\n timestamp: string;\n options: TrackOptions;\n};\n\nasync function sendEvents(events: Item[]) {\n try {\n if (events.length === 0) return;\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n timestamp: event.timestamp,\n }));\n\n const response = await fetch(`${config.endpoint}/events`, {\n method: 'POST',\n credentials: 'include',\n headers: await config.getHeaders(),\n body: JSON.stringify(dto),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to send track event: ${response.status} ${await response.text()}`);\n }\n\n const data = (await response.json()) as TrackEventResponse;\n\n let index = 0;\n while (events.length > 0) {\n const { options, name, properties } = events.shift()!;\n const eventId = data[index].id;\n options.onSucceed?.({ id: eventId });\n index++;\n if (!options.enableThirdPartyTracking || !config.thirdPartyTrackers) continue;\n config.thirdPartyTrackers.forEach((tracker) => tracker(name, properties, eventId));\n }\n } catch (e: unknown) {\n if (e instanceof Error) console.log(e.message);\n events.forEach((event) => event.options.onError?.(e));\n }\n}\n\nconst batch = 10;\nconst delay = 2000;\nconst list: Item[] = [];\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\nexport function track<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n list.push({ name, properties, options, timestamp: new Date().toISOString() });\n if (list.length >= batch) {\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(() => {\n timer = null;\n const copy = [...list];\n list.length = 0;\n sendEvents(copy);\n }, delay);\n}\n\nexport async function trackAsync<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>,\n options: TrackOptions = defaultOptions\n) {\n await sendEvents([{ name, properties, options, timestamp: new Date().toISOString() }]);\n}\n\nexport function sendBeacon<T extends EventName = EventName>(\n name: TrackName<T>,\n properties?: TrackProperties<T>\n) {\n if (!cache.tags || !cache.visitor) return;\n const dto: CreateTrackEventDTO<T> = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n timestamp: new Date().toISOString(),\n },\n ];\n const blob = new Blob([JSON.stringify(dto)], { type: 'application/json' });\n navigator.sendBeacon(`${config.endpoint}/events`, blob);\n}\n"],"mappings":"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","names":["_a"]}
|