Skip to content

Commit 4c49d41

Browse files
committed
feat: first draft implementation of tracing channels
1 parent 56ab0d7 commit 4c49d41

File tree

5 files changed

+509
-6
lines changed

5 files changed

+509
-6
lines changed

build.config.mjs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export default defineBuildConfig({
1212
"src/cli.ts",
1313
"src/static.ts",
1414
"src/log.ts",
15+
"src/tracing.ts",
1516
...[
1617
"deno",
1718
"bun",

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"./cli": "./dist/cli.mjs",
1818
"./static": "./dist/static.mjs",
1919
"./log": "./dist/log.mjs",
20+
"./tracing": "./dist/tracing.mjs",
2021
".": {
2122
"types": "./dist/types.d.mts",
2223
"deno": "./dist/adapters/deno.mjs",

src/_middleware.ts

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { traceCall } from "./tracing.ts";
12
import type {
23
Server,
34
ServerRequest,
@@ -8,21 +9,45 @@ import type {
89
export function wrapFetch(server: Server): ServerHandler {
910
const fetchHandler = server.options.fetch;
1011
const middleware = server.options.middleware || [];
11-
return middleware.length === 0
12-
? fetchHandler
13-
: (request) => callMiddleware(request, fetchHandler, middleware, 0);
12+
13+
if (middleware.length === 0) {
14+
return (request) =>
15+
traceCall("fetch", async () => await fetchHandler(request), {
16+
request,
17+
server,
18+
});
19+
}
20+
21+
return (request) =>
22+
callMiddleware(server, request, fetchHandler, middleware, 0);
1423
}
1524

1625
function callMiddleware(
26+
server: Server,
1727
request: ServerRequest,
1828
fetchHandler: ServerHandler,
1929
middleware: ServerMiddleware[],
2030
index: number,
2131
): Response | Promise<Response> {
2232
if (index === middleware.length) {
23-
return fetchHandler(request);
33+
return traceCall("fetch", async () => await fetchHandler(request), {
34+
request,
35+
server,
36+
});
2437
}
25-
return middleware[index](request, () =>
26-
callMiddleware(request, fetchHandler, middleware, index + 1),
38+
39+
const currentMiddleware = middleware[index];
40+
const next = () =>
41+
callMiddleware(server, request, fetchHandler, middleware, index + 1);
42+
43+
return traceCall(
44+
"middleware",
45+
async () => await currentMiddleware(request, next),
46+
{
47+
request,
48+
server,
49+
index,
50+
name: currentMiddleware?.name,
51+
},
2752
);
2853
}

src/tracing.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { tracingChannel, type TracingChannel } from "node:diagnostics_channel";
2+
import type { Server, ServerRequest } from "./types.ts";
3+
4+
export type TraceDataMap = {
5+
fetch: { request: ServerRequest; server: Server };
6+
middleware: {
7+
request: ServerRequest;
8+
server: Server;
9+
index: number;
10+
name?: string;
11+
};
12+
};
13+
14+
export type TraceChannelName = keyof TraceDataMap;
15+
16+
const channels: Record<
17+
TraceChannelName,
18+
TracingChannel<unknown, TraceDataMap[TraceChannelName]>
19+
> = {
20+
fetch: tracingChannel("srvx.fetch"),
21+
middleware: tracingChannel("srvx.middleware"),
22+
};
23+
24+
export function traceCall<
25+
TChannel extends TraceChannelName,
26+
TReturn,
27+
TData extends TraceDataMap[TChannel],
28+
>(
29+
channel: TChannel,
30+
exec: () => Promise<TReturn>,
31+
data: TData,
32+
): Promise<TReturn> {
33+
return channels[channel].tracePromise(exec, data);
34+
}
35+
36+
export function traceSync<
37+
TChannel extends TraceChannelName,
38+
TReturn,
39+
TData extends TraceDataMap[TChannel],
40+
>(channel: TChannel, exec: () => TReturn, data: TData): TReturn {
41+
return channels[channel].traceSync(exec, data);
42+
}

0 commit comments

Comments
 (0)