@nextscope/next 0.2.1 → 0.3.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 -1
- package/dist/config.d.ts +1 -0
- package/dist/config.js +89 -11
- package/dist/config.js.map +1 -1
- package/dist/inspector/model/index.d.ts +13 -1
- package/dist/inspector/model/index.js +149 -1
- package/dist/inspector/model/index.js.map +1 -1
- package/dist/inspector/model/types.d.ts +7 -0
- package/dist/inspector-assets.d.ts +2 -2
- package/dist/inspector-assets.js +2 -2
- package/dist/inspector-assets.js.map +1 -1
- package/dist/mcp.js +19 -0
- package/dist/mcp.js.map +1 -1
- package/dist/next-types.d.ts +1 -0
- package/dist/pids.d.ts +13 -0
- package/dist/pids.js +123 -0
- package/dist/pids.js.map +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +38 -5
- package/dist/server.js.map +1 -1
- package/dist/store.d.ts +9 -0
- package/dist/store.js +80 -4
- package/dist/store.js.map +1 -1
- package/dist/suppression.js +1 -1
- package/dist/suppression.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inspector-assets.js","sourceRoot":"","sources":["../src/inspector-assets.ts"],"names":[],"mappings":";;;AAAA,mEAAmE;AACtD,QAAA,YAAY,GAAG,
|
|
1
|
+
{"version":3,"file":"inspector-assets.js","sourceRoot":"","sources":["../src/inspector-assets.ts"],"names":[],"mappings":";;;AAAA,mEAAmE;AACtD,QAAA,YAAY,GAAG,i1yCAAi1yC,CAAA;AACh2yC,QAAA,WAAW,GAAG,u7pQAAu7pQ,CAAA"}
|
package/dist/mcp.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.handleMcpRequest = handleMcpRequest;
|
|
4
4
|
const mcp_1 = require("@nextscope/mcp");
|
|
5
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
6
|
const store_1 = require("./store");
|
|
6
7
|
async function handleMcpRequest(request, response, options) {
|
|
7
8
|
await (0, mcp_1.handleNextScopeMcpRequest)(request, response, createTraceStoreAdapter(options));
|
|
@@ -9,6 +10,21 @@ async function handleMcpRequest(request, response, options) {
|
|
|
9
10
|
function createTraceStoreAdapter(options) {
|
|
10
11
|
return {
|
|
11
12
|
getStatus: () => options.getStatus(),
|
|
13
|
+
listServers: () => {
|
|
14
|
+
const status = options.getStatus();
|
|
15
|
+
return {
|
|
16
|
+
servers: [{
|
|
17
|
+
serverId: serverIdFromProjectRoot(String(status.projectRoot ?? process.cwd())),
|
|
18
|
+
projectRoot: String(status.projectRoot ?? process.cwd()),
|
|
19
|
+
packageName: typeof status.packageName === 'string' ? status.packageName : undefined,
|
|
20
|
+
route: typeof status.route === 'string' ? status.route : undefined,
|
|
21
|
+
devOrigin: typeof status.devOrigin === 'string' ? status.devOrigin : undefined,
|
|
22
|
+
traceCount: typeof status.traceCount === 'number' ? status.traceCount : undefined,
|
|
23
|
+
lastIngestAt: typeof status.lastIngestAt === 'string' ? status.lastIngestAt : undefined,
|
|
24
|
+
lastError: typeof status.lastError === 'string' ? status.lastError : undefined,
|
|
25
|
+
}],
|
|
26
|
+
};
|
|
27
|
+
},
|
|
12
28
|
listTraces: (args) => options.store.listTraceSummariesPage({
|
|
13
29
|
limit: args.limit,
|
|
14
30
|
cursor: args.cursor,
|
|
@@ -52,6 +68,9 @@ function createTraceStoreAdapter(options) {
|
|
|
52
68
|
clearTraces: () => options.clearTraces(),
|
|
53
69
|
};
|
|
54
70
|
}
|
|
71
|
+
function serverIdFromProjectRoot(projectRoot) {
|
|
72
|
+
return `ns_${(0, node_crypto_1.createHash)('sha256').update(projectRoot).digest('base64url').slice(0, 8)}`;
|
|
73
|
+
}
|
|
55
74
|
function requireTrace(store, traceId) {
|
|
56
75
|
const trace = store.getTrace(traceId);
|
|
57
76
|
if (!trace) {
|
package/dist/mcp.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
|
package/dist/next-types.d.ts
CHANGED
package/dist/pids.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface SidecarOwnerClaim {
|
|
2
|
+
release(): void;
|
|
3
|
+
}
|
|
4
|
+
interface SidecarOwnerClaimOptions {
|
|
5
|
+
cwd?: string;
|
|
6
|
+
pid?: number;
|
|
7
|
+
isPidAlive?: (pid: number) => boolean;
|
|
8
|
+
}
|
|
9
|
+
export declare function claimDevServerPidfile(): boolean;
|
|
10
|
+
export declare function claimSidecarOwner(options?: SidecarOwnerClaimOptions): SidecarOwnerClaim | undefined;
|
|
11
|
+
export declare function cleanupDevServerPidfilesForTests(): void;
|
|
12
|
+
export declare function cleanupSidecarOwnerForTests(cwd?: string): void;
|
|
13
|
+
export {};
|
package/dist/pids.js
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.claimDevServerPidfile = claimDevServerPidfile;
|
|
4
|
+
exports.claimSidecarOwner = claimSidecarOwner;
|
|
5
|
+
exports.cleanupDevServerPidfilesForTests = cleanupDevServerPidfilesForTests;
|
|
6
|
+
exports.cleanupSidecarOwnerForTests = cleanupSidecarOwnerForTests;
|
|
7
|
+
const node_crypto_1 = require("node:crypto");
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_os_1 = require("node:os");
|
|
10
|
+
const node_path_1 = require("node:path");
|
|
11
|
+
const DEV_SERVER_PID_DIR = (0, node_path_1.join)((0, node_os_1.tmpdir)(), 'nextscope');
|
|
12
|
+
const DEV_SERVER_PID_PREFIX = 'dev-server-';
|
|
13
|
+
const DEV_SERVER_PID_MAX_AGE_MS = 24 * 60 * 60 * 1000;
|
|
14
|
+
const SIDECAR_OWNER_PREFIX = 'sidecar-owner-';
|
|
15
|
+
function claimDevServerPidfile() {
|
|
16
|
+
try {
|
|
17
|
+
(0, node_fs_1.mkdirSync)(DEV_SERVER_PID_DIR, { recursive: true });
|
|
18
|
+
pruneStaleDevServerPidfiles();
|
|
19
|
+
(0, node_fs_1.writeFileSync)(devServerPidfilePath(), String(process.pid), { flag: 'wx' });
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
return error.code !== 'EEXIST';
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
function claimSidecarOwner(options = {}) {
|
|
27
|
+
const pid = options.pid ?? process.pid;
|
|
28
|
+
const pidfile = sidecarOwnerPidfilePath(options.cwd);
|
|
29
|
+
const isPidAlive = options.isPidAlive ?? isProcessAlive;
|
|
30
|
+
try {
|
|
31
|
+
(0, node_fs_1.mkdirSync)(DEV_SERVER_PID_DIR, { recursive: true });
|
|
32
|
+
try {
|
|
33
|
+
(0, node_fs_1.writeFileSync)(pidfile, String(pid), { flag: 'wx' });
|
|
34
|
+
return createSidecarOwnerClaim(pidfile, pid);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (error.code !== 'EEXIST') {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const currentOwnerPid = readPidfile(pidfile);
|
|
42
|
+
if (currentOwnerPid !== undefined && isPidAlive(currentOwnerPid)) {
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
(0, node_fs_1.rmSync)(pidfile, { force: true });
|
|
46
|
+
(0, node_fs_1.writeFileSync)(pidfile, String(pid), { flag: 'wx' });
|
|
47
|
+
return createSidecarOwnerClaim(pidfile, pid);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function cleanupDevServerPidfilesForTests() {
|
|
54
|
+
(0, node_fs_1.rmSync)(devServerPidfilePath(), { force: true });
|
|
55
|
+
(0, node_fs_1.rmSync)(sidecarOwnerPidfilePath(), { force: true });
|
|
56
|
+
}
|
|
57
|
+
function cleanupSidecarOwnerForTests(cwd = process.cwd()) {
|
|
58
|
+
(0, node_fs_1.rmSync)(sidecarOwnerPidfilePath(cwd), { force: true });
|
|
59
|
+
}
|
|
60
|
+
function pruneStaleDevServerPidfiles(now = Date.now()) {
|
|
61
|
+
try {
|
|
62
|
+
for (const entry of (0, node_fs_1.readdirSync)(DEV_SERVER_PID_DIR)) {
|
|
63
|
+
if (!entry.startsWith(DEV_SERVER_PID_PREFIX)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const pidfile = (0, node_path_1.join)(DEV_SERVER_PID_DIR, entry);
|
|
67
|
+
try {
|
|
68
|
+
const stats = (0, node_fs_1.statSync)(pidfile);
|
|
69
|
+
if (now - stats.mtimeMs > DEV_SERVER_PID_MAX_AGE_MS) {
|
|
70
|
+
(0, node_fs_1.rmSync)(pidfile, { force: true });
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Ignore races with another process creating or removing pidfiles.
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// Startup reporting should not depend on being able to prune old pidfiles.
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function devServerPidfilePath() {
|
|
83
|
+
return (0, node_path_1.join)(DEV_SERVER_PID_DIR, `${DEV_SERVER_PID_PREFIX}${process.ppid}-${projectCwdHash()}`);
|
|
84
|
+
}
|
|
85
|
+
function sidecarOwnerPidfilePath(cwd = process.cwd()) {
|
|
86
|
+
return (0, node_path_1.join)(DEV_SERVER_PID_DIR, `${SIDECAR_OWNER_PREFIX}${projectCwdHash(cwd)}`);
|
|
87
|
+
}
|
|
88
|
+
function projectCwdHash(cwd = process.cwd()) {
|
|
89
|
+
return (0, node_crypto_1.createHash)('sha1').update(cwd).digest('hex');
|
|
90
|
+
}
|
|
91
|
+
function readPidfile(pidfile) {
|
|
92
|
+
const value = Number((0, node_fs_1.readFileSync)(pidfile, 'utf8').trim());
|
|
93
|
+
return Number.isInteger(value) && value > 0 ? value : undefined;
|
|
94
|
+
}
|
|
95
|
+
function isProcessAlive(pid) {
|
|
96
|
+
try {
|
|
97
|
+
process.kill(pid, 0);
|
|
98
|
+
return true;
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
return error.code === 'EPERM';
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function createSidecarOwnerClaim(pidfile, pid) {
|
|
105
|
+
let released = false;
|
|
106
|
+
return {
|
|
107
|
+
release() {
|
|
108
|
+
if (released) {
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
released = true;
|
|
112
|
+
try {
|
|
113
|
+
if (readPidfile(pidfile) === pid) {
|
|
114
|
+
(0, node_fs_1.rmSync)(pidfile, { force: true });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Ignore races with another process or test cleanup removing the claim.
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=pids.js.map
|
package/dist/pids.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pids.js","sourceRoot":"","sources":["../src/pids.ts"],"names":[],"mappings":"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"}
|
package/dist/server.d.ts
CHANGED
package/dist/server.js
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.startNextScopeServer = startNextScopeServer;
|
|
4
4
|
const node_http_1 = require("node:http");
|
|
5
|
+
const promises_1 = require("node:fs/promises");
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
5
7
|
const forwarder_1 = require("./forwarder");
|
|
6
8
|
const mcp_1 = require("./mcp");
|
|
7
9
|
const otel_1 = require("./otel");
|
|
@@ -19,7 +21,12 @@ async function startNextScopeServer(options) {
|
|
|
19
21
|
maxTraces: options.maxTraces,
|
|
20
22
|
});
|
|
21
23
|
await persistence.loadInto(store);
|
|
22
|
-
const sidecarStatus = new SidecarStatus(
|
|
24
|
+
const sidecarStatus = new SidecarStatus({
|
|
25
|
+
route: options.route,
|
|
26
|
+
projectRoot: process.cwd(),
|
|
27
|
+
packageName: await readPackageName(process.cwd()),
|
|
28
|
+
devOrigin: options.devOrigin,
|
|
29
|
+
});
|
|
23
30
|
let sidecarUrl = '';
|
|
24
31
|
const server = (0, node_http_1.createServer)(async (request, response) => {
|
|
25
32
|
try {
|
|
@@ -46,6 +53,7 @@ async function startNextScopeServer(options) {
|
|
|
46
53
|
const address = server.address();
|
|
47
54
|
const url = `http://127.0.0.1:${address.port}`;
|
|
48
55
|
sidecarUrl = url;
|
|
56
|
+
sidecarStatus.setSidecarUrl(url);
|
|
49
57
|
return {
|
|
50
58
|
route: options.route,
|
|
51
59
|
url,
|
|
@@ -175,11 +183,15 @@ class HttpError extends Error {
|
|
|
175
183
|
}
|
|
176
184
|
}
|
|
177
185
|
class SidecarStatus {
|
|
178
|
-
|
|
186
|
+
options;
|
|
179
187
|
suppressedCount = 0;
|
|
180
188
|
lastParseError;
|
|
181
|
-
|
|
182
|
-
|
|
189
|
+
sidecarUrl;
|
|
190
|
+
constructor(options) {
|
|
191
|
+
this.options = options;
|
|
192
|
+
}
|
|
193
|
+
setSidecarUrl(url) {
|
|
194
|
+
this.sidecarUrl = url;
|
|
183
195
|
}
|
|
184
196
|
recordIngest(suppressedCount) {
|
|
185
197
|
this.suppressedCount += suppressedCount;
|
|
@@ -192,8 +204,14 @@ class SidecarStatus {
|
|
|
192
204
|
const storeStats = store.getStats();
|
|
193
205
|
const forwarding = forwarder.getStatus();
|
|
194
206
|
const persistenceStatus = persistence.snapshot();
|
|
207
|
+
const inspectorUrl = this.formatInspectorUrl();
|
|
195
208
|
return {
|
|
196
|
-
|
|
209
|
+
projectRoot: this.options.projectRoot,
|
|
210
|
+
packageName: this.options.packageName,
|
|
211
|
+
route: this.options.route,
|
|
212
|
+
devOrigin: this.options.devOrigin,
|
|
213
|
+
inspectorUrl,
|
|
214
|
+
mcpUrl: `${inspectorUrl}/mcp`,
|
|
197
215
|
traceCount: storeStats.traceCount,
|
|
198
216
|
lastIngestAt: storeStats.lastIngestAt,
|
|
199
217
|
suppressedCount: this.suppressedCount,
|
|
@@ -205,5 +223,20 @@ class SidecarStatus {
|
|
|
205
223
|
lastError: this.lastParseError ?? forwarding.lastError ?? persistenceStatus.lastError,
|
|
206
224
|
};
|
|
207
225
|
}
|
|
226
|
+
formatInspectorUrl() {
|
|
227
|
+
if (this.options.devOrigin) {
|
|
228
|
+
return `${this.options.devOrigin}${this.options.route}`;
|
|
229
|
+
}
|
|
230
|
+
return this.sidecarUrl ?? '';
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async function readPackageName(projectRoot) {
|
|
234
|
+
try {
|
|
235
|
+
const packageJson = JSON.parse(await (0, promises_1.readFile)((0, node_path_1.join)(projectRoot, 'package.json'), 'utf8'));
|
|
236
|
+
return typeof packageJson.name === 'string' && packageJson.name.length ? packageJson.name : undefined;
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return undefined;
|
|
240
|
+
}
|
|
208
241
|
}
|
|
209
242
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import type { NormalizedSpan } from './otel';
|
|
|
2
2
|
export interface TraceSummary {
|
|
3
3
|
traceId: string;
|
|
4
4
|
requestSegmentId: string;
|
|
5
|
+
traceKind: TraceKind;
|
|
5
6
|
revision: number;
|
|
6
7
|
updatedAt: string;
|
|
7
8
|
spanCount: number;
|
|
@@ -13,6 +14,8 @@ export interface TraceSummary {
|
|
|
13
14
|
durationMs: number;
|
|
14
15
|
statusBucket: StatusBucket;
|
|
15
16
|
requestKind: string;
|
|
17
|
+
browserKind?: BrowserEventKind;
|
|
18
|
+
originPage?: string;
|
|
16
19
|
hasRsc: boolean;
|
|
17
20
|
hasPrefetch: boolean;
|
|
18
21
|
routeLabel: string;
|
|
@@ -33,10 +36,13 @@ export interface TraceDetail extends TraceSummary {
|
|
|
33
36
|
}
|
|
34
37
|
export interface RequestSegmentSummary {
|
|
35
38
|
requestSegmentId: string;
|
|
39
|
+
traceKind: TraceKind;
|
|
36
40
|
rootSpan: RequestSpanSummary;
|
|
37
41
|
routeLabel: string;
|
|
38
42
|
statusBucket: StatusBucket;
|
|
39
43
|
requestKind: string;
|
|
44
|
+
browserKind?: BrowserEventKind;
|
|
45
|
+
originPage?: string;
|
|
40
46
|
startOffsetMs: number;
|
|
41
47
|
endOffsetMs: number;
|
|
42
48
|
durationMs: number;
|
|
@@ -86,6 +92,8 @@ export interface RequestSpanSummary {
|
|
|
86
92
|
durationMs: number;
|
|
87
93
|
attributes?: Record<string, unknown>;
|
|
88
94
|
}
|
|
95
|
+
export type TraceKind = 'browser-page-load' | 'server-request' | 'unknown';
|
|
96
|
+
export type BrowserEventKind = 'page-load' | 'fetch' | 'error' | 'unhandledrejection';
|
|
89
97
|
export interface TraceSpanNode {
|
|
90
98
|
spanId: string;
|
|
91
99
|
parentSpanId?: string;
|
|
@@ -223,4 +231,5 @@ export declare function pickRequestRoot(spans: NormalizedSpan[]): NormalizedSpan
|
|
|
223
231
|
export declare function isNoiseOnlyTrace(spans: NormalizedSpan[]): boolean;
|
|
224
232
|
export declare function statusBucket(statusCode?: number): StatusBucket;
|
|
225
233
|
export declare function routeLabel(summary: RequestSpanSummary): string;
|
|
234
|
+
export declare function browserEventKind(root: NormalizedSpan): BrowserEventKind | undefined;
|
|
226
235
|
export {};
|
package/dist/store.js
CHANGED
|
@@ -7,6 +7,7 @@ exports.pickRequestRoot = pickRequestRoot;
|
|
|
7
7
|
exports.isNoiseOnlyTrace = isNoiseOnlyTrace;
|
|
8
8
|
exports.statusBucket = statusBucket;
|
|
9
9
|
exports.routeLabel = routeLabel;
|
|
10
|
+
exports.browserEventKind = browserEventKind;
|
|
10
11
|
class TraceStore {
|
|
11
12
|
maxTraces;
|
|
12
13
|
traces = new Map();
|
|
@@ -261,6 +262,7 @@ function summarizeTrace(trace) {
|
|
|
261
262
|
return segments.map((segment) => ({
|
|
262
263
|
traceId: trace.traceId,
|
|
263
264
|
requestSegmentId: segment.requestSegmentId,
|
|
265
|
+
traceKind: segment.traceKind,
|
|
264
266
|
revision: trace.revision,
|
|
265
267
|
updatedAt: new Date(trace.updatedAt).toISOString(),
|
|
266
268
|
spanCount: segment.spanCount,
|
|
@@ -279,6 +281,8 @@ function summarizeTrace(trace) {
|
|
|
279
281
|
},
|
|
280
282
|
statusBucket: segment.statusBucket,
|
|
281
283
|
requestKind: segment.requestKind,
|
|
284
|
+
browserKind: segment.browserKind,
|
|
285
|
+
originPage: segment.originPage,
|
|
282
286
|
hasRsc: segmentSpans(spans, segment.requestSegmentId).some((span) => span.attributes['next.rsc'] === true),
|
|
283
287
|
hasPrefetch: segmentSpans(spans, segment.requestSegmentId).some((span) => span.attributes['next.span_type'] === 'NextNodeServer.handleNextDataRequest' || span.attributes['next.rsc'] === true),
|
|
284
288
|
routeLabel: segment.routeLabel,
|
|
@@ -427,19 +431,34 @@ function requestSegments(spans, traceStart) {
|
|
|
427
431
|
const requestRoots = spans
|
|
428
432
|
.filter((span) => span.attributes['next.span_type'] === 'BaseServer.handleRequest')
|
|
429
433
|
.sort(compareByStartTime);
|
|
430
|
-
const
|
|
434
|
+
const pageLoadRoot = pickBrowserPageLoadRoot(spans);
|
|
435
|
+
const roots = requestRoots.length > 0 ? requestRoots : [pageLoadRoot ?? pickRequestRoot(spans)];
|
|
431
436
|
return roots.map((root) => {
|
|
432
437
|
const spansInSegment = segmentSpans(spans, root.spanId).sort(compareByStartTime);
|
|
433
438
|
const segmentStart = minBigInt(spansInSegment.map((span) => span.startTimeUnixNano));
|
|
434
439
|
const segmentEnd = maxBigInt(spansInSegment.map((span) => span.endTimeUnixNano));
|
|
435
440
|
const rootSummary = requestSpanSummary(root, true);
|
|
436
441
|
const diagnostics = spanDiagnostics(spansInSegment, traceStart);
|
|
442
|
+
const browserKind = browserEventKind(root);
|
|
443
|
+
// A browser fetch names its span "HTTP GET" and stamps the fetched URL on
|
|
444
|
+
// `http.url`; the page it fired from lands in the route/target fields. Swap
|
|
445
|
+
// in the fetched pathname so the label, grouping, and search key off the
|
|
446
|
+
// request the developer actually made, not the page they were on.
|
|
447
|
+
const fetchPath = browserKind === 'fetch' ? fetchPathname(root) : undefined;
|
|
448
|
+
if (fetchPath) {
|
|
449
|
+
rootSummary.target = fetchPath;
|
|
450
|
+
}
|
|
437
451
|
return {
|
|
438
452
|
requestSegmentId: root.spanId,
|
|
453
|
+
traceKind: traceKind(root, spansInSegment),
|
|
439
454
|
rootSpan: rootSummary,
|
|
440
|
-
routeLabel: routeLabel(rootSummary),
|
|
455
|
+
routeLabel: fetchPath ?? routeLabel(rootSummary),
|
|
441
456
|
statusBucket: statusBucket(rootSummary.statusCode),
|
|
442
457
|
requestKind: requestKind(root),
|
|
458
|
+
browserKind,
|
|
459
|
+
// The page a browser event fired from — surfaced as a top-level field so
|
|
460
|
+
// the trace list (which ships without span attributes) can show it.
|
|
461
|
+
originPage: browserKind ? stringAttr(root.attributes, 'nextscope.page.path') : undefined,
|
|
443
462
|
startOffsetMs: Number(segmentStart - traceStart) / 1_000_000,
|
|
444
463
|
endOffsetMs: Number(segmentEnd - traceStart) / 1_000_000,
|
|
445
464
|
durationMs: Number(segmentEnd - segmentStart) / 1_000_000,
|
|
@@ -555,8 +574,8 @@ function requestSpanSummary(span, includeAttributes = false) {
|
|
|
555
574
|
return {
|
|
556
575
|
spanId: span.spanId,
|
|
557
576
|
name: span.name,
|
|
558
|
-
route: stringAttr(span.attributes, 'next.route', 'http.route'),
|
|
559
|
-
target: stringAttr(span.attributes, 'http.target', 'url.path'),
|
|
577
|
+
route: stringAttr(span.attributes, 'next.route', 'http.route', 'nextscope.page.path'),
|
|
578
|
+
target: stringAttr(span.attributes, 'http.target', 'url.path', 'nextscope.page.url'),
|
|
560
579
|
method: stringAttr(span.attributes, 'http.method', 'http.request.method'),
|
|
561
580
|
statusCode: numberAttr(span.attributes, 'http.status_code', 'http.response.status_code'),
|
|
562
581
|
spanType: stringAttr(span.attributes, 'next.span_type'),
|
|
@@ -580,6 +599,8 @@ function routeLabel(summary) {
|
|
|
580
599
|
return summary.route ?? summary.target ?? summary.name;
|
|
581
600
|
}
|
|
582
601
|
function requestKind(span) {
|
|
602
|
+
if (isBrowserPageLoadSpan(span))
|
|
603
|
+
return 'browser-page-load';
|
|
583
604
|
const spanType = stringAttr(span.attributes, 'next.span_type');
|
|
584
605
|
if (spanType === 'BaseServer.handleRequest')
|
|
585
606
|
return 'page';
|
|
@@ -587,6 +608,61 @@ function requestKind(span) {
|
|
|
587
608
|
return 'route-handler';
|
|
588
609
|
return spanType ?? 'span';
|
|
589
610
|
}
|
|
611
|
+
function traceKind(root, spans) {
|
|
612
|
+
if (isBrowserPageLoadSpan(root) || spans.some(isBrowserPageLoadSpan)) {
|
|
613
|
+
return 'browser-page-load';
|
|
614
|
+
}
|
|
615
|
+
if (root.attributes['next.span_type'] === 'BaseServer.handleRequest') {
|
|
616
|
+
return 'server-request';
|
|
617
|
+
}
|
|
618
|
+
return 'unknown';
|
|
619
|
+
}
|
|
620
|
+
function pickBrowserPageLoadRoot(spans) {
|
|
621
|
+
return spans
|
|
622
|
+
.filter(isBrowserPageLoadSpan)
|
|
623
|
+
.sort(compareByStartTime)[0];
|
|
624
|
+
}
|
|
625
|
+
function isBrowserPageLoadSpan(span) {
|
|
626
|
+
return (span.attributes['nextscope.browser.kind'] === 'page-load' ||
|
|
627
|
+
(serviceName(span) === 'nextscope-browser' && span.name === 'documentLoad'));
|
|
628
|
+
}
|
|
629
|
+
const BROWSER_EVENT_KINDS = new Set([
|
|
630
|
+
'page-load',
|
|
631
|
+
'fetch',
|
|
632
|
+
'error',
|
|
633
|
+
'unhandledrejection',
|
|
634
|
+
]);
|
|
635
|
+
// Classify a browser-rooted span so the inspector can label it distinctly. The
|
|
636
|
+
// SDK stamps `nextscope.browser.kind` on every browser span; the fallbacks
|
|
637
|
+
// cover spans captured before that tag existed. Returns undefined for anything
|
|
638
|
+
// that isn't a browser event root (server spans, distributed server roots).
|
|
639
|
+
function browserEventKind(root) {
|
|
640
|
+
const tagged = root.attributes['nextscope.browser.kind'];
|
|
641
|
+
if (typeof tagged === 'string' && BROWSER_EVENT_KINDS.has(tagged)) {
|
|
642
|
+
return tagged;
|
|
643
|
+
}
|
|
644
|
+
if (isBrowserPageLoadSpan(root))
|
|
645
|
+
return 'page-load';
|
|
646
|
+
if (root.name === 'browser.error')
|
|
647
|
+
return 'error';
|
|
648
|
+
if (root.name === 'browser.unhandledrejection')
|
|
649
|
+
return 'unhandledrejection';
|
|
650
|
+
if (serviceName(root) === 'nextscope-browser' && stringAttr(root.attributes, 'http.url')) {
|
|
651
|
+
return 'fetch';
|
|
652
|
+
}
|
|
653
|
+
return undefined;
|
|
654
|
+
}
|
|
655
|
+
function fetchPathname(span) {
|
|
656
|
+
const url = stringAttr(span.attributes, 'http.url');
|
|
657
|
+
if (!url)
|
|
658
|
+
return undefined;
|
|
659
|
+
try {
|
|
660
|
+
return new URL(url).pathname;
|
|
661
|
+
}
|
|
662
|
+
catch {
|
|
663
|
+
return url.split(/[?#]/)[0] || undefined;
|
|
664
|
+
}
|
|
665
|
+
}
|
|
590
666
|
function compareByStartTime(a, b) {
|
|
591
667
|
if (a.startTimeUnixNano === b.startTimeUnixNano) {
|
|
592
668
|
return a.spanId.localeCompare(b.spanId);
|