@shware/analytics 2.15.2 → 2.15.3

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.
@@ -20,23 +20,32 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/setup/session.ts
21
21
  var session_exports = {};
22
22
  __export(session_exports, {
23
+ getCurrentSession: () => getCurrentSession,
24
+ isSessionExpired: () => isSessionExpired,
23
25
  resetSession: () => resetSession,
24
26
  updateSessionActiveTime: () => updateSessionActiveTime
25
27
  });
26
28
  module.exports = __toCommonJS(session_exports);
27
29
  var import_uuid = require("uuid");
30
+ var SESSION_TIMEOUT = 30 * 60 * 1e3;
28
31
  var session = { id: (0, import_uuid.v7)(), lastActiveTime: Date.now() };
29
32
  function updateSessionActiveTime() {
30
33
  session.lastActiveTime = Date.now();
31
- return session;
32
34
  }
33
35
  function resetSession() {
34
36
  session.id = (0, import_uuid.v7)();
35
37
  session.lastActiveTime = Date.now();
38
+ }
39
+ function getCurrentSession() {
36
40
  return session;
37
41
  }
42
+ function isSessionExpired() {
43
+ return Date.now() - session.lastActiveTime > SESSION_TIMEOUT;
44
+ }
38
45
  // Annotate the CommonJS export names for ESM import in node:
39
46
  0 && (module.exports = {
47
+ getCurrentSession,
48
+ isSessionExpired,
40
49
  resetSession,
41
50
  updateSessionActiveTime
42
51
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/setup/session.ts"],"sourcesContent":["import { v7 as uuidv7 } from 'uuid';\n\nexport type Session = { id: string; lastActiveTime: number };\nconst session: Session = { id: uuidv7(), lastActiveTime: Date.now() };\n\nexport function updateSessionActiveTime() {\n session.lastActiveTime = Date.now();\n return session;\n}\n\nexport function resetSession() {\n session.id = uuidv7();\n session.lastActiveTime = Date.now();\n return session;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA6B;AAG7B,IAAM,UAAmB,EAAE,QAAI,YAAAA,IAAO,GAAG,gBAAgB,KAAK,IAAI,EAAE;AAE7D,SAAS,0BAA0B;AACxC,UAAQ,iBAAiB,KAAK,IAAI;AAClC,SAAO;AACT;AAEO,SAAS,eAAe;AAC7B,UAAQ,SAAK,YAAAA,IAAO;AACpB,UAAQ,iBAAiB,KAAK,IAAI;AAClC,SAAO;AACT;","names":["uuidv7"]}
1
+ {"version":3,"sources":["../../src/setup/session.ts"],"sourcesContent":["import { v7 as uuidv7 } from 'uuid';\n\nexport type Session = { id: string; lastActiveTime: number };\n\nconst SESSION_TIMEOUT = 30 * 60 * 1000;\nconst session: Session = { id: uuidv7(), lastActiveTime: Date.now() };\n\nexport function updateSessionActiveTime() {\n session.lastActiveTime = Date.now();\n}\n\nexport function resetSession() {\n session.id = uuidv7();\n session.lastActiveTime = Date.now();\n}\n\nexport function getCurrentSession() {\n return session;\n}\n\nexport function isSessionExpired() {\n return Date.now() - session.lastActiveTime > SESSION_TIMEOUT;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA6B;AAI7B,IAAM,kBAAkB,KAAK,KAAK;AAClC,IAAM,UAAmB,EAAE,QAAI,YAAAA,IAAO,GAAG,gBAAgB,KAAK,IAAI,EAAE;AAE7D,SAAS,0BAA0B;AACxC,UAAQ,iBAAiB,KAAK,IAAI;AACpC;AAEO,SAAS,eAAe;AAC7B,UAAQ,SAAK,YAAAA,IAAO;AACpB,UAAQ,iBAAiB,KAAK,IAAI;AACpC;AAEO,SAAS,oBAAoB;AAClC,SAAO;AACT;AAEO,SAAS,mBAAmB;AACjC,SAAO,KAAK,IAAI,IAAI,QAAQ,iBAAiB;AAC/C;","names":["uuidv7"]}
@@ -2,7 +2,9 @@ type Session = {
2
2
  id: string;
3
3
  lastActiveTime: number;
4
4
  };
5
- declare function updateSessionActiveTime(): Session;
6
- declare function resetSession(): Session;
5
+ declare function updateSessionActiveTime(): void;
6
+ declare function resetSession(): void;
7
+ declare function getCurrentSession(): Session;
8
+ declare function isSessionExpired(): boolean;
7
9
 
8
- export { type Session, resetSession, updateSessionActiveTime };
10
+ export { type Session, getCurrentSession, isSessionExpired, resetSession, updateSessionActiveTime };
@@ -2,7 +2,9 @@ type Session = {
2
2
  id: string;
3
3
  lastActiveTime: number;
4
4
  };
5
- declare function updateSessionActiveTime(): Session;
6
- declare function resetSession(): Session;
5
+ declare function updateSessionActiveTime(): void;
6
+ declare function resetSession(): void;
7
+ declare function getCurrentSession(): Session;
8
+ declare function isSessionExpired(): boolean;
7
9
 
8
- export { type Session, resetSession, updateSessionActiveTime };
10
+ export { type Session, getCurrentSession, isSessionExpired, resetSession, updateSessionActiveTime };
@@ -1,16 +1,23 @@
1
1
  // src/setup/session.ts
2
2
  import { v7 as uuidv7 } from "uuid";
3
+ var SESSION_TIMEOUT = 30 * 60 * 1e3;
3
4
  var session = { id: uuidv7(), lastActiveTime: Date.now() };
4
5
  function updateSessionActiveTime() {
5
6
  session.lastActiveTime = Date.now();
6
- return session;
7
7
  }
8
8
  function resetSession() {
9
9
  session.id = uuidv7();
10
10
  session.lastActiveTime = Date.now();
11
+ }
12
+ function getCurrentSession() {
11
13
  return session;
12
14
  }
15
+ function isSessionExpired() {
16
+ return Date.now() - session.lastActiveTime > SESSION_TIMEOUT;
17
+ }
13
18
  export {
19
+ getCurrentSession,
20
+ isSessionExpired,
14
21
  resetSession,
15
22
  updateSessionActiveTime
16
23
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/setup/session.ts"],"sourcesContent":["import { v7 as uuidv7 } from 'uuid';\n\nexport type Session = { id: string; lastActiveTime: number };\nconst session: Session = { id: uuidv7(), lastActiveTime: Date.now() };\n\nexport function updateSessionActiveTime() {\n session.lastActiveTime = Date.now();\n return session;\n}\n\nexport function resetSession() {\n session.id = uuidv7();\n session.lastActiveTime = Date.now();\n return session;\n}\n"],"mappings":";AAAA,SAAS,MAAM,cAAc;AAG7B,IAAM,UAAmB,EAAE,IAAI,OAAO,GAAG,gBAAgB,KAAK,IAAI,EAAE;AAE7D,SAAS,0BAA0B;AACxC,UAAQ,iBAAiB,KAAK,IAAI;AAClC,SAAO;AACT;AAEO,SAAS,eAAe;AAC7B,UAAQ,KAAK,OAAO;AACpB,UAAQ,iBAAiB,KAAK,IAAI;AAClC,SAAO;AACT;","names":[]}
1
+ {"version":3,"sources":["../../src/setup/session.ts"],"sourcesContent":["import { v7 as uuidv7 } from 'uuid';\n\nexport type Session = { id: string; lastActiveTime: number };\n\nconst SESSION_TIMEOUT = 30 * 60 * 1000;\nconst session: Session = { id: uuidv7(), lastActiveTime: Date.now() };\n\nexport function updateSessionActiveTime() {\n session.lastActiveTime = Date.now();\n}\n\nexport function resetSession() {\n session.id = uuidv7();\n session.lastActiveTime = Date.now();\n}\n\nexport function getCurrentSession() {\n return session;\n}\n\nexport function isSessionExpired() {\n return Date.now() - session.lastActiveTime > SESSION_TIMEOUT;\n}\n"],"mappings":";AAAA,SAAS,MAAM,cAAc;AAI7B,IAAM,kBAAkB,KAAK,KAAK;AAClC,IAAM,UAAmB,EAAE,IAAI,OAAO,GAAG,gBAAgB,KAAK,IAAI,EAAE;AAE7D,SAAS,0BAA0B;AACxC,UAAQ,iBAAiB,KAAK,IAAI;AACpC;AAEO,SAAS,eAAe;AAC7B,UAAQ,KAAK,OAAO;AACpB,UAAQ,iBAAiB,KAAK,IAAI;AACpC;AAEO,SAAS,oBAAoB;AAClC,SAAO;AACT;AAEO,SAAS,mBAAmB;AACjC,SAAO,KAAK,IAAI,IAAI,QAAQ,iBAAiB;AAC/C;","names":[]}
@@ -36,10 +36,21 @@ async function sendEvents(events) {
36
36
  var _a;
37
37
  try {
38
38
  if (events.length === 0) return;
39
+ if ((0, import_session.isSessionExpired)()) {
40
+ (0, import_session.resetSession)();
41
+ events.unshift({
42
+ name: "session_start",
43
+ properties: {},
44
+ options: { enableThirdPartyTracking: false },
45
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
46
+ });
47
+ } else {
48
+ (0, import_session.updateSessionActiveTime)();
49
+ }
39
50
  await tokenBucket.removeTokens();
40
51
  const tags = await import_setup.config.getTags();
41
52
  const visitor_id = (await (0, import_visitor.getVisitor)()).id;
42
- const session = (0, import_session.updateSessionActiveTime)();
53
+ const session = (0, import_session.getCurrentSession)();
43
54
  const dto = events.map((event) => ({
44
55
  name: event.name,
45
56
  properties: event.properties,
@@ -100,7 +111,8 @@ async function trackAsync(name, properties, options = defaultOptions) {
100
111
  }
101
112
  function sendBeacon(name, properties) {
102
113
  if (!import_setup.cache.tags || !import_setup.cache.visitor) return;
103
- const session = (0, import_session.updateSessionActiveTime)();
114
+ (0, import_session.updateSessionActiveTime)();
115
+ const session = (0, import_session.getCurrentSession)();
104
116
  const dto = [
105
117
  {
106
118
  name,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport { updateSessionActiveTime } from '../setup/session';\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 session = updateSessionActiveTime();\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n session_id: session.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 session = updateSessionActiveTime();\n const dto: CreateTrackEventDTO<T> = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n session_id: session.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"]}
1
+ {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport {\n getCurrentSession,\n isSessionExpired,\n resetSession,\n updateSessionActiveTime,\n} from '../setup/session';\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\n if (isSessionExpired()) {\n resetSession();\n events.unshift({\n name: 'session_start',\n properties: {},\n options: { enableThirdPartyTracking: false },\n timestamp: new Date().toISOString(),\n });\n } else {\n updateSessionActiveTime();\n }\n\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n session_id: session.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\n updateSessionActiveTime();\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO<T> = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n session_id: session.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"]}
@@ -1,6 +1,11 @@
1
1
  // src/track/index.ts
2
2
  import { cache, config } from "../setup/index.mjs";
3
- import { updateSessionActiveTime } from "../setup/session.mjs";
3
+ import {
4
+ getCurrentSession,
5
+ isSessionExpired,
6
+ resetSession,
7
+ updateSessionActiveTime
8
+ } from "../setup/session.mjs";
4
9
  import { fetch } from "../utils/fetch.mjs";
5
10
  import { TokenBucket } from "../utils/token-bucket.mjs";
6
11
  import { getVisitor } from "../visitor/index.mjs";
@@ -10,10 +15,21 @@ async function sendEvents(events) {
10
15
  var _a;
11
16
  try {
12
17
  if (events.length === 0) return;
18
+ if (isSessionExpired()) {
19
+ resetSession();
20
+ events.unshift({
21
+ name: "session_start",
22
+ properties: {},
23
+ options: { enableThirdPartyTracking: false },
24
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
25
+ });
26
+ } else {
27
+ updateSessionActiveTime();
28
+ }
13
29
  await tokenBucket.removeTokens();
14
30
  const tags = await config.getTags();
15
31
  const visitor_id = (await getVisitor()).id;
16
- const session = updateSessionActiveTime();
32
+ const session = getCurrentSession();
17
33
  const dto = events.map((event) => ({
18
34
  name: event.name,
19
35
  properties: event.properties,
@@ -74,7 +90,8 @@ async function trackAsync(name, properties, options = defaultOptions) {
74
90
  }
75
91
  function sendBeacon(name, properties) {
76
92
  if (!cache.tags || !cache.visitor) return;
77
- const session = updateSessionActiveTime();
93
+ updateSessionActiveTime();
94
+ const session = getCurrentSession();
78
95
  const dto = [
79
96
  {
80
97
  name,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport { updateSessionActiveTime } from '../setup/session';\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 session = updateSessionActiveTime();\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n session_id: session.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 session = updateSessionActiveTime();\n const dto: CreateTrackEventDTO<T> = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n session_id: session.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"]}
1
+ {"version":3,"sources":["../../src/track/index.ts"],"sourcesContent":["import { cache, config } from '../setup/index';\nimport {\n getCurrentSession,\n isSessionExpired,\n resetSession,\n updateSessionActiveTime,\n} from '../setup/session';\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\n if (isSessionExpired()) {\n resetSession();\n events.unshift({\n name: 'session_start',\n properties: {},\n options: { enableThirdPartyTracking: false },\n timestamp: new Date().toISOString(),\n });\n } else {\n updateSessionActiveTime();\n }\n\n await tokenBucket.removeTokens();\n\n const tags = await config.getTags();\n const visitor_id = (await getVisitor()).id;\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO = events.map((event) => ({\n name: event.name,\n properties: event.properties,\n tags,\n visitor_id,\n session_id: session.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\n updateSessionActiveTime();\n const session = getCurrentSession();\n const dto: CreateTrackEventDTO<T> = [\n {\n name,\n properties,\n tags: cache.tags,\n visitor_id: cache.visitor.id,\n session_id: session.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shware/analytics",
3
- "version": "2.15.2",
3
+ "version": "2.15.3",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "repository": {