@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.
- package/dist/setup/session.cjs +10 -1
- package/dist/setup/session.cjs.map +1 -1
- package/dist/setup/session.d.cts +5 -3
- package/dist/setup/session.d.ts +5 -3
- package/dist/setup/session.mjs +8 -1
- package/dist/setup/session.mjs.map +1 -1
- package/dist/track/index.cjs +14 -2
- package/dist/track/index.cjs.map +1 -1
- package/dist/track/index.mjs +20 -3
- package/dist/track/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/setup/session.cjs
CHANGED
|
@@ -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
|
|
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"]}
|
package/dist/setup/session.d.cts
CHANGED
|
@@ -2,7 +2,9 @@ type Session = {
|
|
|
2
2
|
id: string;
|
|
3
3
|
lastActiveTime: number;
|
|
4
4
|
};
|
|
5
|
-
declare function updateSessionActiveTime():
|
|
6
|
-
declare function resetSession():
|
|
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 };
|
package/dist/setup/session.d.ts
CHANGED
|
@@ -2,7 +2,9 @@ type Session = {
|
|
|
2
2
|
id: string;
|
|
3
3
|
lastActiveTime: number;
|
|
4
4
|
};
|
|
5
|
-
declare function updateSessionActiveTime():
|
|
6
|
-
declare function resetSession():
|
|
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 };
|
package/dist/setup/session.mjs
CHANGED
|
@@ -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
|
|
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":[]}
|
package/dist/track/index.cjs
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
114
|
+
(0, import_session.updateSessionActiveTime)();
|
|
115
|
+
const session = (0, import_session.getCurrentSession)();
|
|
104
116
|
const dto = [
|
|
105
117
|
{
|
|
106
118
|
name,
|
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 {
|
|
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/dist/track/index.mjs
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
// src/track/index.ts
|
|
2
2
|
import { cache, config } from "../setup/index.mjs";
|
|
3
|
-
import {
|
|
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 =
|
|
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
|
-
|
|
93
|
+
updateSessionActiveTime();
|
|
94
|
+
const session = getCurrentSession();
|
|
78
95
|
const dto = [
|
|
79
96
|
{
|
|
80
97
|
name,
|
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 {
|
|
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"]}
|