@interfere/next 0.0.14 → 0.0.15-alpha.0
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 +1 -6
- package/dist/build/env-config.d.mts +7 -0
- package/dist/build/env-config.d.mts.map +1 -0
- package/dist/build/env-config.mjs +17 -0
- package/dist/build/env-config.mjs.map +1 -0
- package/dist/build/logger.d.mts +11 -0
- package/dist/build/logger.d.mts.map +1 -0
- package/dist/build/logger.mjs +155 -0
- package/dist/build/logger.mjs.map +1 -0
- package/dist/build/release-program.d.mts +19 -0
- package/dist/build/release-program.d.mts.map +1 -0
- package/dist/build/release-program.mjs +92 -0
- package/dist/build/release-program.mjs.map +1 -0
- package/dist/build/secret-key.d.mts +10 -0
- package/dist/build/secret-key.d.mts.map +1 -0
- package/dist/build/secret-key.mjs +16 -0
- package/dist/build/secret-key.mjs.map +1 -0
- package/dist/build/services/config.service.d.mts +9 -0
- package/dist/build/services/config.service.d.mts.map +1 -0
- package/dist/build/services/config.service.mjs +8 -0
- package/dist/build/services/config.service.mjs.map +1 -0
- package/dist/build/services/preflight.service.d.mts +19 -0
- package/dist/build/services/preflight.service.d.mts.map +1 -0
- package/dist/build/services/preflight.service.mjs +76 -0
- package/dist/build/services/preflight.service.mjs.map +1 -0
- package/dist/build/services/release-identity.service.d.mts +22 -0
- package/dist/build/services/release-identity.service.d.mts.map +1 -0
- package/dist/build/services/release-identity.service.mjs +48 -0
- package/dist/build/services/release-identity.service.mjs.map +1 -0
- package/dist/build/services/source-map.service.d.mts +24 -0
- package/dist/build/services/source-map.service.d.mts.map +1 -0
- package/dist/build/services/source-map.service.mjs +58 -0
- package/dist/build/services/source-map.service.mjs.map +1 -0
- package/dist/build/source-maps/api.d.mts +35 -0
- package/dist/build/source-maps/api.d.mts.map +1 -0
- package/dist/build/source-maps/api.mjs +61 -0
- package/dist/build/source-maps/api.mjs.map +1 -0
- package/dist/build/source-maps/client.d.mts +73 -0
- package/dist/build/source-maps/client.d.mts.map +1 -0
- package/dist/build/source-maps/client.mjs +228 -0
- package/dist/build/source-maps/client.mjs.map +1 -0
- package/dist/build/source-maps/errors.d.mts +109 -0
- package/dist/build/source-maps/errors.d.mts.map +1 -0
- package/dist/build/source-maps/errors.mjs +22 -0
- package/dist/build/source-maps/errors.mjs.map +1 -0
- package/dist/build/source-maps/files.d.mts +35 -0
- package/dist/build/source-maps/files.d.mts.map +1 -0
- package/dist/build/source-maps/files.mjs +222 -0
- package/dist/build/source-maps/files.mjs.map +1 -0
- package/dist/build/source-maps/providers/deployment/detector.d.mts +26 -0
- package/dist/build/source-maps/providers/deployment/detector.d.mts.map +1 -0
- package/dist/build/source-maps/providers/deployment/detector.mjs +22 -0
- package/dist/build/source-maps/providers/deployment/detector.mjs.map +1 -0
- package/dist/build/source-maps/providers/deployment/types.d.mts +12 -0
- package/dist/build/source-maps/providers/deployment/types.d.mts.map +1 -0
- package/dist/build/source-maps/providers/deployment/types.mjs +3 -0
- package/dist/build/source-maps/providers/deployment/vercel.d.mts +6 -0
- package/dist/build/source-maps/providers/deployment/vercel.d.mts.map +1 -0
- package/dist/build/source-maps/providers/deployment/vercel.mjs +44 -0
- package/dist/build/source-maps/providers/deployment/vercel.mjs.map +1 -0
- package/dist/build/source-maps/providers/source-control/detector.d.mts +15 -0
- package/dist/build/source-maps/providers/source-control/detector.d.mts.map +1 -0
- package/dist/build/source-maps/providers/source-control/detector.mjs +22 -0
- package/dist/build/source-maps/providers/source-control/detector.mjs.map +1 -0
- package/dist/build/source-maps/providers/source-control/git.d.mts +6 -0
- package/dist/build/source-maps/providers/source-control/git.d.mts.map +1 -0
- package/dist/build/source-maps/providers/source-control/git.mjs +50 -0
- package/dist/build/source-maps/providers/source-control/git.mjs.map +1 -0
- package/dist/build/source-maps/providers/source-control/types.d.mts +12 -0
- package/dist/build/source-maps/providers/source-control/types.d.mts.map +1 -0
- package/dist/build/source-maps/providers/source-control/types.mjs +3 -0
- package/dist/build/with-interfere.d.mts +49 -0
- package/dist/build/with-interfere.d.mts.map +1 -0
- package/dist/build/with-interfere.mjs +75 -0
- package/dist/build/with-interfere.mjs.map +1 -0
- package/dist/client/client.d.mts +3 -0
- package/dist/client/client.mjs +5 -0
- package/dist/client/provider.d.mts +22 -0
- package/dist/client/provider.d.mts.map +1 -0
- package/dist/client/provider.mjs +33 -0
- package/dist/client/provider.mjs.map +1 -0
- package/dist/lib/env.d.mts +12 -0
- package/dist/lib/env.d.mts.map +1 -0
- package/dist/lib/env.mjs +17 -0
- package/dist/lib/env.mjs.map +1 -0
- package/dist/lib/test-utils/make-next-request.d.mts +6 -0
- package/dist/lib/test-utils/make-next-request.d.mts.map +1 -0
- package/dist/lib/test-utils/make-next-request.mjs +12 -0
- package/dist/lib/test-utils/make-next-request.mjs.map +1 -0
- package/dist/lib/types.d.mts +22 -0
- package/dist/lib/types.d.mts.map +1 -0
- package/dist/lib/types.mjs +7 -0
- package/dist/lib/types.mjs.map +1 -0
- package/dist/server/middleware.d.mts +11 -0
- package/dist/server/middleware.d.mts.map +1 -0
- package/dist/server/middleware.mjs +84 -0
- package/dist/server/middleware.mjs.map +1 -0
- package/dist/server/proxy.d.mts +6 -0
- package/dist/server/proxy.d.mts.map +1 -0
- package/dist/server/proxy.mjs +29 -0
- package/dist/server/proxy.mjs.map +1 -0
- package/dist/server/route-handler.d.mts +9 -0
- package/dist/server/route-handler.d.mts.map +1 -0
- package/dist/server/route-handler.mjs +172 -0
- package/dist/server/route-handler.mjs.map +1 -0
- package/dist/server/services/config.service.d.mts +21 -0
- package/dist/server/services/config.service.d.mts.map +1 -0
- package/dist/server/services/config.service.mjs +43 -0
- package/dist/server/services/config.service.mjs.map +1 -0
- package/dist/server/services/error-tracking.service.d.mts +19 -0
- package/dist/server/services/error-tracking.service.d.mts.map +1 -0
- package/dist/server/services/error-tracking.service.mjs +31 -0
- package/dist/server/services/error-tracking.service.mjs.map +1 -0
- package/package.json +67 -36
- package/dist/__tests__/build/with-interfere-coverage.test.d.ts +0 -2
- package/dist/__tests__/build/with-interfere-coverage.test.d.ts.map +0 -1
- package/dist/__tests__/build/with-interfere-coverage.test.js +0 -295
- package/dist/__tests__/build/with-interfere-coverage.test.js.map +0 -1
- package/dist/__tests__/build/with-interfere.test.d.ts +0 -2
- package/dist/__tests__/build/with-interfere.test.d.ts.map +0 -1
- package/dist/__tests__/build/with-interfere.test.js +0 -363
- package/dist/__tests__/build/with-interfere.test.js.map +0 -1
- package/dist/__tests__/core/client.test.d.ts +0 -2
- package/dist/__tests__/core/client.test.d.ts.map +0 -1
- package/dist/__tests__/core/client.test.js +0 -373
- package/dist/__tests__/core/client.test.js.map +0 -1
- package/dist/__tests__/core/encoders.test.d.ts +0 -2
- package/dist/__tests__/core/encoders.test.d.ts.map +0 -1
- package/dist/__tests__/core/encoders.test.js +0 -56
- package/dist/__tests__/core/encoders.test.js.map +0 -1
- package/dist/__tests__/core/rage-click.test.d.ts +0 -2
- package/dist/__tests__/core/rage-click.test.d.ts.map +0 -1
- package/dist/__tests__/core/rage-click.test.js +0 -121
- package/dist/__tests__/core/rage-click.test.js.map +0 -1
- package/dist/__tests__/core/session-manager.test.d.ts +0 -2
- package/dist/__tests__/core/session-manager.test.d.ts.map +0 -1
- package/dist/__tests__/core/session-manager.test.js +0 -1168
- package/dist/__tests__/core/session-manager.test.js.map +0 -1
- package/dist/__tests__/integration/release-upload.test.d.ts +0 -2
- package/dist/__tests__/integration/release-upload.test.d.ts.map +0 -1
- package/dist/__tests__/integration/release-upload.test.js +0 -153
- package/dist/__tests__/integration/release-upload.test.js.map +0 -1
- package/dist/__tests__/provider.test.d.ts +0 -2
- package/dist/__tests__/provider.test.d.ts.map +0 -1
- package/dist/__tests__/provider.test.js +0 -84
- package/dist/__tests__/provider.test.js.map +0 -1
- package/dist/__tests__/session/persistence.test.d.ts +0 -2
- package/dist/__tests__/session/persistence.test.d.ts.map +0 -1
- package/dist/__tests__/session/persistence.test.js +0 -129
- package/dist/__tests__/session/persistence.test.js.map +0 -1
- package/dist/__tests__/session/session-summary.test.d.ts +0 -2
- package/dist/__tests__/session/session-summary.test.d.ts.map +0 -1
- package/dist/__tests__/session/session-summary.test.js +0 -763
- package/dist/__tests__/session/session-summary.test.js.map +0 -1
- package/dist/client.d.ts +0 -75
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -123
- package/dist/client.js.map +0 -1
- package/dist/config.d.ts +0 -40
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -340
- package/dist/config.js.map +0 -1
- package/dist/index.d.ts +0 -37
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -49
- package/dist/index.js.map +0 -1
- package/dist/index.jsx +0 -87
- package/dist/index.jsx.map +0 -1
- package/dist/lib/core/client-core.d.ts +0 -27
- package/dist/lib/core/client-core.d.ts.map +0 -1
- package/dist/lib/core/client-core.js +0 -152
- package/dist/lib/core/client-core.js.map +0 -1
- package/dist/lib/core/constants.d.ts +0 -12
- package/dist/lib/core/constants.d.ts.map +0 -1
- package/dist/lib/core/constants.js +0 -17
- package/dist/lib/core/constants.js.map +0 -1
- package/dist/lib/core/debug.d.ts +0 -47
- package/dist/lib/core/debug.d.ts.map +0 -1
- package/dist/lib/core/debug.js +0 -79
- package/dist/lib/core/debug.js.map +0 -1
- package/dist/lib/core/encoders.d.ts +0 -3
- package/dist/lib/core/encoders.d.ts.map +0 -1
- package/dist/lib/core/encoders.js +0 -5
- package/dist/lib/core/encoders.js.map +0 -1
- package/dist/lib/core/error-handlers.d.ts +0 -14
- package/dist/lib/core/error-handlers.d.ts.map +0 -1
- package/dist/lib/core/error-handlers.js +0 -191
- package/dist/lib/core/error-handlers.js.map +0 -1
- package/dist/lib/core/runtime.d.ts +0 -7
- package/dist/lib/core/runtime.d.ts.map +0 -1
- package/dist/lib/core/runtime.js +0 -16
- package/dist/lib/core/runtime.js.map +0 -1
- package/dist/lib/persistence/storage.d.ts +0 -5
- package/dist/lib/persistence/storage.d.ts.map +0 -1
- package/dist/lib/persistence/storage.js +0 -67
- package/dist/lib/persistence/storage.js.map +0 -1
- package/dist/lib/session/constants.d.ts +0 -19
- package/dist/lib/session/constants.d.ts.map +0 -1
- package/dist/lib/session/constants.js +0 -34
- package/dist/lib/session/constants.js.map +0 -1
- package/dist/lib/session/persistence.d.ts +0 -58
- package/dist/lib/session/persistence.d.ts.map +0 -1
- package/dist/lib/session/persistence.js +0 -179
- package/dist/lib/session/persistence.js.map +0 -1
- package/dist/lib/session/rage-click.d.ts +0 -17
- package/dist/lib/session/rage-click.d.ts.map +0 -1
- package/dist/lib/session/rage-click.js +0 -104
- package/dist/lib/session/rage-click.js.map +0 -1
- package/dist/lib/session/replay.d.ts +0 -3
- package/dist/lib/session/replay.d.ts.map +0 -1
- package/dist/lib/session/replay.js +0 -109
- package/dist/lib/session/replay.js.map +0 -1
- package/dist/lib/session/session-manager.d.ts +0 -126
- package/dist/lib/session/session-manager.d.ts.map +0 -1
- package/dist/lib/session/session-manager.js +0 -635
- package/dist/lib/session/session-manager.js.map +0 -1
- package/dist/lib/session/session-summary.d.ts +0 -3
- package/dist/lib/session/session-summary.d.ts.map +0 -1
- package/dist/lib/session/session-summary.js +0 -214
- package/dist/lib/session/session-summary.js.map +0 -1
- package/dist/middleware.d.ts +0 -8
- package/dist/middleware.d.ts.map +0 -1
- package/dist/middleware.js +0 -139
- package/dist/middleware.js.map +0 -1
- package/dist/types/storage.d.ts +0 -7
- package/dist/types/storage.d.ts.map +0 -1
- package/dist/types/storage.js +0 -2
- package/dist/types/storage.js.map +0 -1
- package/dist/types.d.ts +0 -6
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -4
- package/dist/types.js.map +0 -1
|
@@ -1,104 +0,0 @@
|
|
|
1
|
-
/* Rage click detection for identifying user frustration patterns */
|
|
2
|
-
"use client";
|
|
3
|
-
import { RAGE_CLICK_COUNT, RAGE_CLICK_ENABLED, RAGE_CLICK_RADIUS_PX, RAGE_CLICK_TIMEOUT_MS, } from "./constants.js";
|
|
4
|
-
const MAX_TEXT_LENGTH = 100;
|
|
5
|
-
export default class RageClick {
|
|
6
|
-
clicks = [];
|
|
7
|
-
radiusPx;
|
|
8
|
-
timeoutMs;
|
|
9
|
-
clickCount;
|
|
10
|
-
constructor() {
|
|
11
|
-
// Use static values - config options no longer used
|
|
12
|
-
this.radiusPx = RAGE_CLICK_RADIUS_PX;
|
|
13
|
-
this.timeoutMs = RAGE_CLICK_TIMEOUT_MS;
|
|
14
|
-
this.clickCount = RAGE_CLICK_COUNT;
|
|
15
|
-
}
|
|
16
|
-
isRageClick(x, y, timestamp) {
|
|
17
|
-
const current = { x, y, timestamp };
|
|
18
|
-
// Keep only recent clicks within timeout window
|
|
19
|
-
this.clicks = this.clicks.filter((c) => timestamp - c.timestamp <= this.timeoutMs);
|
|
20
|
-
this.clicks.push(current);
|
|
21
|
-
// Check if enough clicks happened in close proximity
|
|
22
|
-
if (this.clicks.length >= this.clickCount) {
|
|
23
|
-
const first = this.clicks[0];
|
|
24
|
-
const last = this.clicks.at(-1);
|
|
25
|
-
// Check time window - both first and last should exist due to length check
|
|
26
|
-
if (first && last && last.timestamp - first.timestamp <= this.timeoutMs) {
|
|
27
|
-
// Ensure all clicks are within radius of the first
|
|
28
|
-
const allWithinRadius = this.clicks.every((c) => {
|
|
29
|
-
const dx = c.x - first.x;
|
|
30
|
-
const dy = c.y - first.y;
|
|
31
|
-
return Math.sqrt(dx * dx + dy * dy) <= this.radiusPx;
|
|
32
|
-
});
|
|
33
|
-
if (allWithinRadius) {
|
|
34
|
-
this.clicks = []; // reset after detection
|
|
35
|
-
return true;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
// Get the element information for the rage click event
|
|
42
|
-
getElementInfo(target) {
|
|
43
|
-
if (!target) {
|
|
44
|
-
return {};
|
|
45
|
-
}
|
|
46
|
-
return {
|
|
47
|
-
tagName: target.tagName?.toLowerCase(),
|
|
48
|
-
className: target.className || undefined,
|
|
49
|
-
id: target.id || undefined,
|
|
50
|
-
text: target.innerText?.slice(0, MAX_TEXT_LENGTH) || undefined,
|
|
51
|
-
ariaLabel: target.getAttribute("aria-label") || undefined,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
let rageClickDetector = null;
|
|
56
|
-
let initialized = false;
|
|
57
|
-
function isBrowser() {
|
|
58
|
-
return typeof window !== "undefined";
|
|
59
|
-
}
|
|
60
|
-
export function setupRageClick() {
|
|
61
|
-
if (initialized) {
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
if (!isBrowser()) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
if (!RAGE_CLICK_ENABLED) {
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
initialized = true;
|
|
71
|
-
rageClickDetector = new RageClick();
|
|
72
|
-
// Import capture function dynamically to avoid circular dependencies
|
|
73
|
-
import("../../client.js")
|
|
74
|
-
.then(({ capture }) => {
|
|
75
|
-
document.addEventListener("click", (e) => {
|
|
76
|
-
if (!rageClickDetector) {
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
const mouseEvent = e;
|
|
80
|
-
const timestamp = Date.now();
|
|
81
|
-
if (rageClickDetector.isRageClick(mouseEvent.clientX, mouseEvent.clientY, timestamp)) {
|
|
82
|
-
const target = mouseEvent.target;
|
|
83
|
-
const elementInfo = rageClickDetector.getElementInfo(target);
|
|
84
|
-
try {
|
|
85
|
-
capture("rage_click", {
|
|
86
|
-
timestamp,
|
|
87
|
-
x: mouseEvent.clientX,
|
|
88
|
-
y: mouseEvent.clientY,
|
|
89
|
-
element: elementInfo,
|
|
90
|
-
url: window.location.href,
|
|
91
|
-
userAgent: navigator.userAgent,
|
|
92
|
-
});
|
|
93
|
-
}
|
|
94
|
-
catch {
|
|
95
|
-
// Swallow errors to avoid impacting the host app
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}, { capture: true });
|
|
99
|
-
})
|
|
100
|
-
.catch(() => {
|
|
101
|
-
// Swallow import errors
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
//# sourceMappingURL=rage-click.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rage-click.js","sourceRoot":"","sources":["../../../src/lib/session/rage-click.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"replay.d.ts","sourceRoot":"","sources":["../../../src/lib/session/replay.ts"],"names":[],"mappings":"AAUA,wBAAgB,WAAW,SAuG1B;AAED,wBAAgB,UAAU,SAEzB"}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
/* Session replay capture using rrweb, chunked streaming to ingest */
|
|
2
|
-
"use client";
|
|
3
|
-
import { capture, flush } from "../../client.js";
|
|
4
|
-
import { REPLAY_CHUNK_MS, REPLAY_ENABLED } from "./constants.js";
|
|
5
|
-
let started = false;
|
|
6
|
-
let stopFn = null;
|
|
7
|
-
export function setupReplay() {
|
|
8
|
-
if (started) {
|
|
9
|
-
return;
|
|
10
|
-
}
|
|
11
|
-
if (typeof window === "undefined") {
|
|
12
|
-
return;
|
|
13
|
-
}
|
|
14
|
-
if (!REPLAY_ENABLED) {
|
|
15
|
-
return;
|
|
16
|
-
}
|
|
17
|
-
started = true;
|
|
18
|
-
Promise.all([import("rrweb"), import("@rrweb/packer")])
|
|
19
|
-
.then(([rrwebModule, packerModule]) => {
|
|
20
|
-
// Handle different module export patterns
|
|
21
|
-
const rrweb = rrwebModule.default || rrwebModule;
|
|
22
|
-
const record = rrweb.record || rrweb;
|
|
23
|
-
const { pack } = packerModule;
|
|
24
|
-
const events = [];
|
|
25
|
-
// Check if record is a function
|
|
26
|
-
if (typeof record !== "function") {
|
|
27
|
-
// biome-ignore lint/suspicious/noConsole: error logging needed
|
|
28
|
-
console.error("rrweb.record is not available");
|
|
29
|
-
return;
|
|
30
|
-
}
|
|
31
|
-
const stopRecord = record({
|
|
32
|
-
emit(event) {
|
|
33
|
-
// Compress the event before storing it
|
|
34
|
-
const packedEvent = pack(event);
|
|
35
|
-
events.push(packedEvent);
|
|
36
|
-
},
|
|
37
|
-
maskAllInputs: true, // Privacy: mask all text inputs by default
|
|
38
|
-
});
|
|
39
|
-
const sendChunk = () => {
|
|
40
|
-
if (events.length === 0) {
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
const chunk = events.splice(0, events.length);
|
|
44
|
-
try {
|
|
45
|
-
capture("replay_chunk", {
|
|
46
|
-
version: 1,
|
|
47
|
-
chunkTs: Date.now(),
|
|
48
|
-
count: chunk.length,
|
|
49
|
-
// rrweb events are pre-compressed with @rrweb/packer
|
|
50
|
-
events: chunk,
|
|
51
|
-
});
|
|
52
|
-
flush();
|
|
53
|
-
}
|
|
54
|
-
catch {
|
|
55
|
-
// swallow
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
const intervalId = window.setInterval(sendChunk, REPLAY_CHUNK_MS);
|
|
59
|
-
const flushNow = () => {
|
|
60
|
-
try {
|
|
61
|
-
sendChunk();
|
|
62
|
-
}
|
|
63
|
-
catch {
|
|
64
|
-
// swallow
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
const beforeUnload = () => flushNow();
|
|
68
|
-
const visibility = () => {
|
|
69
|
-
if (document.visibilityState === "hidden") {
|
|
70
|
-
flushNow();
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
window.addEventListener("beforeunload", beforeUnload);
|
|
74
|
-
document.addEventListener("visibilitychange", visibility);
|
|
75
|
-
stopFn = () => {
|
|
76
|
-
try {
|
|
77
|
-
if (typeof stopRecord === "function") {
|
|
78
|
-
stopRecord();
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
catch {
|
|
82
|
-
/* no-op */
|
|
83
|
-
}
|
|
84
|
-
try {
|
|
85
|
-
window.clearInterval(intervalId);
|
|
86
|
-
}
|
|
87
|
-
catch {
|
|
88
|
-
/* no-op */
|
|
89
|
-
}
|
|
90
|
-
try {
|
|
91
|
-
window.removeEventListener("beforeunload", beforeUnload);
|
|
92
|
-
document.removeEventListener("visibilitychange", visibility);
|
|
93
|
-
}
|
|
94
|
-
catch {
|
|
95
|
-
/* no-op */
|
|
96
|
-
}
|
|
97
|
-
started = false;
|
|
98
|
-
stopFn = null;
|
|
99
|
-
};
|
|
100
|
-
})
|
|
101
|
-
.catch((error) => {
|
|
102
|
-
// biome-ignore lint/suspicious/noConsole: Just for testing
|
|
103
|
-
console.error("Failed to load rrweb:", error);
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
export function stopReplay() {
|
|
107
|
-
stopFn?.();
|
|
108
|
-
}
|
|
109
|
-
//# sourceMappingURL=replay.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../../src/lib/session/replay.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
import type { Config } from "@interfere/schemas/config";
|
|
2
|
-
import type { SurfaceId } from "@interfere/schemas/surface";
|
|
3
|
-
import type { InterferePersistence } from "./persistence.js";
|
|
4
|
-
/**
|
|
5
|
-
* Clock type for dependency injection and testability
|
|
6
|
-
*/
|
|
7
|
-
export type Clock = {
|
|
8
|
-
now(): number;
|
|
9
|
-
setTimeout(callback: () => void, delay: number): ReturnType<typeof setTimeout>;
|
|
10
|
-
clearTimeout(timeoutId: ReturnType<typeof setTimeout>): void;
|
|
11
|
-
};
|
|
12
|
-
/**
|
|
13
|
-
* Reasons why a session ID might change
|
|
14
|
-
*/
|
|
15
|
-
export declare const SessionChangeReason: {
|
|
16
|
-
readonly NO_SESSION_ID: "noSessionId";
|
|
17
|
-
readonly ACTIVITY_TIMEOUT: "activityTimeout";
|
|
18
|
-
readonly SESSION_PAST_MAXIMUM_LENGTH: "sessionPastMaximumLength";
|
|
19
|
-
};
|
|
20
|
-
/**
|
|
21
|
-
* Change reasons for session updates
|
|
22
|
-
*/
|
|
23
|
-
export type ChangeReasons = {
|
|
24
|
-
[SessionChangeReason.NO_SESSION_ID]?: boolean;
|
|
25
|
-
[SessionChangeReason.ACTIVITY_TIMEOUT]?: boolean;
|
|
26
|
-
[SessionChangeReason.SESSION_PAST_MAXIMUM_LENGTH]?: boolean;
|
|
27
|
-
};
|
|
28
|
-
/**
|
|
29
|
-
* Callback function called when session ID changes
|
|
30
|
-
* @param sessionId - The new session ID (null when session is reset)
|
|
31
|
-
* @param windowId - The window ID associated with this session
|
|
32
|
-
* @param changeReason - Reasons why the session changed
|
|
33
|
-
*/
|
|
34
|
-
export type SessionIdChangedCallback = (sessionId: string | null, windowId: string | null, changeReason?: ChangeReasons) => void;
|
|
35
|
-
type SessionData = {
|
|
36
|
-
sessionId: string;
|
|
37
|
-
windowId: string | null;
|
|
38
|
-
sessionStartTimestamp: number;
|
|
39
|
-
lastActivityTimestamp: number;
|
|
40
|
-
};
|
|
41
|
-
/**
|
|
42
|
-
* Manages session and window IDs with automatic timeout and persistence
|
|
43
|
-
*/
|
|
44
|
-
export declare class SessionIdManager {
|
|
45
|
-
private readonly _sessionIdGenerator;
|
|
46
|
-
private readonly _windowIdGenerator;
|
|
47
|
-
private readonly _config;
|
|
48
|
-
private readonly _persistence;
|
|
49
|
-
private readonly _clock;
|
|
50
|
-
private _windowId;
|
|
51
|
-
private _sessionId;
|
|
52
|
-
private readonly _windowIdStorageKey;
|
|
53
|
-
private readonly _primaryWindowExistsStorageKey;
|
|
54
|
-
private _sessionStartTimestamp;
|
|
55
|
-
private _sessionActivityTimestamp;
|
|
56
|
-
private _sessionIdChangedHandlers;
|
|
57
|
-
private readonly _sessionTimeoutMs;
|
|
58
|
-
private _enforceIdleTimeout;
|
|
59
|
-
private _canUseSessionStorageCache;
|
|
60
|
-
private _lastStorageCheck;
|
|
61
|
-
private _beforeUnloadHandler;
|
|
62
|
-
private _pageHideHandler;
|
|
63
|
-
private _visibilityChangeHandler;
|
|
64
|
-
private _heartbeatInterval;
|
|
65
|
-
private heartbeatPaused;
|
|
66
|
-
private readonly _debugLogger?;
|
|
67
|
-
/**
|
|
68
|
-
* Creates a new SessionIdManager
|
|
69
|
-
* @param surface - The surface ID for storage key namespacing
|
|
70
|
-
* @param config - Configuration options
|
|
71
|
-
* @param persistence - Persistence layer for storing session data
|
|
72
|
-
* @param options - Optional generators and clock for testing
|
|
73
|
-
*/
|
|
74
|
-
constructor(surface: SurfaceId, config: Partial<Config>, persistence: InterferePersistence, options?: {
|
|
75
|
-
sessionId?: () => string;
|
|
76
|
-
windowId?: () => string;
|
|
77
|
-
clock?: Clock;
|
|
78
|
-
debugLogger?: (message: string, error?: Error) => void;
|
|
79
|
-
});
|
|
80
|
-
get sessionTimeoutMs(): number;
|
|
81
|
-
/**
|
|
82
|
-
* Register a callback to be called when the session ID changes
|
|
83
|
-
* @param callback - Function to call when session changes
|
|
84
|
-
* @returns Unsubscribe function
|
|
85
|
-
*/
|
|
86
|
-
onSessionId(callback: SessionIdChangedCallback): () => void;
|
|
87
|
-
private _debugLog;
|
|
88
|
-
private _canUseSessionStorage;
|
|
89
|
-
private _cleanupStaleWindowFlags;
|
|
90
|
-
private _startWindowHeartbeat;
|
|
91
|
-
private _setWindowId;
|
|
92
|
-
private _getWindowId;
|
|
93
|
-
private _setSessionId;
|
|
94
|
-
private _persistSessionWithOptimisticLocking;
|
|
95
|
-
private _getSessionId;
|
|
96
|
-
private _parseSessionIdInfo;
|
|
97
|
-
/**
|
|
98
|
-
* Reset the current session, forcing a new session to be created on next access
|
|
99
|
-
* @param reason - Optional reason for the reset
|
|
100
|
-
*/
|
|
101
|
-
resetSessionId(reason?: ChangeReasons): void;
|
|
102
|
-
private _performWindowCleanup;
|
|
103
|
-
private _listenToReloadWindow;
|
|
104
|
-
private _sessionHasBeenIdleTooLong;
|
|
105
|
-
/**
|
|
106
|
-
* Check and get the current session and window IDs, updating them if necessary
|
|
107
|
-
* @param readOnly - If true, won't update activity timestamp or reset idle timer
|
|
108
|
-
* @param _timestamp - Optional timestamp override (primarily for testing)
|
|
109
|
-
* @returns Session data with optional change reason
|
|
110
|
-
*/
|
|
111
|
-
checkAndGetSessionAndWindowId(readOnly?: boolean, _timestamp?: number | null): SessionData & {
|
|
112
|
-
changeReason?: ChangeReasons;
|
|
113
|
-
};
|
|
114
|
-
private _evaluateSessionChangeReasons;
|
|
115
|
-
private _updateSessionIfNeeded;
|
|
116
|
-
private _calculateActivityTimestamp;
|
|
117
|
-
private _finalizeSessionUpdate;
|
|
118
|
-
private _resetIdleTimer;
|
|
119
|
-
/**
|
|
120
|
-
* Clean up resources and event listeners
|
|
121
|
-
* Call this when the SessionIdManager is no longer needed
|
|
122
|
-
*/
|
|
123
|
-
dispose(): void;
|
|
124
|
-
}
|
|
125
|
-
export {};
|
|
126
|
-
//# sourceMappingURL=session-manager.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../../src/lib/session/session-manager.ts"],"names":[],"mappings":"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"}
|