autotel-tanstack 1.13.29 → 1.13.31
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/auto.d.ts +8 -35
- package/dist/auto.d.ts.map +1 -0
- package/dist/auto.js +41 -22
- package/dist/auto.js.map +1 -1
- package/dist/browser/context.d.ts +50 -0
- package/dist/browser/context.d.ts.map +1 -0
- package/dist/browser/context.js +54 -2
- package/dist/browser/context.js.map +1 -1
- package/dist/browser/debug-headers.d.ts +10 -0
- package/dist/browser/debug-headers.d.ts.map +1 -0
- package/dist/browser/debug-headers.js +12 -2
- package/dist/browser/debug-headers.js.map +1 -1
- package/dist/browser/error-reporting.d.ts +39 -0
- package/dist/browser/error-reporting.d.ts.map +1 -0
- package/dist/browser/error-reporting.js +35 -2
- package/dist/browser/error-reporting.js.map +1 -1
- package/dist/browser/handlers.d.ts +14 -0
- package/dist/browser/handlers.d.ts.map +1 -0
- package/dist/browser/handlers.js +10 -2
- package/dist/browser/handlers.js.map +1 -1
- package/dist/browser/index.d.ts +11 -0
- package/dist/browser/index.js +12 -12
- package/dist/browser/loaders.d.ts +31 -0
- package/dist/browser/loaders.d.ts.map +1 -0
- package/dist/browser/loaders.js +29 -2
- package/dist/browser/loaders.js.map +1 -1
- package/dist/browser/metrics.d.ts +56 -0
- package/dist/browser/metrics.d.ts.map +1 -0
- package/dist/browser/metrics.js +48 -2
- package/dist/browser/metrics.js.map +1 -1
- package/dist/browser/middleware.d.ts +42 -0
- package/dist/browser/middleware.d.ts.map +1 -0
- package/dist/browser/middleware.js +36 -2
- package/dist/browser/middleware.js.map +1 -1
- package/dist/browser/server-functions.d.ts +14 -0
- package/dist/browser/server-functions.d.ts.map +1 -0
- package/dist/browser/server-functions.js +16 -2
- package/dist/browser/server-functions.js.map +1 -1
- package/dist/browser/testing.d.ts +85 -0
- package/dist/browser/testing.d.ts.map +1 -0
- package/dist/browser/testing.js +43 -2
- package/dist/browser/testing.js.map +1 -1
- package/dist/browser/types.d.ts +2 -0
- package/dist/browser/types.js +37 -2
- package/dist/browser/types.js.map +1 -1
- package/dist/context.d.ts +5 -3
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +112 -3
- package/dist/context.js.map +1 -1
- package/dist/debug-headers.d.ts +14 -14
- package/dist/debug-headers.d.ts.map +1 -0
- package/dist/debug-headers.js +62 -4
- package/dist/debug-headers.js.map +1 -1
- package/dist/env-BpFWNnpL.js +30 -0
- package/dist/env-BpFWNnpL.js.map +1 -0
- package/dist/error-reporting.d.ts +37 -37
- package/dist/error-reporting.d.ts.map +1 -0
- package/dist/error-reporting.js +154 -3
- package/dist/error-reporting.js.map +1 -1
- package/dist/handlers.d.ts +5 -4
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +192 -6
- package/dist/handlers.js.map +1 -1
- package/dist/index.d.ts +15 -16
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -16
- package/dist/instrument-DS7YCE1R.d.ts +10 -0
- package/dist/instrument-DS7YCE1R.d.ts.map +1 -0
- package/dist/instrument-DdLlMfRi.js +80 -0
- package/dist/instrument-DdLlMfRi.js.map +1 -0
- package/dist/loaders-DrVVY25K.d.ts +2402 -0
- package/dist/loaders-DrVVY25K.d.ts.map +1 -0
- package/dist/loaders.d.ts +2 -116
- package/dist/loaders.js +234 -5
- package/dist/loaders.js.map +1 -1
- package/dist/metrics.d.ts +39 -39
- package/dist/metrics.d.ts.map +1 -0
- package/dist/metrics.js +144 -3
- package/dist/metrics.js.map +1 -1
- package/dist/middleware.d.ts +16 -15
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +290 -7
- package/dist/middleware.js.map +1 -1
- package/dist/route-filter-dLg-j3jR.js +33 -0
- package/dist/route-filter-dLg-j3jR.js.map +1 -0
- package/dist/server-functions.d.ts +4 -3
- package/dist/server-functions.d.ts.map +1 -0
- package/dist/server-functions.js +133 -5
- package/dist/server-functions.js.map +1 -1
- package/dist/testing.d.ts +164 -65
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +212 -147
- package/dist/testing.js.map +1 -1
- package/dist/types-BJ7FyVoX.d.ts +87 -0
- package/dist/types-BJ7FyVoX.d.ts.map +1 -0
- package/dist/types-BrccP0yX.js +38 -0
- package/dist/types-BrccP0yX.js.map +1 -0
- package/dist/types-pQgmQa4j.d.ts +154 -0
- package/dist/types-pQgmQa4j.d.ts.map +1 -0
- package/package.json +7 -7
- package/dist/browser/index.js.map +0 -1
- package/dist/chunk-7OXOAS64.js +0 -41
- package/dist/chunk-7OXOAS64.js.map +0 -1
- package/dist/chunk-A7WMQ2BC.js +0 -25
- package/dist/chunk-A7WMQ2BC.js.map +0 -1
- package/dist/chunk-CCME55EK.js +0 -28
- package/dist/chunk-CCME55EK.js.map +0 -1
- package/dist/chunk-CSFIPJC2.js +0 -11
- package/dist/chunk-CSFIPJC2.js.map +0 -1
- package/dist/chunk-DTZCOB4W.js +0 -32
- package/dist/chunk-DTZCOB4W.js.map +0 -1
- package/dist/chunk-EFSKEYDJ.js +0 -20
- package/dist/chunk-EFSKEYDJ.js.map +0 -1
- package/dist/chunk-EGRHWZRV.js +0 -3
- package/dist/chunk-EGRHWZRV.js.map +0 -1
- package/dist/chunk-ESU66L3L.js +0 -92
- package/dist/chunk-ESU66L3L.js.map +0 -1
- package/dist/chunk-EUYFVNYE.js +0 -16
- package/dist/chunk-EUYFVNYE.js.map +0 -1
- package/dist/chunk-FFQ4FJKE.js +0 -185
- package/dist/chunk-FFQ4FJKE.js.map +0 -1
- package/dist/chunk-G526TOMY.js +0 -96
- package/dist/chunk-G526TOMY.js.map +0 -1
- package/dist/chunk-I4LX3LOG.js +0 -35
- package/dist/chunk-I4LX3LOG.js.map +0 -1
- package/dist/chunk-JXO7H6KO.js +0 -10
- package/dist/chunk-JXO7H6KO.js.map +0 -1
- package/dist/chunk-KPXGFKPU.js +0 -193
- package/dist/chunk-KPXGFKPU.js.map +0 -1
- package/dist/chunk-LRA2UVVS.js +0 -210
- package/dist/chunk-LRA2UVVS.js.map +0 -1
- package/dist/chunk-MFYOV2SF.js +0 -32
- package/dist/chunk-MFYOV2SF.js.map +0 -1
- package/dist/chunk-MNP65ZX7.js +0 -21
- package/dist/chunk-MNP65ZX7.js.map +0 -1
- package/dist/chunk-NTY64BKS.js +0 -38
- package/dist/chunk-NTY64BKS.js.map +0 -1
- package/dist/chunk-UMEJU65Q.js +0 -34
- package/dist/chunk-UMEJU65Q.js.map +0 -1
- package/dist/chunk-UTPW3QRT.js +0 -52
- package/dist/chunk-UTPW3QRT.js.map +0 -1
- package/dist/chunk-V3RO5N2M.js +0 -8
- package/dist/chunk-V3RO5N2M.js.map +0 -1
- package/dist/chunk-XXBHZR3M.js +0 -99
- package/dist/chunk-XXBHZR3M.js.map +0 -1
- package/dist/chunk-YQYYPJCK.js +0 -37
- package/dist/chunk-YQYYPJCK.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/instrument-DRR7VL63.d.ts +0 -46
- package/dist/types-m5OjZJ-4.d.ts +0 -152
package/dist/chunk-LRA2UVVS.js
DELETED
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import { isServerSide } from './chunk-EUYFVNYE.js';
|
|
2
|
-
import { isExcludedPath } from './chunk-CCME55EK.js';
|
|
3
|
-
import { DEFAULT_CONFIG, SPAN_ATTRIBUTES } from './chunk-I4LX3LOG.js';
|
|
4
|
-
import { extractContextFromRequest } from './chunk-NTY64BKS.js';
|
|
5
|
-
import { SpanStatusCode, context } from '@opentelemetry/api';
|
|
6
|
-
import { trace } from 'autotel';
|
|
7
|
-
|
|
8
|
-
function buildRequestAttributes(request, config) {
|
|
9
|
-
const url = new URL(request.url);
|
|
10
|
-
const attrs = {
|
|
11
|
-
[SPAN_ATTRIBUTES.HTTP_REQUEST_METHOD]: request.method,
|
|
12
|
-
[SPAN_ATTRIBUTES.URL_PATH]: url.pathname,
|
|
13
|
-
[SPAN_ATTRIBUTES.TANSTACK_TYPE]: "request"
|
|
14
|
-
};
|
|
15
|
-
if (url.search) {
|
|
16
|
-
attrs[SPAN_ATTRIBUTES.URL_QUERY] = url.search;
|
|
17
|
-
}
|
|
18
|
-
if (config.captureHeaders) {
|
|
19
|
-
for (const header of config.captureHeaders) {
|
|
20
|
-
const value = request.headers.get(header);
|
|
21
|
-
if (value) {
|
|
22
|
-
attrs[`http.request.header.${header.toLowerCase()}`] = value;
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
return attrs;
|
|
27
|
-
}
|
|
28
|
-
function buildServerFnAttributes(functionName, method, args, config) {
|
|
29
|
-
const attrs = {
|
|
30
|
-
[SPAN_ATTRIBUTES.RPC_SYSTEM]: "tanstack-start",
|
|
31
|
-
[SPAN_ATTRIBUTES.RPC_METHOD]: functionName,
|
|
32
|
-
[SPAN_ATTRIBUTES.TANSTACK_TYPE]: "serverFn",
|
|
33
|
-
[SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_NAME]: functionName,
|
|
34
|
-
[SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_METHOD]: method
|
|
35
|
-
};
|
|
36
|
-
if (config.captureArgs && args !== void 0) {
|
|
37
|
-
try {
|
|
38
|
-
attrs[SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_ARGS] = JSON.stringify(args);
|
|
39
|
-
} catch {
|
|
40
|
-
attrs[SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_ARGS] = "[non-serializable]";
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return attrs;
|
|
44
|
-
}
|
|
45
|
-
function createTracingMiddleware(config) {
|
|
46
|
-
const mergedConfig = {
|
|
47
|
-
...DEFAULT_CONFIG,
|
|
48
|
-
...config,
|
|
49
|
-
type: config?.type ?? "request"
|
|
50
|
-
};
|
|
51
|
-
return async function tracingMiddleware2(opts) {
|
|
52
|
-
if (!isServerSide()) {
|
|
53
|
-
return opts.next();
|
|
54
|
-
}
|
|
55
|
-
const { next, request, pathname, data, functionId } = opts;
|
|
56
|
-
if (mergedConfig.type === "function") {
|
|
57
|
-
const fnName = functionId || "unknown";
|
|
58
|
-
const method = opts.method || "POST";
|
|
59
|
-
return trace(`tanstack.serverFn.${fnName}`, async (ctx) => {
|
|
60
|
-
const attrs = buildServerFnAttributes(
|
|
61
|
-
fnName,
|
|
62
|
-
method,
|
|
63
|
-
data,
|
|
64
|
-
mergedConfig
|
|
65
|
-
);
|
|
66
|
-
ctx.setAttributes(attrs);
|
|
67
|
-
if (config?.customAttributes) {
|
|
68
|
-
const customAttrs = config.customAttributes({
|
|
69
|
-
type: "serverFn",
|
|
70
|
-
name: fnName,
|
|
71
|
-
args: data
|
|
72
|
-
});
|
|
73
|
-
ctx.setAttributes(
|
|
74
|
-
customAttrs
|
|
75
|
-
);
|
|
76
|
-
}
|
|
77
|
-
try {
|
|
78
|
-
const result = await next();
|
|
79
|
-
if (mergedConfig.captureResults && result !== void 0) {
|
|
80
|
-
try {
|
|
81
|
-
ctx.setAttribute(
|
|
82
|
-
SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_RESULT,
|
|
83
|
-
JSON.stringify(result)
|
|
84
|
-
);
|
|
85
|
-
} catch {
|
|
86
|
-
ctx.setAttribute(
|
|
87
|
-
SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_RESULT,
|
|
88
|
-
"[non-serializable]"
|
|
89
|
-
);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
ctx.setStatus({ code: SpanStatusCode.OK });
|
|
93
|
-
return result;
|
|
94
|
-
} catch (error) {
|
|
95
|
-
if (mergedConfig.captureErrors) {
|
|
96
|
-
if ("recordError" in ctx && typeof ctx.recordError === "function") {
|
|
97
|
-
ctx.recordError(error);
|
|
98
|
-
} else if ("recordException" in ctx && typeof ctx.recordException === "function") {
|
|
99
|
-
ctx.recordException(error);
|
|
100
|
-
}
|
|
101
|
-
try {
|
|
102
|
-
const { reportError } = await import('./error-reporting.js');
|
|
103
|
-
reportError(error, {
|
|
104
|
-
type: "serverFn",
|
|
105
|
-
name: fnName,
|
|
106
|
-
method
|
|
107
|
-
});
|
|
108
|
-
} catch {
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
throw error;
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
if (!request) {
|
|
116
|
-
return next();
|
|
117
|
-
}
|
|
118
|
-
const url = new URL(request.url);
|
|
119
|
-
if (isExcludedPath(url.pathname, mergedConfig.excludePaths)) {
|
|
120
|
-
return next();
|
|
121
|
-
}
|
|
122
|
-
const parentContext = extractContextFromRequest(request);
|
|
123
|
-
return context.with(parentContext, async () => {
|
|
124
|
-
const spanName = `${request.method} ${pathname || url.pathname}`;
|
|
125
|
-
return trace(spanName, async (ctx) => {
|
|
126
|
-
const attrs = buildRequestAttributes(request, mergedConfig);
|
|
127
|
-
ctx.setAttributes(attrs);
|
|
128
|
-
if (config?.customAttributes) {
|
|
129
|
-
const customAttrs = config.customAttributes({
|
|
130
|
-
type: "request",
|
|
131
|
-
name: spanName,
|
|
132
|
-
request
|
|
133
|
-
});
|
|
134
|
-
ctx.setAttributes(
|
|
135
|
-
customAttrs
|
|
136
|
-
);
|
|
137
|
-
}
|
|
138
|
-
const startTime = Date.now();
|
|
139
|
-
try {
|
|
140
|
-
const result = await next();
|
|
141
|
-
const duration = Date.now() - startTime;
|
|
142
|
-
ctx.setAttribute(
|
|
143
|
-
SPAN_ATTRIBUTES.TANSTACK_REQUEST_DURATION_MS,
|
|
144
|
-
duration
|
|
145
|
-
);
|
|
146
|
-
try {
|
|
147
|
-
const { metricsCollector } = await import('./metrics.js');
|
|
148
|
-
metricsCollector.recordTiming(spanName, duration);
|
|
149
|
-
} catch {
|
|
150
|
-
}
|
|
151
|
-
if (result && typeof result === "object" && "status" in result) {
|
|
152
|
-
ctx.setAttribute(
|
|
153
|
-
SPAN_ATTRIBUTES.HTTP_RESPONSE_STATUS_CODE,
|
|
154
|
-
result.status
|
|
155
|
-
);
|
|
156
|
-
}
|
|
157
|
-
ctx.setStatus({ code: SpanStatusCode.OK });
|
|
158
|
-
return result;
|
|
159
|
-
} catch (error) {
|
|
160
|
-
const duration = Date.now() - startTime;
|
|
161
|
-
ctx.setAttribute(
|
|
162
|
-
SPAN_ATTRIBUTES.TANSTACK_REQUEST_DURATION_MS,
|
|
163
|
-
duration
|
|
164
|
-
);
|
|
165
|
-
if (mergedConfig.captureErrors) {
|
|
166
|
-
if ("recordError" in ctx && typeof ctx.recordError === "function") {
|
|
167
|
-
ctx.recordError(error);
|
|
168
|
-
} else if ("recordException" in ctx && typeof ctx.recordException === "function") {
|
|
169
|
-
ctx.recordException(error);
|
|
170
|
-
}
|
|
171
|
-
try {
|
|
172
|
-
const { reportError } = await import('./error-reporting.js');
|
|
173
|
-
reportError(error, {
|
|
174
|
-
type: "request",
|
|
175
|
-
method: request.method,
|
|
176
|
-
pathname: url.pathname
|
|
177
|
-
});
|
|
178
|
-
} catch {
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
throw error;
|
|
182
|
-
}
|
|
183
|
-
});
|
|
184
|
-
});
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
function tracingMiddleware(config) {
|
|
188
|
-
return createTracingMiddleware({
|
|
189
|
-
sampling: "adaptive",
|
|
190
|
-
captureHeaders: ["x-request-id", "user-agent"],
|
|
191
|
-
excludePaths: ["/health", "/healthz", "/ready", "/metrics", "/_ping"],
|
|
192
|
-
...config
|
|
193
|
-
});
|
|
194
|
-
}
|
|
195
|
-
function functionTracingMiddleware(config) {
|
|
196
|
-
return createTracingMiddleware({
|
|
197
|
-
...config,
|
|
198
|
-
type: "function"
|
|
199
|
-
});
|
|
200
|
-
}
|
|
201
|
-
function createTracingServerHandler(config) {
|
|
202
|
-
const handler = createTracingMiddleware(config);
|
|
203
|
-
return async (opts) => {
|
|
204
|
-
return handler(opts);
|
|
205
|
-
};
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
export { createTracingMiddleware, createTracingServerHandler, functionTracingMiddleware, tracingMiddleware };
|
|
209
|
-
//# sourceMappingURL=chunk-LRA2UVVS.js.map
|
|
210
|
-
//# sourceMappingURL=chunk-LRA2UVVS.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/middleware.ts"],"names":["tracingMiddleware"],"mappings":"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","file":"chunk-LRA2UVVS.js","sourcesContent":["import { context, SpanStatusCode, type Attributes } from '@opentelemetry/api';\nimport { trace, type TraceContext } from 'autotel';\nimport { extractContextFromRequest } from './context';\nimport { isServerSide } from './env';\nimport { isExcludedPath } from './route-filter';\nimport {\n type TracingMiddlewareConfig,\n DEFAULT_CONFIG,\n SPAN_ATTRIBUTES,\n} from './types';\n\n/**\n * Build span attributes for HTTP requests\n */\nfunction buildRequestAttributes(\n request: Request,\n config: Required<\n Omit<TracingMiddlewareConfig, 'customAttributes' | 'service' | 'type'>\n >,\n): Attributes {\n const url = new URL(request.url);\n const attrs: Attributes = {\n [SPAN_ATTRIBUTES.HTTP_REQUEST_METHOD]: request.method,\n [SPAN_ATTRIBUTES.URL_PATH]: url.pathname,\n [SPAN_ATTRIBUTES.TANSTACK_TYPE]: 'request',\n };\n\n if (url.search) {\n attrs[SPAN_ATTRIBUTES.URL_QUERY] = url.search;\n }\n\n // Capture configured headers\n if (config.captureHeaders) {\n for (const header of config.captureHeaders) {\n const value = request.headers.get(header);\n if (value) {\n attrs[`http.request.header.${header.toLowerCase()}`] = value;\n }\n }\n }\n\n return attrs;\n}\n\n/**\n * Build span attributes for server functions\n */\nfunction buildServerFnAttributes(\n functionName: string,\n method: string,\n args: unknown,\n config: Required<\n Omit<TracingMiddlewareConfig, 'customAttributes' | 'service' | 'type'>\n >,\n): Attributes {\n const attrs: Attributes = {\n [SPAN_ATTRIBUTES.RPC_SYSTEM]: 'tanstack-start',\n [SPAN_ATTRIBUTES.RPC_METHOD]: functionName,\n [SPAN_ATTRIBUTES.TANSTACK_TYPE]: 'serverFn',\n [SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_NAME]: functionName,\n [SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_METHOD]: method,\n };\n\n if (config.captureArgs && args !== undefined) {\n try {\n attrs[SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_ARGS] = JSON.stringify(args);\n } catch {\n attrs[SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_ARGS] = '[non-serializable]';\n }\n }\n\n return attrs;\n}\n\n/**\n * Generic middleware handler type (compatible with TanStack's middleware pattern)\n *\n * This type represents the shape of TanStack middleware handlers.\n * We use a generic type to avoid direct dependency on TanStack packages.\n */\nexport interface MiddlewareHandler<TContext = unknown> {\n (opts: {\n next: (ctx?: Partial<TContext>) => Promise<TContext>;\n context: TContext;\n request?: Request;\n pathname?: string;\n data?: unknown;\n method?: string;\n filename?: string;\n functionId?: string;\n signal?: AbortSignal;\n }): Promise<TContext>;\n}\n\n/**\n * Create a TanStack-compatible tracing middleware\n *\n * This creates middleware that automatically traces all requests/server functions\n * with OpenTelemetry spans. Use with TanStack Start's middleware system.\n *\n * @param config - Configuration options\n * @returns Middleware handler compatible with TanStack Start\n *\n * @example\n * ```typescript\n * // Global request middleware in app/start.ts\n * import { createStart } from '@tanstack/react-start';\n * import { createTracingMiddleware } from 'autotel-tanstack/middleware';\n *\n * export const startInstance = createStart(() => ({\n * requestMiddleware: [\n * createTracingMiddleware({\n * captureHeaders: ['x-request-id', 'user-agent'],\n * excludePaths: ['/health', '/metrics'],\n * }),\n * ],\n * }));\n * ```\n *\n * @example\n * ```typescript\n * // Server function middleware\n * import { createServerFn } from '@tanstack/react-start';\n * import { createTracingMiddleware } from 'autotel-tanstack/middleware';\n *\n * export const getUser = createServerFn({ method: 'GET' })\n * .middleware([createTracingMiddleware({ type: 'function' })])\n * .handler(async ({ data: id }) => {\n * return await db.users.findUnique({ where: { id } });\n * });\n * ```\n */\nexport function createTracingMiddleware<TContext = unknown>(\n config?: TracingMiddlewareConfig,\n): MiddlewareHandler<TContext> {\n const mergedConfig = {\n ...DEFAULT_CONFIG,\n ...config,\n type: config?.type ?? 'request',\n };\n\n return async function tracingMiddleware(opts) {\n // If we're in the browser, return a no-op middleware\n // This prevents autotel (which uses Node.js APIs) from being bundled/executed in the browser\n if (!isServerSide()) {\n return opts.next();\n }\n const { next, request, pathname, data, functionId } = opts;\n\n // For function middleware\n if (mergedConfig.type === 'function') {\n const fnName = functionId || 'unknown';\n const method = (opts as { method?: string }).method || 'POST';\n\n return trace(`tanstack.serverFn.${fnName}`, async (ctx: TraceContext) => {\n const attrs = buildServerFnAttributes(\n fnName,\n method,\n data,\n mergedConfig,\n );\n ctx.setAttributes(attrs as Record<string, string | number | boolean>);\n\n // Add custom attributes if provided\n if (config?.customAttributes) {\n const customAttrs = config.customAttributes({\n type: 'serverFn',\n name: fnName,\n args: data,\n });\n ctx.setAttributes(\n customAttrs as Record<string, string | number | boolean>,\n );\n }\n\n try {\n const result = await next();\n\n // Capture result if configured\n if (mergedConfig.captureResults && result !== undefined) {\n try {\n ctx.setAttribute(\n SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_RESULT,\n JSON.stringify(result),\n );\n } catch {\n ctx.setAttribute(\n SPAN_ATTRIBUTES.TANSTACK_SERVER_FN_RESULT,\n '[non-serializable]',\n );\n }\n }\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n if (mergedConfig.captureErrors) {\n if ('recordError' in ctx && typeof ctx.recordError === 'function') {\n ctx.recordError(error);\n } else if (\n 'recordException' in ctx &&\n typeof ctx.recordException === 'function'\n ) {\n ctx.recordException(error);\n }\n\n // Report error to error store\n try {\n const { reportError } = await import('./error-reporting');\n reportError(error as Error, {\n type: 'serverFn',\n name: fnName,\n method,\n });\n } catch {\n // Error reporting not available, skip\n }\n }\n throw error;\n }\n }) as Promise<TContext>;\n }\n\n // For request middleware\n if (!request) {\n // No request available, just pass through\n return next();\n }\n\n const url = new URL(request.url);\n\n // Check if path should be excluded\n if (isExcludedPath(url.pathname, mergedConfig.excludePaths)) {\n return next();\n }\n\n // Extract parent context from request headers\n const parentContext = extractContextFromRequest(request);\n\n // Run within parent context for distributed tracing\n return context.with(parentContext, async () => {\n const spanName = `${request.method} ${pathname || url.pathname}`;\n\n return trace(spanName, async (ctx: TraceContext) => {\n const attrs = buildRequestAttributes(request, mergedConfig);\n ctx.setAttributes(attrs as Record<string, string | number | boolean>);\n\n // Add custom attributes if provided\n if (config?.customAttributes) {\n const customAttrs = config.customAttributes({\n type: 'request',\n name: spanName,\n request,\n });\n ctx.setAttributes(\n customAttrs as Record<string, string | number | boolean>,\n );\n }\n\n const startTime = Date.now();\n\n try {\n const result = await next();\n\n const duration = Date.now() - startTime;\n ctx.setAttribute(\n SPAN_ATTRIBUTES.TANSTACK_REQUEST_DURATION_MS,\n duration,\n );\n\n // Record timing in metrics collector\n try {\n const { metricsCollector } = await import('./metrics');\n metricsCollector.recordTiming(spanName, duration);\n } catch {\n // Metrics not available, skip\n }\n\n // Try to get response status from result if it's a Response\n if (result && typeof result === 'object' && 'status' in result) {\n ctx.setAttribute(\n SPAN_ATTRIBUTES.HTTP_RESPONSE_STATUS_CODE,\n (result as { status: number }).status,\n );\n }\n\n ctx.setStatus({ code: SpanStatusCode.OK });\n return result;\n } catch (error) {\n const duration = Date.now() - startTime;\n ctx.setAttribute(\n SPAN_ATTRIBUTES.TANSTACK_REQUEST_DURATION_MS,\n duration,\n );\n\n if (mergedConfig.captureErrors) {\n if ('recordError' in ctx && typeof ctx.recordError === 'function') {\n ctx.recordError(error);\n } else if (\n 'recordException' in ctx &&\n typeof ctx.recordException === 'function'\n ) {\n ctx.recordException(error);\n }\n\n // Report error to error store\n try {\n const { reportError } = await import('./error-reporting');\n reportError(error as Error, {\n type: 'request',\n method: request.method,\n pathname: url.pathname,\n });\n } catch {\n // Error reporting not available, skip\n }\n }\n throw error;\n }\n }) as Promise<TContext>;\n });\n };\n}\n\n/**\n * Pre-configured tracing middleware with sensible defaults\n *\n * Convenience export for quick setup. Uses adaptive sampling,\n * captures x-request-id header, and excludes common health check paths.\n *\n * @param config - Optional configuration overrides\n * @returns Middleware handler\n *\n * @example\n * ```typescript\n * import { createStart } from '@tanstack/react-start';\n * import { tracingMiddleware } from 'autotel-tanstack/middleware';\n *\n * export const startInstance = createStart(() => ({\n * requestMiddleware: [tracingMiddleware()],\n * }));\n * ```\n */\nexport function tracingMiddleware<TContext = unknown>(\n config?: TracingMiddlewareConfig,\n): MiddlewareHandler<TContext> {\n return createTracingMiddleware({\n sampling: 'adaptive',\n captureHeaders: ['x-request-id', 'user-agent'],\n excludePaths: ['/health', '/healthz', '/ready', '/metrics', '/_ping'],\n ...config,\n });\n}\n\n/**\n * Create function-specific tracing middleware\n *\n * Convenience wrapper for server function middleware.\n *\n * @param config - Optional configuration\n * @returns Middleware handler for server functions\n *\n * @example\n * ```typescript\n * import { createServerFn } from '@tanstack/react-start';\n * import { functionTracingMiddleware } from 'autotel-tanstack/middleware';\n *\n * export const getUser = createServerFn({ method: 'GET' })\n * .middleware([functionTracingMiddleware()])\n * .handler(async ({ data: id }) => {\n * return await db.users.findUnique({ where: { id } });\n * });\n * ```\n */\nexport function functionTracingMiddleware<TContext = unknown>(\n config?: Omit<TracingMiddlewareConfig, 'type'>,\n): MiddlewareHandler<TContext> {\n return createTracingMiddleware({\n ...config,\n type: 'function',\n });\n}\n\n/**\n * Create a tracing handler for use with TanStack's native createMiddleware()\n *\n * This provides the raw tracing logic that you can pass to createMiddleware().server().\n * Use this when you want full control over the middleware builder pattern.\n *\n * The handler accepts TanStack's middleware signature `{ next, context, request }`\n * and internally adapts it to our more flexible MiddlewareHandler interface.\n *\n * @param config - Configuration options\n * @returns Server handler function compatible with createMiddleware().server()\n *\n * @example\n * ```typescript\n * import { createStart, createMiddleware } from '@tanstack/react-start';\n * import { createTracingServerHandler } from 'autotel-tanstack/middleware';\n *\n * // TanStack-native middleware creation\n * const requestTracingMiddleware = createMiddleware().server(\n * createTracingServerHandler({ captureHeaders: ['x-request-id'] })\n * );\n *\n * export const start = createStart(() => ({\n * requestMiddleware: [requestTracingMiddleware],\n * }));\n * ```\n *\n * @example\n * ```typescript\n * // For server functions - use createMiddleware({ type: 'function' })\n * import { createStart, createMiddleware } from '@tanstack/react-start';\n * import { createTracingServerHandler } from 'autotel-tanstack/middleware';\n *\n * const functionTracingMiddleware = createMiddleware({ type: 'function' }).server(\n * createTracingServerHandler({ type: 'function', captureArgs: true })\n * );\n *\n * export const start = createStart(() => ({\n * functionMiddleware: [functionTracingMiddleware],\n * }));\n * ```\n */\nexport function createTracingServerHandler<TContext = unknown>(\n config?: TracingMiddlewareConfig,\n): (opts: any) => any {\n const handler = createTracingMiddleware<TContext>(config);\n\n // Adapt TanStack's signature to our handler\n return async (opts: any) => {\n return handler(opts);\n };\n}\n"]}
|
package/dist/chunk-MFYOV2SF.js
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
// src/browser/types.ts
|
|
2
|
-
var DEFAULT_CONFIG = {
|
|
3
|
-
captureArgs: true,
|
|
4
|
-
captureResults: false,
|
|
5
|
-
captureErrors: true,
|
|
6
|
-
captureHeaders: ["x-request-id"],
|
|
7
|
-
excludePaths: [],
|
|
8
|
-
sampling: "adaptive"
|
|
9
|
-
};
|
|
10
|
-
var SPAN_ATTRIBUTES = {
|
|
11
|
-
HTTP_REQUEST_METHOD: "http.request.method",
|
|
12
|
-
HTTP_RESPONSE_STATUS_CODE: "http.response.status_code",
|
|
13
|
-
URL_PATH: "url.path",
|
|
14
|
-
URL_QUERY: "url.query",
|
|
15
|
-
URL_FULL: "url.full",
|
|
16
|
-
RPC_SYSTEM: "rpc.system",
|
|
17
|
-
RPC_METHOD: "rpc.method",
|
|
18
|
-
TANSTACK_TYPE: "tanstack.type",
|
|
19
|
-
TANSTACK_SERVER_FN_NAME: "tanstack.server_function.name",
|
|
20
|
-
TANSTACK_SERVER_FN_METHOD: "tanstack.server_function.method",
|
|
21
|
-
TANSTACK_SERVER_FN_ARGS: "tanstack.server_function.args",
|
|
22
|
-
TANSTACK_SERVER_FN_RESULT: "tanstack.server_function.result",
|
|
23
|
-
TANSTACK_LOADER_ROUTE_ID: "tanstack.loader.route_id",
|
|
24
|
-
TANSTACK_LOADER_TYPE: "tanstack.loader.type",
|
|
25
|
-
TANSTACK_LOADER_PARAMS: "tanstack.loader.params",
|
|
26
|
-
TANSTACK_MIDDLEWARE_NAME: "tanstack.middleware.name",
|
|
27
|
-
TANSTACK_REQUEST_DURATION_MS: "tanstack.request.duration_ms"
|
|
28
|
-
};
|
|
29
|
-
|
|
30
|
-
export { DEFAULT_CONFIG, SPAN_ATTRIBUTES };
|
|
31
|
-
//# sourceMappingURL=chunk-MFYOV2SF.js.map
|
|
32
|
-
//# sourceMappingURL=chunk-MFYOV2SF.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/browser/types.ts"],"names":[],"mappings":";AAmEO,IAAM,cAAA,GAET;AAAA,EACF,WAAA,EAAa,IAAA;AAAA,EACb,cAAA,EAAgB,KAAA;AAAA,EAChB,aAAA,EAAe,IAAA;AAAA,EACf,cAAA,EAAgB,CAAC,cAAc,CAAA;AAAA,EAC/B,cAAc,EAAC;AAAA,EACf,QAAA,EAAU;AACZ;AAKO,IAAM,eAAA,GAAkB;AAAA,EAC7B,mBAAA,EAAqB,qBAAA;AAAA,EACrB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,QAAA,EAAU,UAAA;AAAA,EACV,SAAA,EAAW,WAAA;AAAA,EACX,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,YAAA;AAAA,EACZ,UAAA,EAAY,YAAA;AAAA,EACZ,aAAA,EAAe,eAAA;AAAA,EACf,uBAAA,EAAyB,+BAAA;AAAA,EACzB,yBAAA,EAA2B,iCAAA;AAAA,EAC3B,uBAAA,EAAyB,+BAAA;AAAA,EACzB,yBAAA,EAA2B,iCAAA;AAAA,EAC3B,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,oBAAA,EAAsB,sBAAA;AAAA,EACtB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,4BAAA,EAA8B;AAChC","file":"chunk-MFYOV2SF.js","sourcesContent":["/**\n * Browser stub for types module\n *\n * Provides type definitions without importing from @opentelemetry/api\n */\n\n/**\n * OpenTelemetry-compatible Attributes type (browser stub)\n */\nexport type Attributes = Record<string, string | number | boolean | undefined>;\n\n/**\n * Configuration options for TanStack Start instrumentation\n */\nexport interface TanStackInstrumentationConfig {\n service?: string;\n captureArgs?: boolean;\n captureResults?: boolean;\n captureErrors?: boolean;\n captureHeaders?: string[];\n excludePaths?: (string | RegExp)[];\n sampling?: 'always' | 'adaptive' | 'never';\n customAttributes?: (context: {\n type: 'request' | 'serverFn' | 'loader' | 'beforeLoad' | 'middleware';\n name: string;\n request?: Request;\n args?: unknown;\n result?: unknown;\n }) => Attributes;\n}\n\n/**\n * Configuration specific to tracing middleware\n */\nexport interface TracingMiddlewareConfig extends TanStackInstrumentationConfig {\n type?: 'request' | 'function';\n}\n\n/**\n * Configuration for server function tracing\n */\nexport interface TraceServerFnConfig {\n name?: string;\n captureArgs?: boolean;\n captureResults?: boolean;\n}\n\n/**\n * Configuration for loader tracing\n */\nexport interface TraceLoaderConfig {\n name?: string;\n captureParams?: boolean;\n captureResult?: boolean;\n}\n\n/**\n * Configuration for handler wrapper\n */\nexport interface WrapStartHandlerConfig extends TanStackInstrumentationConfig {\n endpoint?: string;\n headers?: Record<string, string>;\n}\n\n/**\n * Default configuration values\n */\nexport const DEFAULT_CONFIG: Required<\n Omit<TanStackInstrumentationConfig, 'customAttributes' | 'service'>\n> = {\n captureArgs: true,\n captureResults: false,\n captureErrors: true,\n captureHeaders: ['x-request-id'],\n excludePaths: [],\n sampling: 'adaptive',\n};\n\n/**\n * Span attribute keys (stub - values are strings)\n */\nexport const SPAN_ATTRIBUTES = {\n HTTP_REQUEST_METHOD: 'http.request.method',\n HTTP_RESPONSE_STATUS_CODE: 'http.response.status_code',\n URL_PATH: 'url.path',\n URL_QUERY: 'url.query',\n URL_FULL: 'url.full',\n RPC_SYSTEM: 'rpc.system',\n RPC_METHOD: 'rpc.method',\n TANSTACK_TYPE: 'tanstack.type',\n TANSTACK_SERVER_FN_NAME: 'tanstack.server_function.name',\n TANSTACK_SERVER_FN_METHOD: 'tanstack.server_function.method',\n TANSTACK_SERVER_FN_ARGS: 'tanstack.server_function.args',\n TANSTACK_SERVER_FN_RESULT: 'tanstack.server_function.result',\n TANSTACK_LOADER_ROUTE_ID: 'tanstack.loader.route_id',\n TANSTACK_LOADER_TYPE: 'tanstack.loader.type',\n TANSTACK_LOADER_PARAMS: 'tanstack.loader.params',\n TANSTACK_MIDDLEWARE_NAME: 'tanstack.middleware.name',\n TANSTACK_REQUEST_DURATION_MS: 'tanstack.request.duration_ms',\n} as const;\n"]}
|
package/dist/chunk-MNP65ZX7.js
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
// src/browser/loaders.ts
|
|
2
|
-
function traceLoader(loaderFn, config) {
|
|
3
|
-
return loaderFn;
|
|
4
|
-
}
|
|
5
|
-
function traceBeforeLoad(beforeLoadFn, config) {
|
|
6
|
-
return beforeLoadFn;
|
|
7
|
-
}
|
|
8
|
-
function createTracedRoute(routeId, config) {
|
|
9
|
-
return {
|
|
10
|
-
loader(loaderFn) {
|
|
11
|
-
return loaderFn;
|
|
12
|
-
},
|
|
13
|
-
beforeLoad(beforeLoadFn) {
|
|
14
|
-
return beforeLoadFn;
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export { createTracedRoute, traceBeforeLoad, traceLoader };
|
|
20
|
-
//# sourceMappingURL=chunk-MNP65ZX7.js.map
|
|
21
|
-
//# sourceMappingURL=chunk-MNP65ZX7.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/browser/loaders.ts"],"names":[],"mappings":";AAuBO,SAAS,WAAA,CAEd,UAAa,MAAA,EAA+B;AAE5C,EAAA,OAAO,QAAA;AACT;AAKO,SAAS,eAAA,CAEd,cAAiB,MAAA,EAA+B;AAEhD,EAAA,OAAO,YAAA;AACT;AAKO,SAAS,iBAAA,CACd,SACA,MAAA,EACA;AAGA,EAAA,OAAO;AAAA,IACL,OACE,QAAA,EACG;AACH,MAAA,OAAO,QAAA;AAAA,IACT,CAAA;AAAA,IACA,WACE,YAAA,EACG;AACH,MAAA,OAAO,YAAA;AAAA,IACT;AAAA,GACF;AACF","file":"chunk-MNP65ZX7.js","sourcesContent":["/**\n * Browser stub for loaders module\n *\n * In browser environments, these functions are no-ops that just call the\n * original functions without any tracing overhead.\n */\n\nimport type { TraceLoaderConfig } from './types';\n\n/**\n * Loader context type (compatible with TanStack router loader context)\n */\ninterface LoaderContext {\n params?: Record<string, string>;\n route?: {\n id?: string;\n };\n [key: string]: unknown;\n}\n\n/**\n * Browser stub: Returns the loader function unchanged\n */\nexport function traceLoader<\n T extends (context: LoaderContext) => Promise<unknown>,\n>(loaderFn: T, config?: TraceLoaderConfig): T {\n void config;\n return loaderFn;\n}\n\n/**\n * Browser stub: Returns the beforeLoad function unchanged\n */\nexport function traceBeforeLoad<\n T extends (context: LoaderContext) => Promise<unknown>,\n>(beforeLoadFn: T, config?: TraceLoaderConfig): T {\n void config;\n return beforeLoadFn;\n}\n\n/**\n * Browser stub: Returns object with pass-through wrappers\n */\nexport function createTracedRoute(\n routeId: string,\n config?: Omit<TraceLoaderConfig, 'name'>,\n) {\n void routeId;\n void config;\n return {\n loader<T extends (context: LoaderContext) => Promise<unknown>>(\n loaderFn: T,\n ): T {\n return loaderFn;\n },\n beforeLoad<T extends (context: LoaderContext) => Promise<unknown>>(\n beforeLoadFn: T,\n ): T {\n return beforeLoadFn;\n },\n };\n}\n"]}
|
package/dist/chunk-NTY64BKS.js
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { ROOT_CONTEXT, propagation, context } from '@opentelemetry/api';
|
|
2
|
-
|
|
3
|
-
// src/context.ts
|
|
4
|
-
function extractContextFromRequest(request) {
|
|
5
|
-
const carrier = {};
|
|
6
|
-
const traceparent = request.headers.get("traceparent");
|
|
7
|
-
const tracestate = request.headers.get("tracestate");
|
|
8
|
-
const baggage = request.headers.get("baggage");
|
|
9
|
-
if (traceparent) carrier.traceparent = traceparent;
|
|
10
|
-
if (tracestate) carrier.tracestate = tracestate;
|
|
11
|
-
if (baggage) carrier.baggage = baggage;
|
|
12
|
-
if (Object.keys(carrier).length === 0) {
|
|
13
|
-
return ROOT_CONTEXT;
|
|
14
|
-
}
|
|
15
|
-
return propagation.extract(context.active(), carrier);
|
|
16
|
-
}
|
|
17
|
-
function injectContextToHeaders(headers, ctx) {
|
|
18
|
-
const carrier = {};
|
|
19
|
-
propagation.inject(ctx ?? context.active(), carrier);
|
|
20
|
-
for (const [key, value] of Object.entries(carrier)) {
|
|
21
|
-
headers.set(key, value);
|
|
22
|
-
}
|
|
23
|
-
return headers;
|
|
24
|
-
}
|
|
25
|
-
function createTracedHeaders(existingHeaders, ctx) {
|
|
26
|
-
const headers = new Headers(existingHeaders);
|
|
27
|
-
return injectContextToHeaders(headers, ctx);
|
|
28
|
-
}
|
|
29
|
-
function runInContext(parentContext, fn) {
|
|
30
|
-
return context.with(parentContext, fn);
|
|
31
|
-
}
|
|
32
|
-
function getActiveContext() {
|
|
33
|
-
return context.active();
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export { createTracedHeaders, extractContextFromRequest, getActiveContext, injectContextToHeaders, runInContext };
|
|
37
|
-
//# sourceMappingURL=chunk-NTY64BKS.js.map
|
|
38
|
-
//# sourceMappingURL=chunk-NTY64BKS.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/context.ts"],"names":[],"mappings":";;;AAkCO,SAAS,0BAA0B,OAAA,EAA2B;AACnE,EAAA,MAAM,UAAkC,EAAC;AAGzC,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAA;AACrD,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA;AAE7C,EAAA,IAAI,WAAA,UAAqB,WAAA,GAAc,WAAA;AACvC,EAAA,IAAI,UAAA,UAAoB,UAAA,GAAa,UAAA;AACrC,EAAA,IAAI,OAAA,UAAiB,OAAA,GAAU,OAAA;AAG/B,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,WAAW,CAAA,EAAG;AACrC,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,OAAO,WAAA,CAAY,OAAA,CAAQ,OAAA,CAAQ,MAAA,IAAU,OAAO,CAAA;AACtD;AAqBO,SAAS,sBAAA,CACd,SACA,GAAA,EACS;AACT,EAAA,MAAM,UAAkC,EAAC;AACzC,EAAA,WAAA,CAAY,MAAA,CAAO,GAAA,IAAO,OAAA,CAAQ,MAAA,IAAU,OAAO,CAAA;AAEnD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AAClD,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,KAAK,CAAA;AAAA,EACxB;AAEA,EAAA,OAAO,OAAA;AACT;AAsBO,SAAS,mBAAA,CACd,iBACA,GAAA,EACS;AACT,EAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,eAAe,CAAA;AAC3C,EAAA,OAAO,sBAAA,CAAuB,SAAS,GAAG,CAAA;AAC5C;AAoBO,SAAS,YAAA,CAAgB,eAAwB,EAAA,EAAgB;AACtE,EAAA,OAAO,OAAA,CAAQ,IAAA,CAAK,aAAA,EAAe,EAAE,CAAA;AACvC;AAOO,SAAS,gBAAA,GAA4B;AAC1C,EAAA,OAAO,QAAQ,MAAA,EAAO;AACxB","file":"chunk-NTY64BKS.js","sourcesContent":["import {\n context,\n propagation,\n type Context,\n ROOT_CONTEXT,\n} from '@opentelemetry/api';\n\n/**\n * Type representing values that can be used to initialize Headers\n * This is equivalent to the DOM's HeadersInit type but works in Node.js\n */\nexport type HeadersInitType =\n | Headers\n | Record<string, string>\n | [string, string][];\n\n/**\n * Extract OpenTelemetry context from HTTP request headers\n *\n * This function extracts W3C Trace Context (traceparent, tracestate)\n * and Baggage from request headers to enable distributed tracing.\n *\n * @param request - The incoming HTTP request\n * @returns OpenTelemetry context with extracted trace information\n *\n * @example\n * ```typescript\n * const parentContext = extractContextFromRequest(request);\n * context.with(parentContext, async () => {\n * // Spans created here will be children of the extracted context\n * await trace('my-operation', async (ctx) => { ... });\n * });\n * ```\n */\nexport function extractContextFromRequest(request: Request): Context {\n const carrier: Record<string, string> = {};\n\n // Extract W3C Trace Context headers\n const traceparent = request.headers.get('traceparent');\n const tracestate = request.headers.get('tracestate');\n const baggage = request.headers.get('baggage');\n\n if (traceparent) carrier.traceparent = traceparent;\n if (tracestate) carrier.tracestate = tracestate;\n if (baggage) carrier.baggage = baggage;\n\n // Return ROOT_CONTEXT if no trace headers present\n if (Object.keys(carrier).length === 0) {\n return ROOT_CONTEXT;\n }\n\n return propagation.extract(context.active(), carrier);\n}\n\n/**\n * Inject OpenTelemetry context into HTTP headers\n *\n * This function injects W3C Trace Context (traceparent, tracestate)\n * and Baggage into headers for outgoing requests.\n *\n * @param headers - Headers object to inject context into\n * @param ctx - Optional context to inject (defaults to active context)\n * @returns The headers object with injected trace context\n *\n * @example\n * ```typescript\n * const headers = new Headers();\n * injectContextToHeaders(headers);\n *\n * // Now use headers in outgoing fetch\n * await fetch('https://api.example.com', { headers });\n * ```\n */\nexport function injectContextToHeaders(\n headers: Headers,\n ctx?: Context,\n): Headers {\n const carrier: Record<string, string> = {};\n propagation.inject(ctx ?? context.active(), carrier);\n\n for (const [key, value] of Object.entries(carrier)) {\n headers.set(key, value);\n }\n\n return headers;\n}\n\n/**\n * Create a new Headers object with injected trace context\n *\n * Convenience function that creates a new Headers object\n * with the current trace context already injected.\n *\n * @param existingHeaders - Optional existing headers to include\n * @param ctx - Optional context to inject (defaults to active context)\n * @returns New Headers object with trace context\n *\n * @example\n * ```typescript\n * const headers = createTracedHeaders({ 'Content-Type': 'application/json' });\n * await fetch('https://api.example.com', {\n * method: 'POST',\n * headers,\n * body: JSON.stringify(data),\n * });\n * ```\n */\nexport function createTracedHeaders(\n existingHeaders?: HeadersInitType,\n ctx?: Context,\n): Headers {\n const headers = new Headers(existingHeaders);\n return injectContextToHeaders(headers, ctx);\n}\n\n/**\n * Run a function within a specific OpenTelemetry context\n *\n * This is a convenience wrapper around context.with() that\n * provides better TypeScript inference.\n *\n * @param parentContext - The context to run within\n * @param fn - The function to execute\n * @returns The result of the function\n *\n * @example\n * ```typescript\n * const parentContext = extractContextFromRequest(request);\n * const result = await runInContext(parentContext, async () => {\n * return await processRequest();\n * });\n * ```\n */\nexport function runInContext<T>(parentContext: Context, fn: () => T): T {\n return context.with(parentContext, fn);\n}\n\n/**\n * Get the current active context\n *\n * @returns The current active OpenTelemetry context\n */\nexport function getActiveContext(): Context {\n return context.active();\n}\n"]}
|
package/dist/chunk-UMEJU65Q.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
// src/browser/metrics.ts
|
|
2
|
-
function getMetrics() {
|
|
3
|
-
return {
|
|
4
|
-
requestCount: 0,
|
|
5
|
-
errorCount: 0,
|
|
6
|
-
avgLatency: 0,
|
|
7
|
-
p50Latency: 0,
|
|
8
|
-
p95Latency: 0,
|
|
9
|
-
p99Latency: 0,
|
|
10
|
-
requestsPerSecond: 0,
|
|
11
|
-
endpoints: {}
|
|
12
|
-
};
|
|
13
|
-
}
|
|
14
|
-
function recordTiming(name, durationMs) {
|
|
15
|
-
}
|
|
16
|
-
function recordError(name) {
|
|
17
|
-
}
|
|
18
|
-
function resetMetrics() {
|
|
19
|
-
}
|
|
20
|
-
var metricsCollector = {
|
|
21
|
-
recordTiming,
|
|
22
|
-
recordError,
|
|
23
|
-
getMetrics,
|
|
24
|
-
reset: resetMetrics
|
|
25
|
-
};
|
|
26
|
-
function createMetricsHandler() {
|
|
27
|
-
return () => {
|
|
28
|
-
return Response.json(getMetrics());
|
|
29
|
-
};
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
export { createMetricsHandler, getMetrics, metricsCollector, recordError, recordTiming, resetMetrics };
|
|
33
|
-
//# sourceMappingURL=chunk-UMEJU65Q.js.map
|
|
34
|
-
//# sourceMappingURL=chunk-UMEJU65Q.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/browser/metrics.ts"],"names":[],"mappings":";AA+BO,SAAS,UAAA,GAA0B;AACxC,EAAA,OAAO;AAAA,IACL,YAAA,EAAc,CAAA;AAAA,IACd,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY,CAAA;AAAA,IACZ,iBAAA,EAAmB,CAAA;AAAA,IACnB,WAAW;AAAC,GACd;AACF;AAKO,SAAS,YAAA,CAAa,MAAc,UAAA,EAA0B;AAIrE;AAKO,SAAS,YAAY,IAAA,EAAoB;AAGhD;AAKO,SAAS,YAAA,GAAqB;AAErC;AAKO,IAAM,gBAAA,GAAmB;AAAA,EAC9B,YAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA;AAAA,EACA,KAAA,EAAO;AACT;AAKO,SAAS,oBAAA,GAAuC;AACrD,EAAA,OAAO,MAAM;AACX,IAAA,OAAO,QAAA,CAAS,IAAA,CAAK,UAAA,EAAY,CAAA;AAAA,EACnC,CAAA;AACF","file":"chunk-UMEJU65Q.js","sourcesContent":["/**\n * Browser stub for metrics module\n *\n * Metrics collection only happens on the server.\n * In browser, these are no-op functions.\n */\n\n/**\n * Metrics data structure (stub)\n */\nexport interface MetricsData {\n requestCount: number;\n errorCount: number;\n avgLatency: number;\n p50Latency: number;\n p95Latency: number;\n p99Latency: number;\n requestsPerSecond: number;\n endpoints: Record<\n string,\n {\n count: number;\n errors: number;\n avgLatency: number;\n }\n >;\n}\n\n/**\n * Browser stub: Returns empty metrics\n */\nexport function getMetrics(): MetricsData {\n return {\n requestCount: 0,\n errorCount: 0,\n avgLatency: 0,\n p50Latency: 0,\n p95Latency: 0,\n p99Latency: 0,\n requestsPerSecond: 0,\n endpoints: {},\n };\n}\n\n/**\n * Browser stub: No-op\n */\nexport function recordTiming(name: string, durationMs: number): void {\n void name;\n void durationMs;\n // No-op in browser\n}\n\n/**\n * Browser stub: No-op\n */\nexport function recordError(name: string): void {\n void name;\n // No-op in browser\n}\n\n/**\n * Browser stub: No-op\n */\nexport function resetMetrics(): void {\n // No-op in browser\n}\n\n/**\n * Browser stub: No-op metrics collector\n */\nexport const metricsCollector = {\n recordTiming: recordTiming,\n recordError: recordError,\n getMetrics: getMetrics,\n reset: resetMetrics,\n};\n\n/**\n * Browser stub: Returns JSON Response with empty metrics\n */\nexport function createMetricsHandler(): () => Response {\n return () => {\n return Response.json(getMetrics());\n };\n}\n"]}
|
package/dist/chunk-UTPW3QRT.js
DELETED
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import { isServerSide } from './chunk-EUYFVNYE.js';
|
|
2
|
-
|
|
3
|
-
// src/debug-headers.ts
|
|
4
|
-
function debugHeadersMiddleware(config = {}) {
|
|
5
|
-
if (!isServerSide()) {
|
|
6
|
-
return async function debugHeadersHandler(opts) {
|
|
7
|
-
return opts.next();
|
|
8
|
-
};
|
|
9
|
-
}
|
|
10
|
-
const enabled = config.enabled ?? (typeof process !== "undefined" && process.env.NODE_ENV === "development");
|
|
11
|
-
return async function debugHeadersHandler(opts) {
|
|
12
|
-
const { next, request } = opts;
|
|
13
|
-
if (!enabled || !request) {
|
|
14
|
-
return next();
|
|
15
|
-
}
|
|
16
|
-
const result = await next();
|
|
17
|
-
if (!(result instanceof Response)) {
|
|
18
|
-
return result;
|
|
19
|
-
}
|
|
20
|
-
const response = result;
|
|
21
|
-
const newHeaders = new Headers(response.headers);
|
|
22
|
-
newHeaders.set("X-Debug-Timestamp", (/* @__PURE__ */ new Date()).toISOString());
|
|
23
|
-
newHeaders.set("X-Debug-Node-Version", process.version);
|
|
24
|
-
newHeaders.set("X-Debug-Uptime", Math.floor(process.uptime()).toString());
|
|
25
|
-
try {
|
|
26
|
-
const { trace } = await import('@opentelemetry/api');
|
|
27
|
-
const activeSpan = trace.getActiveSpan();
|
|
28
|
-
if (activeSpan) {
|
|
29
|
-
const spanContext = activeSpan.spanContext();
|
|
30
|
-
if (spanContext.traceId) {
|
|
31
|
-
newHeaders.set("X-Debug-Trace-Id", spanContext.traceId);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
} catch {
|
|
35
|
-
}
|
|
36
|
-
if (config.customHeaders) {
|
|
37
|
-
for (const [key, value] of Object.entries(config.customHeaders)) {
|
|
38
|
-
const headerValue = typeof value === "function" ? value() : value;
|
|
39
|
-
newHeaders.set(`X-Debug-${key}`, headerValue);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return new Response(response.body, {
|
|
43
|
-
status: response.status,
|
|
44
|
-
statusText: response.statusText,
|
|
45
|
-
headers: newHeaders
|
|
46
|
-
});
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
export { debugHeadersMiddleware };
|
|
51
|
-
//# sourceMappingURL=chunk-UTPW3QRT.js.map
|
|
52
|
-
//# sourceMappingURL=chunk-UTPW3QRT.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/debug-headers.ts"],"names":[],"mappings":";;;AAyCO,SAAS,sBAAA,CACd,MAAA,GAA6B,EAAC,EACX;AAEnB,EAAA,IAAI,CAAC,cAAa,EAAG;AACnB,IAAA,OAAO,eAAe,oBAAoB,IAAA,EAAM;AAC9C,MAAA,OAAO,KAAK,IAAA,EAAK;AAAA,IACnB,CAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GACJ,OAAO,OAAA,KACN,OAAO,YAAY,WAAA,IAAe,OAAA,CAAQ,IAAI,QAAA,KAAa,aAAA,CAAA;AAE9D,EAAA,OAAO,eAAe,oBAAoB,IAAA,EAAM;AAC9C,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,IAAA;AAE1B,IAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,EAAS;AACxB,MAAA,OAAO,IAAA,EAAK;AAAA,IACd;AAEA,IAAA,MAAM,MAAA,GAAS,MAAM,IAAA,EAAK;AAG1B,IAAA,IAAI,EAAE,kBAAkB,QAAA,CAAA,EAAW;AACjC,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,QAAA,GAAW,MAAA;AAGjB,IAAA,MAAM,UAAA,GAAa,IAAI,OAAA,CAAQ,QAAA,CAAS,OAAO,CAAA;AAG/C,IAAA,UAAA,CAAW,IAAI,mBAAA,EAAA,iBAAqB,IAAI,IAAA,EAAK,EAAE,aAAa,CAAA;AAC5D,IAAA,UAAA,CAAW,GAAA,CAAI,sBAAA,EAAwB,OAAA,CAAQ,OAAO,CAAA;AACtD,IAAA,UAAA,CAAW,GAAA,CAAI,kBAAkB,IAAA,CAAK,KAAA,CAAM,QAAQ,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAU,CAAA;AAGxE,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,OAAO,oBAAoB,CAAA;AACnD,MAAA,MAAM,UAAA,GAAa,MAAM,aAAA,EAAc;AACvC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA,MAAM,WAAA,GAAc,WAAW,WAAA,EAAY;AAC3C,QAAA,IAAI,YAAY,OAAA,EAAS;AACvB,UAAA,UAAA,CAAW,GAAA,CAAI,kBAAA,EAAoB,WAAA,CAAY,OAAO,CAAA;AAAA,QACxD;AAAA,MACF;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAGA,IAAA,IAAI,OAAO,aAAA,EAAe;AACxB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,aAAa,CAAA,EAAG;AAC/D,QAAA,MAAM,WAAA,GAAc,OAAO,KAAA,KAAU,UAAA,GAAa,OAAM,GAAI,KAAA;AAC5D,QAAA,UAAA,CAAW,GAAA,CAAI,CAAA,QAAA,EAAW,GAAG,CAAA,CAAA,EAAI,WAAW,CAAA;AAAA,MAC9C;AAAA,IACF;AAGA,IAAA,OAAO,IAAI,QAAA,CAAS,QAAA,CAAS,IAAA,EAAM;AAAA,MACjC,QAAQ,QAAA,CAAS,MAAA;AAAA,MACjB,YAAY,QAAA,CAAS,UAAA;AAAA,MACrB,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH,CAAA;AACF","file":"chunk-UTPW3QRT.js","sourcesContent":["import { isServerSide } from './env';\nimport type { MiddlewareHandler } from './middleware';\n\n/**\n * Configuration for debug headers middleware\n */\nexport interface DebugHeadersConfig {\n /**\n * Whether to enable debug headers\n * @default process.env.NODE_ENV === 'development'\n */\n enabled?: boolean;\n\n /**\n * Custom headers to add\n */\n customHeaders?: Record<string, string | (() => string)>;\n}\n\n/**\n * Create middleware that adds debug headers to responses in development\n *\n * Adds helpful debug information to response headers:\n * - X-Debug-Timestamp: Request timestamp\n * - X-Debug-Node-Version: Node.js version\n * - X-Debug-Uptime: Process uptime in seconds\n * - X-Debug-Trace-Id: Current trace ID (if available)\n *\n * @param config - Configuration options\n * @returns Middleware handler\n *\n * @example\n * ```typescript\n * import { createStart } from '@tanstack/react-start';\n * import { debugHeadersMiddleware } from 'autotel-tanstack/debug-headers';\n *\n * export const startInstance = createStart(() => ({\n * requestMiddleware: [debugHeadersMiddleware()],\n * }));\n * ```\n */\nexport function debugHeadersMiddleware(\n config: DebugHeadersConfig = {},\n): MiddlewareHandler {\n // If we're in the browser, return a no-op middleware\n if (!isServerSide()) {\n return async function debugHeadersHandler(opts) {\n return opts.next();\n };\n }\n\n const enabled =\n config.enabled ??\n (typeof process !== 'undefined' && process.env.NODE_ENV === 'development');\n\n return async function debugHeadersHandler(opts) {\n const { next, request } = opts;\n\n if (!enabled || !request) {\n return next();\n }\n\n const result = await next();\n\n // Check if result is a Response\n if (!(result instanceof Response)) {\n return result;\n }\n\n const response = result;\n\n // Clone response to add headers (responses are immutable)\n const newHeaders = new Headers(response.headers);\n\n // Add standard debug headers\n newHeaders.set('X-Debug-Timestamp', new Date().toISOString());\n newHeaders.set('X-Debug-Node-Version', process.version);\n newHeaders.set('X-Debug-Uptime', Math.floor(process.uptime()).toString());\n\n // Add trace ID if available\n try {\n const { trace } = await import('@opentelemetry/api');\n const activeSpan = trace.getActiveSpan();\n if (activeSpan) {\n const spanContext = activeSpan.spanContext();\n if (spanContext.traceId) {\n newHeaders.set('X-Debug-Trace-Id', spanContext.traceId);\n }\n }\n } catch {\n // OpenTelemetry not available, skip trace ID\n }\n\n // Add custom headers\n if (config.customHeaders) {\n for (const [key, value] of Object.entries(config.customHeaders)) {\n const headerValue = typeof value === 'function' ? value() : value;\n newHeaders.set(`X-Debug-${key}`, headerValue);\n }\n }\n\n // Return new response with debug headers\n return new Response(response.body, {\n status: response.status,\n statusText: response.statusText,\n headers: newHeaders,\n });\n };\n}\n"]}
|
package/dist/chunk-V3RO5N2M.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/browser/handlers.ts"],"names":[],"mappings":";AAiBO,SAAS,iBACd,MAAA,EAC+C;AAE/C,EAAA,OAAO,CAAC,OAAA,KAAY,OAAA;AACtB","file":"chunk-V3RO5N2M.js","sourcesContent":["/**\n * Browser stub for handlers module\n *\n * Handler wrapping only applies on the server side.\n * In browser, we just return the handler unchanged.\n */\n\nimport type { WrapStartHandlerConfig } from './types';\n\n/**\n * Handler type\n */\nexport type StartHandler<T = unknown> = (request: Request) => Promise<T>;\n\n/**\n * Browser stub: Returns the handler unchanged\n */\nexport function wrapStartHandler<T>(\n config?: WrapStartHandlerConfig,\n): (handler: StartHandler<T>) => StartHandler<T> {\n void config;\n return (handler) => handler;\n}\n"]}
|
package/dist/chunk-XXBHZR3M.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
// src/error-reporting.ts
|
|
2
|
-
var ErrorStore = class {
|
|
3
|
-
errors = /* @__PURE__ */ new Map();
|
|
4
|
-
maxErrors = 100;
|
|
5
|
-
// Limit memory usage
|
|
6
|
-
/**
|
|
7
|
-
* Report an error
|
|
8
|
-
*/
|
|
9
|
-
reportError(error, context) {
|
|
10
|
-
const key = `${error.name}:${error.message}`;
|
|
11
|
-
const existing = this.errors.get(key);
|
|
12
|
-
if (existing) {
|
|
13
|
-
existing.count++;
|
|
14
|
-
existing.lastSeen = /* @__PURE__ */ new Date();
|
|
15
|
-
if (context) {
|
|
16
|
-
existing.error.context = {
|
|
17
|
-
...existing.error.context,
|
|
18
|
-
...context
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
return key;
|
|
22
|
-
}
|
|
23
|
-
const report = {
|
|
24
|
-
id: key,
|
|
25
|
-
count: 1,
|
|
26
|
-
lastSeen: /* @__PURE__ */ new Date(),
|
|
27
|
-
error: {
|
|
28
|
-
name: error.name,
|
|
29
|
-
message: error.message,
|
|
30
|
-
stack: error.stack,
|
|
31
|
-
context
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
this.errors.set(key, report);
|
|
35
|
-
if (this.errors.size > this.maxErrors) {
|
|
36
|
-
const entries = [...this.errors.entries()];
|
|
37
|
-
const oldest = entries.toSorted(
|
|
38
|
-
(a, b) => a[1].lastSeen.getTime() - b[1].lastSeen.getTime()
|
|
39
|
-
)[0];
|
|
40
|
-
this.errors.delete(oldest[0]);
|
|
41
|
-
}
|
|
42
|
-
console.error("[ERROR REPORTED]:", {
|
|
43
|
-
error: error.message,
|
|
44
|
-
count: 1,
|
|
45
|
-
context
|
|
46
|
-
});
|
|
47
|
-
return key;
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Get all error reports
|
|
51
|
-
*/
|
|
52
|
-
getAllErrors() {
|
|
53
|
-
return [...this.errors.values()];
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Get a specific error by ID
|
|
57
|
-
*/
|
|
58
|
-
getError(id) {
|
|
59
|
-
return this.errors.get(id);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Clear all errors
|
|
63
|
-
*/
|
|
64
|
-
clear() {
|
|
65
|
-
this.errors.clear();
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Clear a specific error
|
|
69
|
-
*/
|
|
70
|
-
clearError(id) {
|
|
71
|
-
this.errors.delete(id);
|
|
72
|
-
}
|
|
73
|
-
};
|
|
74
|
-
var errorStore = new ErrorStore();
|
|
75
|
-
function reportError(error, context) {
|
|
76
|
-
return errorStore.reportError(error, context);
|
|
77
|
-
}
|
|
78
|
-
function createErrorReportingHandler() {
|
|
79
|
-
return async () => {
|
|
80
|
-
const { json } = await import('@tanstack/react-start');
|
|
81
|
-
return json({
|
|
82
|
-
errors: errorStore.getAllErrors()
|
|
83
|
-
});
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
function withErrorReporting(fn, context) {
|
|
87
|
-
return async (...args) => {
|
|
88
|
-
try {
|
|
89
|
-
return await fn(...args);
|
|
90
|
-
} catch (error) {
|
|
91
|
-
reportError(error, context);
|
|
92
|
-
throw error;
|
|
93
|
-
}
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export { createErrorReportingHandler, errorStore, reportError, withErrorReporting };
|
|
98
|
-
//# sourceMappingURL=chunk-XXBHZR3M.js.map
|
|
99
|
-
//# sourceMappingURL=chunk-XXBHZR3M.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/error-reporting.ts"],"names":[],"mappings":"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","file":"chunk-XXBHZR3M.js","sourcesContent":["/**\n * Error reporting utilities for TanStack Start\n *\n * Provides basic error reporting without external dependencies,\n * following the patterns from TanStack Start observability guide.\n */\n\n/**\n * Error report data structure\n */\nexport interface ErrorReport {\n id: string;\n count: number;\n lastSeen: Date;\n error: {\n name: string;\n message: string;\n stack?: string;\n context?: unknown;\n };\n}\n\n/**\n * Error store for in-memory error tracking\n *\n * Stores error reports with deduplication by error name + message.\n * Thread-safe for concurrent access.\n */\nclass ErrorStore {\n private errors = new Map<string, ErrorReport>();\n private readonly maxErrors = 100; // Limit memory usage\n\n /**\n * Report an error\n */\n reportError(error: Error, context?: unknown): string {\n const key = `${error.name}:${error.message}`;\n const existing = this.errors.get(key);\n\n if (existing) {\n existing.count++;\n existing.lastSeen = new Date();\n if (context) {\n // Merge context\n existing.error.context = {\n ...(existing.error.context as Record<string, unknown>),\n ...(context as Record<string, unknown>),\n };\n }\n return key;\n }\n\n // Add new error\n const report: ErrorReport = {\n id: key,\n count: 1,\n lastSeen: new Date(),\n error: {\n name: error.name,\n message: error.message,\n stack: error.stack,\n context,\n },\n };\n\n this.errors.set(key, report);\n\n // Limit stored errors\n if (this.errors.size > this.maxErrors) {\n // Remove oldest error\n const entries = [...this.errors.entries()];\n const oldest = entries.toSorted(\n (a: [string, ErrorReport], b: [string, ErrorReport]) =>\n a[1].lastSeen.getTime() - b[1].lastSeen.getTime(),\n )[0];\n this.errors.delete(oldest[0]);\n }\n\n // Log immediately\n console.error('[ERROR REPORTED]:', {\n error: error.message,\n count: 1,\n context,\n });\n\n return key;\n }\n\n /**\n * Get all error reports\n */\n getAllErrors(): ErrorReport[] {\n return [...this.errors.values()];\n }\n\n /**\n * Get a specific error by ID\n */\n getError(id: string): ErrorReport | undefined {\n return this.errors.get(id);\n }\n\n /**\n * Clear all errors\n */\n clear(): void {\n this.errors.clear();\n }\n\n /**\n * Clear a specific error\n */\n clearError(id: string): void {\n this.errors.delete(id);\n }\n}\n\n/**\n * Global error store instance\n */\nexport const errorStore = new ErrorStore();\n\n/**\n * Report an error to the error store\n *\n * @example\n * ```typescript\n * import { reportError } from 'autotel-tanstack/error-reporting';\n *\n * try {\n * await riskyOperation();\n * } catch (error) {\n * reportError(error as Error, {\n * userId: context.userId,\n * operation: 'riskyOperation',\n * });\n * throw error;\n * }\n * ```\n */\nexport function reportError(error: Error, context?: unknown): string {\n return errorStore.reportError(error, context);\n}\n\n/**\n * Create an error reporting endpoint handler\n *\n * Returns a handler that exposes error reports in JSON format.\n * Use this to create an `/admin/errors` endpoint.\n *\n * @example\n * ```typescript\n * // routes/admin/errors.ts\n * import { createFileRoute } from '@tanstack/react-router';\n * import { json } from '@tanstack/react-start';\n * import { createErrorReportingHandler } from 'autotel-tanstack/error-reporting';\n *\n * export const Route = createFileRoute('/admin/errors')({\n * server: {\n * handlers: {\n * GET: createErrorReportingHandler(),\n * },\n * },\n * });\n * ```\n */\nexport function createErrorReportingHandler() {\n return async () => {\n const { json } = await import('@tanstack/react-start');\n\n return json({\n errors: errorStore.getAllErrors(),\n });\n };\n}\n\n/**\n * Wrap a function with automatic error reporting\n *\n * Automatically reports errors to the error store.\n *\n * @example\n * ```typescript\n * import { withErrorReporting } from 'autotel-tanstack/error-reporting';\n *\n * const riskyOperation = createServerFn()\n * .handler(withErrorReporting(async () => {\n * return await performOperation();\n * }, { operation: 'riskyOperation' }));\n * ```\n */\nexport function withErrorReporting<TArgs extends unknown[], TReturn>(\n fn: (...args: TArgs) => Promise<TReturn>,\n context?: Record<string, unknown>,\n): (...args: TArgs) => Promise<TReturn> {\n return async (...args: TArgs): Promise<TReturn> => {\n try {\n return await fn(...args);\n } catch (error) {\n reportError(error as Error, context);\n throw error;\n }\n };\n}\n"]}
|