@interfere/next 0.0.0-alpha.10 → 0.0.1
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 -0
- package/dist/__tests__/build/with-interfere-coverage.test.d.ts +2 -0
- package/dist/__tests__/build/with-interfere-coverage.test.d.ts.map +1 -0
- package/dist/__tests__/build/with-interfere-coverage.test.js +338 -0
- package/dist/__tests__/build/with-interfere-coverage.test.js.map +1 -0
- package/dist/__tests__/build/with-interfere.test.d.ts +2 -0
- package/dist/__tests__/build/with-interfere.test.d.ts.map +1 -0
- package/dist/__tests__/build/with-interfere.test.js +466 -0
- package/dist/__tests__/build/with-interfere.test.js.map +1 -0
- package/dist/__tests__/core/client.test.d.ts.map +1 -0
- package/dist/__tests__/core/client.test.js +373 -0
- package/dist/__tests__/core/client.test.js.map +1 -0
- package/dist/__tests__/core/encoders.test.d.ts.map +1 -0
- package/dist/{core → __tests__/core}/encoders.test.js +20 -19
- package/dist/__tests__/core/encoders.test.js.map +1 -0
- package/dist/__tests__/core/rage-click.test.d.ts +2 -0
- package/dist/__tests__/core/rage-click.test.d.ts.map +1 -0
- package/dist/__tests__/core/rage-click.test.js +121 -0
- package/dist/__tests__/core/rage-click.test.js.map +1 -0
- package/dist/__tests__/core/session-manager.test.d.ts +2 -0
- package/dist/__tests__/core/session-manager.test.d.ts.map +1 -0
- package/dist/__tests__/core/session-manager.test.js +1132 -0
- package/dist/__tests__/core/session-manager.test.js.map +1 -0
- package/dist/__tests__/integration/release-upload.test.d.ts +2 -0
- package/dist/__tests__/integration/release-upload.test.d.ts.map +1 -0
- package/dist/__tests__/integration/release-upload.test.js +173 -0
- package/dist/__tests__/integration/release-upload.test.js.map +1 -0
- package/dist/__tests__/session/persistence.test.d.ts +2 -0
- package/dist/__tests__/session/persistence.test.d.ts.map +1 -0
- package/dist/__tests__/session/persistence.test.js +129 -0
- package/dist/__tests__/session/persistence.test.js.map +1 -0
- package/dist/__tests__/session/session-summary.test.d.ts +2 -0
- package/dist/__tests__/session/session-summary.test.d.ts.map +1 -0
- package/dist/__tests__/session/session-summary.test.js +763 -0
- package/dist/__tests__/session/session-summary.test.js.map +1 -0
- package/dist/build/index.d.ts +3 -0
- package/dist/build/index.d.ts.map +1 -0
- package/dist/build/index.js +2 -0
- package/dist/build/index.js.map +1 -0
- package/dist/build/with-interfere.d.ts +54 -0
- package/dist/build/with-interfere.d.ts.map +1 -0
- package/dist/build/with-interfere.js +267 -0
- package/dist/build/with-interfere.js.map +1 -0
- package/dist/core/client-core.d.ts +27 -0
- package/dist/core/client-core.d.ts.map +1 -0
- package/dist/core/client-core.js +164 -0
- package/dist/core/client-core.js.map +1 -0
- package/dist/core/client.d.ts +70 -18
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +112 -104
- package/dist/core/client.js.map +1 -1
- package/dist/core/constants.d.ts +12 -0
- package/dist/core/constants.d.ts.map +1 -0
- package/dist/core/constants.js +17 -0
- package/dist/core/constants.js.map +1 -0
- package/dist/core/debug.d.ts +47 -0
- package/dist/core/debug.d.ts.map +1 -0
- package/dist/core/debug.js +79 -0
- package/dist/core/debug.js.map +1 -0
- package/dist/core/error-handlers.d.ts.map +1 -1
- package/dist/core/error-handlers.js +42 -41
- package/dist/core/error-handlers.js.map +1 -1
- package/dist/core/runtime.d.ts +7 -0
- package/dist/core/runtime.d.ts.map +1 -0
- package/dist/core/runtime.js +16 -0
- package/dist/core/runtime.js.map +1 -0
- package/dist/index.d.ts +10 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -7
- package/dist/index.js.map +1 -1
- package/dist/next/middleware.d.ts +1 -1
- package/dist/next/middleware.js +13 -13
- package/dist/persistence/storage.d.ts +5 -0
- package/dist/persistence/storage.d.ts.map +1 -0
- package/dist/persistence/storage.js +67 -0
- package/dist/persistence/storage.js.map +1 -0
- package/dist/react/provider.d.ts +9 -5
- package/dist/react/provider.d.ts.map +1 -1
- package/dist/react/provider.jsx +33 -10
- package/dist/react/provider.jsx.map +1 -1
- package/dist/session/constants.d.ts +19 -0
- package/dist/session/constants.d.ts.map +1 -0
- package/dist/session/constants.js +34 -0
- package/dist/session/constants.js.map +1 -0
- package/dist/session/persistence.d.ts +58 -0
- package/dist/session/persistence.d.ts.map +1 -0
- package/dist/session/persistence.js +180 -0
- package/dist/session/persistence.js.map +1 -0
- package/dist/session/rage-click.d.ts +17 -0
- package/dist/session/rage-click.d.ts.map +1 -0
- package/dist/session/rage-click.js +104 -0
- package/dist/session/rage-click.js.map +1 -0
- package/dist/session/replay.d.ts +2 -2
- package/dist/session/replay.d.ts.map +1 -1
- package/dist/session/replay.js +57 -24
- package/dist/session/replay.js.map +1 -1
- package/dist/session/session-manager.d.ts +126 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +635 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/session-summary.d.ts +2 -2
- package/dist/session/session-summary.d.ts.map +1 -1
- package/dist/session/session-summary.js +94 -47
- package/dist/session/session-summary.js.map +1 -1
- package/dist/types/storage.d.ts +7 -0
- package/dist/types/storage.d.ts.map +1 -0
- package/dist/types/storage.js +2 -0
- package/dist/types/storage.js.map +1 -0
- package/package.json +24 -7
- package/dist/core/client.test.d.ts.map +0 -1
- package/dist/core/client.test.js +0 -238
- package/dist/core/client.test.js.map +0 -1
- package/dist/core/encoders.test.d.ts.map +0 -1
- package/dist/core/encoders.test.js.map +0 -1
- package/dist/next/error-boundary.d.ts +0 -17
- package/dist/next/error-boundary.d.ts.map +0 -1
- package/dist/next/error-boundary.jsx +0 -32
- package/dist/next/error-boundary.jsx.map +0 -1
- /package/dist/{core → __tests__/core}/client.test.d.ts +0 -0
- /package/dist/{core → __tests__/core}/encoders.test.d.ts +0 -0
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { v7 as uuidv7 } from "uuid";
|
|
2
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { capture, flush, getSessionId, init } from "../../core/client.js";
|
|
4
|
+
const SESSION_ID_REGEX = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$/;
|
|
5
|
+
// Test defaults for required fields
|
|
6
|
+
const DEFAULT_TEST_CONFIG = {
|
|
7
|
+
buildId: "test-build-123",
|
|
8
|
+
releaseId: "test-release-456",
|
|
9
|
+
};
|
|
10
|
+
describe("client", () => {
|
|
11
|
+
beforeEach(() => {
|
|
12
|
+
vi.resetModules();
|
|
13
|
+
vi.clearAllMocks();
|
|
14
|
+
vi.clearAllTimers();
|
|
15
|
+
vi.useFakeTimers();
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
vi.useRealTimers();
|
|
19
|
+
});
|
|
20
|
+
describe("init", () => {
|
|
21
|
+
it("initializes with required config", () => {
|
|
22
|
+
const client = init({
|
|
23
|
+
surface: "if_p_test",
|
|
24
|
+
options: DEFAULT_TEST_CONFIG,
|
|
25
|
+
});
|
|
26
|
+
expect(client).toBeDefined();
|
|
27
|
+
});
|
|
28
|
+
it("uses default endpoint", () => {
|
|
29
|
+
const fetchSpy = vi
|
|
30
|
+
.spyOn(global, "fetch")
|
|
31
|
+
.mockResolvedValue(new Response());
|
|
32
|
+
init({
|
|
33
|
+
surface: "if_p_test",
|
|
34
|
+
options: DEFAULT_TEST_CONFIG,
|
|
35
|
+
});
|
|
36
|
+
capture("error", { test: true });
|
|
37
|
+
flush();
|
|
38
|
+
expect(fetchSpy).toHaveBeenCalledWith("https://api.interfere.com/ingest/v0", expect.any(Object));
|
|
39
|
+
});
|
|
40
|
+
it("uses custom endpoint", () => {
|
|
41
|
+
const fetchSpy = vi
|
|
42
|
+
.spyOn(global, "fetch")
|
|
43
|
+
.mockResolvedValue(new Response());
|
|
44
|
+
init({
|
|
45
|
+
surface: "if_p_test",
|
|
46
|
+
options: {
|
|
47
|
+
...DEFAULT_TEST_CONFIG,
|
|
48
|
+
endpointUrl: "http://localhost:3001",
|
|
49
|
+
},
|
|
50
|
+
});
|
|
51
|
+
capture("error", { test: true });
|
|
52
|
+
flush();
|
|
53
|
+
expect(fetchSpy).toHaveBeenCalledWith("http://localhost:3001/ingest/v0", expect.any(Object));
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
describe("capture", () => {
|
|
57
|
+
it("throws if not initialized", async () => {
|
|
58
|
+
vi.resetModules();
|
|
59
|
+
const { capture: freshCapture } = await import("../../core/client.js");
|
|
60
|
+
expect(() => freshCapture("error", {})).toThrow("[Interfere] Not initialized");
|
|
61
|
+
});
|
|
62
|
+
it("queues events", () => {
|
|
63
|
+
const fetchSpy = vi
|
|
64
|
+
.spyOn(global, "fetch")
|
|
65
|
+
.mockResolvedValue(new Response());
|
|
66
|
+
init({
|
|
67
|
+
surface: "if_p_test",
|
|
68
|
+
options: DEFAULT_TEST_CONFIG,
|
|
69
|
+
});
|
|
70
|
+
capture("ui_event", { action: "click" });
|
|
71
|
+
capture("error", { message: "test error" });
|
|
72
|
+
// In server mode, each capture auto-flushes
|
|
73
|
+
// So we expect 2 fetch calls
|
|
74
|
+
expect(fetchSpy).toHaveBeenCalledTimes(2);
|
|
75
|
+
const call1 = fetchSpy.mock.calls[0];
|
|
76
|
+
const call2 = fetchSpy.mock.calls[1];
|
|
77
|
+
if (!(call1?.[1] && call2?.[1])) {
|
|
78
|
+
throw new Error("Expected 2 fetch calls");
|
|
79
|
+
}
|
|
80
|
+
const body1 = JSON.parse(call1[1].body);
|
|
81
|
+
const body2 = JSON.parse(call2[1].body);
|
|
82
|
+
expect(body1).toHaveLength(1);
|
|
83
|
+
expect(body1[0].type).toBe("ui_event");
|
|
84
|
+
expect(body2).toHaveLength(1);
|
|
85
|
+
expect(body2[0].type).toBe("error");
|
|
86
|
+
});
|
|
87
|
+
it("auto-flushes after 10 events", () => {
|
|
88
|
+
const fetchSpy = vi
|
|
89
|
+
.spyOn(global, "fetch")
|
|
90
|
+
.mockResolvedValue(new Response());
|
|
91
|
+
init({
|
|
92
|
+
surface: "if_p_test",
|
|
93
|
+
options: DEFAULT_TEST_CONFIG,
|
|
94
|
+
});
|
|
95
|
+
// In server mode, each capture triggers a flush
|
|
96
|
+
for (let i = 0; i < 10; i++) {
|
|
97
|
+
capture("ui_event", { index: i });
|
|
98
|
+
}
|
|
99
|
+
// Each capture causes a flush in server mode
|
|
100
|
+
expect(fetchSpy).toHaveBeenCalledTimes(10);
|
|
101
|
+
});
|
|
102
|
+
it("includes correct envelope structure", () => {
|
|
103
|
+
const fetchSpy = vi
|
|
104
|
+
.spyOn(global, "fetch")
|
|
105
|
+
.mockResolvedValue(new Response());
|
|
106
|
+
init({
|
|
107
|
+
surface: "if_p_test",
|
|
108
|
+
options: { ...DEFAULT_TEST_CONFIG, env: "production" },
|
|
109
|
+
});
|
|
110
|
+
capture("network", { url: "/api/test" });
|
|
111
|
+
flush();
|
|
112
|
+
const call = fetchSpy.mock.calls[0];
|
|
113
|
+
if (!call?.[1]) {
|
|
114
|
+
throw new Error("Expected fetch call");
|
|
115
|
+
}
|
|
116
|
+
const body = JSON.parse(call[1].body);
|
|
117
|
+
const envelope = body[0];
|
|
118
|
+
expect(envelope.v).toBe(0);
|
|
119
|
+
expect(envelope.runtime).toBe("server"); // Default in test environment
|
|
120
|
+
expect(envelope.surface).toBe("if_p_test");
|
|
121
|
+
expect(envelope.env).toBe("production");
|
|
122
|
+
expect(envelope.clientTs).toBeGreaterThan(0);
|
|
123
|
+
expect(envelope.sessionId).toMatch(SESSION_ID_REGEX);
|
|
124
|
+
expect(envelope.seq).toBe(1);
|
|
125
|
+
expect(envelope.type).toBe("network");
|
|
126
|
+
expect(envelope.payload).toBeDefined();
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
describe("flush", () => {
|
|
130
|
+
it("does nothing with empty queue", () => {
|
|
131
|
+
const fetchSpy = vi
|
|
132
|
+
.spyOn(global, "fetch")
|
|
133
|
+
.mockResolvedValue(new Response());
|
|
134
|
+
init({
|
|
135
|
+
surface: "if_p_test",
|
|
136
|
+
options: DEFAULT_TEST_CONFIG,
|
|
137
|
+
});
|
|
138
|
+
flush();
|
|
139
|
+
expect(fetchSpy).not.toHaveBeenCalled();
|
|
140
|
+
});
|
|
141
|
+
it("clears queue after flush", () => {
|
|
142
|
+
const fetchSpy = vi
|
|
143
|
+
.spyOn(global, "fetch")
|
|
144
|
+
.mockResolvedValue(new Response());
|
|
145
|
+
init({
|
|
146
|
+
surface: "if_p_test",
|
|
147
|
+
options: DEFAULT_TEST_CONFIG,
|
|
148
|
+
});
|
|
149
|
+
capture("error", { test: true });
|
|
150
|
+
flush();
|
|
151
|
+
expect(fetchSpy).toHaveBeenCalledTimes(1);
|
|
152
|
+
flush(); // Second flush should do nothing
|
|
153
|
+
expect(fetchSpy).toHaveBeenCalledTimes(1);
|
|
154
|
+
});
|
|
155
|
+
it("handles fetch errors in debug mode", async () => {
|
|
156
|
+
const fetchSpy = vi
|
|
157
|
+
.spyOn(global, "fetch")
|
|
158
|
+
.mockRejectedValue(new Error("Network error"));
|
|
159
|
+
init({
|
|
160
|
+
surface: "if_p_test",
|
|
161
|
+
options: { ...DEFAULT_TEST_CONFIG, debug: true },
|
|
162
|
+
});
|
|
163
|
+
capture("error", { test: true });
|
|
164
|
+
// Should not throw
|
|
165
|
+
expect(() => flush()).not.toThrow();
|
|
166
|
+
await vi.waitFor(() => {
|
|
167
|
+
expect(fetchSpy).toHaveBeenCalled();
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
describe("getSessionId", () => {
|
|
172
|
+
it("throws if not initialized", async () => {
|
|
173
|
+
vi.resetModules();
|
|
174
|
+
const { getSessionId: freshGetSessionId } = await import("../../core/client.js");
|
|
175
|
+
expect(() => freshGetSessionId()).toThrow("[Interfere] Not initialized");
|
|
176
|
+
});
|
|
177
|
+
it("returns consistent session ID", () => {
|
|
178
|
+
init({
|
|
179
|
+
surface: "if_p_test",
|
|
180
|
+
options: DEFAULT_TEST_CONFIG,
|
|
181
|
+
});
|
|
182
|
+
const id1 = getSessionId();
|
|
183
|
+
const id2 = getSessionId();
|
|
184
|
+
expect(id1).toBe(id2);
|
|
185
|
+
expect(id1).toMatch(SESSION_ID_REGEX);
|
|
186
|
+
});
|
|
187
|
+
it("uses provided session ID", () => {
|
|
188
|
+
const customId = uuidv7();
|
|
189
|
+
init({
|
|
190
|
+
surface: "if_p_test",
|
|
191
|
+
options: { ...DEFAULT_TEST_CONFIG, sessionId: customId },
|
|
192
|
+
});
|
|
193
|
+
expect(getSessionId()).toBe(customId);
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
describe("runtime detection", () => {
|
|
197
|
+
it("detects server runtime by default", () => {
|
|
198
|
+
const fetchSpy = vi
|
|
199
|
+
.spyOn(global, "fetch")
|
|
200
|
+
.mockResolvedValue(new Response());
|
|
201
|
+
init({
|
|
202
|
+
surface: "if_p_test",
|
|
203
|
+
options: DEFAULT_TEST_CONFIG,
|
|
204
|
+
});
|
|
205
|
+
capture("server_req", {});
|
|
206
|
+
flush();
|
|
207
|
+
const call = fetchSpy.mock.calls[0];
|
|
208
|
+
if (!call?.[1]) {
|
|
209
|
+
throw new Error("Expected fetch call");
|
|
210
|
+
}
|
|
211
|
+
const body = JSON.parse(call[1].body);
|
|
212
|
+
expect(body[0].runtime).toBe("server");
|
|
213
|
+
});
|
|
214
|
+
it("detects client runtime with window", async () => {
|
|
215
|
+
const originalWindow = global.window;
|
|
216
|
+
global.window = {
|
|
217
|
+
addEventListener: vi.fn(),
|
|
218
|
+
};
|
|
219
|
+
vi.resetModules();
|
|
220
|
+
const { init: freshInit, capture: freshCapture, flush: freshFlush, } = await import("../../core/client.js");
|
|
221
|
+
const fetchSpy = vi
|
|
222
|
+
.spyOn(global, "fetch")
|
|
223
|
+
.mockResolvedValue(new Response());
|
|
224
|
+
freshInit({
|
|
225
|
+
surface: "if_p_test",
|
|
226
|
+
options: DEFAULT_TEST_CONFIG,
|
|
227
|
+
});
|
|
228
|
+
freshCapture("ui_event", {});
|
|
229
|
+
// Client mode doesn't auto-flush
|
|
230
|
+
expect(fetchSpy).not.toHaveBeenCalled();
|
|
231
|
+
freshFlush();
|
|
232
|
+
const call = fetchSpy.mock.calls[0];
|
|
233
|
+
if (!call?.[1]) {
|
|
234
|
+
throw new Error("Expected fetch call");
|
|
235
|
+
}
|
|
236
|
+
const body = JSON.parse(call[1].body);
|
|
237
|
+
expect(body[0].runtime).toBe("client");
|
|
238
|
+
global.window = originalWindow;
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
describe("client mode features", () => {
|
|
242
|
+
it("uses fetch with keepalive when sendBeacon is available", async () => {
|
|
243
|
+
const originalWindow = global.window;
|
|
244
|
+
const fetchSpy = vi.fn().mockResolvedValue(new Response());
|
|
245
|
+
const sendBeaconSpy = vi.fn().mockReturnValue(true);
|
|
246
|
+
// Create a proper mock window with sendBeacon on it
|
|
247
|
+
global.window = {
|
|
248
|
+
addEventListener: vi.fn(),
|
|
249
|
+
navigator: {
|
|
250
|
+
sendBeacon: sendBeaconSpy,
|
|
251
|
+
},
|
|
252
|
+
};
|
|
253
|
+
global.fetch = fetchSpy;
|
|
254
|
+
vi.resetModules();
|
|
255
|
+
const { init: freshInit, capture: freshCapture, flush: freshFlush, } = await import("../../core/client.js");
|
|
256
|
+
freshInit({
|
|
257
|
+
surface: "if_p_test",
|
|
258
|
+
options: DEFAULT_TEST_CONFIG,
|
|
259
|
+
});
|
|
260
|
+
freshCapture("ui_event", {});
|
|
261
|
+
freshFlush();
|
|
262
|
+
// Should use fetch with keepalive, not sendBeacon
|
|
263
|
+
expect(sendBeaconSpy).not.toHaveBeenCalled();
|
|
264
|
+
expect(fetchSpy).toHaveBeenCalledWith("https://api.interfere.com/ingest/v0", expect.objectContaining({
|
|
265
|
+
method: "POST",
|
|
266
|
+
keepalive: true,
|
|
267
|
+
headers: expect.any(Headers),
|
|
268
|
+
body: expect.any(String),
|
|
269
|
+
}));
|
|
270
|
+
global.window = originalWindow;
|
|
271
|
+
global.fetch = fetch;
|
|
272
|
+
});
|
|
273
|
+
it("sets up auto-flush timer in client mode", async () => {
|
|
274
|
+
const originalWindow = global.window;
|
|
275
|
+
global.window = { addEventListener: vi.fn() };
|
|
276
|
+
vi.resetModules();
|
|
277
|
+
const { init: freshInit } = await import("../../core/client.js");
|
|
278
|
+
freshInit({
|
|
279
|
+
surface: "if_p_test",
|
|
280
|
+
options: { ...DEFAULT_TEST_CONFIG, flushInterval: 1000 },
|
|
281
|
+
});
|
|
282
|
+
expect(global.window.addEventListener).toHaveBeenCalledWith("beforeunload", expect.any(Function));
|
|
283
|
+
global.window = originalWindow;
|
|
284
|
+
});
|
|
285
|
+
});
|
|
286
|
+
describe("background events", () => {
|
|
287
|
+
beforeEach(() => {
|
|
288
|
+
vi.clearAllMocks();
|
|
289
|
+
});
|
|
290
|
+
it("should not update session activity for replay_chunk events", () => {
|
|
291
|
+
const client = init({
|
|
292
|
+
surface: "if_p_test",
|
|
293
|
+
options: DEFAULT_TEST_CONFIG,
|
|
294
|
+
});
|
|
295
|
+
// Mock the session manager to spy on checkAndGetSessionAndWindowId calls
|
|
296
|
+
const sessionManager = client
|
|
297
|
+
.sessionManager;
|
|
298
|
+
if (!sessionManager) {
|
|
299
|
+
throw new Error("Session manager not found");
|
|
300
|
+
}
|
|
301
|
+
const checkAndGetSpy = vi.spyOn(sessionManager, "checkAndGetSessionAndWindowId");
|
|
302
|
+
// Capture a background event
|
|
303
|
+
capture("replay_chunk", { events: [] });
|
|
304
|
+
// Should be called with readOnly = true
|
|
305
|
+
expect(checkAndGetSpy).toHaveBeenCalledWith(true);
|
|
306
|
+
});
|
|
307
|
+
it("should not update session activity for session_summary events", () => {
|
|
308
|
+
const client = init({
|
|
309
|
+
surface: "if_p_test",
|
|
310
|
+
options: DEFAULT_TEST_CONFIG,
|
|
311
|
+
});
|
|
312
|
+
const sessionManager = client
|
|
313
|
+
.sessionManager;
|
|
314
|
+
if (!sessionManager) {
|
|
315
|
+
throw new Error("Session manager not found");
|
|
316
|
+
}
|
|
317
|
+
const checkAndGetSpy = vi.spyOn(sessionManager, "checkAndGetSessionAndWindowId");
|
|
318
|
+
// Capture a background event
|
|
319
|
+
capture("session_summary", { summary: "test" });
|
|
320
|
+
// Should be called with readOnly = true
|
|
321
|
+
expect(checkAndGetSpy).toHaveBeenCalledWith(true);
|
|
322
|
+
});
|
|
323
|
+
it("should update session activity for user events", () => {
|
|
324
|
+
const client = init({
|
|
325
|
+
surface: "if_p_test",
|
|
326
|
+
options: DEFAULT_TEST_CONFIG,
|
|
327
|
+
});
|
|
328
|
+
const sessionManager = client
|
|
329
|
+
.sessionManager;
|
|
330
|
+
if (!sessionManager) {
|
|
331
|
+
throw new Error("Session manager not found");
|
|
332
|
+
}
|
|
333
|
+
const checkAndGetSpy = vi.spyOn(sessionManager, "checkAndGetSessionAndWindowId");
|
|
334
|
+
// Capture a user event
|
|
335
|
+
capture("ui_event", { action: "click" });
|
|
336
|
+
// Should be called with readOnly = false
|
|
337
|
+
expect(checkAndGetSpy).toHaveBeenCalledWith(false);
|
|
338
|
+
});
|
|
339
|
+
it("should update session activity for error events", () => {
|
|
340
|
+
const client = init({
|
|
341
|
+
surface: "if_p_test",
|
|
342
|
+
options: DEFAULT_TEST_CONFIG,
|
|
343
|
+
});
|
|
344
|
+
const sessionManager = client
|
|
345
|
+
.sessionManager;
|
|
346
|
+
if (!sessionManager) {
|
|
347
|
+
throw new Error("Session manager not found");
|
|
348
|
+
}
|
|
349
|
+
const checkAndGetSpy = vi.spyOn(sessionManager, "checkAndGetSessionAndWindowId");
|
|
350
|
+
// Capture an error event
|
|
351
|
+
capture("error", { message: "test error" });
|
|
352
|
+
// Should be called with readOnly = false
|
|
353
|
+
expect(checkAndGetSpy).toHaveBeenCalledWith(false);
|
|
354
|
+
});
|
|
355
|
+
it("should update session activity for custom events", () => {
|
|
356
|
+
const client = init({
|
|
357
|
+
surface: "if_p_test",
|
|
358
|
+
options: DEFAULT_TEST_CONFIG,
|
|
359
|
+
});
|
|
360
|
+
const sessionManager = client
|
|
361
|
+
.sessionManager;
|
|
362
|
+
if (!sessionManager) {
|
|
363
|
+
throw new Error("Session manager not found");
|
|
364
|
+
}
|
|
365
|
+
const checkAndGetSpy = vi.spyOn(sessionManager, "checkAndGetSessionAndWindowId");
|
|
366
|
+
// Capture a custom event
|
|
367
|
+
capture("custom", { action: "user_signup" });
|
|
368
|
+
// Should be called with readOnly = false
|
|
369
|
+
expect(checkAndGetSpy).toHaveBeenCalledWith(false);
|
|
370
|
+
});
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
//# sourceMappingURL=client.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../../src/__tests__/core/client.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoders.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/core/encoders.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,39 +1,40 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
/** biome-ignore-all lint/style/noMagicNumbers: Self-explanatory */
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
import { decode, encode } from "../../core/encoders.js";
|
|
4
|
+
describe("encoders", () => {
|
|
5
|
+
describe("encode", () => {
|
|
6
|
+
it("encodes strings to Uint8Array", () => {
|
|
7
|
+
const result = encode("hello");
|
|
7
8
|
expect(result).toBeInstanceOf(Uint8Array);
|
|
8
9
|
expect(new TextDecoder().decode(result)).toBe('"hello"');
|
|
9
10
|
});
|
|
10
|
-
it(
|
|
11
|
-
const obj = { foo:
|
|
11
|
+
it("encodes objects to Uint8Array", () => {
|
|
12
|
+
const obj = { foo: "bar", num: 123 };
|
|
12
13
|
const result = encode(obj);
|
|
13
14
|
expect(result).toBeInstanceOf(Uint8Array);
|
|
14
15
|
expect(new TextDecoder().decode(result)).toBe('{"foo":"bar","num":123}');
|
|
15
16
|
});
|
|
16
|
-
it(
|
|
17
|
+
it("encodes arrays to Uint8Array", () => {
|
|
17
18
|
const arr = [1, 2, 3];
|
|
18
19
|
const result = encode(arr);
|
|
19
20
|
expect(result).toBeInstanceOf(Uint8Array);
|
|
20
|
-
expect(new TextDecoder().decode(result)).toBe(
|
|
21
|
+
expect(new TextDecoder().decode(result)).toBe("[1,2,3]");
|
|
21
22
|
});
|
|
22
|
-
it(
|
|
23
|
-
expect(new TextDecoder().decode(encode(null))).toBe(
|
|
23
|
+
it("encodes null", () => {
|
|
24
|
+
expect(new TextDecoder().decode(encode(null))).toBe("null");
|
|
24
25
|
});
|
|
25
|
-
it(
|
|
26
|
+
it("handles undefined by encoding as null", () => {
|
|
26
27
|
// JSON.stringify(undefined) returns undefined, which becomes empty string
|
|
27
28
|
// This is expected behavior for JSON
|
|
28
29
|
const result = encode(undefined);
|
|
29
30
|
expect(result).toBeInstanceOf(Uint8Array);
|
|
30
31
|
});
|
|
31
32
|
});
|
|
32
|
-
describe(
|
|
33
|
-
it(
|
|
33
|
+
describe("decode", () => {
|
|
34
|
+
it("decodes Uint8Array back to original values", () => {
|
|
34
35
|
const testCases = [
|
|
35
|
-
|
|
36
|
-
{ foo:
|
|
36
|
+
"hello",
|
|
37
|
+
{ foo: "bar", num: 123 },
|
|
37
38
|
[1, 2, 3],
|
|
38
39
|
null,
|
|
39
40
|
true,
|
|
@@ -46,8 +47,8 @@ describe('encoders', () => {
|
|
|
46
47
|
expect(decoded).toEqual(original);
|
|
47
48
|
}
|
|
48
49
|
});
|
|
49
|
-
it(
|
|
50
|
-
const invalidJson = new TextEncoder().encode(
|
|
50
|
+
it("throws on invalid JSON", () => {
|
|
51
|
+
const invalidJson = new TextEncoder().encode("not valid json");
|
|
51
52
|
expect(() => decode(invalidJson)).toThrow();
|
|
52
53
|
});
|
|
53
54
|
});
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoders.test.js","sourceRoot":"","sources":["../../../src/__tests__/core/encoders.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rage-click.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/core/rage-click.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
import RageClick from "../../session/rage-click.js";
|
|
3
|
+
// Test constants
|
|
4
|
+
const TEST_X = 100;
|
|
5
|
+
const TEST_Y = 100;
|
|
6
|
+
const SMALL_OFFSET = 5;
|
|
7
|
+
const MEDIUM_OFFSET = 10;
|
|
8
|
+
const MEDIUM_LARGE_OFFSET = 15;
|
|
9
|
+
const LARGE_OFFSET = 50;
|
|
10
|
+
const VERY_LARGE_OFFSET = 100;
|
|
11
|
+
const SHORT_DELAY = 100;
|
|
12
|
+
const MEDIUM_DELAY = 200;
|
|
13
|
+
const LONG_DELAY = 300;
|
|
14
|
+
const VERY_LONG_DELAY = 400;
|
|
15
|
+
const CUSTOM_TIMEOUT = 500;
|
|
16
|
+
const VERY_LATE_DELAY = 1500;
|
|
17
|
+
const MUCH_LATER_DELAY = 3000;
|
|
18
|
+
const MAX_TEXT_TEST_LENGTH = 150;
|
|
19
|
+
const EXPECTED_TRUNCATED_LENGTH = 100;
|
|
20
|
+
describe("RageClick", () => {
|
|
21
|
+
it("should detect rage click with default settings", () => {
|
|
22
|
+
const detector = new RageClick();
|
|
23
|
+
const baseTime = Date.now();
|
|
24
|
+
// First two clicks should not trigger
|
|
25
|
+
expect(detector.isRageClick(TEST_X, TEST_Y, baseTime)).toBe(false);
|
|
26
|
+
expect(detector.isRageClick(TEST_X + SMALL_OFFSET, TEST_Y + SMALL_OFFSET, baseTime + SHORT_DELAY)).toBe(false);
|
|
27
|
+
// Third click should trigger rage click
|
|
28
|
+
expect(detector.isRageClick(TEST_X - SMALL_OFFSET, TEST_Y - SMALL_OFFSET, baseTime + MEDIUM_DELAY)).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
it("should not detect rage click if clicks are too far apart", () => {
|
|
31
|
+
const detector = new RageClick();
|
|
32
|
+
const baseTime = Date.now();
|
|
33
|
+
// Clicks outside the radius threshold (default 30px)
|
|
34
|
+
expect(detector.isRageClick(TEST_X, TEST_Y, baseTime)).toBe(false);
|
|
35
|
+
expect(detector.isRageClick(TEST_X + LARGE_OFFSET, TEST_Y, baseTime + SHORT_DELAY)).toBe(false);
|
|
36
|
+
expect(detector.isRageClick(TEST_X, TEST_Y + LARGE_OFFSET, baseTime + MEDIUM_DELAY)).toBe(false);
|
|
37
|
+
// Should not trigger even with more clicks
|
|
38
|
+
expect(detector.isRageClick(TEST_X + VERY_LARGE_OFFSET, TEST_Y, baseTime + LONG_DELAY)).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
it("should not detect rage click if clicks are too slow", () => {
|
|
41
|
+
const detector = new RageClick();
|
|
42
|
+
const baseTime = Date.now();
|
|
43
|
+
// Spread clicks over a longer time period so they don't form a rage click
|
|
44
|
+
expect(detector.isRageClick(TEST_X, TEST_Y, baseTime)).toBe(false);
|
|
45
|
+
expect(detector.isRageClick(TEST_X + SMALL_OFFSET, TEST_Y + SMALL_OFFSET, baseTime + VERY_LATE_DELAY)).toBe(false); // Gap too large
|
|
46
|
+
expect(detector.isRageClick(TEST_X - SMALL_OFFSET, TEST_Y - SMALL_OFFSET, baseTime + MUCH_LATER_DELAY)).toBe(false); // Gap too large
|
|
47
|
+
});
|
|
48
|
+
it("should use static configuration values", () => {
|
|
49
|
+
const detector = new RageClick();
|
|
50
|
+
const baseTime = Date.now();
|
|
51
|
+
// Static config uses 3 clicks within 1000ms and 30px radius
|
|
52
|
+
// First click
|
|
53
|
+
expect(detector.isRageClick(TEST_X, TEST_Y, baseTime)).toBe(false);
|
|
54
|
+
// Second click
|
|
55
|
+
expect(detector.isRageClick(TEST_X + MEDIUM_OFFSET, TEST_Y + MEDIUM_OFFSET, baseTime + MEDIUM_DELAY)).toBe(false);
|
|
56
|
+
// Third click should trigger rage click
|
|
57
|
+
expect(detector.isRageClick(TEST_X + MEDIUM_LARGE_OFFSET, TEST_Y + MEDIUM_LARGE_OFFSET, baseTime + VERY_LONG_DELAY)).toBe(true);
|
|
58
|
+
});
|
|
59
|
+
it("should reset after detecting rage click", () => {
|
|
60
|
+
const detector = new RageClick();
|
|
61
|
+
const baseTime = Date.now();
|
|
62
|
+
// Trigger first rage click
|
|
63
|
+
expect(detector.isRageClick(TEST_X, TEST_Y, baseTime)).toBe(false);
|
|
64
|
+
expect(detector.isRageClick(TEST_X + SMALL_OFFSET, TEST_Y + SMALL_OFFSET, baseTime + SHORT_DELAY)).toBe(false);
|
|
65
|
+
expect(detector.isRageClick(TEST_X - SMALL_OFFSET, TEST_Y - SMALL_OFFSET, baseTime + MEDIUM_DELAY)).toBe(true);
|
|
66
|
+
// Should reset and require 3 new clicks
|
|
67
|
+
expect(detector.isRageClick(TEST_X, TEST_Y, baseTime + LONG_DELAY)).toBe(false);
|
|
68
|
+
expect(detector.isRageClick(TEST_X + SMALL_OFFSET, TEST_Y + SMALL_OFFSET, baseTime + VERY_LONG_DELAY)).toBe(false);
|
|
69
|
+
expect(detector.isRageClick(TEST_X - SMALL_OFFSET, TEST_Y - SMALL_OFFSET, baseTime + CUSTOM_TIMEOUT)).toBe(true);
|
|
70
|
+
});
|
|
71
|
+
it("should filter out old clicks", () => {
|
|
72
|
+
const detector = new RageClick();
|
|
73
|
+
const baseTime = Date.now();
|
|
74
|
+
// Add some old clicks
|
|
75
|
+
expect(detector.isRageClick(TEST_X, TEST_Y, baseTime)).toBe(false);
|
|
76
|
+
expect(detector.isRageClick(TEST_X + SMALL_OFFSET, TEST_Y + SMALL_OFFSET, baseTime + SHORT_DELAY)).toBe(false);
|
|
77
|
+
// Wait longer than timeout, then add new clicks
|
|
78
|
+
const laterTime = baseTime + VERY_LATE_DELAY; // After timeout window
|
|
79
|
+
expect(detector.isRageClick(TEST_X, TEST_Y, laterTime)).toBe(false);
|
|
80
|
+
expect(detector.isRageClick(TEST_X + SMALL_OFFSET, TEST_Y + SMALL_OFFSET, laterTime + SHORT_DELAY)).toBe(false);
|
|
81
|
+
expect(detector.isRageClick(TEST_X - SMALL_OFFSET, TEST_Y - SMALL_OFFSET, laterTime + MEDIUM_DELAY)).toBe(true);
|
|
82
|
+
});
|
|
83
|
+
it("should extract element information correctly", () => {
|
|
84
|
+
const detector = new RageClick();
|
|
85
|
+
// Mock DOM element
|
|
86
|
+
const mockElement = {
|
|
87
|
+
tagName: "BUTTON",
|
|
88
|
+
className: "test-class",
|
|
89
|
+
id: "test-id",
|
|
90
|
+
innerText: "Click me!",
|
|
91
|
+
getAttribute: (attr) => attr === "aria-label" ? "Test Button" : null,
|
|
92
|
+
};
|
|
93
|
+
const elementInfo = detector.getElementInfo(mockElement);
|
|
94
|
+
expect(elementInfo).toEqual({
|
|
95
|
+
tagName: "button",
|
|
96
|
+
className: "test-class",
|
|
97
|
+
id: "test-id",
|
|
98
|
+
text: "Click me!",
|
|
99
|
+
ariaLabel: "Test Button",
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
it("should handle null element gracefully", () => {
|
|
103
|
+
const detector = new RageClick();
|
|
104
|
+
const elementInfo = detector.getElementInfo(null);
|
|
105
|
+
expect(elementInfo).toEqual({});
|
|
106
|
+
});
|
|
107
|
+
it("should truncate long text", () => {
|
|
108
|
+
const detector = new RageClick();
|
|
109
|
+
// Mock element with long text
|
|
110
|
+
const longText = "a".repeat(MAX_TEXT_TEST_LENGTH);
|
|
111
|
+
const mockElement = {
|
|
112
|
+
tagName: "DIV",
|
|
113
|
+
innerText: longText,
|
|
114
|
+
getAttribute: () => null,
|
|
115
|
+
};
|
|
116
|
+
const elementInfo = detector.getElementInfo(mockElement);
|
|
117
|
+
expect(elementInfo.text).toHaveLength(EXPECTED_TRUNCATED_LENGTH);
|
|
118
|
+
expect(elementInfo.text).toBe("a".repeat(EXPECTED_TRUNCATED_LENGTH));
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
//# sourceMappingURL=rage-click.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rage-click.test.js","sourceRoot":"","sources":["../../../src/__tests__/core/rage-click.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-manager.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/core/session-manager.test.ts"],"names":[],"mappings":""}
|