@brett_lamy/docstream 1.22.1 → 1.23.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/dist/replay/ReplayDevtools.d.ts +6 -3
- package/dist/replay/ReplayDevtools.d.ts.map +1 -1
- package/dist/replay/ReplayDevtools.js +38 -16
- package/dist/replay/ReplayDevtools.js.map +1 -1
- package/dist/replay/ReplayPlayer.d.ts +12 -3
- package/dist/replay/ReplayPlayer.d.ts.map +1 -1
- package/dist/replay/ReplayPlayer.js +48 -9
- package/dist/replay/ReplayPlayer.js.map +1 -1
- package/dist/replay/devtools.d.ts +5 -0
- package/dist/replay/devtools.d.ts.map +1 -1
- package/dist/replay/devtools.js +3 -2
- package/dist/replay/devtools.js.map +1 -1
- package/dist/replay/index.d.ts +2 -0
- package/dist/replay/index.d.ts.map +1 -1
- package/dist/replay/index.js +1 -0
- package/dist/replay/index.js.map +1 -1
- package/dist/replay/inspections.d.ts +36 -0
- package/dist/replay/inspections.d.ts.map +1 -0
- package/dist/replay/inspections.js +64 -0
- package/dist/replay/inspections.js.map +1 -0
- package/dist/styles.css +11 -8
- package/package.json +1 -1
- package/src/replay/ReplayDevtools.tsx +42 -19
- package/src/replay/ReplayPlayer.tsx +60 -11
- package/src/replay/devtools.ts +8 -2
- package/src/replay/index.ts +2 -0
- package/src/replay/inspections.ts +105 -0
- package/src/styles.css +11 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.js","sourceRoot":"","sources":["../../src/replay/devtools.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"devtools.js","sourceRoot":"","sources":["../../src/replay/devtools.ts"],"names":[],"mappings":"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"}
|
package/dist/replay/index.d.ts
CHANGED
|
@@ -7,6 +7,8 @@ export type { ReplayMarker, ReplayMarkerKind, ReplayMeta, ReplayPointerPoint, Re
|
|
|
7
7
|
export { getReplayDevtools, replayDevtoolsAt, requestName } from './devtools.js';
|
|
8
8
|
export type { ReplayConsoleEntry, ReplayConsoleLevel, ReplayDevtools, ReplayDevtoolsState, ReplayRequest } from './devtools.js';
|
|
9
9
|
export type { ReplayDevtoolsTab } from './ReplayDevtools.js';
|
|
10
|
+
export { getReplayInspections, replayInspectionAt, resolveReplayInspections } from './inspections.js';
|
|
11
|
+
export type { ReplayInspection, ReplayInspectionTab, ResolvedReplayInspection } from './inspections.js';
|
|
10
12
|
export { ReplayEventType, ReplayIncrementalSource, ReplayMouseInteraction } from './types.js';
|
|
11
13
|
export type { ReplayEvent } from './types.js';
|
|
12
14
|
export { isReplayQaUrl, normalizeReplayEmbedUrl } from './url.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/replay/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACpG,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9E,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC7H,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAC3F,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/replay/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAC/E,YAAY,EACV,YAAY,EACZ,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,mBAAmB,EACnB,wBAAwB,EACxB,mBAAmB,EACnB,kBAAkB,EAClB,wBAAwB,EACxB,YAAY,GACb,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAChE,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC5F,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACpG,YAAY,EAAE,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAC;AACpH,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9E,YAAY,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC7H,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACnG,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACrG,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAC3F,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/replay/index.js
CHANGED
|
@@ -2,6 +2,7 @@ export { ReplayEmbed, ReplayPreview, formatReplayTime } from './ReplayPreview.js
|
|
|
2
2
|
export { ReplayStage, preloadReplayStage } from './ReplayStage.js';
|
|
3
3
|
export { getReplayMarkers, getReplayMeta, getReplayPointerTrack, replayPointerAt } from './markers.js';
|
|
4
4
|
export { getReplayDevtools, replayDevtoolsAt, requestName } from './devtools.js';
|
|
5
|
+
export { getReplayInspections, replayInspectionAt, resolveReplayInspections } from './inspections.js';
|
|
5
6
|
export { ReplayEventType, ReplayIncrementalSource, ReplayMouseInteraction } from './types.js';
|
|
6
7
|
export { isReplayQaUrl, normalizeReplayEmbedUrl } from './url.js';
|
|
7
8
|
export { ReplayFile, isRrwebUrl } from './ReplayFile.js';
|
package/dist/replay/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/replay/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAa/E,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEpG,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9E,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAE3F,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/replay/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAa/E,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEpG,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9E,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAEnG,OAAO,EAAE,eAAe,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAE3F,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,OAAO,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { ReplayDevtools } from './devtools.js';
|
|
2
|
+
import { type ReplayEvent } from './types.js';
|
|
3
|
+
export type ReplayInspectionTab = 'network' | 'console';
|
|
4
|
+
export interface ReplayInspection {
|
|
5
|
+
/** Stable id; defaults to `inspect-<n>`. */
|
|
6
|
+
id?: string;
|
|
7
|
+
/** Milliseconds from the start of the recording. */
|
|
8
|
+
time: number;
|
|
9
|
+
/** The DevTools tab to open (default: `network` when `request` is set, else `console`). */
|
|
10
|
+
tab?: ReplayInspectionTab;
|
|
11
|
+
/** The request to select: the recording's id for it (`key`), or its URL. */
|
|
12
|
+
request?: string;
|
|
13
|
+
/** The console message to select: the recording's id for it (`key`), or text it contains. */
|
|
14
|
+
message?: string;
|
|
15
|
+
/** What was found, shown above the panel while the inspection is current. */
|
|
16
|
+
label?: string;
|
|
17
|
+
}
|
|
18
|
+
/** An inspection with its defaults filled in and its target resolved against the recording's DevTools. */
|
|
19
|
+
export interface ResolvedReplayInspection {
|
|
20
|
+
id: string;
|
|
21
|
+
time: number;
|
|
22
|
+
tab: ReplayInspectionTab;
|
|
23
|
+
label?: string;
|
|
24
|
+
/** The `ReplayRequest.id` to select, when the target was found. */
|
|
25
|
+
requestId?: string;
|
|
26
|
+
/** The `ReplayConsoleEntry.id` to select, when the target was found. */
|
|
27
|
+
messageId?: string;
|
|
28
|
+
}
|
|
29
|
+
export declare const INSPECT_TAG = "inspect";
|
|
30
|
+
/** The `inspect` custom events in a recording, as inspections (times in ms from its first event). */
|
|
31
|
+
export declare function getReplayInspections(events: readonly ReplayEvent[]): ReplayInspection[];
|
|
32
|
+
/** Fills in each inspection's id and tab and finds its request or message; sorted by time. */
|
|
33
|
+
export declare function resolveReplayInspections(inspections: readonly ReplayInspection[], tools: ReplayDevtools): ResolvedReplayInspection[];
|
|
34
|
+
/** The inspection current at `time`: the latest at or before it. */
|
|
35
|
+
export declare function replayInspectionAt(inspections: readonly ResolvedReplayInspection[], time: number): ResolvedReplayInspection | undefined;
|
|
36
|
+
//# sourceMappingURL=inspections.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspections.d.ts","sourceRoot":"","sources":["../../src/replay/inspections.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAsB,cAAc,EAAiB,MAAM,YAAY,CAAA;AACnF,OAAO,EAAmB,KAAK,WAAW,EAAE,MAAM,SAAS,CAAA;AAE3D,MAAM,MAAM,mBAAmB,GAAG,SAAS,GAAG,SAAS,CAAA;AAEvD,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAA;IACZ,2FAA2F;IAC3F,GAAG,CAAC,EAAE,mBAAmB,CAAA;IACzB,4EAA4E;IAC5E,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6FAA6F;IAC7F,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,0GAA0G;AAC1G,MAAM,WAAW,wBAAwB;IACvC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,mBAAmB,CAAA;IACxB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mEAAmE;IACnE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wEAAwE;IACxE,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,eAAO,MAAM,WAAW,YAAY,CAAA;AAIpC,qGAAqG;AACrG,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,GAAG,gBAAgB,EAAE,CAavF;AAkBD,8FAA8F;AAC9F,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,EAAE,KAAK,EAAE,cAAc,GAAG,wBAAwB,EAAE,CAepI;AAED,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,SAAS,wBAAwB,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS,CAOvI"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { ReplayEventType } from './types.js';
|
|
2
|
+
export const INSPECT_TAG = 'inspect';
|
|
3
|
+
const str = (value) => (typeof value === 'string' && value ? value : undefined);
|
|
4
|
+
/** The `inspect` custom events in a recording, as inspections (times in ms from its first event). */
|
|
5
|
+
export function getReplayInspections(events) {
|
|
6
|
+
const list = [...events].sort((a, b) => a.timestamp - b.timestamp);
|
|
7
|
+
const start = list[0]?.timestamp ?? 0;
|
|
8
|
+
const out = [];
|
|
9
|
+
for (const event of list) {
|
|
10
|
+
if (event.type !== ReplayEventType.Custom)
|
|
11
|
+
continue;
|
|
12
|
+
const data = (event.data ?? {});
|
|
13
|
+
if (data.tag !== INSPECT_TAG)
|
|
14
|
+
continue;
|
|
15
|
+
const p = data.payload ?? {};
|
|
16
|
+
const tab = p.tab === 'network' || p.tab === 'console' ? p.tab : undefined;
|
|
17
|
+
out.push({ id: str(p.id), time: event.timestamp - start, tab, request: str(p.request), message: str(p.message), label: str(p.label) });
|
|
18
|
+
}
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
function findRequest(network, target, time) {
|
|
22
|
+
const byKey = network.find((r) => r.key === target);
|
|
23
|
+
if (byKey)
|
|
24
|
+
return byKey;
|
|
25
|
+
// By URL (exact, else the address without its origin): the one sent nearest the inspection.
|
|
26
|
+
const matches = network.filter((r) => r.url === target || r.url.replace(/^\w+:\/\/[^/]+/, '') === target);
|
|
27
|
+
return matches.sort((a, b) => Math.abs(a.time - time) - Math.abs(b.time - time))[0];
|
|
28
|
+
}
|
|
29
|
+
function findMessage(messages, target, time) {
|
|
30
|
+
const byKey = messages.find((m) => m.key === target);
|
|
31
|
+
if (byKey)
|
|
32
|
+
return byKey;
|
|
33
|
+
const matches = messages.filter((m) => m.message.includes(target));
|
|
34
|
+
// The last one logged by the inspection, else the first after it.
|
|
35
|
+
return matches.filter((m) => m.time <= time).at(-1) ?? matches[0];
|
|
36
|
+
}
|
|
37
|
+
/** Fills in each inspection's id and tab and finds its request or message; sorted by time. */
|
|
38
|
+
export function resolveReplayInspections(inspections, tools) {
|
|
39
|
+
return inspections
|
|
40
|
+
.map((inspection, i) => {
|
|
41
|
+
const request = inspection.request ? findRequest(tools.network, inspection.request, inspection.time) : undefined;
|
|
42
|
+
const message = inspection.message ? findMessage(tools.console, inspection.message, inspection.time) : undefined;
|
|
43
|
+
return {
|
|
44
|
+
id: inspection.id ?? `inspect-${i}`,
|
|
45
|
+
time: Math.max(0, inspection.time),
|
|
46
|
+
tab: inspection.tab ?? (inspection.request ? 'network' : 'console'),
|
|
47
|
+
label: inspection.label,
|
|
48
|
+
requestId: request?.id,
|
|
49
|
+
messageId: message?.id,
|
|
50
|
+
};
|
|
51
|
+
})
|
|
52
|
+
.sort((a, b) => a.time - b.time);
|
|
53
|
+
}
|
|
54
|
+
/** The inspection current at `time`: the latest at or before it. */
|
|
55
|
+
export function replayInspectionAt(inspections, time) {
|
|
56
|
+
let current;
|
|
57
|
+
for (const inspection of inspections) {
|
|
58
|
+
if (inspection.time > time)
|
|
59
|
+
break;
|
|
60
|
+
current = inspection;
|
|
61
|
+
}
|
|
62
|
+
return current;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=inspections.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inspections.js","sourceRoot":"","sources":["../../src/replay/inspections.ts"],"names":[],"mappings":"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"}
|
package/dist/styles.css
CHANGED
|
@@ -4601,19 +4601,17 @@
|
|
|
4601
4601
|
box-shadow: inset 0 0 0 2px var(--ring, #6366f1);
|
|
4602
4602
|
}
|
|
4603
4603
|
|
|
4604
|
-
|
|
4605
|
-
|
|
4606
|
-
align-items: center;
|
|
4607
|
-
margin-inline-start: auto;
|
|
4608
|
-
padding-inline: 8px;
|
|
4609
|
-
color: var(--replay-devtools-dim);
|
|
4610
|
-
font-variant-numeric: tabular-nums;
|
|
4611
|
-
}
|
|
4604
|
+
|
|
4605
|
+
|
|
4612
4606
|
|
|
4613
4607
|
:where([data-slot="replay-devtools-tabs"] > [data-slot="replay-devtools-close"], [data-slot="replay-devtools-detail-tabs"] > [data-slot="replay-devtools-close"]) {
|
|
4614
4608
|
padding: 0 8px;
|
|
4615
4609
|
}
|
|
4616
4610
|
|
|
4611
|
+
:where([data-slot="replay-devtools-tabs"] > [data-slot="replay-devtools-close"]) {
|
|
4612
|
+
margin-inline-start: auto;
|
|
4613
|
+
}
|
|
4614
|
+
|
|
4617
4615
|
:where([data-slot="replay-devtools-pane"]) {
|
|
4618
4616
|
display: flex;
|
|
4619
4617
|
flex: 1 1 0%;
|
|
@@ -4882,6 +4880,11 @@
|
|
|
4882
4880
|
:where([data-slot="replay-devtools-table"] tbody tr:focus-visible) {
|
|
4883
4881
|
box-shadow: inset 0 0 0 2px var(--ring, #6366f1);
|
|
4884
4882
|
}
|
|
4883
|
+
/* The inspected request or message: a bar down its leading edge (the selection tint shows it's open). */
|
|
4884
|
+
:where([data-slot="replay-devtools-table"] tbody tr[data-inspected], [data-slot="replay-devtools-message"][data-inspected]) {
|
|
4885
|
+
box-shadow: inset 3px 0 0 var(--primary, #2563eb);
|
|
4886
|
+
}
|
|
4887
|
+
|
|
4885
4888
|
|
|
4886
4889
|
:where([data-slot="replay-devtools-table"] tr[data-failed]) {
|
|
4887
4890
|
color: var(--replay-devtools-red);
|
package/package.json
CHANGED
|
@@ -5,10 +5,12 @@
|
|
|
5
5
|
waiting at the playhead shows as pending), and a request's row opens its headers, payload and response.
|
|
6
6
|
|
|
7
7
|
Everything is a function of the playhead: scrub back and the lists shrink to what DevTools showed then. A row's
|
|
8
|
-
time jumps the player there. Esc closes the panel.
|
|
8
|
+
time jumps the player there. Esc closes the panel. An inspection (inspections.ts) selects its request or
|
|
9
|
+
message and marks it. Plain React + plain CSS, like the player. */
|
|
9
10
|
import { useEffect, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type PointerEvent as ReactPointerEvent } from 'react'
|
|
10
11
|
import { ChevronRight, CircleX, Info, Network, SquareTerminal, TriangleAlert, X } from 'lucide-react'
|
|
11
12
|
import type { ReplayConsoleEntry, ReplayDevtoolsState, ReplayRequest } from './devtools'
|
|
13
|
+
import type { ResolvedReplayInspection } from './inspections'
|
|
12
14
|
|
|
13
15
|
export type ReplayDevtoolsTab = 'console' | 'network'
|
|
14
16
|
|
|
@@ -55,14 +57,16 @@ export function DevtoolsButtons({ state, open, onOpen }: {
|
|
|
55
57
|
)
|
|
56
58
|
}
|
|
57
59
|
|
|
58
|
-
/** The panel over the page: Console and Network, cut at the playhead.
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
60
|
+
/** The panel over the page: Console and Network, cut at the playhead. `inspection` selects and marks its target;
|
|
61
|
+
* `autoFocus` (default true) moves focus into the panel as it opens — off when an inspection opened it mid-play. */
|
|
62
|
+
export function DevtoolsPanel({ state, tab, onTab, onClose, onSeek, inspection, autoFocus = true }: {
|
|
63
|
+
state: ReplayDevtoolsState; tab: ReplayDevtoolsTab; onTab: (tab: ReplayDevtoolsTab) => void
|
|
64
|
+
onClose: () => void; onSeek: (ms: number) => void; inspection?: ResolvedReplayInspection | null; autoFocus?: boolean
|
|
62
65
|
}) {
|
|
63
66
|
const panel = useRef<HTMLDivElement>(null)
|
|
64
|
-
|
|
65
|
-
|
|
67
|
+
// Opened by an inspection, the panel starts taller: its point is the request's details.
|
|
68
|
+
const [height, setHeight] = useState(inspection ? 72 : 58)
|
|
69
|
+
useEffect(() => { if (autoFocus) panel.current?.focus({ preventScroll: true }) }, [autoFocus])
|
|
66
70
|
|
|
67
71
|
// Drag the top edge to resize, as a fraction of the stage.
|
|
68
72
|
const resize = (e: ReactPointerEvent<HTMLDivElement>) => {
|
|
@@ -116,10 +120,11 @@ export function DevtoolsPanel({ state, at, tab, onTab, onClose, onSeek }: {
|
|
|
116
120
|
</button>
|
|
117
121
|
))}
|
|
118
122
|
</div>
|
|
119
|
-
<span data-part="at">As of {time(at)}</span>
|
|
120
123
|
<button type="button" data-slot="replay-devtools-close" aria-label="Close DevTools" onClick={onClose}><X size={14} /></button>
|
|
121
124
|
</div>
|
|
122
|
-
{tab === 'console'
|
|
125
|
+
{tab === 'console'
|
|
126
|
+
? <ConsolePane state={state} onSeek={onSeek} inspected={inspection?.tab === 'console' ? inspection : null} />
|
|
127
|
+
: <NetworkPane state={state} onSeek={onSeek} inspected={inspection?.tab === 'network' ? inspection : null} />}
|
|
123
128
|
</div>
|
|
124
129
|
)
|
|
125
130
|
}
|
|
@@ -129,7 +134,9 @@ export function DevtoolsPanel({ state, at, tab, onTab, onClose, onSeek }: {
|
|
|
129
134
|
type LevelFilter = 'all' | 'error' | 'warn' | 'info'
|
|
130
135
|
const LEVEL_ICON = { error: CircleX, warn: TriangleAlert, info: Info } as const
|
|
131
136
|
|
|
132
|
-
function ConsolePane({ state, onSeek }: {
|
|
137
|
+
function ConsolePane({ state, onSeek, inspected }: {
|
|
138
|
+
state: ReplayDevtoolsState; onSeek: (ms: number) => void; inspected: ResolvedReplayInspection | null
|
|
139
|
+
}) {
|
|
133
140
|
const [query, setQuery] = useState('')
|
|
134
141
|
const [level, setLevel] = useState<LevelFilter>('all')
|
|
135
142
|
const list = useRef<HTMLDivElement>(null)
|
|
@@ -139,12 +146,17 @@ function ConsolePane({ state, onSeek }: { state: ReplayDevtoolsState; onSeek: (m
|
|
|
139
146
|
(level === 'all' || (level === 'info' ? e.level === 'info' || e.level === 'log' || e.level === 'debug' : e.level === level)) &&
|
|
140
147
|
(!q || e.message.toLowerCase().includes(q)))
|
|
141
148
|
}, [state.console, query, level])
|
|
142
|
-
// Follow new messages as they're logged, unless you've scrolled up to read.
|
|
149
|
+
// Follow new messages as they're logged, unless you've scrolled up to read (or an inspection is showing one).
|
|
143
150
|
const pinned = useRef(true)
|
|
151
|
+
const inspectedId = inspected?.messageId
|
|
152
|
+
const shown = inspectedId !== undefined && rows.some((r) => r.id === inspectedId)
|
|
144
153
|
useEffect(() => {
|
|
145
154
|
const el = list.current
|
|
146
|
-
if (el && pinned.current) el.scrollTop = el.scrollHeight
|
|
147
|
-
}, [rows.length])
|
|
155
|
+
if (el && pinned.current && !shown) el.scrollTop = el.scrollHeight
|
|
156
|
+
}, [rows.length, shown])
|
|
157
|
+
useEffect(() => {
|
|
158
|
+
if (shown) list.current?.querySelector('[data-inspected]')?.scrollIntoView?.({ block: 'nearest' })
|
|
159
|
+
}, [shown, inspected?.id])
|
|
148
160
|
return (
|
|
149
161
|
<div data-slot="replay-devtools-pane" data-pane="console">
|
|
150
162
|
<div data-slot="replay-devtools-toolbar">
|
|
@@ -167,7 +179,7 @@ function ConsolePane({ state, onSeek }: { state: ReplayDevtoolsState; onSeek: (m
|
|
|
167
179
|
aria-label="Console messages"
|
|
168
180
|
onScroll={(e) => { const el = e.currentTarget; pinned.current = el.scrollHeight - el.scrollTop - el.clientHeight < 8 }}
|
|
169
181
|
>
|
|
170
|
-
{rows.map((entry) => <ConsoleRow key={entry.id} entry={entry} onSeek={onSeek} />)}
|
|
182
|
+
{rows.map((entry) => <ConsoleRow key={entry.id} entry={entry} onSeek={onSeek} inspected={entry.id === inspectedId} />)}
|
|
171
183
|
{!rows.length ? <p data-slot="replay-devtools-empty">{state.console.length ? 'No messages match the filter' : 'Nothing logged yet'}</p> : null}
|
|
172
184
|
{state.counts.laterMessages ? <p data-slot="replay-devtools-later">{state.counts.laterMessages} more later in the recording</p> : null}
|
|
173
185
|
</div>
|
|
@@ -175,7 +187,7 @@ function ConsolePane({ state, onSeek }: { state: ReplayDevtoolsState; onSeek: (m
|
|
|
175
187
|
)
|
|
176
188
|
}
|
|
177
189
|
|
|
178
|
-
function ConsoleRow({ entry, onSeek }: { entry: ReplayConsoleEntry; onSeek: (ms: number) => void }) {
|
|
190
|
+
function ConsoleRow({ entry, onSeek, inspected }: { entry: ReplayConsoleEntry; onSeek: (ms: number) => void; inspected: boolean }) {
|
|
179
191
|
const Glyph = entry.level === 'error' || entry.level === 'warn' || entry.level === 'info' ? LEVEL_ICON[entry.level] : null
|
|
180
192
|
const body = (
|
|
181
193
|
<>
|
|
@@ -184,7 +196,7 @@ function ConsoleRow({ entry, onSeek }: { entry: ReplayConsoleEntry; onSeek: (ms:
|
|
|
184
196
|
</>
|
|
185
197
|
)
|
|
186
198
|
return (
|
|
187
|
-
<div data-slot="replay-devtools-message" data-level={entry.level}>
|
|
199
|
+
<div data-slot="replay-devtools-message" data-level={entry.level} data-inspected={inspected || undefined}>
|
|
188
200
|
{entry.trace?.length ? (
|
|
189
201
|
<details>
|
|
190
202
|
<summary>{body}</summary>
|
|
@@ -203,10 +215,20 @@ type Row = ReplayRequest & { pending: boolean }
|
|
|
203
215
|
|
|
204
216
|
const statusText = (r: Row) => (r.pending ? '(pending)' : r.status === undefined ? (r.failed ? '(failed)' : '—') : r.status === 0 ? '(failed)' : String(r.status))
|
|
205
217
|
|
|
206
|
-
function NetworkPane({ state, onSeek }: {
|
|
218
|
+
function NetworkPane({ state, onSeek, inspected }: {
|
|
219
|
+
state: ReplayDevtoolsState; onSeek: (ms: number) => void; inspected: ResolvedReplayInspection | null
|
|
220
|
+
}) {
|
|
207
221
|
const [query, setQuery] = useState('')
|
|
208
222
|
const [filter, setFilter] = useState<RequestFilter>('all')
|
|
209
|
-
const
|
|
223
|
+
const inspectedId = inspected?.requestId
|
|
224
|
+
const [selectedId, setSelectedId] = useState<string | null>(inspectedId ?? null)
|
|
225
|
+
const table = useRef<HTMLDivElement>(null)
|
|
226
|
+
// A new inspection selects its request (once it has been sent) and brings its row into view.
|
|
227
|
+
useEffect(() => { if (inspectedId) setSelectedId(inspectedId) }, [inspected?.id, inspectedId])
|
|
228
|
+
const sent = inspectedId !== undefined && state.network.some((r) => r.id === inspectedId)
|
|
229
|
+
useEffect(() => {
|
|
230
|
+
if (sent) table.current?.querySelector('[data-inspected]')?.scrollIntoView?.({ block: 'nearest' })
|
|
231
|
+
}, [sent, inspected?.id])
|
|
210
232
|
const rows = useMemo(() => {
|
|
211
233
|
const q = query.trim().toLowerCase()
|
|
212
234
|
return state.network.filter((r) =>
|
|
@@ -235,7 +257,7 @@ function NetworkPane({ state, onSeek }: { state: ReplayDevtoolsState; onSeek: (m
|
|
|
235
257
|
</div>
|
|
236
258
|
</div>
|
|
237
259
|
<div data-slot="replay-devtools-network">
|
|
238
|
-
<div data-slot="replay-devtools-table-wrap">
|
|
260
|
+
<div ref={table} data-slot="replay-devtools-table-wrap">
|
|
239
261
|
<table data-slot="replay-devtools-table">
|
|
240
262
|
<thead>
|
|
241
263
|
<tr>
|
|
@@ -251,6 +273,7 @@ function NetworkPane({ state, onSeek }: { state: ReplayDevtoolsState; onSeek: (m
|
|
|
251
273
|
data-failed={(r.failed && !r.pending) || undefined}
|
|
252
274
|
data-pending={r.pending || undefined}
|
|
253
275
|
aria-selected={r.id === selectedId}
|
|
276
|
+
data-inspected={r.id === inspectedId || undefined}
|
|
254
277
|
tabIndex={0}
|
|
255
278
|
onClick={() => setSelectedId(r.id === selectedId ? null : r.id)}
|
|
256
279
|
onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); setSelectedId(r.id === selectedId ? null : r.id) } }}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
plays the recording (rrweb loads lazily, on first render); this adds the chrome around it: a URL bar that
|
|
3
3
|
follows the recording's navigations, play/pause, a scrubber with the recording's moments on a rail above
|
|
4
4
|
it, a speed control, fullscreen, a drawn cursor whose clicks ripple, and DevTools: Console and Network buttons
|
|
5
|
-
in the top bar with what had been logged and requested by the playhead, which open a DevTools panel over the page
|
|
5
|
+
in the top bar with what had been logged and requested by the playhead, which open a DevTools panel over the page,
|
|
6
|
+
and inspections (inspections.ts) that open it on a request or message as playback reaches them. Until the player is ready a
|
|
6
7
|
poster (a page-shaped skeleton by default) holds the frame's exact size, so nothing jumps.
|
|
7
8
|
|
|
8
9
|
Plain React + plain CSS (`@layer docstream.replay` in styles.css, `[data-slot]` hooks). Keys (focus inside
|
|
@@ -18,6 +19,7 @@ import { Lock, Maximize, Minimize, Pause, Play, RotateCcw } from 'lucide-react'
|
|
|
18
19
|
import { ReplayStage } from './ReplayStage'
|
|
19
20
|
import { DevtoolsButtons, DevtoolsPanel, type ReplayDevtoolsTab } from './ReplayDevtools'
|
|
20
21
|
import { getReplayDevtools, replayDevtoolsAt } from './devtools'
|
|
22
|
+
import { getReplayInspections, replayInspectionAt, resolveReplayInspections, type ReplayInspection } from './inspections'
|
|
21
23
|
import { getReplayMarkers, getReplayMeta, getReplayPointerTrack, replayPointerAt } from './markers'
|
|
22
24
|
import type { ReplayMarker, ReplayMarkerKind, ReplayPointerTrack } from './markers'
|
|
23
25
|
import type { ReplayStageHandle } from './stage-types'
|
|
@@ -36,6 +38,8 @@ export interface ReplayPreviewHandle {
|
|
|
36
38
|
seek(ms: number): void
|
|
37
39
|
toggle(): void
|
|
38
40
|
getCurrentTime(): number
|
|
41
|
+
/** Jump to an inspection (by its id) and open DevTools on what it found. */
|
|
42
|
+
inspect(id: string): void
|
|
39
43
|
}
|
|
40
44
|
|
|
41
45
|
/** Options shared by every `ReplayPreview` (an `events` player or a `source` embed). */
|
|
@@ -63,11 +67,17 @@ export interface ReplayPlayerOptions {
|
|
|
63
67
|
/** Which recorded marker kinds to show (default all). */
|
|
64
68
|
markerKinds?: ReplayMarkerKind[]
|
|
65
69
|
/** Console and Network buttons (in the top bar, or beside the controls without the browser chrome) that open a
|
|
66
|
-
* DevTools panel cut at the playhead
|
|
67
|
-
*
|
|
70
|
+
* DevTools panel cut at the playhead, shown when the recording has console messages, requests or inspections.
|
|
71
|
+
* `disableDevtools` removes them, the panel and the inspections. */
|
|
72
|
+
disableDevtools?: boolean
|
|
73
|
+
/** @deprecated Use `disableDevtools`. `false` is the same as `disableDevtools`. */
|
|
68
74
|
devtools?: boolean
|
|
69
75
|
/** Open the DevTools panel on this tab at mount. */
|
|
70
76
|
defaultDevtoolsTab?: ReplayDevtoolsTab
|
|
77
|
+
/** Moments where a request or console message was inspected. As playback reaches one, DevTools opens on its
|
|
78
|
+
* tab with that request or message selected and the label above it; playback doesn't stop. Added to the
|
|
79
|
+
* recording's own `inspect` custom events, and to the rail as checkpoints. */
|
|
80
|
+
inspections?: ReplayInspection[]
|
|
71
81
|
/** Draw the recorded pointer and click ripples (default true). */
|
|
72
82
|
cursor?: boolean
|
|
73
83
|
/** `width` (default): the page scales to the frame's width and sets its height. `contain`: fill the frame's
|
|
@@ -98,7 +108,7 @@ const MARKER_NOUN: Record<ReplayMarkerKind, string> = {
|
|
|
98
108
|
export function ReplayPlayer({
|
|
99
109
|
events, url, title = 'Session replay', chrome = 'browser', trafficLights = true, controls = true,
|
|
100
110
|
autoplay = false, loop = false, initialTime = 0, speeds = DEFAULT_PLAYER_SPEEDS, markers = true, markerKinds,
|
|
101
|
-
cursor = true, devtools = true, defaultDevtoolsTab, fit = 'width', poster, lazy = true, playerRef, onTimeUpdate, onPlayingChange, onMarkerPress,
|
|
111
|
+
cursor = true, disableDevtools = false, devtools = true, defaultDevtoolsTab, inspections, fit = 'width', poster, lazy = true, playerRef, onTimeUpdate, onPlayingChange, onMarkerPress,
|
|
102
112
|
className, style,
|
|
103
113
|
}: ReplayPlayerOptions & { events: ReplayEvent[] }) {
|
|
104
114
|
const rootRef = useRef<HTMLDivElement>(null)
|
|
@@ -107,14 +117,26 @@ export function ReplayPlayer({
|
|
|
107
117
|
const meta = useMemo(() => getReplayMeta(events), [events])
|
|
108
118
|
const track = useMemo(() => getReplayPointerTrack(events), [events])
|
|
109
119
|
const recorded = useMemo(() => getReplayMarkers(events), [events])
|
|
110
|
-
const shown = useMemo(() => {
|
|
111
|
-
const list = Array.isArray(markers) ? markers : markers ? recorded : []
|
|
112
|
-
return markerKinds ? list.filter((m) => markerKinds.includes(m.kind)) : list
|
|
113
|
-
}, [markers, recorded, markerKinds])
|
|
114
120
|
|
|
121
|
+
const toolsOn = devtools && !disableDevtools
|
|
115
122
|
const tools = useMemo(() => getReplayDevtools(events), [events])
|
|
116
|
-
const
|
|
123
|
+
const resolved = useMemo(
|
|
124
|
+
() => (toolsOn ? resolveReplayInspections([...getReplayInspections(events), ...(inspections ?? [])], tools) : []),
|
|
125
|
+
[toolsOn, events, inspections, tools],
|
|
126
|
+
)
|
|
127
|
+
const showTools = toolsOn && (tools.console.length > 0 || tools.network.length > 0 || resolved.length > 0)
|
|
117
128
|
const [panel, setPanel] = useState<ReplayDevtoolsTab | null>(defaultDevtoolsTab ?? null)
|
|
129
|
+
// Whether an inspection (rather than a press) opened the panel: it then leaves focus where it was.
|
|
130
|
+
const [autoOpened, setAutoOpened] = useState(false)
|
|
131
|
+
|
|
132
|
+
const shown = useMemo(() => {
|
|
133
|
+
// Inspections from the prop join the rail as checkpoints (the recording's own are already among `recorded`).
|
|
134
|
+
const own: ReplayMarker[] = toolsOn ? (inspections ?? []).map((inspection, i) => ({
|
|
135
|
+
id: `inspection-${i}`, kind: 'custom', time: Math.max(0, inspection.time), label: inspection.label ?? 'Inspected',
|
|
136
|
+
})) : []
|
|
137
|
+
const list = Array.isArray(markers) ? markers : markers ? [...recorded, ...own].sort((a, b) => a.time - b.time) : []
|
|
138
|
+
return markerKinds ? list.filter((m) => markerKinds.includes(m.kind)) : list
|
|
139
|
+
}, [markers, recorded, markerKinds, inspections, toolsOn])
|
|
118
140
|
|
|
119
141
|
const [visible, setVisible] = useState(!lazy)
|
|
120
142
|
const [ready, setReady] = useState(false)
|
|
@@ -151,12 +173,22 @@ export function ReplayPlayer({
|
|
|
151
173
|
return () => clearTimeout(timer)
|
|
152
174
|
}, [ready, reduced])
|
|
153
175
|
|
|
176
|
+
const resolvedRef = useRef(resolved)
|
|
177
|
+
resolvedRef.current = resolved
|
|
154
178
|
const handle = useMemo<ReplayPreviewHandle>(() => ({
|
|
155
179
|
play: (offset) => { setFinished(false); stage.current?.play(offset) },
|
|
156
180
|
pause: (offset) => stage.current?.pause(offset),
|
|
157
181
|
seek: (ms) => { setFinished(false); stage.current?.seek(ms) },
|
|
158
182
|
toggle: () => { setFinished(false); stage.current?.toggle() },
|
|
159
183
|
getCurrentTime: () => stage.current?.getCurrentTime() ?? 0,
|
|
184
|
+
inspect: (id) => {
|
|
185
|
+
const inspection = resolvedRef.current.find((x) => x.id === id)
|
|
186
|
+
if (!inspection) return
|
|
187
|
+
setFinished(false)
|
|
188
|
+
stage.current?.seek(inspection.time)
|
|
189
|
+
setPanel(inspection.tab)
|
|
190
|
+
setAutoOpened(false)
|
|
191
|
+
},
|
|
160
192
|
}), [])
|
|
161
193
|
useImperativeHandle(playerRef, () => handle, [handle])
|
|
162
194
|
|
|
@@ -209,7 +241,23 @@ export function ReplayPlayer({
|
|
|
209
241
|
}, [url, meta.href, recorded, time])
|
|
210
242
|
|
|
211
243
|
const toolsState = useMemo(() => replayDevtoolsAt(tools, time), [tools, time])
|
|
212
|
-
const openTools = (tab: ReplayDevtoolsTab) => setPanel((p) => (p === tab ? null : tab))
|
|
244
|
+
const openTools = (tab: ReplayDevtoolsTab) => { setAutoOpened(false); setPanel((p) => (p === tab ? null : tab)) }
|
|
245
|
+
|
|
246
|
+
// Inspect mode: the inspection at the playhead opens DevTools on what it found. Only a change of inspection does
|
|
247
|
+
// (closing the panel keeps it closed until the next one); scrubbing back before the first closes what it opened.
|
|
248
|
+
const inspection = showTools ? replayInspectionAt(resolved, time) : undefined
|
|
249
|
+
const inspectionId = inspection?.id
|
|
250
|
+
const inspectionTab = inspection?.tab
|
|
251
|
+
const lastInspection = useRef<string | undefined>(undefined)
|
|
252
|
+
useEffect(() => {
|
|
253
|
+
if (inspectionId === lastInspection.current) return
|
|
254
|
+
const had = lastInspection.current
|
|
255
|
+
lastInspection.current = inspectionId
|
|
256
|
+
if (inspectionTab) {
|
|
257
|
+
setPanel(inspectionTab)
|
|
258
|
+
setAutoOpened(true)
|
|
259
|
+
} else if (had !== undefined && autoOpened) setPanel(null)
|
|
260
|
+
}, [inspectionId, inspectionTab, autoOpened])
|
|
213
261
|
const toolButtons = showTools ? <DevtoolsButtons state={toolsState} open={panel} onOpen={openTools} /> : null
|
|
214
262
|
|
|
215
263
|
const w = meta.width || 1280
|
|
@@ -269,11 +317,12 @@ export function ReplayPlayer({
|
|
|
269
317
|
{showTools && panel ? (
|
|
270
318
|
<DevtoolsPanel
|
|
271
319
|
state={toolsState}
|
|
272
|
-
at={time}
|
|
273
320
|
tab={panel}
|
|
274
321
|
onTab={setPanel}
|
|
275
322
|
onClose={() => { setPanel(null); rootRef.current?.focus({ preventScroll: true }) }}
|
|
276
323
|
onSeek={(ms) => handle.seek(ms)}
|
|
324
|
+
inspection={inspection}
|
|
325
|
+
autoFocus={!autoOpened}
|
|
277
326
|
/>
|
|
278
327
|
) : null}
|
|
279
328
|
|
package/src/replay/devtools.ts
CHANGED
|
@@ -17,6 +17,8 @@ export type ReplayConsoleLevel = 'log' | 'info' | 'warn' | 'error' | 'debug'
|
|
|
17
17
|
export interface ReplayConsoleEntry {
|
|
18
18
|
/** Stable id (`console-<n>`). */
|
|
19
19
|
id: string
|
|
20
|
+
/** The recording's own id for the message (`payload.id` of a custom event), which an inspection can name. */
|
|
21
|
+
key?: string
|
|
20
22
|
/** Milliseconds from the start of the recording. */
|
|
21
23
|
time: number
|
|
22
24
|
level: ReplayConsoleLevel
|
|
@@ -33,6 +35,9 @@ export interface ReplayConsoleEntry {
|
|
|
33
35
|
export interface ReplayRequest {
|
|
34
36
|
/** Stable id (`request-<n>`). */
|
|
35
37
|
id: string
|
|
38
|
+
/** The recording's own id for the request (`id` / `requestId`, e.g. a Replay request id), which an
|
|
39
|
+
* inspection can name. */
|
|
40
|
+
key?: string
|
|
36
41
|
/** When the request was sent, in ms from the start of the recording. */
|
|
37
42
|
time: number
|
|
38
43
|
/** How long it took, when known: the response arrived at `time + duration`. */
|
|
@@ -153,6 +158,7 @@ export function getReplayDevtools(events: readonly ReplayEvent[]): ReplayDevtool
|
|
|
153
158
|
// request was sent that far before it (its own duration, for a lone request).
|
|
154
159
|
const sent = Math.max(0, startTime !== undefined && batchEnd !== undefined ? at - (batchEnd - startTime) : at - (duration ?? 0))
|
|
155
160
|
requests.push({
|
|
161
|
+
key: str(raw.requestId) ?? str(raw.id),
|
|
156
162
|
time: sent,
|
|
157
163
|
duration,
|
|
158
164
|
method: (str(raw.method) ?? 'GET').toUpperCase(),
|
|
@@ -197,10 +203,10 @@ export function getReplayDevtools(events: readonly ReplayEvent[]): ReplayDevtool
|
|
|
197
203
|
const detail = str(payload.message) ?? str(payload.detail)
|
|
198
204
|
const message = detail ? `Uncaught ${label}: ${detail}` : `Uncaught ${label}`
|
|
199
205
|
const trace = Array.isArray(payload.stack) ? payload.stack.map(String) : str(payload.stack)?.split('\n').map((l) => l.trim()).filter(Boolean)
|
|
200
|
-
consoleEntries.push({ time, level: 'error', message, args: [message], trace: trace?.length ? trace : undefined, source: 'exception' })
|
|
206
|
+
consoleEntries.push({ key: str(payload.id), time, level: 'error', message, args: [message], trace: trace?.length ? trace : undefined, source: 'exception' })
|
|
201
207
|
} else if (CONSOLE_TAGS.has(tag)) {
|
|
202
208
|
const args = Array.isArray(payload.args) ? payload.args.map((a) => asText(a) ?? '') : [str(payload.message) ?? str(payload.label) ?? asText(payload.detail) ?? '']
|
|
203
|
-
consoleEntries.push({ time, level: levelOf(payload.level ?? tag), message: args.join(' '), args, source: 'custom' })
|
|
209
|
+
consoleEntries.push({ key: str(payload.id), time, level: levelOf(payload.level ?? tag), message: args.join(' '), args, source: 'custom' })
|
|
204
210
|
}
|
|
205
211
|
}
|
|
206
212
|
}
|
package/src/replay/index.ts
CHANGED
|
@@ -18,6 +18,8 @@ export type { ReplayMarker, ReplayMarkerKind, ReplayMeta, ReplayPointerPoint, Re
|
|
|
18
18
|
export { getReplayDevtools, replayDevtoolsAt, requestName } from './devtools';
|
|
19
19
|
export type { ReplayConsoleEntry, ReplayConsoleLevel, ReplayDevtools, ReplayDevtoolsState, ReplayRequest } from './devtools';
|
|
20
20
|
export type { ReplayDevtoolsTab } from './ReplayDevtools';
|
|
21
|
+
export { getReplayInspections, replayInspectionAt, resolveReplayInspections } from './inspections';
|
|
22
|
+
export type { ReplayInspection, ReplayInspectionTab, ResolvedReplayInspection } from './inspections';
|
|
21
23
|
export { ReplayEventType, ReplayIncrementalSource, ReplayMouseInteraction } from './types';
|
|
22
24
|
export type { ReplayEvent } from './types';
|
|
23
25
|
export { isReplayQaUrl, normalizeReplayEmbedUrl } from './url';
|