@sentry/nitro 10.53.0 → 10.54.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/build/esm/config.js +1 -15
- package/build/esm/config.js.map +1 -1
- package/build/esm/instruments/instrumentServer.js +1 -5
- package/build/esm/instruments/instrumentServer.js.map +1 -1
- package/build/esm/module.js +3 -6
- package/build/esm/module.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/runtime/hooks/captureErrorHook.js +5 -29
- package/build/esm/runtime/hooks/captureErrorHook.js.map +1 -1
- package/build/esm/runtime/hooks/captureStorageEvents.js +34 -69
- package/build/esm/runtime/hooks/captureStorageEvents.js.map +1 -1
- package/build/esm/runtime/hooks/captureTracingEvents.js +50 -115
- package/build/esm/runtime/hooks/captureTracingEvents.js.map +1 -1
- package/build/esm/runtime/hooks/setServerTimingHeaders.js +3 -10
- package/build/esm/runtime/hooks/setServerTimingHeaders.js.map +1 -1
- package/build/esm/runtime/plugins/server.js +2 -3
- package/build/esm/runtime/plugins/server.js.map +1 -1
- package/build/esm/sdk.js +3 -16
- package/build/esm/sdk.js.map +1 -1
- package/build/esm/sourceMaps.js +26 -107
- package/build/esm/sourceMaps.js.map +1 -1
- package/build/esm/utils/plugin.js +0 -3
- package/build/esm/utils/plugin.js.map +1 -1
- package/build/esm/utils/resolver.js +2 -11
- package/build/esm/utils/resolver.js.map +1 -1
- package/package.json +5 -5
|
@@ -2,246 +2,181 @@ import { GLOBAL_OBJ, parseStringToURLObject, getHttpSpanDetailsFromUrlObject, st
|
|
|
2
2
|
import { tracingChannel } from '@sentry/opentelemetry/tracing-channel';
|
|
3
3
|
import { setServerTimingHeaders } from './setServerTimingHeaders.js';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
* Global object with the trace channels
|
|
7
|
-
*/
|
|
8
|
-
const globalWithTraceChannels = GLOBAL_OBJ
|
|
9
|
-
|
|
10
|
-
;
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Captures tracing events emitted by Nitro tracing channels.
|
|
14
|
-
*/
|
|
5
|
+
const globalWithTraceChannels = GLOBAL_OBJ;
|
|
15
6
|
function captureTracingEvents() {
|
|
16
7
|
if (globalWithTraceChannels.__SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__) {
|
|
17
8
|
return;
|
|
18
9
|
}
|
|
19
|
-
|
|
20
10
|
setupH3TracingChannels();
|
|
21
11
|
setupSrvxTracingChannels();
|
|
22
12
|
globalWithTraceChannels.__SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__ = true;
|
|
23
13
|
}
|
|
24
|
-
|
|
25
|
-
/**
|
|
26
|
-
* Extracts the HTTP status code from a tracing channel result.
|
|
27
|
-
* The result is the return value of the traced handler, which is a Response for srvx
|
|
28
|
-
* and may or may not be a Response for h3.
|
|
29
|
-
*/
|
|
30
14
|
function getResponseStatusCode(result) {
|
|
31
|
-
if (result && typeof result ===
|
|
15
|
+
if (result && typeof result === "object" && "status" in result && typeof result.status === "number") {
|
|
32
16
|
return result.status;
|
|
33
17
|
}
|
|
34
|
-
return
|
|
18
|
+
return void 0;
|
|
35
19
|
}
|
|
36
|
-
|
|
37
20
|
function onTraceEnd(data) {
|
|
38
21
|
const statusCode = getResponseStatusCode(data.result);
|
|
39
|
-
if (data._sentrySpan && statusCode !==
|
|
22
|
+
if (data._sentrySpan && statusCode !== void 0) {
|
|
40
23
|
setHttpStatus(data._sentrySpan, statusCode);
|
|
41
24
|
}
|
|
42
|
-
|
|
43
25
|
data._sentrySpan?.end();
|
|
44
26
|
}
|
|
45
|
-
|
|
46
27
|
function onTraceError(data) {
|
|
47
|
-
captureException(data.error, { mechanism: { type:
|
|
48
|
-
data._sentrySpan?.setStatus({ code: SPAN_STATUS_ERROR, message:
|
|
28
|
+
captureException(data.error, { mechanism: { type: "auto.http.nitro.onTraceError", handled: false } });
|
|
29
|
+
data._sentrySpan?.setStatus({ code: SPAN_STATUS_ERROR, message: "internal_error" });
|
|
49
30
|
data._sentrySpan?.end();
|
|
50
31
|
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Extracts the parameterized route pattern from the h3 event context.
|
|
54
|
-
*/
|
|
55
32
|
function getParameterizedRoute(event) {
|
|
56
33
|
const matchedRoute = event.context?.matchedRoute;
|
|
57
34
|
if (!matchedRoute) {
|
|
58
|
-
return
|
|
35
|
+
return void 0;
|
|
59
36
|
}
|
|
60
|
-
|
|
61
37
|
const routePath = matchedRoute.route;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
if (!routePath || routePath === '/**') {
|
|
65
|
-
return undefined;
|
|
38
|
+
if (!routePath || routePath === "/**") {
|
|
39
|
+
return void 0;
|
|
66
40
|
}
|
|
67
|
-
|
|
68
41
|
return routePath;
|
|
69
42
|
}
|
|
70
|
-
|
|
71
43
|
function setupH3TracingChannels() {
|
|
72
|
-
const h3Channel = tracingChannel(
|
|
44
|
+
const h3Channel = tracingChannel("h3.request", (data) => {
|
|
73
45
|
const parsedUrl = parseStringToURLObject(data.event.url.href);
|
|
74
46
|
const routePattern = getParameterizedRoute(data.event);
|
|
75
|
-
|
|
76
47
|
const [spanName, urlAttributes] = getHttpSpanDetailsFromUrlObject(
|
|
77
48
|
parsedUrl,
|
|
78
|
-
|
|
79
|
-
|
|
49
|
+
"server",
|
|
50
|
+
"auto.http.nitro.h3",
|
|
80
51
|
{ method: data.event.req.method },
|
|
81
|
-
routePattern
|
|
52
|
+
routePattern
|
|
82
53
|
);
|
|
83
|
-
|
|
84
54
|
return startSpanManual(
|
|
85
55
|
{
|
|
86
56
|
name: spanName,
|
|
87
57
|
attributes: {
|
|
88
58
|
...urlAttributes,
|
|
89
|
-
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]:
|
|
90
|
-
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: data?.type ===
|
|
91
|
-
}
|
|
59
|
+
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.http.nitro.h3",
|
|
60
|
+
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: data?.type === "middleware" ? "middleware.nitro" : "http.server"
|
|
61
|
+
}
|
|
92
62
|
},
|
|
93
|
-
span => {
|
|
63
|
+
(span) => {
|
|
94
64
|
setParameterizedRouteAttributes(span, data.event);
|
|
95
|
-
|
|
96
65
|
return span;
|
|
97
|
-
}
|
|
66
|
+
}
|
|
98
67
|
);
|
|
99
68
|
});
|
|
100
|
-
|
|
101
69
|
h3Channel.subscribe({
|
|
102
70
|
start: (data) => {
|
|
103
71
|
setServerTimingHeaders(data.event);
|
|
104
72
|
},
|
|
105
73
|
asyncEnd: (data) => {
|
|
106
74
|
onTraceEnd(data);
|
|
107
|
-
|
|
108
75
|
if (!data._sentrySpan) {
|
|
109
76
|
return;
|
|
110
77
|
}
|
|
111
|
-
|
|
112
|
-
// Update the root span (srvx transaction) with the parameterized route name.
|
|
113
|
-
// The srvx span is created before h3 resolves the route, so it initially has the raw URL.
|
|
114
|
-
// Note: data.type is always 'middleware' in asyncEnd regardless of handler type,
|
|
115
|
-
// so we rely on getParameterizedRoute() to filter out catch-all routes instead.
|
|
116
78
|
const rootSpan = getRootSpan(data._sentrySpan);
|
|
117
79
|
if (rootSpan && rootSpan !== data._sentrySpan) {
|
|
118
80
|
const routePattern = getParameterizedRoute(data.event);
|
|
119
81
|
if (routePattern) {
|
|
120
|
-
const method = data.event.req.method ||
|
|
82
|
+
const method = data.event.req.method || "GET";
|
|
121
83
|
updateSpanName(rootSpan, `${method} ${routePattern}`);
|
|
122
84
|
rootSpan.setAttributes({
|
|
123
|
-
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]:
|
|
124
|
-
|
|
85
|
+
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "route",
|
|
86
|
+
"http.route": routePattern
|
|
125
87
|
});
|
|
126
88
|
}
|
|
127
89
|
}
|
|
128
90
|
},
|
|
129
|
-
error: onTraceError
|
|
91
|
+
error: onTraceError
|
|
130
92
|
});
|
|
131
93
|
}
|
|
132
|
-
|
|
133
94
|
function setupSrvxTracingChannels() {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const parsedUrl = data.request._url ? parseStringToURLObject(data.request._url.href) : undefined;
|
|
140
|
-
const [spanName, urlAttributes] = getHttpSpanDetailsFromUrlObject(parsedUrl, 'server', 'auto.http.nitro.srvx', {
|
|
141
|
-
method: data.request.method,
|
|
95
|
+
const requestParentSpans = /* @__PURE__ */ new WeakMap();
|
|
96
|
+
const fetchChannel = tracingChannel("srvx.request", (data) => {
|
|
97
|
+
const parsedUrl = data.request._url ? parseStringToURLObject(data.request._url.href) : void 0;
|
|
98
|
+
const [spanName, urlAttributes] = getHttpSpanDetailsFromUrlObject(parsedUrl, "server", "auto.http.nitro.srvx", {
|
|
99
|
+
method: data.request.method
|
|
142
100
|
});
|
|
143
|
-
|
|
144
101
|
const sendDefaultPii = getClient()?.getOptions().sendDefaultPii ?? false;
|
|
145
102
|
const headerAttributes = httpHeadersToSpanAttributes(
|
|
146
103
|
Object.fromEntries(data.request.headers.entries()),
|
|
147
|
-
sendDefaultPii
|
|
104
|
+
sendDefaultPii
|
|
148
105
|
);
|
|
149
|
-
|
|
150
106
|
return startSpanManual(
|
|
151
107
|
{
|
|
152
108
|
name: spanName,
|
|
153
109
|
attributes: {
|
|
154
110
|
...urlAttributes,
|
|
155
111
|
...headerAttributes,
|
|
156
|
-
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]:
|
|
157
|
-
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: data.middleware ?
|
|
158
|
-
|
|
112
|
+
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.http.nitro.srvx",
|
|
113
|
+
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: data.middleware ? "middleware.nitro" : "http.server",
|
|
114
|
+
"server.port": data.server.options.port
|
|
159
115
|
},
|
|
160
116
|
// Use the same parent span as middleware to make them siblings
|
|
161
|
-
parentSpan: requestParentSpans.get(data.request) ||
|
|
117
|
+
parentSpan: requestParentSpans.get(data.request) || void 0
|
|
162
118
|
},
|
|
163
|
-
span => span
|
|
119
|
+
(span) => span
|
|
164
120
|
);
|
|
165
121
|
});
|
|
166
|
-
|
|
167
|
-
// Subscribe to events (span already created in bindStore)
|
|
168
122
|
fetchChannel.subscribe({
|
|
169
|
-
asyncEnd: data => {
|
|
123
|
+
asyncEnd: (data) => {
|
|
170
124
|
onTraceEnd(data);
|
|
171
|
-
|
|
172
|
-
// Clean up parent span reference after the fetch handler completes.
|
|
173
125
|
requestParentSpans.delete(data.request);
|
|
174
126
|
},
|
|
175
|
-
error: data => {
|
|
127
|
+
error: (data) => {
|
|
176
128
|
onTraceError(data);
|
|
177
|
-
// Clean up parent span reference on error too
|
|
178
129
|
requestParentSpans.delete(data.request);
|
|
179
|
-
}
|
|
130
|
+
}
|
|
180
131
|
});
|
|
181
|
-
|
|
182
|
-
const middlewareChannel = tracingChannel('srvx.middleware', data => {
|
|
183
|
-
// For the first middleware, capture the current parent span per-request
|
|
132
|
+
const middlewareChannel = tracingChannel("srvx.middleware", (data) => {
|
|
184
133
|
if (data.middleware?.index === 0) {
|
|
185
134
|
const activeSpan = getActiveSpan();
|
|
186
135
|
if (activeSpan) {
|
|
187
136
|
requestParentSpans.set(data.request, activeSpan);
|
|
188
137
|
}
|
|
189
138
|
}
|
|
190
|
-
|
|
191
|
-
const
|
|
192
|
-
|
|
193
|
-
method: data.request.method,
|
|
139
|
+
const parsedUrl = data.request._url ? parseStringToURLObject(data.request._url.href) : void 0;
|
|
140
|
+
const [, urlAttributes] = getHttpSpanDetailsFromUrlObject(parsedUrl, "server", "auto.http.nitro.srvx", {
|
|
141
|
+
method: data.request.method
|
|
194
142
|
});
|
|
195
|
-
|
|
196
|
-
// Create span as a child of the original parent, not the previous middleware
|
|
197
143
|
return startSpanManual(
|
|
198
144
|
{
|
|
199
|
-
name: `${data.middleware?.handler.name ??
|
|
145
|
+
name: `${data.middleware?.handler.name ?? "unknown"} - ${data.request.method} ${data.request._url?.pathname}`,
|
|
200
146
|
attributes: {
|
|
201
147
|
...urlAttributes,
|
|
202
|
-
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]:
|
|
203
|
-
[SEMANTIC_ATTRIBUTE_SENTRY_OP]:
|
|
148
|
+
[SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: "auto.http.nitro.srvx",
|
|
149
|
+
[SEMANTIC_ATTRIBUTE_SENTRY_OP]: "middleware.nitro"
|
|
204
150
|
},
|
|
205
|
-
parentSpan: requestParentSpans.get(data.request) ||
|
|
151
|
+
parentSpan: requestParentSpans.get(data.request) || void 0
|
|
206
152
|
},
|
|
207
|
-
span => span
|
|
153
|
+
(span) => span
|
|
208
154
|
);
|
|
209
155
|
});
|
|
210
|
-
|
|
211
|
-
// Subscribe to events (span already created in bindStore)
|
|
212
156
|
middlewareChannel.subscribe({
|
|
213
157
|
asyncEnd: onTraceEnd,
|
|
214
|
-
error: onTraceError
|
|
158
|
+
error: onTraceError
|
|
215
159
|
});
|
|
216
160
|
}
|
|
217
|
-
|
|
218
|
-
/**
|
|
219
|
-
* Sets the parameterized route attributes on the span.
|
|
220
|
-
*/
|
|
221
161
|
function setParameterizedRouteAttributes(span, event) {
|
|
222
162
|
const rootSpan = getRootSpan(span);
|
|
223
163
|
if (!rootSpan) {
|
|
224
164
|
return;
|
|
225
165
|
}
|
|
226
|
-
|
|
227
166
|
const matchedRoutePath = getParameterizedRoute(event);
|
|
228
167
|
if (!matchedRoutePath) {
|
|
229
168
|
return;
|
|
230
169
|
}
|
|
231
|
-
|
|
232
170
|
rootSpan.setAttributes({
|
|
233
|
-
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]:
|
|
234
|
-
|
|
171
|
+
[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "route",
|
|
172
|
+
"http.route": matchedRoutePath
|
|
235
173
|
});
|
|
236
|
-
|
|
237
174
|
const params = event.context?.params;
|
|
238
|
-
|
|
239
|
-
if (params && typeof params === 'object') {
|
|
175
|
+
if (params && typeof params === "object") {
|
|
240
176
|
Object.entries(params).forEach(([key, value]) => {
|
|
241
|
-
// Based on this convention: https://getsentry.github.io/sentry-conventions/generated/attributes/url.html#urlpathparameterkey
|
|
242
177
|
rootSpan.setAttributes({
|
|
243
178
|
[`url.path.parameter.${key}`]: String(value),
|
|
244
|
-
[`params.${key}`]: String(value)
|
|
179
|
+
[`params.${key}`]: String(value)
|
|
245
180
|
});
|
|
246
181
|
});
|
|
247
182
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captureTracingEvents.js","sources":["../../../../src/runtime/hooks/captureTracingEvents.ts"],"sourcesContent":["import {\n captureException,\n getActiveSpan,\n getClient,\n getHttpSpanDetailsFromUrlObject,\n getRootSpan,\n GLOBAL_OBJ,\n httpHeadersToSpanAttributes,\n parseStringToURLObject,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n setHttpStatus,\n type Span,\n SPAN_STATUS_ERROR,\n startSpanManual,\n updateSpanName,\n} from '@sentry/core';\nimport { tracingChannel, type TracingChannelContextWithSpan } from '@sentry/opentelemetry/tracing-channel';\nimport type { TracingRequestEvent as H3TracingRequestEvent } from 'h3/tracing';\nimport type { RequestEvent as SrvxRequestEvent } from 'srvx/tracing';\nimport { setServerTimingHeaders } from './setServerTimingHeaders';\n\n/**\n * Global object with the trace channels\n */\nconst globalWithTraceChannels = GLOBAL_OBJ as typeof GLOBAL_OBJ & {\n __SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__: boolean;\n};\n\n/**\n * Captures tracing events emitted by Nitro tracing channels.\n */\nexport function captureTracingEvents(): void {\n if (globalWithTraceChannels.__SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__) {\n return;\n }\n\n setupH3TracingChannels();\n setupSrvxTracingChannels();\n globalWithTraceChannels.__SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__ = true;\n}\n\n/**\n * Extracts the HTTP status code from a tracing channel result.\n * The result is the return value of the traced handler, which is a Response for srvx\n * and may or may not be a Response for h3.\n */\nfunction getResponseStatusCode(result: unknown): number | undefined {\n if (result && typeof result === 'object' && 'status' in result && typeof result.status === 'number') {\n return result.status;\n }\n return undefined;\n}\n\nfunction onTraceEnd(data: TracingChannelContextWithSpan<{ result?: unknown }>): void {\n const statusCode = getResponseStatusCode(data.result);\n if (data._sentrySpan && statusCode !== undefined) {\n setHttpStatus(data._sentrySpan, statusCode);\n }\n\n data._sentrySpan?.end();\n}\n\nfunction onTraceError(data: TracingChannelContextWithSpan<{ error: unknown }>): void {\n captureException(data.error, { mechanism: { type: 'auto.http.nitro.onTraceError', handled: false } });\n data._sentrySpan?.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n data._sentrySpan?.end();\n}\n\n/**\n * Extracts the parameterized route pattern from the h3 event context.\n */\nfunction getParameterizedRoute(event: H3TracingRequestEvent['event']): string | undefined {\n const matchedRoute = event.context?.matchedRoute;\n if (!matchedRoute) {\n return undefined;\n }\n\n const routePath = matchedRoute.route;\n\n // Skip catch-all routes as they're not useful for transaction grouping\n if (!routePath || routePath === '/**') {\n return undefined;\n }\n\n return routePath;\n}\n\nfunction setupH3TracingChannels(): void {\n const h3Channel = tracingChannel<H3TracingRequestEvent>('h3.request', data => {\n const parsedUrl = parseStringToURLObject(data.event.url.href);\n const routePattern = getParameterizedRoute(data.event);\n\n const [spanName, urlAttributes] = getHttpSpanDetailsFromUrlObject(\n parsedUrl,\n 'server',\n 'auto.http.nitro.h3',\n { method: data.event.req.method },\n routePattern,\n );\n\n return startSpanManual(\n {\n name: spanName,\n attributes: {\n ...urlAttributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.h3',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: data?.type === 'middleware' ? 'middleware.nitro' : 'http.server',\n },\n },\n span => {\n setParameterizedRouteAttributes(span, data.event);\n\n return span;\n },\n );\n });\n\n h3Channel.subscribe({\n start: (data: H3TracingRequestEvent) => {\n setServerTimingHeaders(data.event);\n },\n asyncEnd: (data: TracingChannelContextWithSpan<H3TracingRequestEvent>) => {\n onTraceEnd(data);\n\n if (!data._sentrySpan) {\n return;\n }\n\n // Update the root span (srvx transaction) with the parameterized route name.\n // The srvx span is created before h3 resolves the route, so it initially has the raw URL.\n // Note: data.type is always 'middleware' in asyncEnd regardless of handler type,\n // so we rely on getParameterizedRoute() to filter out catch-all routes instead.\n const rootSpan = getRootSpan(data._sentrySpan);\n if (rootSpan && rootSpan !== data._sentrySpan) {\n const routePattern = getParameterizedRoute(data.event);\n if (routePattern) {\n const method = data.event.req.method || 'GET';\n updateSpanName(rootSpan, `${method} ${routePattern}`);\n rootSpan.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route',\n 'http.route': routePattern,\n });\n }\n }\n },\n error: onTraceError,\n });\n}\n\nfunction setupSrvxTracingChannels(): void {\n // Store the parent span per-request so middleware and fetch share the same parent.\n // WeakMap ensures per-request isolation in concurrent environments and automatic cleanup.\n const requestParentSpans = new WeakMap<Request, Span>();\n\n const fetchChannel = tracingChannel<SrvxRequestEvent>('srvx.request', data => {\n const parsedUrl = data.request._url ? parseStringToURLObject(data.request._url.href) : undefined;\n const [spanName, urlAttributes] = getHttpSpanDetailsFromUrlObject(parsedUrl, 'server', 'auto.http.nitro.srvx', {\n method: data.request.method,\n });\n\n const sendDefaultPii = getClient()?.getOptions().sendDefaultPii ?? false;\n const headerAttributes = httpHeadersToSpanAttributes(\n Object.fromEntries(data.request.headers.entries()),\n sendDefaultPii,\n );\n\n return startSpanManual(\n {\n name: spanName,\n attributes: {\n ...urlAttributes,\n ...headerAttributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.srvx',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: data.middleware ? 'middleware.nitro' : 'http.server',\n 'server.port': data.server.options.port,\n },\n // Use the same parent span as middleware to make them siblings\n parentSpan: requestParentSpans.get(data.request) || undefined,\n },\n span => span,\n );\n });\n\n // Subscribe to events (span already created in bindStore)\n fetchChannel.subscribe({\n asyncEnd: data => {\n onTraceEnd(data);\n\n // Clean up parent span reference after the fetch handler completes.\n requestParentSpans.delete(data.request);\n },\n error: data => {\n onTraceError(data);\n // Clean up parent span reference on error too\n requestParentSpans.delete(data.request);\n },\n });\n\n const middlewareChannel = tracingChannel<SrvxRequestEvent>('srvx.middleware', data => {\n // For the first middleware, capture the current parent span per-request\n if (data.middleware?.index === 0) {\n const activeSpan = getActiveSpan();\n if (activeSpan) {\n requestParentSpans.set(data.request, activeSpan);\n }\n }\n\n const parsedUrl = data.request._url ? parseStringToURLObject(data.request._url.href) : undefined;\n const [, urlAttributes] = getHttpSpanDetailsFromUrlObject(parsedUrl, 'server', 'auto.http.nitro.srvx', {\n method: data.request.method,\n });\n\n // Create span as a child of the original parent, not the previous middleware\n return startSpanManual(\n {\n name: `${data.middleware?.handler.name ?? 'unknown'} - ${data.request.method} ${data.request._url?.pathname}`,\n attributes: {\n ...urlAttributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.srvx',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.nitro',\n },\n parentSpan: requestParentSpans.get(data.request) || undefined,\n },\n span => span,\n );\n });\n\n // Subscribe to events (span already created in bindStore)\n middlewareChannel.subscribe({\n asyncEnd: onTraceEnd,\n error: onTraceError,\n });\n}\n\n/**\n * Sets the parameterized route attributes on the span.\n */\nfunction setParameterizedRouteAttributes(span: Span, event: H3TracingRequestEvent['event']): void {\n const rootSpan = getRootSpan(span);\n if (!rootSpan) {\n return;\n }\n\n const matchedRoutePath = getParameterizedRoute(event);\n if (!matchedRoutePath) {\n return;\n }\n\n rootSpan.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route',\n 'http.route': matchedRoutePath,\n });\n\n const params = event.context?.params;\n\n if (params && typeof params === 'object') {\n Object.entries(params).forEach(([key, value]) => {\n // Based on this convention: https://getsentry.github.io/sentry-conventions/generated/attributes/url.html#urlpathparameterkey\n rootSpan.setAttributes({\n [`url.path.parameter.${key}`]: String(value),\n [`params.${key}`]: String(value),\n });\n });\n }\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"captureTracingEvents.js","sources":["../../../../src/runtime/hooks/captureTracingEvents.ts"],"sourcesContent":["import {\n captureException,\n getActiveSpan,\n getClient,\n getHttpSpanDetailsFromUrlObject,\n getRootSpan,\n GLOBAL_OBJ,\n httpHeadersToSpanAttributes,\n parseStringToURLObject,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n setHttpStatus,\n type Span,\n SPAN_STATUS_ERROR,\n startSpanManual,\n updateSpanName,\n} from '@sentry/core';\nimport { tracingChannel, type TracingChannelContextWithSpan } from '@sentry/opentelemetry/tracing-channel';\nimport type { TracingRequestEvent as H3TracingRequestEvent } from 'h3/tracing';\nimport type { RequestEvent as SrvxRequestEvent } from 'srvx/tracing';\nimport { setServerTimingHeaders } from './setServerTimingHeaders';\n\n/**\n * Global object with the trace channels\n */\nconst globalWithTraceChannels = GLOBAL_OBJ as typeof GLOBAL_OBJ & {\n __SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__: boolean;\n};\n\n/**\n * Captures tracing events emitted by Nitro tracing channels.\n */\nexport function captureTracingEvents(): void {\n if (globalWithTraceChannels.__SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__) {\n return;\n }\n\n setupH3TracingChannels();\n setupSrvxTracingChannels();\n globalWithTraceChannels.__SENTRY_NITRO_HTTP_CHANNELS_INSTRUMENTED__ = true;\n}\n\n/**\n * Extracts the HTTP status code from a tracing channel result.\n * The result is the return value of the traced handler, which is a Response for srvx\n * and may or may not be a Response for h3.\n */\nfunction getResponseStatusCode(result: unknown): number | undefined {\n if (result && typeof result === 'object' && 'status' in result && typeof result.status === 'number') {\n return result.status;\n }\n return undefined;\n}\n\nfunction onTraceEnd(data: TracingChannelContextWithSpan<{ result?: unknown }>): void {\n const statusCode = getResponseStatusCode(data.result);\n if (data._sentrySpan && statusCode !== undefined) {\n setHttpStatus(data._sentrySpan, statusCode);\n }\n\n data._sentrySpan?.end();\n}\n\nfunction onTraceError(data: TracingChannelContextWithSpan<{ error: unknown }>): void {\n captureException(data.error, { mechanism: { type: 'auto.http.nitro.onTraceError', handled: false } });\n data._sentrySpan?.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n data._sentrySpan?.end();\n}\n\n/**\n * Extracts the parameterized route pattern from the h3 event context.\n */\nfunction getParameterizedRoute(event: H3TracingRequestEvent['event']): string | undefined {\n const matchedRoute = event.context?.matchedRoute;\n if (!matchedRoute) {\n return undefined;\n }\n\n const routePath = matchedRoute.route;\n\n // Skip catch-all routes as they're not useful for transaction grouping\n if (!routePath || routePath === '/**') {\n return undefined;\n }\n\n return routePath;\n}\n\nfunction setupH3TracingChannels(): void {\n const h3Channel = tracingChannel<H3TracingRequestEvent>('h3.request', data => {\n const parsedUrl = parseStringToURLObject(data.event.url.href);\n const routePattern = getParameterizedRoute(data.event);\n\n const [spanName, urlAttributes] = getHttpSpanDetailsFromUrlObject(\n parsedUrl,\n 'server',\n 'auto.http.nitro.h3',\n { method: data.event.req.method },\n routePattern,\n );\n\n return startSpanManual(\n {\n name: spanName,\n attributes: {\n ...urlAttributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.h3',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: data?.type === 'middleware' ? 'middleware.nitro' : 'http.server',\n },\n },\n span => {\n setParameterizedRouteAttributes(span, data.event);\n\n return span;\n },\n );\n });\n\n h3Channel.subscribe({\n start: (data: H3TracingRequestEvent) => {\n setServerTimingHeaders(data.event);\n },\n asyncEnd: (data: TracingChannelContextWithSpan<H3TracingRequestEvent>) => {\n onTraceEnd(data);\n\n if (!data._sentrySpan) {\n return;\n }\n\n // Update the root span (srvx transaction) with the parameterized route name.\n // The srvx span is created before h3 resolves the route, so it initially has the raw URL.\n // Note: data.type is always 'middleware' in asyncEnd regardless of handler type,\n // so we rely on getParameterizedRoute() to filter out catch-all routes instead.\n const rootSpan = getRootSpan(data._sentrySpan);\n if (rootSpan && rootSpan !== data._sentrySpan) {\n const routePattern = getParameterizedRoute(data.event);\n if (routePattern) {\n const method = data.event.req.method || 'GET';\n updateSpanName(rootSpan, `${method} ${routePattern}`);\n rootSpan.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route',\n 'http.route': routePattern,\n });\n }\n }\n },\n error: onTraceError,\n });\n}\n\nfunction setupSrvxTracingChannels(): void {\n // Store the parent span per-request so middleware and fetch share the same parent.\n // WeakMap ensures per-request isolation in concurrent environments and automatic cleanup.\n const requestParentSpans = new WeakMap<Request, Span>();\n\n const fetchChannel = tracingChannel<SrvxRequestEvent>('srvx.request', data => {\n const parsedUrl = data.request._url ? parseStringToURLObject(data.request._url.href) : undefined;\n const [spanName, urlAttributes] = getHttpSpanDetailsFromUrlObject(parsedUrl, 'server', 'auto.http.nitro.srvx', {\n method: data.request.method,\n });\n\n const sendDefaultPii = getClient()?.getOptions().sendDefaultPii ?? false;\n const headerAttributes = httpHeadersToSpanAttributes(\n Object.fromEntries(data.request.headers.entries()),\n sendDefaultPii,\n );\n\n return startSpanManual(\n {\n name: spanName,\n attributes: {\n ...urlAttributes,\n ...headerAttributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.srvx',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: data.middleware ? 'middleware.nitro' : 'http.server',\n 'server.port': data.server.options.port,\n },\n // Use the same parent span as middleware to make them siblings\n parentSpan: requestParentSpans.get(data.request) || undefined,\n },\n span => span,\n );\n });\n\n // Subscribe to events (span already created in bindStore)\n fetchChannel.subscribe({\n asyncEnd: data => {\n onTraceEnd(data);\n\n // Clean up parent span reference after the fetch handler completes.\n requestParentSpans.delete(data.request);\n },\n error: data => {\n onTraceError(data);\n // Clean up parent span reference on error too\n requestParentSpans.delete(data.request);\n },\n });\n\n const middlewareChannel = tracingChannel<SrvxRequestEvent>('srvx.middleware', data => {\n // For the first middleware, capture the current parent span per-request\n if (data.middleware?.index === 0) {\n const activeSpan = getActiveSpan();\n if (activeSpan) {\n requestParentSpans.set(data.request, activeSpan);\n }\n }\n\n const parsedUrl = data.request._url ? parseStringToURLObject(data.request._url.href) : undefined;\n const [, urlAttributes] = getHttpSpanDetailsFromUrlObject(parsedUrl, 'server', 'auto.http.nitro.srvx', {\n method: data.request.method,\n });\n\n // Create span as a child of the original parent, not the previous middleware\n return startSpanManual(\n {\n name: `${data.middleware?.handler.name ?? 'unknown'} - ${data.request.method} ${data.request._url?.pathname}`,\n attributes: {\n ...urlAttributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.http.nitro.srvx',\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'middleware.nitro',\n },\n parentSpan: requestParentSpans.get(data.request) || undefined,\n },\n span => span,\n );\n });\n\n // Subscribe to events (span already created in bindStore)\n middlewareChannel.subscribe({\n asyncEnd: onTraceEnd,\n error: onTraceError,\n });\n}\n\n/**\n * Sets the parameterized route attributes on the span.\n */\nfunction setParameterizedRouteAttributes(span: Span, event: H3TracingRequestEvent['event']): void {\n const rootSpan = getRootSpan(span);\n if (!rootSpan) {\n return;\n }\n\n const matchedRoutePath = getParameterizedRoute(event);\n if (!matchedRoutePath) {\n return;\n }\n\n rootSpan.setAttributes({\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route',\n 'http.route': matchedRoutePath,\n });\n\n const params = event.context?.params;\n\n if (params && typeof params === 'object') {\n Object.entries(params).forEach(([key, value]) => {\n // Based on this convention: https://getsentry.github.io/sentry-conventions/generated/attributes/url.html#urlpathparameterkey\n rootSpan.setAttributes({\n [`url.path.parameter.${key}`]: String(value),\n [`params.${key}`]: String(value),\n });\n });\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,27 +1,20 @@
|
|
|
1
1
|
import { getTraceData } from '@sentry/core';
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* Sets Server-Timing response headers for trace propagation to the client.
|
|
5
|
-
* The browser SDK reads these via the Performance API to connect pageload traces.
|
|
6
|
-
*/
|
|
7
3
|
function setServerTimingHeaders(event) {
|
|
8
4
|
if (event.context._sentryServerTimingSet) {
|
|
9
5
|
return;
|
|
10
6
|
}
|
|
11
|
-
|
|
12
7
|
const headers = event.res?.headers;
|
|
13
8
|
if (!headers) {
|
|
14
9
|
return;
|
|
15
10
|
}
|
|
16
|
-
|
|
17
11
|
const traceData = getTraceData();
|
|
18
|
-
if (traceData[
|
|
19
|
-
headers.append(
|
|
12
|
+
if (traceData["sentry-trace"]) {
|
|
13
|
+
headers.append("Server-Timing", `sentry-trace;desc="${traceData["sentry-trace"]}"`);
|
|
20
14
|
}
|
|
21
15
|
if (traceData.baggage) {
|
|
22
|
-
headers.append(
|
|
16
|
+
headers.append("Server-Timing", `baggage;desc="${traceData.baggage}"`);
|
|
23
17
|
}
|
|
24
|
-
|
|
25
18
|
event.context._sentryServerTimingSet = true;
|
|
26
19
|
}
|
|
27
20
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setServerTimingHeaders.js","sources":["../../../../src/runtime/hooks/setServerTimingHeaders.ts"],"sourcesContent":["import { getTraceData } from '@sentry/core';\nimport type { TracingRequestEvent as H3TracingRequestEvent } from 'h3/tracing';\n\n/**\n * Sets Server-Timing response headers for trace propagation to the client.\n * The browser SDK reads these via the Performance API to connect pageload traces.\n */\nexport function setServerTimingHeaders(event: H3TracingRequestEvent['event']): void {\n if (event.context._sentryServerTimingSet) {\n return;\n }\n\n const headers = event.res?.headers;\n if (!headers) {\n return;\n }\n\n const traceData = getTraceData();\n if (traceData['sentry-trace']) {\n headers.append('Server-Timing', `sentry-trace;desc=\"${traceData['sentry-trace']}\"`);\n }\n if (traceData.baggage) {\n headers.append('Server-Timing', `baggage;desc=\"${traceData.baggage}\"`);\n }\n\n event.context._sentryServerTimingSet = true;\n}\n"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"setServerTimingHeaders.js","sources":["../../../../src/runtime/hooks/setServerTimingHeaders.ts"],"sourcesContent":["import { getTraceData } from '@sentry/core';\nimport type { TracingRequestEvent as H3TracingRequestEvent } from 'h3/tracing';\n\n/**\n * Sets Server-Timing response headers for trace propagation to the client.\n * The browser SDK reads these via the Performance API to connect pageload traces.\n */\nexport function setServerTimingHeaders(event: H3TracingRequestEvent['event']): void {\n if (event.context._sentryServerTimingSet) {\n return;\n }\n\n const headers = event.res?.headers;\n if (!headers) {\n return;\n }\n\n const traceData = getTraceData();\n if (traceData['sentry-trace']) {\n headers.append('Server-Timing', `sentry-trace;desc=\"${traceData['sentry-trace']}\"`);\n }\n if (traceData.baggage) {\n headers.append('Server-Timing', `baggage;desc=\"${traceData.baggage}\"`);\n }\n\n event.context._sentryServerTimingSet = true;\n}\n"],"names":[],"mappings":";;AAOO,SAAS,uBAAuB,KAAA,EAA6C;AAClF,EAAA,IAAI,KAAA,CAAM,QAAQ,sBAAA,EAAwB;AACxC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,GAAA,EAAK,OAAA;AAC3B,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,IAAI,SAAA,CAAU,cAAc,CAAA,EAAG;AAC7B,IAAA,OAAA,CAAQ,OAAO,eAAA,EAAiB,CAAA,mBAAA,EAAsB,SAAA,CAAU,cAAc,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,EACpF;AACA,EAAA,IAAI,UAAU,OAAA,EAAS;AACrB,IAAA,OAAA,CAAQ,MAAA,CAAO,eAAA,EAAiB,CAAA,cAAA,EAAiB,SAAA,CAAU,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EACvE;AAEA,EAAA,KAAA,CAAM,QAAQ,sBAAA,GAAyB,IAAA;AACzC;;;;"}
|
|
@@ -3,9 +3,8 @@ import { captureErrorHook } from '../hooks/captureErrorHook.js';
|
|
|
3
3
|
import { captureStorageEvents } from '../hooks/captureStorageEvents.js';
|
|
4
4
|
import { captureTracingEvents } from '../hooks/captureTracingEvents.js';
|
|
5
5
|
|
|
6
|
-
const server = definePlugin(nitroApp => {
|
|
7
|
-
nitroApp.hooks.hook(
|
|
8
|
-
|
|
6
|
+
const server = definePlugin((nitroApp) => {
|
|
7
|
+
nitroApp.hooks.hook("error", captureErrorHook);
|
|
9
8
|
captureTracingEvents();
|
|
10
9
|
captureStorageEvents();
|
|
11
10
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sources":["../../../../src/runtime/plugins/server.ts"],"sourcesContent":["import { definePlugin } from 'nitro';\nimport { captureErrorHook } from '../hooks/captureErrorHook';\nimport { captureStorageEvents } from '../hooks/captureStorageEvents';\nimport { captureTracingEvents } from '../hooks/captureTracingEvents';\n\nexport default definePlugin(nitroApp => {\n nitroApp.hooks.hook('error', captureErrorHook);\n\n captureTracingEvents();\n captureStorageEvents();\n});\n"],"names":[],"mappings":";;;;;AAKA,eAAe,
|
|
1
|
+
{"version":3,"file":"server.js","sources":["../../../../src/runtime/plugins/server.ts"],"sourcesContent":["import { definePlugin } from 'nitro';\nimport { captureErrorHook } from '../hooks/captureErrorHook';\nimport { captureStorageEvents } from '../hooks/captureStorageEvents';\nimport { captureTracingEvents } from '../hooks/captureTracingEvents';\n\nexport default definePlugin(nitroApp => {\n nitroApp.hooks.hook('error', captureErrorHook);\n\n captureTracingEvents();\n captureStorageEvents();\n});\n"],"names":[],"mappings":";;;;;AAKA,eAAe,aAAa,CAAA,QAAA,KAAY;AACtC,EAAA,QAAA,CAAS,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,gBAAgB,CAAA;AAE7C,EAAA,oBAAA,EAAqB;AACrB,EAAA,oBAAA,EAAqB;AACvB,CAAC,CAAA;;;;"}
|
package/build/esm/sdk.js
CHANGED
|
@@ -1,30 +1,17 @@
|
|
|
1
1
|
import { applySdkMetadata } from '@sentry/core';
|
|
2
2
|
import { init as init$1, getDefaultIntegrations as getDefaultIntegrations$1 } from '@sentry/node';
|
|
3
3
|
|
|
4
|
-
/**
|
|
5
|
-
* Initializes the Nitro SDK
|
|
6
|
-
*/
|
|
7
4
|
function init(options = {}) {
|
|
8
5
|
const opts = {
|
|
9
|
-
...options
|
|
6
|
+
...options
|
|
10
7
|
};
|
|
11
|
-
|
|
12
|
-
if (opts.defaultIntegrations === undefined) {
|
|
8
|
+
if (opts.defaultIntegrations === void 0) {
|
|
13
9
|
opts.defaultIntegrations = getDefaultIntegrations(opts);
|
|
14
10
|
}
|
|
15
|
-
|
|
16
|
-
applySdkMetadata(opts, 'nitro', ['nitro', 'node']);
|
|
17
|
-
|
|
11
|
+
applySdkMetadata(opts, "nitro", ["nitro", "node"]);
|
|
18
12
|
const client = init$1(opts);
|
|
19
|
-
|
|
20
13
|
return client;
|
|
21
14
|
}
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* Get the default integrations for the Nitro SDK.
|
|
25
|
-
*
|
|
26
|
-
* @returns The default integrations for the Nitro SDK.
|
|
27
|
-
*/
|
|
28
15
|
function getDefaultIntegrations(options) {
|
|
29
16
|
return [...getDefaultIntegrations$1(options)];
|
|
30
17
|
}
|
package/build/esm/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sources":["../../src/sdk.ts"],"sourcesContent":["import type { Integration } from '@sentry/core';\nimport { applySdkMetadata } from '@sentry/core';\nimport type { NodeClient, NodeOptions } from '@sentry/node';\nimport { getDefaultIntegrations as getDefaultNodeIntegrations, init as nodeInit } from '@sentry/node';\n\n/**\n * Initializes the Nitro SDK\n */\nexport function init(options: NodeOptions | undefined = {}): NodeClient | undefined {\n const opts: NodeOptions = {\n ...options,\n };\n\n if (opts.defaultIntegrations === undefined) {\n opts.defaultIntegrations = getDefaultIntegrations(opts);\n }\n\n applySdkMetadata(opts, 'nitro', ['nitro', 'node']);\n\n const client = nodeInit(opts);\n\n return client;\n}\n\n/**\n * Get the default integrations for the Nitro SDK.\n *\n * @returns The default integrations for the Nitro SDK.\n */\nexport function getDefaultIntegrations(options: NodeOptions): Integration[] | undefined {\n return [...getDefaultNodeIntegrations(options)];\n}\n"],"names":["nodeInit","getDefaultNodeIntegrations"],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"sdk.js","sources":["../../src/sdk.ts"],"sourcesContent":["import type { Integration } from '@sentry/core';\nimport { applySdkMetadata } from '@sentry/core';\nimport type { NodeClient, NodeOptions } from '@sentry/node';\nimport { getDefaultIntegrations as getDefaultNodeIntegrations, init as nodeInit } from '@sentry/node';\n\n/**\n * Initializes the Nitro SDK\n */\nexport function init(options: NodeOptions | undefined = {}): NodeClient | undefined {\n const opts: NodeOptions = {\n ...options,\n };\n\n if (opts.defaultIntegrations === undefined) {\n opts.defaultIntegrations = getDefaultIntegrations(opts);\n }\n\n applySdkMetadata(opts, 'nitro', ['nitro', 'node']);\n\n const client = nodeInit(opts);\n\n return client;\n}\n\n/**\n * Get the default integrations for the Nitro SDK.\n *\n * @returns The default integrations for the Nitro SDK.\n */\nexport function getDefaultIntegrations(options: NodeOptions): Integration[] | undefined {\n return [...getDefaultNodeIntegrations(options)];\n}\n"],"names":["nodeInit","getDefaultNodeIntegrations"],"mappings":";;;AAQO,SAAS,IAAA,CAAK,OAAA,GAAmC,EAAC,EAA2B;AAClF,EAAA,MAAM,IAAA,GAAoB;AAAA,IACxB,GAAG;AAAA,GACL;AAEA,EAAA,IAAI,IAAA,CAAK,wBAAwB,MAAA,EAAW;AAC1C,IAAA,IAAA,CAAK,mBAAA,GAAsB,uBAAuB,IAAI,CAAA;AAAA,EACxD;AAEA,EAAA,gBAAA,CAAiB,IAAA,EAAM,OAAA,EAAS,CAAC,OAAA,EAAS,MAAM,CAAC,CAAA;AAEjD,EAAA,MAAM,MAAA,GAASA,OAAS,IAAI,CAAA;AAE5B,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,uBAAuB,OAAA,EAAiD;AACtF,EAAA,OAAO,CAAC,GAAGC,wBAAA,CAA2B,OAAO,CAAC,CAAA;AAChD;;;;"}
|