@nommos/core 0.0.13 → 0.0.17
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/README.md +527 -527
- package/package.json +1 -1
- package/src/lib/constants.d.ts +2 -0
- package/src/lib/constants.js +2 -0
- package/src/lib/constants.js.map +1 -1
- package/src/lib/event-tracker.d.ts +2 -0
- package/src/lib/event-tracker.js +57 -8
- package/src/lib/event-tracker.js.map +1 -1
- package/src/lib/heatmap-tracker.d.ts +38 -0
- package/src/lib/heatmap-tracker.js +175 -0
- package/src/lib/heatmap-tracker.js.map +1 -0
- package/src/lib/session-tracker.d.ts +37 -0
- package/src/lib/session-tracker.js +98 -0
- package/src/lib/session-tracker.js.map +1 -0
- package/src/lib/types.d.ts +41 -0
- package/src/lib/webSocket-client.d.ts +14 -1
- package/src/lib/webSocket-client.js +47 -6
- package/src/lib/webSocket-client.js.map +1 -1
package/package.json
CHANGED
package/src/lib/constants.d.ts
CHANGED
|
@@ -9,5 +9,7 @@ export declare const BROWSER_KEY = "anon:device_id";
|
|
|
9
9
|
export declare const CONFIG_CACHE_KEY = "nommos:config:cache";
|
|
10
10
|
export declare const ONE_DAY_MS: number;
|
|
11
11
|
export declare const ANALYTICS_QUEUE = "/queue/user.activity";
|
|
12
|
+
export declare const HEATMAP_QUEUE = "/queue/user-heatmap";
|
|
13
|
+
export declare const SESSION_RECORDING_QUEUE = "/queue/user.session.recording";
|
|
12
14
|
export declare const BROWSER_DEFS: UaDef[];
|
|
13
15
|
export declare const OS_DEFS: UaDef[];
|
package/src/lib/constants.js
CHANGED
|
@@ -8,6 +8,8 @@ export const BROWSER_KEY = 'anon:device_id';
|
|
|
8
8
|
export const CONFIG_CACHE_KEY = 'nommos:config:cache';
|
|
9
9
|
export const ONE_DAY_MS = 24 * 60 * 60 * 1000;
|
|
10
10
|
export const ANALYTICS_QUEUE = '/queue/user.activity';
|
|
11
|
+
export const HEATMAP_QUEUE = '/queue/user-heatmap';
|
|
12
|
+
export const SESSION_RECORDING_QUEUE = '/queue/user.session.recording';
|
|
11
13
|
export const BROWSER_DEFS = [
|
|
12
14
|
[/Edg\/([\d.]+)/, 'Edge'],
|
|
13
15
|
[/OPR\/([\d.]+)/, 'Opera'],
|
package/src/lib/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../nommos/core/src/lib/constants.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,eAAe,GAAG,kDAAkD,CAAC;AAElF,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC;AACxC,MAAM,CAAC,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAC9C,MAAM,CAAC,MAAM,cAAc,GAAG,iBAAiB,CAAC;AAChD,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC,CAAC,6BAA6B;AAC5F,MAAM,CAAC,MAAM,WAAW,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AACrD,MAAM,CAAC,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,qBAAqB,CAAC;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;AAC9C,MAAM,CAAC,MAAM,eAAe,GAAG,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../../../../nommos/core/src/lib/constants.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,8 @@ export declare class EventTracker {
|
|
|
9
9
|
private webSocketConnectedSubscription;
|
|
10
10
|
private readonly analyticsEvents;
|
|
11
11
|
analyticsEvents$: import("rxjs").Observable<AnalyticsEvent>;
|
|
12
|
+
private heatmapTracker;
|
|
13
|
+
private sessionTracker;
|
|
12
14
|
/**
|
|
13
15
|
* Internal state map used to track SELECT/UNSELECT status of toggleable actions.
|
|
14
16
|
*/
|
package/src/lib/event-tracker.js
CHANGED
|
@@ -2,8 +2,10 @@ import { forkJoin, from, of, Subject } from 'rxjs';
|
|
|
2
2
|
import { catchError, map, switchMap } from 'rxjs/operators';
|
|
3
3
|
import { WebSocketClient } from './webSocket-client';
|
|
4
4
|
import { DataAttribution } from './data-attribution';
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { HeatmapTracker } from './heatmap-tracker';
|
|
6
|
+
import { SessionTracker } from './session-tracker';
|
|
7
|
+
import { ANALYTICS_ACTION, ANALYTICS_ACTION_STATE } from './enums';
|
|
8
|
+
import { getQueryParams, userAgentInfo } from './utils';
|
|
7
9
|
import { CONFIG_ENDPOINT, CONFIG_CACHE_KEY, ONE_DAY_MS } from './constants';
|
|
8
10
|
export class EventTracker {
|
|
9
11
|
/**
|
|
@@ -17,6 +19,8 @@ export class EventTracker {
|
|
|
17
19
|
this.webSocketConnectedSubscription = null;
|
|
18
20
|
this.analyticsEvents = new Subject();
|
|
19
21
|
this.analyticsEvents$ = this.analyticsEvents.asObservable();
|
|
22
|
+
this.heatmapTracker = null;
|
|
23
|
+
this.sessionTracker = null;
|
|
20
24
|
/**
|
|
21
25
|
* Internal state map used to track SELECT/UNSELECT status of toggleable actions.
|
|
22
26
|
*/
|
|
@@ -87,6 +91,25 @@ export class EventTracker {
|
|
|
87
91
|
else if (state === ANALYTICS_ACTION_STATE.UNSELECT) {
|
|
88
92
|
this.setActionSelectState(action, false);
|
|
89
93
|
}
|
|
94
|
+
if (action === ANALYTICS_ACTION.VISIT) {
|
|
95
|
+
try {
|
|
96
|
+
const urlToParse = currentUrl && currentUrl.includes('?')
|
|
97
|
+
? currentUrl
|
|
98
|
+
: typeof window !== 'undefined'
|
|
99
|
+
? window.location.href
|
|
100
|
+
: currentUrl;
|
|
101
|
+
if (urlToParse) {
|
|
102
|
+
const params = getQueryParams(urlToParse);
|
|
103
|
+
const adId = params['utm_content'];
|
|
104
|
+
if (adId) {
|
|
105
|
+
data = { ...data, ad_id: adId };
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
catch (e) {
|
|
110
|
+
// silence parsing errors
|
|
111
|
+
}
|
|
112
|
+
}
|
|
90
113
|
const { channel, os, browser } = userAgentInfo(navigator.userAgent || '');
|
|
91
114
|
const eventTracked = {
|
|
92
115
|
ip: this.da.userIp,
|
|
@@ -106,7 +129,9 @@ export class EventTracker {
|
|
|
106
129
|
...(data && { data }),
|
|
107
130
|
...(this.da.affiliate && { affiliateCode: this.da.affiliate }),
|
|
108
131
|
};
|
|
109
|
-
|
|
132
|
+
if (this.cfg.mode === 'dev') {
|
|
133
|
+
console.log(eventTracked);
|
|
134
|
+
}
|
|
110
135
|
this.analyticsEvents.next(eventTracked);
|
|
111
136
|
}
|
|
112
137
|
init(cfg) {
|
|
@@ -118,6 +143,18 @@ export class EventTracker {
|
|
|
118
143
|
if (!this.cfg.enableTracking) {
|
|
119
144
|
return;
|
|
120
145
|
}
|
|
146
|
+
// Initialize heatmap tracker (zero-config) if not already initialized
|
|
147
|
+
if (!this.heatmapTracker) {
|
|
148
|
+
const { channel } = userAgentInfo(navigator.userAgent || '');
|
|
149
|
+
this.heatmapTracker = new HeatmapTracker(this.ws, this.cfg, this.da.browserId, channel);
|
|
150
|
+
this.heatmapTracker.start();
|
|
151
|
+
}
|
|
152
|
+
// Initialize session recording (rrweb) if enabled
|
|
153
|
+
if (!this.sessionTracker) {
|
|
154
|
+
const { channel } = userAgentInfo(navigator.userAgent || '');
|
|
155
|
+
this.sessionTracker = new SessionTracker(this.ws, this.cfg, this.da.browserId, channel);
|
|
156
|
+
this.sessionTracker.start();
|
|
157
|
+
}
|
|
121
158
|
for (const e of this.ws.pendingEvents) {
|
|
122
159
|
e.ip = this.da.userIp;
|
|
123
160
|
e.brand_id = this.cfg.brand_id;
|
|
@@ -127,7 +164,9 @@ export class EventTracker {
|
|
|
127
164
|
}
|
|
128
165
|
else if (cfg.token) {
|
|
129
166
|
// Only log error if we expected to get config via token but failed or got incomplete data
|
|
130
|
-
|
|
167
|
+
if (this.cfg.mode === 'dev') {
|
|
168
|
+
console.error('[Nommos Tracker] Missing connection configuration after bootstrap.');
|
|
169
|
+
}
|
|
131
170
|
}
|
|
132
171
|
if (this.ipSubscription) {
|
|
133
172
|
this.ipSubscription.unsubscribe();
|
|
@@ -145,7 +184,9 @@ export class EventTracker {
|
|
|
145
184
|
this.ws.disconnect();
|
|
146
185
|
}
|
|
147
186
|
catch (error) {
|
|
148
|
-
|
|
187
|
+
if (this.cfg.mode === 'dev') {
|
|
188
|
+
console.error('[DME Analytics SDK] disconnect error:', error);
|
|
189
|
+
}
|
|
149
190
|
}
|
|
150
191
|
});
|
|
151
192
|
this.webSocketConnectedSubscription?.unsubscribe();
|
|
@@ -160,7 +201,9 @@ export class EventTracker {
|
|
|
160
201
|
try {
|
|
161
202
|
const { timestamp, data } = JSON.parse(cached);
|
|
162
203
|
if (Date.now() - timestamp < ONE_DAY_MS) {
|
|
163
|
-
|
|
204
|
+
if (this.cfg.mode === 'dev') {
|
|
205
|
+
console.log('[Nommos Tracker] Using cached config');
|
|
206
|
+
}
|
|
164
207
|
this.applyConfig(data);
|
|
165
208
|
return of(null);
|
|
166
209
|
}
|
|
@@ -186,7 +229,9 @@ export class EventTracker {
|
|
|
186
229
|
localStorage.setItem(`${CONFIG_CACHE_KEY}:${token}`, JSON.stringify(cachePayload));
|
|
187
230
|
}
|
|
188
231
|
}), catchError((err) => {
|
|
189
|
-
|
|
232
|
+
if (this.cfg.mode === 'dev') {
|
|
233
|
+
console.error('[Nommos Tracker] Error fetching from the endpoint:', err);
|
|
234
|
+
}
|
|
190
235
|
return of(null);
|
|
191
236
|
}));
|
|
192
237
|
}
|
|
@@ -195,7 +240,9 @@ export class EventTracker {
|
|
|
195
240
|
return;
|
|
196
241
|
this.cfg.enableTracking = data.enabled !== false;
|
|
197
242
|
if (this.cfg.enableTracking === false) {
|
|
198
|
-
|
|
243
|
+
if (this.cfg.mode === 'dev') {
|
|
244
|
+
console.warn('[Nommos Tracker] the events tracking feature is disabled for your token.');
|
|
245
|
+
}
|
|
199
246
|
return;
|
|
200
247
|
}
|
|
201
248
|
this.cfg.rabbitUrl = data.rabbit_url;
|
|
@@ -207,6 +254,8 @@ export class EventTracker {
|
|
|
207
254
|
this.ipSubscription?.unsubscribe();
|
|
208
255
|
this.eventSubscription?.unsubscribe();
|
|
209
256
|
this.webSocketConnectedSubscription?.unsubscribe();
|
|
257
|
+
this.heatmapTracker?.stop();
|
|
258
|
+
this.sessionTracker?.stop();
|
|
210
259
|
}
|
|
211
260
|
}
|
|
212
261
|
//# sourceMappingURL=event-tracker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-tracker.js","sourceRoot":"","sources":["../../../../../nommos/core/src/lib/event-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAgB,MAAM,MAAM,CAAC;AACjE,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"event-tracker.js","sourceRoot":"","sources":["../../../../../nommos/core/src/lib/event-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { FullConfig } from './types';
|
|
2
|
+
import { WebSocketClient } from './webSocket-client';
|
|
3
|
+
export declare class HeatmapTracker {
|
|
4
|
+
private readonly ws;
|
|
5
|
+
private readonly cfg;
|
|
6
|
+
private readonly browserId;
|
|
7
|
+
private readonly channel;
|
|
8
|
+
private clicks;
|
|
9
|
+
private movement;
|
|
10
|
+
private scrollBands;
|
|
11
|
+
private eventCount;
|
|
12
|
+
private lastMoveTime;
|
|
13
|
+
private lastX;
|
|
14
|
+
private lastY;
|
|
15
|
+
private moveEventCounter;
|
|
16
|
+
private timer;
|
|
17
|
+
private maxScroll;
|
|
18
|
+
private reachedBands;
|
|
19
|
+
constructor(ws: WebSocketClient, cfg: FullConfig, browserId: string, channel: number);
|
|
20
|
+
/**
|
|
21
|
+
* Starts global event listeners for heatmap collection.
|
|
22
|
+
*/
|
|
23
|
+
start(): void;
|
|
24
|
+
/**
|
|
25
|
+
* Stops listeners and flushes remaining data.
|
|
26
|
+
*/
|
|
27
|
+
stop(): void;
|
|
28
|
+
private handleClick;
|
|
29
|
+
private handleMouseMove;
|
|
30
|
+
private handleScroll;
|
|
31
|
+
private handleVisibilityChange;
|
|
32
|
+
private recordPoint;
|
|
33
|
+
private incrementAndCheck;
|
|
34
|
+
private resetTimer;
|
|
35
|
+
private flush;
|
|
36
|
+
private mapToPoints;
|
|
37
|
+
private mapToScroll;
|
|
38
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
export class HeatmapTracker {
|
|
2
|
+
constructor(ws, cfg, browserId, channel) {
|
|
3
|
+
this.ws = ws;
|
|
4
|
+
this.cfg = cfg;
|
|
5
|
+
this.browserId = browserId;
|
|
6
|
+
this.channel = channel;
|
|
7
|
+
this.clicks = new Map();
|
|
8
|
+
this.movement = new Map();
|
|
9
|
+
this.scrollBands = new Map();
|
|
10
|
+
this.eventCount = 0;
|
|
11
|
+
this.lastMoveTime = 0;
|
|
12
|
+
this.lastX = -1;
|
|
13
|
+
this.lastY = -1;
|
|
14
|
+
this.moveEventCounter = 0;
|
|
15
|
+
this.timer = null;
|
|
16
|
+
this.maxScroll = 0;
|
|
17
|
+
this.reachedBands = new Set();
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Starts global event listeners for heatmap collection.
|
|
21
|
+
*/
|
|
22
|
+
start() {
|
|
23
|
+
if (typeof window === 'undefined')
|
|
24
|
+
return;
|
|
25
|
+
if (this.cfg.mode === 'dev') {
|
|
26
|
+
console.log('[Nommos Tracker] Heatmap Metrics Collection Started');
|
|
27
|
+
}
|
|
28
|
+
document.addEventListener('click', this.handleClick.bind(this), {
|
|
29
|
+
capture: true,
|
|
30
|
+
passive: true,
|
|
31
|
+
});
|
|
32
|
+
document.addEventListener('mousemove', this.handleMouseMove.bind(this), {
|
|
33
|
+
capture: true,
|
|
34
|
+
passive: true,
|
|
35
|
+
});
|
|
36
|
+
window.addEventListener('scroll', this.handleScroll.bind(this), {
|
|
37
|
+
capture: true,
|
|
38
|
+
passive: true,
|
|
39
|
+
});
|
|
40
|
+
window.addEventListener('visibilitychange', this.handleVisibilityChange.bind(this));
|
|
41
|
+
window.addEventListener('beforeunload', () => this.flush());
|
|
42
|
+
this.resetTimer();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Stops listeners and flushes remaining data.
|
|
46
|
+
*/
|
|
47
|
+
stop() {
|
|
48
|
+
if (typeof window === 'undefined')
|
|
49
|
+
return;
|
|
50
|
+
document.removeEventListener('click', this.handleClick.bind(this), { capture: true });
|
|
51
|
+
document.removeEventListener('mousemove', this.handleMouseMove.bind(this), { capture: true });
|
|
52
|
+
window.removeEventListener('scroll', this.handleScroll.bind(this));
|
|
53
|
+
window.removeEventListener('visibilitychange', this.handleVisibilityChange.bind(this));
|
|
54
|
+
if (this.timer) {
|
|
55
|
+
clearTimeout(this.timer);
|
|
56
|
+
}
|
|
57
|
+
this.flush();
|
|
58
|
+
}
|
|
59
|
+
handleClick(e) {
|
|
60
|
+
this.recordPoint(this.clicks, e.pageX, e.pageY);
|
|
61
|
+
this.incrementAndCheck();
|
|
62
|
+
}
|
|
63
|
+
handleMouseMove(e) {
|
|
64
|
+
const now = Date.now();
|
|
65
|
+
// 1. Throttling: 100ms
|
|
66
|
+
if (now - this.lastMoveTime < 100)
|
|
67
|
+
return;
|
|
68
|
+
this.lastMoveTime = now;
|
|
69
|
+
// 2. Sampling: 1 in 3
|
|
70
|
+
this.moveEventCounter++;
|
|
71
|
+
if (this.moveEventCounter % 3 !== 0)
|
|
72
|
+
return;
|
|
73
|
+
// 3. Distance filter: > 5px
|
|
74
|
+
const dx = Math.abs(e.pageX - this.lastX);
|
|
75
|
+
const dy = Math.abs(e.pageY - this.lastY);
|
|
76
|
+
if (dx < 5 && dy < 5)
|
|
77
|
+
return;
|
|
78
|
+
this.lastX = e.pageX;
|
|
79
|
+
this.lastY = e.pageY;
|
|
80
|
+
this.recordPoint(this.movement, e.pageX, e.pageY);
|
|
81
|
+
this.incrementAndCheck();
|
|
82
|
+
}
|
|
83
|
+
handleScroll() {
|
|
84
|
+
const scrollY = window.scrollY || window.pageYOffset;
|
|
85
|
+
const totalHeight = document.documentElement.scrollHeight - window.innerHeight;
|
|
86
|
+
if (totalHeight <= 0)
|
|
87
|
+
return;
|
|
88
|
+
const percent = Math.min(100, Math.max(0, (scrollY / totalHeight) * 100));
|
|
89
|
+
// Snap to 0, 25, 50, 75, 100
|
|
90
|
+
const band = Math.round(percent / 25) * 25;
|
|
91
|
+
if (band > this.maxScroll) {
|
|
92
|
+
this.maxScroll = band;
|
|
93
|
+
if (!this.reachedBands.has(band)) {
|
|
94
|
+
this.reachedBands.add(band);
|
|
95
|
+
const currentCount = this.scrollBands.get(band) || 0;
|
|
96
|
+
this.scrollBands.set(band, currentCount + 1);
|
|
97
|
+
this.incrementAndCheck();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
handleVisibilityChange() {
|
|
102
|
+
if (document.visibilityState === 'hidden') {
|
|
103
|
+
this.flush();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
recordPoint(map, rawX, rawY) {
|
|
107
|
+
// Grid bucket: 10px
|
|
108
|
+
const x = Math.round(rawX / 10) * 10;
|
|
109
|
+
const y = Math.round(rawY / 10) * 10;
|
|
110
|
+
const key = `${x},${y}`;
|
|
111
|
+
map.set(key, (map.get(key) || 0) + 1);
|
|
112
|
+
}
|
|
113
|
+
incrementAndCheck() {
|
|
114
|
+
this.eventCount++;
|
|
115
|
+
const threshold = this.cfg.heatmapThreshold || 50;
|
|
116
|
+
if (this.eventCount >= threshold) {
|
|
117
|
+
this.flush();
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
resetTimer() {
|
|
121
|
+
if (this.timer)
|
|
122
|
+
clearTimeout(this.timer);
|
|
123
|
+
const interval = this.cfg.heatmapInterval || 10000;
|
|
124
|
+
this.timer = setTimeout(() => this.flush(), interval);
|
|
125
|
+
}
|
|
126
|
+
flush() {
|
|
127
|
+
if (this.eventCount === 0) {
|
|
128
|
+
this.resetTimer();
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const payload = {
|
|
132
|
+
brandId: this.cfg.brand_id || '',
|
|
133
|
+
bid: this.browserId,
|
|
134
|
+
channel: this.channel,
|
|
135
|
+
page: window.location.pathname,
|
|
136
|
+
fullUrl: window.location.href,
|
|
137
|
+
timestamp: Date.now(),
|
|
138
|
+
screen: {
|
|
139
|
+
width: window.innerWidth,
|
|
140
|
+
height: window.innerHeight,
|
|
141
|
+
},
|
|
142
|
+
heatmaps: {
|
|
143
|
+
clicks: this.mapToPoints(this.clicks),
|
|
144
|
+
movement: this.mapToPoints(this.movement),
|
|
145
|
+
scroll: this.mapToScroll(this.scrollBands),
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
if (this.cfg.mode === 'dev') {
|
|
149
|
+
console.log('[Nommos Tracker] Sending Heatmap Batch:', payload);
|
|
150
|
+
}
|
|
151
|
+
this.ws.publishHeatmapMessage(payload);
|
|
152
|
+
// Reset buckets
|
|
153
|
+
this.clicks.clear();
|
|
154
|
+
this.movement.clear();
|
|
155
|
+
this.scrollBands.clear();
|
|
156
|
+
this.eventCount = 0;
|
|
157
|
+
this.resetTimer();
|
|
158
|
+
}
|
|
159
|
+
mapToPoints(map) {
|
|
160
|
+
const points = [];
|
|
161
|
+
map.forEach((value, key) => {
|
|
162
|
+
const [x, y] = key.split(',').map(Number);
|
|
163
|
+
points.push({ x, y, value });
|
|
164
|
+
});
|
|
165
|
+
return points;
|
|
166
|
+
}
|
|
167
|
+
mapToScroll(map) {
|
|
168
|
+
const bands = [];
|
|
169
|
+
map.forEach((value, depth) => {
|
|
170
|
+
bands.push({ depth, value });
|
|
171
|
+
});
|
|
172
|
+
return bands;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=heatmap-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"heatmap-tracker.js","sourceRoot":"","sources":["../../../../../nommos/core/src/lib/heatmap-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { FullConfig } from './types';
|
|
2
|
+
import { WebSocketClient } from './webSocket-client';
|
|
3
|
+
/**
|
|
4
|
+
* SessionTracker
|
|
5
|
+
* --------------
|
|
6
|
+
* Captures full user session recordings using rrweb and streams them
|
|
7
|
+
* to RabbitMQ via the established WebSocket connection.
|
|
8
|
+
*
|
|
9
|
+
* Features:
|
|
10
|
+
* - Automatic DOM snapshot and incremental change recording
|
|
11
|
+
* - Event buffering (flushes every 100 events or 30 seconds)
|
|
12
|
+
* - Privacy protection (masks all inputs by default)
|
|
13
|
+
* - Environment-safe (no-op on server-side)
|
|
14
|
+
*/
|
|
15
|
+
export declare class SessionTracker {
|
|
16
|
+
private readonly ws;
|
|
17
|
+
private readonly cfg;
|
|
18
|
+
private readonly bid;
|
|
19
|
+
private readonly channel;
|
|
20
|
+
private events;
|
|
21
|
+
private stopFn;
|
|
22
|
+
private timer;
|
|
23
|
+
constructor(ws: WebSocketClient, cfg: FullConfig, bid: string, channel: number);
|
|
24
|
+
/**
|
|
25
|
+
* Initializes rrweb recording. Loads rrweb dynamically to support
|
|
26
|
+
* environments like Next.js/SSR and avoid bundling overhead if not used.
|
|
27
|
+
*/
|
|
28
|
+
start(): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Stops recording and flushes any pending events.
|
|
31
|
+
*/
|
|
32
|
+
stop(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Packages buffered events into a payload and publishes to the broker.
|
|
35
|
+
*/
|
|
36
|
+
private flush;
|
|
37
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionTracker
|
|
3
|
+
* --------------
|
|
4
|
+
* Captures full user session recordings using rrweb and streams them
|
|
5
|
+
* to RabbitMQ via the established WebSocket connection.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - Automatic DOM snapshot and incremental change recording
|
|
9
|
+
* - Event buffering (flushes every 100 events or 30 seconds)
|
|
10
|
+
* - Privacy protection (masks all inputs by default)
|
|
11
|
+
* - Environment-safe (no-op on server-side)
|
|
12
|
+
*/
|
|
13
|
+
export class SessionTracker {
|
|
14
|
+
constructor(ws, cfg, bid, channel) {
|
|
15
|
+
this.ws = ws;
|
|
16
|
+
this.cfg = cfg;
|
|
17
|
+
this.bid = bid;
|
|
18
|
+
this.channel = channel;
|
|
19
|
+
this.events = [];
|
|
20
|
+
this.stopFn = null;
|
|
21
|
+
this.timer = null;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Initializes rrweb recording. Loads rrweb dynamically to support
|
|
25
|
+
* environments like Next.js/SSR and avoid bundling overhead if not used.
|
|
26
|
+
*/
|
|
27
|
+
async start() {
|
|
28
|
+
if (typeof window === 'undefined')
|
|
29
|
+
return;
|
|
30
|
+
try {
|
|
31
|
+
// Dynamic import to avoid SSR issues and keep core bundle small
|
|
32
|
+
const rrweb = await import('rrweb');
|
|
33
|
+
// Initialize recording
|
|
34
|
+
this.stopFn = rrweb.record({
|
|
35
|
+
emit: (event) => {
|
|
36
|
+
this.events.push(event);
|
|
37
|
+
if (this.events.length >= 100) {
|
|
38
|
+
this.flush();
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
maskAllInputs: true,
|
|
42
|
+
}) || null;
|
|
43
|
+
// Periodic flush for long-running sessions with few interaction events
|
|
44
|
+
this.timer = setInterval(() => this.flush(), 30000);
|
|
45
|
+
// Ensure final flush on tab close
|
|
46
|
+
window.addEventListener('beforeunload', () => this.flush());
|
|
47
|
+
if (this.cfg.mode === 'dev') {
|
|
48
|
+
console.log('[Nommos Tracker] Session Recording Started');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
if (this.cfg.mode === 'dev') {
|
|
53
|
+
console.error('[Nommos Tracker] Failed to load rrweb', err);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Stops recording and flushes any pending events.
|
|
59
|
+
*/
|
|
60
|
+
stop() {
|
|
61
|
+
if (this.stopFn) {
|
|
62
|
+
this.stopFn();
|
|
63
|
+
this.stopFn = null;
|
|
64
|
+
}
|
|
65
|
+
if (this.timer) {
|
|
66
|
+
clearInterval(this.timer);
|
|
67
|
+
this.timer = null;
|
|
68
|
+
}
|
|
69
|
+
this.flush();
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Packages buffered events into a payload and publishes to the broker.
|
|
73
|
+
*/
|
|
74
|
+
flush() {
|
|
75
|
+
if (this.events.length === 0)
|
|
76
|
+
return;
|
|
77
|
+
const payload = {
|
|
78
|
+
brandId: this.cfg.brand_id || '',
|
|
79
|
+
bid: this.bid,
|
|
80
|
+
channel: this.channel,
|
|
81
|
+
page: window.location.pathname,
|
|
82
|
+
fullUrl: window.location.href,
|
|
83
|
+
timestamp: Date.now(),
|
|
84
|
+
screen: {
|
|
85
|
+
width: window.innerWidth,
|
|
86
|
+
height: window.innerHeight,
|
|
87
|
+
},
|
|
88
|
+
events: [...this.events],
|
|
89
|
+
};
|
|
90
|
+
if (this.cfg.mode === 'dev') {
|
|
91
|
+
console.log('[Nommos Tracker] Sending Session Recording Batch:', payload.events.length, 'events');
|
|
92
|
+
}
|
|
93
|
+
this.ws.publishSessionRecordingMessage(payload);
|
|
94
|
+
// Clear buffer
|
|
95
|
+
this.events = [];
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=session-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-tracker.js","sourceRoot":"","sources":["../../../../../nommos/core/src/lib/session-tracker.ts"],"names":[],"mappings":"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"}
|
package/src/lib/types.d.ts
CHANGED
|
@@ -12,6 +12,8 @@ export interface FullConfig extends ConnectionConfig {
|
|
|
12
12
|
appId?: string;
|
|
13
13
|
reconnectDelay?: number;
|
|
14
14
|
enableTracking?: boolean;
|
|
15
|
+
heatmapInterval?: number;
|
|
16
|
+
heatmapThreshold?: number;
|
|
15
17
|
}
|
|
16
18
|
export interface UrlTrackingKey {
|
|
17
19
|
source: string;
|
|
@@ -32,6 +34,45 @@ export interface AnalyticsEvent {
|
|
|
32
34
|
data?: Record<string, unknown>;
|
|
33
35
|
meta?: Record<string, unknown>;
|
|
34
36
|
}
|
|
37
|
+
export interface HeatmapPoint {
|
|
38
|
+
x: number;
|
|
39
|
+
y: number;
|
|
40
|
+
value: number;
|
|
41
|
+
}
|
|
42
|
+
export interface ScrollBand {
|
|
43
|
+
depth: number;
|
|
44
|
+
value: number;
|
|
45
|
+
}
|
|
46
|
+
export interface HeatmapPayload {
|
|
47
|
+
brandId: string | number;
|
|
48
|
+
bid: string;
|
|
49
|
+
channel: number;
|
|
50
|
+
page: string;
|
|
51
|
+
fullUrl: string;
|
|
52
|
+
timestamp: number;
|
|
53
|
+
screen: {
|
|
54
|
+
width: number;
|
|
55
|
+
height: number;
|
|
56
|
+
};
|
|
57
|
+
heatmaps: {
|
|
58
|
+
clicks: HeatmapPoint[];
|
|
59
|
+
movement: HeatmapPoint[];
|
|
60
|
+
scroll: ScrollBand[];
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export interface SessionRecordingPayload {
|
|
64
|
+
brandId: string | number;
|
|
65
|
+
bid: string;
|
|
66
|
+
channel: number;
|
|
67
|
+
page: string;
|
|
68
|
+
fullUrl: string;
|
|
69
|
+
timestamp: number;
|
|
70
|
+
screen: {
|
|
71
|
+
width: number;
|
|
72
|
+
height: number;
|
|
73
|
+
};
|
|
74
|
+
events: any[];
|
|
75
|
+
}
|
|
35
76
|
export interface TTLStringArray {
|
|
36
77
|
v: string[];
|
|
37
78
|
e: number;
|